pax_global_header00006660000000000000000000000064150113644240014512gustar00rootroot0000000000000052 comment=76a39c8577ae0a42cbbc723ad9831ec546dcead6 stephaneguindon-phyml-76a39c8/000077500000000000000000000000001501136442400164025ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/.github/000077500000000000000000000000001501136442400177425ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/.github/FUNDING.yml000066400000000000000000000015201501136442400215550ustar00rootroot00000000000000# These are supported funding model platforms github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry custom: ['https://fondation-cnrs.org/faire-un-don/'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] stephaneguindon-phyml-76a39c8/.github/workflows/000077500000000000000000000000001501136442400217775ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/.github/workflows/ci.yaml000066400000000000000000000040221501136442400232540ustar00rootroot00000000000000name: CI on: push: branches: ["master"] pull_request: branches: ["master"] jobs: build: name: Linux x86_64 runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Build run: | set -xe sh ./autogen.sh autoupdate ./configure \ --prefix=/tmp/phyml \ --disable-dependency-tracking \ --enable-phyml make -j2 CFLAGS="-O3 -fomit-frame-pointer -funroll-loops -msse4.1" make install file /tmp/phyml/bin/phyml | grep x86-64 build-aarch64: name: Linux aarch64 runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Build on Linux ARM64 uses: uraimo/run-on-arch-action@v2 with: arch: aarch64 distro: ubuntu22.04 githubToken: ${{ github.token }} dockerRunArgs: | --volume "${PWD}:/phyml" install: | apt-get update -q -y apt-get install -q -y make autoconf automake libtool file run: | set -xe cd /phyml sh ./autogen.sh autoupdate ./configure \ --prefix="/tmp/phyml" \ --disable-dependency-tracking \ --enable-phyml make -j2 CFLAGS="-O3 -fomit-frame-pointer -funroll-loops" make install file /tmp/phyml/bin/phyml | grep aarch64 build-macos-m: name: Mac OS ARM64 runs-on: macos-14 steps: - name: Checkout uses: actions/checkout@v4 - name: Install dependencies run: brew install make autoconf automake libtool - name: Build run: | set -xe sh ./autogen.sh autoupdate ./configure \ --prefix="/tmp/phyml" \ --disable-dependency-tracking \ --enable-phyml make -j2 CFLAGS="-O3 -fomit-frame-pointer -funroll-loops" make install file /tmp/phyml/bin/phyml | grep arm64 stephaneguindon-phyml-76a39c8/.gitignore000066400000000000000000000006141501136442400203730ustar00rootroot00000000000000# Object files *.o *.ko *.obj *.elf # Precompiled Headers *.gch *.pch # Libraries *.lib *.a *.la *.lo # Shared objects (inc. Windows DLLs) *.dll *.so *.so.* *.dylib # Executables *.exe *.out *.app *.i*86 *.x86_64 *.hex Makefile.in config.guess* config.sub* config.h.in aclocal.m4 compile configure depcomp install-sh missing autom4te.cache *~ doc/html doc/latex \#*# ltmain.sh m4/*.m4 *.origstephaneguindon-phyml-76a39c8/.travis.yml000066400000000000000000000011171501136442400205130ustar00rootroot00000000000000# sudo: required # cache: apt # language: c # os: # - linux # - osx # compiler: # - gcc # script: # # build and install software into $HOME/local # - ./autogen.sh # - ./configure # - make # - sudo make install # - ./configure --enable-phyrex # - make clean # - make # - ./configure --enable-phytime # - make clean # - make # # put the installed binary into the $PATH # - export PATH=$HOME/local/bin:$PATH # # install testiphy # # - cd # # - git clone https://gitlab.com/testiphy/testiphy.git # # run testiphy # # - cd testiphy # # - ./testiphy phymlstephaneguindon-phyml-76a39c8/COPYING000066400000000000000000001045151501136442400174430ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . stephaneguindon-phyml-76a39c8/Makefile000066400000000000000000000612071501136442400200500ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.5 from Makefile.am. # Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/phyml pkgincludedir = $(includedir)/phyml pkglibdir = $(libdir)/phyml pkglibexecdir = $(libexecdir)/phyml am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = aarch64-apple-darwin24.3.0 host_triplet = aarch64-apple-darwin24.3.0 subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in COPYING \ README.md compile config.guess config.sub depcomp install-sh \ missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = ${SHELL} '/Users/guindon/phyml/missing' aclocal-1.16 AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AUTOCONF = ${SHELL} '/Users/guindon/phyml/missing' autoconf AUTOHEADER = ${SHELL} '/Users/guindon/phyml/missing' autoheader AUTOMAKE = ${SHELL} '/Users/guindon/phyml/missing' automake-1.16 AWK = awk CC = mpicc CCDEPMODE = depmode=gcc3 CFLAGS = -std=gnu99 -O3 -fomit-frame-pointer -funroll-loops -Wall -Winline -finline -march=native CPPFLAGS = CSCOPE = cscope CTAGS = ctags CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps ECHO_C = \c ECHO_N = ECHO_T = EGREP = /usr/bin/grep -E ETAGS = etags EXEEXT = GREP = /usr/bin/grep INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s LATEX = latex LDFLAGS = LIBOBJS = LIBS = -lm LTLIBOBJS = MAKEINFO = ${SHELL} '/Users/guindon/phyml/missing' makeinfo MKDIR_P = ./install-sh -c -d OBJEXT = o PACKAGE = phyml PACKAGE_BUGREPORT = stephane.guindon@lirmm.fr PACKAGE_NAME = PhyML PACKAGE_STRING = PhyML 3.3.20250429 PACKAGE_TARNAME = phyml PACKAGE_URL = PACKAGE_VERSION = 3.3.20250429 PATH_SEPARATOR = : PDFLATEX = pdflatex SET_MAKE = SHELL = /bin/sh STRIP = VERSION = 3.3.20250429 abs_builddir = /Users/guindon/phyml abs_srcdir = /Users/guindon/phyml abs_top_builddir = /Users/guindon/phyml abs_top_srcdir = /Users/guindon/phyml ac_ct_CC = gcc am__include = include am__leading_dot = . am__quote = am__tar = $${TAR-tar} chof - "$$tardir" am__untar = $${TAR-tar} xf - bindir = ${exec_prefix}/bin build = aarch64-apple-darwin24.3.0 build_alias = build_cpu = aarch64 build_os = darwin24.3.0 build_vendor = apple builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} host = aarch64-apple-darwin24.3.0 host_alias = host_cpu = aarch64 host_os = darwin24.3.0 host_vendor = apple htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info install_sh = ${SHELL} /Users/guindon/phyml/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} runstatedir = ${localstatedir}/run sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . sysconfdir = ${prefix}/etc target_alias = top_build_prefix = top_builddir = . top_srcdir = . SUBDIRS = src EXTRA_DIST = doc bin examples DIST_SUBDIRS = $(SUBDIRS) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ dist-zstd distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: stephaneguindon-phyml-76a39c8/Makefile.am000066400000000000000000000001061501136442400204330ustar00rootroot00000000000000SUBDIRS = src EXTRA_DIST = doc bin examples DIST_SUBDIRS = $(SUBDIRS) stephaneguindon-phyml-76a39c8/README.md000066400000000000000000000053521501136442400176660ustar00rootroot00000000000000 [![Build Status](https://travis-ci.org/stephaneguindon/phyml.svg?branch=master)](https://travis-ci.org/stephaneguindon/phyml) [![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg?style=flat)](http://bioconda.github.io/recipes/phyml/README.html) ### Overview PhyML is a software package that uses modern statistical approaches to analyse alignments of nucleotide or amino acid sequences in a phylogenetic framework. The main tool in this package builds phylogenies under the maximum likelihood criterion. It implements a large number of substitution models coupled to efficient options to search the space of phylogenetic tree topologies. PhyTime is another tool in the PhyML package that focuses on divergence date estimation in a Bayesian setting. The main strengths of PhyTime lies in its ability to accommodate for uncertrainty in the placement of fossil calibration and the use of realistic models of rate variation along the tree. Finally, PhyREX fits the spatial-Lambda-Fleming-Viot model to geo-referenced genetic data. This model is similar to the structured coalescent but assumes that individuals are distributed along a spatial continuum rather than discrete demes. PhyREX can be used to estimate population densities and rates of dispersal. Its output can be processed by treeannotator (from the BEAST package) as well as SPREAD. ### Citations - New algorithms and methods to estimate maximum-likelihood phylogenies: assessing the performance of PhyML 3.0 S Guindon, JF Dufayard, V Lefort, M Anisimova, W Hordijk, O Gascuel *Systematic Biology* 59 (3), 307-321, 2010. - Accounting for calibration uncertainty: Bayesian molecular dating as a “doubly intractable†problem S Guindon *Systematic Biology* 67 (4), 651–661, 2018. - Demographic inference under the coalescent in a spatial continuum S Guindon, H Guo, D Welch *Theoretical Population Biology* 111, 43-50, 2016. ### Installation To install any program that is part of the PhyML package, type the following command: ```bash sh ./autogen.sh; ``` If you are using a Mac computer or running a Unix-like operating system, you will need to install the packages autoconf automake and pkg-config. On a Mac, the following command should set you up (provided Homebrew is installed on your Mac...): brew install pkg-config autoconf automake; Next, to install any program that is part of the PhyML package, type the following commands: ```bash ./configure --enable-XXXX; make; ``` where XXXX is phyml or phyrex or phytime. To compile a Windows executable, install MinGW and run: ```bash ./configure --enable-win --enable-XXXX; make; ``` To install the MPI version of PhyML, type the following commands: ```bash autoreconf -i; ./configure --enable-phyml-mpi; make; ``` stephaneguindon-phyml-76a39c8/autogen.sh000066400000000000000000000000521501136442400203750ustar00rootroot00000000000000#!/bin/sh autoreconf --force --install -v stephaneguindon-phyml-76a39c8/config.h000066400000000000000000000065211501136442400200240ustar00rootroot00000000000000/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* DATE tag on */ /* #undef DATE */ /* Debug tag on */ #define DEBUG 1 /* EVOLVE tag on */ /* #undef EVOLVE */ /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ /* #undef HAVE_DOPRNT */ /* Define to 1 if you have the header file. */ #define HAVE_FLOAT_H 1 /* Define to 1 if you have the `floor' function. */ #define HAVE_FLOOR 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `m' library (-lm). */ #define HAVE_LIBM 1 /* Define to 1 if you have the `pow' function. */ #define HAVE_POW 1 /* Define to 1 if you have the `rint' function. */ #define HAVE_RINT 1 /* Define to 1 if you have the `sqrt' function. */ #define HAVE_SQRT 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDIO_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the `strchr' function. */ #define HAVE_STRCHR 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the `strstr' function. */ #define HAVE_STRSTR 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to 1 if you have the `vprintf' function. */ #define HAVE_VPRINTF 1 /* MPI tag on */ #define MPI 1 /* Name of package */ #define PACKAGE "phyml" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "stephane.guindon@lirmm.fr" /* Define to the full name of this package. */ #define PACKAGE_NAME "PhyML" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "PhyML 3.3.20250429" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "phyml" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "3.3.20250429" /* PHYML tag on */ #define PHYML 1 /* PHYREX tag on */ /* #undef PHYREX */ /* PHYREXSIM tag on */ /* #undef PHYREXSIM */ /* PHYTIME tag on */ /* #undef PHYTIME */ /* RF tag on */ /* #undef RF */ /* RWRAP tag on */ /* #undef RWRAP */ /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #define STDC_HEADERS 1 /* TEST tag on */ /* #undef TEST */ /* Unix tag on */ #define UNIX 1 /* Version number of package */ #define VERSION "3.3.20250429" /* WIN32 tag on */ /* #undef WIN32 */ /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef inline */ #endif /* Define to `unsigned int' if does not define. */ /* #undef size_t */ stephaneguindon-phyml-76a39c8/config.log000066400000000000000000000501621501136442400203560ustar00rootroot00000000000000This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by PhyML configure 3.3.20250429, which was generated by GNU Autoconf 2.71. Invocation command line was $ ./configure --enable-phyml-mpi ## --------- ## ## Platform. ## ## --------- ## hostname = eduroam183089.ugr.es uname -m = arm64 uname -r = 24.3.0 uname -s = Darwin uname -v = Darwin Kernel Version 24.3.0: Thu Jan 2 20:23:36 PST 2025; root:xnu-11215.81.4~3/RELEASE_ARM64_T8112 /usr/bin/uname -p = arm /bin/uname -X = unknown /bin/arch = unknown /usr/bin/arch -k = unknown /usr/convex/getsysinfo = unknown /usr/bin/hostinfo = Mach kernel version: Darwin Kernel Version 24.3.0: Thu Jan 2 20:23:36 PST 2025; root:xnu-11215.81.4~3/RELEASE_ARM64_T8112 Kernel configured for up to 8 processors. 8 processors are physically available. 8 processors are logically available. Processor type: arm64e (ARM64E) Processors active: 0 1 2 3 4 5 6 7 Primary memory available: 8.00 gigabytes Default processor set: 503 tasks, 2737 threads, 8 processors Load average: 1.73, Mach factor: 6.26 /bin/machine = unknown /usr/bin/oslevel = unknown /bin/universe = unknown PATH: /Users/guindon/anaconda3/bin/ PATH: /Users/guindon/anaconda3/condabin/ PATH: /Users/guindon/anaconda3/bin/ PATH: /Users/guindon/anaconda3/bin/ PATH: /opt/local/bin/ PATH: /opt/local/sbin/ PATH: /opt/homebrew/bin/ PATH: /opt/homebrew/sbin/ PATH: /usr/local/bin/ PATH: /System/Cryptexes/App/usr/bin/ PATH: /usr/bin/ PATH: /bin/ PATH: /usr/sbin/ PATH: /sbin/ PATH: /var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin/ PATH: /var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin/ PATH: /var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin/ PATH: /opt/X11/bin/ PATH: /Library/Apple/usr/bin/ PATH: /Library/TeX/texbin/ PATH: /usr/local/ncbi/blast/bin/ ## ----------- ## ## Core tests. ## ## ----------- ## configure:2413: looking for aux files: compile config.guess config.sub missing install-sh configure:2426: trying ./ configure:2455: ./compile found configure:2455: ./config.guess found configure:2455: ./config.sub found configure:2455: ./missing found configure:2437: ./install-sh found configure:2584: checking for a BSD-compatible install configure:2657: result: /usr/bin/install -c configure:2668: checking whether build environment is sane configure:2723: result: yes configure:2882: checking for a race-free mkdir -p configure:2926: result: ./install-sh -c -d configure:2933: checking for gawk configure:2968: result: no configure:2933: checking for mawk configure:2968: result: no configure:2933: checking for nawk configure:2968: result: no configure:2933: checking for awk configure:2954: found /usr/bin/awk configure:2965: result: awk configure:2976: checking whether make sets $(MAKE) configure:2999: result: yes configure:3029: checking whether make supports nested variables configure:3047: result: yes configure:3200: checking build system type configure:3215: result: aarch64-apple-darwin24.3.0 configure:3235: checking host system type configure:3249: result: aarch64-apple-darwin24.3.0 configure:3338: checking for gcc configure:3359: found /usr/bin/gcc configure:3370: result: gcc configure:3401: checking for C compiler version configure:3410: gcc --version >&5 Apple clang version 16.0.0 (clang-1600.0.26.6) Target: arm64-apple-darwin24.3.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin configure:3421: $? = 0 configure:3410: gcc -v >&5 Apple clang version 16.0.0 (clang-1600.0.26.6) Target: arm64-apple-darwin24.3.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin configure:3421: $? = 0 configure:3410: gcc -V >&5 clang: error: argument to '-V' is missing (expected 1 value) clang: error: no input files configure:3421: $? = 1 configure:3410: gcc -qversion >&5 clang: error: unknown argument '-qversion'; did you mean '--version'? clang: error: no input files configure:3421: $? = 1 configure:3410: gcc -version >&5 clang: error: unknown argument '-version'; did you mean '--version'? clang: error: no input files configure:3421: $? = 1 configure:3441: checking whether the C compiler works configure:3463: gcc conftest.c >&5 configure:3467: $? = 0 configure:3517: result: yes configure:3520: checking for C compiler default output file name configure:3522: result: a.out configure:3528: checking for suffix of executables configure:3535: gcc -o conftest conftest.c >&5 configure:3539: $? = 0 configure:3562: result: configure:3584: checking whether we are cross compiling configure:3592: gcc -o conftest conftest.c >&5 configure:3596: $? = 0 configure:3603: ./conftest configure:3607: $? = 0 configure:3622: result: no configure:3627: checking for suffix of object files configure:3650: gcc -c conftest.c >&5 configure:3654: $? = 0 configure:3676: result: o configure:3680: checking whether the compiler supports GNU C configure:3700: gcc -c conftest.c >&5 configure:3700: $? = 0 configure:3710: result: yes configure:3721: checking whether gcc accepts -g configure:3742: gcc -c -g conftest.c >&5 configure:3742: $? = 0 configure:3786: result: yes configure:3806: checking for gcc option to enable C11 features configure:3821: gcc -c -g -O2 conftest.c >&5 conftest.c:27:14: warning: a function definition without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype] 27 | static char *e (p, i) | ^ 1 warning generated. configure:3821: $? = 0 configure:3839: result: none needed configure:3955: checking whether gcc understands -c and -o together configure:3978: gcc -c conftest.c -o conftest2.o configure:3981: $? = 0 configure:3978: gcc -c conftest.c -o conftest2.o configure:3981: $? = 0 configure:3993: result: yes configure:4013: checking whether make supports the include directive configure:4028: make -f confmf.GNU && cat confinc.out this is the am__doit target configure:4031: $? = 0 configure:4050: result: yes (GNU style) configure:4076: checking dependency style of gcc configure:4188: result: gcc3 configure:4217: "gcc" configure:4223: checking for log in -lm configure:4246: gcc -o conftest -g -O2 conftest.c -lm >&5 conftest.c:17:6: warning: incompatible redeclaration of library function 'log' [-Wincompatible-library-redeclaration] 17 | char log (); | ^ conftest.c:17:6: note: 'log' is a builtin with type 'double (double)' 1 warning generated. configure:4246: $? = 0 configure:4256: result: yes configure:4272: checking for stdio.h configure:4272: gcc -c -g -O2 conftest.c >&5 configure:4272: $? = 0 configure:4272: result: yes configure:4272: checking for stdlib.h configure:4272: gcc -c -g -O2 conftest.c >&5 configure:4272: $? = 0 configure:4272: result: yes configure:4272: checking for string.h configure:4272: gcc -c -g -O2 conftest.c >&5 configure:4272: $? = 0 configure:4272: result: yes configure:4272: checking for inttypes.h configure:4272: gcc -c -g -O2 conftest.c >&5 configure:4272: $? = 0 configure:4272: result: yes configure:4272: checking for stdint.h configure:4272: gcc -c -g -O2 conftest.c >&5 configure:4272: $? = 0 configure:4272: result: yes configure:4272: checking for strings.h configure:4272: gcc -c -g -O2 conftest.c >&5 configure:4272: $? = 0 configure:4272: result: yes configure:4272: checking for sys/stat.h configure:4272: gcc -c -g -O2 conftest.c >&5 configure:4272: $? = 0 configure:4272: result: yes configure:4272: checking for sys/types.h configure:4272: gcc -c -g -O2 conftest.c >&5 configure:4272: $? = 0 configure:4272: result: yes configure:4272: checking for unistd.h configure:4272: gcc -c -g -O2 conftest.c >&5 configure:4272: $? = 0 configure:4272: result: yes configure:4297: checking for grep that handles long lines and -e configure:4361: result: /usr/bin/grep configure:4369: checking for egrep configure:4437: result: /usr/bin/grep -E configure:4443: checking for float.h configure:4443: gcc -c -g -O2 conftest.c >&5 configure:4443: $? = 0 configure:4443: result: yes configure:4449: checking for stdlib.h configure:4449: result: yes configure:4455: checking for string.h configure:4455: result: yes configure:4461: checking for unistd.h configure:4461: result: yes configure:4470: checking for an ANSI C-conforming const configure:4537: gcc -c -g -O2 conftest.c >&5 configure:4537: $? = 0 configure:4545: result: yes configure:4553: checking for inline configure:4570: gcc -c -g -O2 conftest.c >&5 configure:4570: $? = 0 configure:4579: result: inline configure:4597: checking for size_t configure:4597: gcc -c -g -O2 conftest.c >&5 configure:4597: $? = 0 configure:4597: gcc -c -g -O2 conftest.c >&5 conftest.c:59:21: error: expected expression 59 | if (sizeof ((size_t))) | ^ 1 error generated. configure:4597: $? = 1 configure: failed program was: | /* confdefs.h */ | #define PACKAGE_NAME "PhyML" | #define PACKAGE_TARNAME "phyml" | #define PACKAGE_VERSION "3.3.20250429" | #define PACKAGE_STRING "PhyML 3.3.20250429" | #define PACKAGE_BUGREPORT "stephane.guindon@lirmm.fr" | #define PACKAGE_URL "" | #define PACKAGE "phyml" | #define VERSION "3.3.20250429" | #define UNIX 1 | #define DEBUG 1 | #define HAVE_LIBM 1 | #define HAVE_STDIO_H 1 | #define HAVE_STDLIB_H 1 | #define HAVE_STRING_H 1 | #define HAVE_INTTYPES_H 1 | #define HAVE_STDINT_H 1 | #define HAVE_STRINGS_H 1 | #define HAVE_SYS_STAT_H 1 | #define HAVE_SYS_TYPES_H 1 | #define HAVE_UNISTD_H 1 | #define STDC_HEADERS 1 | #define HAVE_FLOAT_H 1 | #define HAVE_STDLIB_H 1 | #define HAVE_STRING_H 1 | #define HAVE_UNISTD_H 1 | /* end confdefs.h. */ | #include | #ifdef HAVE_STDIO_H | # include | #endif | #ifdef HAVE_STDLIB_H | # include | #endif | #ifdef HAVE_STRING_H | # include | #endif | #ifdef HAVE_INTTYPES_H | # include | #endif | #ifdef HAVE_STDINT_H | # include | #endif | #ifdef HAVE_STRINGS_H | # include | #endif | #ifdef HAVE_SYS_TYPES_H | # include | #endif | #ifdef HAVE_SYS_STAT_H | # include | #endif | #ifdef HAVE_UNISTD_H | # include | #endif | int | main (void) | { | if (sizeof ((size_t))) | return 0; | ; | return 0; | } configure:4597: result: yes configure:4613: checking for pdflatex configure:4634: found /opt/local/bin/pdflatex configure:4645: result: pdflatex configure:4661: checking for latex configure:4682: found /opt/local/bin/latex configure:4693: result: latex configure:4735: checking for vprintf configure:4735: gcc -o conftest -g -O2 conftest.c -lm >&5 conftest.c:44:6: warning: incompatible redeclaration of library function 'vprintf' [-Wincompatible-library-redeclaration] 44 | char vprintf (); | ^ conftest.c:44:6: note: 'vprintf' is a builtin with type 'int (const char *, __builtin_va_list)' 1 warning generated. configure:4735: $? = 0 configure:4735: result: yes configure:4756: checking for floor configure:4756: gcc -o conftest -g -O2 conftest.c -lm >&5 conftest.c:45:6: warning: incompatible redeclaration of library function 'floor' [-Wincompatible-library-redeclaration] 45 | char floor (); | ^ conftest.c:45:6: note: 'floor' is a builtin with type 'double (double)' 1 warning generated. configure:4756: $? = 0 configure:4756: result: yes configure:4762: checking for pow configure:4762: gcc -o conftest -g -O2 conftest.c -lm >&5 conftest.c:46:6: warning: incompatible redeclaration of library function 'pow' [-Wincompatible-library-redeclaration] 46 | char pow (); | ^ conftest.c:46:6: note: 'pow' is a builtin with type 'double (double, double)' 1 warning generated. configure:4762: $? = 0 configure:4762: result: yes configure:4768: checking for rint configure:4768: gcc -o conftest -g -O2 conftest.c -lm >&5 conftest.c:47:6: warning: incompatible redeclaration of library function 'rint' [-Wincompatible-library-redeclaration] 47 | char rint (); | ^ conftest.c:47:6: note: 'rint' is a builtin with type 'double (double)' 1 warning generated. configure:4768: $? = 0 configure:4768: result: yes configure:4774: checking for sqrt configure:4774: gcc -o conftest -g -O2 conftest.c -lm >&5 conftest.c:48:6: warning: incompatible redeclaration of library function 'sqrt' [-Wincompatible-library-redeclaration] 48 | char sqrt (); | ^ conftest.c:48:6: note: 'sqrt' is a builtin with type 'double (double)' 1 warning generated. configure:4774: $? = 0 configure:4774: result: yes configure:4780: checking for strchr configure:4780: gcc -o conftest -g -O2 conftest.c -lm >&5 conftest.c:49:6: warning: incompatible redeclaration of library function 'strchr' [-Wincompatible-library-redeclaration] 49 | char strchr (); | ^ conftest.c:49:6: note: 'strchr' is a builtin with type 'char *(const char *, int)' 1 warning generated. configure:4780: $? = 0 configure:4780: result: yes configure:4786: checking for strstr configure:4786: gcc -o conftest -g -O2 conftest.c -lm >&5 conftest.c:50:6: warning: incompatible redeclaration of library function 'strstr' [-Wincompatible-library-redeclaration] 50 | char strstr (); | ^ conftest.c:50:6: note: 'strstr' is a builtin with type 'char *(const char *, const char *)' 1 warning generated. configure:4786: $? = 0 configure:4786: result: yes configure:5248: checking that generated files are newer than configure configure:5254: result: done configure:5325: creating ./config.status ## ---------------------- ## ## Running config.status. ## ## ---------------------- ## This file was extended by PhyML config.status 3.3.20250429, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = CONFIG_HEADERS = CONFIG_LINKS = CONFIG_COMMANDS = $ ./config.status on eduroam183089.ugr.es config.status:900: creating Makefile config.status:900: creating src/Makefile config.status:900: creating doc/Makefile config.status:900: creating config.h config.status:1129: executing depfiles commands config.status:1206: cd src && sed -e '/# am--include-marker/d' Makefile | make -f - am--depfiles make: Nothing to be done for `am--depfiles'. config.status:1211: $? = 0 ## ---------------- ## ## Cache variables. ## ## ---------------- ## ac_cv_build=aarch64-apple-darwin24.3.0 ac_cv_c_compiler_gnu=yes ac_cv_c_const=yes ac_cv_c_inline=inline ac_cv_env_CC_set= ac_cv_env_CC_value= ac_cv_env_CFLAGS_set= ac_cv_env_CFLAGS_value= ac_cv_env_CPPFLAGS_set= ac_cv_env_CPPFLAGS_value= ac_cv_env_LDFLAGS_set= ac_cv_env_LDFLAGS_value= ac_cv_env_LIBS_set= ac_cv_env_LIBS_value= ac_cv_env_build_alias_set= ac_cv_env_build_alias_value= ac_cv_env_host_alias_set= ac_cv_env_host_alias_value= ac_cv_env_target_alias_set= ac_cv_env_target_alias_value= ac_cv_func_floor=yes ac_cv_func_pow=yes ac_cv_func_rint=yes ac_cv_func_setvbuf_reversed=no ac_cv_func_sqrt=yes ac_cv_func_strchr=yes ac_cv_func_strstr=yes ac_cv_func_vprintf=yes ac_cv_header_float_h=yes ac_cv_header_inttypes_h=yes ac_cv_header_stdint_h=yes ac_cv_header_stdio_h=yes ac_cv_header_stdlib_h=yes ac_cv_header_string_h=yes ac_cv_header_strings_h=yes ac_cv_header_sys_stat_h=yes ac_cv_header_sys_types_h=yes ac_cv_header_unistd_h=yes ac_cv_host=aarch64-apple-darwin24.3.0 ac_cv_lib_m_log=yes ac_cv_objext=o ac_cv_path_EGREP='/usr/bin/grep -E' ac_cv_path_GREP=/usr/bin/grep ac_cv_path_install='/usr/bin/install -c' ac_cv_prog_AWK=awk ac_cv_prog_LATEX=latex ac_cv_prog_PDFLATEX=pdflatex ac_cv_prog_ac_ct_CC=gcc ac_cv_prog_cc_c11= ac_cv_prog_cc_g=yes ac_cv_prog_cc_stdc= ac_cv_prog_make_make_set=yes ac_cv_type_size_t=yes am_cv_CC_dependencies_compiler_type=gcc3 am_cv_make_support_nested_variables=yes am_cv_prog_cc_c_o=yes ## ----------------- ## ## Output variables. ## ## ----------------- ## ACLOCAL='${SHELL} '\''/Users/guindon/phyml/missing'\'' aclocal-1.16' AMDEPBACKSLASH='\' AMDEP_FALSE='#' AMDEP_TRUE='' AMTAR='$${TAR-tar}' AM_BACKSLASH='\' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' AM_DEFAULT_VERBOSITY='1' AM_V='$(V)' AUTOCONF='${SHELL} '\''/Users/guindon/phyml/missing'\'' autoconf' AUTOHEADER='${SHELL} '\''/Users/guindon/phyml/missing'\'' autoheader' AUTOMAKE='${SHELL} '\''/Users/guindon/phyml/missing'\'' automake-1.16' AWK='awk' CC='mpicc' CCDEPMODE='depmode=gcc3' CFLAGS='-std=gnu99 -O3 -fomit-frame-pointer -funroll-loops -Wall -Winline -finline -march=native' CPPFLAGS='' CSCOPE='cscope' CTAGS='ctags' CYGPATH_W='echo' DEFS='-DHAVE_CONFIG_H' DEPDIR='.deps' ECHO_C='\c' ECHO_N='' ECHO_T='' EGREP='/usr/bin/grep -E' ETAGS='etags' EXEEXT='' GREP='/usr/bin/grep' HAVE_PDFLATEX_FALSE='#' HAVE_PDFLATEX_TRUE='' INSTALL_DATA='${INSTALL} -m 644' INSTALL_PROGRAM='${INSTALL}' INSTALL_SCRIPT='${INSTALL}' INSTALL_STRIP_PROGRAM='$(install_sh) -c -s' LATEX='latex' LDFLAGS='' LIBOBJS='' LIBS='-lm ' LTLIBOBJS='' MAKEINFO='${SHELL} '\''/Users/guindon/phyml/missing'\'' makeinfo' MKDIR_P='./install-sh -c -d' OBJEXT='o' PACKAGE='phyml' PACKAGE_BUGREPORT='stephane.guindon@lirmm.fr' PACKAGE_NAME='PhyML' PACKAGE_STRING='PhyML 3.3.20250429' PACKAGE_TARNAME='phyml' PACKAGE_URL='' PACKAGE_VERSION='3.3.20250429' PATH_SEPARATOR=':' PDFLATEX='pdflatex' SET_MAKE='' SHELL='/bin/sh' STRIP='' VERSION='3.3.20250429' WANT_DATE_FALSE='' WANT_DATE_TRUE='#' WANT_EVOLVE_FALSE='' WANT_EVOLVE_TRUE='#' WANT_MPI_FALSE='#' WANT_MPI_TRUE='' WANT_PHYML_FALSE='' WANT_PHYML_TRUE='#' WANT_PHYREXSIM_FALSE='' WANT_PHYREXSIM_TRUE='#' WANT_PHYREX_FALSE='' WANT_PHYREX_TRUE='#' WANT_PHYTIME_FALSE='' WANT_PHYTIME_TRUE='#' WANT_RF_FALSE='' WANT_RF_TRUE='#' WANT_RWRAP_FALSE='' WANT_RWRAP_TRUE='#' WANT_TEST_FALSE='' WANT_TEST_TRUE='#' WANT_WIN_FALSE='' WANT_WIN_TRUE='#' ac_ct_CC='gcc' am__EXEEXT_FALSE='' am__EXEEXT_TRUE='#' am__fastdepCC_FALSE='#' am__fastdepCC_TRUE='' am__include='include' am__isrc='' am__leading_dot='.' am__nodep='_no' am__quote='' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' bindir='${exec_prefix}/bin' build='aarch64-apple-darwin24.3.0' build_alias='' build_cpu='aarch64' build_os='darwin24.3.0' build_vendor='apple' datadir='${datarootdir}' datarootdir='${prefix}/share' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' dvidir='${docdir}' exec_prefix='${prefix}' host='aarch64-apple-darwin24.3.0' host_alias='' host_cpu='aarch64' host_os='darwin24.3.0' host_vendor='apple' htmldir='${docdir}' includedir='${prefix}/include' infodir='${datarootdir}/info' install_sh='${SHELL} /Users/guindon/phyml/install-sh' libdir='${exec_prefix}/lib' libexecdir='${exec_prefix}/libexec' localedir='${datarootdir}/locale' localstatedir='${prefix}/var' mandir='${datarootdir}/man' mkdir_p='$(MKDIR_P)' oldincludedir='/usr/include' pdfdir='${docdir}' prefix='/usr/local' program_transform_name='s,x,x,' psdir='${docdir}' runstatedir='${localstatedir}/run' sbindir='${exec_prefix}/sbin' sharedstatedir='${prefix}/com' sysconfdir='${prefix}/etc' target_alias='' ## ----------- ## ## confdefs.h. ## ## ----------- ## /* confdefs.h */ #define PACKAGE_NAME "PhyML" #define PACKAGE_TARNAME "phyml" #define PACKAGE_VERSION "3.3.20250429" #define PACKAGE_STRING "PhyML 3.3.20250429" #define PACKAGE_BUGREPORT "stephane.guindon@lirmm.fr" #define PACKAGE_URL "" #define PACKAGE "phyml" #define VERSION "3.3.20250429" #define UNIX 1 #define DEBUG 1 #define HAVE_LIBM 1 #define HAVE_STDIO_H 1 #define HAVE_STDLIB_H 1 #define HAVE_STRING_H 1 #define HAVE_INTTYPES_H 1 #define HAVE_STDINT_H 1 #define HAVE_STRINGS_H 1 #define HAVE_SYS_STAT_H 1 #define HAVE_SYS_TYPES_H 1 #define HAVE_UNISTD_H 1 #define STDC_HEADERS 1 #define HAVE_FLOAT_H 1 #define HAVE_STDLIB_H 1 #define HAVE_STRING_H 1 #define HAVE_UNISTD_H 1 #define HAVE_VPRINTF 1 #define HAVE_FLOOR 1 #define HAVE_POW 1 #define HAVE_RINT 1 #define HAVE_SQRT 1 #define HAVE_STRCHR 1 #define HAVE_STRSTR 1 #define MPI 1 #define PHYML 1 configure: exit 0 ## ---------------------- ## ## Running config.status. ## ## ---------------------- ## This file was extended by PhyML config.status 3.3.20250429, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = CONFIG_HEADERS = CONFIG_LINKS = CONFIG_COMMANDS = $ ./config.status src/Makefile depfiles on eduroam183089.ugr.es config.status:900: creating src/Makefile config.status:1129: executing depfiles commands config.status:1206: cd src && sed -e '/# am--include-marker/d' Makefile | make -f - am--depfiles make[3]: Nothing to be done for `am--depfiles'. config.status:1211: $? = 0 stephaneguindon-phyml-76a39c8/config.status000077500000000000000000001030671501136442400211260ustar00rootroot00000000000000#! /bin/sh # Generated by configure. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=${CONFIG_SHELL-/bin/sh} export SHELL ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by PhyML $as_me 3.3.20250429, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " # Files that config.status was made for. config_files=" Makefile src/Makefile doc/Makefile" config_headers=" config.h" config_commands=" depfiles" ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." ac_cs_config='--enable-phyml-mpi' ac_cs_version="\ PhyML config.status 3.3.20250429 configured by ./configure, generated by GNU Autoconf 2.71, with options \"$ac_cs_config\" Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='/Users/guindon/phyml' srcdir='.' INSTALL='/usr/bin/install -c' MKDIR_P='./install-sh -c -d' AWK='awk' test -n "$AWK" || AWK=awk # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi if $ac_cs_recheck; then set X /bin/sh './configure' '--enable-phyml-mpi' $ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=/bin/sh $*" >&6 CONFIG_SHELL='/bin/sh' export CONFIG_SHELL exec "$@" fi exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 # # INIT-COMMANDS # AMDEP_TRUE="" MAKE="make" # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && S["am__EXEEXT_FALSE"]="" S["am__EXEEXT_TRUE"]="#" S["LTLIBOBJS"]="" S["LIBOBJS"]="" S["WANT_DATE_FALSE"]="" S["WANT_DATE_TRUE"]="#" S["WANT_PHYREXSIM_FALSE"]="" S["WANT_PHYREXSIM_TRUE"]="#" S["WANT_PHYREX_FALSE"]="" S["WANT_PHYREX_TRUE"]="#" S["WANT_EVOLVE_FALSE"]="" S["WANT_EVOLVE_TRUE"]="#" S["WANT_TEST_FALSE"]="" S["WANT_TEST_TRUE"]="#" S["WANT_RF_FALSE"]="" S["WANT_RF_TRUE"]="#" S["WANT_RWRAP_FALSE"]="" S["WANT_RWRAP_TRUE"]="#" S["WANT_PHYML_FALSE"]="" S["WANT_PHYML_TRUE"]="#" S["WANT_PHYTIME_FALSE"]="" S["WANT_PHYTIME_TRUE"]="#" S["WANT_WIN_FALSE"]="" S["WANT_WIN_TRUE"]="#" S["WANT_MPI_FALSE"]="#" S["WANT_MPI_TRUE"]="" S["HAVE_PDFLATEX_FALSE"]="#" S["HAVE_PDFLATEX_TRUE"]="" S["LATEX"]="latex" S["PDFLATEX"]="pdflatex" S["EGREP"]="/usr/bin/grep -E" S["GREP"]="/usr/bin/grep" S["am__fastdepCC_FALSE"]="#" S["am__fastdepCC_TRUE"]="" S["CCDEPMODE"]="depmode=gcc3" S["am__nodep"]="_no" S["AMDEPBACKSLASH"]="\\" S["AMDEP_FALSE"]="#" S["AMDEP_TRUE"]="" S["am__include"]="include" S["DEPDIR"]=".deps" S["OBJEXT"]="o" S["EXEEXT"]="" S["ac_ct_CC"]="gcc" S["CPPFLAGS"]="" S["LDFLAGS"]="" S["CFLAGS"]="-std=gnu99 -O3 -fomit-frame-pointer -funroll-loops -Wall -Winline -finline -march=native" S["CC"]="mpicc" S["host_os"]="darwin24.3.0" S["host_vendor"]="apple" S["host_cpu"]="aarch64" S["host"]="aarch64-apple-darwin24.3.0" S["build_os"]="darwin24.3.0" S["build_vendor"]="apple" S["build_cpu"]="aarch64" S["build"]="aarch64-apple-darwin24.3.0" S["AM_BACKSLASH"]="\\" S["AM_DEFAULT_VERBOSITY"]="1" S["AM_DEFAULT_V"]="$(AM_DEFAULT_VERBOSITY)" S["AM_V"]="$(V)" S["CSCOPE"]="cscope" S["ETAGS"]="etags" S["CTAGS"]="ctags" S["am__untar"]="$${TAR-tar} xf -" S["am__tar"]="$${TAR-tar} chof - \"$$tardir\"" S["AMTAR"]="$${TAR-tar}" S["am__leading_dot"]="." S["SET_MAKE"]="" S["AWK"]="awk" S["mkdir_p"]="$(MKDIR_P)" S["MKDIR_P"]="./install-sh -c -d" S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s" S["STRIP"]="" S["install_sh"]="${SHELL} /Users/guindon/phyml/install-sh" S["MAKEINFO"]="${SHELL} '/Users/guindon/phyml/missing' makeinfo" S["AUTOHEADER"]="${SHELL} '/Users/guindon/phyml/missing' autoheader" S["AUTOMAKE"]="${SHELL} '/Users/guindon/phyml/missing' automake-1.16" S["AUTOCONF"]="${SHELL} '/Users/guindon/phyml/missing' autoconf" S["ACLOCAL"]="${SHELL} '/Users/guindon/phyml/missing' aclocal-1.16" S["VERSION"]="3.3.20250429" S["PACKAGE"]="phyml" S["CYGPATH_W"]="echo" S["am__isrc"]="" S["INSTALL_DATA"]="${INSTALL} -m 644" S["INSTALL_SCRIPT"]="${INSTALL}" S["INSTALL_PROGRAM"]="${INSTALL}" S["target_alias"]="" S["host_alias"]="" S["build_alias"]="" S["LIBS"]="-lm " S["ECHO_T"]="" S["ECHO_N"]="" S["ECHO_C"]="\\c" S["DEFS"]="-DHAVE_CONFIG_H" S["mandir"]="${datarootdir}/man" S["localedir"]="${datarootdir}/locale" S["libdir"]="${exec_prefix}/lib" S["psdir"]="${docdir}" S["pdfdir"]="${docdir}" S["dvidir"]="${docdir}" S["htmldir"]="${docdir}" S["infodir"]="${datarootdir}/info" S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}" S["oldincludedir"]="/usr/include" S["includedir"]="${prefix}/include" S["runstatedir"]="${localstatedir}/run" S["localstatedir"]="${prefix}/var" S["sharedstatedir"]="${prefix}/com" S["sysconfdir"]="${prefix}/etc" S["datadir"]="${datarootdir}" S["datarootdir"]="${prefix}/share" S["libexecdir"]="${exec_prefix}/libexec" S["sbindir"]="${exec_prefix}/sbin" S["bindir"]="${exec_prefix}/bin" S["program_transform_name"]="s,x,x," S["prefix"]="/usr/local" S["exec_prefix"]="${prefix}" S["PACKAGE_URL"]="" S["PACKAGE_BUGREPORT"]="stephane.guindon@lirmm.fr" S["PACKAGE_STRING"]="PhyML 3.3.20250429" S["PACKAGE_VERSION"]="3.3.20250429" S["PACKAGE_TARNAME"]="phyml" S["PACKAGE_NAME"]="PhyML" S["PATH_SEPARATOR"]=":" S["SHELL"]="/bin/sh" S["am__quote"]="" _ACAWK cat >>"$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { D["PACKAGE_NAME"]=" \"PhyML\"" D["PACKAGE_TARNAME"]=" \"phyml\"" D["PACKAGE_VERSION"]=" \"3.3.20250429\"" D["PACKAGE_STRING"]=" \"PhyML 3.3.20250429\"" D["PACKAGE_BUGREPORT"]=" \"stephane.guindon@lirmm.fr\"" D["PACKAGE_URL"]=" \"\"" D["PACKAGE"]=" \"phyml\"" D["VERSION"]=" \"3.3.20250429\"" D["UNIX"]=" 1" D["DEBUG"]=" 1" D["HAVE_LIBM"]=" 1" D["HAVE_STDIO_H"]=" 1" D["HAVE_STDLIB_H"]=" 1" D["HAVE_STRING_H"]=" 1" D["HAVE_INTTYPES_H"]=" 1" D["HAVE_STDINT_H"]=" 1" D["HAVE_STRINGS_H"]=" 1" D["HAVE_SYS_STAT_H"]=" 1" D["HAVE_SYS_TYPES_H"]=" 1" D["HAVE_UNISTD_H"]=" 1" D["STDC_HEADERS"]=" 1" D["HAVE_FLOAT_H"]=" 1" D["HAVE_STDLIB_H"]=" 1" D["HAVE_STRING_H"]=" 1" D["HAVE_UNISTD_H"]=" 1" D["HAVE_VPRINTF"]=" 1" D["HAVE_FLOOR"]=" 1" D["HAVE_POW"]=" 1" D["HAVE_RINT"]=" 1" D["HAVE_SQRT"]=" 1" D["HAVE_STRCHR"]=" 1" D["HAVE_STRSTR"]=" 1" D["MPI"]=" 1" D["PHYML"]=" 1" for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ { line = $ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} ac_datarootdir_hack=' s&@datadir@&${datarootdir}&g s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g s&@infodir@&${datarootdir}/info&g s&@localedir@&${datarootdir}/locale&g s&@mandir@&${datarootdir}/man&g s&\${datarootdir}&${prefix}/share&g' ;; esac ac_sed_extra="/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// } :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; esac done # for ac_tag as_fn_exit 0 stephaneguindon-phyml-76a39c8/configure.ac000066400000000000000000000155271501136442400207020ustar00rootroot00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_INIT([PhyML],esyscmd([sh -c "echo "3.3." | tr -d '\n' ; echo "20250429" | tr -d '\n'"]),[stephane.guindon@lirmm.fr]) AM_INIT_AUTOMAKE([foreign]) AC_CONFIG_SRCDIR([src/main.c],[doc/phyml-manual.tex]) AC_CONFIG_HEADERS([config.h]) AC_DEFINE([UNIX],[1],[Unix tag on]) AC_DEFINE([DEBUG],[1],[Debug tag on]) AC_CANONICAL_HOST AC_PROG_CC([gcc clang mpicc]) AS_IF([test "$CC" = "gcc"],[DEFAULT_VECTOR_FLAG="-march=native"]) AS_IF([test "$CC" = "clang"],[DEFAULT_VECTOR_FLAG="-mcpu=native"]) AS_IF([test "$CC" = "mpicc"],[DEFAULT_VECTOR_FLAG="-march=native"]) AC_MSG_NOTICE(["$CC"]) # Checks for libraries. AC_CHECK_LIB([m], [log]) # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([float.h stdlib.h string.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T # Check for presence of LaTeX and pdfLaTeX AC_CHECK_PROGS([PDFLATEX], pdflatex, [/bin/false]) AC_CHECK_PROGS([LATEX], latex, [/bin/false]) if test "x$PDFLATEX" = x/bin/false || test "x$LATEX" = x/bin/false; then enable_docs=no AC_MSG_WARN([Documentation will not be built!]) fi AM_CONDITIONAL([HAVE_PDFLATEX], test -n "$PDFLATEX") # Checks for library functions. # AC_FUNC_MALLOC # AC_FUNC_REALLOC AC_FUNC_SETVBUF_REVERSED AC_FUNC_VPRINTF AC_CHECK_FUNCS([floor pow rint sqrt strchr strstr]) dnl DEFAULT_VECTOR_FLAG="" dnl DEFAULT_VECTOR_FLAG="-mavx -mfma" dnl DEFAULT_VECTOR_FLAG="-mavx2" dnl DEFAULT_VECTOR_FLAG=-msse3 DEFAULT_VECTOR_FLAG="-march=native" dnl DEFAULT_VECTOR_FLAG="-mtune=native" dnl DEFAULT_VECTOR_FLAG="-mcpu=native" AC_ARG_ENABLE([native], [AS_HELP_STRING([--disable-native], [Remove AVX or SSE compilation options.])]) AS_IF([test "x$enable_native" = "xno"], [VECTOR_FLAG="-DDISABLE_NATIVE"], [VECTOR_FLAG="${DEFAULT_VECTOR_FLAG}"]) LDFLAGS="${ARGC_flag}" dnl Uncomment two rows below when compiling rwarp (need to have libtool installed) dnl LT_INIT dnl AC_PROG_LIBTOOL dnl DEFAULT_C_FLAG="-fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls -O2 -fno-omit-frame-pointer -g ${VECTOR_FLAG}" DEFAULT_C_FLAG="-std=gnu99 -O3 -fomit-frame-pointer -funroll-loops -Wall -Winline -finline ${VECTOR_FLAG}" dnl DEFAULT_C_FLAG="-O2 ${VECTOR_FLAG}" dnl DEFAULT_C_FLAG="${VECTOR_FLAG}" dnl DEFAULT_C_FLAG="-pthread -O3 -g -ffunction-sections -fdata-sections" AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], [Remove optimization options and add debug informations.])]) AS_IF([test "x$enable_debug" = "xyes"], dnl [CFLAGS="-ansi ${VECTOR_FLAG} -pedantic -Wall -std=c99 -O0 -g -Wuninitialized -Wunused -Wunreachable-code -Og"], [CFLAGS="${VECTOR_FLAG} -Wall -std=c99 -g"], [CFLAGS="${DEFAULT_C_FLAG}"]) AC_ARG_ENABLE([safemode], AS_HELP_STRING([--enable-safemode],[Enable safe mode.])) AS_IF([test "x$enable_safemode" = "xyes"], [CFLAGS="-Wall -DSAFEMODE -O3 ${VECTOR_FLAG}"], [AS_IF([test "x$enable_debug" = "xno"],[CFLAGS="${DEFAULT_C_FLAG}"])]) AC_ARG_ENABLE([gprof], [AS_HELP_STRING([--enable-gprof], [Remove optimization options and add profiling informations.])]) AS_IF([test "x$enable_gprof" = "xyes"], [CFLAGS="-g -pg -fno-inline -fprofile-arcs -ftest-coverage ${VECTOR_FLAG}"], [AS_IF([test "x$enable_debug" = "xno"],[CFLAGS="${DEFAULT_C_FLAG}"])]) AC_ARG_ENABLE([phyml-mpi], [AS_HELP_STRING([--enable-phyml-mpi], [Compile with mpicc instead of gcc.])]) AS_IF([test "x$enable_phyml_mpi" = "xyes"],[CC="mpicc"]) AS_IF([test "x$enable_phyml_mpi" = "xyes"],AC_DEFINE([MPI],[1],[MPI tag on])) AM_CONDITIONAL([WANT_MPI], [test "$enable_phyml_mpi" = yes]) AC_ARG_ENABLE([win], [AS_HELP_STRING([--enable-win], [Compile with mingw instead of gcc.])]) AS_IF([test "x$enable_win" = "xyes"],[CC="i686-w64-mingw32-gcc"]) AS_IF([test "x$enable_win" = "xyes"],AC_DEFINE([WIN32],[1],[WIN32 tag on])) AM_CONDITIONAL([WANT_WIN], [test "$enable_win" = yes]) AC_ARG_ENABLE([phytime],[AS_HELP_STRING([--enable-phytime],[Compile PhyTime])],[phytime=yes],[phytime=no]) AM_CONDITIONAL([WANT_PHYTIME], [test "$phytime" = yes]) if test "$phytime" = yes; then AC_DEFINE([PHYTIME],[1],[PHYTIME tag on]) fi AC_ARG_ENABLE([phyml],[AS_HELP_STRING([--enable-phyml],[Compile PhyML])],[phyml=yes],[phyml=no]) AM_CONDITIONAL([WANT_PHYML], [test "$phyml" = yes]) if test "$phyml" = yes; then AC_DEFINE([PHYML],[1],[PHYML tag on]) fi AC_ARG_ENABLE([rwrap],[AS_HELP_STRING([--enable-rwrap],[Compile Rwrap])],[rwrap=yes],[rwrap=no]) AM_CONDITIONAL([WANT_RWRAP], [test "$rwrap" = yes]) if test "$rwrap" = yes; then AC_DEFINE([RWRAP],[1],[RWRAP tag on]) fi AC_ARG_ENABLE([rf],[AS_HELP_STRING([--enable-rf],[Compile RF])],[rf=yes],[rf=no]) AM_CONDITIONAL([WANT_RF], [test "$rf" = yes]) if test "$rf" = yes; then AC_DEFINE([RF],[1],[RF tag on]) fi AC_ARG_ENABLE([test],[AS_HELP_STRING([--enable-test],[Compile test])],[test=yes],[test=no]) AM_CONDITIONAL([WANT_TEST], [test "$test" = yes]) if test "$test" = yes; then AC_DEFINE([TEST],[1],[TEST tag on]) fi AC_ARG_ENABLE([evolve],[AS_HELP_STRING([--enable-evolve],[Compile evolve])],[evolve=yes],[evolve=no]) AM_CONDITIONAL([WANT_EVOLVE], [test "$evolve" = yes]) if test "$evolve" = yes; then AC_DEFINE([EVOLVE],[1],[EVOLVE tag on]) fi AC_ARG_ENABLE([phyrex],[AS_HELP_STRING([--enable-phyrex],[Compile phyrex])],[phyrex=yes],[phyrex=no]) AM_CONDITIONAL([WANT_PHYREX], [test "$phyrex" = yes]) if test "$phyrex" = yes; then AC_DEFINE([PHYREX],[1],[PHYREX tag on]) fi AC_ARG_ENABLE([phyrexsim],[AS_HELP_STRING([--enable-phyrexsim],[Compile phyrexsim])],[phyrexsim=yes],[phyrexsim=no]) AM_CONDITIONAL([WANT_PHYREXSIM], [test "$phyrexsim" = yes]) if test "$phyrexsim" = yes; then AC_DEFINE([PHYREXSIM],[1],[PHYREXSIM tag on]) fi dnl AS_IF([test "x$enable_phyrex" = "xyes"],[PKG_CHECK_MODULES([GTK], [gtk+-3.0])]) dnl AS_IF([test "x$enable_phyrex" = "xyes"],[PKG_CHECK_MODULES([CAIRO], [cairo])]) dnl AS_IF([test "x$enable_phyrex" = "xyes"],[CFLAGS="${CFLAGS} `pkg-config --cflags --libs gtk+-3.0`"]) dnl AM_PATH_GTK_3_0(,,AC_MSG_ERROR(windoe-default needs GTK+-3)) AC_ARG_ENABLE([date],[AS_HELP_STRING([--enable-date],[Compile date])],[date=yes],[date=no]) AM_CONDITIONAL([WANT_DATE], [test "$date" = yes]) if test "$date" = yes; then AC_DEFINE([DATE],[1],[DATE tag on]) fi if test "$phytime" = no; then if test "$rwrap" = no; then if test "$test" = no; then if test "$rf" = no; then if test "$evolve" = no; then if test "$phyrex" = no; then if test "$phyrexsim" = no; then if test "$date" = no; then AC_DEFINE([PHYML],[1],[PHYML tag on]) fi fi fi fi fi fi fi fi AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile]) AC_OUTPUT stephaneguindon-phyml-76a39c8/doc/000077500000000000000000000000001501136442400171475ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/doc/Makefile000066400000000000000000000345121501136442400206140ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.5 from Makefile.am. # doc/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/phyml pkgincludedir = $(includedir)/phyml pkglibdir = $(libdir)/phyml pkglibexecdir = $(libexecdir)/phyml am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = aarch64-apple-darwin24.3.0 host_triplet = aarch64-apple-darwin24.3.0 am__append_1 = phyml-manual.pdf subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_doc_DATA_DIST) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__dist_doc_DATA_DIST = phyml-manual.tex ./fig/phyrexlog.pdf \ ./fig/phytimetrace.pdf phyml-manual.pdf am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(docdir)" DATA = $(dist_doc_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = ${SHELL} '/Users/guindon/phyml/missing' aclocal-1.16 AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AUTOCONF = ${SHELL} '/Users/guindon/phyml/missing' autoconf AUTOHEADER = ${SHELL} '/Users/guindon/phyml/missing' autoheader AUTOMAKE = ${SHELL} '/Users/guindon/phyml/missing' automake-1.16 AWK = awk CC = mpicc CCDEPMODE = depmode=gcc3 CFLAGS = -std=gnu99 -O3 -fomit-frame-pointer -funroll-loops -Wall -Winline -finline -march=native CPPFLAGS = CSCOPE = cscope CTAGS = ctags CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps ECHO_C = \c ECHO_N = ECHO_T = EGREP = /usr/bin/grep -E ETAGS = etags EXEEXT = GREP = /usr/bin/grep INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s LATEX = latex LDFLAGS = LIBOBJS = LIBS = -lm LTLIBOBJS = MAKEINFO = ${SHELL} '/Users/guindon/phyml/missing' makeinfo MKDIR_P = .././install-sh -c -d OBJEXT = o PACKAGE = phyml PACKAGE_BUGREPORT = stephane.guindon@lirmm.fr PACKAGE_NAME = PhyML PACKAGE_STRING = PhyML 3.3.20250429 PACKAGE_TARNAME = phyml PACKAGE_URL = PACKAGE_VERSION = 3.3.20250429 PATH_SEPARATOR = : PDFLATEX = pdflatex SET_MAKE = SHELL = /bin/sh STRIP = VERSION = 3.3.20250429 abs_builddir = /Users/guindon/phyml/doc abs_srcdir = /Users/guindon/phyml/doc abs_top_builddir = /Users/guindon/phyml abs_top_srcdir = /Users/guindon/phyml ac_ct_CC = gcc am__include = include am__leading_dot = . am__quote = am__tar = $${TAR-tar} chof - "$$tardir" am__untar = $${TAR-tar} xf - bindir = ${exec_prefix}/bin build = aarch64-apple-darwin24.3.0 build_alias = build_cpu = aarch64 build_os = darwin24.3.0 build_vendor = apple builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = $(datadir)/doc dvidir = ${docdir} exec_prefix = ${prefix} host = aarch64-apple-darwin24.3.0 host_alias = host_cpu = aarch64 host_os = darwin24.3.0 host_vendor = apple htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info install_sh = ${SHELL} /Users/guindon/phyml/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} runstatedir = ${localstatedir}/run sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . sysconfdir = ${prefix}/etc target_alias = top_build_prefix = ../ top_builddir = .. top_srcdir = .. docfiles = phyml-manual.tex ./fig/phyrexlog.pdf ./fig/phytimetrace.pdf \ $(am__append_1) MANNAME = phyml-manual MANTEXSRC = $(MANNAME).tex MANIDX = $(MANNAME).idx CLEANFILES = $(MANNAME).pdf $(MANNAME).log $(MANNAME).idx $(MANNAME).out \ $(MANNAME).toc $(MANNAME).aux $(MANNAME).ilg $(MANNAME).ind $(MANNAME).dvi dist_doc_DATA = $(docfiles) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-dist_docDATA: $(dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_docDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_docDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_docDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_docDATA .PRECIOUS: Makefile latex: $(MANTEXSRC) latex $< pdflatex: $(MANTEXSRC) pdflatex $< makeindex: $(MANTEXSRC) makeindex $< phyml-manual.pdf: intro pdflatex makeindex # phyml-manual.pdf: intro pdflatex @echo "" @echo "Done." intro: @echo "" @echo "" @echo ".: Building documentation :." @echo "" @echo "" # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: stephaneguindon-phyml-76a39c8/doc/Makefile.am000066400000000000000000000013041501136442400212010ustar00rootroot00000000000000docdir = $(datadir)/doc docfiles = phyml-manual.tex ./fig/phyrexlog.pdf ./fig/phytimetrace.pdf if HAVE_PDFLATEX docfiles += phyml-manual.pdf endif MANNAME = phyml-manual MANTEXSRC = $(MANNAME).tex MANIDX = $(MANNAME).idx CLEANFILES = $(MANNAME).pdf $(MANNAME).log $(MANNAME).idx $(MANNAME).out \ $(MANNAME).toc $(MANNAME).aux $(MANNAME).ilg $(MANNAME).ind $(MANNAME).dvi latex: $(MANTEXSRC) latex $< pdflatex: $(MANTEXSRC) pdflatex $< makeindex: $(MANTEXSRC) makeindex $< phyml-manual.pdf: intro pdflatex makeindex # phyml-manual.pdf: intro pdflatex @echo "" @echo "Done." intro: @echo "" @echo "" @echo ".: Building documentation :." @echo "" @echo "" dist_doc_DATA = $(docfiles) stephaneguindon-phyml-76a39c8/doc/fig/000077500000000000000000000000001501136442400177145ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/doc/fig/phyrexlog.pdf000066400000000000000000016114261501136442400224430ustar00rootroot00000000000000%PDF-1.5 %µí®û 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream xœ+ä T(ä2P0´0Ö34R016WвŠRÂò¸ ¹  €DêèYX($çré'(¤+èW˜*¸äs!Ý endstream endobj 4 0 obj 71 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /XObject << /x5 5 0 R >> >> endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 437.52 183.12 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 2 0 R >> endobj 5 0 obj << /Length 8 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 438 184 ] /Resources 7 0 R >> stream xœ+ä T(ä2P0´0Q016×35RÐ5´0Ö342T(JUWÈã*ä‚J(€Ôä@L= …ä\.ýD…ôbý K—|®@ Цy endstream endobj 8 0 obj 78 endobj 7 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /XObject << /x9 9 0 R >> >> endobj 9 0 obj << /Length 10 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 1823 /Height 763 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 >> stream xœì½tY–®[SÓ0 ÓýÖ›ûîÜ5óÞ{çN×4ŒÊeWWW•]¦2—™™ËÌ ²e™A’Id˶˜,´˜™™SÌ`1S¾vV:3"22Rʪÿ[ÿòŠˆ;âdü,+)¥¥¥%%%‰¤¨HRPX˜—/#^(I(U(a(mJ!J¤'#便¥‰ÌPMÏÈˆŠŽó ó|àæåçâéëâA¼òô¥T¡„¡´¡ä¡¢D¢t‚Å &6Œ­šŸŸ—äíøÒ70&.1¿°¨²ªª©©©¥¥¥^(I(U**+ó )y(…(‘((©`±€‰JiiiQ‘$1%Õ7 8 8\R\ÒÞÞÞÖÖÖÒÒÒÜÜüúõë&@©B CiCÉÓÚÚ*))ñ £¤¢Ô¢ƒ¿ &%%%EE’ð¨Xç—¾¹EíííÍÍÍúvéÀD€‰Ò)'¿R+,"†ÒŒ’Mßù€80stED¿ôö«©­eþ²¡¤ª®©¡£4Ãû«` ‘Hâ’œ_úÖÔÕáÏÿÁ(A©U][KiFÉF)§ï¬`¤”””äçç¿ôñË/,†³ FJ°ü"‰,Ùòó19xß‘HŠC£ü‚"X'YmllôñNL ÏÌÌ,–d•”¤¦I$yåå9åe)’¢ôbIQU•¤ª²¾±aìÍ:ðÞAiA‰§ïÜ@wJJJrssŸ;ºUTT±Za^1±«nÞZqÙhÁ‰“+/]ÚóèÑæ{¦Û<<úôéQkëýææßš™6»¿ääé™{÷™Ú;Œ±SÞGÊ+*(årrrðò*x‘H$Q±¯C¹|°Û..{,¬fž8uÂÊꎃÃMG3Wó—wÝÝO[Y5»ôžÉþ[·ÏZXœ·±ùÖÄt,=:ðžÒØØH)G‰§ÕÌ«·ì¢>ÝmO¢…Ñ»"HAa¡›‡ofv.—fåé¹ûþƒ«î/SŠKòkjÂ$’”ÊÊìªêH‰$8??"/?$;'¹X‘ícâþ’¥Š†üç« 6º•4jcÀé¶xOÈÈÊqõô¡ôž«SvÙ;…KìC iaô®„PZZšóÔÞµ¦¦–Ës ›{þâÓ°ðÌüìÔ$ÛÄxÛ´4ÿ’ÒÀ’R‰äibâ£ÈÈàôŒáá×=<yy³TsuB½|ùòììlÅê²eË222ø÷ª®®¡Ä£ô£$˜®o·µ .8ó$žFõº@#ÅÅÅQ1qî> œ¿Ežž¶ÁÔìˆåmÓÓfO_59{ñáeÏãŸDŽYÅDÛgd¦”–EåÞ ¶ b©BÅ&­+ 0Ù¿lê$ƒÉÓ×^‹Ì÷Û÷™Á¼[‰oüÝÚÄ[ó ¦ ¯à6WëòýîîYò%U`0uÉÞ»~uŠê‹‚î^ñ•¬rƒO¾œ»bYb ¿ËFÈòåË.\8wîÜ´´´èèèÙ³gÓêªU«ø÷ª¯¯§Ä£ô£$˜®Û^<ôÌÜy;äÏ›žŽêu€F$’bo¿ÀÈè,67w¥Å·—Ž\ºwâÞÃÏÌŽ_»yèèÕƒ§ïž:pýØù—ÎZÞ¼÷ü±·¿‡i€¿E(ÛÜ­ÊæjceÔµ…s˜¹øx99…ÕJܶ|b°Ü:»ž)übµÁ”]ž¥õæjceä•yóŽ<~ðòÑaZ^x-º’ùH^ùÌ=÷}ƒ}žŸžmðÉÎWåÚ8…@krsswìØ±téÒ9sæÌž={ùòå{÷î•H$ü{566RâQúQò¤èŸlñ—Í6ÞôôË=vƶ‰KÏy²åéGkÿaõ£?®ydd8f× í\^¦edó˜`aY‡Mn.;ºó¤ñÑû¦gÜloYZ^¼þðÜ©û_9xæÎáíG7ž8ºä™ñZ«Û‡‡°T¡d®6»ï˜bðIJí;ŸÛm˜ôñ:Û|Ùë³e¯öüuÒšy Ó4H\·M6X¤¨¡6éÞBƒ);_Ë*¹sŠÁ¼ñ5oª}±æê˜½mÛ¶¥K— tVÒ3²(ýø§]5Øüä”EÔ…§qç¬cN[D¯»ì÷Å>§}÷B>Œ8|?|Ç€ÿXf2f× ¥¥¥¹¹¹æÏì+**x°WII'­LÞ¼úʵ“/:=¿emuýÂç®9yýø©«‡o\Ùäk4Þïn˜ý¹û~ž,U(Ù¤ÕÑgL?UýnÇMŸLÚhŸßÐTuaÆÇKÍ3ë¸æ\•0˜qỪ#Ï~e0ëRLMSM´áLƒég#«ßæê‘——·sçΕrç/¸N;ä6õ ËÿZts,¯ˆ’’’ä”Tëεµœ¿fE¼ ;jcýɪoŒnŸ²xpþÉ©;&§ÏßáÑñ<˜‰§÷q[»Å†—ÌÜ\OܸtÔøø¾‹û¶žÝµâضm—4úÖÎÃÈÆùúýgçî…x±TñÎZ•Ÿ›m`0{ï={ŸÀ ?w;·ÄJùákâ¯Í5˜üÕƒ…÷ß”Ùë›n~ ‚b‹jßþ Õü£æÌZ-¸%¯¤Aâyà ƒIËÎ>ñ ñy~eý_a®Ž>ÙÙÙ'OžT̳ª²Ê%¥%a!ï´« þeîU3ï¼÷ã`®=RZZšŸŸÿø©]Aì²Ã)[»·ïØDG‡æú¤gÝ :ncµðЮy»W¯Ú³òыӮg ŸÚ'$f–±M¶©òjm®Ïí=K¦N2 >[pÐ1‡yq¶>÷ùÚ¶Â"³Ni¯wYç$‘ýèU]þ«;{!Ûòå’=÷ü ꇪˆ·9µ~îßè“Oç®Xú™Á”]~|3Êý’Ÿ_HIH©È3íª‚[pýžgÞžG ´0׬Ç'&[ï5ãÐ\ “#Ä;m—ÃS µµÕÏÏ/33Sߣ(㘫英7Wãââ„n–3zzáõë×únxo liVc§VwH~Æ›¹Z\\ìààÐÐÐ ÄYµ··wvvæ÷W+++ûúúÄ)nâVÀ|É„¹ €¾¹¹ºøœËzcáå…[ÍÍÍ7䌆¿ÊêØð31üʼnëëtèЩ©©£Ñ§5vóæÝýàÙÎ[]Q!úát`T}ÂêšÚÛV.»N^_¿ÿ¼@í>}ã¡­W]}ƒ( &\)))/^œ7oÞÇræÏŸO«´Qônhh(ç… ©Ç5²è„mÆjÓÄewã—Þ‘K¶°ôvÜó¤«N9µu|õèÅ\Õöf¨[{‚‚‚’““…8«×®]û\Ž……¿¿–˜˜È3Æuwwgddøùù¹¹¹¹»»RXøýX˜«@tÆ›¹ZVVæíím-‡hu´›Àf„æjPBþÖøüpWTšÐÆhÐóû­[·¦É¡ѽ8ªðÂ… Ÿ|òÉdP±sçΉކÏö¿ø`ñó–ÚË´ø9­Š[¿:Œu^NÓ˜¿AÊxeîîîü±èÁ¬©¨pš;7êƒRÔDôí¯2ç~ìØ± üM-Ð*mÅ'4~`·ÇÈú¢}Ò÷\º`—¸ó¼™…£¯(ç(.ººº3gÎÐÕ7þü«W¯Úɹrå ­ÒÆ'NÔÔÔˆ•ÃTOXXØÞC'Nœ»Ìª½‡ŽÇÇÇ 9Ü딦¶îæÎÞפŽ7jj'õäÕ´ŸóªøöQ¿:öæ*¥Ÿ±±±;!Öáú¥Î²··§…8«³gÏÞ°aÚ5k¾øâ þòÌË«\3¯ÑÅÌÌÌÄÄĬ¬¬””J*Ú‘kX·æ*&]~~~únˆÖ-¡òö€€Ñ[R[[›žž®ÛÔ»´WLLLNN΄iÆðð0e;¥ýÈ«b±má—̸TÍ#²ps•¾›Ë¡/uÏž=c–ù_ZÐÃÝ•©‘1ù­ƒún¡¹úõ…W?ßIúÑÖ°¸L‰½¸¬zZ÷ññ™1cÆäÉ“ÿö·¿Í›7oÓ¦MßÊ¡Z¥ô b#·æ¨†¹sçRå{@Ũ°èæêwÄýÈpøG—¤2Óª¸õ+C/..^³f ÐÅÅÅÕÕ•Ö®]KGã/ôÕNæ7n¤çëC‡‰LΪ~ýUzžÍÏϧS^¸p!E`ûöí»wïfòŠh•6ÒGT€ŠÄ'\óíésö©:ˆvñ|EÒãìÙ³3gÎôõõ¥@íØ±cÖ¬Y_Ê¡Z¥K’îÓ¦Më•rŠ|hX؉sFF·Ì2¾ýàêÝGÚš«‹oŵuõ¥T¦V¤T$ÉüÕ¾HIo`nWïÀPJÍ`Bu¿Ñ«Š³6©¬»ëÅ\533[±bÅj,_¾œ ëó   ´´4áÎêºu뺺ºøU"66–ºFehëîî¦ä|ó¿ÜLìßâì윓“ãáá10ÀòMõ{/åžèC°VŒ¥¹JÇ:pà€µµ5-S/¨œþ(™«ÊBGG‡……=PGûùù¥¦¦ Ü‘A,çpœ4CÊm®ö÷÷?}ú”.@m+„¹ ˆˆsµ¼ºÎÒÁÛÌÆMYž»3 wh®z{{›››×ÕÕ)o¬¯¯§ôï†{jÓž<0‘qßÒÖ#ª¤S—¿ÝÌUðþ ³¹š‘_6ïrà–þÄhˆD ¯d–kÜ‘Ç\ýú믿ùæ›eË–­\¹r½æq~ÕªUK—.]´hÑâÅ‹©Å\¥g=Æà¢gùM›6mÛ¶MáµÒÂöíÛi#}´k×.ÚB…E7!´+áÇFR…hUÜúPË333çˉˆˆ¸&‡˜-ôѨú«TyttôܹsçÌ™óðáÃÍ›7Ï›7OÄ# qV•ýU±Ž+œµk×Ro—CÅdA ´Êl§Tl$GYµûÔ©I¤ÓYöÙ-5Ýò+|x ®ºÎÙ;õ´ü£7\ŠË飆’+òUÚQ¬3…ׯ_'''ÿío£‡úcÇŽ]½z5))‰®ýâââÒÒRZ UcccJ`ÿO?ý” üåUæ †—¯ßRè¶Éëw®Ý{|ÝÄüÔEãø„!Zt3¶­«/­r0½j ­j0¥r0±¼?º¸/¸ »´¾³©½§£g ¾¥köÅHÖÝõ2çj{{{www¨Ö¡1îîîüÎ*ÝÛ·nݺwï^º"¨|WWW»êûæççS&¨ m©©©tg“ÊßÙ«¬¬´W#%%ÅÇLJöUa®ª0f檶äääóOÌ)*..ÌNŠI¬íר,¹ Þ´2W¾ŒÛpÝ{ÒA—_¯wøñïŸÌù;Ãο»*•ɰó'²~¼Þû7ë¦qÙpÝë¹_2k%üæêºuëRä,Z´ˆõÑ~ÕªUâš«›7ofæß;qâ-3®×–-[Ž;F_¾|IGÉ\ýñK¢Uqëg fGDD̘1ƒb›””´oß¾oäÐBBBmœ>}: •™h”ɧM›6oÞ<ŠóÖ­[·oß¾páBÇ8«õÎΔÏÙ_}EËLnvvVܾ­X%ª­¬¨°XÇEÀÑÑqîܹ۶mÛ¹sçÁƒÓÓÓŒŒCõÚµkô´»wïÞ]»vQ*F!ÒÙ'\¹ëä±§qÇž¥¹ÕÈþï°£¶>(¹<0¿µ•V†Ú½ÝdŸÊuÜ¡HöÇ E†òUÚQܳ!”—.]Z¶l…‚"Ckmm¥ü©”3{ölZmkkcþõóó»råÊhd/ÕùÔæÙc™¹zåÖýƒÇNgee 4W[;û²j³k³j‡2dþê@|Y¤¤7(·Ë7»Ã;³­µ³w®Q4ëîõ­lmm[ZZ¸œÕëׯϙ3‡qV8°{÷îåË—õÕWŸ}öÙ_å|òÉ'«W¯f5W«««ÝÜTÿßËË«¬¬¬¸¸˜îrÎÎÎêæ*íBí V¹ÌUƒ·„„„HåF}ù¤[+m¡æ­Y³¦  àèÑ£4X(~0‹ýé§ŸR®Òé,¨$ѽ{÷˜7fULËŠŠ *@ÃWåŒEùÅ_L™2…¶¯X±‚®f_Öú©’Ë—/Ïœ9“i¶ryexŽÅØ¡L;•OŸ«%\gÄ”§a}Ö¬Y´…–Yç_Uñ`é,?~¶Mi“™…cTM?c®š<²67“UûØÖ'¹†©€q‡psµ¾¾á7«­º;æïŽäxªòà MoÔó÷׆þþºT&Z0ê¦ôøéΨZgÍZ¹ºpáÂuëÖÅÊ™={6ëC==ĉbÍ1‡£ùõë×Óó=eÓ–sçÎ1“¬ž>}úõë×´144” P1qý@†ŸìIøðºT!Z·þ&ùiº»»þùçGމŒŒ\»víªU«gh•¯è#zF¦bâž ëNž<9}úôo¾ù†⌌Œ(¶{öì¡Glż•JÉÜZ\\éï#_¾ûÁ·oWgdø¼]uZµŠ<ÆÖ\¥Ó(5ìöíÛTŒ2‡.ŠS§NÑ2 ¢0ŽÚÌx*®f||<}”ššZUUE ¦VQwÓʦfï^½z¥âÒ*“‘‘QYYIá¢åúúzå “““©ÂÜÜ\Z.//WÍ``@Y]VVVZZJ½ùôéÓÞÞ^Æ\¥†½–CqfJúøøPUÔ*ê2Êæ ÔûT3ãÊÂ\DD£¹jþâåmsû¶ŽNf52!V•¥ñ£=-ÀPK²­‰‰u`aëÀ»çp_UØ“‡®1ù•µUEñîL¿*•ù Ã½ %EeUµµ•…ñ/›Ü÷,’ÿ¥Ü5}à_PVYQ*©è”÷×F=31yⓘ_VQ.ÉË«êbŠÝwŠÉ).+—d†Ù›Qµe°WÁ¸D«7W_ÆüòhúÏ:~~cèç7‡~Sª¦aÙGFí¿>’ê—È>+¹úÍ7ßlذa¦œùóçÿõ¯ýè]h˺u먘(æêâÅ‹÷îÝKO¾‹-b^Ýlmm½téÒ… ¯5::š>b^¦¢Â¢›«ÊøÙM©B´*nýÔàÇüñÇׯ_wuu]¶lÙúõëéA{Ÿzê§UÚèââB³ôÜJ…Å:Gª‡ýèYžúqÅŠÔz„¤cÑÑ÷ïß/J*Hùàƒì¯¾ìì¼+÷Q75Ïß¿£¸¸ÀÊÊæ­¹š¶g³ ±Âål¤§§kÛ6:ÍÍ›7oß¾NçN•ÐêÒ¥KwìØA—,Y²iÓ&Šõ`f¢Ð92˶Ý÷(üR¬l,.ŠÞÿ(l£'Y¹CRikéó7[öÛä–P¡ºÜÓòUÚQ·#6‰+iÓ¦Ñ==éÏž=»¨¨ˆÆ}Zè’ãååõúõë“'O~.çÎ;tÙê|,®XY[Ÿ8wùŠlæUÓ£§/xyy ÷o܈}ÝÙ—_7LÊ«έΪ–½¿*óWËú£Šeó¯¾îìŸc$È\I„…›«_~ùåªU«(9·ðB¨ØôéÓÅ5Wé[ÝöìÙsºo,X°@¸¹J[”ÝTæ×¬è»¢¯¯/-0ãn©‹B¦ |úé§fffÌ*}e<Ɇ††I“&yzzJå¶ÛgŸ}F7XåzúúúhX166–r›«\•«¼ØI÷XÚ®2çrýBÊ 9–Æi5ó›«Šòýýý4¤Ò}y=’µZºâ&Ožlii©øˆ²…éþðôéSæ%aeW³§§‡öb^VÐÙÙiaa‘——ÇTemmMËÊÎaww·ò^T!å e S¡••UBB‚¢*eWsœ4CQ^ÙÝ¥Kƒ±IÕ§P)I}G¡bLÞe«yéBñ¶'Ãðð0¥õ>-0(s”Cõ½èt^¼xAe˜Ê®æ8i†Ë”ºƒùÍ_æjqq1•¤¯ÌGôl-…¹ ˆŠFsõá3×kž5·¶ñãA ¹*•OOÄÌDã>}ª˜>èÙ³gôìÔáþ¶ªœ8s“N±•=ÃÒÚPKUr:é“–Â(O;ëGf&¦÷=01y ÷FÕÌÕÚ0Ë·Îëw¼[l¸+×ÑÄÔ½ø]Ï€ñ¶?hEÚ³°‚_](ýÕÁ_Ý“ªêÎÀo/–8Eñxüæ*=DÓ·}z&¥Ç.ÖiV¯^-–¹zéÒ%z¦Çù={ö¬_¿~ÆŒ/_¾dŽâíí=sæLzœ§¨£Â¢ø®‘y¿9ó‹óÿ`Üü«Û}ïDïvß?¿þÅùòߌôK,ù±0s 0rËÌ(KÐóç·"ÎxÀüÉ¡™™ÙôéÓ׬YüôK„ǧf6EBtsµIþs6ÉVVý®ò?ÿ¿ûÁÌ‹¬–ò=÷ì¡U³>ðf®VVVîß¿ŸÌ$ ý«[Û˜4Û¶mÛŽ;üüühˆ9tè­®•C5>|øþýû>>>T€¶$͘iNúÔwI¥½åyç­¢"êRÒ GȦè’ä=Ëh*,-½ù$êˆ}Q%M5¹§Å˜@¬X) PòŸ>}z®º§M›öâÅ‹ÆÆÆcÇŽ1ÿë±iÓ&fZ€a¿3%ðÐæ–ÇÎ^º|ÓìÒ “£§Î{ké¬sŒbÛ{skß8«2sµfˆyy5¥b0©| ¡| ½g`Æ…ÖÝÕï:Gø}ùA+ª°³³óæÍ›tv¤‹‚n¼ÁÁÁ}ïBG×ê­ìííÓÓÓ‡†Þü|)ó_fŒãêââNÿêüƒVÊ¥®ð$i™®ôO>ù„¶œ8q‚™ °°>522¢ò™™™4º1æ'“Û‚©DaErU®bQÒ1–&Wý\å•ÏKȱ4š«Šš¹ÎHÝ\½pá]ÚŠÉiÕ«å7W[ZZèËUU³ªlÖÕÕ©»š„D"¡†utt$%%9::R¿t5U*Tv5ÇI3¨X¦tÉ4W™×W¨£™˜d†¹ ˆˆFs5 <ÎØô‰›oˆÊöþ¡?è$Ü\%JKK½½½­åÐBNN3»UÆp]‚‰É“¨†ÁšP “G>yõ¯¿£¹­oh°1ö™‰éóଲچ†Ú‚`knsUVƒ¥sµ;ßÉÄÄ æ*—hk®6Éý‡V™¿¾ÙùS©Š~}£}÷³L~/‚Ç\]²d =Š~-gÑ¢EŸ}öÙß…¶lذŠÜš£F&&&®^½zß¾}ô8¿wïÞ7Ξ=ûÞ½{¦¦¦´@¢ô bô$ŠC•x&ÿþ|î¯ow«pø×·ºþé\N`j©è/ã-^¼˜ùëZ:MÆ$¡f‹ˆ3Ð3æž={>ÿüsª“ºrýúõôÔ_TTD1d^<;pà€¸Gl’›«Õ{öØ|ðASFF†ü—­*ï¾5WƒåS³¦žs5==ÚLg±mÛ¶ÊÊJÝÚFýÉøÌW®\¡jzzU¸X´@«mmm.\ £P1*<ò´zY+s“š+jB ä¿1I wxº%YÓ 4T‘_TÜCÛÒ2N‰ôƒV¢ÄJ寭[·V¬XÑÒÒ²ÿþ¬¬, ”§§'m?qâĬY³èX›6mºyó&…ÎÅÅE¬ÿø9«æÇÏ^º|ÃÔè¦ÙYÃk¾¾¾:tǬK1um½9Õ²Ùä$eT ¦V &W &” Ä—ôôM=Áº;ëR·«´ JKKc5Wþ*õûŽ;>L÷ÞeË–¹»»³º©*ÄÆÆÆÇÇ« m”3NNN”mJSŒæç绺º2檗—Õ?ÀöM•õ{ïÌ™3MLL«Œ ©øšªl®ÒéheeEÿ2ï4Ò¹Ó§Mòß\¹r¥Âü¤‘îÈ‘#Ì_Ç+¬H®Ê¹,Mžú5š«BŽE7+•Ó窙ëŒTÊSïÌ›7†ÓPÑÀ±G>» ÁüPógìÒw­Bº©ZXX¨ü=>Sí’ššJ‰Aºô­sHù#åý{|ÆÆT¼Ü«ìjŽ“f(à2WéÔÅÊ—‰Væ*Ó6Œæj{G筇Ϯܳrñªo”Ù›5uΞfÖÅeB¡•¹ªŽìU:müUùß雺—ô w溘š<®WùnÝSèbbâ˜Û%ÿÊ7ÔšjËi®w湚š<ãæ*Ïè`®snDýæfÛ?Þ—ªè7×_/¹Å¿/¹ºtéÒ­[·¦ÈY¸p!ë{S6l b¢x)Ì «;wîµùàWùk«Œ\åï¾ý´håJá5{{{púÐ&yš={–N|ñâÅW¯^­««cþ¼ù ÷ššš‹/2“¯R±‘¤ÙªÝ§N=O$¶ÏrÌnyóóŒÃÍ}4Bõ5ÖXzFÖõÉG«š’2S‡D¦<í8’d%V ™ÌÌÌ3fØØØÐxíÚµúúzeguóæÍ·nÝbœÕÉ“'gddŒü’¡¢¢¢;séú=£›f—o˜ž5¼vÞÐøÌ9ÃÓç.ž:{áØ‰Ó©©©B4ãBtMkÏrŸÞ>=Ë|{–úô.õê]âÝCZìÕ³H®®¾Áχ³îÎu‡Ô!ÂZý Õg‚Ñí­ÒÒÒèæÀã‘*û«tû¥»ñ×_íææ¦Ñ_uww¯¬¬TÝèdoo¯ì øùùùúúR_{xxÐÕÇ:,²~ï¥`Ú´i!!!ÁÁÁ”rCCCÇŽ›4ic‘1?½ÄøQ ´úÕW_utÈþ#//V)nÔ}”ÛóçÏgÌO‚îôÑ“'Oâãã+’«r.K“«~®òÔ3gÎ444r,*£rú<¶-ë1åwïÞMÃÃÃi¶33z)7†õ­^¼xA{1?hżÈʸaaaŠÞQ± ###™~¢Ä 4P<P=–––ô5Xúöú‰––)÷/IQK-,,(1ª««™båååã¤]]]ôEŽ¢ªÞ…¹JûÒ „î¨%%%Ô†š«*mÀHÐh®%U×î?¹|×BY7<-¯ªrˆš«RMþj]ü«€˜´\IiYYq^J™‰©czët¸§"ØÚÄÄÒ36»¸¼¢¬(;5Kö<:XõÄÄÔ64«¬¦®¾¶(ì §¹*î­¡¬½ãsd5æ4öÃ\ﺙ«ÿ~:ô·w;÷Pú»‡Ã¿{ -<”þöN»Á¹0þ}ùÍÕM›6Ñ#•™7oëSëÖ­Ë ¤{=³=zTá¯2sýŠUúˆ P1q Oª- µô¿æüΤë÷†I¿3éügÃìˆÌ ÑÕ¦wÍU&zê[D9P«Æ<¤g1z~¤ú£££gÍšµaÃzĦÅÈȈ¥E4WkkU£ŠV®¤ÂZU^PP0ÂæQ(èI–riÇŽ‹åܸqÃÉÉÉÑÑñêÕ« .\´hÑúõë)ë¨ØHzÍ·§ÏÙ§²)íZPEXjáUÖOSiÇž#ÃÈc¥€’çÚµksçÎ}ùò%3Wguu5síoÞ¼ùöíÛmmmaaaS§N566¦Â#?"E>4,LöÚêMSF—n˜\¼vW¡Ã'ÏÇÇ š`Ú™ˆÊ×=û#‡lò¥Oò¤–¹ÒÇyÒ‡¹Ò¹Òû9R³léöÐΞO¾ fÝëÙ¤}„…›«_}õÝ{w €yÃ_‡ë·¦¦ÆÞÞ¾™cÚUe•ú—D—Ì–-[¨aüæjee%ó·Õ¬\QQ‘³³snn.s·÷÷÷ONNöðð`õcX¿÷–••­ZµÊÀÀ`Ê”)/^¼Ê_¼xñâçŸN׬YCÿ2ÓT2Ç¥UÅ«žÃÃÃÔHºïÈ¡“²¶¶f>êéé¹råÊäÉ“i;ý»víÚ’’®Ê¹,M®úyÌÕ3f0~¦Àc©œ>¹ÊzFƒƒƒ—/_¦†1-d†f_寍T;00ðèÑ£/¿ü’vY¾|¹Â ¤Þ¤/üÊÞ¸ŠUHù””dccCÅ(tá0Û;::,,,\]] S^^N #‘özúô)íEiSQQ¡¨ŸF7œ'OžÐGnnnŒ«9NšÑÕÕEûò›«Rù ...´JãrFF†@sU¥m BÌU¢µ­Ã?,æÁSGc«®>a1Im1rsUªä¯*Ï)$g¸¯.3ÄÝÖò>3©êçNÉ•]o¾Ð ¶ÇzÛš›Ê>15· Èk’íQŸîooaÊìpßü©{b£ìmusU¶±½8ÖëÅcyá6¾¹mC0WÁûƒæjUMý¯Æü_~ÿ ÿw·šþåzéÿ¸Zú»Û¯O[î÷ýîhd}}Ïî<æêºuëïŽÒ#Þœ9sþö.´eÓ¦Mô°&–5ÇØŒ·nÝ¢j™ßªfüFz®§UæOuþ3X~è–’^ö?.eÿÞ¤ô/—3£²FÅYm’Ÿ&=™“C Ì©lãÒé¬_¿>>>~ñâÅË–-+,,¤ç;zÏËË÷ˆBüU* ­³*t²»wïÞ¿ÿ®]»V®\¹`Á‚Ùr.\HÁ§|f~!h„1ÙtðâûCçL­tæYÌîÓ7Å:S±`^ë=pàÀüùóÛÚÚlmm_¼xQ__¿oß>æU;;»iÓ¦Ñ*ãä‹rÄа°cg /Ý0aÕÑÓãâã…ë‹cá¥]»Â†v† nØ:HÚ2¸5d`sðÀ&Zìšômëî<檶7W>|H—êÐ]š ë<3@rr2ÿk¨ uûöít~üø1¿¹¦øýtVº»»322üüüœœœœ),*S}ª ð{¯2‰De‚PÕÊõx,¡§/üŠ?ÆíBw…É©Œ§J·£qÒŒ‘T€±D‡/™Ú"й*•ÓHOO¥F0!ÑÁ\J—üúxÂïo¿þ.åžrL+¯m,©nOÝÌÕ&ù•k|À§"Nª ¹¹YñcCÌÏ Ñª(nÌã £ç¬6ÉÏN9†Œ¹ª²e”M§æááqúôé¶¶¶Q:„.UÎ*QVV¶aÆ[·n¥¦¦2yÕÙÙÙ%‡ÚÛÛÅêúêšÚÛV.Û¯ß^ v¿úÐÖ«Ž÷UsýBùãíí=sæÌÍ›7;88P¢º»»çææŽê|Œ„'¾y›¯Å}q tÒî 7Úôñ® ƒ]2í üëÞàõW¢Ÿ½ÊcÝ]/æê˜&‡ß\e`®ž”~~~úú/õ¡¡¡+W®|ñÅ“&MÚ·oŸÊO ÛÊõx,Qhll477¯««¾Ëàà ““íEƒÝrµ=âððpdd$ówú¯^½¢Ü'ÍжLl`® /t0W?PÝxd¦ÙÔèŠh€÷‚úúúªªªñéƒÍÍÍcæÕO<(z7nܦ2þ<Ýahyôþ;@ïLlsµ®®îåË—iiiBüU~bccýýý¹f[àûÌUô…n?h`œ3ÍU¢¢¢ÂÙÙ¹°°p$ÎjVV–»»{oo¯¾‡PÆ¥¥¥nnn¬ßÀ™¹¹ôÝ@&,""¢ªªJßíL|JJJôÝ¡ÔÖÖ¦§§‡„„xzz:99½C ^^^aaa™™™õõõún#àûByy¹¾›ïÕÕÕún¼ÔÖÖê» ŒÏh5š»úc$Mî©Uމ•ö $Šœ’*_¦U'”¾îì@BBAAAAã\:ØYeM®)UÙÕ­mÝýýƒƒƒCC$Šú[»úÒ*ZÜRªêZ{´JȱËlófYäMœ÷Õ#‚ ‚ ‚ ‚ ]Íxœ7Û2o•}¾mJµ@;«¹«ŸJ6uôê݈ƒ&°ª[º)ͺû&ä)ÿ’Yy] ûž.<AAAAA£«Á…‡ü ×9åϲȻQ.ÄΊ*l,¬o×»ùMx¥U´$—5k4W)!'TRxU ÷ ‚ ‚ ‚ ‚ újwÁ,‹<ç´v–SReOÿ€Þ7hÂëug¯WzFs•rÉ‹¼­îù'C ‚ ‚ ‚ ‚ H/Z甿Æ1_£eŸP¡wÛ ú>¨pÐ1±R£¹J 9ãqÞ± ý_AAAAAÐ÷Vû_|m•§Ñ΂¹ ™(Ù„˜«_=ÊÓûåAAAA}Ÿu"¸`úã£"áæêñà‚ãòv‘Ì{½Iï¾å{¡Çq 0¡c¢w4«ëO"õîB:hŠuüÞ¤Eoªëïv®OµªGx%:Ô?ž¥Õ¹ ,)V<Å:ÁqÕæ1È´qNœÿz^‰Æ8©p,#ÉßàʈgQÎZc :ô¦XAåEȸjÆÈ/ZÖ¦íF/žb]_<ûª/ŒäX£×àQêqoc©j«ÚÞÇÆ²˜Î}4ñ±NáC¡V—†(_¢‡H¸¹z,¨€ÌU­DáR„îÌÕ÷\²wÈ•zó˜ü®~L˜Žs/¨/«W«^ø¸€ªtò€¥±NÖpW!U©Ÿ»ÀhkÕ`§ C©wOŸòQã¹ç](Öîàj§Æ(éÖGBâ/¤®€óç¤ÆøëÕã!Õªý:ã¹0s¬ªï¨1{YOŠëN¢Õ=“'ßÔÇuúÚ^õ£Ñ:ì%ð^Ç¿/×¹  Æªth›”r,!é¤ñ>fª1È<%«uϽKcôÞW5Ž)Z ÇBÒLH›…÷»ë‡!ç®±s…KÈ)³^­üç.°f>UoO¸,db΄7˜ë¶#°ãt¾(FXãµ#äXÂ/áMeÍ4ýÅÚ*Ö„QFc…ÜŸf—7Xáý¢Ã%,üúâ)©ñ&,ä2äOiƒ«FÃ\ÝQ=‘fq\â+ÙR.¢¹:Áâ#nˆt5W7ójˈ ¨Öª¼ÆãŠU› Á\HR7W!‚ ‚ ‚ K†¹:Áfqd&6Ñ\`ñ7Dº™«f‘›!‚¹:‘s‚ ‚ ‚ ‚ô«Ñ0W'˜]ÃLl(¢¹:Áâ#nˆ„›«Gƒòe ̇¹ª­¹ªý;ñ²ñ{%ê¾7½ù¶C¿[T[P,ò~ª²QE*ûr.ðÝ&©µMx*ç%Då:å‘´YÈéŒAV$\£ÑTÒ•'tGÔòSï¡Óá›ö^îñt“«#F¯åziªX‡Ða”Ñ­°Æ‹—«U£7ÄðZÜ ‹{\­öÕû˜¢m{D¿‹{C8±q×Áx?ÌU³¸kMC9¡1yõ`®¾½A¹Ï5Ø ”Ì\ øîösõ½–Ì\UêM‚ ‚ ‚ ‚ÆXz6WM£ÏÔ ·å¦ˆç6L(sUŸï:¢·³Í;2eŠ)wy˜«ÌÕï“`®BAAA~sU ƒ¡?su¸-/m²YØŸƬol—ö¿tà,ÿ}2Wä3zk®n`-ŠR†§€úUÊsí²áÝ2x"¤Ío*¡p’_ûLô`®¾×¢îS\Úê°Ò¿ê)Ä¿û!MÅF®ÃÚ¬jÜ.¼€úiê\Õaõ¨Ÿ—VQå*?ò®ái‰ˆý~øÝe½¬²‹Xíí”Ö*Œ‡Õ‚£smc|RBÇsj‡u­Gà§:Gc”Ú3Jç®±¼^²ˆQ?ýQº¹ ‰€VñI“FØÚŽÈ:Ü3y¾-Œ$8Ê-kàñÜy+J ¯jô®SÖñW”qT¯n}Bî$ãê‹„¸‰¡^r4Â.ðJëZæ©_ã•®íms„í¸ªU¨µ:úH¾j‘Õ»C”!Føiò·|”*g­j|š«´Îx\ÚÕ!;ø@YYÙ·O‹/bYLCNûà mìËÎ-XòèMù??Ͷ­é÷t¶:F”æM0sUŸ‡i¯ú¤qÿiúÑãd£Ü¶zY,†›êjÎÛEüÁDÕ\Ë0޽¹z àäæês¯Jãñz¼ì£t­ü‰Âu0 Eo„æêŸž—Pˆêó§©½Pý‰GSŸTÚœÂdïg~­T°·8ýÕ¸Ô´P­éÉÿ%ÞUB¢-$PBú‹ÿÔøËéháa×*W5^)ü ¦•x®eþLV9ýƒlÁQ.¦sóx"ÀÓ/{VHz¨Ÿ&O$yNö €z²CžÎØ[Å_ùHº›ÿn£ñ¶É•Ì:7FÛª´:WŽilŒV…ù{Sc›GL Ìzjê­ÕØþ<á¥ÁÕ_<§Æ_†ç&ÀîBÎN‡ò¬5è|ù¨ŸO·òt ×m“5J:·'êŸj µÀ¾à ¸Ænå©ç Ûá´J3žÎpþ»kUê«:g¦bÇQ2Wÿý^ˆ ™D®nËMù‹òF³ø{Ãm%ùß< ýã„ ÅýƒM% Íè£ðE¹[ŸEþÑ$ô/6YNmÃÕ)‰–—7mn*È™ó ô“oW J¥]wž… mƒ‰n®êŸ°/½ªë¤ýî®áÿn{±r°½\²Ö"ì?Ì¢7Å·uvVo|BÛ‡rBbþ0æa|_ÍÕhÃÄ¦ìŠæ·j•¶TÚR×òÝÆÒšÇ6‘ú7EE4W•ocf®~êU_ÙÝ'ÉJýX@µ0Wj$æ*AAAA#×(™«?<í)Hg¶T7§FÿRiãß›–µ¿íͬþôVVæP÷íûÞïîëõ?^¶ôÔgÿïsž?“•oÝÓ‹ùèçKª‡;NßñÚÝ\Õ&>ÔÃ=ýƒ½C´Ðçíþ«3žÞË/j?ö6D?¼eÝÞçhåûóA‡ê†R<2æa|_ÍUŘUË^¯|å0^UU7W÷ùç)4fæªV‚¹*P0W!¨ýbIiO¹¤½ºJ¾»h¡ ½÷)AÐ8†-F 14A5Jæê§=éLÀf¹¹ús¥¿°ªjh˜éíÃ8ßþ·'¾œñù7‡"¯êî¦Þþ–îþÖ©´¹ðçeå[zkg¾)ÿÃkéI§îx mƒ‰n®jŸ¶ìÄÿy5àÿ5‹?'éï©ÊûÓyˆ¤Òžžþæî7êê÷³õûàlÐA¹¹ú£1ãØ›«ûýßȵx®IÄqôÖ\µúnãÃŒø>©´­â¼eŠyêëê^ù«­9éÛMcŒã šzÚû‡åÍîhi‰Í:t_µÚöù¾ÅÍòB}=EE•6nñ[ŸÚæyK¾û´0¯ä†u¤bß­O²\òÛú˜Oûêê›#bsN<Á9R¸6ze)4fæêÇ®uíRimJÒ_ÞŸáYì]ÓÝ.‹ÞpgWwvY©o¼IØÌðµ>ï±²;CÅý˜­QµÉ­òýÊ«j®¹EÿQ¥a¦‘+‚+c˜ Jkëk¥Ò~w—7óìVß)•V%%}nŸkSÖÕ&+Öçæñ‘yªYaka{׳kyuÝ=ÏØ?+Uþfßääy¯šÞY±¾¬ÜÂÕÃÞ´­Mþús_wtRÆ43å†qòˆÌUÅ…AÐxÖ(<-¾+?åîñËÝ雳ÓGmñÉÞ¤4ˆˆ¢õ™k^f¬ÖU<ÅlÌ6Ÿl!qØý*‡¢Êv¹FîôB þ†˜¼½~¹tKeˆ¡;ðfo‘‡#Özdê<Ĭóȱ1›½²v …oηb è}Óh™«g½é\ Ì\M‹ù¹ÒÆï•µ½ëìþøvvÆP÷­‡>?¹“6Ømnò‹ó´Ýû¿¹·ô5þñ¢×‡ŠJš7^÷fÊÿY¡d¨ãÔ=¡m ñÍUâóÃkIn=Cñ¾!¿ slÝuÓ[µüù`™¹êô£1ãØ›«Šqá¹¾þ;1F¢òåÔË(ÌÕÈïêy˜.3W»«z¾kB{^ƳxÛF©t¨¯¼²1.¯.¾¸¥Jî»¶æf}kª¨0r¿Om£Ü¦«©lˆÎ­O¯“¿‚ÜZvJîÁîñ¨®‘°35»Ò'¹2¢´SVGw½‰¥Ì_Ýü$/E¶>XUV’^QÔZ×O«].Ï#ØNJãùÊ·P¸æ;¦(¤'s5ì«€FZ•öwFçUÙeÖVuwÑjsñ¼ûaSœ žv K¥MuÏS*ž’’%Û­Âd՚Ş–Èb0ÜÞ”[ã!i­“û˜þ1ÿù³µ+KÞWC½Yåám%ÝL¯©š«ý--ßõi¿—[Ä>-, xwv$×{æÕ‡Tv¶Ëë÷ðŒRüH³¯´Gî©÷vçÖuTÊZ$í­­öl”unO{GV=cØJs£ãÿôfGžS‘¹:êŽ A´×?ïÛWrSMÌÓâf/N­÷È\û2ƒGËÝÒ—º¥ñhSê§VÍ]ŽZÚ„‚+挻°ôÔr÷tõþ¥‡wzüWOŒí¾Ù*¹´ëUÎ^?‘_£‚ è½Ð¿\º¨1;|s¶ð1=³ø‡˜UîüCÌ7.œCŒø£ŒÞGq3Êð1 RÕ{j™[ú*¶.¦¯›Ôc«7 1ª£Ì·~¹{õêôžj”ÌÕœó¤ó[*‡[2âgèû÷oõÃðóõïó2ÿ|ÅçÇFáÛsú þdèý¡YaÑ`Ûá{¾´ãŒcŒë¥Òæ"ÚþÃð‹õƒÙáÑ¿:ïýƒ ‹Ó{¥ÒŽÓ&TÌ÷ß\ oùÅü–¶s. ’èæªVñiN‹ùÅ›-¾ÿØ6ØU5çzèÞ²¦ÂÜ©·^ýèœÏ‡Æ!µOú£~ˆlZ¯àŸ“…E¤0Žiˆ„›«kéQT.™¹Êe-j«hS¹¹êûÆ\•‹1W¥Òžº÷„fJÆ©m®ïVÃ7nª¨ê#‹¤ã¡i_˜Ê–ÿâÌL ôçwú…ÿkê‹öâÜ™fo6þÉ&/¢OæÃ¶xSÕ'îµ­¶Æ² æo+7‰Ü–×/•ö»9‡3[þË­®Snygfåo²‰øèí!þÏýèù6‘)t’s…ì'Ïjr¿4 ygß¡N·àÄIòÿñ(Í©“1Ýn¸D1»ÿÅ®D"K†ÒEfo¦’æ?e§ƒÞ÷æï• b×^ze{ÝꓽÅûуƺ·#‹Bk<2VºË¼M}㜶È9UY ¹µ€äħùš4Ï)…_Ê7vhœhž#{g±v1{npd”râ-sý.-W¸¥¯¦çè·ÙKOÓ›½³˜ô¦‡èoó÷«\¹C Aú–ÍðÜî«:Ä6xf®SbdoTª1K\T‡ £ ï#`”Ñ0ÄÌÓ÷íbÇ£Å(ÕQЬ[ì’¦œ™ôhÍÛìeÞéU¤÷6Ÿïò†è{©Q2W|ÑG ƒ¶ªþX{Ÿ¥•ßÏî$]/bÞ(–/»ûJ^8pvdciWOamKBi•QL[_KÑ_.Ëêù…IêÊîêæöÔê×ö‘%¹ƒgÌhÿYÒÚ¬ÿï’÷² ‰n®jŸáæôØ_½Ýò“k /º†sBÂq-zoÊë2¹ë××Ó˜ÿ·«>?¾z¸~(Õ'äïä…E 㘆H¸¹ªäæê:n‰c®¶Wž{À·ï¦‡Ñ{­L hw?‡7/¾ •E¿>1i3Û;¥û[‡¥±> û¬b¿Ó³œ4ª£¡èY䥬~©t(Ë/–ûÅT1ÌÕ‘LGüáÜ<ÞÎjLŠbfTþËÊ©´"*üg´z!ʲ“²²aÍU/Öji^Þ$•VÇFü\yûÙÀ²)ˆ•f–ÉûÿÈ¢çðÙ4ÅþëJ†¥Òî»}”ÊøLŽí¡ å©ù›ÿ`UEûTD¿[¿êŒÇÞ¿¼ìÿßï$:Ó®­’I<•÷- ûÙw…}§¥SWõY›+ô|ØÕf꾆—䫚NYçé •¾Òdï|%Ó®W²W›ô>¸@е—yEçÕ›ÄVöBéËü:zD•‹¾Þ¯pOWh‰k=¨è6±>·r=“Â̄ƭ”-\õ'hå WÎÅÕ±Ä%Mù Zó2CqqmPzjÞ¼àôv”Áƒ34´[þ}‰Éje/t³÷wCÌ:ÌUîŠ d™[ºúÃ:Ê,rQb¸FvoSß7bôî“2_Í›UÊp–!†DWâ Zé.ûK Åõ¥øï?•™ÝxÞO’¹ú³Ë¯&’D7Wõ~Fã6DÂÍÕ9)Œ\‹çÌ3\p-hѵ o”u=ø›!Kn„,UÑíзCW*ëN誻ÿ?{çÞ6µ6`…Âe•^Ö… Ükv)Mé…²)«ƒú—RVZ tѽ÷éÞ+éÌjV³w;ÃIœ8Ã#Ó‰íx¯$¿d'Žã8©g¾Èþ>Þ‡'–tŽ?IÖ[é(æ»í‰;…F¹z:þûí±-ø³RÈ1Wy wŶM4òÃÞŒÝ)U¹"¦]~Úȳ¦â ë‹››u±ç¬ šæ®)ÐwºŽ ¼»b'_ª6Ž>ªãrç¢ØkO§üº£c=B4—¹éØw˜äªõïÅÖ³î;V­1ÊUÓˆÊ÷´ÊÕ;ÉÁ„C‡1ÿ0 ŸMÌŸt&ià†Û,ÊÞÝ*WﲬsyÒ¢FEÙ›ËÚ}±°¨¹¹eèæå‰GUÍÍjÁûË-— ~Í(Wì6ìl¤wZ¯Ñµûwf.eÔf›ÆM5‡¬ìõÖ/µU6è‰Ä·êÏ i«jqÔ,rÌ‚ºq«Lã'ßd•úÿÈÛ猴ÿ%óE Ëĸ@ò—Ì7—IŒw4eÿp5‡`ÂÕœ¯åL$Õoj"~Ò°Í¿mþ0>Š vÒòÄ¢ä ¢­}ÌÄOäèg9?X`ÓÌÔE¿ºÈ2wݱí®aÛºúy¦åõ)ñ;äÙ6,o‚؃åÔîÂÙx±lÆrØv–ùÒøª‰ñ—³Í»öÄ…ó5ó)Æ8˜mûãƒiÜZðB!Zuh+ÆAW&¶?ËL¸–cy–1 ¶ÙÒE/e³8ËXÙQ‹S ³Ý?®µ<ËÀï°B-Œ’¶eÕþ,3Úâ3¦³ ™‹V29æ ™Ÿ,/d‚ñBq•?\¾ñ\í³&Ì›p»\_£ÛDöËÕá™&KF®¼>¬S‡Ûd• F¬º±šG|:ðPäˆ5£ÖF|J°93^ÛÜ,-›±9êóõF6D}¾)úë½¹qFõ©‹²ÊÏÆpö_/¸À7XÈÕÄí¤ªU_=oËs&n%WU—“·åj®›.¤=j‚ÈJŽÂbÝuФÆ$W+Ñ\æ¦#p``[ܱ½€”«Ùÿ^j=ë¾ãF¹š™h1øžCF¹šw§ñã-«bI¯¯lj[5yµpêÞ°[sï>È'åjJü]–u®N‹h4¾my»/"‡ &Z½(õ>âãªÔPbH¸¯´[&äµ£\=bšrÏ‘ RÆÅÞÙ.ç Çä­ËÍW¸3¶`æ5Ö„K…QÄæ——½¾âZçeƒý┤\=j1räŸäxºõãÖ´Léz•ÚrkÚdD@fÛ¿>›Fp2=¤lzêçBÖ˜V>$¯—-ù"iõœÚ×—ÈgNÇ_Î1cú‘3¡=?‘ã8Yc-Ð&¦KlÄíLé¤Á'-7 tÜL&L¿,1]¢ZnúŽO2/Z­{Ñ‹>6Æx'Ïgí±¼ ô“³Œ7ëÒ‚ôˆöË{œÈ‘-N1ç-N1lœbÆuxú›KíN1Æi­™Øá¨õ[p^g‡;òúhì­tÖàäsñŸbLo,²Ú¦¦çå-6}6ñ“ê{t<Žh»³ŒÕ)æÓöwâ)A¨E×2û¾õÁ`œ ™l{.d~¶q!“7¹óS ^Èx§/d:žbœ»ù¼Ã…Ìh« òàÚN1’«¬÷&Ü.WÁרÇ6‘ýruØ™L%#W„}ì¢Våêùýᯠjb}z¬¶¹YRúûZ g»*bj*ùÒ$~RÚ«¯h!jF¦¦¹Yt4ê“Õ៬½±¬ˆ¼s5âdôhãm´Ÿ›Ø5vSô¸M±+9†æf}ܹ¸¯·Þ0ñͶ˜ñ6ŒhÜä£Y›ÂŠ.åŠïÆÒ']JüÁu¹jj=F¶Eï-rõ‰eÖ³î?a”«Œ–ƒï=,4ÊÕø»,[~ý™ýißsösU¤tT ‡¯!§ßsÈ$Wþa¹ðªd㫼·W¶û"ÓÂbV2ùE«RÎ’£—¿Õn™ÐÁ&¹z(Ô4åÞ£FA×.™ñ[¤¤ò\èúmæ‰+üå¤\}£µB[eCÆåêѰ¶Ú–EM­"åê—kÛ·L'«ìÄæ3mGËmjÆæDËY±¹°%¦_8–­™Dµº–1Ñôy‡Ç‚Ƶž¹¬0ýÚ!ÿaÚøÿŽÓ¿ë0¦%ö¼ËÕÎWœ[-f«°3\múO¾±ã˜lm®írvM÷•­Ön…|ØæãŸŸg´ñãÁ´Å϶=±xÓ>vÓå v~…£{‡§S²\Æjï³ÚíOÒKºRнÍëzmõ«ÍasâM7SljNo\·¬µÍ•r¨‘;[£®—wôC,óI€­SLû³Œñ‚Úú¨eRµ6Ï2¦Ñhmž\ÌÏñ—or–™pÕ#§Ó;e:ãg—Ï2O1?^Í5]cZžbº8Ë|sÙv»éâC^¢šŒºùÿ–·‰ZŸbZ-¨ùd³õÜ‘Á¡È{‡§SêìxeçáË•¦veÅ»ç[5tІ¨±£¾Zohn®ËL¿9úK[n|µ5æ›ö|»-ö».äªåÀ€mñ]……ä*æüg…õ¬¾§jH¹š•d1¸ÏQ£\MN¸ÇöðÂß–4M¿ã@ññ¾C¼šææZFÒ}í–‰žBÞW*_´+Ä¢lhÿhòÞÞÔ«QäPÃ+cÔ’­úÇ6ËeÂÞH#åê±#a¦)}Ž“‚´9´µì¨™‡s&¬¶5;ƒuUs%~”¹æ•‘?Ÿ-ONûlEÄÌþ¡ÓqŸµÜ+{}øªˆŸ®“·V–Dĺ:ükÂG®%M¬%Ÿ®øl‘£×G‘ƒÐv”«®ŒµÛg‡CÊÕÜgW[Ïzä )Wë˜)?>|¢‚È]’Ø—ø¸!e#£ðÿv‡ßm^~Mì_¤8•ÍÝF|¼ß¿¼!¶¶Ðo­eaÏ\©#ïK-ΰ®eb_ÿÜH-ù¢¨Ÿ¶…§\5žt­BFÆS-)]§c’í¦;q,ÜTêá“•òææò¤„¾–9oH PÛT2ÛÿºiÊÝëcÇÅ‹êH¡Ë²>´ó²×_O"åê…“ámµ­‰1޹*þn³©ò›¬²Óc{â|„ ‚ ‚ ‚ ˆxB®ÎÉQúùÇõÛí¼q8ej†ÄrÕËÚǽMd¿\z&ÓD`ÉÈåa¹‡¨F¹zn_xÛĵ­ruu»…Gîç–Ó‘Ôˆ³J%e ã3Þz£\=ѺXø÷WkÉ»W›õå%Uá¬ÊTŠ|«‘˜ûË*bîõ¯Ï +•(Eõ 97 ëËÉÁšuœŒÏ–G. Gh6Ȥi¹‚«éü¥ òÍY ‚¯;¶^-ÚÖ(i‰æ27ÝP£\ue¬Ý‡÷qŠˆœªòú­µžõD@-)WY©?>~’”«ÂÔ¤Gˆ›3#ÈF5UVÖ²x‡˜•±ä¹ÍBfæÓ¦zÖ'¬"o@mW֜ϭŠâ×.=NN_;­XGΉ¯fóOJªŒÍt-ö¡Öïí»5㤩Ée Ieõ¬†ÆÖŽ£=q<´Ìã§IAÊKN|¤]ÎCå¦%Ùüº8¼†Ü¦r‹(xo ë¼lø;ɤ\½x:¢­¶u±sŒrõÇ­Æ7]egÇ:¶Üš‚ ‚ ‚ ‚t3ž«¿ÄVŒºÈöÛã|ÊýíÏrÕËÚǽMd¿\ýøt¦ ¹úÑòë_/J¨1ª¾f½°L°÷Dü,Ó°mrոرü ¹Äôúy­ª ¿tëј­s?ógÏ©¨Lï9jj¨ßHÌ›¿3âcrc_z G¢7éA½Bž‘Ážî¨Yµ‚h.sÓ¸8ð¿“r•=pƒõ¬gÎ×íVŸö_ãGúéJissEZÊ“ÄÇ Ñï^ä)nàkL«Ý(Õ Oë·±­ø“ûXûÊUJS£Hjæî‹h™µ)î똊4©ÞÔ&傊å±ÿ¶ÊjOÖ–"¹¤Ùdaë…¦}Elõž£‘¦èUòæf~Jò“Vk´1v\\uQp7i”IÙ…_H?ªhnVð?ÙÞyÙÈSH¹z% Ê¢ªø¿kH¹úËvãG;VÙ¹±Ž-·&‚ ‚ ‚ ‚ ÝŒ'äêÅBÑL¦ìÃ÷ÆQáÌY,YаÁrÕ›ÚÇíMäˆ\Í0a”«"vb”«f¼ràÄüÈmln–Î܉›1ÊÕ AAAA ð„\%XŸ&œÅ’}Züáñô·$P‘NfŒ/™Õ°ŸUåF³ê5íã¡&²_®~t:ÃD`ÉÈe¡"vB4—¹é>2ÊUð1{ÝÌö˜·ž`1Åï47»±¹¹ºðýй¹bóYnMAAAAºÉU‚°ÒúIñ±äÄå?™Ål˜+H¯tç=«ÞÔ>j"ûåꇧ2L \uT®š›Ž€ØŽàcöºÿÌ ªæ&µª°²>º¸6®R¥"{|ïÙØ—Àss7Äæ³Üš‚ ‚ ‚ ‚t7“«âöËÕNe˜0ÊÕ;!šËÜtå*ø˜½nfoêâË­‰ ‚ ‚ ‚ H7ƒréQØ/Wß?•n媣rÕÜtóÙjða{§!6ŸåÖDAAA¤›A¹Šô(«'ÓM–Œ\ú>b'¤\mm:‚ùl5øà½ˆÓrÕbk"‚ ‚ ‚ ÒÍ \EzöËÕ!'ÓMr5ä}ÄNˆæ27Ý£\r(¡(äæ³Øš‚ ‚ ‚ ‚t3(W‘…ýrõ½“é&Œrub'Ds™›î=£\ýàpBQˆÍg¹5AAAéfP®"= äê‰t%#—„ Aì„”«­MG0Ÿ­þèpBQH¹j±5AAAéfP®v§ÙÕc„3™²¹¹ÊùlµwC¬ãtFÃÄ‚èr±Gåê;ÇÓMåê{ˆÍen:”«”†Ø|–[AAAAnÆCrÕ t¢‹’ÐÌÂÞ,–|ôUΫ’úïŠí·ã†wC¬ãk“Çs‰­¿-Cè9¹úöñ4(W•«æ¦#@¹JiˆÍg¹5AAAéfáf¹ê•:Ñ IhbN®ÒÏ?<(Þ8œ:5Câ ¹SýÁ¾ü·d¾‰rÕq¹J4𔫔†Ø|–[AAAAnãí#Œöå'ñ%î•«^©„&æ³ÕàÉÒWÌÜ\•'ä*±ä’¨R¢¿{e”«ï vBÊÕ£ioM%þr•ÒrÕ¸5͛մe-§t\¦‹¹]TØñû+4Mïâë¬2·'1›õwV‰Õßfnš­Íe:ï"›mØÅ&³œxÓv¸é¶³ùÕ–oÚgº¨ÇÎ4:›bõ‡Ó+ÛuA{v ‡êìºót½e;ÛŽ¦ç––é"«®wh¶3g{šºëMãP7sºo8±¾7í!­»= ÒÙ¡Ïþ5²§o8´»Ù<¼tݺN¬‹£º+g›Gø7;ô®ŽíÜEÛv‘s›©³¬:;Dß4‡®á¦MÔÅ÷v–@×çAçv%{6ŠÓëëè)ÆÎ/ºi_uhß±Y­Ó¹¹¥eºÞFŽ(lVâ–œ8ËtÑàv®‹I:·²NôGë·y–q( û[¸³6·³nz$ï:±®¿Î•SLg¹uv ½éQÂ2ÛÎN6¿ë¦YÙ¹¹rH·§I»8ÅØ\ ‡6ýµ™þxëHÆ»YìcoOØ£³’«^©„^ÜA´€‡ä*AP¡hØ‘ÜÀ’‘‹BÞAì„h®÷ ‚ ‚ ‚ ‚ ÎñÁ>öÈcy)|‰: 媒л[Ãsíæ\¥‘‘b‰3·@{ÅÅÅ*µ3;â"¢ººÊª*ð4|½ÁPT\¬ÖhÀ3qInXÙ‰ß$ìðLœ»=,%¥¥ ¥< ¤^, |+â"%%%ØíA »}Ex¾ ·¤D©ræ$Äu$R)ï΋â›^ƒc``X†Íýåª'$¡w·†çÚ åª·‚r ´LP \»=,(W¡@¹ ÊU(P®ÂE¹ ÊU ذ¹¡\õ„$ôîÖð\»¡\õVP®B– ÊËÕã¿HØáà™8v{XP®Br”«P \„‹r”«°as?¢’\Ý•²¾®‘}#©÷ IØ­AP®Z‚r< -T—«¥‡䆂gâØíaA¹ ÊU@P®Br.ÊU8P®b`À†ÍýR®îL\TÝöEjyÃÕØÌ×wv¾|gBugüçaœ¿NŽÔc$¡ã­÷GoÙìü´´Ðjåª{A¹ ž†‚– ªËÕ’CãÅ9Áà™8v{XP®Br”«P \„‹rOÊUÿØÈç>Ø^¤µ­”lÏmR_^5áÃt"úùvé…ES«åÉYù&ÝF|zBh0-Ñ(eŸ3ö͈‰Ï¾úé´ibƒEÕ®ÌÅÀðTØÜ åjSCóõ]1~{“ÆÇÖÉšu—ã–«=O:Þq?qt²âì÷öĽjdЮp5Úýí†rÕ[A¹ Z&((/W~+ÎF¹Š8ÊU(P®‚r ”«€pQ®Âá)¹Ú¤«gŸŸþ:nS®v:WWzì›é/~:ßÅà €3†=KqüIžéÞ1ƒ„r.À2Θ7„N}¦ÒèA çìGþÓùû/\»xhÉØþôçÆ-k½ïÌ•¹ž ›û¼\ÍÏúŸéãf˜¶™—òòŽgï+SÊÉï×———ÿq$¶+¹jù÷î4I#'³$P /‘jeІ3!IŒõ¿rœP¥547©äÒ³qeå¶±=J®J9ÌW»j®„ É¢ ùo@ƒ®¤0ïƒ]äôþû2Wç7Ô‡¦¦ºêÊ¥§[îàí¿Ÿ±.¿¡š<¶4)eÒ#ã¾³×owì+þqV ô¿yë¡\µå*x>Z&(¨.W¹ûƉYWÁ3qìö° \…å* (W¡@¹ å*‘«Ê´¹ÿk½­´£\íb®,ašÝïÏ(IËͪ’Ø¿Ñý•(³y9¯/;øéÓÏ~yÆt㪆½á=ú‹?^­1ÝqÚ(Žüc}ðâ,U³«s10<6÷£"W_Ú0.ºVÚ¬»r1®ßî´¢¦†RÎØ}1ý÷¦//ÑêJÇì¶_®;¸pÒÁ˜~;b†„ÖJ5µSöÓÓ÷Š›ªóóFøßè¿/c}¹ž8@ô0¹ªo6èÄZƒL¡HÊá|½ÏúÎÕ§ÊxzÙ–€xb5ûïIw>uðNbÝ“W 2>÷‡ƒ±ýw'ýœÖ PTþ´—l“µ•ªŠ²_ľ´#öãY?w~Ø„3EµÁŠÄ:%ÊU‡@¹ ž†‚– JËU1ëZñîÑõY—Á3qìö° \…å* (W¡@¹ å*‘«MqŸÏ/¼ôÓ‹6äjçsu\ÿ¡túØÀš¶Á”)3üèƒÙ²œMÒ¸Yƒèƒ¦)LŠŠä:ý‹KµæÂÒÈŸž£°£uq®±vÁñQt:ýË që î ›û‘Ûåê Û£íeGª¶/Ò*dÁñ™¯ïˆpª\ؤØtì†i±—ŽqšÔGÎļ°3y­¨‘ô1½³¿w¥î–4Å'÷7}žœt½jß©¿ÓåBƒlÙá–:ýÎð*›”[ÇØ™ªÓrÕîÖˆùð {z`úÈc)_\)º&mÖWØÕn™——pÕW¢ÃöÞxÑ<ñd)¯Q±±µ­^ðg*u!cœ*ã7)·Ù½‚]óÓÕìðŠ^c³™ ©zZx¾ÛÛrÕж|Э´^ÂÄÓõ¢”^¬7FëõßWbjtË¢\OÃAË¥åj]æ…¢#ë³.gâØíaA¹ ÊU@P®Br.ÊU8<9æª"ñþ¶‡èd®AxòSãݬº6³S°yýéoÃ¥ÊëKŒ¢?3ö8¿ehTeúœAt¿™©JójÖò7é/NŠS¸8טÊU …ÍýÈírõÖ…WíeQøDA“8+ñÞöÓï;$lÐ×~¶²uÊŠ”PþÒ‘[GΪnd\‰¸˜ØÙßKo¬¨kL¹p½—©ìÊÔHj›0Q§DS5|EK½Ö³2ôò…[ƒìLÕi¹ê@kXpÏÞ²Ê&ÙßVé- îw¶ø’@E+õ¢]nÜ»ÈØVÄQD­«ZP5ꮟ #¦K-ÛÐ5î]2êtF`iɬÆÖÈÇ_bõYêövëñrUË;ûÕC4R¡ZÊUMÙ¡¡wÑîøóºÃ§lþ}ðÝ´ÛßÚV ±.Žr< -T—«œíÃêà™8v{XP®Br”«P \„‹rŽ%W›u¥>£ÓŸûlù¥,X*âç',ýôyÒiÖ[9Í&IìÌWè¯ÎK–µÎÇýúýõ¥Ì¶{\µ…[†Ðé_‡J\œkšPÃÎHÍ(À·\a¸;lîGn—«´…WíeQøÏF¹zwûéwî**k”ÍÙdúØksnv£jóî ÚâÈ™F‰z1½³¿—ÞXn”«·šj[™¡Smõ¾sWq™A2yõ–¯ØÍå5Él ²3U§åª­aÁ]þ\A“|É6Ûéݲäúÿ.WÖ7Jgn¾Ö{‡kü¾ñšÕ2äôFVð¦Ü·2tÔ™Œ³\QD¥ìû+Ù}W‡y¢Ýz¶\5HÓ– ¼óŸŸ,þó¹vrUɘ÷ÚCO Mw«ê«¯Œ½öÈäD¹U ×ÃÃkjkÕRPXØ “§áƒTUUñù|ð4|•Z]PP “ËÁ3q‚šÔ€‚MCjRÏ€gâ•D·ÀÓðY8EEÄEx>ñ£¬¼< ß„ÃáH±ÛCP]SSÎã§á›ݾ¡< ßDTWWRZêÆ -®¶—«ÍÍZ~𲱯´ÉJyØØ!ÏПŸ#o_XW²$ýéчËÛ^9%5 Ru[]úÔ…¹ž ­ÎÆ£Êî—«‹¯ÙË’R®2“î¶š¾C²¥°ÝRM’˜ééƒþŠ—ZÜϪL›3ˆþÊì´ŽöË]œ‹áɨª®î¹zË’ {Y1Ñ(Wïé0«÷æôuE ãÝâzn1wì–rú²hòñÿkQ½ºø{E¬Q®FÜfªjM:)W÷†ßµ=k¯@£onRÈÄû¯eëeó¶Û™ªÓrÕÞ¦X¿¬X.2ýŽ^™W8b£unwíΪըÈ6iRHë÷]нg)9ý¶5 fÖ—\Zµ2-·à­5äô^ë’fgK«È[à›äÒú‡¯ßjÿ¦q^#Wõ ©K_¹óÁ1'J5jN{¹*‹Ð—vÿ·7¤æå)S£ÝùY˜¤}%áuõõ:½Þ)**RªTàiø µ"QEEx¾ ‡²Ý^”q¾`Ã;¢´3à™8GMmmEe%x> —Ë•Éåàiø Äo ¾@ž†oRÌåÊ ð4|Q]@(OÃ7ÁnˆX")çñÜX¡ÅÕ¶ÓrÕµ×~|>xCi9UÇÝû >ê@‰Îrªw˜˜úå‘ydIøÏÑßßj³®ÌÅÀðdè †n«½–÷|î=PÊ××}»ÑÞå–«àk ‹—ÈU-ïô—÷~ya’„܃¬åª$tToÚ£S’eæåU¬…tíÝóµíëÁ1WÁÓðApðI(¨>æjþº×E©§À3qìö°à˜«Pà˜«€à˜«Pà˜«€pqÌU8zÖ˜«íÃP2ãU:ýÓýí,j“$zÚ@úÀi7$VðjØëÞ¡¿ðãÕSâÈß_¦¿º Céò\2pÌU …ÍýȹÚhwÌg«ÿ±*´Gö¯ƒŒÿÛyÿªÐ>ÛRWð r.ëéÕö'ÖËþF Bkt޶[”«zá™ïé3r”øÙL É^ó"­×G+*ŽX@b’«rsåª(W¡@ËååêÚÁ(Wç@¹ ÊU@P®Br.ÊU8<"W•…y¹¹é'Ç?OsApVn.»Tb¾§µË¹â¤½[ö 8±oÝÔQýét¿ŸO—¶Ó¯ºbÿtúðÝÅín[5I*AÀøé/|¶ðÀÅk—/ý¢?ýÙϚŬ+sÉùÇGÑÉ7k‰›:|/†+as?r»\í³&¬GrýÙs|–Â`|J^WÀ)½ýºýÅ–«Ðk ŒWÈU-w‡ÍfÜñI°¤Ñ ‹™Ð—öÀ1 æ"­ÃˆÛW…r< -”–«¢”ì•~¢äà™8™?v{PP®Br”«P \„‹rÈUeêL?zûøôTEë=Ÿ]Î5T_þñerÒ³ƒ>þnáÑÔZ}» øFqÔT?ú€)‘âÆfa0Ïú¿ÁÏ‘åÿ7jê¾Ôzƒ»æ¢\ÅðPØÜÜ.WYî}8-WÁ3§V»õH¹Ú¨¬d%Å·Å3¿?I£ýo}X|J~®Ñ -Úü2ööÉ ó ­D‡ÞN{z1Ëê…V(WÁÓðAÐ2AAi¹Z›t4oé‹ÄÿÁ3qìö° \…å* (W¡@¹ å*žãæas?²K®65ÙÉ|¶ú‰Í‘^ÆS[£ææªìoïn ‡ åª#-Ö3åªÖc®6*3g?Ië=ô¤Poü¨¯¾<æ^ÚC¿Äɬ ¢\OÃAË5åªA§”ÖĨ [—»äùÚÄ#Ðù8 v{XP®Br”«P \„‹r”«°as?r¯\“£|qWì3Û¢¼‰ÿLþ3Câœ\OçvD;*¥©)W5%ûÞ¿“Ö{ЯŽž>ºeÊ÷Ðn¼‰­¶.ˆr< -Ô’«:µ\V–.ÎRÕ•¬“wnfî’çk zðÜœ»=,(W¡@¹ ÊU(P®ÂE¹ ÊU ذ¹¹W®NŒ­˜×oG´716¤ø—<'äꜥŸxþP¼q8eªƒRš¢rÕШ«MØ2þÕGn§Ñh·=8`ܺèj]Ç‚(WÁÓðAÐ2AA-¹ªi¨®ŠÜZzäGe5'oY?^À4R®ÆîÕ먑¿ØíaA¹ ÊU@P®Br.ÊU8P®b`À†ÍýȽr5°P4“){çXšßîïàÃÓY³X²ÔŠ'äê/q£.²ÁWŠ/C¹¿9(¥)!Wå*x>Z&((&W¥6äjuŒ¿^KÉ‹&ìö° \…å* (W¡@¹ å*(W10`Ãæ~ä^¹J°.M0‹)û2¸è½£©ƒ÷ÆQ—!ÇÒ¾ +™™Õ°Ué„Y%¸hTÍžÈ_—îgxÓ(¥e(WÍ \OÃAË…7ÈÕ»ôJºìö° \…å* (W¡@¹ å*(W10`Ãæ~d\mr0®—Š‹«ø‹%ŸÏVS—™Ì†I±‚ŒJ™£«oÒ…³X²¯C‹?<žþÖ_࣓ãÃKgf5ìgU9Ú\(W½”«P e‚‚zr5bKéáLrµüÌŸ¹Kž¯ŠØªS5€çæØíaA¹ ÊU@P®Br.ÊU8P®b`À†ÍýÈrÃ2ÂKÅ“â)¯šíg³ar¬0³Ê)rÕ[A¹ Z&(¨'WÃ7âä-}¡ôØÏ¹‹ž® ߬URò…Ý”«P \å*(Wá¢\…å*lØÜP®bôœ@¹ê­ \…-Ô•«9óŸ(=2å*â4(W¡@¹ ÊU(P®ÂE¹ ‡Ûåªx#-sRg ¨éÝd¤ÜMÊâË«&|8€NDÿ!ß.½P hêbq]Éž¡të¼8Keª«èò†iß {à³ÄÔ§~øýòÀÂ.«Ãðí°¹¡\Åè9rÕ[A¹ Z&(¨+W³[åjEÈj¬<7'Àn ÊU(P®‚r ”«€pQ®Ârµ¹YWzì›é/~:ßÅà €3†=KqüI^癚äêGK´Å¹à¬z9SÏ;4ò9¿‘“–î8rúÌÑ­³G÷§Ó_þ=L„÷ôbØ›ûÊUŒž(W½”«P e‚‚¢rUÎËÊž÷x‹\ ^©i¨ÏÍ °ÛÂr ”«€ \…å* \”«p¸]®êù1 ù‘ÒÈ¡Y&§ºz•Ä8¥¡0C§ëy·pʦùÑýþŒ’´¤Ö(‰ýk}Ð_‰²ÎJåê³?ݰ¹@“RPT¥6¯f“$ú÷þô~“âîÎÃKÂæ~„r£çÊUoå*h™  œ\­ ßÄÙ6TV–Þ^®VƒçæØíaA¹ ÊU@P®Br.ÊU8<7æjcñÏ,£\eì 1´MˆÖ럟‰9y›ž`LêÅaI››ÕªÈ¯ –>Κz›ñ×^̯q/¨5fKiЗàï~%{š©ø¿Ø;ÿ¬åI³ôzîÞŽ—XgÍ Û.—›¿Ó 8>ŠN§$¶)vu\ÿ¡túØÀš¶Ô•)3ü胙ó·U¤+¹jòøi/›Ç ÀÀè6÷#”«='P®z+(W¡@Ëõäêõ…[>°”«Â«KÔbJŠìö° \…å* (W¡@¹ å*`rµ[Œrµ¡ÁÿÎŽ# 0éI%ª×e~—Ýan^p~S³AÇø¾eÖLzÞ’G¦¿—/Vj[ÜU×rÕ <ù)þÁö"y’¶`óúÓ߆K;Ñ&¹:!B¤Ri ÝŠÛ¨S6Ôp“ŽÏòüë^ªèÃ!`ôŒ°¹¡\Åè9rÕ[A¹ Z&((-WKŸ³ˆ.¸´@]OÉã-v{XP®Br”«P \„‹r@¹Ê\4¨pÛðâã*Ë”ÍÍM†}a¡ž\´±±æ\ÙãbÓ¾hP77+¯—Î4•zº<%K§Qè+êù„æ7©¢Êfkó?­%ËêµñïýêÝÜÜ9ª­ag¤fˆ Í6CWzà3:ý¹Ï–_ʈ¥"~~BÀÒOŸ'ml}'â´ý ­ž}íÓ?vÅU[ÙSuîê·Œ³ßüý8ßg…ÑyØÜP®bôœ@¹ê­ \…-T“«U!kÌrµxïØœ¿Ÿ$åj<7'Àn ÊU(P®‚r ”«€pQ®Â7,ÀÒšZF“J[t¼êüÄÿOŠ6½–;ÅdSß—¨š9?0M>öp”…!ml"þãþbú–¬•#¸{?'Ùü“¼Í bÛé4µüàec_1ÛÒ—‡ò ýù‰1òN–o”d_={)$*.1áFðéM“†…>ÞÂn·>J>+%öz ÿ¬aÏч,Žã ­0l‡Íý媧ãL~ÍÄáL¦ln®r>[íÝë8Ñ0ñ† †'v¦­P®z)(W¡@˵äªZR!¼º¤`ã;²RR®rv Ïž÷?p®JTž›`·‡å*(WA¹ ÊU@¸(Wáè)rÕP^ðßmüO{9©M®˜ï›¦³#¹V¾ÔÀú¨ã`&r.0š:Iy^VfVP¦« úöú-…ZûJ*ÎŒ}šþæòlµÍ¹¼C#èôO•ãÀ6Ãæ~„rÕ£±07‹%}•óê¤þ»bûí¸áÝëøÚÁä±ÁÜ™LÙöÌ G› 媷‚r ´LPPN® ./Ê_ý?Yi)W·Ëž÷ïÜLeM1xnN€Ý”«P \å*(Wá¢\…£‡ÈÕÆ¢ŸL 3÷T)õÍÍÉf‹;W ¿5¹VÖ‰ _J^õ›ojÍ ÊsÓ³÷µ×~|>xCio eê¬ôÓ’mhˆüþú˘6Õ+†ÍýåªçâL~Í,¦ì#iàγûyï$c&S–,lp¬ÅP®z)(W¡@ËÊU@°ÛÂrŠvrÕ`Ð*Ä:UƒÁ OÌ@¹ ÊU@¸(Wáè!rÕõAË;ªBòÈ*4¬ªemrµY~…;Ýøqr>ƒ­×ëÅ)ugÞ) ÍoR„”˜fýù†0+O¯ojnTèÊ/U~¯„Ygªü&c®Z™®ê¯ÒéŸî/i}ÁU“¦šžšQ(i-ߨ¬‘hÛLn“‚±òm:}ô ¹@“ºº¤ZÓ6·Q5cýé//TÛõõ¾6÷#”«ž‹‰q#óÀ='cC¸¿Üà9Ôb(W½”«P e‚‚ªrµ$åj÷£×ªu¥^¯ÏÄ- \…ÂR®êuêú¬KÒü(Jž˜/€r ”«€pQ®ÂÑCäjS펂É-ógÍ~(«íé~£\mÖi“ÿÕáÁÿ¼àü¦f½6í«l[æ‹LîJp||?•¸³[[ÅI{·ì;pbߺ©£úÓé~?Ÿ.m@_~`8QþÛð†– ŠÄ©¯ùÛ¢-Nœ:æ¿fʰçéôw'Iënžøìù#~]HÌ=yxÇÒŸÞ%ʾ¿*CŽï´Â°6÷#”«ž‹9¹J?ÿxpÉ Å‡S§fHj1”«Þ ÊU((g™¼*ÊUöêA’üÈì¹ÿB¹ÚÍÈyYÒüHŠŽpÛ”«PXÊUJV~zJEð*MC xb¾ÊU(P®ÂE¹ G‘«¤>eÎáÌ¿ƒ\~Î+%!5ë-å*¹€®h7oç€ì©¦[XÈÛ:¹¶Lb²Sú²Ã‚½ƒsfÜÖ¢gçù[%©3 Ò›ËUCõå_&_eõì ¿[x4µ¶Ýð¨䪡úÆîÙãG¼õÊód™—Þùâ¯)µ­«Ø¤* Ú2ãÛáo›æö÷‹Ù‡Òêñ®UŒNÃæ~„rÕs1Ÿ­7œ€ôß37WåP‹¡\õVP®BA9Ëä5PO®^Z»øY ;‚”«[>Èžó(ÊÕn£6é¨àò†¢xðLÜÊU(P®‚r ”«€pQ®Âá9¹ŠaOØÜP®z.|\®-àP‹¡\õVP®BA9Ëä5PS®>c’«ÞfÍ~åj·Q›xXpq~'<·€r ”«€ \…å* \”«p \ÅÀ€ ›û‘oÈÕÆÚ3oÓhOJRtç·¢\E¹j ÊUð4|ÊY&¯Òr•½zsÖ?Q®v(W·€r”«P \„‹r”«°as?òœ\mÿü´vÑûá~ÃþØ›Zop®Bå*ÊUxP®‚§áƒPÎ2y ””«‹žn‘«+ý˜3û¢\íÈ÷Xé´µ ‡P®"®ƒr”«P \„‹r”«°as?ò´\í;bΚuD¬]½ô¯ÞûF»å•5yŽ)7w„A£R©uÝú(WQ®Z‚r< „B–ÉË  \ý;{Þãrõ”«Ý@eØzi~TuŒ?ÊUÄuP®‚r ”«€pQ®Âáv¹ŠØOYy¹L.OÃ!º=_ O£ <-Wûo.Öš'*N}Ü›F{fY®“vµQ«Pèœ+ (WQ®Z‚r< „B–ÉË ž\½ø7köÃ(W»™¢#kâTElá_˜ƒrq”«€ \…å* \”«p \å*(WÛÉÕ&yÜOÿ´«ªÌÙOÐh¯­l(@W²möÜ ¶Æø©t‡Fÿ;*rëƒëM£Ñžš—%3M\çÿë;O’CÜúÏ_mL¨ë|¸«at7¯A/)LMHb”+\¸ÙÕ¹;<¢"¹V­ ›\2s¿Å¬ÝÉ3™’J1½±BÀŸ~$–œ¸3þû”z¾L])“_HhZrgâ¬"UJLÊh§ŠrÕ&(WÁÓðA(d™¼ ŠÉU±a6)Wó³çþ+oùKÌ™}xÓ•ÕðÜœ€BÝÞ$W+¯oà›…rqk¹zr2ÊÕnå*(Wá¢\…å* (W¡@¹úÜâ8.ˆòÒÂÌë{'õ¿vË Õ­7®Ú)WoéûÀýýØp=&òêåäµqâ­>ôЫ“w]OM¸¶í»ÿÒhÿyJ¨ï$›rµË®¹‹F{rCåÜÚ“áˆ\ùèguDöo7êÕM–r5öót¥AU³àdÜË{Si õecvßð;YR¤¨ùó@ÌÀ“\Žªnú²†÷BkÊœá»ÜïHývǾâgÅ@ÿXŸ‘«iΉy_½×ï‰>½È-ú<ûះYR}ëªü5/Ьã‘ÉI²öõ \Oáeò2(&Wëù¼€©¬Ù‰³ƒ³ç<š»ø9æôûÊOÿ¡¬ÌÏÍ (Ôí[äjØz^À4iA4x>nå*íåjC鱟+‚W¢\íP®Br.ÊU8P®‚r ”«VqßÛ‹cDf•j§\¥Ý;æB•Å"¦‰þj¾ÓT–0ù¢¢ƒ‚NìªM¹Úe Ý-W[xõbÂR®ú3.¨šØ1É/?¾|´(¿I{ö|±XmmѰ]7úíÉ R(¶žˆé07T"^u,Æ7 ž)ªåh V$Ö)}F®j8›Ü~ÿ€Ï¦,Û²gïÖÅߺ›ì”ç+õ¦Lrõ¹)ÛöîÛ×ÊÁ3IÕÚöõ \Oáeò2('WËOÿÁœÑ§>ókÎ#¹‹žÎš~oÙÉI axnN@¡no–«å§~—ä]ÏÇ- \…ÂJ®–úNxu©FZ ž˜/€r ”«€pQ®Âr”«P \}l‚ÿùKD\ 8¼iưÇh´»ÞYË›¶·S®Þ=6LjQ±ibß ±ò¶i¢sïÒhþ‘¢°‹M¹êP ÎÄ|¶ú…íÑ1èbµ¢I2c_ËÇ—²›´çb[ØyNÙ”•4àhQ޲nÞ¡ƒÊJ”Õ¿ìK˜ÎQ¦Æ$¿ìà×ÙÉOW³Ã+xÍf2¤êiáù7-è-rÕ -É)WÌk¯¹‡v×è0©iŠQ®ö$а0âz_®Pø yl¶X"OÃ…¥eeàiø"ry^^Uº½¤¢ˆ{ü7ƽ+“O³f?œ½à?YÓïãûµ¾$<7' º=ñ»< {(Ü>Bµ‹wmÑþÕŒ«àù¸…ü‚‚ºº:ð4|ŠÊJnI‰éï†úê¢ý_—ž%©*OÌÈÏϯ«¯OÃ!º}Ik·Gº6v{8ªª«‹Š‹ÁÓðM 9œZ‘< „èöÅ=¦ÛÛ¼…¦{Ç\Õ•ø¿y+6h›i¢rõ?ó³,ïm1u!ËBÜI® ½ö€É–j%‚Rnk” ¥ºÎÆ\í´7Å|¶úÖ…Wâ¾CBYcÝ—«Z>Þ¹-¿ I¹~WPËKc7Jšòã{/ ~é"/¡F^PQ½úhø§…E¥9/¬‰›ÉçT7¤dç½¹òš£_Ý÷®u:#°´ÎdVckäã/±ú¬ ½iAo‘«Öˆ¯y/ùÜ¿Ü!¹˜Ådr|2âââòØlè,|12Œ´´4è,|1ˆß]±qqlŠtûF|öžñ™SîÈ ÞŘù cÖCŒ}rö~_ š3Avûôtè,ì Öú÷óÎ-Ë=1‹hvÄètÜñ ¹¹¹ÐYøb¿1RRSMæ1YÛFçüµ€™ ›•D|||n^t¾YYYænÑÍÝ0X,VR2Þa"111;': _ &‹•Ücº}Mm-´\mÒ®ïG£Ý2䜈¼wÕ–\-Þòr‡Z-ʶtt¶&Z¨QMÞòg-"xq]¡¶¹ÚY îŠùl5máU‡¸Ç(WÇ­jùxÛÆlF“fï¾à––%ìW4e^Ž¸Í¢ÈmkÓÏÔÕMß2 F.`¦>¸8lh†ª81îN¿ºkî[:êLÆY®(¢Röý•쾫Ãì)åmrU¯n¨æEîüö¿w<úÅñRM£¥\ýøR¥L®Ô:-ŽÃ€§áƒPèùh/ƒzÜšÂø£wqX’Yÿ,?3‡ð4E;GVEm¯Zà ®ÓqXþ…9I%xb¾  ‡€‡‡€‡°’«öÊçi4Ú['«I¹ªÎYú 6`+Wg^@‘üû#®ÉUCCADà¹Ö¸É‘5ÊÕÅ×âž#²ÆúqkZ§¬H< hb\‹ìeüØks£Q³wH[‘¥ác²±!Ñw,SªK8wý–Å×úœ‰yŒ‡—8öÕ7¥Ïš°×&½<õ¡õávñ2¹*OŸùo£±|̆ԅ,“—AM¹zGmâÖ쇲fÜÇœÑåj7P¸yHeø&”«ˆ[@¹ ÊU(P®ÂE¹ ÊU@P®Brõa³V¬"cåÒ9¿Œx¦˜ôù)~Ë­ªQðø¾4Ú-Ï|>gÝÖ‹'¾óhŸçýîï rµáú˜»h´'ç0T6ª³3æ³Õ½–ÛGÈã—$í^¾hW(9kÕoRêøbJ#¯¬ô«m¡æRwlÊ8UW?{W˔ޛÓwð•åõÊraù¸-!vµñ2¹jFS´ù%ò8oO%Жí| í±©©òöÓQ®‚§Au”U´Z¯sÀ×QÈ2y”•«‡I¹:íæŒûQ®v(W7‚r”«P \„‹r”«€ \…åªeÜz?ýíïׄ”[ ·F)ÃÿÇW¹˜Ýûñ·~ÝŸžµ¥Ã ­(,Wÿ±*Ô—ñV¹j¨¿üá­´ý‘,·9·áÆø>´û¾Š’¶ŸŽr< ªÃœWŸuY+¯³¿…,“—AQ¹ZõÊÕîÃ(W7 .-(ÞýYUä6u<%×A¹ …µ\=ø ÊÕnå*(Wá¢\…å* (W¡ðe¹Š1Ÿ­î³&Ì—ñ¹jPðòж7U髯~Ó—vË[‡ùZãG©°VÙ6× I˜þ6hW‰¦}=(WÁÓ :Ü}_ÔÄÐH«í/B!ËäePT®VGïdýõ ÊÕn£póŠÕüÀ¹yËûíYϼž’ë \…¢\UJ‹÷Œá_˜rµ{@¹ ÊU@¸(Wá@¹ ÊU(P®úrÌg«YîËx‰\Õ–îtÇ}ýGý¶hãÎÝ[–NþF{zFœÄôN+iø¸‡úøt1×ûªYŸ÷»ƒF{rrDÞª”«àiP”«‚’ruÊí•¡k™³ú2þ¸ƒø?ïì ”«ž†”«A+øçgeÏÿwÞ²kb÷‚§ä:(W¡°”«Z¥´h×§(W» ”«P \„‹r”«€ \…åª/Ç|¶ú‰Í‘¾Œ—ÈUƒœ}fá7C^zâ;Èá-î~ê6ÇTk[Ðò‚V~ÿ~ÿ›æþãÉ׿ÛU¡íXÊUð4¨ÊU A1¹ZÇ+;ñ+cÊí åÌ™dNº%{s3‚lðÜœ€BÝÞ$WyÓ²çþ+wÉsÕÑ;ÁSr”«Pt”«Ä^¬‘ wêP®Br.ÊU8P®‚r ”«¾óÙêg¶Eù,Ï툞›ëص=T®º ”«àiPâÝ£kâö£\¥Ô’«*QYé‘ r•–ó÷“¼³Óå¼,ðÜœ€*Ý^¯Ónz¯"hEùé?X³Î]ôtUÄð¬\å*å*ѵÔb!xb¾ÊU(P®ÂE¹ ÊU@P®BrÕ—cNŽÒÏ?®ßŽhßäÃ)S3$µÊUoåª[àlV»å*% œ\-9ü=)W¯µÊÕÿ!åj9<7' J·×©dß1ËÕœOU„®ÏÊuP®BÑQ®–œ¤÷è˯å*(Wá¢\…åªs¨êÊyZ™È•JP®BrÕ—ã—¸ŠQÙ~»c|“/C¹¿Ýà9Ôb(W½”«n³}XuŒ¿Fê€5¢Šeò>¨*W¯,F¹ÚmèT ß^[^~z köÃÙóŸ¨^ž•ë \…å* (W¡@¹ å*(W£6ñ°àâüNœ+• \…åª/ÇÅBÑL¦ìÃ÷ÆùسX²´ ™C-†rÕ[A¹ê8Û‡UEnuèOªX&r•þ/æŒûQ®v&¹*¸¼°ìä$R®Î}Tpe1xV®ƒr ”«€ \…å* \”«p \u”«”åªÇ†tá,–ìëÐâ§¿u ÁøèdÆøðÒ™Y ûYUŽ6ÊUoåª[àlZ¾ å*%@¹ Uº½I®ò/Ì)=ö3köìÙñ/ÎÏÊuP®v‰A¯×ÿ÷Då(WA¹ ÊU@¸(Wá@¹ê(W) ÊUŒðRñ¤øŠ¿Xòùlµ/0‹Ù09V˜YåØ=«¦@¹ê­ \u …ß©¼¾å*% ¨\åŽrµÛ0ÉÕÂ-䯜5ínÖ¬ò/ÌÏÊuP®vŽA§’ËJRuj™'ê·–«;G–ø åj÷€r ”«€pQ®ÂrÕ9P®R”«öÊUoåª[(Xÿ&ÊUª@I¹ú{¯²¿1§ß—9‰–·ôþù¿P®z“\eüÑ›1åŽÌÉ·0gÜÇ;3<+×A¹Ú)z¢‚]¸ù}ee'êo'W’ÂMï•øåj÷€r ”«€pQ®ÂrÕ9P®R”«öÊUoåª[ åjÊÕvèuju=_!ÈÏÄ:1ªÊÕ_™Óï%åê²~ü ³Q®z“\%ZÛDÖ´{ÊOMÏÊuP®v†^¯#VìUÂ\OÔo-W7¾‹rµÛ@¹ ÊU@¸(Wá@¹ê(W) ÊU û媷‚rÕ- \íˆV&ªË8'èy#URT®–ý1 åjw¡m¨!vê6¹úçeÇ~ÏÊuP®vÊU/å*(Wá¢\…åªsÔ&æŸÿKZpÕJP®BrÃþ@¹ê­ \u ùk^­Y£®wàœBËä4iUuŒ?÷À×à™XAQ¹Zrð›¬i÷ \í4’Š‚uo˜å*cÊí¥‡¿ÏÊuP®vÊU/å*(Wá¢\…åªsTÇì)?ó§$?Ò•JP®BrÃþ@¹ê­ \u ì•„W—ªëxö¡ŠerR®ÞØU¼g x&VPS®ÞÆÝÿe‹\]þ’Q®f‚çæTéöj±ÐR®fN¾µäÀ7àY¹ÊÕÎè~¹Zzøu=U5Q ”«P \„‹r”«ÎQ½³üÔïv„+• \…å*†AôƳ锫^ ÊU··¼¿àòB•¨Ìþ"T±LNCÊÕè]E»FgbÅäjmiɯ-å*{å@þùY²Ò4ðÜœ€*ÝÞZ®N¢q÷}¡×ëÀs”«Ñýr•{àk‡þ=q”«P \„‹r”«Îr•Òx\=—!Ðè Ðâ ÃûC¬Ô^cU¢\õJP®º”«1ÊÕœmÃÀ3±‚jr•[¼çsK¹š¿æ5Þ¹™2n2xnN@•nßQ®[A§Q€'æ"(W;媃r ”«€pQ®ÂrÕ9P®R/«IÅuÅ5rhñ†áýÁâK²xï–«uÕ…0O#'ÓÍ \u yËú .-@¹j‰FZUµ½pÓ{à™XA1¹ZÃ-öMÊÕ}㲦Ý9‰V°îuòÎU”«žÄ†\õÿ?­’òÿ‡rµ3ôzœÏB¹ê• \…å* \”«p \u”«”Æ äªD¥»œU!Vh¡Ý†7G•T}‘!Ti Þ-W+ RxggH ]zA!A¹êr?+¸ô7ÊUKLrµ`ÃÛà™XAQ¹Z´ëÓ¬©ÿÈœD+Üô?p.ÊUÒQ®íEtiðÄ\åjgèõ:YYzÞŠ—»E®Š Ö¿Å=ðÊÕîå*(Wá¢\…åªsåêd”«Å ä*B±êRV»¢A®ÖAK8 o‹•ŽÅ—\aVÔÊ57íŠT—«91Üý_гƒÀ“éfP®º…œ¿Ÿ\œrÕR®Fla¯z<+¨(W3'ßZ°ámÆŸw’ruó”«žF]/(X÷z;¹ºc„¨0”«¡×kŠr>­d{¢~+¹Ê^9€øÉá=Š \…å* \”«p \uŽêèe'~•䆹R ÊU(¼C®!Së“Kê.2„ÄòâF.3+2ÊÄ*ÝÍïYE¹J]P®º…œ¿ŸâÎC¹j‰Z\Q²†½Ò<+¨*W׿‰rµûš½º8ík–r•³õ#E<1A¹Ú­rõ¿ >Ëõ£\å*(Wá¢\…åªsTGí(=2ÁÅ‹q”«Px\ÅÀè!r•Š \u 9?U0MUõ¿U,“Ó¨Åáµe¹KžÏÄ ”«€P¥Û+« ó×¼j)W 7½++MOÌEP®vÊU/å*(Wá¢\…åªsT†­/9ø-ÊUŠ‚rýAi¹*È ãîýå*âz½.çï'ËÏü©ª)¶¿U,“Ó´ÈÕEOƒgbÊU@¨Òí­åêä[ Ö¿!a‡ƒ'æ"(W;媃r ”«€pQ®ÂrÕ9*ÃÖ¡\¥.(W10ÜÔ–«AE;?©g^O¦›A¹ê2ª!gþ(W­ åêÕ¥ÙóÏÄ ”«€P¥Û[ÉU¢å 6¾[ÇOÌEP®vÊU/å*(Wá¢\…åªs \¥4(W10Ü”–«üŒ ÎöáõY—À“éfP®ºŒA«d£\í)W¯,aÍ~<+(*Wó×½Îø£7ÊÕîÁJ®2gÜ_¸åÃÚ¤cà‰¹ÊÕÎè~¹Z¼gŒª®|Å}”«P \„‹r”«Îr•Ò \ÅÀpoP_®C¹Š8ÊUÛåêbÖ_êu=KcRT®²Wú1þ¸ƒ|³Òöá‚K P®z+¹Êšý0gLjªèà‰¹ÊÕÎè~¹Z´s¤Cï@Dœå*(Wá¢\…åªs \¥4(W10ÜÔ–«i—9Û†¢\í±(+ó+Ã7êµ=ð‡"ÊUÛ˜åªNÕ` :3•«yKžgL¹=kÚ=Ü_ ¯.i(NÏÍ ¨Òí­äj΂ÿï[²<1A¹Úz½VZ“³ åêŽ*Q)øŠû(W¡@¹ å*(W£2lw߸zæW*A¹ …×ÈU±R—Ä­»”%<›. Š ˆ'¸QXÛ#åªAšsbÞWïõ{¢O/vKŸg?üó0Kªo[@/JÙ9áõÇzs{=ä÷Õ†˜]Çz""#yIç8[?ªg\ßñ@U[¢¬, –ãe©"W%¹aì•~Z¥<k ´:{þ¿ËOý®¬.²¿ U,“Ó´ÊÕje"ƒAžªÉÕâ¢]£SnÏYø_Æ”^¹‹ž.?5Exui'<7' J·WóòWÿÏ,Wó–õ+=ü½àâ|ðÄ\åjgèuZI^xÎü'äÝ Wåõ¹K_àlŽrµ{@¹ ÊU@¸(Wá@¹ê•¡ëŠýÿÏÅ‹q”«Px‡\-¯S2„yÒ•Nדn Bz>é­‘™™Éãñª««¥R©Ìuuu|>?Ý"ìérUÃÙ<àöû|6eÙ–={·.þ~ÐÝ4Ú½cÎW¶˜MÙ¡¡wÑîøóºÃ§lþ}ðÝ´ÛßÚV ±®'"2²<1 pÓ{õ™À·‹Ô¥Ÿ­‰Ý§ªá:Q–JruÅ­¼<k u]yö¼ÇËŽÿ¢¬*´¿ U,“Ó¨ëù‚‹óY³þ©W \ue5‡³}XÖ´{ræ?Áø½Wá¦!üÀyÂ+K¤…1à¹9Uº½œ—Å^õŠY®—›È;;<1A¹ÚzFœÌšó0±é=Q{¹Z—³à?Ä~rµ{@¹ ÊU@¸(Wá@¹êÁ+‹w†r•¢x\+uÂ:95®‘ž†Éš²Ùìúúz“V•Ëå ñ T©V«5J¥"æöl¹j–ä”+Ìÿ¬`¨½6æÚ]£ÃL÷7*óþC»sèI¡énU}õ•±÷Ñ™œh}È -Œ:š·ú5Aü1âÈ@9ʃÖpfÕ¦8Q6;'§V$_…›!©H»³´_€I$Q9›5÷1ÎñµÅ™ö,çñй\øü=†¨<{òæÌDe¹‰<K(ÒíIj¹YìMïg͸Ÿ5ïßYóÿÃ9=«ôÊŠ’óóª²BÀss‚òòr.º}5;.wù³\Í]áWthBññÉà‰¹Hn^^uM x=q]EêâxU“Ÿà‰ú‰+NQ‘éïúªrÖü'ó·|DÁWÜÀnŸÏ/jíöH7“››[S[ ž†o"¬¨((,Oƒr?nó· &žr¥v~~eUøºø B¡°°Çt{›ÿ´tS•P$*ª‘;:„¢¤§§ççç××׋D¢ššâÿuuuÄG±X,‘½RªR©´Z­É¯öT¹jøú—÷Ò™œdÔ§Úâ-/Óhoê[¨»<ìvÚ3K²•íK]¼t‰qy'kùÀ‚]Ü’ÊÁ>»(÷ÈïœÔ0'Ê&$&r8à«ÐD\ßË\ø\+ >Ÿé³³f?š³ó‹¢Œ(û ²X¬ÌÌLøü=F3!÷àDÆôû9™ÑÄ&ÏÇ t{s3fFg¯};kFÆìGóÿZœW²3ïø´ÂØðÜœ€It{<›ÂI¾Æ\ÒÏ,W™K^ÊÙýUîþÁs‘¤ääü‚ð4z"Åœ‚ˆÃŒ}8)Áž¨?;''=#Ãôw1›™5÷ñìuï1ãáWÜHJJ*Àne·Gº™D¢Û‚§á›äæå¥¦¥§A9ˆ·Ù>(ÛëJ%É))ìü|ðuñArssÓzL·ÕÙxÖõ¦:ë\†@­ëAÏZ"Ô‚Á`ˆŒQ]]]SS#‘H”J¥J¥"þ/“ɤRiCCƒZ­&¦P@®êÕ õ¼Èßþ÷ŽG¿8^jzð_;¡/íþooHÍ‹)R¦>F»ó³0Iûâ‘‘¥1Gó×¾V—~|»8AUÄfÁÅù A¶e{þ°ZyªºH”|fCÚjo$¡£zÓ’,3/©b-¤Óhm_œ”«Qó×üå*½Aoã-cfˆRzìg~༼¥/**Øà­Ý1e;{îc(W­0ËU9/K¯×Ö&Wð³õøŸú”«Csæ?ÁœÑåj·aK®þŠrÕ‹A¹êÅ \…å* \”«p \uŽV¹èJ%(W¡ðn¹zš]=1F8“)››«œÏV#T‡ØŽÓ o¢ËÅ]ô™Ì¯hÑqáêêê*cH¥R‘HÔ>LC°¡Ñhz¸\Õ5pS¢C.Y=¾ßí4úäãÝ’“\•›—T1»«ìU¯Ô¥€ïøN@]¹ª×ªÕuåÊ.•))WLà›•·ô…0¼µ­1肜ì¹ÿB¹jE‹\ѧ¡(^¯Óp¶ ¥žÖ*º:‚u(W¡J··’«ùë—Ÿù媃rÕ‹A¹ ÊU@¸(Wá@¹êÄ[ζë2\ºÓ å*^,W&ðf±ä£¯r^=ÔWl¿7ªClÇ×& æÎdʶe;ë3ÉU‘HTYI\æV©Tª°°0+¹š““£T*år¹éåV=\®šÑm~‰Fë¿™£&>Êb&ô¥=ðCLƒyÖaÄíK™äjÞ²~¢ÔSà«àÔ•«j± úÆ.þùY],S—~¶äð÷åg¦æ.yNVšÞÚÖ \í„6¹Ê‰#åêÖˆý 媣 \ÁJ®¬{ƒ0 媃rÕ‹A¹ ÊU@¸(Wá@¹êÄÛÂ-Ô¥q¥”«Px«\=Í®žÅ”½q$ Ü"žà½“Œ™LY’@j³Ï8-Wƒl1].—+‰_¤U䪡þò‡·Òþõ‡ñnUmÑæ—i´·OV˜_h%º8ôvÚÓ‹YV/´ŠˆŒ,‰Ø“·äyQÊIøUpêÊUU ·"xeÙÉI],ÓN®–¤‚·¶5­r•»ÿK‡n¬¥ŠeršV¹z¿8'D¯Us¶~T›rB«¨OŒŠr5{þŒ?ï^Y¤‘T \í¸Iì•~(W}½NSŸu™9³ûäjÁ†·‰3 øŠû(W¡@¹ å*(Wƒø•[¸ù}”«Å[åêĸŠyàñcC¸£y6ûŒ'äªB¡h´£7ÂÈUƒ‚—/PÌSôÕW¿éK»å­Ã|-ùQ™9ûIZï¡'…ú–¹—ÇÜK{è—8™U=‘‘ÜÐí¹‹Ÿ¥¨\­ [Ç¿0›ŠrUY™/¸¼àærõÐøòÓSr=Ó…’A//ÏÌžû(wß(W-Q‰Jyg¦2§ßWŸy^¯Ulx»&n¿FV žEåjæï· ƒ–k¤U(WÝÁ Ó(µ2‘yŠ”Ë^ñr›\ÝðïìŒòS¿Ã§ê(W;C¯ÓçrŒèr†'ê·’«Ùs)X÷ÊÕîå*(Wá¢\…åªsðçn|å*EñV¹:'Wéç.ÏñÆáÔ©›}Æç䪶tç ;îë?ê·EwîÞ²tÊð§h4ÚÓ3â$-ï´Ò”ì{ÿNZïA¿n8zúè–)oÜC»mð&¶ÚºR®†l¥®\­YÍ;7“ŠrUÎgñ¦•ù±‹eˆ ^î¾q¥G~È]ô´$?¼µ­Ðëu ÜdÖ”«Ö¨jKÊNNÊš~omÒF™¿îõêMC xbÔ“«Û‡G§ÌÉ·V­D¹ê tj9Ñž‚+‹ÌSˆyrµpÓ»¼s³ÊŽÿžª‹ \í ½N-J;Íœù€Œ›Ôõ;£½\±fõE¹Úm \…å* \”«p \uþù¿ 6¾ƒr•¢x«\ÏVƒÛ?Ä£ôß37×öéÒçäªAÎ>³ð›!/=ñÀ4"î~ê6ÇTk-–ÑÕ&lÿê#·so{pÀ¸uÑÕ6.šÚäjòqƒÁ¾ï; u媬4½ìØÄ’Cßu±L]úÙâ=Ÿs|•³.Î om+H¹ZœÈšóÊU+T5ܲã¿fM»§:z—N£@¹êF¹:&º1ÊÕ‡Á SË´ò:ƒAïbUf¹*¼¶´"x•œÏtoª(WA¹ ÊU@¸(Wá@¹êüóå¯,J9áXAƒžø@>Ïeü%€r ”«uA¹ê^""#9—Væ,ø/ÊÕnF’ÆÙò!{Õ+«K;{·(ù8±LÑ®Q9?)J=­×õ,'¦×ë¤ù‘¬ÙïùüÿÙ;°¨ŽµkzÓ˜{ÓS¼‰z“˜žhLŒILL3&š£ÑvÁÒ¤ˆ¨4iŠ Vº€Eí½ï²}YzÛB¾û½gqY`Ùððü…³sΙ3óÎ;ïüvÎL‹˜lý‰C“29QmJ®ð¸ Ùc¼èô&][#uçkÒœ` ®ÚªV±çÆîªVßÁÕ’¶¥NYš&Úµ,Œ®â×?„[{_'\½èÁUÇ˹]-tâK÷Ð_7ñËkqçtšG/u ® O¬YÞÈ.uî³cpEap-apEq1¸Šž0¸jŸªÓ6Óv½«*;lÓY00lâXá³#D ®¢% ®3Eߨ­þ‡VTöê9Âàªs…ÁU´r^GLgìþˆð–ä¢àèÊ^ÓÔ\?ÂÜ÷9;ê[²ûxUiR›’ãø$%'J¯×Õ‘³‰[ždGß\M´þÄ¡I™œ(®¦®¡øNY®km@àjö®ö:ô»Ýa WC§cpuà¤mV+¯ÄQ}'ëuΰQ®‰ºó¿Ð´1¸ê,5r®Éó÷j[êœsÁ}{½T–»›—ô»¦IåàÕnÃÕc«øÉKY%Î}v ®¢( ®¢% ®¢(.WÑWí“(Í͸ªmkd_%¹7†p\EK\f²®F]óRÜ.ŸöæÆô’ª©Qhç|„ÁUçê\}Iyƒ«ƒªÚª3´€·ioŠÏïà%/é5 W÷Ì`íûœäþ¼¢0RY§× ¡QR\eE|Ý,Â[âФLNWO¬£ïz——°PÛRKÝùš$ݧ]-D=cî2÷ÎÄ­¾[šˆÁÕ¦Q ¾…â3©‹ûÕSrGW*а£ç`pÕYª)?å©©—9åjº¶Æ:J/éw^â"çÀÕòã×Çø‡ÿâÆÿÚÀ(rî³cpEap-apEq1¸Šž0¸jŸD§6Ñ߯àê0W‡™¬…«ÿ×È L.~+®lq‰ºéºóg¯ Ÿyg ƒ«ÎU~AóŒ/yÇ‹Šâ]ûðsÈÒ¬Àa Wkn¦R¼^¡øLvåÆÍï=Íõ#ôiôIÛŸ•fðSþ6¼XªC½ØÂàj_jSrE'70÷Ì`G}×^+¦úN_ðj« ž±aWõ: òEOGG«ŒÎ ›ÁŽü·únÙ¥=šF%W®N¸ê=±kõ:b†ðÄzˆð9±?àêWâ‹Þà|PϪƒpÕ9°¥­FÑíßÜ„…N€«Úvåµd¦q¼CK9qóûÚ`Ñnõ€«ãè!S1¸:8Âà*ZÂà*Šâbp=apÕ> »Pý§`pu˜ ƒ«ÃL¦põÀ͘úXU¼³âf^ƒ¶©¥ñDvÙ›‘·à*ÿžñ”XB®ö¬+7¦ žyg ƒ«ÎU~Aã¤;¸eùå]kêù±Uâ‹^0ê–põÆQ(v²çËÂëØQß÷žæúFÈTz0W%™~Üø_U×’umC¥šôzm)‹¸å ®š©UÎsáÆÍg„}ÚV#ÀàªMª§ä*Šc´­õ¦pU^®iRapÕéºW_m¯íìÅÌájÄ×’t_~³ë‡‘†\ý^㤅—ÛT|èø¸zðgçÀÕ’8¦G¹ñ  ¹ÕSóœûìfp·æ>ZÀ[­ 6ZuqG ƒ«h ƒ«(Š‹ÁUô„ÁUûd?\e]!m{ƒ«è ƒ«ÃLæpõÿk’¬J,~-²xfŽªA£Zs°\}ý@é/…ª†ÿé.žÃf®bpµàêv’ûóî^®pUUšDÜòyÇËÂÔ5¬}³zMÓW‰[Ÿ®>»=‡›ø[×3Ô¥×kÕ•§ˆ›ÇઙZåL“ø‡þ ¾Û¦â#põÜö6õŒ ¸ª(ޤ,Ó4*1¸:ê„«^Z¤4ã#\­#\”ì§ú½Î‰ùI–ÊKXˆzVúp5òdÝlg\ œ ?y)Áí_ì¨ï ¼ŒÎŒp•ýkÿ— W¡W¹ÜEÝùßV ­º¸£„ÁU´„ÁUÅÅà*zÂàª}²®6°J®ãôZ ®¢© W'GŽ@E]®ù‡VXö:ü]~ þÿØW¯¿aüè ¹BßvðxñäÈROùíòѶ4e]­š‰vÎ@\u®0¸ŠVΕW⠛Ƒw¼(8²œ2­×45×Sè»Þ£¼EÜúTuÚdg«/… F!pµâ$WµM*UiR#§¬ëˆ®®†š¥ùOiUr(¾“)ñ’×ÓQ®²aW #yÉK4 ®‚ œåùûÈžZníIg„«ìÒ)•h)'vž,o7áWԳ꠆\uÖtM¸'n>aãvä·N„«Ì½3!SëÈÙÎ}ö^àª/WI\EK\EQ\ ®¢§¡W¡kC6ª€´sb„Ç](Þ¯*¯&ØúŒ\Ýô(WÑÕ†«wy¦@y¸)þÁ]Ì¿~÷-òWÿsãÌ¥{Œ”èÚÂc²îòÊ[&þ¿:üµ1¨çv€…ÁUç*¿ €~b+W_ŠâXü†‡¡äy ¿ÑÞê5ª4‰ê;™â=‘¸åIáÉõ0Ž&ºý{(L€4J¯Ó¨Ê“¶?ÇŽüæN†«m5È+º57Žvé‚«Tÿ)- Åg"/i1=èei"ÊU6à*ø"dt ®°4 r0Ý6_–»›¼ã¥./j„«M¼íµbˆö1¸ê9®²8~À­½®éD¸ÊØó ¸©:R–sŸƒ«( ƒ«h ƒ«(Š‹ÁUô4tàªòÊA‡ËfÍ\õúòJ¼Mg!p•YŒÁUÔ5‚áê(Ïô(ïW\½~÷-ò3ÀÕ»Œ”çëÚöÇdòÊûÛWF=·, ®:Wù´£HÛž‘çïÕ¶Ô¢ž[5|áªür$níýä/qbæR|'õšFy5âõ Ùóeâæ'Ç\X³ nÿjS •}@ô: ’CŸI¬ý_6 *­?q¨Q&Õ¦ärÌU–Äu1…«ÍÕDŠ÷DnÂBZà;Ê«¶EMί²aWó÷r.ÐÔË põS(ÛÛp•œ->ïQOÁàªnSš½Kš Éð#{¼ØÈ*1ï‚«šF¥èäz ®:E5åÇYá_µH¨N¹Z«ŒÁ ÿ·úè4 ¯ÖWéÁPýÞ¨%8y‚=WQWÑWQƒ«èièÀUñ9waêZ]{ ê9±FöÁU¦¥ž’‹ÁUÔ5’áªwÆ”ïe®¦Ü ¿ûûÕþsãlÞ]ÆvÝDàjlö(Ÿ|®ÊF=·¬¾àªMÂàj—¸š²–´íiYînÇ÷Å|!põðŸM¼vœ‹"\Õwèåùûñë x½ÂŠü†¼ãÅ^“)¯&='ÜÇ7?ÁOù›¹wæ@ÃU½^«iª±rr¬^§Q”ÄÑüßdíû¢IPaý]†erP-R+ü+EaTG‡Þx¤'\åÄ΃‚Âàª5’åíáÄüØ®!puïLîÁ_p«ï1ÂÕzZ~õ¹íNŸY78jf_OÍcG%\}vÙãˆÏÛ”\½¦¥^tjC¯\Û¬Ú„ÁU§¨æÆQ־ϛ« N¹øæžÐ.˜a35 Nƒ«´Àw(>kñœûì\EQ\EK\EQ\ ®¢'ûàj³¸Y¤uê8txÁUÁ±Ud¯ 6ÃÕöæ:R&aÓX-òòiWÑÒ†«£}2G v"Ëd\¾~÷/1ÀÕü»U p5.g´oþ2\}õܰ0¸ê\uÁUiN°ão¾Ä¼xÉKÙ¥vœ‹&\Õ¶Ëò÷Á`–ê3‰¹ïsÒögß9š «/§¤mÏð’~g„N'¸ŽP¸ªm­o`\–ì·ê)tùåú®÷XûgÝÑpµš•(Ë ëªD®¦®s¡úNnTR¼_eG~CÝùW­WüЦâ /qQ\m`UŸÝVGÌ@=“vh¨™})ƒ±çZàÛ¢“ëIîÏ«ož¨>³L·¦Óí¬W‡ˆF0\”‹id ƒ«ÎU~A9þOI³ƒßcðU¶™7ØÁU(jÙ¥PŠ÷«ŸI4ÿ7‰[ŸBæ£ÞZ±³KÊ« ðÁõ1ªÏ$NìOôà®dG}gMb½¶Â!æ¾ÏY_ßÉpµ‘[ÆØóIõÙííu¯¾¶Hiü”¿%é>]p•2•¼ãe([t³:ôáªNÓ*Í `GÏa Wk®ѶԛÂUH©iRé4Ãã…¯Ž¡göª²ÃŸ‰ïW-ÃÍõ^&m{¦ŽpAU𨠮&-†hüêvPèÃÕ ÷ÙWrµfâõ tpMMƒÌÁ«!p5w7ŒÎ`d‡ß8¦ææ '>x›Š_îÇK]üÙ¡oS‹ pu2WG\EK\EQ\ ®¢'ûàªø¢+b6ÌÎʇ¢Ó®‚#ˇË~"üä¥0âS°í1»àjƒƒ«(jÃÕ§vçaÙÂàªsÕW%é;»ÐÐ0Ò0…«PÔ0˜¥ù¿Iõ{ƒâý*qË“-bR‡^g–Ly5àö/ü†Gè»ÞeE|Mõ{†¥WKâà^Ö$ÖkÛ‘p(ü+®òG&\Õë4z¤^Ì'›ª‘ƒÀUÑ©Mm*¾ñˆ)\m`R¼&ЃÞ'm{FQƒòã ¸ùM‹„Ò W»àÖÜ«®JÓµ5šÂU(dÕõ#Íb2êy¶RCÍì•WR¼^¯Â90üL•Ëh¦GkʃÛ1…«üCK•WâÙÑߣža5¢àª° ü B)ý^GÞzpìj]p•àöoÜÚûjÊ9ñÁ[å ÑYÞñµÈŸú6²MñžØ*Çàê`ƒ«h ƒ«(Š‹ÁUôd\…Ñt‘õ´gecXÂÕÍ#{ãÚô˜·àj»Z„ÁU5‚áêø½˜F¶0¸ê\݆«}Úk‡´[èUî¶©ø²œzÈTäµ\ïWú‚«ŠâXü†GðÆ ›F *\mMb’‹ÏnçÄÎC6´²å]ž¡F™,¨UJ‡ˆ¥×íÆºÔÀ,fìþHxÜ¥UÎ4¹W}Éîã!ì!ïx‰ê÷5E£û8î¶7K2ünÃÕà¡ãÖÜ[O΂Láj=5O² Šõ<[©¡föÃS¼_¥‡|ÈK\ÄŽþÞWǪ®%+¯ÄàªÓåd¸*¨„^Ãép·ö~¸¦ª,¥ggd·Z$dÁ‰ Ü”åÈŸ·à*iûs­2ZuqG ƒ«h ƒ«(Š‹ÁUôd7\…ÑP)ËYÙ¸£à*~ãêõ: ®¢%ÔàªñÇŠ”vÃÕWÂ/cÁšY¸â„]BàêÁ¥\dA'(Í bîù¸¸Zt¿þ!óÒC>d…i„«-brÏœ%Mƒ\QÍnMb’‹Nmä%ýÎÜ÷E÷ºõwj”É‚GWÈ/GXžÔ]O˧‡L¤üÕrke‹”&HY&Í‚–e„«ïW ®ã0¸Ú¯´-µâ ž½ÀUzNÓj WëÈÙÜø_ÕUgPϳ•jf/Ï £úNbíŸÅÇŽþ·úÜÚû•%q #\Õµ6Â/\uŠT×Ñß®§æ:åjMü›0˜r:\­Z5 ¤¼šhùë$›Ô,Äñ®Âà*ZÂà*ZÂà*Šâbp=Ù Wa(¤ÆuÖçN«mPh\E]èÀÕ½¶µYÔÑŠ/Ä탫[É­oÅ\y-²ÓHÕ´äë+ë·F ®viéÆóçý4ÿÛÏ/_¿Ì;fEàQSm ;¥ÕwëæNæU˜¥1Ó Ï4=S(·œ>öŒ9õ=˜aù”úæÛ#èŽc7|ù×¶=ÒVvÄU+jÇnYæŸÒ3}ر|³,…¦\²œ%©ª›Yæ—Ó-§?{æŒ4;ˆ>‹ð&t¦WV?ú÷ŽÈGÌ’-Yë1ÿ»Ïžó•벟¡áj³hôé"Ë·àˆ»mOvȵœ>­ÙÆY¯àR(c÷ôVv]艾ӧl?iW“.^³| §³ß1R&ükìt—G?ÝðèÌM¦zá{vm·oCܣΙ¥1“Y‹†Q§åôK|’Ͳ4í¯˧(j»W§mÞ¸à“±3ÖYHŸp¾Û›˜®Ôx|Ì óç5jŽ«ùrâ߬´œ%f÷ÁKÌ™bËéBöJ³9~ ¼EØ8æÒ²‡ýt}Ïdc?^UóÈÔ¿?øv c÷Gä/uÁÕ…;,ßâ&U`š%èû,§÷нØÀU±,7ÙÕºµý™¯·YH?åïV)Ÿò·àÈ Öþ/›¸×W³|‹¼rZg4ÀÕ¬R²åôëCÍ÷U™ü³¯…ô=Íu{¤£æ:fúª±¯~ôÓöm®`~c¦-óÑÊGgܪÄO7O„ºã–g’w¼Höx*ZQ|(Çr– pêÕ\ûÒn¶™+˜=KØmëºiý˜kر<ÓôÕŠZËég¬3ËÒ¯Öš«®/œŒ¸#(ÆiËÁ5!ÊP¶PÔðçØOÖ¹ÖâϳöÏR^M€³À\Ÿ¶h®oþæo–%ëÍÕ(ÇÍuì§ÇÞ2$Ћsl6W³°¼_ïºÔçï ö9fÚ²1­0h%Ø*”3==Lv)ª ¹š¨Ó´8ýd ¤±Æ\É\‰­æúõú˧°DÎ1×¾þ§+í7W£Žç–[Nï{AUšÔWû5×·~ °l®Ð®áÿ Þ)¿œnš>ó*Ér–6ì9Ù•ØW'ÌZa¼&ô;=Óƒ¹jtݾ ØyÖsmd_åÆ/à&ý£Näø§lO]Ö3Þèi®Sÿì'Pš  älËém5×¹›ÍWÉî×\ÙÕ¶™«Ù× 0ijœÞVs³¯ u3×c9ý™kÜEÓô-mOÍÞj“¹®ÜÕwuÄ\š4ßÇBú—æì°Ý\q¦é;͵oýáÛ¹š9üqŸ¹*ëšl2פ‹ÝÌ•Ä[NßÓ\g¯³Í\£OYN︹.p·|ŠS̵/ozk‘ÍæZpÓFs ;e«¹š}Óº5âŒå[˜™ëU<ÛrúžæúáÁÒ÷4×]V›«®Új®Âc.ŸÌù}ì'k-œb£¹nÜòó{üC´×V[i®3WíµÕ\+éÝHæÑì–ÓûÄ¥›¦ohn{ê«-ÆŒa˜YÿÛÓ\W5{L(48ÑØ¥‚å›™k†íæ:msýsça›Ìõ±Ïm6×äôk6y×ûó®fÄ©îö-|ô©~¼«Ù× B¹º_sÕµ6( £yÉK4 Ss5ŽèÍd\=Ǭq%4}q´òø+˜Fž¾>Ip#6Ý4ö¬z[…ÁÕ.mtÛºü§+ühÅÜ×þ¹`›ÿ~h’] LÊ6s¡Y¥dÓ=E`u+ ž¤ÆrúÔÜ›fYŠç¼¿,'X|Á«¥š¤Ó´œ?–¼Å{׺e‹¬1WiM½sÍd3Ûm®ëƒSÜ£Î:×\ªb-§Ï¹ŠW–ÄÒÞ4®hÑ¿¹ö˜ÖÍ\cÎoŒ€ÊZ1ç—_¾Ø~Ü`®ÝFTž´s-¾m®F¸ê¶ðÃ5ßwÛîå•f–ÌÕl*`æU«ÌµQÈŽžÃMXÈÉ<ö††¼â‡Výò9t"ý›ëÉþ‚ÖnËØè]û5×Cƒa®Ý6öªml±œÞVs³çuŸh]EïÇ\s Á@—Ú4Z[Í5­ _ïj¿¹µ;ÅR0`·¹šxW•åô'.™oâif®[÷ŸÚ´çxןޱ›l4W³W¤*›Í5ÞFs-% l® ‘¼Û›5ö™+˜½GoÞÔs~o¿æjö_¿æz¡˜`«¹ê»O̰Ñ\¹¶›k„Eïꈹ᪭æ*8ºrç’¶xxE÷^q^6š«gäÉT90NAvz²Î\{¾=Ñ¿¹*º™ke¿æzjš¾U£ÝŸaühÝŠ%+œý¯iú~ÍÕ3êôŸ •?Mw9±Á†#Tn7Û°Ë\sÑ5דy6šk\ºÍæJµÑ»f”Yö®ÛÂÓ6†3=¢ª·Í»–àló®`®fpõHV§¹æt÷ŠFÙW{¸)q#6-Ìá|q¤bzB)¦‘¡YÇ*çñ]ññDç,X‡ÁÕ.¥Gºe¸<Ÿ³ê‰ìåãŠfSJÎ dê.A£ïž^ÝÐlš §Ìü[k»Örz3, ’¨ê-ŸbJ$D§]ñû~ •åXHoöæ`»V‡—Ö\)dz…²žéeÝgòw—å,iºÏ@«onµœ^J¿ŽÀÕØyô]ïâÖ=€sý7íÆ%¾Da– w>d&½¢I¸^èóIùám9+þÍ¢â¡ÍÒnä–'o†sUß5ΫFXÏŽú¶Qhǹ(nhÕ,"H³a¼Iþ Êå.âæÇÙ¥ú>6´"¹ç'/¡ú½n„«Ü2½n 6$2ÀÕ]TßÉ–“µÊ¬}_à7<ÌŽþ¾:Í1reý]†ÚÎ>}–$Ý·MɱF]yŠðçÀ²œ`áñÕâ‹Þ-b2œ¨¼_ÿ`Mùq®nx·æ^ùåHý€mFf†ì†VÚ–ºöZ‘®­±½^Z¶™µÿ‹&^9²¡UÈTIºaÓ£m*ÃúÜëði-î,ü^sãÅûUI¦ùûþCVCÊìµM5’Œ¬ˆ¯ß²ó50WÒöçªVžX®© ®VŸÛC°ap³¨çÙA¡¸¡•^Ûf„«NÙ ®VGÊD6Ÿ2ì NÛÁ ê4­àµðk·<¡(Œ4®ßåÕÓ¡sbçÉ5Ðò…QU.£± ­M؆Vh ÛÐ Eq‡Ì†Và®åá0¶Ò¶šÃ™‘*û6´YNp}Ly5â@§dzáñ5¦puˆ‹7† ²<ó•4úyÌÖõÍÐ}7 *alˆmh…–PÙÐÊ ®Z–#p5•¦XV,q%4m£´¢N19.¨Ç¸ÆeEâB¡ù×7¦Š®Õ—z&pµ¥|à ÷=ûñ¢ÍA±ÑAëg==jÔ]ï‡RÛ;áêÄ5áqÞRâ‰2…¶ûu®Ç¹ðÏyó’~§x½ÂÜ÷Y-Á|éì!.aêZVø—õÔ<;ÎpyÙin{º~Y¯×š%SEã×=Höx‘Ÿò7Õ÷¿Ä­Oá×ÞßȾ ÑÚe «YdÏ –“µÊÌ}ŸC…/¾àÉÜ?«‘Sjý]†e²,^ÂBñ9÷V9ÓBššòã4ÿ)ì¨o«ÏnCÒ#p•mªæú‘ªÕw«®%#puí¸ÕwËó÷éu蘜QC®6ñÊ¡ Z¤Ôö:‰è´²EïF‹˜Lþ@𽋴ýÙ¶d¶&~yuš›‘P©ÊRHîãÅçw žy+5¤Ì^Ó —dìäÄüÈ?ô´wÁ‘eȒΫF Ž®` W…ÇWCè-õ<;¨!W_WW¥9~5]{“ºò´®Ž&n~¼½Öžx^?:M‡áå>®^ð4ÂUèn…Q`ÎzöZÜYzÐ`iдk«ÎÀƒ«ƒ) ®¢% ®¢(î«à®yÉKäáÃeÏzÇe\åZŠìúZë, ½˜àØ*~ò’vµÐ)hapuX -¸ ¾e áªg©ÈØ<7õ~BÙÑ%¯Eaî‚zü ñúü,®+¡)¼RÒ—ÍÜypUWC§É5]¶Sƒþ;jÔObg8a€«÷ÌδD¤A7b– .úñ“—Òƒ?dG}gœ6Œ„ÀÕý³Œ»„Ø*4᪰JšÀKü2­Êå.²Ç uä,½Î®Ê/G@WKöœIöš@Ø4ްq,2Çuààjmµ$Ý—¼ã%ËÉZet枸Õw3vO“f2÷~ÖȾjý]†e²,^ÂÂê³Û-s€šGiþo²"f Ž,g…%>¿«ÉKjÊW­¥(Ž¥xNÀ­¾§jÕhˆš®î¬Ñ…«êª3Âë˜Å‹Nn`î ÅH | âýŠ1<î‚«z½Ny5¸å)QÚfÔ3o¥†”ٷ׊%;¹ñ¿òSþÿ#L]Cñ™æŠLÕÎô3ÂUämñL°uÅ)hã¨çÙA¡Ww¾¦¾™êøÕ´-uª²®®MØ4¶k·›Ô*gÕQrŒÛ(›ÂUêÎÿ* £ÚëúŒµl•ºâ$-à-Fèô:bºòj"ò}âªQ\4ap-apEqû€«zú>ä»Úî‹Fœ0¸j¥`@è}´ÍæoÛ'èG–ñ’·)¹¨—‰5r®BxŒÁU… \Õ¶ÖËrwó’~8¸šJS¸š¦º‰:Ä4úôΕÐT&îý+­;®š«.ëÛûF=¾ìj§Sµ®–EüÎ>çÇ>ëÃH^Áˆ[(¾rüÃ0'e-ì3iÅy;Î%‘ɪšT²-§òÏz±~§Tµún’Ç‹Òò3uµj³d‚Ì`dêùÎñõÄmÏá7Žɉyujåe¬FHåžt#º¯¯µT2Jv5ð= {¿*¸èOÛó©œký]„B!‡ËE¥äm3ögnê»ÂBšê˱¿)ôý_1cæSÞá¦nT2¯³.¬.N„ê]ÚOöžh€«£éWwÖ¨®¾žD"¡eö$¹šmY†Ï®á“ájÈt.KÉ(#û¾&Ì…kDtH¦ qý%Î «“°E9{ nÿ椬D=óVJ0”̾FDãŸñ`ü•üqûóPŒdïI`¢Ì?ñθóNo®«­];!,I~:õ<;( •ªP(P¹5´zaî>’׫ՅqŽ_­V&åEá*ôƦa«$¥GYU2®!Ù«QðNmÁox™¹êû_aNXM5ÃYÏ^]¦EÜò$;~¡03ˆèö¯*—»‰[ŸVq*Q©‹;M E¡D³Ó¹c%ª®f±Ù¨gãι³ç)-=")Š«¯«œœÔª¤ ³BÔR>êÅ28’H$ &ÓÖ³˜±¿à7ŒfíVËNÉôŒ¬Ä%–«8U¨—‰5bDý€[s¯ c—MgÕ*ªÅʼnøõˉ—êjU4M&—£þ,w Äv™½ƒ‚ÚçŸ÷aÅÌWK8¦Ç{ýjÉ>¸ºìŠô›³TÔ ¦Óülî²ÂÞ×N¹ãáj+Îý¥Q£>ˆèLáê—çeMÍ­šŽ>O,Ýû+)u‡TÆ*=GMYÇÈŠäñùÃH”ƒKIÁ3 Ø|.wíÚ5&‹…J¶Y×ÎÓŽ¹Qbƒ>‚‘&~ûxfÁ!.‡m–ŒvÚF» ÔC.ø-Oã6ŒÁoǺršËf PÆ8„Rä^[ŸåÐIPD}%cWä|§T¹ŒÆm~’vÂúÙ‚ç+U¸J;¹càêÎqy¼Òk×X(™½12öQâ³JNrW¡Q?`•œ`—ç¼&ÑÒvýÞânð†sü yÿw¬âãôÓ>¸cÉÑ Pϼ•"‰CÇì9øêÑM”Øß¨ B{§ÄÿAôBà*iÏ,Ê¡5´£›Øy·k';š¸kêyvPeׯ3è´>hõˆØ1‘愺£TÒNû€û­Z5·áéºa䯒#b—g²G§^‹[ÿ0\“à5‘~ÆÏØÜœ"úÅPèàÀ}^§ÛŒäyÝC¸MãØ•ù¨ÔÅ&Äì™LÔ³qŠD&WVV¢ž;Seee½š=‡X5q—3HQ—I%GÌ¥òâP«ì¿Ç… ÿ£^¶ýŠB¥Þ¼yÓÖ³ ؆1Œz8Tç„IP×ä Èáß³«.£^&Ö¢¯*—»h§Áå0oܸA£ÓQ–;PˆÙWT òM¹ íøRØ—J·W£V; ®n¥´¾suˆià4-¹|}¥ù^~\µó¿|hÔ˜Ó¤úLàj×Ï=O¾=ß/WÜÞãěῈó#Ûë¤Mü ñù57Ž¢M‰mÓ0] ‰wCšé/8²Y¹tõ=ïW눽, ¿Ïðžæë˜¸õiÂÆ±$÷çhºö^ötŠÚjÕg·“=^жÔutè;úØ}©EJ¥½Ì›Zÿ<?+üËA[@§iѵ5õ\Ÿv€ÄÿUxb]K5ÑB啃ôiì¨ïØ_S¼^áÆÍ_ô¦¼…, à2*~Ç­½ª[ /©Ê Ž­j`·)¹Âãk˜{f40Šš«‰4ÿ)Ê«‰ÜøÆE ›øåÐÞ9±?Õ‘³e—BñÇr~C=óVj—@ö«“ôÕ„[lIÆNðŸÕ§Ý ½‹Nn0¾¯ Å+:½IšÐ*¥u%Æ–pP†eP|&©®rüjP­²œÜšû øÁöZ{vëPWá%ýÞ\Mè0YÜ´8ò†·Û:ôºöfmS#¹U–Ä‘¶?[s/¸AñE/„ßnz*uq§ [-aË (nË´©øÐÙ‰N»ܶ°fÒµ5râæƒÇ6®Áb§:ôÚæÚšòcà«Q/Û~Uoײ9\ƒ¸ÎY+~·«Eü”¿!†.Kа"¾†þYÀ–5+´ÍjåÕxü†‡…zm;¶,ZªGeY€–ziö.Î4õ²~ÛWÝií¨Ó?Lª7¢‹·QzGw2\Õ×]ó|ó®QO,<-¹½Ý¼ºá„”Sé¹yy™'c=æ¾ï¡*;ŒâƒØ¡á W®`_÷#dZMÅÉžÁž®Òüß”å†6ŽÅ­¾—â;©ž–^ûïQZßd²®º×4(t­ ðoOäÛÑ W߃¡=dO~9‚þ•Óá*d²×è·‘YRGL·o™A;ĉ™+8º²YD°Fq9’6z70EŠ×+P¼¤ÅP†5婸uJ2v2ö|b|僫}IYšÈ?üWýr‹Œ.8²J Åæj"˜Y³Þ ‚ÆŽ.¸zà‡ZÜYivÁu'vê™·Rƒ WU¥I`‡ºö¦^?m‘ÒÀ2«Ó6‹Ï¹#põÔFzÈT0QFèÇð;W+¦EQÎAYëøÕ`Ì(Éô'lzÔ°2À(ûvëPW¥y˜ÁU-ðm®6ÉÒµ5ÖS/AïãHn•%±¤íÏáÖÜKõ{C”æ†ÁÕAWÑWQ·/¸ªäRþl¸zàI†Ÿ#Ìr áÁõ1kVVD]öÁUvôâ–'e—öXƒ‰¬ g ª^p¿þA(½-ƒ«CD\Å4|µÜ«ÍܱpU߈ ùਇ>ÛChÒ[h€‚¸Gzv}ys÷ãaßËJ4Ê–j"W¯%£õ öiXÃUáñÕN pu÷G57Oô Wß–_'lÃRêÎ×êiùöÃUäëou#çš^¯ë5®’ÜŸoSr•WâG–A,Ú3Y‹„LõŸ‚_w?²aSQ4+|¶sá*d¯‘]ZGÉéù‘âr„øœ{³?85Å>0‡hi“ ÂByÁ~æ¾Ï91?‚)’=^dì™Ñ Wo¦6=*¾èÁÕ~¥(:ÀKø­ž–×"¥ R–ÑC¦Õ‘³¸üÂŽnM¿4ÂUvä757ŽÉr‚IÛŸcG}‡zæ­Ô ÃUEq 'f®®­¸*&K2vBS_ØAö|Y|Á“¾{²ŠEÈTÑÉ \u®MòöR¼þÞÒñ«µ©øâ ^¤mÏ:WkÊS9±ózÂUèŒäáp $ÛM5Ê+¹q?;’ÛÛpuçk¢ëqkîÃàê` ƒ«h ƒ«(ŠÛ\m•3yñ 0¸: "pµUÎâ%ýÎ_ÐbÌ e9 Wé\EQ\Å4|…ÁUSé*C?dÔ˜Y{ñÈ*¢Æ¢ÅãFýõrC÷ã{¾“]IÔ4*[ethÃH •±óñ¡9¶j8ÂÕFÖˆµD§Ý8±?õ Wé»ÞUÀÄs®Â ºYLz¿¯+t‡«ù)÷WÅ$È qóã%È9sïç Œ"ë³Ñ/eÒµ5!ðùĺžIs‚«Ïli᧦l‡«/0ö|‚ÀÕ/Õ3ŒpB&ã43YnˆC³ŽÖð«SëH™&pµó%©.¸ª*K‘åî¦xO„’G=óVjHÁU([IÆNIº$Óìù²¬tÿ,ã3lWC¦rbç!p•”IØô¨(m3'æ'‚Û¿ *¥YÚÖÞW Y¸*Ë ã\€ÀU1…øOËp•¹ÿ EqŒìR(-ðmFètÔ3o¥®vt(Š@Ä¥méÝÞš’ŒÒì]Ò¬€N¸þ~íýÔ¯ñÿeÛª`w%VWžfíûBßÑût÷á"Ôá*Ùs‚ür„ãWk•ÑE§61B?6ÂUµa‰6£jÊSÁ¹5rJ; =©ðÄz·<N¬ ®B¸.¿î¸ºã%ܺIîÏ S× Ž¬àün„ÁÕÁWÑWQ·/¸*&3÷|"8²l¸ÁÕö&þM‚ë¸ WY³)Þ¯Êr‚Ûjœ Wcî¸úP-þ<WQ:pµ¹¶úì63¸ ¾ÆJ=cpµOEߨ­þ‡VTöê9AIîB|•’’ìßýg÷îݽöþVIË~רQÏÍ LL9r¤K©yÜ$ACÞ/OüëÍ9«¼öDÅDºÍ{í¾Q£^pÉW›onRü™òF*4Ï6Z¨¢0j=ƒ#Òµ7ÃHmØÂÕâ ž¼ä¥ø °#¿Q–&CødšF¯ÓÊrC‘U èÙ»díôàëˆéºÖ;K «ùd¯ÿô…gÛ”á‰u¤íÏ6‹Ê’8^ÂÂV9«g2\}ƒâ3©Êå.(|®Ò/[Ÿ~)S{Xtr?åïž+¾ŠÏ¹ Ž®„¾cpjŠ}`7~A#·ÌBiV 'æGîÁŸé!·>ÿŸ·áê©Mà·‚#Ë 3åÄÎS^9hܲ§KMIs‚ puººânõÝ’±û#ñÙí­rV_‹¦öSb\Í#mÎôeauåézrŒ¯;N9ÂÔµ¤mÏ6 qÈ ¡ø¤çuZª‰T¿×éA\kV1ÃfÔÓò­ÏF¿”©MÉ[Å?ôdØì#Ñ©Mü”¿-O%u¢Ø‘_Cí4r®YH#ÉôçÄþeEz B÷.¸JÜü„ðøxâ–§0¸jA`ꜘ¹ÐÁðx‰‹éÁÔ.ô„«02bEÌ&ny’2  ƞO uô4’¡©A…«Ú6yþ^vÔ·}Í–‘¸ ùåHYþ^ŠçI†Ø9É}<ÙãE~ò’põ;ò›þ!(ôáªÇ‹²ÜÝŽ_­¹š 8²œŒ®¶H(vt5×@S² WÛëÄÐ0ÁŠÉ-Ä/ã·< ÍVxÜE}ó$ø@Š×0¸:8Âà*ZÂà*ŠâöW…UïW®¶60÷ά>³¥½Þ~c@à*ë ~݃ŽL4Ù WgÒw½+Íêõu9;Ô*£ó ¸ª×!_poþ·,7Ô¦a²zOq,WQŠp•µ–©{ˆ½w¶gb ®ö) ®+¸ÚÖÞþÙgŸM˜0áäÉ“Ð×@¬eªºúz}‡Íoó9W¸€©5ø 0jn¯“TŸÙ*Ï߇n~l’®Â`°Ž˜aÇéèÃÕ ?áñÕ„c¹qó•%qæpUÓ aW÷|RG¸]'Áuc÷GÔ¯5Ð ìÛ J¬ŽœEÜú”)\­NÛ,Ë 1öæ·àê3œ2bsã~î®6‹ŸI¬ð¯hþo¶ÊÃzjžõÙè—2µHiüÃò-í9YNpl/é÷&ÞÁ©)d…ÏèïͶëÒ¶Ö««Î´×‰ÆÄ½¸ñ x é»Þ#lz”ê÷:ǰxT)‹´ý90QÁÑP¤½ÀÕ=\ÊlÆò€jÈÂUh ¬È¯ëÈÙpu×{ꪴžpµEBaG~%‰[û”32‹5l&D¨çß -¸Ê*nG^IñzE–6Œ,¤¼õ)^Òb®š p0¸ê œ W…Uày‰¿9WUe‡Yû¾0‡«ÛŸ¯Y5¢uhz’LVÄ׎äV^N x—ø!qóãàÕëˆé\Lap-apEqû€«Mü›¤mO ·¢®†ÍvƒA–Ý1ÂUÜê»5 ÎÙìi@e?\ ú@šhúÅ®#j“ ªáÄüQ%êeÒ¯tšdK¯­OA m±!¦Õ4ªä—#`„¨®<­Ãà*zB®2Ã>5u/\í[W~)SÑš::ài;´T:k~œá¸)\=p3¦þVטּ™× mji<‘]öf$W‡\…¶öꫯ®X±õVß—ð~ïªIYºöfM£²úÌÙ¥PÔ³d½Œp•±ç“Zü;NG®2 ‘wrs‚E§6õ WÁmÖSrM@ p¿îZüyûfëéÚšà\âæ'LáªàØ*Iº‘PuÂÕ­O70‹e¹¡ìèï[eŒž×iá)Þ¯rþ qK›ZÈØ=ͦÉÃýR¦fŽ—ø/ùwmø‡–Â}-O%u¢˜û>gĔÒ0=Ø®rþQº1>Ÿó€¬ò~£¼…ÀUßÿ²#¾6ÂU²Ç üCO¬'m®'\5îÓ"¡Ú7Ù ]¸Š¬ùù%”X¿‚ÿ+m×»êŠSÍÕzÐ{íµâîpõ[®®¹‡ê;™ù kÿ¬a1—£cpá*øYÞ(¤ôzK`tAªkÉŠâhËò¼½ÆÕnÿæÆýÜ5wÑ( ®:(#\%¹àøÕÀó€·¤,ë„«b’}p•¹÷3ãF„]p•ìù2ø|­Ü~[@’îë8\¥DÎ%'­$¸>^½V m©§xN¿‡J]ÜiÂà*ZÂà*Šâö W;: t„ —´xxÁU¦µž^Pår—#k šìƒ«ŒÐéŒÝÓ¥Y»z]‹ÌA :;zΠ½éæˆ kóÎ%m{Úv¸ª”çïï¨æÆQü0¸Š–P‚«êê´Í W'GŽ•ü˜G_~äꛑEï¤PN7þŸWñ6º\ó­°ìuø=ºü@ýÿþ×$Y™P49¢hF¶ªA£r‰+œYê)ÿ¿F:îôŸÂù^p.ñÁ¬rqA½Õ÷%¼ï›uÔ<½¦i¡g¶ÈrBPÏ’õ¾pµžšƒVè«ÏlE"½ÄßEÑ}ÂÕ½3ëiy×q·ƒ ů{иڨ®:w4å$0H_ð4‡«ôBèâYá_µHiÝr¥Ó@±7‹pÔ¯K³…Q0R¦½_Gζ>ýR¦FîuNÜ<^â"MSÙGÜ„_!id—NM!p5üK#‚èR›’Ë™ÖÀ*1ÆçÕg·ñÿ •HóŸ‚ÀUŸI¬ý³ºà*7á7H@öx±'\mSñX³ëH™ƒ6yuÈÂUñy(4(1CÕÏï„«"<-àMdÕÐpµÊe4Åg"'æGø³­†zþ­Ñ ÂÕ¶FYN0´_SFj*Äeì¬)?¦¼ÀÕü}à˜û¾ lƒEa¤éºg\uPà$eya¤íÏŠ/z;~µ&Þ nüaê#\mVÙ ¸6£žz©Ã®R¼_áøÁWé]ø(Gr+/§&üE=]4íFöU¦•ì>Ú2*uq§ ƒ«h ƒ«(ŠÛ\ÕëuËá×?Ä=øó ]ºÖÆžvÀU][ƒ¦Ie|I ~ˆŽF6\…qÈÌUCïã¸:ájÔ·êÊ´fq›Ú9ûd nÁÕg¸Ú¬¶þÄ.¸ª*KAvyÆà*JB ®ŠN®h¸z—gúHTÆ êÛ•ÔI>éwy¸)þÁ]Ì¿Žûù«ÿ’sù~c²ÀŠ]kpTæ]^yËÄÿW‡¿6ýœ;_à ®‚‚ƒƒßy爲Poø½ŠàóZ=½P¯m×¶6T§m†~ õ,Y¯a W)¹’t_Ea ] nÿ]!Ï 3{Óÿ6\Ý÷y#«„¸åIèvÙ³‘·?ªÎØ·¹ W+Óðë¼ÍI:ôüÃVŸÝnĘ­ ¶ðøjâÖ§ê)9½ÂUø³Ž˜ÞÄ¿Izþñ*=èü¬ß±º_ÊÔÀ,bG}ÇKX¨i4_½áiQß™½§?p‚™m×Õ¦äÐw½×WE§]ù)ó’~§ú½ßð0Åë?p•’ƒÀÕƒ¿@]S<'@UJ2ý1¸Ú«Di›™{?3ÀÕ2NÜ“¸ !mqR(>ÐL¸ f&ÍÞÅ ÿ²¯åË K2v‚7P•6ÀÕý‚c«ØæàÖÞí ƒ«N®Žfµ47Ä©põWÑ©MƆÐĽn‡Q]Kf„N· W[¬ê´-¬}_8’[\ý“z.ˆàú¸»&A%„.¦ELF¥.î4ap-apEq{…«:m=-á*Œ­è!SE'7Ø W!À®ÅŸo¯u\4Š#®îz iV€ñ¥][tCŽ|×W!Y^G²gù¸A“®ÂA–Ò×>¤½ ƒ«CDèÀÕ¦ÝÍ઺* bûž‰í†«£<ÓGˆ¼²^=Éɶ©5ºú6]ƒþÿ«c¿é›>Ê»ÀÕWï†4¾E~ênœ¹t—ñ”€ò|]Ûþ˜¬Q^yàêè?ÅhXÀU:ƒA»õsýÆ)S¦ìôó£õød:½Í›ü:WDÏWØ¥z½|ruš›$ÃÝüØ$èŒG– _¸ª,Ž•f7?.L] "Éd Þ.¸Š¬ŒÇ½}.ÙãEˆ=·?Êëz¼/oe‰uÂÕ[§ëµíüä¥È·ê†˜­U΄ „¸åÉ:Bº,w7sßÝVÆëèP•&!Û °® ïk×Kfìþ¨Ž˜ný«©ýR¦:J.kÿ,nü¯=ßø†»C40K£¦::˜û>g„~lD]jU°¨;_ï‚«ÂëGWB1R|&áVßCrg‘=_®§_&ïx‰7«>!0–¤ï4‹‹ÁÕ.‰N»"‹'“29×8±?ÑÞ#· W©¾“yI‹¡x›ÅDÔóo†\…¢³ÏYsýÅ{¢¼ \˜º†œø ³#¾–_ŽÀથiTÀ˜‘´íYñOǯÖÄ»ÁKXX}f«#pUy%|øm¸z|5ô,àÁ81soÃU9Ktj8@Gr‹ì˜ÿõB(Áí_ÐS´J‘+“¶>ÝRMB¥.î4ap-apEq‡\­§¾ !b{­m¼Qu-†Æo£¸JÌ€²}dÃը酪þF  }Ä0Žô˜Í"<ć\Í äþS]yõ’± N¸ê9A–¢±eï3¸z™q„ÁU”4tàjMy*  z&¶®zgŒ Ý»ŸJèh‹O-|ÄþÌ|ö|½¶Žý¦_Æ(ßË\M/¸’ùûÕþsãlÞ]ƳvÝDàjlö(Ÿ|®ÊFû)BîN°ú#ºÞ€¸cB#÷z‡^§Ó¶‰N»ÁpÝüØ$M“Šèa W¯”å7?q—qÑuÓxO×W÷ÏjâßìWo…€ÍŽûêÚÔ§ðëÔ6ªŒ\T×ÖÄKZ,:íjÜjâÃÖöOB‘ÂÝ»§™Î/Òë4Š’Xã¤T¿7 y@.ÂÜ;Ù§ÒêWSû¥Lµ„ P­·«…†iÕ·¶CÏ ›ƒ}³÷ôHzm<2¿«ûв¸úßÛp5uèä^òRã»ÿ¤mÏÂ)#5²K©>“ÙÑßKÒ}hþSpkîŸßaŠ‹1¸Ú%á‰uôà¡ÞYW8~ëR];Ô\õ{]pd97~A=-¯í­Ñ`ÃÕ¬@p½nH‚. Åg’¢8F”¶™—¸ˆ¸å Ã~ñáí&ïÐuÂU»¾Ð:B®·>U}vk·:ôÐùÚj½fpµ‘[f¶¤Œ5êW›aì‰_ÿ -ðmnÜϲK¡ÆZdtÝ; Wsw“ã–P3ö\ÇуÞ7®SAòl2Òò—Ëw‚0¸Š–0¸Š¢¸–ájÜüÁ†«G–Ù Wa€ 8º¢IPѸè¦ZÜÙ*—ÑÈE†|´c;\íh¯“Pý§pbçI2v6W#_—Ã`D’áW¶Åîl4ñÊ91s!b”fð«ÊRP/ r®>¨¼š€ÁU5‚áêhŸÌ‘¡¢ÙœŽÆÍÙðûÝÁeÁÊÿý¯Žó–æè…Ȳ—ïdþ%¸š·ñ¬  ®ÆåŒöÍ_&þ¿zRùãþÙÞÒ½¾è?”SÔ\µI WSRR­ød¨S’ûó])ŠN»ŠÏï@7?6 úþ¡¥ƒ W;¬ùÝ‚ŒpUUš}"²‡ò¡?p«ï‘Fš"Sè%a<ŽÀÕˆÙ-b2Åsy‡£pUÛR§º–Œ_÷€a“ ½áH=/ñ7s¸ºù uùq0zð‡¦pU§iL²Âg70‹ºÃÕÏ pÕÚÂì—2©+Oу?àÄÍk•3Z$(¨[ùGÖwEÖ;e:ËŠ,¢fØ zÈ´:rŽéñV9“ì5¡ ® R–U§mæ§üMöxÁWŸvÂUÿ)¬ð/!\¤¾ƒ[{ïp•˜a±]z½V¯× M¸*8º’øXÔ,;ê[«àªÿaêVÄ×üÃÙ·ñ k0á*øFÉEæÞ™ÆqJOÕâÎ!p•–¯®< … M¬úì6^Òb°^Z໊¢ÝVpŸ‡J±i“…!(ôáê–'ÁÓv;Þ ƒr¶Õz‘eB}uÂUöU³%e¬Ww½güÚ«ÉKñë¸ÊKú]šÜl˜V Í âv§ÁÕMcioµ×!£Š÷+0ò„JuÜQÂà*ZÂà*ŠâöW5õ´\U·ÜĽ±:ôò‚ˆ*—ÑMü g‡‹ZëL`k+\…¸”Ÿ´¿q Òûdú7‹ðÐ5ÀÐCrÑ[tb½ÝÙ€¢ãøBDñE/Î¹Š’¸«e«S‡¼"ÚWõéZ‚«ëTFêÚš0¸Š–®B«Aö"¯—!AÚž WïñË!òÏÿúj µ-¯¿)ì*kÔÖsÞ Ìº' h³ò|Váý&ðJ@í?åç î3žRQ k‹ˆÏ½Ç¿`¹Ä¬À´‰I¹è?”34,àê0Wm:E¯i±o±S3!ïä^ôï§(:#nÁñÕ¸ÕwK3Œ»J¥m©…4pUJƒa)ÅëNÌ\ü†‡WaÔÏ_Ю>·è W {^‡±öQOÉ1…«¬ÈoÕ§­/™~)SÍõ£ð¼œ¸y-ÕDuÅ)fاÆãÍ‚JŠÏDzà; ôgY‘á*-ð:bºéñVƒä>¾w¸êriÛ³ôàºà*#tº4'˜ú1~ýC½ÀÕð¯Ô•§í`#6?K{s“ ¢UÁa³Y#®žXÍнˇ²®6Èż,ÀUõÍ’t_°áZÜ9ú®÷ŒpÚ>Åë?P楛†juÄ NÌŽlv<„>\Ýü¸èd·¡¢,7j¡ElÛ òœRNìO’ ?cC¨§æÙñå‚òJ<øØZü¹3¸š¼Dšd4çÂUd=jŸ‰Æž ƒ«ƒ& ®¢% ®¢(nopü$ÄCÜ5(ßh#²®Ê/GpþÒȺ¢mªQ–ÄU¹ŒoOp×Äw¦ç„2ëëÚ›œøÈ¶ÃU-Œ5pkïCzŸLˆó›x×a¨3D†vg£®îÿ¢úÌVvÔ÷òü}ZÑý ªR’±³×†@š: tëïW1¸:L5ÈpâF0욊“¤‡1u/N‡«æ`ÙÂàªsEòx± ®ŠÏm‡¾L7ðœÇYd¸ªÓ´ÂxÖ)ü¹–pQ|Ñ[]™¦¼r´í™êsÛq«ï®>í¦iRu¥1ÂUÜê{ ïA ÉýyÜšûà_È¡\e†}Šßð°9\UrÀz¡¸Ú® ¯Q–&±´!W!¨¦ù¿i\¥ízW|΃1ƒ«=e\ÅŸ§½¯*;,Í w¡úL¢øN†aWY¸jØ»°ÛP’’‹Þ6ÃUv)T‡$Ó~¸ Ž b\5 ôºà*#äCðÿ]pµYXÅKü±û#½3Ã{…«Tÿ7 nÑY–çŽWÑWQwèÀÕ–zŠÏ$~Êß¶ÂUÙ¥=ì?܆«o_å2ºYäÄi·qÁ@ºx'>²ÍpU§5lXp·àè Iº<²ø‚'ôqÈÛ4ÉKìΆ)\…@/ZÑý5ý²èÔ¦¾V'€a, ÄXá_Js‚ŒÃ1+¥iI³1¸Šº®6 *!ZS^MàÃè)à­…«ã‚r1l /¸ªÕé ._¾ÔÇOaa!Fƒ4(z¢ç+Í"¼ñwñy®‡lt¸Ú}´èäÇsn„«æ©®§¶=%_årD_šEWšN¸ºæ^NìO­J;ê;šÿ›Ü„…\-‰Óšì‹d½Œp·îV]¯×60‘ykÌ}Ÿ ¯6.…gWwþ׸ÁÑQkä’ ?®Ó)^¯tÜúöœ3W}ó„õK2Z WÙÑs¹e57S»àªàÈr¦qT¿×®úO13°)à:Îð:?½óJ2v Ž®$n} ·ö>¨PŠ×Ìà*ó„cÍàj«‚Í™e;p¢5Sű,u(ÂÕÄÅT¤œÏ×Sr!¦‡|¨(‰µ Wé»Þ_ðâDÏÁàjOuÂÕ°Æí0z <$Ý·‰{Ú2#ôc\Ý~€ð6˜®¼`?WYF¸êúx0Óã’‹Þ0Š´®ÆþCEàj›ürD/puÏÇüÃuÁÕzJŽqGö23ÂUZf$<~\¥¾ÓÀ,v–ßÓwè›E8ÓU‚1u ƒ«h ƒ«(Š;„àjt©Ü„_ÛltP²œvÄìFa7¸ºjT9[§qZ‹†ˆ«:ms_Ó)í¼¦ÍpUCÚúT•ËhÁ1è¡k€,±#¾våüÅîl p5zkÿprœ²›¤#j »(¯Ä÷ú)Œ­d¹!üä%\5 Ǭ”¦^&ÉôÃà*êl¸Ê/çÆ/€@Ž—ø›9\½q †ð=O±®>µ;ÓÈÖð‚«ÐÖúÝÓêõ×_OIIÑéÑÙÙèõj³ˆ`üÝ8ÐÓŸ]K†=\%¦×Ü<ÑW9±ó4&;vÂÕµ÷CtѦâsšÀÕX{áj­òjnÝ-Rš^¯•fú‹ÏyÀ8· ®Âq^òâæÇUe)ðÕ÷¿0‡@Tuí|Ú^+ á¶,/Œìùr×eÁÃ3·~IÆ~)“²4‰ºó5®²¯ªÊ#pµ£CÛ¬†_ óTßÉ0ê‹êQ\u`]p»Úª3¦Ç[¤TÂÆ±uÄt#àÆý,Í ¤,#ny¿áa¨Pˆ¥¸Ê)¥ïzŠKšÄŽú–à:®'\¥‡L$¸ªâ! Y¸Êÿ•âýªº* œ˜¹ŒÝ)Š¢{ÂÕV)õ]'\ ú ˜7ä>)Õ!¿ËÃ`ÂU´ÀYÁ€Y±­·Т¸Ê¿YGÊdîý¬¦â$4:iN0}÷4hþŠÂ(Ó/z0¸ê :áêÆ±¼¤ßMCUŸÝÖ×ìâ¾>™7œpçX›’c7\­)OmU°À Àíàê']p¼ÐY@ž¸ê@T Í $Å,¢çƃ{¼ Ww½+8²î«×:¡Fàñ¡_Vß\EbûZ‚ëcøõ S×ÂȨQ(JscîýúÎìÎF³˜ù5WOm¢(:í6ÐuÝO~èü”¿EQ½~*:í A¯àèJÛáªT’áV-»ªkkÄà*Zl¸Ê½c%¨t^‚9\U•2ŽÙÍd7\¿·ÓÈÖð‚«ZnÑ¢Eo¼ñFFF†éœÕ]AA&L8vüxjjê/ Àïo@ôžÜt ®ÂèO|ÁúqTrb‡:áêîéö6ÃÕv® O¬s|c#\­#e©«Î¶?‹¬­êrsßçÆÍ>Œ2ÂUüúy‰‹ÚÕ"â”oóŒpµ8Fk²€€õÒ6«¡ûÆ­{À8v†ƒ—¼¼·áª„Âÿ•èöoeI|JÞñR#ë WK“ j«áWŸÙBpE排w܆««šëGMŒµ¬þáêÕŠïdvä7õôËpkfØ ½^gXpunõ=¯ PtgW]Ò4È¡Óá¦jS¸ÚÑ¥g W9æJ³w Ž p *”ìñ¢®^ã¤øL†î7JM¸ªärb² ®ÖÓò ì…=E y#ïxQ]yÚWì ®¶)9lwÂÕ©H\‘¸˜äþü°ØBw0áj›Z#&FèÇܲ^@“¤ûB C³ ¡Q/ÁЯUÎdẼÀU“Žƒ«JÓ€ÀUüƱàÌM‹NmÜе2•2ÂUyþ¾ªU£ñë„ÞÄÖóºà*øyÕÕDp_¼¤Å\ ›!<æƒúfabBg·U¹Œv®J2ýI1¿Ñó’ˆ[ž¢úN6®S ŽšmÍÍT§|™ }%¸x"—"„þQS/ƒŽ~ ía0…ÁU´„ÁUÅí®¶7©«Òpkïg†}:Äá*øIIºcÏ'õ”\è>º¾J!3ìÚs¡WÁõE§ÝÔÝç8zM[à*Äö6=Šß8‚ñyˆI [„g‡î’ñµÞÞW£âäÕ¼“hœï3?ôègey{{ý‚EqŒú_{á*ôã\EQƒWËØQßA´Ö \½–ܵ ´©ì†«¯„_Æ4‚51²pÅ bÐà*Ä´Ó§O_·nÙq¸ô´iÓ¶lݪïè€`Ö¬Yß~÷*ÞàÿÙ;¸¦®öS»‡vؽkk­ÕÚÚ¡Öî½ìP»«¶u"à ‚€,EDÁ…‚ЏPÅ(nD²÷NHB†° ïûþ'c +ØþÃçùø‰É½7çž{îóüžoÎ}#h¸áò´™â#Ñê}þö>ºâBkªÑË“'ó#F•ìèÁîöÂÕæº*ÕNå¶é½Gaô½êÌ€*ÞÑz-I7Ü#rXDÿÆr•Å×QpõvYò¤ÆJuÑ®¹Hrå›~cxõ×åÄYÎ+³ã eÈ@¡-É”¡–&eÚ ÔzJ‘úW½NØJJd³¥I™¾õ'”i3Y~W‹òDq!Çöõz1%ð,áª|ÓäÒs›šlæ½ÝÃÕSë8C ‹ª8GÚàjK2q¦éÑ!ö¢'+YYŽKPwUüœÆ«ËÈ7Vj ÂÑ è 󃱂E%\'|{‡Ì\õÈœ3å÷™£ð46#Ë-ù?¥;¶\¶áGæÜûŠvϳŒ€mpõÂ'ÀU|—8þ3»à*6.Úãg]èÆµkÄgÐ6HhöÂÇË/íè®–Ê$k¾¢F  jŒþäjt)z˜Ü8&¸ŠŒÉX®EÐzmÁÕ¼D²”R“ªÃP-fõ#/\º½p•<í˜0®$o-ü0kÞƒöNdÂöŇ#¹Kž× EN'ßô+’>†÷ñªÏU;¼5Y!5’³%§Ö±ýŸ"p5â5Û}{{»®¥Þ.>ëýñx‡<)ƒî…£.ÎŽìMmØVSÜ)Ú=·O=žóÍ W]en¸êB“vW¡%Ê.l¥Í¼‰9Ú ¿h·}i]%4!‚¬]p{‘Â>‘c*èû öµÙf¸j{i•ìƒÊmÓ:\þ¦Çf\mn¬æ‡¶‡lVg,€¯`ì#p5êuéÚo…±ï´'ɸŽäÙŠRi×G¦à*Uë†ðí¤‰Î¹â¶‡Ÿ€D¦ÃO)¸Šø ©€lËöúáê5bN‡«§1¶‹vÏ—­ÿ¡OáêŸyÚ/2x/®>é¶«}—-ýû„ªƒÐÊœWáâFŒ1mútc»GV½¼¼ž}öÙê’ DEE <Ø%Þ€¾d¤®’E3›K°^û­¯òƒ«Ð¥ç6CBÔHδšŠ¸:õ:Ö‚GJå–_W|dU&ˆÔ\:¶œÀÕ­S‘÷®â«Ñ yÊ1̹÷uWñQY~š`Ùˆø%§ÖêŽÇ)R§˜àj?î’+?(¶ü…Ác{“º¥Løv¤áÐ!–ºãñ˜·ÐçÔÜ*†÷ì…C}9v,•î–%Oª‘œµ|³±R#IüF’0ÒÅ Ëo»|-M5â3–pUû®þÄjåÖih› ®>DÖÅ^<i†«ê}þÜàáE{æ[ÃÕðW!¨¸|øøñã]â hKÇÔêuù¥]Ȳqú¤%=0'ÃU$nÊí³ CìÍd­¬¼p· êuqü§\%³IsVtW«´ÈÇ.[M%òªxG ÞL›ÉðÒ3qE­>N›y3T‡±©½Ç^ô$’\ù¦_ëÔ„±›àêw9ÅG–)¶üMŸ}Œ6ãéÚo[ÿVn›]ÚÃUÕoýÉ5–O%tmÝR&ÝñËpµ ]w,–1ª¥¾š<Œª ëö7k{ ÚR²æëñË7­$I$‰ß\W›ê«xÇè^ýË vàuKSµà—bëTº×\Dú‡ÀU G÷1Þ¤–Rg.F¯^ W…Ü çœWùø.nè‹ì­sªmBÅG¢åÉ“ªù9}×*$8üÈQE»|¹ACÞw!ñ1ÃÕ¢=~e¶àµåöWÁÕåï$ç\]þ^†Maì;¤p´=Ë8Í\W_«âmÿi–‡áªÎX€o†T õîq†÷VpµŠsXºîûPŘÍÅpõh4gñ3œ€A꽋Ï-­„1Ž“®hïš®&|Qzn3ñæ_g,§Ûb¤æÌ¡pî’çÕûàâÄ«>‡1ç܇ۭh÷<Í`¼¯Þ»o¶ÁÕžþZaliÔd³×þ*8ž —È {™zw1ÝóvíÁP\-Ì«ŸîÌOÖªÂØwÑ`«¢ÙöšîØ yòäÎ&{ÿCÍ W]en¸êB“vWë*ËΧҽîà‡½rÃUäˆÑ¼¥/i³#JϧÀ¹™á*qtåx„“2#ùæßÐ-]ofliBƒ¦m¬ì~HÛWëËØ ÇɪvúPp•·t$²$~ähòÓùÕ»ØW+Y…1ï–½!Ûø3ë¿`ÙXç\ñNÛc‚«ªôÙ- 5µÊ¢ŒM©%tWQ†ŸöPX]pµRƒä‚á5é!F¸®ºÊœWs!ἸºèÉ«àjÞZ}^Rû]z Wa‡åSOkç0kðÝöï0_FÍ´|ø Ë?ÿüsþŋԧÍ--Hº]å iK_7ÃÕJæ~Íþ *ö¡ö›!ªB!PùàµcN†«è¨ùæß›jl]¹©C+¿´ƒ9ÊWÉ<ÉæÚr²4ÉÔëX~˜¡©«D“BÁÕ¶7ÍE{2¼ïÔXb;É´4Ó¢ÕK \å66ÕK“&0çÜK›q£lÃÔŠÕujòk¶ÿS¦õ£¡Ï¾ý \MýK‘ú'viƒ«¡pu§þÄjÛõ^÷p5g7d„tíweç· ÁP˜-õÕìEOà{¹ÁÃÈÌU‡®mJšt>WÑÊòÍzPºþœ»%\miªÃ=B÷ê_va ’}4 ;–]Ø 5ˆKà xÍCQpU¼êsỨȃê†R×ÂÕ:-—µàQ†÷]¬•ß4TØDæ‹Dãô«¸Gú®U„Üø¯ ¢ßd-xÌ®*·MGwíô±Üž‚«±“¢äùmpUMà*™Þ5ÚÕ®ŠUN3gÃÕm3à+;òçE»æ"ÝC7VZKAÕ†Ï]n¸êXƒ»Ö‹åaøÜMÖ<µŽZ×ã\’4Án¸*8!YýeyÁøCdŽºãq¶/&Hb=wÉP¤rp_¢¸ñ/kÞƒšýšÌ@Õ®¹Ø€ü”6½?ü»ªZ¼¥&+˜³þ ®âN§ÞÇ=ŽÈB~±íȪ¾E{ü:{ê¿VqIó¶UEë˜îh,Æy'Ûù#¤ïÌ W]en¸êB“ZÀUcsCKƒÁØÜØl(+=» ®Ï™p•ás½pµ^'R¤üÁ]ò¼håÇPnxm†«ª^ evTèÚ*è²?—žMîz3„ŒâÃQˆçÝÓN¸Z[rj­ r 7h¨îØrè72W!õOœ;¼:4Œ¡]MrûàjÔëðêtÏÛøa¯töìƒsŒ‚«hySM ¢ ©x`!À(¸Š˜ˆ”‡šëb£A]¨3°>&Kþ!Ò W]eΆ«üä›Òõß·‡«H*‘’·ß¥7p5§ŸrRãÃ0ÌçÔ»œ º­÷†ëèE«™rB«ìªªXáYû WÍVc0T×Ô´¯¿êB+ Û æ¶yÞQäSå´=í7“®û–Õ¬éÉ õ}gÿP¸Zva+/ìeñªÏ R²» ®&N»Ž9÷~3\… +=»’À ®â1|îê5\½©‚¾i/õlfáÔëÌpµVEÇ›ÜàaíàêDù¦É¦Ò|d.mÆÈ¸Í‡Uï]¤Ë‰³}º`·”©øÈ2\Vù¦_KN¯Ó å-}©¹¾Šé{Oá´~üˆQ¬•ìpìX‚ª³šæ×1\m4 ÷ÌpÊYÿYYþ¶^ÀÕÕ΀«.kþäpAì§ ¶ÍCk¥Iû5àÄÑQN¦I#qk”_Ú!]÷hå'È)0þõÇã,·Ç“&ç>ËYüŒhŇùÅ: [´âƒº"R§ò‚th yò$¼où¼Õ5b΄«uZ.5÷£Ãmpuû¬ö¥ÛŠöÌgøÜT«¹îÊIn¸ÚK#p5'Ù"¼7ä3\Eê'YóUÝp5Ž¥‚¶‡6ýñªÏtGcí Í\Å­§Ü>)ž`ÙøÍ“%OÂûšÌÅÈßñBžòü?FQ­è ®"‡ Et³­a«2m†j‡wgtk$gIaðôÙvá‹« Y·±¥øhŒ$q27\u•¹áª MjWk‹ÌýÐc®«µð¢P)vy§:5 œÀÕ¸ }…±ï˜á*ÄRÏ];« ÙW+Ô ôY·B t{L;áªA<^²æRà|*d "yòdNàAÔXDŸöE°í‚«:’5_ÓgÝ‚œ¢÷‹÷Æ(¸*Où½±\Eàê²7ÚÃU$wHyˆÙ~XW÷.BÖ&I×l(uÃUW™óà*ÔJs#†7kÁ£’į­àª±¹^wl¹>wUû{ WýϨ|™µ_í½ºþÜð„¼çãO¸íŸn¸Ž¯m8?á Ô‡aˆ»Ôé„«\½íRÄ{uÛÕ¢SpìÖÞ‘®ý¶äô:7\u\-=— } 95Å3 \=±š>ûv†÷fÉTÁÈD¶ËœsoÁÕòÂ]’„/ 9 Öº…«’Õã°iJáǮμ ÂÀ|Xõ¾]Î Ûõ^Oàj]%¾”áÕ"“½è ‡ÃÕ’SëQ¯wWå›&k›ž\%uY×|öô ®B@âÍ–¦>_ݾNÍbx€6fF½Û`ÛcmVˆhå'•Ìý}×*t Ëï‘Âiý ¨ùa¯”]ØZv1M¶á'ÑŠY F¿‰f[nßP*“oú ÷ Ä*z¸NË'Œ«‘œÁ}Ä^ø)û®*Ýó\•Æ©pUÍ’§üÑ5\%´ªÝT@Mf >*¿¸ãÜü¦®öÒÚà*)lr=sÞƒf¸Êz·˜U5’n­Šw 7¤5mÆÒ¤ Úƒaö®or®n›†ûN°l¬ ú ^èÜ\\Åý¨ÙˆYsè;¸ŠX¯w{cS½bËßþ@Yµ W9F¹mF‡hsCu}‰yŠÃWKt­¹áª«Ì W]hR ¸Z^¸»(ÃÓEpµœ6ý׆vµC»0HqHnŽÿSðltÏÛØO›áªóÚôëÅ«>“­û^’øpù{íá*ô€îh¬-i2e¶ÂÕÍ¿–œ\Ù€¬}Îô¹‡9ïAqÂÐÆå=ºâ]]”“‰í TvWÉšùÛ¬à*òqe)VÉ z½G›y3tN}1Ÿ‚«%yIPõÚCaŇ£ ² ¸ æã¸šÙÒè¸ê5 pZ?FØëõe6ÁU\VQ܇•ŒÌ¾kUKS:”ËðCÿ—ßRv1M¾ù7ÑŠ˜sïǽF1(³¸šò‡>/Qw|¥$i<WE+?Æ8©S³¡4Öö ©SiG~̵æL¸Z[ÄÀíÓ \Ýå‹ÁlõüsÎÀò‚tË9n¸ÚK£à*üùÍ÷]ÎJc‹ ®†¿*Œ}·F”g×Ñ®‚«ë¿×f…Ø»¾¡®"¢áfá…¾Žæ)·MÇÐd.FêªÙX´g>Ûÿ)GÁUnàáå¨aú)j€2ÝÓJÐ\W)Où½Ã*æáGŽ–§L±ëiJ k­äÂÛ 3‘Œ;¼æŒkÍ W]en¸êB“ZÂÕ‚E;} d\Wù£lWÈ0ƒ¢€TèZø?ìÈ6šie¼àªØ5 jVš8¾[PÙX¡V¦ÍD. Mš`ìîI+ûàj}µö@0âQ“¡Ô ,Tn¦Ë!µ¯9‹Ÿ&DlªâY—ýGê$ßü{IGU%- ²\ûŽ j,Òú¬[D+>ì,‚8Ç\}Wóv}^ó–¾d™KÊ6üXv>U{0¬pÁZ´òäŒMÕ:7\u•9 ®äÕ 1–Ó cßFVÎ^ô„®j³#àâŠvÏk¿cÏàê”SÚO÷p]ÎÝÖw6átJnÇXàš‚«¸Å 4qâDˆ«A]þaK×zƒKË>©Ñð©×uj–æ@°>7¡ýf.‡«¤¸ši•B’g„×}ç4¸ÚP"A@—mü¹¡¼'`ÓlÜ ¡Wàj}Bªé‘í»Ìpµøh dU;¸Ú¢=Μ{Ñ?Ûž¦´¶¦*-H›ySÙù--ødÚŒ Ö$Iã Òóurm¸kNà³d)+ȹi×›ê!Zñdõ8H”áª6;¼øÈ2Ûðn)“öàR~ÔëHðuÇbÕ ¸!/Ô눈 P ì9vmScs£.'ŽþŠÕ#ðÃÕ:²à¬®6”J¥k'V²)·Ï$puÉóœÀ!¼°—‘æCÉK'ÐfÞ\znss]%é¥Ã‘¸²%§ÖQk¢]†«N€«µE Hô©×уGÖÛV™rWýfEauBc­­È;ГQ䊇½‚ħìbš"õOÓ£p[þ²ÚÅ Wõ¹ñ÷ ê´<~ähÜ,¸(¸_p(ºçm¤zäÆ_ª'(„u˜3á*yr<þ3^ȈçxSpµhÏüö ZñáeÌ9÷¹áªc Ž,Ì9~•ás·îh¬±¥ w=oéH(äê^ÀU„$õÞEö®oHUi#p5õOö¢§­ –E«L›ÌŽÀÕÔ?‘¯!ã–§ü.Œy»çpµ‘ÀUöú)‚Ü-Üáæõš•Û¦Á["ÜØ²rGS•N–<‰ÀÕNê™T02ùa/Ë7ý /דv¶¶Vqˆ¾$ŽG&îðÇ"\kn¸ê*sÃUšÔ®B.*·Í¨(ÜÝTSBæ6á<ãt¸úZ½ÞŽé¦9«¬ñ–¾D˜ªI‡Ã^ýÙþƒHÝ;ëlwfd-×ÕãJò»Þ Ò A$ ‰ã-ŸjéÐì‚«ÍõÕaÚCa̵*†bëTmvYl×ô»/ä…öuã ŠÙ†Ÿô':ÈU- WœÀÌeoˆW}ŽpïZ SA߇ŒUóÒJæ~Ék®´Gºþ{ä臞ÀÕÁ²uß#EBŠç†«®2çÁUÙeÚL$›Ð“P,áWÁÕCa,¿GWçqê_\sÚåÐm}gc’ó=/YÏ´¡ìš‚«ˆé1±±iii [·mÛ´ys‡†›\\° úóM[ÞT¯åi³B:,W.MšXrÊ•p1¨h×뉅ÅiÒdˆÚCá=X&Ø^¸Z¯#}“mè-\%³C¾ ®^ØÊ^ø„%\Uï]Èœ÷ båUsû[[ÊP8Úìðž­‡Ž^*ÚãG›q´YKƒ µ ¸A/}S#9[«,”®ÿîy+'pˆùWrÊ1o‰V~,Žÿì2\½Yý¦ù°ÅG£‹³#l_à²[Ê¤É AÈ@ø(>S”áÇ fP"”p— U¤LA· Ç8ºZk‹DCÄV\=K©:’zyÊWÃÕÊÒs›Ípµ^'2­rX¹}Ó÷^ÈnÐsv- 5¸²²õ?ÒfÝRv>ÕW#ŠGíž+Yý%Ž@FT1×ÝIpUÅ0]ÊëèÏÕÛFæ5û‘cÊ/íì«Vµ+Õh†?üU K²4ØÖ¿Å«Ç1çܧJ÷´Ú¥¹®¢‚¾× ¿¨?™ˆ›÷ ú9·Ã÷SÒá5€å÷°æÀ'³µÝœ WË/íâ-}™<¼ÃŸ!T;}¾w«3¶O0áÿ™sïwÃUÇZ}‰¤øh¬©ÒË} Ÿ»áÖŒ-Mð ð9½ƒ«7)¶ü —ÞuìÌËUE{æ# É7ÿŽ&qüñB_Â}'V|dR]ÙÆ_4™ å…»‘ãÛ•ëYÎΓ»iºðd?ìáò÷©÷•Û¦#Û…k­Ópmh­¹6_gQ¯‚¶=‰t»ýÒ'6™ ®ŠV|(Yó5)NâÐ_î\nn¸ê*sÃUšÔWMuð´eçSà=Ê v4UëÈðÃ^f/xìW™sïã27\u•¹áª Mj‚«uEäy7È]Yò$„Â6¸ñ‚£“àjkkS•¶'pUvÞWï‡s¶”â¦J¤¯C&¹®þFàêê/»4k/\Ulª?±/ 1)S2€Xóâ,~¹¢Ý"˶ÃUÑÊ‘c¶àŠK×}[-8^~i—4!J"GC«5Ê/í4=–õ¡&3 ¼ ½C¸Šø«É ±=!@ãìpXUúl„ò†2¹B¡pÃU—˜Óàjµ(·!¼ }Ö-¸A Ü˜¾÷àÒSŸºáªÛz`¸Ê¶k®¶§Ïœ‰‹‹ -2E·k÷n}Io‚c]þìÇozøŸæ„¯LL÷üàA~¯.ã6¶mÐ¤ØøÑ­7½ôGdrÚ¦Øé£n÷¸qlœ Éú8Ë¿©Ñ¶ÍGj(Sj²Bµ—¶ÿ:$dQ×ÁUSD«Çÿ)¸Jj-}©ìü{i?\É7ý*]÷]¥“Ú[ñ‘höÂÇ¥I·šHªâSlù›>ófêÈM†RÅÖiÜàaÂè7g­v'üp¤]µñÍf†«%'×4×UðÃ_Cï1ç܋󪑜…‰ã?£{ÞŽDÕ®šô‰hÅ‚è7 §õ£{ÞŠ!a>,ÆäPmÓÆftW÷ bÞVíðÆaUé^ГUìCäÛ—½¡ÚéCòßs)\®9°¤3¸ªÜ6í©æ§Þl6”éóé³ï(ÉKjiª«U1dÉ¿TñrÐ0D4~Ä(‚)¢ß„tï®BF²ýŸ‚j®«2È.@@âŽëë5LÆæñiêRÒæ=RoÛÒck uà$a(Õ²ü´é¹¶Vµ4×1è³oG«JòIÊp6†ë.Où©ÙØÅ¡*Ù‡ˆ× MÕ-nÒd3|î¢{ Í¸‘6ãÚôëÿÿÂÕVcqvnR ÅÒ³›0Ò¬6 õ½úcT·ß·ôôÖ¼+™,ï/8(ÂÁŠºç`ײ¹®Æ¾ƒL™Üò‡Âѽ e \ ~äh³o±Åi’ßÝÂ_5Èòi3o†ãB^Å?Þí£š–FÁUÜbpª8sÞ\-ÊðÓ_©Þ»P’4^“¹©îe¸Z`ÿY·›¡®ÀÕˆ×WRŸ" 1|ïA:iËœXDÉê¯ä›ïŒN ˜Ê˜ /ד d‚«d‚Óò÷9Oã–qÉ é#sÃUW™®ºÐ¤&¸Z~1­VQ W/á ¸jl,S¸ö²]«PÕˆÏH×NdνñÂRŠC’9®"¿ëTšáª8a\·ë'ÚWk+pä’3šë«êMµ×Ô{I’&0çÜG~õ Ú¾N‹íp§Æ%Œy‹íÿ$ÆD;dOûKßR_·Z_ ’uн^ç°ß” \Ý:M÷‘z_ÙÅ´vpõ;ˆm]NœpµÕˆœ…9÷ÙºïR™¾ë´\¹\ꆫ.1çÁUáIñªÏ¨gH9‹ŸDeøÜ톫nëýãà*ôÕ„ ÌEV/¶šâ>^GFFöâþj)ãótW`i#7|¨‡Ç &5êi~OzÜòÑV 5[ըϜ0Àãig­]îŸok´m¿J0+´ÃŒ 9W“ýÞ;ÊkHIÆó)–ošá*wÉóÝÖ6ooöÂU2GqãÏ<–±¦Í7ýŠú5ÌØÒÜX¡®œ Ï¾Jq^ªôÙÂR§º=\E¸× ³ëGp³áížK›q£îx\Su1?üš©Úé$ºFt ¹6ݫیV ãGŽ,{Cý&þ…?·‚«%§7¨3©*¶X·”I½Ï_û.ÒuæbeÚL$¼å—v!wFnŽÄŸú"´¥µqSU1¾‡­ eX¾OÁUUº§f ¹$4­îx<}öú«[ë¨mªùÇËØ D!ucÞ†ì1ÃU²öºir,®«ÛçלiNƒ«Íu•èî’¡ºœEÕº`®úÞ£=ÚA#Iýç‡*YY–pÛ´Tº¼{c®‡«Ëß3­5B³ º¹67xYG¯Ý‚]XùÅtdüðWkUtø–â#Ëภ7×UØ~†R™j§/"7è9D(sî’aðíð®pn®®ù ¾Ž¢Çpµ¹¶¼¼ ½Šwì \-^õ9õ)üF „<§Ùý 2ÈóÅñŸÉ’'uVy½*Yý¥]s€¯Xk+©€·ô%aÌ;¬v»¶Ë?ËÜpÕUÖ3¸ _Mܵ‹ž\þטÔW‘ÎTî.> õXrf”^É©µÐ·Î„« erÚô¸ÁÃíª«5.[ÿsî Ÿ»ú®âPÂåï#¿ëz3d+òäÉ&¸úE·EØì„«å„+æoƒZ#Eõ7ýõ‚ëÅœs/D 'pHû:-¶ÂÕ‚t«$yA¤“®ýV±åo¿}µ(dFºc±øÔòM_‘:Ų§üÒNˆRQÜGª^ÐÕ–+0┑)èsãm‡«Ãe¶Råd5™ÿAY¾\*rÃU—˜óà*ÿ8F5͉½àQAÔX¤íH¬f¶šªêAûáªÛì²\5¶¶úùù 4hûöíR©tðàÁ\m1úé§÷?øÀ5W+~v“ǽSN›œj³dù ¯§hŒ—7(ß÷ñϲê¯ÞëBìµ Y?L¯IwûK¶ûRÿµ4^ì²}!z9§ýG}nº¢R9K}j3+`°âè*ËŠøñ_ ܳ=%ß¿ÔÞ#Ó ‚+ïèµeYY±ª³í‹¹g«ÇóW}U,ÈïÍIw/b̽ŸŸðu±ðÊqJKŠé^t¢Kx­)<(ÞêÉ[ù7æ=é®…V»Ëöã2éD=øj\AqÊTÚŒeûÃðšòbá¬[¹Ë?’¤ÏUdª ös#ÆÀKs"ÆXÁUlÉ }™ö7âušçm´Y·bH˜«ÈY#IŸ£eåÚÚ2™P$êbÉvnÔ[’4oV”ü;sþCÊc«k¾ãÅ}&ÙéÇ~Qq4¡×ËAc ]!Iób=¯:™lù¾–}B¸öGÑæ¿%;æ«ó÷´m¬â^ yÞ.?]ªSkÇë~B׉Ӽ™ ž@±ƒGp#ÇbË­Rô=y>ýTji±J–(Ë$ý@÷¾‹õ¦t§Ÿ`ÍDŒœfiq‘£Î¥CC_]ØÕv5gÝVlfÝšxË ¦ß£èjG5£èüNœ¬¹“Ñ*õÅ}K„æ®çF¿«8¯8¼B¼Í }Î\ð¸,3´ÛcâFàF¿ƒäE´~}ö¬ aŒ9N'Ë´‰’ÿ(QKû´cí²n‡½£L/.­ÿ…8Æ€g0ÌT¹ëJ‹„–ˆ’§Ð}ï•îYÜ~_Õ‰ŒyÝ^ZrÅ7â2aÜâvpyöƘ,–Fë0§a—éÄ…ÌܸÏ8+¿Â¿’óнÅü³¬ÅCàWÕ÷Ú~(å‰ ßìБZÎIÚÌ[äYQŒ9÷*F•¨ìZ4¸ÅÈò(ó¦N§Ï¾å?ˆ»âSÉž@¸5Išo : Áˆ\zÆ1ûO™&HüN¶©t×úº?é‡6rÂ^åÇ}F}Š ûÜÃ[ñ±–u¼ÛCihyÑïÂ[óÎt¸âP :„÷©ÙKÛgeeª¼ÍäZDŒa̹G+++uÉ8é c2™®öÿÏM®Pð;÷*+a.á/í\ˆºÍc0™ZµJ˜ô"+AzU‘½\¯àáîæD¼Ýå@Ù•••‹N¿žð¬¥àïÖˆãMü–1ç>µ°ìe)ÎZü,ÚTH¯ö°IW›âÈJP¶?¼ëÍŠùçàÉdŒˆÑ:ZVYIW½§T©¸<ž ()’ðã>UæmƘ×É9ÐÌPžü•ŸÑ}îfÎ{ˆåÿ4Ä¿Õ.ZÆQAÂ7ˆ}]Yy|-®;49'|;h?~/ìU^ôÛÐíV["îœf”•êÍoB±Cÿ;Pö@úŠSgðbÞmüWÇòà¼åaù¡X$}z¶M]§U(²c¡{yÑï`/Ö’4™,zA‘ÚúÝæ³kØ÷ÆÔùÜeoÁ«Ðg÷‡üㄎ¤Í¼I´úk½„†O¥;æáM7\µÏ.D•ÿ‡wâÜp—·ÄEöÏ‚«8Ä+¯¼J&•–•™á*,~Õª¡C‡V×8jbU=mÁ“¯%*LSU y¿ÞãqçO'ªÍÔ]ð|Øã–/W]½ã¹Ø‰búi•éO)æ ¶Ïçmš¦j÷Ç^öŽ`g€œWÐþ£¾þ“1N öÇpÖýFŸ÷03êªè'8Ë?%%@ç>ÈO›cï‘/\¸ •É®yZ˜“,>·¯Ó–CjÌYñ¾×Þï²üãoõF^ɉûBÎ8i~S©Ò½Ș§ðZt$‰¿Å‹—ô;ú}~Ú\«Ý;ýÛçÉM[Úû'ç^ä®›\8ýFþN9ë,+d$9õê‰üm¾’Ó;$yiÌ%/м°#ƶýJ¾äyjb!3`3h+ôVØh ®rb>4V|x5?e¦4ÿ€Íàp¹¾]l€£±#ßâ§zb4rÖü@÷(ÜÎ]û gå—‚ Y¡¯ŠÄ(¥Âô@‡rö9^ò_Ì€gE‡â-ßÇq×|ÏÛ8…¿ÕC½©Ð;¡„{—*e"É™]ܤŸ¤g÷à’1>….B²ÂÇ`K¥„ÏMú™6óñ±õJ©{ñ·ÏgÇ}ÞC7¢Ï9«¾¡Ï¹'ëÀséðíçn¦®é¥é7àž²e/ÞúßHÏï_æ¨f  ¼ä¿EÙ æV‰Ž®¥àªøh'æ|—0#”Ÿ:‹Ÿ2ƒ¹èi\ôn)gžÆm™±A›ukɦÿ`šiÐr×NRYŽj|ïÿ0ì™]{GýIÎe°c>"èlÑÓ¼”™ü´ù’s{-7à­›Œ‡ÙÁ¾9àN%'·(•ò+ožN‡—]Ìîó¦÷å_þÅ‹b‰Ä%_-gìZÌßø‡,7™¿y:B€R!“^<ÄXô 3è³o±åO”½ .š¹d„´à0|‹(3’æ}‹œwÉŽö0Oó6ÕI  ÷,)œÞ>ïaIÆÅÙ’Ã ðH,¸ß-^ˆøÒs{¹‰?HÎì¶ÿ”ÏrV‡lào›s)qÊÅÌ$ÖÒ×8±SŸBi ²¢Þ–^ØoÞE!KÙùRÎE«CIN¥Á£râ¿’]:Úáw w±ÃFqb?‘œHµ·¦?¥øèZÆ‚'˜Á/·'á¸Gǹÿ0ì%.öÿÏÿx<N·s'%Ó4AÚ\9'¿OÚôÿæ/??_P˜G„´ô¦i¬ˆ7„{ÃäÜÈ6vÌp¡J¹Ø ÍP*—Ð'Lÿg,·–ðŸtß{ I™£›Ìp•¹x(;êm¤Bv9ü.þDû—±ÂF w/éz3’þÄE}òÈJü©D ‚ÂÂB‘ÆŽ|[’»‚PÁ§Aó6üÁŽù6»?N¢Zt ÚjéÙÝìØ{‚»>²(k9Ä!â3äeÈrd‹ä˜ ž„·Ú§Ãß2›1ÖR1òRgAUJ/´ñDºýIÄÝÍŽzi…p4ð4?Ëü)šŠ p²ˆ˜RÛ®œOCBDtoØhAڅǃ¸rÃUû̸ºêl€þ¿5|ú+.omØ? ®VUW<8sÿþöpuMbâ!CWe>¼Í£ÿ×»´ÔTÕªì/nöxpÆyƒy›¦ÿ ·v•^½c~Âäšâ¶ê-µÚƒKU;¼Ú_´âƒâ#Ëì]’Ø!V«,Tï]$^ù sîýºãñ–™Ë0çÞW”a½öM·fU ZxR± äô†Î¶¯+bÉÖÿ YóM/kât>w™ËPflidι—<öØÚªÏKÒd…GcVÙ¾,€îX,ÞìÙÊÝEÊm3h3nÄê4\áò÷DñŸ¨Ògk,©æ¯ädsC^`x߉÷)!§=Î^DÊés‡'XIñ¢wÞwÑgß!]û­ù°…{ÐÚ›k°—u÷|tÑžy¢•kö¡m²äIÌ9÷ésW)Ófh2Ëò·‰â>*9½žzÂ!†nWlý'HÖɲx¿F|Z±å/ÕNß«ÊTk…™ËT N(¶NÅ–h-7è9aÌ[üÈÑÔº-- 5ÊížtÏ[+h- ݱåêÌÅâÕ_ÒfÝ‚mpLÙ†™óPg,ìë²øöòÂÝf}nzº¶û§•Û¦1}’‚Z;¬‚¾±ôÜæË­ªÑç&àâBT2÷c´ã²êrâÔ{’¸KG–žMîö˜ %Éš¯hÓo$~M÷¼M°ì qü§,¿G §^§Ü:­ÙPÖ§k—u;ìeègôz€ôœj§ny«­Ü6½ð1 ÈöûV²±n¥íÝpµ—V¯Ñd7Uý#ß§Ê sCGðBF@*Û~(3\­Ópq•Ë v0ç DØ`Û*umíÑ ± UÁ¯ôL2y¸Ìû.âZšLå£ç "GC¢# í1\EóãàÃ5‚ùÛæŠNïÅ}(IO}ª;Ã^ôîVË%¨Ð5™íC^m?r4¢¡e*jipÈ¢•Ÿ ÷ï\ÿ07x8©EœîÀ¢]nn¸ê*sÃUšT&SŸXË É!ßü;?b„ àjKs]ú-±k±ä#Š”)œ€§¡j˜sïëS¸Šc^ÖõfµELÙú¨6ð–Žìº ·pUp†@`Z¶ QC‘òÎaI/ô¥öõ`m…«yIˆ˜wàØ‘Ô AÐâ˜uÅ<+ÜP*Ã}Gš!¹’ÅÈ7MÆ·8®–]ت9„á‡Vés¸K†^ W?³®Ö ÈüY· õ@"ßô›>/I£¹áªKÌyp••%Zñ>{Ñ“ÿA¸M(¸ C-ꆫ]ÛÈT^º®¹õÿm¨­ÞqJ!h­Û’w\]}qMÕD…²=êZYu³¡®fû¡s#âÝpõ‚«°ùóç>\,‘XÂÕYYƒ ¢ÊôÒŒ5´eïÜêqÛ»Ñ ƒÑü¾áä¯÷xÜ=ùdùËe*¯ÞýÂêßÌpµÕ4ŸD±å¯ö³Ú\ WU;¼yK_‚Àл*˜šþ’<¨2ëÈ'{W°‚«Èp§º€«²’ÄozWU;}èž·Ê6þb©Ÿ;€«‡Â¥ë¾ÓfY’’¼Dõ>ÿžÃÕmÓáÕ™ë’Õ_érãqÊšýA•ìƒô½ì…O Ë­øÀ ®²< ã.yž,x½èI+¸ZÅÉVí𪲱vÀÕíž²?›á*µh‹,y!d˜_RÅÏébl@uC}É“'•Oµ|Ÿ‚«è+X%s[^« -usªtOƒô<®?ü5ù¦_±K\m4-=o¯bliªƒDÄy™ õÄ×áµxÕç¸E~v­ôÝk®«,;Ÿr®JÎZ.WÔ™)¶NeøÞ£ËYŽÆ;¤ô å¶iæÅ¸› e¸m©§Õüãœ%§×érV¸š!\ñ~yáîni‚«_CZ"FÓfÞ,Zù 9^C¢7VºÀeufNƒ«ú“‰œÀg‘”! ’mø‘2ýléÕå›Ã]¬?±ºý¾¸‹ál„«È†xwÐÄæ¾6ÂU¸ëâÃQH`›ªuºœ8D48ü*^./ôÅòÂ]äçc‹-‡*¥àjĨ–¦ú†R)®²E\»¦EÕiØÈ4 \ ^^Îð¾ÇÄc†«8>«µ5’s&¸šk÷)«YâÕ_ª÷úÃy¶ÁÕ•Ÿ êQŸêŽÇcX cÞ®åYîB~ÉjWËò·ñÂ^–$7È;Îs‹vÍ‘$ŒC'ô®^ÚÉšÿ;àit…®ºÍ!ÖC¸º‹Ün¸ÚK“Êdê\å›&K“&ÂÑiI CÁÕ¯œWpM³=mÍPÌp ÿö!\=µŽþ*2Ž®7Cô—®ØWCFT OvÕx»àjµ4È.›[ Èz O, §÷ùó#G[Mªiµ®êŽÇÉÖÿ ŠûÀ,†› Ü:U5¶šŸkuõ!#U;}y!/T22Ío"Ý­üÈpµôÜfÜÚ$‹LüFŸÏ Z#½òà†(î£ ÚžÒs)¶ÃUDLyÊïкdx S¥Ï.>+á\rÃU—˜óà*ó’GܶÜ%Ãh3n¼ WrÃÕîmuARåõ|î§kN _{)Jiüßÿ:„«ÿûŸA3uÃÉçãO¾“]ZÝT:c­®^[pU_RòÆo 4è÷?þÀ¿ýõ××ß|ƒcÇŽ--ëí#«ÆêKË޻ãÿ±ô£åGÍâØ<<ÞØª5/hU–ñÑO/fZ/h•4­F'3ÿÙŸbËßí'ª¹®*¶Neù=Êœs¯‰4¶Z~$N ZÁ± 0AÃØõ¨¸5\ed*·Ms\MŸhØ-\->#Où£øˆõʽ« e ùæ?X ‡€GÖ,Yóu%sEá ®–_ÚÅœûúYºö[»à*´Š2m¦í ¸mpõíÁ¥¸ô’Äñ®_©Ü>‹Êy1DKN&Ú>)·:cA“¡¼³ ÐÉ‚¨×IQˆSk-ßï®ÞÉ×ÒXk†«¸^‚ecU;½5YÁ—áj-ô<}öU¼c¸§t¦S&M`ù=Ì5=¯Màê¬[•i3úzQû溊ҳ›ÌúÊ͖ɨ²M“ÞŠGÚα»¶ò‚òäÉ%ymÜT­ÃUVíð†„6HÏÉ6þŒþ×Qï]X|”,ïkËãÒ ¥2éúÈC1AC 3Ðó¸‰pEèž·É7ÿÞX®êÓŽµËœ WgßDL’4žás—0æmá*F2>²®–¤—în¬´{El—˜+áªÆW\W+èû‘cøa¯ðÃ^†ÆH¶åP¸‘1Α£[MÏœä™ó€“ìú9Ívíiƒ«H'‘Ð1ç?X8õºúb>HÁU^苈2-MuÙy8asQ;¾‚ÀÕq˜wÄñŸvWárù‘cªIж]Ȼû3¸ŠX_ÝÉïwÊ­ÓЊ-õ®¢W™ód͘îy»®ºÍ!Ö3¸ªJ÷Bl(•»¼ýÿh“^†«’¤‰ZÜàacÀºc+¤k¿£{06:æ'ã®Í WY~À}›;N`Û«©B~3|ïðîC¸z2‘·td·pÕ Ï§Š°™~’VÅ9ÜUãí‚«UÅlÿAIè+ ®B R<Þw £ßÒ ³ÚÅV¸š'Û@ÅöR²æ«Òs›k‹’Õ_‘:]W?,FÁUô3’ ó›Ø’Þ²pM/‚«RR\îkí` NËð‘VÁØWv1ÍT¥-Ç–ÖªèPÔ¯AØÒd.Ö³òÝpÕ%æ4¸ ͆a,Iø:Í Wá((‰Þpõ¹•¹ÿ{1M©i5,I>ÑößíªâÿÖ¯H=ùܪóeÿá垆÷òWWýW|úüpj¯µìcÃÚm'Ÿ‹?ã¯ûo Ÿ6ÒÕgÑöƒ«­&‰µxñâáÇ2ý wwWM•¤I‘Ù~d+¸Z^¸K¾ù÷náª8þ3ƒôB+y˜¥´äÌFÛÅ’Ù Ò¦õë®êŽÅB\¶Ú]Ÿ—¤Þ·Ùz:ÓWc/z ésð$z¬Z˜WÉ<ÐW ÒI?Ͻmkƒ«ç·@Pp•9ÿ!òûïŠùá¯BÝ,~r­Rn›n©º¶®)SKS}Ñ._éÚ‰ÃòM¿¸ê;¯‹2ü(ʇd¿$ϸZ^¸[´òc+pjiÚƒKù‘£ iH}Q‹÷»‚«$hi4˜áªîØrÁ²7´C«Eyú“‰¦!³U-á*.¨4i'ànÐPÕvOWÁU´Ù–B²äI /‡ÂÕ‹Û¡u©Î¡z’òÆ9”€AvwŸ>/â“P²õ?Ú2¢Êäd¸N»Ž½ðqº)\§f«vú0¼úÿ†«Ü%C>w!iÅ}H÷¼å÷h}1÷x³éç'8rYMóÀ­ ƒÓr>ak\\«¸dµ±Ú$æízÚÑ…vÍÁUZÒ7^èNàõÞE6ÂÕ’3p SpµµÕX§f!pˆâ?AÚhO{.ÃÕÐ+ÙÙÀÕzƒü¢2m&b„GF@„'Äi’è ÿ6ûv–ßÃíá*êjÁ q¸JÖAêÆ*-\4RfuÆB«c¶ÁÕUŸ×\=,Í&Ož$]÷=igÏáj2sÞôÙý‘ª¸áªÛb=ƒ«7¸mônë̤2™êÈ  ÉꯄÑoB@¶5”Ê‘ãÈ’aͨ©Fï„g.,ájÉéõM†nò>ƒ¢€ˆsÉY¸\ˆj~Ø+̹÷Cr_«‘c$k¾ÑŸHp”¶.å…Œ°®=WAÛÛÅÆ=†«ÿ8;ò,¿©4Y/á*DŽ"u |»r»'R¦îàêN󛂈Q¦Bg5(¸*Ûð“dÍ×ê}ÂUd+HÇl,Ã^«¢!;¦æEkG"[,Ú=OÌ<熫.1gÂUH)\kȺç­ÿ' \õêo0Iô¢Ýóqã8®öóßÿï°5UMºOBÚþ{Có’±ÖEV¿Å9¾úÿÐ2݈÷ƒN„”ÿçÂî#7P{…æç´4Ä­9Ø/àèõ+égû»ú,úÂþ‰pÕlÕ55•UUF{]ïÔšå‰cûyx<2~醔ÔT³¥•Ö™6h’­}÷›_þkÙæ´ÍËgŒ¹ÃãúQ1¼Fëã\X;îêsã‘¡˜€±¹á á±O“ØPæ‚Ó ÒóÄ̾ƒé;P“¹Ø®dÄñŸRáž6½?bTûô¿ ³‚«eùidî\Wpõb"2Dª,©äÝp2WÖÎ ªØòÜ®6qžA&‹ÐHÃKò’p- ­v/;Ÿ õEU®¶×\Mù»d¨2mV÷ˆtý5â3H® \e@K÷¼ZÎ W‘«R?šãM†ÏÝÿA¢¸…±ï a=““2W%íÖº«u®®ûzO¾é×6¸z(\±À WõvÁÕK»xK_Â^oÐÚŠÎ­Í ±‚«UÜ£d­ýAWÁÕrUÑ®¹tÏÛФ–FÄXÑ®9yþÄ*aì»7-Mu͵[µ4ÕëO&Ò½ú›áªé µ üÜ ¡x-ŠÿÔIpµ¶œb2”¡Cl™ãÝ7põ'ýÉ5T·7”H¾÷@'pžÆÈ'põd¢æ@0.4z/¨‡\º63\eÎ(ˆ‹1ƒÛ :ùÿ5\Eº´ô%ô*aw‹ŸA.©;'ßüÕ!x¡;ßáìå: ©–U‰jQž"õÏöu?0òaµ=òEηk®Ö”`ü+¶L567–åo'ŒÃ•b/zJ¸gpµ¾DŒ$Zñ¡ÁžØw®.}©Zp#Ä W‘Kªvú`ð¨÷ùã&%puû,³÷ëÆZ[áXz×i¹Tt¦Í¼ c¿ÝOtz7Ü®¶pJ¢•Wî¡ÞÁè'|Á^øxÑžùV‡-=»‰úräjaÇK"FÈS¦¨vxUÐ3zrZ[KϘàªçm´7 4]K áõÒÜpÕUÖS¸ú7œª®öÒ¤2™*;’@¼ê ~ø«¬"}¸ W'±ünªÖ9®6Á3ñÐgßIC&¨|¡Ó”nPž<¹šŸSAž¤›Áxå÷„%ÃûNDm¨qQÜGHˆ¾!æÒBèRNàM»úcVf WÙ‹žÄ^ÍkÈžÃU8ó5_ã‹pÊ$ïðˆPàÖÇçA?t WµÙHL$ ãp¹Má̈øÛ!\5!÷D?”žK1¿I–›\:Òáp×W’ø "~‡pzØv¸ŠèlzÌð:æÜô'JN¯Wn›.¢ŸvÃU—˜Óàjyá.UúìjAnï(r4äæÈ€è³ï *!#|àMÇÂUÿýÿ»%A¢h­š¶ì@ÛWKUÿ­]´"ËcqŽ ®^÷ƒN›àj?j¯Ðüc- +Öô8ú‡ ®Þîê³è ûGÃUGZ#/tˆG£’Õm¥ZJÏ,ÿùÕnÄ›×ß;âÛÈ\}%Ýέ÷ªÖ_A¦ÈûIQÏ››êèeëTlÊœ{¿zïB$_ˆ§Î)Ud6W×N¤Ï¼¤hŸ¥,©Ÿ­üÈŒŒx¡/Ö˜æ”ÚhÖpõ|ŠtÝw]ÀU’ý­úù µrSmé™âb\EN-Où½C¸Ê]B*ðeŲB‹D#‰V¦{vW/líÐ@«L›)IÏ AžôdÂÅ…r¨âåhöVÐ÷"ôÓ¦õ³„«ñ䉃© Ÿ»àºÙ -)3²oË#“Ò ©Sl_óº;¸Zk†«h‰xÕgVpU™6Cb5ÑÆ¶}]ù¥]Üä›&wrE x„1oµ‡«•ìƒP\÷]W•¦ª¹—ájAzÑî¹µŠK¸wD+>´\twJéù„9(( ®¢Ã¥IH©œ ¡²ußC7:®¶¶âƬbgWqŽtX¾µÉPŠ3ß)Ð`•ìCд]³±L!^=Ž>»¿öàÒf¡†² [p/ërWQÝ^#>ÍY<ÿrƒ‡#±„«unC¹Ò–R´mpuª©$¼ÇHôæF8 ¸ Yò/õ%’Þ4رæ4¸ªËYüÑ´bÚwèa$hœ çä›~'Œ£~ ë®6èżЗ¬8jä\GU»u—ð¦rëÔÚ.×¶¸v욀«†Ò’Së)`”Âß"‘䅽̚÷ 2mV½NdË¡¬àjC¹ £nÙ ³#öÕ1qáèž·âÛk$gz ÎëõbWµÃé3ÉFMé›]p‘¬RÄÂqÐ*2ekÁ£‚þ¢³{áú©Zll„oG8£ê?WñŽ LËV¶O ”ùa¯ ø"•èð{‘hËbGd¦=¹@—á*mz?4Xs ¨©Zï’qÒ憫®27\u¡Ie2ev4<ƒhå'œÀ! ß{Š2ü\W›¡ê¡ŸáXT;}á[ºøµºŠŸ#Ûðœ!«i3ù‘£Ù Å}Ìò{¤,NnPºþÃÕŃ¡»ºÞ ™µÂµÈ…àêŠ.Öga/\]øx½–O-2%Iš ˆzšÀÕ9÷‰V| Þ»ÈjÈW{w³m5– eëÀñ¡cÉwuWë´<å¶éœÀgÍ+ÀØþƒÐ Ë%íºîÈ—¡´-WÎjƒ«)HÖ|…Ì1p5iÕQú¼ÄòK;åÉ“D…'ÝpÕ%æ<¸zq»j‡WšU«¤1¼ïdx(œz<ŒAžyÉ[:’6ãFÃÕÅþ%œ·´ì?záÓ!®;å-iùßÿj­<ètœÀÕý9דmNWü瞣ý¨]Â.¸šxÈ#ðØêÿV±. >xËe»!ÐÕgä ë ®ÚeN†«ÐW)))á!WÿEEEÕ78fîÛ¹õ>Õú+1ºäÔZeúìôƒöoþðŒtÝ÷ Ÿ»Õ Ë ÒKÏ&#irf ñuäÓiý\%†Ò€¹\eýÛ×TjmWKÏl$땟Z×ÙöäQ”øÏz WÓ[q:òÍ¿YÒ-Wƒ‡AÀ›(¸Zz>UµkŽájµà7è9Qü'H¨©A`È7M6H/ ¾k2—¡¨Iªxß ®ÒgßNŸu ¤z °µk®ž^O–_lnD´•®ûŽö Ãç8d[ª+à’á)œv`ÙXòNk+X^°C¸ü=»r@hrj¹:~ø«ð]¼ÐqLÓM×j]Pn›AžU9°Äté \µXæ£+³€«ðoÐüì wˆÏí#OîovÕYÿcé™ -&¯^Å=‚œº¸ºžÔ¢Yõy‡G '•T;¼Mc¾Wp•¸‘™7#ÖØþËݵon¸ê*ë1\Eo(‘º¼ýÿh“ÊdЬpéÚ‰vì…3¼ß¹GàsdÉ“W êYó‚æWlù»A/ƒ­×wú;Z%;[¶þ ®bÀ…’lí·8ò¬YÒqÂ}W—t½5·Ä¬!Y -/´Öf3ÃU£±¥^/FË»ø¡¼±J ·ßP*5š–tÄéC¼Ñg÷'ÉȼÄ+?)Êðk×K‡¡À»n³&s1âr¶ÿSÔêÝÀÕ€gôæù­­d5öÅÏVwR‹¦kCZQÅ9,NøÜò'l ®B¯JÖ|E’ëŃ+-~°Fø«d¨ ïµ®ÖHÏI¿¦Íº•9ç¾’¼DŒYá¥n¸ês\-»˜¦JŸ]§a¸jšø¡E–*–åc\ѽúCÎ9®^˜õ¯±[WÒ“ÔMÆÿý·ÎP¹îˆ˜e4ø­«Ù7eê‡dÔ­ùãPó5! ·°þDB‡Ž wŸ&+Øje­ŠŽ[ÞrReòäI8²+ۺܮ5¸ªÏ'OzÃ]¦H™‚üîÊ.­F\elÜR_]~i§ùD}nmúõðæwZ‘$bGäàmÌ·¶Ö©Ùä ˆŽÈù• ª¸DH™s/?â5l \­$¹¿bËßì€A¦ ç䩸;ËJt]Y«±©ZGÁU„Kä¿äÒÎáª2m&.u³#Í䇿Š&!k°:,<§ rŒxõ¸Êvs§a͆rQü§H%0D{ Wñh65žüœä†«nëµõ ®Â'(·M'ÓÈ]ÝþkÒÈC:µjV·Eã¥2™"3X¾éWaì;¸µéž·Ë’·á …c-|Œü:ï,¸Ê^ôœ6$Å‚Òó©ÕÂNy4'dd÷Hyánä\’Õ_r‡È6þ‚#TñŽÉ6ü(N縊6‹W}v®ú=‚ ¢³¯ÀÕæèL$n]<'Eàªï@r:¦Ë^¢Í¼‰6ízÓSI¿±zP®õ \µ®ÅjeêŒH%[§q?£Ë‰k5­”!]ûmyAºì¥à*ÛÑE¦wZšêÐ眀§íJ*ÍÖÒP]AË@NŠã˜ß,9½A›‚œ‚Ô•]ÿn™M#üἪH•¶@“©ñôÃw  ®&!_“$^:.1çÁÕ [”Û=áLjU 87ó3ŒéÚ‰´7áµcáê Áÿ•Ö½¼ÈXþS´ë[ârûgÁÕ†ÆÆwß}wРAéééˆ5ÐZ–æ°ú«½°ÜýÛª*®”XÇ=«Úé‹l«Õô|()å1ÕCý&Ý«¿ ®Æ‘'ïèûœÙB¸ ñª/¨%«þ,á*Ä^ýáL‘%,yÇl?²\…\F¿e5wÑÒÈñŸ"«¥N¬UÑ™ó €Ôž‹ˆí‘Q2¼(R§X··„«šýAÅGcÊ/íRï]Ô®VîFúY«¤ÙÛ“UœÃ¸ Ð$â„/ `èÑŸÈ‘•k2KÏmÖŸ\CÖ™ÿrû¬Ëpõ0õxmz¿ÂiýÁ‘Åc_5)~{åÈ ¥2¼YAïªÄ½¥uM™Ð-Dmù«øH4´¥pù{¸ô$Èy©J¡öÃÕmœ€AÁU\MV0-YDìê"NÂUˆ@j1z ®¢ßÔc0”žOl» ®¶4b@2|îjƒ«§×‹â>$¤kõ—èUÁ²7Èã³nAàÄ콚Wõ™Ǥ{ à-}©ÃÂÈ„dæ¬(œ~=¹”Þ÷ ¹àN» ®N醫ÝÖqk\EØBðX$äÿ;s7TZTé­¢EƒÑ˜³u¯dصâA—CžfDÉÂn‡‡þjeS%Ï©5ÁÕ»áä!Ò ÛᜃÌùtˆR!Kåé%g6@–£3(#7%ýBKÈՌ˿Õ/­ûæwVᤈAô¬äi 󆫣o/>º<Їy¸Z_[I³÷©q\‹äWs¿ ¼ÂX<è ù˜C«ä®ìõpb]ù‚râC¬ä’ ´žýÄ*¯'Ô¾ôHqìÝŒÁr ¿LÑ~¸Š¯ÛO'£a=áªíP<‚ Î y«nчÞpuÚ3eŠtªÒ¶m¼Àdª\{±Ovƒ«Ð ºØ5göuÃÕ.±óW‘u‰AÌWäKáÐøQ Lö\ÀÕ+§¦ÿU,ã¶e¢—ìûçÔôk矊ÌwW¤÷Nëò³êzûß‚«k÷ßÿo¿ýÖå£>íÝ·¯´¬¹þMÃÛ4‚À]C}E¾DÄÑÕ”'©žaj¢pÞú!%YíÊ_ÚkNí!í‚·³þ¸H2üZnO"¸ªÜ­_ü‰dØ?i»«7*'=Ìo=,ļáêÞhuT¯ pÙ«vþ[W•{¨6]ÎiéÈ›i¢`[7ÂÕÐëMk~÷‚«ª©OCÀ )FžhÝ;?g;¸2Àë¬S›¶îbA‚û˜=ã9Dv¢+™‹rשȓ”ëŽ š#4ãçd£nE¤ÎÛÚä«3‘ðf…\Ìþ+ ½^;·7ú€uß<Ï#×8ÌHœ…'¶­ÀÕò"®þ^¸{¶nÑHü‰«'´¤Og2?e´uÿÏŠµ­üÜÉ5·àjM©¥`ûdVâÕ®JÓò6 E·oW‹¹kBˆ:îšZ_ã*:’`Þ:1Î~j­!¡oK¸Z[®;*~WÑy¨dÖ’/¸†žTNzbOÈöRA §„1"øwé¨[üÎx©-+DcB¬\un"rð§$ ®rÕn§1êÒq+:¼T3÷um ¨¡3 Ò&ò˦r× ²e.Dß#¸ÚÚ¦º}//7y럶Cqu%xѲs*º1.³²@Ù)g.Ð0Äp#Í,=opÕ²k:28¸Ü;éÈ›ð­ÂŒ™¢‹³£^h®úµ*«£™©ç‹ õ5´ñÄì—Û¹Eûy·®„«f›_Wá€;‚  »¦ÁËÇô ܉ß#àòŸGj†HdXò%ü3NÝtµfÆ´€«pàò² 7y³¸,z^tfW\½I=óE„0í¼Þ¢þ—²B+x ½bì=ðî¶ÃÕj{.‹ƒ”©ö4ÂÕˆi6'¸šÐcÜóó…{f[Ò£U.•nWMyÊ/\…·×D¿fˆÿ̯ËÂ× } ¶OB]’µ¹=7ÈíFNÓ¦g¸¡×Á{¯9sá[7\í*k'\MøšŠ„tÃUÖÐPïÔÖÌy•Í b£1'u<Ä*¯dè5¾ú¸O ñ®®¤œøp•U|zçœp]µSsP1á8Xˆx¹œ¤~ÅÇWú|É™ º˜w!$®¦MD솋†Â¡]&õÇ éQ)úž9UOIÑÎÓú›[âWo+:èÃÍpµ¦ÓżD®ÃÙ"¹ã¶ú¢L WGû ½wM>öøv߈ ®æm!„KƒÞfën®&~_|<‰‰4œ¬Ëvs’~F;°êW]ň\0¶P±­VWé(>–(}k}'\ƒè5§†ë÷ÑÎ{³ãp•o.þ½‹ƒ«K¸]HÞÑœÞÛ W»ÄÎ\=¶>yŸ\EçÑÇ~WÓépõÚéÛ}ÿÆ|i¥Û«ý¿õj­®Ï‚Ý]}J„ýoÁUâÙgŸý#$¤ãç|ŽÌ ®–œÝ„!é2žl¨­*ËÞ׸5dDÑÀË L‘!è»i¯ßšà:;Ë\¥"£o3%õó„«¥ŠtZ1üZÉðëeáwB/_éìe^pµ0cfö´žÁàª"ꈃ«»qýåú£T)š¡MpÕi…´“Žº%7y \…ˆBBŠX¦F·‰ÌºÒâM‡ÚWe;ŃhÃÒ¯Ü 3fåoÉ­!=aÞ6 ¬íÀ"ù˜³ýšWèBà —gÿ• ½ZÛÇ~*¯·¸¨r›aÉç¾%YpÊTSfA'„ "¸ºð}õÌ—¼àªyÛ8ëÞyÕÅB‹’ÙO¬’…ÝѼQµ×Ï•älŸŒw 3¢Ohnꬔ¼¡TÁ²%\5­þ]2ü:šVÝ W1.¨”e ¸ZçÊ9Cp5猻¡ŸTÏú®¿©¬œôˆbüýW è™Nü­Ò,óíµetoܾ¬?.¹Lz½Clgm¨zŒ,Yø]ÐÞÂ+ úµ:—G ¶:§žý2ÛYŠ y OÂ>Ö^¸šŠõO¨YqX‚«ñŸµ£zFGÌ!Þš=ãù@w³àêŠqiBájž7®&oãðrÝuÔ ð0Õ\FÖV¸Z]d(ÜQà¹Ap]U„R×àé±.„«¸TÒùÀ"ä\öÓÉè™l…BÞ¦ò±w\]ö­çb´­uŒ.æ½ŠÜ W]ôhlîëAf#î 1á+Qr‡Î/òöd_1þ>¨eSÒ/^_A¢‡°Ø*\¥¬aG$ä½jÊ“,„q3W¿+Ü3»º8‡%qUµåÅs9+¢}¯XW·»Æa–‡ß…Ë,SíkG«ÖU8ŠŽ,ÃUx>ål„«ÛÆÑÎ ³þCpÕ¢¶®ª3q(Õ”§®^‚DC3··úÔžn¸Ú%vþàêÑåð 5Ž<¸A ^~T–*ÒµóßfõW;®Þ2sO·ýµí ®Â"##Ÿ~úi¨¬.ø~Í ®Â¥ç§„9µ‡DÛϬoBj׈ú_‚¡ŠX†¬­pÏœŠ| 2Áó³Ÿi#\øwÅøû˾ö„«iš>îSéˆñ®bâƒÂW¦»}à*¢ž2òñÖáêœW |Ú W94X5íiq$Úüë¾p5Ñ*•¦å®àj#\mp7 {º\5õ)¨ Ý¢hç -•e#\ÝmÛ£œøZ'ஊ9è{ß ³Ä}\rzÀ“i®–äæ§Œ†žDOÓżÅÁÕ…é3Øãæ¶ÂÕâc+ = K¾ðû.4*šŠ®p÷l/µÆ6«²e.¤9QMi;ÁÕ5 Ë姆á|Š/EëUæËJD)g¶ƒÍOó‘@ÀKB¯g‰mË2ãyHkÓª_!ö ¬<ájµMyÙ¾ÕEzVÞUÝñÝ𨠮Ҟ’’‰OdÏ| ÿæHEÀŠÐð4s ¢GazTáª3{?²‰J‹ I‰ææU½Ø=Û®ÇÝgP…”9ÿ,€‡«…QÐÉ]WŸóמÖq¸Š›R°#²u¸ºsjAÚ„Ê9܈lôíø Ù‘µY=ûe–‘µ®¢àó¦Õ¿#á_¬uZ‘®¢'c˜œÏFnëu!\Íqp5֮«˜·ŽEþÈÁÕoZÀÕÊ2ëžhÜ/—éŒ:ª®ÂÓ"­ ø›\ÍžÖ³”¶Àp—ëŽèc?B ¬ úxÂe8q®œô(b+FU×~-«}Zi–ãò1ÿf¡±>Ð~bµ +u7Té‘ÑO¢Ôìé=qiðrÚ­Ót'¶ç¬üÙKðÛO®ó,7ІhˆÝˆ>ÈFsVýêuXtc]Ì»†¥_øíiNÕ^8dœ-¤‹Pì}ÚÍp•òëôÂáj}me•Usžwùl“uÃÕ®²öÁUCBßœ¤Ÿ/¨jáŽAS•Êv@ÄzÎó÷k£Ñ°adÁöIÙÓŸ•¾¦ÿ–yë8Z™µaÕ·”n'™qŽË®BÏ—JwdG½€@©šöŒ1ákÕÔ§ƒl› £×»T¾Ó~*™{ú áŠ0¡û¤"7 ÒýœÀÕ1= ¢‚×r/Sdhçöæžà_&y®¥i’§¿ópµÚ1¦™ýrP¸jFDã%S×òq÷ÊÂïRŒ 'ñ‡œ?y}¥$k3î =¦zûLkC¸73ña¶¨àê²ot±"” £… vL†J'¸šô‹|ìÝø/}×íÆ #ÈFÝÚ^¸Z‚p/ò„r^f3¸Š>‰€‹n€ŸãÓ ôgªk§Èpª÷\¶ *ãÅ}ŒÞ…;‚ü¢2_ª™ýŠúTF7\í;opµèð “Z§ ]W1áA®"ÇgÓl:®Þ½¯ÛþÚö¿W뎟8ñÈ#Lš±ªÊ’Þ®>™Þ W»ÄÎ\=5U[^ä WÅ[Ï\½oþþnû Û1™£°üê|Ö\½'è| k½\-S¤#¸@\=¼”³0„<ó–Uä´cìG箪 ¦‹_ AeXòy ¸*J%¸:êÄ)„cJóÛ WêëÌ[Æ(&<®–Êv"oõ†«´º¤¾®ÂáÔÊYù³gQ8¼Þ೫ƒ«¾O®᪒àjÞ¦PÄåÚ¦#Eƒàb‘½B¤A} )×P_SrvUW» 2/oÃPËΩ.ÓYDs¶‹®² \½Ì˜ð5.Ùûàî]Ì{Å‚ûCpÊTmçàêæQÖ½sÕ³_F—½:'ñÛEPªøÄ •œ<µ£øX¢4ôú@pµÒ,/Ø>9oÃ0¡pµHoZÕ“èau¥8I4ti©t{îºAø­æ#¸jùL<\UF>¦[ôÆ.J2ìŸ\Á¿úÖW9¡‘,;§A?ו×–ßÆËª¬ZÕ”§‚ÁU*}0 çœr‘tîûÒ1w‹\]Dš2¸ªœø°eGd½Lðàáªuß$.ÚܳPUpãàj»ö’³•ep•Möh÷i·Ãšàª}Õ)p]±ÕÝv ¶'¸jÏ…“GÜ…Ö`Ô‹ÁUxd+A&Ïø2Œnšw½àíFìïnÀ¤ºacï ²±Åe\­*£-K¼Cp•6Ë›¥œü(º®>þS6“MªÙ©wÒå¤GÊhV*{½¬0c¦xÐpžÇ×ÌyÅ!ÙÆž eG½`Hè[ël®fO{F÷i­³Ð˜øòM®"˜bø°ß…€·o?ÜêŸp5+c!8\ujämÎ͹ýƒW>öî@p•›Žû_vZ|r5yé#Ë:W-éQ8m:Û±wfDÑ3Saß톫ÝÈÚW¨*ûÒ/ƒ“®ÿoàêéuʉVäÙÑ•v#2è4º5ƒ¬™1ípAp³º˜w¡Cäáw™·‡ØÎ ¹Ú&øC¨Ž[}uyÉédý’Ï«¬jåäÇdawHB¯³e. ôù¢ƒqê¨àÌ\…d‚:mܬ°Ú•›<¾º ®v¸p„»§‡ãË#þ…\&ø*{nnIo¶••1ñ{KÆL¯mm[|˜‡«UN†²ƒÁUG>2‹f¸ºq8Ä*«L¹˜»¶¿ï¢³F¸º-ؾFê—HÑXâW¦!DŠ× ÙŸC_råœÉIê§œô(S§´oZ\5íVo§­ÆÁÕyâÁW!Ãâ÷M³äàê®iT(uüýžp±!˜àªþÁUa™,W?ÑÆ¼‹,Ù ²Kœ³úÄ®n¸Ú%vÞàªí`¬iÕouÈ3åćxJSrz=RûN‡«£äUO.>üHLf·ýU­WâÉÁg[Ÿ>Ѫ7¸ZS[›””´,À¼…t­7ð†«ª½[Ç9Ä[/¸J–¸-ð·nÑžpÑaroA5ébÞiÓ)yÂÕúÚJDÛàpÕ!NUÏz©\q#rɺÊRÍÜ×­ûcŒK¿B†È>Œ<·Ò’í;§ #oýТ# ^¯ãóðŠ¥òt((Ú1jÿ‚@Ù±S ¹9GjÙ9rKȪmˆû©dO¸šËí…ó†¢Èß4ÿÅ…dÏxÞ®÷„«Y!â?ó[šj¡øX¢ÀUíÁ)S•UcN 3o®¦Ï m)xjGÑá%âÁW‚«ybh9\¾@¸ZeÕæ$~i”Ÿ†¦ƒxcpµL¹:­%\u£oP'áà*Þµè}hN¥:`´ºjÄP•èÕTWañÇø:.ª\wú*xý+ßã#l@¸º#R1þÜAÙÂÏÅîËúã"!p5{zOšÊ®ÜÍUÄz>^æ®VÛMÜS†%Íp5e´uß|SR¿6ÁÕÚ2 ØW7±¹ÍŒ¸AhØòó¹\·¡Á‘µâ¶:Àxì4¸ZVüc ®Ö”[!èaÍ\ÈQ/9|z/‘qù·EGÚWiëÛSÉÒ‘·ÈFÝFS}Ü ¸F—ñ›âdc‹ Ê.¸Z_íDâ¬÷fCm•iÕ¯ÖýóáÀÕɲѷ!üyÂÕZ—Çi®êã? >Û¼®ÎxΘðU­ÓŠ3Áo±~Åà*†OÇÌiåUý4­þ-ÈDwfžpF5õ)O¸š»&¤€Í j2—élîºA¬˜OÉ™ jàªaÉçÆeß°MI¼Ìv(Þ¼m\ññ•€« pY!ÃAQX¼,¢®v[ 놫nP˜ÅG—ËÇôòØ®5gÅêÉÚå?Ú.Ö-xG5å uÔóHàè<áªiõï´#í¹<áº*'\nM™¾E;ÿ-Ú’~Àj¥@TƼ ®"Èòo1¸jZõ|faFTÇ GÐî Cáíi»ùÖà*­‰˜ó«JmZóÄ9p ·€«)aÕ¶ßj §´Zièõ|1%ëž9¸öRE: gè+Ý…ÀUÜ_œ'D¦>¶O¹æ›ƒ«xQ4ào™pݹkû£1]Æ“x-Ÿ·a}ƒ«´Zèõ|ðm“!}³ìš.|%â)Ÿ¡7"Y@ò‚ Z6êO¸JõƇý“àªá8W-,•n×-îc\ö-ƒ«5%ùÔÕï솫]bç®fÆ Qª¯q!L¨¦>ÃSøFˆüN‡«¿²|ªz2ö`·ýUíËtÃï:TýÙù¬¹z›\uª3©ÞKÖf¿p5óH$zˆ­´´yý.‡«´?û’/¨¸â’/¢Tsj¸/´ b~àêøûmûú<ÁÕ9¯¨g½„öi¨«.Sî&n–/«¶ç(Æß‡ˆ©[ô!+i5ÐÙ^•ñ`p†„àŽ'y½Ž¼X»àm‡dk·B<\-×§;#n4&|$ô¡¸ZãÂ\ ¿šGÈIü*—ÚMÕEFó–d¾…3 }‘Dî‰f7½"_B5þïhj¿ç _¡ñ2±Vàj¡·ãüÀU—é ·Óô´FAÚÏ·Š%š·Ž¡¿ÀUÚÑuÇä&¸º'och ¸ú§»¡®Ê’1ƒµXÉ©äìi=õñŸB3«¦=#ê)®Ë®ÒŽáy"4#~«mpµP­˜ð@cIsù.ß»€bÙ1…lÈÅòøECÿÉU(]äWp£ÅCþÁàª-sa¹öðóñ2Û¡ø¼õC}á*d-.¶£pÕiµìˆô‚«¶ƒq¸Øs WÕ³ÿCÛCÛ7ÔרO'«¦<(ëé \E²€>ܸZfÁG*‡þÏí4”CçV¨n\Å×Ë5¥#o’ޏ©®² Ýy†'\|ì=¸­ç¨‘;×.4¸jˆÿîI"ÁÕ¸OáØùÏ×UØm1áUZÀÕr[Áöɾp.Ѽu,9™Ø>¦³5ùj¹î¨imÿì¨^ÆÄïpLä˜òˆ¬_UÛtº˜wñ£,H¡Ã䮀¨! ®Öáw¥¡7`h AF¢×®®íÏJ‚ð†ƒ›VÿÁ*©6ÂÕ¡W—~ÅU¦Þ¿ w”³â'¿pµpÏœ‚Spí„«Š‰Â³Z‚·ꆫÝȺáj§[C}“àpRõ‚rë,íÒo®.ú {f/ÍœW!°sVü ¿ ÁQ3ï h!8º@Я³¬®²´è`œiÕ¯u¸züþ3P-¯f¸z,çI{¡ò×ÅÁUxQÚÿbçÔŽ÷Ú’rzOÙèÛ®r;2‡x‹zÖDþÞXÃÐ@æá*ÔNX1îÞ€pµ¡§!qW¡ý1¡‡³g<YˆÄë[Bà*T Û7"Ó°äK—ñ¤Û®š’~Áqåœö„«ôdsÛxkæuT/žöÂU+òñà+qp^ârËܦÚöÇèc?”„Þà WcïA:€l…Œè)äWJ¥i”8¬øƒ«puŠ fÛÞ W»ÄÎ5\EN —ÂÃUdÁL@›áoÛ¡8tÚN‡«©ûp‰«÷ê³ÏÇî¶¿ž½³^*u,Vs[ uÃUÞ¼à*r.nEÆj¿pqG1ñ!‚«1ï"µ‰d¶Ûáêðë4ózkç¿é®.ýªT¶Ã¼u\»á*!ÍM#äcî.ÌX¤Ý!N¥š«³þSrz¢™"ƒƒ«ÒŠ| •¦Ü1EýŸýÁâßø°×A*-J‚«'üÂÕwhÎpkpÁZù¸¨ÿ%ÈC»i‡©Àú÷±Êª®)-€0C²Lû¸§Š’mjSãȯušSÃ˾±ìšÎJ9ÙO%³›Ž«Ã½ºÜ®~é÷Äù^"¤.Ÿ»5ÊTi–â|,»¦Ñ´®©O+Æß'òcBßf¸šU˜1S¸¶ WËõÇÐç!„¬ûc¼žÅ]†N…û®¤MÌß8ÜÂÍ"pjá•–p•›¼ê²³eA¤NgöB³ãäi>pÿKq]<\Õ-ü \{83íÂP'¸è(שT•pUšæ[F¬¦$§ªŒ|‚àêò?DîÅ'‹Ž,eíé×t‹>DïbâÖ´¶¿íP¼ðóñ2$8yë÷àÂåcïÆ@s³}ÁVýŠžÆ+O¶«šqùwhá»o3Ûxí²íìÚ¡1Î5\Åñáê½àê©d0ý~¥£pµÚ%®â–!;¨¯*‡ÞF^C”ŒÛÆ]5å‰vÂU®éã>Çï#ûPLx `G¤iÍ8~¡G!Ö Ù.4¸Šœ‘e¬Yý/E’ëÔä?§‘·)9 †3×ÓZ«ðҹɑƗ}­šò”fö+–‘4ÎÇ©>ŸV˜å2žª-/Â'åcá*"ƾ2òq–÷qpµ¿4ôzpî”fû(÷Àm²I¹ÊIè¶Ïö WkJ-9+b‰$¢¹zÖË9+~@7k¾e }‹ÅAlÀå"Äø­UoY¸{6¢3² á¥iZW‘¤Ç›Ö³®v[§X»áª~qŸÊe—ŸÿhP Ö½s¥¡7@ú 4Ʋbý8ÍâÏŠÅCq!q@«êbÞÿiǺ퓵 Þ¦iê“«:Ç›#! áúh[ô-;§âd¨PO…®œü¨C”Š3/H›P‘/m¾.®¦Œbô;xn8Ú[6ú6Éðk /ówópuàåðê´ÍëÁ8œL {ÀÕÒÜ5¿ËFߨB,WÕÐ^Û€VäIŒ‰ß#õC#dG½àõ­’³›Z…«ˆkh+Ä\Ä—œ•?Wr; ñp*‘áZÈe8á2žÌ];@=óÅÜ5!”èæ-Pé|¥ò]íh[î¡ÿdäžKÉáê¡8 pñà«äáwуï?iÔ£[6ÂÕ<1ÁUýÝ”­úøÏò7h„«•¥ˆã²¥?—[º·Ãë;×p½  ’r«®†\ —(ê‰uß<~÷N„«°™§ B¥®¾éúޫμ”p´ÛþöÆš³ßîÉ.._*íКJÞºá*o^p•ïŽÈ⣉µ.;GÕÊaðrpu¨bƒ²ð;u h}ÍùY ÊàªtÄMˆGš9¯zÂUZn³ìŸû˲÷!ɲXËÈ×ZÀÕŠ’¼ Ãäcþ]˜èó%¢‚«³_±{ÀUˆŸríaîiøÄìÏC±ê”ˆìë탫H“m™1´·‘¿ÓpåœaeúigBß ëƒpC ÷Ì¡}Q«ÊØeÈ|á™! 6‹Ž$PyO*‹†ì‚ qŸ¶7•ïá¦3¸ºð=1÷ïàpÕ´&Äv0Vàâñà”‰SÈp­û¨"WŒ»9/N£èè2†Î¬ûæ[ÒgTšeB~«¡¾Îv`4¡.¶ß”k¤M¹ý¦Gó¯WÛM\µ„öÓÉxƒ‚½ÎÁÕ”DðÒ/þ˜&úrDš mÚÄ ›û Ã CÎY÷F“L ¹X<èrQÿKqNíatruT¯¢#Ë K>Ïß4²ÕM‹Zv*­ie€Q’V_ãL«‹shJ…Éá¢á7\=¼Ô{XôݺjV+@·èɰRmÞõC´óÞÀè¾É”—Q Õ¿;5 Óg@C2æCû‚­êWrf=W ’왃†Ë^âÕ®–)ÒÙ”W4#ò&ôðrýÑös«&è È“N7ÁÕ'X_;puóH.ï¨,ÉÚ¤?Mçë0\ÅÐÆx”ޏ¡¦$S1áôÿÜuƒ•²ìˆX¤Íænpd¥”ÐFoí¯JÁÛ…W]¥òtͬ—AÔQ/”)w#ã¦e˾fû:1#¸º1T4àRD Åøûh3®Þi@¸ºð½œ?"êã>UMy‘ˆ ¥ú¬¯ç-QaO k]Ÿ•ˆ}¬_á§õqŸ ãfJ‘ù"ß”ÐÚï„ÀUÝ„„H¤–pÝW'?¦ß9W:>Ä ®"*!ƒfDá9áshɤǥáLÐn¸48œ?ÀEøþ(z»m Æ>þ!0'õíf=šè×ѽ‘›tÃÕnëk\%ón¥Y.äópÅu®bßÚþUƒZÀð” ¿¶¸:­§|å@õ‚wá[èyÍâ K¾ j÷ ‰|n]vVÿK ÛY;—œÙP|tygmÕò•àç #é:-m[m\Ú׺'Ú[z5™eçT$YެÍH¯ Ò&xªÜN‡«y"͜רÔÛèÛ öÌ[Çù0ƒ«’¡×hf¿ ?\|t™)é—@ö€«câwÒ‘7ò¨W ³¹1-oeÒ”ÔOý>Ùk•ýäÕÔ§Z«e…¹kØÆ!AƒÖeëûx¸Š$«¦$á£\†¶…ÜEb‹/j漂h¥]ð6š…í„ÕV«)µ@ª!R#™âO’ÁU$‰ˆtâ²ð»Ø¦È¤£nA+!.Ó’[ÆxnŒȨþð™õúHˆ®žÝˆCQQß :õç±V·5™p¸Š±ì2œ`ÛË ?>Õ¨_?¤äì&$JEî?ÝÐóêY/‹‡üCv'rIt°Æ‰¬ Wa9Ž?ŽXFH+ÂU5Ýö×°PIyÈ!ó™ÂN˜³Ê¬®òæ WMgÈù^B©tfŒtäͤÒÐë1ls× B¨RŒ»O6êVÍÜ׃¶ÎÖ)3Ô3{áL ñŸif¿â W‹Ž.ƒ‡QNz šS{ȲcJ›¨¶„«ö¼ C[«gÖkæö†µ€«¹¢RévD4V¶aŽ ÝÚ2‹•ÛÊë yâu>«=á*¢¿íÀ"/±Á‚¯*òñfÚ¹ô«@3åÜ\Ÿ2Ú~j D8îw7o€ÒÀ™+'>Tt8Ù:b4Uaû:ÒᢣËëk*‘òCTdýq‘p¸J›eÆÙZËÝe‚læéϵî_ dpuÐÚyoŸHj„«ûc,»¦Wä·²]lcÃÖUã8PSHXü7Qö~hEëÞh/¸Z||%$zÎÊŸ!¼ñ:¯vÐÚÆ„¾ê¨ Æ@ßcpµÖU A¤Ô¡SsW Ù¬¥-/…\œr"#z:Â"~±º®ÖeÞ“+ ’Кàê6´ „w]e)ÿêbªü=ãyš­±%JJûbC×yÍ4Æ% o8D)èè$èøê™/ÒæPybá§äièÌÐÉNõpµH¬‡û­F.×W‰- ?8.£‰U< ©¤\->¾B5å hc¨‘ös+ÊÝ€!Oûgy¤H ®ÂCB<#Oñ%Q„«uUåÈò7öe< fÆÃU‡8U5åI‡()ƒrâÃUèUN®¶mÝKÐÎUV œ†büý¸Pzè·mhÝk¨/H›T°m¼ð †‚XÂUø4¤Ãô8£¦¢Lµ7;ê$\ÊI8µ‡©ÀéćLkþð„«‰p/¤–3ÊÇÞÄ– ÜzóÖ±â!W–~éy|]ìGHõ±}ØŠ~Ü‘VàjÚ„’¬Ínަ¢…áÊXõªW°ôKø ÷.<"#~NO8\E—@^,|U3\=³‡­fõü<Çù¿c;gÙO¬Ò/þØ–¹Ð ®"EÅ¥YvMË]‚3ñ–Ÿ»¶? Ü8WÛsƒÜ iñ[²ð;qkÚWáðñyCBß.éWBì<ÃÕú—ËxR ¸ÀÌí)/;n탫l»@¸êÈJPéxùM¿­ŸOø[ÛÆîüBm¹þhWÄ êÁ(—€‹€”Ç—=÷ äHUŒË¾Ø€oÔÎ{S>ænˆ=CüçÜ·3zY¸'>°Ý 'ˆÁ»ÂéA}Akå OÑ„g†Î©«ô¿È n±µÄ/\­q!æ".t\5UÏ~›àêÐkÌ- b{Â1Õ”§ §1Ài:hâ÷>Ü W+ˆ&¸_º(ú-ý‹ø—§^u“ÌÎ6­þ AÞ×´ÜÞ¹„ N8ÈÚ+¾ðΡƑßPWÅ·뀿!šTt‹>ÔÅ~ˆ(Œ°…×¹Â?!wÓÌ~9gÕ¯x—àªt{;Ú–Ûhu´xÐåô¾‰ 3¸Z|t9b ”?òM6#Eý_ÑÀ¿#³†^Å…£· X)F9æÞhcâö“«ãï£ý> KÃï‡÷pjtbî6&®Ö8Ìôtûì&/éÞÊñ•»ÑKq£ ÷ÌæàêŸÜ®²o ç`A.ìˆd…îÏ\MVÙú,.qVTu9ì¶ŽîãPQy¿æÌÜÒ ½.ë—ÿÈ|?Ü Wyó‚«s–]Ó­4m²È–ƒ´.ë ðü¦¤~xE:ò&õ¬ÿP ÌóWK廲§? ïaLøŸ§Ò£§Ò+†6@”Gp¤•Ý{ç ?²'\­uÚˆƒÃUû©dí‚·´óßBØWo(7·Ÿ\#}+MâŠ|¼0} 5Ž<ËŽÈìi=½=ƒ°äôz¯×‘;#A†³Å× \sûJû= _VËŽ/‚HeUäŠ D‘½rpµÄv`1ÁÕ7ÙO­EоY-²x|*E=ë%nñûZ‚«ª=[²ˆ»ð[W‡\%ÀO”õ;©’pè¾yÕö!-œ2qÝÇBÂ\ü¨<¢Ζ˜ö‰U µ®î›5¥]ðŽßà>\ÍŒA^ïΣ­ŒË¿E,cpòz­jXò¥fö+´´gèÕÆ„¾…»g ™óàÊ9­‹yÏ”ôKñ±DÝ‚·=kn b*'?Æ!‘ßTÓžAWluvbe¢\{ˆîÊ9´qSÝÑE‡—àÎzªY®Ž6&¸º3V4â|ÍK;´²?ÜÇjJò¸½f¢Ñ®Ž¼Y;·wnò@uT/DðRÙ¸…@µÂ¼ÍíFŽÃ}¾ž­aqª@XÊFÝ’·~°›ƒ6Æe_—ʶódU)ô‹?i\…8a:Ò™½Màê=>‰¡êÌÞ/üP‚.Mv¾gŠÄà*DŽy+šú%_ÕÔA¸Zë²£Ë!½òÚQ-Œ¬Ðsîhþ¦P(7ÜD‡d[öŒçJ¥4ï‘êq»¯Ò¢Ä‡ o†BÊŽzY?ú Ä<Û ÇÏ}ì”kpw¡Rr\ZÞ†¡•KpëJ¸Ê–„K„C/ÅM{GÍ$ÁÉ (Àë6ßëò"Ö¥©’FDäÚ¬;!¬Ð|¸eßxßÿ¹6æ]íü7µóÞTLx#N(\­(Á¹)#k|jænÀù ij}¦æoÁáܯZ‡«õµq’á×Ó"nÚj ¸š†îõy8¶ØcÝ»èÈRÝÂ÷ù ú˜Ö„à•Â=sÌÛÆã°¾»NSac+œÚC«hÕœ¤_äcïA.LÂ0øÝêâD ´—ô+!vžá*ºh~j¼}—_x[ ŽÑk>!bSMiAU¡šõüª"=é%ÁsÚWÕ³_Wi7ù´ .ÓÙNo nKV%Æ~ÉçÓjf 4hô.¨§æ` w„è¬ÿ€lÞ‡Ù³_->š_š»6Dó.T.WçÂí\ÍÃÕ9箢ÃÀqÁÁÖW9ñ¸­y†î™]çò¿0ͼ%žž)@Á¶ ž«`p]p¡yCá¬pÀŽŽpŽSqÚÉ"½B:à9µÀ×Jά‡„ÎYñ£Ëxª®ÂN5ÙZ>àó4¸Z¯.ty  Ws³àxýÃUn§`D/µÏà*z‚×·ZAxáµ½E]¥ J4ð2ôÊnbÞÅÁÑ—> f zX1ä³§÷¤e ±}$î-•¦µ§»–š!ùÐ Má걌íÓÊbkùlW‹F¸jU›S#Š$×ÈDr×Ày–J·#l1¸JsQ"î]bÂá*dUNâ÷¶ƒqÈ„¿T¾ýYt•iâÖQ"X@Ø3¸Šž!w.àêØ£y¡ÒŠ>iÚgŽ?¶èÐ#1ºíÝpŸ[vⳆá×ü³Ÿ†wÃÕö™\¥ÝÏÓg@ippu¡râCø1”ÔY ” ÁÕ™/²˜çá Ke;UÓž‘…ÝPM}ŠAl¤1ákY‚«úc´ÏQz@4êkžpñ”6õh ®ê}WÆM@ª,•î†ÞP®=ŒÜP:òfÓª_•“†Ðeóh!vj’\¯ƒ¸rÎÀé±—žÖP_gXò¹ýtr]…£5¸ªÆ%7ÃÕøO+=ê2yt…v^oMôkö“kjË‹­ûæ\y3²fVFù,'´ô&êùÜuK²6qpu/b4Íž­°“À~ü6û9ã²oý.h‚ØC·¡eZ¾¸ª;bÞ:­jËŒ!‘<úv/¸Êí¹9ÒBÈo!E@5®–Êv¤MÄ=E›7nʃ«èóŽ¬Í ®V˜Îâoh-Ã’/¡Ò¹Ñq)¤#$“oÊïkÐÕ\ßKN'Ó² ¸j\þ­râÃÊÉáçÐÉ!ùpVÁ+”œÙ`!­àŽ,ãgCô¢R¦àÑ>DHR´óßÊ ¹Dµw¥hämW÷Í«uÚê*Ëê«o(ƒ«–]ÓYAH鈩ÈêßTSŸFû## çìN+K»‚?rEVê2œ n\Y %MŽt›æœ ¿º±MkHè[*ßÅÃU| £OûQþæ6ÀU77yÕ²cŠhÀß0Yy+Ü)¤TDtÏ\å@%º%D²ç=B«`@ÉÂïÌÛzNàªÓªýˆøRËÙÑøÝÂ]Ó=§pä­Bpµ¡ž©î2å:çÊR¤0WV®Ð¥we’V­Ê¦ƒ3©0sƒœÃ=¥|dáû¸­UMeŸ«í9ðÆäÛ²Ü)`/j¨7­ê‡ÿ®Nì˜L[È5ÁU$_ï¤Èè‘I!/•7oœApuÕ¯4!m"zT3\-!¸J»>-ÿÖóøÈs5Üf‹š9¯)&<ˆ##@«TEgÛx†Oч 3f"¦ðKr’~¡‡)ÜŒ¸ú¥¸Z&ßÅñîÉl ¸Š3÷}úiXú+æCóy÷A*ÊUVo|ÿFˆ§{otáîÙ¾—Y|b¢FGà*¾›¿i¤&ú¿ðÌÂkθ»áªÁ±ëã>qˆRºüÂÛj®œS^åë!uJ%ièx  c@ ‡í‡«óߨÏ\¥9öŠ øùv—ê,£ ´N«Ss0wÝ`Œ5ˆ48@Dö@µh\•ÎxE9í9„98 |%oc(BUöŒç ®î›‡ˆÔ¾"_ ­x®àjyÔ#´ ú·Ÿ{Îÿõ»-¬›«—.¸«äìFëþÛ&x2I\—yK‘Õ´‰0á>*•kAmâCÊJGÝšÏÃdÈMhÀ‘e¸¢ºJÎЫ4§5ÃU—ÂÚŒ{\åçyk@¸jÓ宀0Tt$AóÄ'÷:Õ­Âi„«)£iz@€sÀÝÄM·Ÿ^çù"~®žÁÕŠ<{ïÔ‚j‚¾B˜C2¨Š|‚JIÄ.u‹C¼µÕÀçk5Žü¼uƒDÿ^tx Ÿ11¸ŠDÑoáp—½àju±í!ÛêOàœáiqδ îá¥Ô{ÝnÜJIÄ=ÝpµK¬-pUžF ]ëÚWÒ´nrü«xŒh ·†Q,è¹H{Ž7Õ ìD¸š¬²…J\½VœîrØmçÂ^]#.q7ûôÝpµ}æWÊ1l¡!¹’¡‹TSŸ¾Rù¸xð¦¤~ÆÄïåÿbp•<ÃÞó±I4ƒ«ø]8„<®Bk!¬èbÞ¥µÛ+~€0†¶ìˆzd·[{rW¹EËh m¹&¤5¸ºÖ°äsü"´Y}µË!Jåàê¡ÂôÒ7æ¬øY-Â}57¯Œ[M9Ü\5ž"¸zvƒ×ë uhRüÔBNR?ªÎ@ÓVù™ÿ´Íôâ€ëµmÓbói=‹¯„–ƒ>!¸:ê§j¯xÐЖ%g6°¸_¸gNöôg $J¶5ÔV¹ Ç‘c²$°ä éÈ›E.ã1 oIOw#›)ðazpÊäTgš·C®mË\„;‚&¸ý:÷˜UÔLÀöÜG5ˆá!iÄC®ò W« ³ÑÛ¡½ÑDE‡âs“òo1¸jZõ+n4ƒ«ñÓª~mW£z± ½‘Aª4ÿ–M‡ÆÄOà8†øO=á*Z[>önÅÄѼ\ ¬[¡ôünµP_[Éh$Î'oÃP¶g.·Yd ¸ŠŸ†ræÖ"]’}`$¼μ`û$|-PÛ4íàjòèvÜzMôk†¥_å® A¯PNzTÃMaň«²j©nÕš?ê*ìA "€†ÄuA©¶€«Ãþ‰ïº¹i†øÏœª}¼p¥ñ»s*~"?5\Èå­®ª }]´\ŒiªFuvƒyë8äÂm:” s»kË e£oƒ ­ó¨Þ€ž†ž‰×M«ËžñÜyƒ«u•eš9¯RI±&ž™»nò277íŸríašH\U†>†Ún¸ Aˆ£•ëÂ!#ƒ¿Â¡“¤Mâ½J³\~'a'ÁUCÂWÜ|Å¿ \­­D¥šò’MuÔ ì¹X©t;çÆˆ¿\ú)\z”\ÍÍO ó…«HÖ²§÷D\ÈŽêÅÁÕGÑUŒ×ª—)wct°jrÈ7áÁ<á*él­j{Í•|%’M!pÇ” ¿.RÛb®›j¡L W˾¡DÒÝPttÁÕSkµózóïâ»ÈÔ³þcݰ‹k¯ðáHèøÆ~ûàj‚ŠY–·q8m5r Ž÷B€«4í\¼µ\{8Pu áv¾ája6Ü~IÖ¦óö‹eö“kÊu-jt#ÒY÷/0.û–‘\WÑ!¡»vº;WéV€'æ^† ‰|Nàju¹C”Òépòá#Èjn_C-U¤›·Ž¥¸–61wÍâ!ÿ(Sdâ¨ò±÷H&>®˜ü¸ýÄjèsŒhhݹh¼ EÇ­  =a!žkùhCó–1Ÿ×·ÉàTáíûçã’ÑyhCŒ™5¥þ! ‘tÔÍ%§×3lî¹$Ї«Tg`ë8K·‚”¶ròcÈ­à„©®þ¦Ð ¶ŸNFÂ#¹9Åå§*´ån WiÍû€¿UäIüJz ŸsF1þ~/¸Š¸CÕþç¿EÛ¼­žõDÆ#<<$¥¸Zn8A‹¹ÕÍ}É®"dpuÞ^G4D:‰ÛE ‘Ìà*òP®´~J›¦2#-½¶¿hàßmûcx¸Š< ÁÂ~zqù÷èÃè¿5vS#\};Nƒð{j˜wÎìýh]]µ“e²ªÈÇ%÷”uÃÕ®0áp•A.îƒÌHøÖ½0tE?ÛÁ88¼õCÝÜb }ü§ò1=8¹8T9ñaÊC.ò;½}pµßaË»)Ê.g€Ývîì³]†~™y~{]7\mŸyÁU¤ÏðöÛ'\=¸˜öošõB€xðU¦¤~†„¾²°;®FõBjz˜xn­®ŽéP«˜ø0Ïsd•“ÑÌ~…£‚?Wä‰hiOËý2š»TÿmÑ‰Õ @òAn‡«E‡—³!ÇÌßZeÕ jKCopjÑT¢á×ÑÖZãïÏ]7˜ÍÞ¤U-kûûÂUÊSF{E|·\]ñ#ß/ÃtsëMÐ põã@šàê”'m‘·\Ý=‹‹à·¹ôÇ‘,+ÆßÇmÄí®ž¹P5íiœ^¡¥pŽü’3Ä3&|-uK«pÕ–É-ÕϤ÷‚S¦2Õž‚mãí'V!Õ%˜_t9òkBÁ\ñ¢â£Ë ®ÜÑÀÓê*˘K†ýÓ/\-:¼D3ç5tlH8/¸Š¾$q#ÁUɶüÍ£ðÉF¸zt9:?ÆkõìWh檸ЇÖC7.•ï2,ýʮ⠸Ld†%ŸÓ“Ç‹t ßwOù¤²@AT“‡«¦,÷ŸntþÆC…\Œ iˆ95“B OrpõÓ¬þ—dÞ,›øä.Þ<¼¤,{_FÁªß¨’Um•fΫ¥²lE? ´¹½¡u1ï¡çãbÑhqz`€†~¬Û»ÆaƘ2.ÿŽ­D†¤4­þÝÝ”ƒ#™å‰ ~ À‹Á7Vðó[UNšœ<à2—á/ƒ’4$bü6ëiî†êâÙ¨[m™‹<7Zbp÷1'ñ{ˆó·«eÝ¢[ÀUwCm¹ í,åögçK{ñp(¾‚,ƒ¦|ÔVÉÂïDÿi?\-6 [:ÕÐãî…çA—ÈIúíì2žä·º¢tÄM4‘µí“=| .qî*Öñ£]pZšJ×Nxkç½ÉžF!Æ\•íl¾×N/ÒÜ)\Ú«‚áèxÈ~àjâÕŠ‰Ñ6Ùiæ*r.CÜgΧŒƒ ç"S†§UM뉾ÄÞÅOÀA±2Èõhغ©´p¸jXòÛbÃYuY†¬ýð¨ø!¯¯ ØY÷/À°-:²Tûœ¼'\ÕÌëÄA5õ)8*Û’æûL ýߢ%!›FÙ¤…¹ÝðHèÉð!ð„øû<ÀU4yª€þÓ Ç’=ãyœüdû^P¸ŠaZSSfiÇÔ¬@V‘/ÕÎ{ÃwmN°Öh¨§‡†mI3Ï…á¾ó™7\yPø^“í„«Q½Ô3{ œE Ñ=éÊñ#:hNÐ`ò±wwn=mûéäâã+ùs*%Ô2tÂá.h翉@Ÿµ/rU©4Ík“£æƒT»h{—‘·*&<]_‡˜õŽàE; 윊1 ¥ÇÃUVÞCàóú6Y­³&|Ї"‰!¢ÁÕ[2¢)FÄnéˆJN¯;pµL¹›j„ÝQ˜Å*Z»q§Ö\Õq³ݲhÌ€Gn‚«µ®btfQÿK!×ýV”j ˆ“õzfÁÃUxxxÙèÛÑz¸YТTñ•àêÁá*n:z t ç‹<\…°/Sí…Ê…þ‡L‚:ÍÛ0 I7ÀÌRKü‰gûà*Ë(Ń.GäâO@ #X ûCÔ£”d^oø¨)W‘ì”k#ùÂióO! )W:ü>G Ý0ç¾Mî9B³§?'ïQ¦9Ôé=¹ÛZµ6ÀU«Fó.-lKÔCx‚,´îAGbëûàH }‘ÛRñÆþ—ÂC*&<€¾„ü¾Â÷탫£UO.>Òå°ÛÎõJ<5ø¬ÿ§ÆÝpµ}æ Wí&ëžhó–±Hîq'7èbÞ˜!¸ºô+YØíÈõÁécûœ'¸*Ý®šò”|ì=´^fìÝ<\ÅéÁ 8fÏx²²@5¼$;oTIKž.vMaÆL¶<šàj€Âœ(š€p‰vPÏzÉv0¶®ª@§!P"TŒ»ï²bYø›–xG>á•¶85cÙzL¯ãópÕ¸ìkˆ±@^©'\ÕÅ~3Ú.VNzIwÑÑeHáÉÙãQ–þPA'³ŒýŠíPœ*òqÜSèL¯ƒÀ™ËFß5ÒW¿óÝRÄM¬o©eçê48eBÊOpõÔZÜbYøÒ7‰_ Íàle›…qpu²À„‚æeíËÁÕ·}ßEB/âÒóõ^p± ÷—4˜"ÂÛv`‘C”Š{Ztx‰>ö# ·#$;êëÞh!p•°ùÊŸò6…BÈ¡=á*„".ƒK¿¸t^A*Á& x7Ý©µt×ê,àl]ÆSè`ø›G<øŠâc+ò6†B'7ò.Πßð"M—íIöñŠ/Š]Nõ4VüP|<‰ŸDAkLü>?5 iK#\Ý7ߘørƒ´‡Ýêß ‘ìC„«)Њè²æ-côÙ&³\9ß÷ËõÇù‚FÊÐ~¸j:ËçeMÀª=;½¶bî†*«Z:êVW¡ù4\y.V9ù±N‡«hp´˜'\ÅàujàVŠB.1oßÇÜ l†›{”ƒÏóuÛ¤#o†_ê\ÍÑÇV&ßU™/…CÖ-|+»:˜«Þ¹ 2¯¾ÆEûÞŽ¸¿Ò)¸ý¹–¨žõþIÆ)Úœ•ÍäàêD!pï"Ê”œÝ$v-—߯ÕxÔ~rµ£´Ô¤:ÿé;“gnÝ¿ ¾¶Êv0N·èýRÉ6Môùwá…”‘O(Æ?€±†ÁeN€Çð:‚>öCühe¾ .¬¬· +ä"ãòï›àê|KútMàÚW‚açºÑìòˆðÏ«¿² p•»ef\²ðÙ˜­_ZžÁ¢¤åjÜà/ŠæY^²K #‚¦r»ŠÃ‹âîTäf™SF—}Ãà*z&-èöx ÜÚW—!*ÃÕiðð´»Sg·Ué?¸š¤û†›6lšHsDýÎËu7 À]ðOy˜qpu>:ÂVþæQÇâÁWA «ˆÎYÿÞX;(,Môkîu.;ÕÃ|ò4·éó¼õC\†Îßcr[É»‚—Í–‘ÕÅþñ2B*d'ÁÕ½s©,€G૯©,Ø>‰Øì®éW‘[!;€* UÆkC<Õ¯¯ÙO$\åš¾LžÎí/ìÿÃÍpµ¼({Ú3W Çý’‚çGN¤šú´W7ÃMÏÛ8\;ÿ-R݈nawÔU84!× ®KTE>®Â³Ñ¤ˆ”°2y‹Çë\…t²Ö!MCÔƒFEß@`ÊÛ0  a®Æa–»—äñÊYýÛv<÷A\0&þ€H{Í_šeçTÜ;üœiÕo’Ðë!çðßÊ%ƒ«Šq÷•ëŽÔ–ru$“ëZW1Z€ÊŽù,Cb‚þŒƒxfd꙽ģn/S{çqÝvL\EÈE¦PiQiæþ×¼m\›º–ýT²aéW4ÿ9}cW—}£ÿ\1îô"Z?ËÕººïÚWÃU5]NÿºíœÚc‹ŽVøïŠÝpµ}æWkùˆéðí´á¾yP ´0sÉç4ß,©MG}›$ôÄÞÿŸSsˆ·Ðœœñ÷ATxÂUëž9HðµóÞ@p$¸jQyíöÄàР+ø MÙÎA\ýIñ/;¿_A‡ö Ç[Çr«Åû!æ">"?Å%C¯Ö/î#óo8:iÛ£¥_*'?VײB©Ss0\Åwí'VAø‡«ˆ¶ÙÓ{6ÃÕ…ï’Ö~P9ñ!‚«Žü‚í“ ®†ß‰K®¯*C¼ÆE5®1?º Y°vÁÛåú£^1&|ë¾’c‰å$þà÷1.Μ¤—Oæë×Z«ÜœÃ’³ ®ŽºU2ìŸP›-àêq’y.£ % IfÝ;GÐÌííû.Ônºnч´Ô¡xV”í›z½iõï<\¥ç†KûÚ¨ÀþûT¿”ƒ«ÊIZ÷F7fdA­¾®Ê´&$?5âýÇ®¢…ñ[\¸›¸ex…+eïó=«C”ÂUíˆÍYù3Ä·C÷Qv鈹­ÃòÖ·„«V R0š.ËÁUÕ¼·‘V`Pã·ÐüÉ\]þ]îú!Wg¿)‹«Æ¨Gš‡~Ž+ ä•f¹ ¸zl43>V6A¿øcZ‰œŽ“DÂ0`ц.Ó™f¸z0ƒ ’CÈmþ­&¸ÊaçÆ£C¸ÚPÜé=šñØÄ–ÁUÉðët ÞVNzÄwüv®Òæ¶1ï"ä üÒ¶zª}|e ]ñbÞúÁ–SÜœ¯@’ÎkûF¸ZVHpõDÛáªÝŸ†œÇ„+VÏ|ã…JÀmŸ߈D¦Ú¦/ËÞ/Á²ë¸Z_ÇU}ùñ¯WÇ݇¬Ÿ¿.'«€*Jå?OpuÉPËúØÐ£p³ØBÚF¸:ìÚî oð'¸¹Ò‘7!÷TF>Ž|&®V;áQ5s^å©:î¬SK³_èáÈŽH®¾üžÂÓÂ)Aö‹‡^ I|îø/˜kÝGkfmëcûàIJ£^àßÅ¿‘, Ðc€]ŽøëûÈI;ÿMÄÓJ‹Éx[7ÙÄU(h¥À¢qÎðxPyBc0ìˆÔÇ}Úü"W6$ùa† ÉÛJÞÏoåj·c–ë&~ßñmk‚ÁÕúWÎ)yø^{äuÄ*LYêÙ¯ þÚÖ-5œíkÖ…–¿y¤iÍ ÑRt®ÀrƒƄ¾WÝnMô›£Ûs#È@Ö^¸úDàêΩˆ¾²­ã†Ø±—Ò¹p5ÓH´³_0o_t0Ž6ójù@àêÞ¹èT'k£cj 0¸*t%$êç>ù1®ŽêÕWSFËÂîõ¿Ä~:¹0#Šêíœ#¸ZZ€ÓÆpàM_LŸhƒ'Ê&†_K{ÖdÌ4oïùÔŠ¯ÛO­¥Ýý:®JÒ¨Úêˆ ÓgÐsR‚«»4Mi€êæ²h gv&BL {ÂUh!´³Sé7£ Wc„DÄàSŒ½w yŠ|Ü=P¶¶CqÈ óSF‚«µÎBKÆ \‘—ŠÆ@†ï%¸J‡6AÃ`¬9$ieª½4üWÿ¡‹ߋӦá?é‘’ÓëýÎ' nˆ ¸ï>ˆžü¶§pU¾~Y¤>î?pÕULp5}û ô6‚)éX±ÝW}虑iç¾.}g7\íW!ãK®Ü,ô=ó–1m‚«´égü§…éQè6lúº<[]hXò¹<â.6Íi—ïºáj·2Üe¿½®®¶Ï¼àjm¹Íºd†'\ÍYAàLIýàÆˆ%îÁ@Fšo ¼‚¾ƒ«)ÆßÈî W‘""øªg¿lZõkUa¶×nïAŒ‡«HiÙšè*« r˯Grs"©tÒÞè¦RœýJ²6!í…G˜F:©]ð–<ü.šüÉeÈ Ø®¶œâTààêVïSj¨ÃU^ 5®ÖC×Ìx®®Æ„«8[d¦Š YVãÈCrpõ.NÆpÍØ\caî©vÞ¾“` _#[§=­\ ËYù³ßß‚ÖEcúN|õkÁ)‡æq‰R‘mIBo ¸:âÆìéÏòpj¿Å(µjµN+²fyDõ¬ÿø¾‹6‘¾ÐŸ|'Ô#úÿƒ«¹ë‘îbpõÌ/Œ Ý¢´ Þap•ÿý ø•õÁ ?a\‘›eZó»'\Åq—ymö=þ~‚«s^…vò=÷Èr Ž€óÁÙ\­¯E³³ãÈÂïÄUämJ™‚'\µ¨h÷ÊŸ\ÕÄ}O‹GB.†Ìã×èqpõ[\r}M%Òœ@Ñ‘Cüç8,Zϰô+t<†´¥:8\­vÙ,VŒÙ¸Z @®JÓ¼›‚ÛmN Cn…VÒ˜ž#º¾7\•Ÿ+¸JS…sNAÉÀxÞw®jæ¾O…·¼vÜè¸J»ÜZ5¿XS?Æn½v^o]ñ"ÕÜ5Í÷H9ÑD5%ùÈì'×´õ俬øÑ~z]E®ˆ¬„‡«Æeß çàž–ÊwÑ.!¦³~×¶¹©ëëྤt\5è]eö „{«`Ò>kW'á4­0ÐØF]ÎìýÞpµ¬PÛG:úVíü7áZÂÕ!ôЇ+\ÌþK>døuHÐTW{"] WKåWYÑŒúWIÖfO¸Ê¶Ž*7çÎÄR¸{•Nûºÿ¦£âUHZ«‹ øÑÜ5!âÁW"*yÀÕ5Aà*ò_xÔºJÁUx EFöŒçùwÑÇda·#fÁ‡KD2â W5s{;$Ûª,Ùí«õµ.ÓxrõÌ—lbk¶¢ÃKãEG€r@¤ÐÆ4ל©¯«BžÔä®LÓ ÓL`s»« U†¥_v|ÛšVàªñ”dèÕB6dh庣è~ö«„… ѧ†]p÷‘•lrª3!9h¡Öˆ!äÐ?ÙjŽ‚í“ɱ£Ã»ŠýîTN“ªœloûáêŒçÂUªAºnÐ9«N[ÁŽÈN‡«¦µ!~‹Ä¢éàv´s{{ÁUHˆÂŒ™hzò»&êK<è ûéä@¿ ®Ž¼Yö¯¬—Obe¬ âpÑ3ÑÍê*¸48aQÿK0ØóSÂhIHàj}m±Sr¨ÆaÖÇVÚ¤]ÝÜö–]Óá¯üŠ-/>¶gX°mBÃOjI™¶Ží8\-9»A1áièõP•èE° Q»\¥%3USž ôáf¸ê´ÉÇÝ+ê)m@®TM{&\­È—¢· =Á+t×"þÕ W7¨uû?EŽ©_ô¡W¼@:F›Ÿü;äŠýäjt*š¶!ÞZ¦ÚÃÁÕß©|=WÑ=h/×)OBð´©Dpc§-6BÉFߎ¸Ï; W¡„©øÃ¨[ _!…jò„«Œü[x¸j–qUV6ø‡«s_×Ç}âù"m@Þ£®v‰ «%gÖCa8dOï™·1´Aðöˆn.O‡÷csי‡oÌM›kWÇü›çæ-²Ñ·5ÃU›Îv(>oÝ`!Çäá*¢S/a4suì=àjU¡:oShÑ‘¥Ö½ÑÜ&ò?ÛO­epÕÿ™xÈUê™/JGÝJOZ¹•T,}Þ¾pµT¾‹Ÿ2Ô┚᪭põ]¯]x+ä&÷¢ÑlѾ$[Ç4ÁÕr/†`?•Œ¼™…ïr-(WÅCþ WKe;ù Ü?(8eBôÁ½&²w(:a ‹Œã\ÀUó¶ñ9Ð'eŠt‚«+~äߢcB¯ÏÛ0qÐ ®Ò¦¢ñŸ1¸ŠNhÝ;W \mìKV ”¼'\…ø ¼L<ôjdÜXT…uf/ßéÍ0ÈKÜq‡d[3\­­B[yÂÕÜuƒiŽr'¸ ñœ<ˆÁUÓ–qŠñˆü _žl†«ÅFÃÒ¯ûÔ×T ?àÂYYYØÙQ/ •®N •Ãw«‹ A8U}u¹m 4juqƒ«¥²æÔp|Üà®÷…«TÐ`ÃPVMxcº›¨&ÇäO‰–ZoŸä§¶éPB ?‡¬×å™û@BÛÆJ†^V‚¯¨²i=g¦u \Åå'½ mDO`·iÛê:\…+¨0©²jM«~³·eÝ.3‚«œßC†%{7†$²x3´³aɆ%_VæKY)5óï¸Z+ »yP§ÀUý™½¹;£±t»ÑÿÛ´y«pk„«ÇWÀÏWä‰Ñ=hyìÖ±¬ÿ »„C+9Û¼Õ×yO9áA*¡6øªf¸Z˜ -- ½Á ®â޳ò)ð´‰áôgáF‚ÀUøRsj˜Ss ±\}‡«T cÛ8öt†ÁUdÜ–"~Æ;¾ÎmõøWŸ2%ý"tRTH*x2õ¸Í`puÝ øO$ζ̅Ƅ¾¾pUzƒ$ô:ëþ‡€°Ê{>?;| 9ÕöÁÕœÓðäÙSŸÁ ´ ®jxô¦õ‚_ïÍÍOv-ZÉ©ÎôÛáÊp+õñŸ ÜØ(ˆµWOâ~y>–ê •kgO{¦Mpî¸Ëá*ž*òqvˆ}ªÈ' {h%ÂÂ÷ë*ˆ2šæ­ãªKráßÐt|R–½ú™=Ôk7\…n¸Gmó´¶ÿ¹€«5D·Â0Š;®æ$~oJêçw|Añâ>¥Õ1^pµÈÙÃà*üž6úuÑ Ë©RJ@¸ZŸ)ñ²hÈÕÜ.¨4í¾÷©Dññ$ÜMËŽHåäÇ™ËÒÎ{ލÝpÒÅš¹°ÚßôoxxNüìàõ<ü *A ±…\bÙ9%?eTÞúÁA¦hzÂUôÒŠ\‘,â_$oüÍßö€«VyÄ]ñpÑ~ŽË”»\¼î&\1ä",œ!\ ºim„9—á8ƒ«p„·Cš¦šò$äzyË{ê W1Ìyqù©a¹ë«gšE=³—,ìvÍœWpd7·î­ÔV¸ C¦ ?Éévÿs¨þ#wã¹d¡Óßúq·\-6 䪦÷ð•CÈ[³§÷Ô-|Ïw"N WÊ-;½¹Óá*;“ïä5°»%\%¢;ôZñ¯2Õ&P;®²ôÁ°ä §jŸ7\Ý4B2¼\…ÊÒÇ}‚V…J7$ôep•*Vín\­.Òã€-àê€Ë²B."DÕ‹äeÏxζðV°}²bì½èÄ"–K󮦳ã່¿Hˆ»z<²o„«ë8¸z2½ÊiÇuá̽áj‘j-gÅžp•VøR™åçhâÇŒçÊõÇp—q†É ÐàX÷ÇHGÝR]lDÇÓ-úã9áô˜&é#NõB~š‡«ÇW\þoÛ᪠ç)x™çü+š ¸}ҹشW]¦Üƒnƒ﹜–í~‚´ŽV茺ź7ÙºgrÔA¸ÊRx³\­v–œÝˆžƒVEöÁ6¿@Ëç\õSÞãÈe<…l¥pÕaÎM`;ïÔ”願ð N7« m"î/SŒÅG;®ByÂó ãñ“u;bº#Õq_šçß"¿«³ªÅz‡OÇÁ³Ñ:t³L:âºGTV‚ŠÒà”Ì[ÇyÞ‚« ßC PN~D<èr®bÐAKËÂî WÑñ²§õTÏ|Q~—.ö£@çãÓ`t²m/Ün•¿ðºÊÒ:—½¡Žd?ùÏ=ÑÁàjuyñÑeè™pkŠñ 2ℳ§?‹GÌzOø± pQµÚžkË\d\öu™2ßåßE¯ÆE¡{\ÍÚŒVBìu$È4§·pµ¶Ê©>OŽTÝ–Ó‰pÕ~*Ùÿ’Î ñTj)\EN}>áªSw¸³ö“bpµèèrás×ËuG¡ÜÐ :åÚmY@3º¹gsT¼.ä"ô|Wa5ÕÅ9Áàªjoá*ÂíÚ#®B¡ \1Ô&«)…·ˆ±ìw‚n»Í÷™qùw~· €·gSîÙ¶¼\Ý>™MÅ7.ûF3ûÜ4~ %áW]!ùT4üz8¶h} _o„«•¥…{¢USž»F5½'^§IýüV¹b…Ql+[ïf,ÉÕÎË©9À?¶£Â#;§š™Ì<Ãy‚«§Ö(ÆÓ£|š¾›®¢ÁqJ¹Yì¿U…ÙªéÏVYµúE8mYý¬®–Òn#oÈ÷{p «âc+5ѯyÁUš]œ6CwŸ‡«†¥_¡q.[‡«¢Uäèiü 7Ö®[¬ An­Šèƒ[&v-r^ôü×~rMàâØƒ«_¨¦<ÉUŠ;ͼ+ƒ«ˆ8y›FÈÇÞ»~0—ძõ¸4o¸š+BÏGÖé|’m´ÁnË=«KrU³_톫]bá*U–lULx wÍm„«±È÷ÑKÑ‘_¸¹ \…ÞYè$ÈI•“…ë놫ÁlÑÉ™%ª ÿŽ=½¸ìOéžcýÊc˲eîªù«uýÉŸK놫kÞpµŠƒ««ZÀUš*3üZ$8ˆk´Ãæ°kãîƒÎæßÙ3ž“½G=ó%â9nwÉ™ ˆÎx±¶¼Åº•àp‡‚Gü˯no4·[Õ‹&E>¡ÿ Øw2³pµÈ®úiäSû‘ï.®è È^Ñò´<3ìö€pU‘‘Ÿ^êo%»¯yR&NèÎÉÛš¿iDÉÙµ®b4,´4²N‚«ƒ¯"Z5ñ!ÙèÛ¹ªMÜj;ñóÖ1l¿•V­Æa¶î é®n- ½Q Gó‚«´OÙðkÙn8=Ä~r5-Zß©÷fΊŸ\….â66j4£-¿S‡"wpÆ”xèÕY!ùœÞS1áA“VVžöS¶ÉlômHO ñŸÑñÕ.Œ®^„¯³Z¬8=ÏLêÔ´ætú‰3™5ÕUæ­ã”“¾Ò”ô ?—æF.ú0'±®ÚO%ëbÞAO†Õ-xRy%„(ÁUÂPÁáꟑdÝÂ÷讥FàP\uUšežµ:W%\åY3k„«þu WM‹ßGܘ¿i¤ç/6ÂÕA—cÄI‡_mƒ”kòYUGáªY_ç Wá®í§Ö¢ÿ {«"G¦ã¦Zyö¼ Ãü’ŠŽÂÕRsÞºÁðÃ,p#ð¦Õ¿[Òg\%3¼ÒxÅ2åî dI¨¹Ýu®b¤9è“*ÔµÉt‡×«c? ôP¦¡¶JÌm}.àªC¼•v²CŠÍÁUIèõðóhI6Y´\œƒ«Í㽦Ԣÿ&7ý^tì¢ÃKâh„«á>p•5Þœr ŽLp5êüÑ$Èù4ÃÕ?YIU‡õ$)Ô"~!|«¤.ÖÌyé$Fœ6N½:A8\Å™°ýDе ðï"îÃ1Â`d5ÂUŸƒ¼»Lµ‡Õí÷kõ^À¹¡1Y¶ËÁÕL¶S3Õ\í ¸J{¸ÌxÎ~b£Óþ»â‚·ÙüÞpµ·,ì]Ì»^p  ®ÖU;Õûá²àÒÛQWЯтÜ)O¢…O§íÚ“~9?5üƒFÜÛ§»L‘. ¿‹=÷dpµ¶¬P=óE(ôs‚«[Æàý\~‡á*4P¸šÑâ¿u̸u ?aàw.\EÏ×Ç}ÂJŽxY}m%•Œžü¨W) ‚«i”ÖÅ~dLèËRA­‡«²„~¢7C³H ½ÔWËàOÔ³_–rU§hW£™½ ™Úͨ!éáÇü>¬¶ç—ëò…1¡í-;¦ÚÕ÷©xÈUláÁ¶ñ~…egÁU*a:öWÑŸóÖ Báä!¨ø[S]lÄ}„’ºÂØ«“ðpò[Láà‰RÉ6߃s–NÃ÷ú«•¥LWà‡õTÓ{BÞèb?D,Wí§Ö('=bZÕÏ ÔópÁv0‚Šæ¦žJn„«)£°8¸zhÀ¥®pÑÅ'’ø©§Â­Ê¦%h?ó%:O’3¸ eŽ\ ‘}†‡«0hlün² i7"øÁÂ=³ýÂU.ûk1¡§ªŠz±,{ûF·µÃ„ÀUt68dÜòð»à`ƒ×f÷2¶¯_Þú¡–SØ 87¸Œ$éÐ?ò1=(‘솫A¬®°n¸Ú¹æWàÎ$ý‚ÑZ˜1˼u ÁÕuƒØ,”Æúç®–œÝ(óo_¸š³âä†%ŸkcÞÉMP[n+>¾Â³ffCJ…L_7­ú•=ƒPÉYù3âu ¸Jr:5Ü‘µ>?eT\½Ö~zšqùd!²Z¶?)Ä9UGoýÍÛÆ•)÷xŸRC®"{ú³´ÏrØÁà*·#$Û§w QX\…2ÉÛ0ŽòÒ÷“¥Ò4Ú]:î“jŸ™L«~CZT檻7·eRÏMïL]*Û)¤ý[ÀÕ ¢®]÷)ú^M©¥øØ ËŽH(¢CñPS\½­®JÒÌ["œÂô·B4Žà®6n½½ì›rà ÜPÃÒ/ù·r× ]´aOÞÆáÖ=ÑÈ—µóßD·‡$Co!¸B¡.|a7·R º‘ƒ«£Їü ŸÅD¨PtuñÐkðâc‰¾ß…ƒšEj¡]T>áàjyIÖfWÑý\5&þÀö£a… iN ¸zö@MM5®aý wŸ®ÌÁÕзëk\ ®–œ^¯]ðŽ„;¢Óž)Sîvˆ·‚«{ç"m¯´¨h××y½ó6…Bópµ"_ªšÖ“4gÓˆFÊ`ZóRžÂŒ™ÂÓ}þáj}-ÛÌdzd"ƒ«è±è«è´Ò¸X‡(•Õ|sw\•yÃÕÊRtZÜ ÍÜÿ*'<À^GW¤êÐ{¢ÿ{çÝXuµm%tHðQÐ{¨Ð{ „@„dú Ó{ñôÞ{czñôÞ;ÓmK–,«ZՖ˸÷¢|üϾWÖÈÒ•-{æû³™¬–Gºº÷”]ÞýÞsö޾ƒ±ÿ]Dµ\Ö2rµº(Ë»ª»Paæ=†^·ê»]ïZôû(„™ŽÑ $Sݲˆ8 äj]- Êž-rÕºIúäwcmO ’«îä³’-6¢aÓÜKZ3Š ¹úíÏl“Þf«1)ÆGÈÕcáäj¦eÌóJFŽ“[_H,©Æwx̸)áÌõýÃï/ï\”\[æé#ž@‰@ŒU¬þD’«,zi&EöÒ}T›\EìwMÀG0.9 0ú¹ä6ûÿ³¦«¿CY!W¥DûöÑ’SqÄ“®Åÿ,¶ìÙ†¾åolªfÿâìÔƒ!á ƒ‰@b03DMŽ¨Ð°•«ÇråÜDêf¥à/”wd9òjï£Eþh¶hrƨsÍ )~t3|šYj„\-±fé­_+‹dk¤5N®™v¤(‡¬kš¿;+ÆônÁYäîŸÿVX&Á9ÿo±ÈU–EoÖÙ–54T|«RJ Ð°Y¯(ËdôÚG„\]ÞzdU7ukD; äjïÛâ'WñªêÅ­­–%ˆ½ñ&å gþ鬓«À00†fåÓÚêòÔž7¥ ¼'Š\µg®ï‹óâ‡`Ý·?iãñ#ö-„ZME!ÆÇ°¸kr·¥Ô»â‰J'$ÃÕÀ{ÅêVƒ-­ã^$ Hns!Ú*XzþßÔ4)aX…ÝþÕV5A€€ÊÜKÛj&œÁ…!6’„¼Þ!ÒsÅÂh§ À/¤´»”î!`˜»­œ¢g\=8ËÐç6•\Å¡`?kJOź/ äjf«”7­Ë;ð+MîYD·J®â/˜]矙•4)Ñù%Àóˆ.æ]ƒ\­(ÊÜ8(H®f™£uü++!W÷M5¸»rUªH ¸›°"9„ÈUû´÷Ö4äaB¶ ¹º¦gúð'Áòf°Õù :¦ä‘ЦñiX )Í0á•äÖdÌû\-LÆfmVê8Š×ÃEâô…\Í8Šl{»Ú&½)©xob°ºzV™5B`¢a‰«’Ûg_ÙF<¥Y 7ΆÑÀ?Væ9ÿ/€Ð»ÅE®]ŒA8u|)¾Áh’\E‰òO®TÕ€½Í£žu/iEô‡Ò…®‘=ÿßÈÚ:œ`?ÈÒœ#WcµsäjŒvŽ\j5ö‰^tÇCeƒÏ+Ó‡Ý}^äÿ®ou¸´áÏ#ÉÕêòœ}ÓPy©¬¤««õ¬ì¬æñP›àa;ï³O}·ñW½xê¢´í¸¹3`þ‰†^·\?4G!WƒXÑ1룔ö—,íSßSÈÕ\œ =çžØ"L¡tÆÜ¿ªgiKÇ„\xo,rµ8}—omïý]îþéöéÉUÉÛó¸¤îúhú°ÇÒ‡>–{pŽdÛ;•>[ƽq®§ y5€$ c9=+:1«Ö‰¯¦vÿUãä*—mý,ˆŽGïƒU›ìëu+x_ Æp/kǯÂ÷…¡„eÜ ŽR©†7!WG?«ïv½’åà>¦Z{~Ì{r5®úA‘äêf…\ú¾ƒéÊ=03SÞìÇ}ýØáòrµPß,rÕ-äêÀ{Et>æ1pÎÿ¢<Óˆ¤Ù&ž®ˆ­’« z‹\妴¹äjuQO!W/à ?+[X[]ÀH{È9¢¨¹1Æ“ØEJ)m 0³O{¿È¸Mݾܹ:ò霽S2æ|æ˜õçð°]ÈÕ_!Àaäê âÛä7ÀlT/#Š‘%SßE×BHÜ:2Œ¢±ú"äC)LÝ,»%›$W±[†%·½¤Ì“âY.ûQ%áÀw牒ģ(‹ÏÓÝ_ ˜‘«'Wº|mõLsχÖV•æY ëtuxiÝbë~ÆØ¬¢Õq6!W/—bgKÛT†å ’«­/Ðu¼’@ÈÕŽW)EK¢Å¾-H®.ú¦¼>ˆã‰y‡æ"<ÞU]Y µFF#ä*‰i!Ti)¹êGï€pXul²Zå0{×xÜ„eÌ$¯EûËS{üV;^Á¶…ó\WËôž ¹J˜¢ºz—aÝ=ß4îÕ>+ û:^Yâ8|æ=l:fɹàk©¨#Þ$ %œ/LݨÊF™+‰h ÿú ¡«eÌsÄûúoÆÄæì›^dÚ…!’ôúYWd™ÂjcFÐn4=Ñæ¢ÆÈÕä5„uñƒ•Íûgp7„G›\-=ÅèÌ#ž¢{˜¦ôa¿ãb¤Q%W‰# të!WŽû(äŠÓ½¸U4¹*µÛý4gÏd¤N Fä2 ¸†_)bß‘ž49"\6ö\ÝÀ\[U¦f-¦ÏRЪ4ïÔ‘EØXiÌ£›¹š©ž h„•JK¹È@‘)ò5«*0Åæ½JJùWâ$Ùiñ«X ÍÌ¥{&7Â-G´¢ô]³?Ñ Á~ !'õ×\ ¿ÆƒF ÆPwÈ««±Ï39•¹4˵¸Uyf¾Õ³¼Ö^c,gƒ\5ö»Cóà|tÃÔgÌù‹  uë¸Ú–͆¼iüfrÛŸ*Øæì”ùSH€Ç­ã^”tFQÆeÄw¤õ¿+‚\[Õ “b›ôöD×ù–1Ï ¹Zœ£5êâl}ç_× Oéq‹¼‹Qì™;Ù9ï GþÉDÉdòýãC5ϹB®öTïƒHíq#.&nrµø ÉU 9¡:K‰bþ{Z|äªdúö ÓÕŽ™jòÀ«€”Ø¡,J]¿Ç £27%„ó**¹ŠÌK*)á!¤&‡pŽ\&WÍÇí«²««þ÷‡Úò¢…[Ž<¤\öðwiKü5u?üoUyñŠ.s\=ðÑá}%uâk8Ñ0ÒµðËø—R»ß˜6àV!¹J4 $(HYÏü7$WOùÖõu.øŠ@2k˰ª|7ÀRrR¹“¥JQë d£Â€»õÝ®/¶ì’«©›À±öëF4À-hJˆî±/DWfe‘"€·Å‹U×£Y•\eÑ oUr‡Æ£·!rUö•µ¹¨ÙäjIŽÛ5¥"çß:‚ÀA¹ö—I±ïÁ •Ýÿ. oôoÝ’\Q²}*gíßürÍ•êT­Î·Ž؉˶O?</ÑŠkÁײ]¶ž\eªó>wÌøSæ¦A¡X¦"ÇÊ,™‡”—ãÐ RÖJг6zÿšŽ ¹ªß(ÛDÛ\TæÕ7²;1´C ÔqX©Áúœu«La…"·ruÀ=B7ýû4¹Š´ˆ\-ÃJè»\ž•Î ¹zdQ³nOcÔBo©£—}:ÍZµ°L „6¹Ý%¾µ}XÓ³H®"‡¬‚§žt«­,-ó꟭ã_"Ü ÖPë€TùE\µX&ÙlÞËÂ!öR¶™ h•Dpúè7`XK™)~´®O0 t«Ÿ°âh £>óÊPʾ3Ô:éØU¨êÿöÑšAhy¦™EFÖ]sÓÆ¼¤NDIA ùÜl[S`¬0±†Œ|fmåTiÞÊ\{JÛK }n'–W3n¡ B®†Ùüª—˜ Žr¸>gßt’1÷¯(ˆsÁߣKÿ YxI ˆdö;˸—'WóO&Jx®„r7Ù}h.+‹~ù·Š.íAôªÖòfêP l5‚¡T[¾ŸXǽ„{j„\ÍÚ”Àϱf˜>÷’ÖB®ºO%^˜Ol޲ürÄ '¥« JÔÕV—›†<\b=ÐBrµ²D²+À†Ø)âÛæ‘«þtååÑ‹¡OðþéCÅ)Ä ÉWÚÀ{d¥†?Q”¦•H'PW”¶ãnJ3´Çßâ!W ùñJgø µI§A÷±ño…e°öÄ: ÅL²^gN%5Ù0­€[µºu)®TÉU4‘¥(Øbñp—`Д¦°±®gH®*%ÑãZw!Wg:Œ©‘ª|Ø™@çXÀ[‹³UƒˆTŒ-jñö׈†’âƒlϲöQIG˜P‡¡×­ÅžDÅVt’ƒ`£Ÿ3([[­“^óhçb ÔUf‚ Ò¶ÎLéu{hã@ …_§%¹ŠŠ‰Fœ±e@€‘4!W· #Xr5vz«œ=“Ã_ăÜXåÈÕùÙ;ÆDp˜*¹*ŪL;Ò‡=.ÙMG<­ÂRK1emrÛKìSß‹ WÁê¥äª+ SÏzáÁñDƾ¿i„\ÅhδˆxUª¦«žÙ§¾ lšSCÅóÒ |`Ø<úYð8™ia¼€aÜ_³à}Ph%Cþ«¤xCÇìÕìsxy…(‚MƒdþAp)hþžrljÑ?TŒX~à¾IûßÞ™[(¿hŸOÎÿß|«éÍi{ï›™4.3ðÃãî»{âþ?îHÿǃNÚûÈãÊ’ÿÍJ>ñð|Dg©#WO·Ò}_^[¿'U›\½ðµMMœèÙ¸q£ÝáÈÎÉQ›?ÓãØ4Ê4õƒL›Î–ØÛ¶¼{v¶ßº¤cÊ·§w®ÊIíοHù–ö3˼¯B¿n™ÖûºóÌO¹¦ÉæÜ=[×ã¦Ô÷;wÎÐ÷¼%ËmÍ4v&vOíuKrûËͳ¿HŸúeA+>ÏØ5Ã4ñíxîÉ0;§'w¸Â4á _Úa>ñœØ˜>ãÓÔ÷[—uÕü‰kÿÛ².îÉ~#cë„´Ñ/86IéxuÆŽ©úÞ·§{5µÏiÞJMx„yóØ×2ŽxÖ8ò9&¡Ápö̵-ëê>º6òþ,˂ֺn¿Jø€®ûÛ'7Òã¨çqÙÜܲ°µuyW×Åš—ÙVôàVº.¿¤3>ãAóìÏ…%ühô•îcëÒÆ¾’>õC¿Ïñ•yîßÓÆ¾ªëþ?©ýïMMxØK’ûèÓ”}i‡ê¿úkJÇ+­K;ySv24æu7 y̺¨qøÓé³ÿ&;W{Ý–ÜæbÇÆQY.Kü"å²Ú×&Õñ*ãè|öTæ–¦t¼JÏ<zˆÙÖ÷úµcmBôoÍó¾Né|­ea[ ë2úyÄ2Ë™îØ4]å¦þf iÂ[iÞtYú•/u¯yÆ'¶ÕB®ß·Åçó2'æ9_š¦}„xõ{‚—™Ž†=™6òÙÔþ÷0.ÏÉM®ƒK Þ’It¬ß]§ëÀ¢ŒÍc$oÊu9´UÌ㰭쉭ð]“>ýcn‹Ðò‰cëD늮“½ºÝú>¿Éò:³s²ƒª±oAúŒO˜a¦:þÉ”gù\νó“p]óœÜÌÐ2vL W±¬ã«ýÉ›³}ÎfÝ?²eù26F÷Óg|ì3>½¬&&¿ÞH^l™ÿ ‹âÜ3ÇïÍнÕjJOoñs=I[ßb2½©{E°û+:;{§OÿÄïÉÐ÷¼Ùg8 ŸÛtXdžaÑw`ùÜÇÖ"Ï,=3ÖÜ0@Œ›uq×¾ï0,²/qÖç˜A>1 |àôÛ·ŽW9wÍðgyÏh’e½2}©ûR:\‰¡ói_“•i9ièÿþÀÜeÚôê?SÖOÒ NÃöÊ}üY#ëå9¾>;³Ù=wîž™>ém¿W[®²Ü6Ûª¾ØõŸ˜¸äW2.Oòv¿¢A( ué·Û&†~Â"?bYÜ1YaxG¦OÿH×å:}¯[Åõlñ1õ½ƒ=Að C~gû²8ˆQˆÝáÙØQᦆæ÷ØqF²²­/`2±6‘£s CÂCžÃ‰)®Ðwû– e4L|/uÔ‹i߯=1ŒF£æým«úØWõ³Ìû‹gžÿçø¼°ßç–G{3Äö¼]c°Ï8ªÁÓ=vyô‰tÌ2ÿŸöuƒ›.Ýô[§ŒÎPå+Šç[ÛŠîž›âZzÝ{p‘yÜËØ7å“l¿qŸïäFì'¦}ÑžR—<£õ²qüÚ^,Ûïþ~¹®ëõ†¡O õ͕ƈ–œ’âñj‹4@È}h™ì[ú-ò† ŠÖž9ú¾¿ÅÁ!9qþ„Á¦ÅÕü–[áìÄûŸžŸìl—ÙoKnĵ á}$ ÀÒÎXŒT™±¿U@00AHnmuYežó7|hôM\û™g|Š—”žÛíÆ´´æu#Û/˜­Û q®;ŠcšøVHвÒ¹»ù3ÝÜ›“>å}_Ú÷-› Cc2­ÉÜí¬Ì°ïäTû`ü˜:EáÇ’$·»T×õ† þ*í{V×õ—†„GRÚ]jù6~‡ë5'0ÓžŠ©<¾iîÉž¿qZº P–§ãøüþL¯%)ãøfL HO3Mz—e ¿ö×ãX?4Ëin|\æ™IŸö'ÕÿF4qOƒòò•?SýÛ‹¨cÍ4o…Œ¥tú™cË8†LÄáwk(U,XÒ–l·ƒã7mÙr´Àu¹muÛê~x(üNäe>gÖ¾Y<¾nñ`ð`¢‡–‰‚´ù©=±w„õÈÈÈH5ü^‡kï<ãèY‘Ô÷É"n.æw—äþ2#“‚_eùì«ûX!~<Ô8òÞ“[@Œè#øŸÞâ/0 "œšC[3ù'ê‰|¢7þ~¨ìjÀà¬îgšò~ê öè;ÃG6ì)P‡ê¸Ê•±elptò¿,ùO“s‹€%o3{’ ‚s“Ló >ÇË+½:d[Õ׆S‰!uÆÏ8¬1¯îM?.—-éd]ÜQ´sb“Ĺ3ÿ’ŸÓb°wÁHèLiêàÇÂÁsYrÛKÜG•´ð&ÿÍ¡ˆ}c×dû3¶O2 zÀ¡ áØ—£#îú+Å’ñ|4þÔµ!¢ 2IpŸiò{Ö ”íw&ïÌÌHOü¨œ ûög€™’R“#-&WÒgäõÛÕ9çßÉëw^Äßö&äÿà9¸ÿ²ú¯¾Íþ·}ÏÞŸM±¹þ]ÜqÌFõ'—OwfýoYŸñ›Þjã-늪rÓîêÿŸÑYjçÈÕÓ-P‘ãrØìúï^»¤Åäêú ù3³²‚Íçµm•6ñ¯%Ùº¢§eY×ÌLŸui—”oëw®¶úIr»Krõç„r¦éŸœþmXóyÝŽ“;LÆZWH›òæ5q6Çκn7‚‚2vÍÔõ¸Å—avß„Léx¥eÂkÎÍ£ÓgþÅü]+ŸËæØ=Ç0ú¥¸nëqÚ·MIîxµaô‹îÔý|‚kKŸùþμ¨C¬nX—uqYÃì›Çáëmë†ùZ× Méö+Ó¤÷ô=oM›ô^Ú˜—,K»dZaMì›6öUã¨ÜÆÃ î³cšuYW×Ñu‘ðyÍßý‹yÖ÷½xiß:©‘þ§y™ Ú8úË¢ò¸=ó5/³,ïÆÔ¥tù%«àÖíMŸñ)Ø•H!úJ×±õiã^7Mû(Óç‰øŠ€—Y×ãf"kãð§Ís¿Ò|–ëä6óü²ñÌ¿Ùl6AQq˜Ì Ûš¦|hú¤yQ{é¨uõ@ËŠž¬‹}óX oJçkõ½Àp%mW»ç<œh^Ð&ãÀ’xžå1~o]Õ0/ËþRjšú'ÀOú¬Ïx÷É-ŒÎqp¹ú­iêGÉ®°,îèNÙÍÐXPÖ=5á–É0äw–mdçêÀ˜Rú‰XÆ/Ò>§Õ¶nhRë šqì«™Y™†„‡AÔøÄ”Î×ñ ¾®ûMÖ•½£kšõ¹¾ÇͼiÚÇÆÏfìïµ¥Z×Öu¾VÈÕ‰o‹Æ#uèS– £<¶à$»“wš¦~h[?œ‡=°Ãíqs™eAknYÖÍÍÄÖÏâaú¸®÷íIm.rÛÀ$†<.ŒY×ëu½nÓ÷¿×±k–uM“Æ·™^W#c´.ï!UY÷/f’¹­qÔ,Ë»ÓaÛªþ–=XM„ ±ý„+Ó&ƒu²­ÿdʳܩל&ÒšcÛäÓWz]æyßXWôðZuͺdóºmk‡0áX6wêÐç^«ž% ’«m.fn“Û_Æta1Ô ÒÍfc½Ø· ©vÏ4íϤL×%ú÷§Ïù’¡,[·G1ýâa[?,ú†Á`š\'¶¤Ïþ2c÷ÜævÀgO# KŸ÷OÇžyI<ó3”eþ~ûÖñ*ûÖ‰!ÙpŽ8 ‡½.›Ïãt8NîŒ÷‰>+i6Ö0ü·~¿ö5™^OÚ:ã¿u~¿´‰j«ÿLZ=&eÈ“Îïµî“‰ ~h…Ï“ÑÜ™a¼ˆwh¡#ç-#Á`Q‚rb>©ò®'ÓÇ'ný^ìŒ}ÓØLÅ(9S–õÁ¶ ))¯fJ­«Ƽ‚©Á˜3ö##ÁýÑÍ”.׉…þtÚ„·¸?WÆê°cçLV £Ýô¢;­øJ•\å^{¤£M–å=èmÆÞï0ÒáVç'·¿Âº¬› 3ó3çþE«UŸšªyŒ³ueŸôÙ_è{ÝÆተ>§E}tê ‡õýîÒ÷ºÕAü{thôöi žn7â˜\Ç7ð‡yÞ?lkš^¬-ã±¢,tpt[&Cé#qFŽíS-šZ«¹ ß§/h›üíµØLEŠ|ißµ±¬ªëõëØv&Ó“vŒëqés¿r\¦%>&Sßól/Zß\iŒh'Ožtº´ 5¢ž±gžT+[ØöL­âiÑš†Á]2™qþ$cÿ"èÌK:iKHb_ÓôOGÖžþÐçqXn^34ZϤ¥Mù0¹í%–%˜ìvР)ä*cÁ‡"ä&l~Òv„Ó§é qpøf•¿ûÔb³eúdßB×ë]'6Çs=Æß8ö•¢cú~w#ÕÜDz´³aÌK¿–͆Çð}jÂÃòŽ5ý¤j¦Î¼™v0~^÷í5˜åŒ} K~8¹Ýe)]o`ªÃ¿r§LŸ÷]—_b„ªšúpѶa¸×’¢9x@ 챉öÕB¯©Ÿ{ÓŽ‚ÜRÜþ\€Ôõ¸IzÿFÆÁ¥á·ò¹ì©CŸ°®êߤ˜±â€ÕÿFN£é(+ÂÐBPÙ´«ö'²ù¼©îü¿yœ`³%ßfj9#Rúܯ± <Ѳjö¹eËaYÙ[<þeõëšÌSq ÞÓ0â÷H5ó€aô¤ uÕ£ßG# l)—-édYÔÞçv0]LJtE‡fØ(<¬ëäÖt;ô À¼•- B–d|=6Y:в›ü·6{½¾±k¼nû¦1úþ÷XWôÂò°î±&ÙmN6oŸéBlÏ=k«ËsÍÅS[&¼RlÞSáO/HZí^Ò:}Ä“ÞU]5¢Ô¹Tb?¬VϱŽ{)gÏ””v—0:IÚùÝß }nsÌüÈ9ÿo™ëûŸ:²(këp¾²My;"Ó©# åÔ¡ýûˆû×Iú…îºNWûþ†ñ†çß‹n,PJ»Km“ßÊÜ0 sÃÀü“+5/ãA©=obíüÛG©§¢ôNÏ£¯,Í8*_ðUôWžˆäMûK_]”UæÕy×ô8ut±úmÆ\Ù¹ê[ßWJ2­è˜µehîÁ9žgå·æQ¿çs~(…c:\ž{hN³Š>ÔV•©i S»ÿÊ6å´Ó2úY}—kõÝn@³Ò‡?!9f{Ü”…öEýÖùÝ—iƒî÷&2cŸªE'¥öÜöQÆ>·ÓVÊ¿}´}ÊÛh ¢:8ÆêHuò½SAMæÔUÕÕù'™^ïšžI(­_E¶Å<ò)š¡÷­jn«BÃV+_º^ ¤%M‹ûc7P[]§k°ðöJy»QÏÄê0b)iœMµÆß:±\MmìwgtžCµ<ŸiðÃÜ“‡b±¥Ì_ë %/ôšHK‘q[#i°ˆ„kÁ×=\g‰í @-}¢&c1AùI«J¬"NÃ)O÷¡¥Ž#§¤ÁTJ½7ÞF§Ö””$?f…§` GÒ­ˆIo"Õd™WÓLn}aúÐÇ0(&Ëä]Ýã¹q@DF zI ”ù –ñ¯°Ühn‘q«¦4âÓ±ó¸­h¨ÐÜÖHZ,'›Üî°ÇÙª…ƒHëkÿYZAnã^Àùj~ëß:祬H0g‘d¯Ú7 WždûÌö\×ñJÜ {êøÒú×dâŒR× T‹WE¤|𦬠eþ® Y’W´,-`OÊ^TÄBCl$!C Î·¦—¦öèš×ú&i†>&e"síšÉ–[Ðl“ÞJaýÌ#ž %³£Å¨›Réï猽̓þ«ò¬4̈@£aa6Ñ–>gÏdMýª««©È±úÜnN>XQy:ÁKU¾Åd™¢Ð‡bTÛ]’Úã ½oTG(#öû“µuX“33þdŸþÖ ú«Ê\GÚÀûøoh t둱¢´íÑ£<$ƒQ¿aö£ƒ”¼XžåíÁ¥Îã¬2¸®eË!yÃzÈKRÿŽ±Ù»Æ{;«§×#ú|em‘¹q`XÍÐ@Uaž7cîg`㈵PÓT—äa=ËÚáR±á¼ˆÄ\jBo5ŒŠN8C—X”êâl0M¨œµtÏø|Ók‹j múOè,µsäjTk„\ ýïÂ_>üá m¾ª¨ŸÇ$Wñø·¤áô]¯¡ëtµ¾ËuDpÄ¡).çJÍ^apéÃÇ}ãÎd€§Ž,Ä¥âcøS;ñWÚÀ{tßþ *ó¬ììMì Á Lâ¹'¿¦ës§yì ReÓ `ø ‹\Í=03k³TYª­© ”V‡Ú¬EXGÚ2öc¿ßbFÀÞ˜S¥˜ÔS±úŒÝ@lÊÜIMŽNåßÔC+„ÒÑIù*O¹|k{Ko¿Ÿ¯\v¾ªL%üaÚŽFÈÕœ=“¸ëDÿó“W—Ø¥\¥Ñ·ôOb70 EiÛù Oáy:âQšqÛî^ÖÞ¿}T“#B¿™UŽ…¥ÁÚÉÕƒRóZ*NŠK,Ï·ß*D®‚L$"^×GÒ’/iƒ%gN¢™ UZ°·¶Éoå}?Ͻ¤•¶ Ôá ¤DæðÇÕܰZ[#tÉ0Cä*K){XJáXä*ê ®¶E™6ä ©]oH«È›GÇ„^ÜÊ>ý„$TËL©g=WعÚl>0à˜õ1êÆê£¡˜¸ %o}!±¦ôf“ÅñÊ;ÇÔM’øNëíçY!WÁØ¥1ªÉG4×ÂoÐwÕÑcü uëCäªgå·xóxt\³UøÓM àȯ\Ù¬¡¥y”IcÃÉÕÊ\{îþ ;&ÍÐçv,XxŸytiƱŒ9Ÿbœù¡ä#Z-¯lÀØU§ÜÑOrÕŸ²2'j@®ee®ïA®Z'¼’ÒáJzÝdŸö^4¹Ê}úUG–yhö©ï² œpýèiï•D¸õY˜º1sC¿"­½Øóȧý 0‹U"D®fCs1¡-[ ºÿ*H®î™äIì§‘øÅ<üI¬¢k ·`“¶\2Åf”t™¸…û\0üððÜ~(´?”ðŸÑYj±ÈÕfµÿrµöԱų¬Ø°mÇŽM˧÷zï¶óÎ;ï®>Iå?× WζOo‚ë‘} :7}·ë•dzWâ‹"8¸”ö—á5™º€âv³¶ 3%<è]ÓË6ùí3Z¬# A>Ö‰¯áòLƒî¯<åĪzÝB7 õÁÞUÝdÏC PlÞ Œ®ÝTrU?ðôOœ ¿ö,ŒùC,„Ÿ³g2ð^òÒ×T>fbâB©胡÷¯í3> œÌÜ8P6ýn(› ¢ÈUel¸(âþ@/ÿŽ1 ®¾–›Gìωh²]¶ÃåŽú•·Éù'–k^Æ´°pDñ8kf9$4P¶JF^YæÕ¹þC³ô˜«³?ÉHÌ>û“˜äjVx¯ñnŸ^Ó†äªkq+&Ê4øA×âUøÍÌ_^ï:ó/ÐwùqkZƒB®z’Õ÷ø¥Ž£ž• tqÏ"4ÏXƽM®‚©À±Â­è¬-Ï4úÖ÷ y%â}^¡ym*¹š³oš±ÿ],«yä3à^Ù):ó#]§kXÓÚ¸‹w¨kM|í\ðuúð'xŠ«cŸ7ôºbYB|.b€PEÿÈàyVvf5ùù©ãK 0éŒeì ôdz¼cÖæ¡àÃzr5¹¹9 Òkw©9õdUuxáÚ¡ê-D%i ñt]§«K3Ž[öKùZåe(Ÿ¨ŠwmϸÈÕU]“Ûþ”‡‚-ù!½E/J쇽HšúŠ$ü'Å–½XŒFswbÔUW™vO5 WÝ ¹†1¸LbÕ=´w”Åÿ¸šJߺ¾éç·á¥7«m.’B±í.Ÿ‡(šxÈU©U±¢“æ®ìâtyàœ÷¹Z ¤@·í–÷A«»KÍô„ûKlXÉÑ,Š˜¦ž¹Z^ˆ¨gÌþD  J®®è˜Ÿ´Ê½¬­¾›m0 }´@¿ žpO%Wu!GॴÜÖáˆ}Üó\UlÞ#äêèg#j…Tò§Ä®“\£Y·EÈÕ÷VÕ30ÖÍ ƒI®f[о‚”5±8Ò˜ý¬­É=0«Qr5_!Wƒ–³ª0Ë<橽n É!!­B®NH£Î§Ž.’L³ýî$ÀÑw½Ž‰EëÑ •ºLúØ©c‘ï°˜pÛ¤70¡ KðGB¶ÆÉUß“Ø9¢*·f“7É«ÕGcòˆ XV:Ÿ6ànÐBèm£«[‡Kº—µk‚\Ý;UÈÕÙŸ`$zµ6zF¥p™Œ˜mŠ—(uA„pd‚ͪ1óòÒ³ªŒgá›wȘ÷…Zrˆ¥ÉÞ9^í0ÓŽ„«äª{Y{©™ˆ¨ê¤$J šõw~÷w)àÕçvá|–µ7ö»#“Úí–»Ôu¢ºôTDETµÄzÀ>ý|¥l[Òo@ΑœÓ{ºšòe+òãj™0GsÓÂ,‰c„fá-D®b7°“at„B®& ¹ºª[8mÂßå™iÍzcjh%¢+eÜï° ’V3ØXÐ…³c•åU¾‚î„?Û6Â9ÿ‹Xä*kV#3³Þ¢ÖOj2f ôÊ\ß¿2ÇžwpN=¹z¦µº4¯Ø²x ŠØ)k1k¾õý4Æ’²öÌÉU Ž2žë6º¤ 3BÁÓrUXw÷Ò6`§Ð›Óæ6€«§‹A®ò‰Rïæ4Øæé ~#äiîÁÊ¥xÁÆ©Ÿã€²yßϵdøáï«‹sp: ®”ö—‚¾’Û\œµi0~Ç¿ctØ.ÊÓ$WYA)3ôÑpÞ ¡bÅq£PJ‘¡!¹ZQÌ}|kûD½ˆfÿ ·’“#Q_UæÚ™•ùUArBÃoUù€³”½k‚ìÝÚ#œÜ<8mà}X<Ë-Ö‘…ø;|Np+äªq««Ý®WÉU\$A\@vvíÇ­ 6yÏ ¹šðOª0ÏùÔµ¸UãäjöޱRç1Ó@(„á " ÉAàX ¢RM{€—.­ï‡_rµáž«Ü3peÑ;Óêjs÷Mã¥t¸‚Ù>u|Y#ý'vÆ„²LÙ;ÇÊfž£%ÑA©,îÛkèÓ¨ ¶¿c柢/VN¾wiDJq.ø ˜mŸú.Ï'óÀà¸ÖT‹\9ãʳÒp pQÞ‘Lø6}ØcŸøÍ*@-s]«ñK“M%W­B®¾¢ž6 5ÄFåˆÈ™@f×o×±äêÂÈa±-Ãd§èw×uþyþñå-8J\æÑI9Q…\µM~ÓØ÷v@µ®ÓÕ–q/™Gýž3óÑ¿bÑYV ô¥Ò,Ì<*`›ô†«+:ÑO4NŽzQUê<:Í?¹2}ÄScÊirõ˜J®ã÷zrõ>d&œ\•ýê]‰Ö§ ¼—Ið¬ì$5[­û©«~š\=8;œ\-u“ÃP ¿.±àAá?ruÊ;¦ÁÆzë«)5¯w™î¯*< l¢ÉU‚AÇìYë³A®öazmSß /y\-‘°Óäꤖ«f÷âi¾8PÉՌٟ¨Uw RÖé:]cp·”·ÉâôÝŒ±ž\ÕWÈh­ÄvUS}¬©²©Ò6å¼CsëÉÕNÜǽ¸•îÛŸ ›7ê)|¿¶ú«Úa"#æÇQb?DüEW3æ|Ç W1iB®¦ïBöPÿò†'.‘LT2ïМ¦ÈÕ­®Ðë-ë†Ñú÷jÄ‘«áiâ—‡œ}ÓqR¡cË­º8Áð®îQ/'~̰¾õâ*›?×ô$Ä+u÷o‰Û•ÍýîDÕ„<ö©ï¤õ¿K-:?)1â9{&Ù§½'GJ•w|M“«„+¿ÅØÆ3ºBý† §kûÓ蔕96obgz‹å w‹ 's³Ð E¦«*P ‘‚È5•¥Ž#xaUCUrÕ³¬=n…øZ“\Žbú°oñ“«X0ÇÌ?£>å\*?Ijõ…\],á³B®:f’>ìqß9›‰¡ŽU.¼Ììœ÷¹B®Þæ]Ýݵè›ÔÿƒIœ0pñ&»'EÖÔ!\“b¹J®"Ÿ…ºõ¡Ýz¨pAÊZð•iðÃéC-¶ìÓ\b+–;š=ˆn!r•©–å۹Ǥ:!­<ËÛ‡[ÅSÇ–ýµŒ—/Ù÷7¾u}ã7³ùI«)pEó[Œ†eìó–ÑÏáøT†)bn3æüE“^S.(W Ž3þóì¹h ^˜Õ/Ï4Ê)Hru/øÏ0Æ…9fýÙ·^ãh NÝbrƒÖ,r•>ƒÔÝtDîù'ñªÕeùàI€Jj·ëK£ÞãÇÙK〻 !W£§c²J¬ûÂI×2¯žù¾5P‡µ1z6ïðóȧêI«Ô¯äìÔw³6B iOˆ/R<ûN¬¥Ÿv—bd’Û^ìß9VHª-C*¢}rUzÞÿ·ä*ÎË¿c´xÉ0Rß„¬ê»È‹cœ£ÊQŸ‰Šb)IŸØµª°‰E´Œ}„©¹IôH´"¤þr$¼¯&¹Š•£¬ ûhVàªù8½{I+` WÞbrœ úâž–G‘«¸ZSƒHµìPÝ8ˆÈ.ìÛ€š Ã»ª{EV:J’•\E=q÷ü©ÀÖ圥ºæ¤(m»"0>Â%!Wçk‘«û¦¡ã ¹ê lÁ|¥ö¸)µçM,ÃÐóæFÈU×’Ö¹fVGy+,ÞD%WÁ±DjéÃÏÞ5>H®îŸ®î°Uu_uÖ¶‘`ª€úrùûyø£H‘«‰|ûÆÕ¬z SÝ%[‘mÅjñÖTCLðÆØÿN¬¾;œ\õo‰Û§ýAÇt¯GkVÚ³Rã 陫,"î £B¨i&:ך$W™RpÁNi9šë¼D4ƒÊ;²Ð¿u¸®ãÕü FxIá^Kì† EGTÍÛ¶˜\½lÈÖsíÇÝΑ«Q-.r5P²÷³kλêãÝÅ ?× Wn”]|Qä*~¸žÜæ"\†¤‹q ‡˜¹¾šlóûàqF‹ud!žWI¼c 'W‰"ù£¹j;dñTMI^“÷TÉÕÔáϤ%<¢°M~›`ǽ¤µuÂ+1ϦmJØ‹‹ýæšEê:^•¹i0Œ›p ³$Dåš^ôÊ1ó£Rç±ðûäîA®ê0¤Bau¸qtœù]ƒäêÄ×Xåf D 1?€Š ¿™àœ©~kŸún4¹ê\ð•iÈ#þí£$YëâVÄ-#WiƬ?ÉUeø*¹*»‹§¾‹ hn$F¢ü00!Ý8utQ…]X¹ªd‚½‚ B'˜J'D3ŽÖ6»=Œ\]I®ºÏÐëæ”ŽWè:]F®^CÄâB>‰ƒ,c$k:ÚW[­Ê/F®æì›N"W @r÷OgÔB }4ü'Å–}¶‰¯ƒäc½uÕ„jHßÅÝÂ÷J•¹“£ÉUf鬫h7·bžÃoVå{Ðý3%W/s-üZs[i‘B®ªIÿ #!'µ{üœN ÌJˆÚÊÒFÈUÛ”wò“Þ€üñãæ…ºõ–ñ/¶Ú o’úX·^]'©»dý\¹¤í"WË|zÉÕ<å­bËÞŠl3±LÆœO›˜ÞºšbêÉoÕUWèÖ¥vL>A®bꙥœ½S$/kÆ1Mr•û¤¬ 'W-ë†ëûÜÚÎq1±ÿ™«¨It( …ueù¨.Îɘý)®*dŽ!WwŽCÍ£~/ g”•-6ïVwqcTÑ’µQyÎÞɘÒØÿnp»sþßιZ[¦‡œ]´îTäX1;r.~}ÿrÕ¿mÂPbÙß$¹ŠÄÿäTB$¹:å$WëÓ¶¨­Ì“‚TãO›A®îâ˜ñ'•\•ýl[‡Kî…V燓«–q/ò³LòZjúE¦š·¢KL;¿Mí~ºÀõ’Õ|«x^œ#’cÅÙ]u<'Bä®’«L/«:~"„çÑE<¯G˜\lÞ«)rñ’«€£ž\ÍÙ=Ñ9ï‹ð·*jy¬4] ¿Sá^Òª…äêžÉ†>·~â7³ +O ïvh$"¤&«Á&¨¡(–œûã(cQ+¬ã©£K uyýÑTrÌê³èÙ»'D«…©›ÒÞ+9:–´òïkŸþ>«¦1–cKpµ-$Wš²|µœA ÈU‘œcK‚œuµ¿w¸¼Äz ÉÔÁš ã`ì{GJûËKëÓ15æ‘…Öq/…3r4æÀ¬è´!j£?ù'Wاÿ‘µruðƒù'ƒoˆPpIæ¿òÛ¤Ö ï@¾¹Š¡³MzCu.Ém/Níq£¼®Ý?ƒ5¹kæÙ®«©Bnæ”ïÃÉUd&{Ï$e+øé‰µÏø€+y¢’|æÕ&„K‘¾Û/ÝËÚ‡¿´Õlê&sM}‰&Wq…Ho¾–‹ÇU1òî~SË‹5•a:Š­ûY\Ò¸}d Ö—æIìœÚí†ä6‚låDÒênÑicé-˜Ø8E®Òy‡æaÿ¬K¹7Hô©ä*c·M~ †üøVwÏÞ=QÝj^hÜJ¬ÔÇ·¶0Û¹ðÑZÈÕ¹Ÿá.…\ñ!†ÅØïN&3.ruÑ?rÎŽÎLÒ€\]ÞAb¶ýÛG«äªDI“ßD‰TÝ/”츒OÝÐK¨Âßöiï…¿²90œˆ]úB®nœ¹yH‘iGˆ\Í;º#–¹¾_MúÞ.¾{ÖŸÃ3Tþzݪì)ZFg1°< ¹Ú@‘OY$N<3Ò‰Ÿ¹ZU†dž#W[Öâ$WS{ÞÄŠ{b`c’«iÛöÐi ì]ã…\]ÜJ)@óDÓÚ ‰’ääÿ€\½fضsíÇÝΑ«QM“\­+ÎÌ«8]Ç*Pt¨ãÍç÷蔌ê†?‡\Í=8+˜ö|ëp°^CÑ÷ó å¾V¯TrUŽÈÍýÌ<â íkJò*ríÕ‘Î:²áôñ°5å„Ïiƒî/÷¥J²Áž7à‹ŒÛ«ŽÃ–1ÏWj%bŠhAruäóÆ÷bŽ€Uøn!W'¾‹àF+^rµ i5¡´Ja5N®º|…Ã%‚n„\u~÷¥ JS:\á^Ú†ˆ’ 1gÏ$>¾X6•­ï¯NcD#6ô¬è˜–ð1R‹E¬ÊwKu›CsãÚäjq6‚uÂk†>·+ç¬õŒŽiÀxXeâÓrI`±âLAPæIÎÚ2Ô>åâ÷Ä„€Õ…\]Ó³®¶*¹ŠŒÉ)ѵ½p‹ˆ4«"Wó/쵌\n€‡“«Œ‡KÌHÇ ½nÖ$W%§åÂ€Š¹XÍÊXáOw/kçZÒ'» Ö÷.ÒóxÈU©Þ²q`(~§ûÜ&¼Yë R: ¹Zê8bðŠ®Ó5* ÊãHk’\-+`Ò¸’¥”“nï ’«8 #Ù\G<þ4…g¥ ¸û¬«ŒEVsׄÐ'’økÊ[èBD~°æ6uÁƒ §>Pßú~¡L}„ ¿¹ä*QŒcö'Ñç¾Ê!wæ°¹ú¯óô]®#4 *·Ž©@¿¨Vî3xWuÓWArÕ¸µ…äjU Ý<â)ÖXˆ¥ò­éUdÚéüîïêÞ?˘çPÒÌ*l,?QOyKò(ÓNô «˜1»)rµ¶º@·ž¡qrÕ‰•Ø=QI°7˜3¤á.5¹OòêxÉÕÚj"ú”ö—3ÿÍ= Ýlrµ$¯ c®î·•lÞÃټÕA©¯5¹9–0H®Ž|::Q'vÀ¹ðkQŸA÷a ˜gÙã:âÉXÉ[L® ‰Ýpž%%µœV»™0?Ü-â›L!W­!W•Ì$ƒhrµò”Ó2öÅÐû I´»e(‹þsl””’q'7‹\µÏø@¥¿ªKrð×à 'rñÀðš†>Âü ¹ŠœøZ䪨áµüÊ>ýR¥bì XKä½0ö¿+´c9Øu²/tq+ôW%WÑD·ìÎ :ñÚÊÒÜ3RÚ]jû£I®:f,I¤ [›•!ÔÊ3 (µ¾Ë/ÀÕ»æ´ÈU9ˆÃbÌ™=P¦Û2ú¹ä*ŸŒ}žgªÁáòV·~C·®¦qràì$‹û‘…ÜsŠCÑxP rKöŽ&WÍ£~¶‚—´Éծס×M’«Bìvœäj‰í «ZUhÅžÌø Ú̘ó—XÉTCä*Æ<¬jÁú” ©½nÑwÿUÞ‘X?,Uôæ[I­3à.Àºb¨£N_Žõóz«»‡^ÓÉU:>¨Üo’Š›‡fm¡òá…ºõÜ WKÀ=ÓÎ()?D6ŠL;ÂßÅ$W‡>ZhÜO~¼è†F£_çÈÕ–µ8ÉUЂuÜ‹¨ŽRÛCêÔ’ ¡Ó@!pPkHxR~h.Ôð•©Ýoø¿ W¯¹ã\ûq·säêéVWâÔŸïÆ,?|âD²9·Zý¶xÇG×ýüÁwþÕwôäi‡tþàÞ‹Ï;ï–V;ó#S‡E“«`ïŒÙŸÖ…ÈU)_¢Ô†öoQ]’‹+PÆþ¿ÕLG¦’«RoEy«mˆŒÛ¤ÀÖ©·ðF؈c•SÛ96"eÌ‘¼úé~£qÀÝ„<<({çx5àÂ['¾ËÛ†7<¬Ôûžøž¡ßoq© .Û”w'W±fþcTZ&TIV%™ ½nlûÞCÇÎÕãó„–Ñäjv}îÖÈG`NÛÔPšÿæŸll[& LBx%©Ý7%hRšŽ9Ÿb‡•ãT—\•$N%ðhLHEI™+Iƒòeàëƒä*ÿmd/ !n+ŠÕ"ÉÕ9ŸÊŽ…n7° Ä5®Eߨuˆ$æê{»iÈÃ䪤 Xü/ E<Ï"úfгþA®"–q/©¸]á=•96¤"„TUr ‡Œä)/”ûÜN4$W[ÿ„.YF?[ ÛÐÍ«Iá¡ÕÝUr•îá1ÁçúοȘû—Œù_ çÚäê¤7ÝËÛó•±ßiƒîÏ=4p%dþªnºNW#{ªLWûËøoh$“`›ún¹/5‚\•mZ™v©ÿ,Ï4¢³©Ýn VÝn(u(óêl“ß$ÄPwÐ…Zäj>RšÜæb&PÙPw—ièc™ÀÔ,SÞ¡9¬…Ðt#Ÿn°RÎãÖñ-"WAü¾TßêžáÛ*ʳÒXÊì]ãO¯xu9÷GºÎ°Æ´B®¶ÏÞ1•/Ôo ñWR"vÓ ”W¨!¹)áAf©Ùäêáï0š‰>€[ØÒ ¹¨ËWj¸oÊYV!NWÕ”‚ó‘UMí8Cr•YIæpÖ–aiƒîKn{11Nqú.â;U*ˆ‘¥¼šT2êͨ1˘&¬«äz5laÜKÛĪxú)5•I«ˆ¾å|ôÉD’;D’«ÖÎù_Ô“«{„‡t'ÅA®Óõ¾=âìgèâRç !W•Âòa]-=‰Nt¦)˜ýøÉUmobgÇÌ?…NâUżl‘whžiðÙ EŸÒár|™úZ3}äS©=oNò˜ç0û‘b£”ÞÀ8 kL ^ ÄžÄÊèuêÈ‚8ÉU$­8}wHñË<ºˆ3ÂbÒ{üpìa&_½clÓäê±%¾õýPLõ¸¥ ¯¨ê>=Ä´” ¹:,‚\-±ÏLâO›G®N}7_y}Y],äªeÔ³¨ªJ®¢R]qè#†Þ¿Î˜ý©Âý>ºúL±y7‚„ÉÕοÀKññÖšG<…)&âÆ¶#½‘Ù]T‡æ¢€E†­ÌXAòš‚”u¸³Pº©g½s^[ͦ¢ÉëÉÕ¡5A®ÖTIJŸå}ÊN‰ã–d&#Ÿ÷ѱÈÕÜCsÁ -#WñŒŒºyäê‘E©½n ¯§iõLÞÁ9Õ •JÀ( É{ÝzQ[UŽÄAÇ$W‹üØy–¯É’d§R’ƒcí”Jî;B ^’Z_€$ ¡t“õu/n¥œ…y=¹ŠwS÷!·Œ\þá7•§MÿÄ1ãCÉ_ª«ÿ܃sˆÙÑkp¬²û'ù'[ðæ7$WoÒw¹6¹jó|ø>Uûô÷¥ÈT6· –e)qÁ\öBäj‰í rNÁ¤1·ˆ«®ã•!ÌÌdÿB,·®ãUÉí.a!py¾5½¢Ï°b“«êKÖ·!¹ú!ÖF΋µ½„^E’«å…)í/E*šÜx3 ~”ý¦ ì¤P(A²‹`5^ñ•cÖÇ–ÑÏ!ZjRÍÇ…ÈUU²ÄHÍÚdsÎûkÚÀ{MCÍOZ‹\u¤ ¸KüËÒ6À›hr•åp-üFö`,k‡UT?WÉUD˜Z-Ärð S˜°ô,4÷¬Ìµã;ðtšä*ŽFvž’^`î_1¤ˆ:Àø4¹:ÿoÑÔbP/fþYrh7Ì#WqŽôÁ¿u¸yÔï l±É ©F‰>T‘+±ìÃÝ€Õxð‡aʾPÓé´íüœ8"¢ª”B®öá·ˆ„ú,>QöfÜN®ò!ÂOØA®æHZÎßö艒Âú·À¬ƒÜËÚ†o ˆE®¦|Ú»¦?Œ'§zDcÆr÷OÇèåìŸÑ²œÛÿÍ­irµ¼P¤&XCÒÄ2h1؈=öó+¥=QÌÜ” äêw_¢,’à}m/Mð–¹qš:㬓«7Ýu®ý¸Û9rõt+Ùû—«Ïkø¿G¦ºÔ³Æ³iðç/ÜÓÏ.–/»åÉ¿ŽÞ¥±‰Eƒ\=¶$cÎg¥G<‰]äP­« b’«}ïÐ,)XU˜‰û%ÊKêA÷köŸ°‚3<˜fË=4G!WKqÄàFõ%Nj·ˆñ úŠs*iVæJ"r.žÝè³”›œö‰¾×¯qîÜÊ2ö0³}Ê;1ÉUÙY4Ve#ÈUcÿ»Äoöÿ-^oè[ßÌ&‰Ð÷LÖ WwޓܭÑ^/g‚?¹§l†¬OH¥Ù\‹[ Ó›ë(u”“’û§G_ÖMi™ºÛÐ6é ©e¼¶7s¥ùºŸUýjre¾õ}½«»ƒ(<+;7’{Š(U!Wgƺ ŒE«³?5~V^ç…0 Ò 4$WÜ¡jUEYR²<†ûˆhÅÖ #çü/"ÈÕʼ "MuÕʘûhÜSpUru÷Â.¤B¶"o&ä*¡÷‡Q”ŽWÒy9 ‘q,&¢!KH‚J®"á2ÌOʆäï¾D¥ ¤²•+¢Y'¼ê]Óý¤*$W}©Îù_â…%¹®²ÊÝJʾC¾ÔqD©­–ƒ\ Æïå™F$4Èœ ¼¥®€atРе”¶?mš\]ôO)?±eóL| œÀt0íyßÏ%¢)Ôo´Œ)ü'h®l½Kx ïÈ‚æMf f®<åß§§I®ZÆ>äœ9¹ê^Ú6gÏ$ÆuêØÒ€÷¢•,\p¿Ó û“Û\¤&¢ûXMRÔNz“e¥“Ä#Ê1½`PV ["¨ä*êJì ¬N×_Jý¯@@(ÙcKjJó‰MzÖ1ûc4«0us ÉUì¦0—±š ýä¶— üÅæ=!VMÆâl!W×ôäó¨gÐ"9¸ª[WîÕ»ÿË>õÝ&¦·ª ««åô–i$ú+óè¯)¶ì%E[!WY&äß8à®P1,˪)Ý~ªRÝphAr5÷à5ö‘¼‹{§h^ÙáÊÙž?¹ZV€žÙ…â)þPN:`ÉgšÀר;WQÕ#0‡`惽›QrÁ­èäZô q~!ÿäJƒì:»6VŠl̳¢cœôW‰õ@Hñe÷{C¦…‰BÓñȬHrõàÖ‘ÿ"ëÚH þW%!ÅL|]¥MPa%ŸjâÃÐ ¹¶= äÊd2¨‰RÁ'K«€{DÃ['¾Fß ÇӉēÛ^œŸ”ÈRbÖ¬ã_&°%"&æ-NßcòHt…hn‚§ ¼Eƒäê¯åCë Lƒ`íøË©ïvî,|ë RJÐÍ›ä­DAÒjË9}өКª|oæ¦ÁÉmjŸþ¯Y Ù–”îÁæÔ”žÆCkŸR\]ÖK%W™a©;ÆN‡‘«­«ûg°š%öL)lTUzz‰l<~žàéÒ<µ­Ù0ø¸çü¿…>aò³6UáÀCßõ:.°Ž)T¶3n›üv,f,òžnà½á™ oJèúw˘? ›h}ýù,Oà1p/ƃ/ù!|•¹i®J3I¬«“ß:r•Ç!EÅÖýñü!1 ~XÝYS^€»rÕgQ Òr¸æûù-#I¸IjS»þ2š\•ÔXgËó0‹Çr`ùc ADõ^áOeaÁBä*=Çt`åø0mà}…†Íúnׇ03¡*BÚL à„;éMìQå0Ø·šÊûa ”Ew¸!¹ªî¶}1| ˆÝ6ùM™ð6+Ù’«e¨ºÙ$¹j„ùwE—© (ûuŽUG*ÄU'S©ÇXD4t B´2æþ5Ö^…0ru»cö'™¶`}iŽé¤{\*y·å_†%Œæ‡Å‡ö»“ ÇX 6®‹ØK(2laŠPRºzë'äªÇ]æ:aè}›ŠÊü;ÇJ&%ú8ul1Ý&XÓ[ ¾NUŒd#¯TrÕ½¤ a ,á]ÝC!W¿Ð”€²'MŒÞX[UÎçJÒ•ß1"BZ·ëpü¦kIk"û´÷söL’«öC’ƒb}?Uf@¼«º¡_á‡æÀ«˜…ˆy£WjQÑ2oŠ«Ã~‡äW’«fÛÔwð2äªúN_íð¾Ëu’lÖÇá/6¹úûŒù“í7Q/a›lØÙ´ßê'·G§µ)ÐmÈÞ=W $Nú¨CóÑJ]ìŽ\Üx«ïQööÑwý%!ODŒYæIÁe7¹6"Wgÿ=¥ë @zü5`ÞEà?ýýXU¼‰e£RçäœÜúÂàûô¶˜ÈëE…\Êf®ïoô†ô;4W¶¾4Ü€çRÈUCä#ú¯nOÂ<s5Ò0­¦¢˜Ÿ°š/¸m“^WϼÓú¦û¨Hˆo}_…¯{Ô“Ø9Ö™¯€â”’1®:ï ÈÕ"?q¨«ÀÎ;4Ç»ª«Šr…\íwgúð'rõ*á.”mÒx(ׂ¯rƵK€:RÓº†“« a€er»KRÚ_–©„äRâsÇb«àN| F(J`…/,ñ•«3þÄ|‚uß^ƒð#„`¿œ¼#äÓ*k§«CTë»^LÊÚ&½I´ý+¦(kó`ÉõÚõ:`د̣›em)é77’ÊÝʮ´„ûóóø•*iÍÊýéQäê…\ Æï*¹ªîæUÉUÂ[@šâø4s"ûZ¯— Ÿ±‹Ç…ÈUæÖ<â)î`ìÁWU/ïðw–1ÏèÖ['¼þÀƒRñü¡PÜq&­"+]ÈÕú$%$'æ’ÓyÚePâlŒÚ¹àk@¯cƇáEˆ+sv ㊬2EÊÁù söN©®Ï¹º†uü+Ü!ÉdSqCrUMïPSE¨(¬N·ë•=oŒ6Ÿ «@W¡~C ÉÕº$$hùÜÒá ä­Ôqĵè5øµŽ™`'=Ë;J•ä¾wv™G=cý\~R"#œA ›˜ÞªRÀ”ð€$N<²bJx°Ì“\?ù„º|Žfm&å– ›é‰B8×4¼O÷Á,‡2øYû%w¹^³’Á/.S 1…R½ˆqÅJ])êEˆYcäja¦ÎõµÅ¥f„i§Pyõá$Ê‚‡ÍÜП§£Ô¬N’äʾZ¶±)÷¤²¬4&9º–"]æÕ1ÃU…>IZkÞ£$F¾Ñ³ƒ³yJ¬z@­Äv0¤û¸×º†¯Tʽz)£¼H 'W ý°¨,VmEq#ä*ËÁ<#$¥œ"6Ç6ùMLAui.+‚‰8M®úÓq^LönÍû\}Y){«66Í3dՓ«YÄé˜SÙ—²Ù+2ne ’(xòÛóþZ˜ºÙÐç6¿¼Wõ…Òñ­ëë^Öm3¨äªó»¿§vû•¢ø¿Aø@P,ï^e‹ue½Õ^”· ¹z|9šž½k<*ƒî(ls/|7V]!W5²ç!Bô稖BÃJh¾çâ¡LŽqQçÒlÇ œÐšÓ÷©,Aä„AúîËðWNx%ú_lišßCïðCŽ  y5.Sà^Ú6ž3DjÃ(é»ü‚®†>Á ˆ|*‹¢).ǨZƾ F”(¦Ì2î¥XümežƒÉ‘½ß96Í£U§§¨6˜Élà "oxyÿ §zrõÔ±%†®Ã•\&YyÇ>¼EßË·”\­«.Î6ö“Œ+ñL> Qø„x¡Äºß>õ] ê“1û0“ÆR†§sŒ¿q¤lŒ F¨9Ó§n·CßíSßÃòHJ«%­Á8ÄF 4óïœ÷9æÔ1ûcÓÐGdº;£•X­Xäªè`òêè×b9“VÉÕù_ø·ÄàV0јǂ”µöiäÃà1 wRÞ‘„?*Û9ò®”Òá¤7ò D) ˽PÞz» –g¦©ÏŽ ñ¥$£>M®f[?Û”·œ ¾ ¯™X˜º‘«xDHM:]VÄMÞ¨*@+bŒé#ï˜ý)’û4W$$ÀWR¾‡ÈU<>7N¨ð_Þb‘«ˆzˆ•Íi[åL„¡÷­x|Ì :ˆ:G¸o¢éœý3ä¥ÃÒ6ª(‚±xUáN»ßˆÓ×\Äÿ‹ µA¥eäj7CÅCÓÜ;iϹöcmOÍ;Úþdä>ÿ´säj¨E“«ùÇ—Sàm…\=$äjð|åÀ{³wM ôo‘Üæ"UåqU‘À# r"4Ðwþ9ÑÎH³¬€”™^־ɢÕÑä*~\ßåZ°PÄË}e ßß £NðE· ¹:¯UJ—ëè'8ýt-ø O§y;  |É)­ƒÊ?¹©ïó ™$%ªäªTZߟÀÌÀL ŠÓw‡ßÇ¿cŒ«Ñ §â!W‰‰”Í*uArU‹Ò$ 1ÀºN×¢âd>#š2Ý9Ö<ò©ÆÉU„+ITD g™¸'«™Òþróˆ'ý[‡K´¨D”ȸ…¸;H®#(RME1°Js¿ntCH–/‚\-Ðo°ÏøDÍP ªRa÷bJ»K‚äêú~„òº¼×­àsäÅ%"¨.É([w‹à4[]m wV\d€á0Rëø—âk@—om͈VöޱR­¬ÓÕ„í9{¦€‰Í‰µ ë²wOò&v•¢ºm.B¤óë3÷‚™ +ó2"ÈUÀ¼lÔ©W™rŸ W••\òeÌùÌÐ÷7Ü3<'Áon]#› rõ!®7 Jô¡’«…™jÕb«ž ¥›†<|êØÙ W•‚­ÚÓ"ZUÆ$³â„Þgrg!Wçÿ-ïÐ\V!{÷„P.ä'g÷$b"B'CO9›CŒŒF„bÛ˜äj €]UdÎÞ)LNΞɨ¶uâë¢õ»Âä\êGÿ¬fmU9§¼ïvƒ‚2æþ@U]šWê<† kfmU÷–A€É5OÇ7Ñu¹Ž¤úšõH`ÖæÁ‰kq+u³.Ñ1ƒ‚ YMcŸÛYP À¶ÔyKnøjãOa*ˆ^”+ïàÔ_ÈÕúœfUù"kæ_ Lo*yYSÖIÝÛÁˆHJHZÃ~w†öA5F®ª¹[Û_¦VeUU‹Q›>V‡…\ó|UŒ][]Í mª Ôa4BÖ, Øsï*©'¨œ€¸ ß¡ìm¸I“:V­ÎÇùªe“”âV1Ïk«ÿSˆ%WÃùâ|µ ¦7‹\­Ìup7Ù÷¯ó S7Gh=‚êYÑÉ õ0¹Í…ôYÉD]ϹÅ&WÕòjˆ“ZNkfŸö«™{p–ØóL½«öˆ¨ Çï¨þ©£Ÿ¥®“ïWÄ~"HQ@á½=+;ã²SÚ_Š`¹jÚÉCÑ2d „² ]–ÑÏæŸX¶ý,@”}FO‘Cñ°Žâ§´½D,gÏ›Ôú8òžåÛkÐ 0Fè€Ë‘¹q ¦©Ø²O%WOYdŸòŽÛ(É7¾èŸx³íZø´wKö<-DÇTrÏŽ-Šuº×`\СÀ¼ŤÃ8ÙÌz’? ÔCGäxÖ#\°ZòÅt¯MÉUòXèé§Ž.V1 2¬yj[³åœƒ1¡¡Oð°ŽY˦¬º:Ä$ƒÓa]Ô…f2åôô˜?TähìÞ(••Î ™ü2od‹óSW[îÕ«0“L¸}úû™ú3ŸÌ’Nɪ"Wó¾Ÿo›ø:6 ˆè[Û[’%j-á·Øí“«•ù” Ї\e}Qõ-ªlv:4WФô¿ ‹‡3cDÙÙ;ÇG¤š§Iw%ÅRgG­&¹:ê™Ê0rÛ2þ%ïšÑTª/5å…ô KR]ä·Ž ´¬nÿÃg±¸êYW4ˆ;#ób̫ňøgrµý¥eÓË*hfT“FZÆ>M®‚Ò L"ÈUÉÈ4è>aÀ†>Úà¨~ ŽÐÕ (ˆõ6VF-ïPæ<éF3“MrÕ«ó®éʱŒ±Âé['¼&©~’Vɺ©ïby0±Ê `ÿÑe" ð›}ê{Hcs×WmRkë0ÿöQ®…ßê7¡P™õ»Ö¹9’†T«{’+üf÷Òv*f?tCãÿcï= «ªÒ>îÑqgœ¢ãŒãŒ:ãøŽãXFdžXÞ»ÒI!½ABIèHèé½WA”6("é½w !!…÷]ëû={ß{rrKÐ÷{¿ïÖÚ++¹9÷œ½ŸþüÏÞÏú±ŠÝ&,9>öá³ä ø„çu ,‰€«—màêù OA$iW«3ŽeFu”âc‡fŸ?º6áPp1¨˜ùufÓ©Oö©4mtÖ4­þAðà 1z’íJàjÁ/K ŽF¿)ûO®ÀU”‹ü4ÀU &'…@Úm±æ2èïßDw&eÀ6¨þk¯¨IþN­:qQARè3®6¨Ü¸:ähIûm)ÿˆ:rwü_=÷gûª¡î¨wÁUc8W¿Û„FW¥}i€«A¨öâ Èš‰¢Ï~>Cþ‘†É}ð•FÂ%gf׺gÌm™½¸»à? –qZ´Y:¬q3ÊÚ»ªýM/’_³”ˆðÐÜè Wp²v‘€*þ6¬A´ÖbW“WxÄþ.{aWy×òdβ¾Z®ÀU>?wx®ö€iDƒÖ-|¿%S&"$ËÃïëŽBy«‡^ŒÛ)}êÖL“½7¦9ÛÔ!/Êõþ@~6Ò-^.J,Ù;‰‰9þKμ«-ˆzžÎÕ{ðú±¨Tìœß¾põÚeâ=»‚x®Fpõb‰†Ô²›øRÑŽÑEÛ嬱E6&ÔI›ñ¶¸Š0Hy[S„SϨˆÝ!-϶–þ¦NoÓg¶à†ô㮕çsO£.„ Ó#8XÀ±’=á\\°Á+!ø‰ÌÈÖ®žÞÀïw¶'Ä‘õD‰ÈLFd뤰gP:R (é®ÞºyY•]È¿ûqÐL˜H[åŸ!”j~ªs7ÙYò¸gí‹hJúì÷¤Ï…¸š¸O‚´¾à&Ó”]—ZµƒŸÜׯä~6@Þ>˜6@bcD´>p•\~Eÿxÿ¦„jd‹ ¿­WO­…§äªL»Ž0—$“Ñ+pµQ­ÊêW˲uO“ˆ^ˆa—_ й¨_¿¬ö¨Gn 8{`*™,„%`æ¶DDR¸¬ nÆû5‘ Wo\©<$Jã‡ðïrš>û]9–nK9´83ªCUÆQ,*ÀÀ&Ž~RíÁ³äF÷GÁyq>Y’Ó’nÈó)ÿv½DzÎ@›öéÞUp#L¾€ä«NFè/sƒï¤ŠÈ3ó')KòZƼVÒ÷öëUÕÙ_K»ºµ œPCnðüõÊÈ‚À³j\•jfÛG«mN­Iÿ¸*ð—쨬û OHtrepucpŒßcøG¼Q÷DSàªÎ)þ›JÞ׈78VpuFsÀ‚T Q¢è$3µIæåÂ-0E••øsîÊÁb '½tëÆÑ;·{ñPÖŽrÃ”ÙÆ®H‚ã¸v±¨xo„zûù”Ó²«·®Þ”Í`_ê Þúì¼ES5Ù'á‹lÄÚ*UhF>€Ù‘=6ÿ £¬8³ÕàH=àjuÆQ†”ˆ4Dp© !Ái’­g-茘e¯œË@ÝŠ÷„3£GyŒ´…Ò8·´~>0Í)êbŒ³gpÛRU¨\šnuîМX¯‡5¸Jöš»r`þú‘°#gÙGº²1Vö“ÔçŒîOXrVpÕçWYQ4ƒâ}I };FŽ5`%q…\%[gè)áôÄfÌýP*±kpõ‹¹e{üa3ö_«WËrÒ¦þëü‘N~ ¸º¨{ÒŠg-#TÈ[5„…m 2ä_«sÁU>Dm ®¦LzÙ8ÓŠæÊK%Ÿä­îäxŽÓa¹EŒ‡ COãC¢)ÒÅPCÕ>õž´éoia@¤‘ Õ>Ï ¸*U7sNÅù=ÂL¤ZˆëqXR]ZÐbÁzK™Öè~8DX@§ àËkŽ ßaP„œY!¨pËf.[«YÇ–ÀÍ;WáËÕ²\©'3â§r,«¡–4ГkW¯TéãÌ8ëêÌÄTpAúÎïŸr»Î ÁÓ@Œ ~äm…i2Òö«("L3ä’6£9þÅÜ}ëzÕùø€¦ˆ+¢Bv€èªôß‚ð ‘Ýï÷{z ¸þw1æ ñ†˜ºÌŽ \ý@Uµ‹q|ÖõʳÚn8‚«Ü¶x÷x3<ÅM¤‹ÙÄ—Fžô²qÒGóâʹtW£:š™Ÿ H³ •GZœ”ɵܒê Më,*N&H0ÎD@ä q²ÜºIäS°Á3kaW,†2>Î;/Èr´Ô/ ƒ4VS¯¥î`À\b?¤ˆÅVÄnC°u$lxs)ø¹wbβ>˜_'“)ŒcD¤Ømµ‹þàõªsŽà*á ÿÕG TÒ7l ÂÇ¢+vCƒ«ðB¶tÎ~Ÿ ]‚ÒЧ±ÒÒGàæu;çų́NŽ•É-uÁUlã¹C³¡vÉþÉ,0oå`üN–Ú |ÆÚ½1CJlö×™¦.€Cv†›6nÈŸJãꤢ8 üõ#ˆ4P=ž…绩¢¹{œ‘#ŠRmú›$Âæs÷4gy_|"Ê‹¢aŠc<î?ãþciŒ¥ŠÖêQ¸º 3L)¯·-²Ó!åß·`ôp£Øv]°WÈ”îLÆþ£F=à*ñ r.U³$0»GbÚ‚XÌ!Ó‡&ªê¬Ód¬ "ªE‘¯nòåÃô™ïl:}ƒ\}27º_Ú´7]åPw®nK¿àWóþêï^[tìîø¿7Zoˆó¯ù¦¸±Ý?ëwÁUc8WÏlÁ2“ã;‚«øDüžÅºoSmÒÀ¿KÁu^Þ¢bü>a0Ñ]¬çƒñþ‘b˜ßÊÕ>èô<²>WÏ qÈ^ÜÝ¢"™Ô)¯òÐìE]ã¼™>«…ÝëB\•lžoÄ^# "Ƥ•ž ¡Θ÷aBÐï¹!v »ä \U[J"µ ¬WU³ƒ—+ˆ"’Ç?GBq1aa91K“>ÚŽàêÞˆ³ŸOw‚Þ¸\©[BOâÓþ+%)$ef_/«»q•UÓÊ::ëOÚ˜¡ÁÌúÁU‚ai›uhvcnh®F¶Mÿ7½Ù²p³_ÑÎ0¦^*ˆÃ­“CyšÁUÂ|’AUN³á†˜¬Z•KHìg.S£Îû„\ÊûîÖÍk:6#$#’Ô§S-6pµôÈÂ5åD•¨CþZw3¸š8úO?¸ºf8©JáÖéz"Ú®pÛj9Ðúõ*ýB“ E×ÌÏœßárq¢W¥†UÐïbÔ±tN‡ž,—í \E#ÿd‘Þ®#唟DËr ÉGžu£du.ï”ð²æw¨\%*ËYÚ[ŽAm áë \ý \@„HÒg¶PzÝ£Ž0ŸËÈŠê@Ðë*§¸­á\E³H]`¤–ÙKz]øf57‡ze'W!b‹°?R‰q׸k…$wÒÙÊížÆ€«R!|\©ç¹C³RÂÿމ¨ÉûawO¶¬V*‘†¿`W¯T•\‰ñ±f´ä­ ûÈÔ¤ñöÑN_Z!ðd4HZæ´–cƒƒûë’¼s> Öå£ÉqT©yã’@£ÈguÖ )Í:æ)’SVWzb9)?¿§Ï~¯þmÞdç,Ä *xdÞ¹*5j6û#dè$ARXõ̧઴f8¾Ì ®¦­ó‹ñ}ô·ë+$àêÙÏg訕4ÉoÌ– ¿à¸ëCÊ €«<½p‹?d”ó¡O“HBäŒy­ùœ <Æý>(IDmWUñäDôúeéù«¶®©Óöv²ôØb²xWǕҬxÿ&¤·N­ÑM„Ñ&<âZý52/GÎýe’¹Ñýs?çóks¯·zÀU¸“·fXÒ¸¿ícQ6_ªa$î#›ÈT§V ÖKÙ–ÓH'a±ï[Y¾R" Oþ:L\sÜeó´i¯ë®y¨ªÔO>º0> ™˜Ák5Ì™$¡ÂX¡æeÇ—QõoY£qøÝØÝŠçµ‚«^#ä¶JA?MŸýnò¸¿B¡‰×Ã:#¡æþ0Z¶¦çŸÁ‹1ÿÒãKÓf4çþ®®Ê¹Þn JûìÅçà*AÌ•~Üê]Œ¹dŸY®²uKZ>,w£ïŤ¬4!ðqrgã”·+p•u¥Ï~¿±àêÄ]4ø#> öÕ¸|ç{þ«(BJ󻶤°gXWMî·Ò§l­»&¬QÛbêÞmŽqÔ-t»ò,¦*Iµ‡£Áµd¼ZMœ&:nÝDy™3b #JöN,Þ5VŽç{üD^ û=ŠÝÃaá[ï’=hkê¤Wœ-puÎ:¬½cpy«LùÂéžóºóWàêøÿR¥¿«P p5#²¼íú´À‰ÎªóÕ?0§ZßS§¾†?º"…nšž[-/§þKæËF|1¼²•w‡«’þ(Zbð¬ŽyfÌk¥ÁUtá·®z˜ f™ÁUª2a{«+óù)FeÒ¼•ƒŒ=íæ7Ñ;ŒôøoìÀUBMâ=s“#41oÕé@çõ°=¸zóÆ¥¢ž˜9¯µ«·±È T"èŠh*ç8öO±kù 1_‰!0ƒ«ªÌZq´œå”˜ªûI¯ÃEݱ-9ËûºÚ(bWwHíß;·Ë_µÀëŠÔV¯LÚ_´3Ô±Æ8Q7Öpõà Çû\»—>ýí쥽2ç·K›ú/B‹Ë…ñ \Í Æ0š–Jì-þúµ×¹ƒ³R&¾¹°ö(Qƒïy¯Uè÷M¸ÅŠ3[r–ôÂÀªî «yŠõ«Îùš„…Ä‰ÊØÀÕ”ˆ¤Ûsp7Èí c&ÄÉØ|AÝŒÛE–4ÄRךSöy1­ÑA q•^{cþ¤QÂeÍh”¿ÖÔøZEY°\ݪ7ß/é+æ)[qÖÖW " d€‰éö‹Æq!³~¹Wg¶@ýÉÁo«yôê󤽂 ^„s,„,Íð;knøŸ6¤Ôp^ŽˆMÝèšp"wå |=ŽRœ¹?cöû„ýr؇áÈ‚—ê $W/ä“cÇ Öç­ŠoB 3p¯oN_§ÀŒèþ Ngxgà*cڷžñ5½÷g½¿êô›KOÜÿ7Æk¾ë{0×'¶zI|ë9î‚«Æp ®-“¬÷DOÍàj鑅ĺ&põœ…DGî?¾vÑú¾㟽¸;‘'Ù‡œ÷ù`RèSNw°_úýœÖ4:àêÔIvùiÛ8¯_TØUç)Ò*b[Pƒ«&8,Ú>&iµobø‹é3ÞÆÄŸÿW‹s ®®rþËH}ü­"f+¡”> K(‹•«JûŠëGÚ…›&ŒTÎýß¹+Ø™Yb],¤Óhh‡|Av DüÃé~Çá\µX®œÏº^}>uÒËfpÒ9MÓ9ˆmˆš Ýù5ÑýF_NX_\-Æ_ÈIv÷û¤‹Óºx ›ãëåÀÔœˆˆ~%ü°MöÜ¡ÙæµŽ$TI-,Å,‚º‚Í~gÍFŠêD&Ç–H¥zSˆ —]DÀ¦ÿ$>põø2ø … cðÄ™jßÅ_*Îl%d2Êi~¿aaÕhœ®7KœC¢”kªA§yAÆÜV²å{ÕPBiVõi;Ù»e‘} é³ÞÕ ëÍà*ÁaÚô· AíÀÕÊäÏ¡¶å¥GfÍï àªÚðŒ`ëH˜… ‡qߢòg÷OÆé7\í[‰T!T¼Ó¤1O!«d©ÄƳß#zÌYÖ·×ÊóÑA2úkb4rÇ ¢¥ >èAàA ­ßiÅé`ÕĽå§7 -dI:,/;±Ì®!´ºvJcÀU¾Èõ\…,ië–Çò¡3p™,ûw4J &çÜ-ùk=˜Z¸Z²{4‘=·w ®V—Æû=Š$¨f=MÉ’P4©ºïv/’“³´÷ËÜŸYU¥|AR)/­÷ÈŒlsþèB¦­ ‘·®_,vúºÍrë¦Ô ©.ÅŒ'Oød”%Q1­F2SMú¬EÛCE<µ6Öóg‚EØÕ­ºTA¸juik}êWÉ.¹”×µ_°äy«7\•íû&}pÕrëVáf\Lñžð$9û1ñ3?ÉÝR§¼ãqBðq¾¿Ñ{†³¢:™·¯¸÷Åùü B)_c®âU1tõ¼,³_BivbÈRà÷Øb}ªQ¶¦¯DæU™rPª¦lô†Ô$¼P›dŸÙBOE¯\• +&ŽyŠüÝ¢6Ï‹HÇn'¡Ã«ÍŠ6põBž2‘rêîWyG¶šDãÊ91ìXÑxßG¤b|½à*ŒHüŠ7°{y«‡I @©EpB§½7¯Ö _úít÷põ!4ÝW¹²-çI÷MÆžXÁÕ9Þí ˆ’b’MY‹ºuöðY¹R0|©ê:ôÒxþÈB©Š°-g$õ{`º¹o»YªQŸ¤eƒÓ"ÛóD8.†·ån\©:{hþ‚™Ôž}¶Xžñ¶*øÜ€``|WŒ#!gLKhFV˜¿Æ­þýÃæIb$íÀUÈ›ñ²t¹8){Q7#†Ño]‰ßÒg½‡j8*F &÷Tþ:²×” ÏWe«¯ëbM9&´&ï4Š&å׸a‹w/Ú‚&bµ°Wºô“Ú^8GZ¢oô.ÙÁO|¢¹—1+B_ÖÞ1¸ŠE}ê…­ó¿\™9¿½±ÿz†µ´«ÇÓg¿ãq_Ίþr¤×EGõzFUÚ—qÞ¿ÒGTÅšÜÓæXë†ÂäS§¼ÊçRö›µ˜mi¿þÙ@§ï}d]ç¥7r‚reÌkmWaý‘…VpÕëaì9KFœ¤Ê«zß}þ«(R ëâá?Š÷{„5”’+úÛõŠÕC«¿‘j¢ñ§ìÀUÇ‘¿Þ3­;!“®iY\½^“wF`9ï;k¹…pÆŒ|PªÜ‡¿@Ü.•Êê¾°«OÖWÏg ƒÒ,Xýyíb *Ð ¯¤"Š@”‘0ONÙ»(ÝS ®ÆlE cx[Iüªa*ù…i2=³æbâùˆâ²—ö6·5a6¶NJLÏýPª«­FèRYU•—•FÆmõeåß®/Ü쫹¼Cûlñž ò‚iYßÛd ¨þ?¹Zš“Õ±üôƬùíy($Bþõûóõ[çtcóM]GHí&ÅtˆèþØs(o„³¿Î^ÜSŠ<{>¨JæV¥Îß0J×v»”wF—jãênRÍ KER Û  :Ø“ZI«†\LÚ—”–sá/`íÉL±uÀÕ²+›ü žu:F©îÆ8D.Æ6r뙈ÍgÕñOÇ‚À©³[¦Í|GöFl4ª•‡+•PFêý®†ÊãV°{±Ûdw÷ò~õ»Ô»CûÌ䊘mvûFHȆ°x¤´¸uÝæRNªŽù“l>8Ón—ávú“ljÖK‘¢å}Ïž‹ÐbjHÊ\ù5Œ"ýƒƒ«Œ¹×øÅ_ N¹vwüß¾qÕnG‹NŸýö¬êq\5†#¸Še —C:«‹†šÁÕãK ‡ pU Ey‹7û úiJ'POd[¤´io—r wsZ^ÀÕå}¿­w†Žàª” ñ|ÈÜGXå¶gÍïÐàª\Ýœ´Æ?eÚ[r€—¼uøxJþú®ÀUŒÛù¯æëô ïßD—c¥®¦Ñà*NVúmù5ɉþ˜@ÚHøåsg¹ªÎG.O$–:õu£ÇPýƒäBÀUSaI9àsf+i>±‡\M›ÑܱÇt㇀«[ƒêǹ¦dOwƒÝê‚«Eé3›ËfK•?)•ì ל%…¼˜¸/+ª“D¿Þ¿4·O’ćf¹j¨Töõ*ÒC]Ž©ìDtÁ&obx;pnLš.^«,AÂa¢þ3mÚx1 ®J¼µî„— “u£ÊÄ}„LN÷ Ýþ°Ó‘Å\*ˆÑ µ$˜IêÁã{Òm9)é~¯P:0M«m%è²X.œZ'%ï1 å‚õiS_ÖÔWÉb\=³å’Ýw¢Y?C¹¤Z£ \Å˧ÏjA;ò®ä »TgWœ86¦J8‰ 6z1¾HŠD ®Ú7l'ó-Þ=Ánk®´6[Üý‡W±HRèÒÔà†´.>°YÆœ–w°“Ç ©®Æ#5]4X1¤‚¯$?qYí.³û/ÖÒø÷®Ž~#@^¬¿EjÝOöçÄl+ÚŠ•@s±N ð…øÁܪ¸pF~M~ª·Iáôè~åêà'7Äm½Ì®–çŸý|FÎÒÞÈ0  þPšzlòÑ 1ÊXѸŠsÔÈqÄr|æÔZušµNÓ^A\v‘îrù!4Ý0çØQIŸ]ã°' úEúì÷ô¶UžìEÝù"X7o/èl€Ÿ·nÝ@MZ´Þ ®~9¥@r–,•fgµˆñø‰4@ }Êi‰`fRvò3¤¢:ãˆ.·âx™ª=øaââO’&¿FÀ“¿Æ µª®^®Äà`™³—ô4^ø¢•ò²`Úë ¾½e¹÷1JȉúÄû7Åà.‚ågÍUÊ¥)ÐáyÒ,ª“q®Ñ]}Rˆ0úOú}¡Z•Â{ѯ´oá\÷IÞ¼RU~f3NJ«ý™«$TûÎ@åUMÑ˲Ä/Þ5^ï!‡Èp-¸zhj^¸Å_ÀÕõžÄÃúí'†E°ÛrJ-Q{ÆVYî\•È-⨃XH×ý"-6˃Æé·¨Äfº€«ÇÄn¸ßW°Ù¯`“oƒUD‡ÚÆÿ'SvÀÞ‡ 5¿R…PfÄŸBáÓF‘Ö‚@比¤&¾yýªžó…oVà ‘mçªTðV ík(£Qœ(Â(¸Al£w€óP쀮„i¦ßpÕû—<¢1àªÔzÚè³Æ¡H'M"! ²NÄxÜŸ>³…Ó·fò0ë$zšÙõ‰óùUê”Wíbl.åqFÿÑ ®b½‘"ãµÚÌ66Îç×g~1WüM>iÓßÄøý¡ì†¯Z™òEùé äY®šðÖ?¼ ^*ŒñÞì§NoÕ¢µÌ-!°/M÷;k©`±@:Ì3ÁG`Ó ›WSÉ}ä Šº¬cH‘Lä¶"~7~PκÝ[b‹9!Aõf_‚".mú¢ˆóG¢¤˜öÈ$8t±³HÀÕÿ#à꺔óƒûÄÕ&]ù_GïŽï?à£WLõொ¾Ìw² Úgþ‘«áxñ]pÕŽàêŸ]Éãž#TÀ¨ª}S\Ý—nW=FÌ)„'¾¨·- ^¡®¬ˆÙN\Gä™:ùkD$‡×œœ"­È^Ú«ôØâúghWs¥Ž¨jT-GPt2¶3é¡£ìUƒ«6ÀÕ´¹­d±Þ¿Œq»óEhá \%ëÁUé¯"n‡nÞ¡ªZ½B†Ryœx>oÍpŒ§¼ròzXºl®¯q³;ÚÃsqX×*\–&ɘóAcNäYt«”ýSˆULD¸Axet}Z[ÍU9Ƌǿc9!ÕÅ)ÛoœÒ ’ú(ÔW+ŠTã_ªâfç,ëC¨cäe— b‰R4¸jÞÈ›Có /ó `†þ¡-=ºà³ìä ;p.ð s¬‚ƒ+=¾Ì(¤–:éø«ÁUÙèµÖ=ka×ø€¦ÿI¡OWeÃ]ÚEDw:,W\%]ÕHˆSpÂòP”Q<ïÈ5¸ª{j_!5¶XÊ¿Ûlló]å(—jHW™r(uê¿{{p5ý+iŽüÝ&¼9y±T¾u¿Oõй×W‰ _‰öɶ{äœ Rð-§å­Ä¬)cþ¢„rPÔógòÖ^«¤¤3(a­ù+7.•“1‘ÔßA~Çqíb +2wo¹Zïß:p5óÓvg¶ÈáÄÕC 2}”é2«­e3§÷¯Îš}½ê¬£Ø›Úа©7Y–’=ñÍÐ5²Qvb¹Œ•žX†q˜ߡ*ýäE23#Û’Å«Â#–üõ#¤1te íã“A¨Š¶‡ w ®Â# ó‹­ÓÍ×0ËHc¼ß£)žÏ]1@ÀÓÄ#!ø÷gTÿA²c®$eNŸÕ‚oq=^£2õ0ù9DD¥NqÒÙÏg`–¯œM-Ù7‰@Ñ ®^*ˆË‰î'%ò"^6å®~æ\•ꯤ²Ïb¹|65ùÓN1£~!{Ÿ®Ù£µàêîñ6puܘ­ø&pUä }»·óFu™·^q¹K»ãÀä,ï[¸-µEº Ì‚8r ÌóA©éü{]²;æ˜O9+¸ô;i½ýýÁÕ ¹j«^ÿ‚Í~Ú¼_-ÍÎ^ÚŽCOÙé·k|fdôWƒ«X!sù¾zÀÕkåùØ|¦ª7™Ã}|¼x]Ö7)ìÏRxÓÖO!ÇðvZE[›ÉîÍ~šò…›}¥ý®xÏú¶Bñ ”ð4¸qõB>‹*ÿn£ã.AÕÒº#š¨+="™†€ È–¶¹ò_ ®"é3Þ:3üä ¯!õÛuK ~B ªŒ{®¸zóFö®N¯G¼5¸zî‹9IaÏHgIí{aIR§üc+Ÿ}V 9¶e±«(;k)Þæôu­\ê•8þy„JðÆÉ¯Ÿ0D¿Æ ³cÎÌÖØžwóúe"ŠF«7¯•»AÚµØÜ(V=qÌŸðùkÝìãܳ¥”í‡.M@:_ÛêÎbp5ôiÝâkl!uÒË•ê±Ú,'‡)K©ù|tQœïo0qÓ%tu¼‚Ï+b·a¥±äR§0>ÇÙýS±RÿTdØWÕ'Sжa¢†¤Ðg´ƒ–žh½Ä*6•]ô=ÀÕ— Ò¦þ+1ôiézÜ«X*'àjØŸ™6þ¢1aÔ¼AðÊq WH8”×àjUÚWæRx³ŸOO™ôRUêp9Þ¯‰€«á/d/ênhk]9¹~)?–©=ÿw~Ö'WÊXµ3\U-þµœEºy=mÚ›pY˪þð@£«Kâè'õëÝÄÓ®,q8ò€]ŠùÙAz· ‚«X*Ô÷$ÍøçÌ] ¤PLú‘ûS§¼êô¤3$PÿP¸Å¯Íí0(Ùþš{Jù¯usA«V M,Ú1šPA^p@üÆ•_‚öÉ^zÇ"®jY`‚íòÓ˜žÓÆj†*¹ªÜ{¥$%cn+#)¸Z–ÍÓ±½pE¨%Ñ–ˆƒBp §·JŸÙ"uò?É8¸R^þ¦}iWãwcõ5D}D“[,˜M §#G#ÄEMX#/„…`Ò4&,“öq±©ß%å/FhÚ^«<›4æ©xßßèâo\@!›çs¾Á­û¸¦<I‹«M¾ÄŸfp•AjéOä®"Ჟvk.€G·B@̈±râ޵7Sg˜2å5(#;ªÛl rIø"o't’ÈÍýlj!OÊ®¹-UÒq%úÿã†\ýfuúŒææÏ˾^)­æ¶ÔEžu_¬7ùQŒû ·Û¥ÌrŒbýH˜nœ?%ê“âZÇ–tÁ#ÆÕ¸ú‰Ó†¶–ﮎ9Qà©Ó®Œ.=ùüü£ÿùÕÝñÿ÷_]öu·½Ù>q5s¿s ÚÜWïl¸W½Ö ²ÎÉOIfU«kgÍ4r¤œ› "Ípõlª{pÐ] £H#q”.iÏ…Sk³÷(=Z¸zËr ‡ž£‚XiŒ«6‡$Žþ_¶*Sçâ[7p…I¡O5¸j\ÍXÐ%!ä œcìÈ~â\]Ú›™èJPq;¸z>/ãJeMÞw)áÇó^Ê;å$3’~Ù¸j¹%{ü% 6ùHCj×çë1¡²÷ÆY½ Ç!ÅyLÓ î¡?á%‚qR6üùÚZUD›‹º^*r÷6rä®(m.ëW׸Á)yWwGãpW_W~î%Å&Ë#.ªM¨Ë ˆÔ¹­ß˜÷NΜý|F£4¦‘Õ ÑÒ§ÆtóåòÓíÀÕ’}ϘnÆÙ¤;ùÉÏŒ³~Vpõ„€«¥Ç“-cȇ‰/IZ‹C¬·zd£‡tä$I7ŸÆr®ipUEãÒÌu«Î<¡›U9W™î9½ãE¿:'ZÐà*9ÔÕ²\éMò³›W´¨¶³Tm9n‘·z¨lº3ƒ«‰û2æµÎ_3¼`½§ù+d»Ü6mÆÛNÁÛÎÀÕê¸Q?gJv¹’ÚñrÍÕ‹`ÇŠApbÙŸÝ/wÅ€Ôɯb7ª³¿VäæFfTGÝ …ØØ8|í \…ƒºÓ ·Ȅ[ÕY'eï±\=¾TZÍo_™zX^]$»D²¿Ö)fÂ6U&^´ÃIñ4¹Ã‰å…›}±cw ®Â£sg @ºÑÃŽ”2¤—hÌ]5˜F«îH€`aÚ¹+¡%{' ¸Z’‚prqÒ¸¿Ú«ªšè“ùë=™ê\•Ífgipæï¨{Bq½cƒE®nù kÑÐ¥‚XÔ #Ó M°®NK·w¹yírB`3Øgàu—KR‹÷Fœ=8«ž›`]áfÁ†QÈŒ€–«kΈl/Žõz­3,þÛPÔ ®>Ž´8š©ÛWoÔ\#ŸOÇ<ê}³—KR°Õ²éËO ·•쟂½2ÀU¸cF8ëWa“t‚|¼dÿT}[ÜhÙ¿Wä,ë ïÈ/Û|Áõªs袅Í^ØEÇRhǽëRƒ«dúj/·Ëµ ¡ÉãþªÁ Lž]v¬!Ýá?m‹œ«BÓõaAŒÇ}Ì ÏkW’"çª\†œ²³ð !ÄBᯠ®^'ϪˆÛ!ÝL\]wöàŒ„àßåKððNŠÕ%OøfVj±N{Cú¯9n´¶‚«M.&ìNžð<*æ´i‘W[&FõLûW8"M f¿w*b·‰O<³Ù)¸J<Io\ÿ_F$†_fáØü‚;ՙΡ¡”ˆ+Îl5|‡lƒübŽ:ù¡¡ŒÈCBðÜA€ï_ªÃ?"Õ¯ª\ …;‚«º\!&3…Ϻ˜¸×Õñ ‚iÜìv/ŒfR&QjáÊyDÆœÖä|-àª×îî‰ÀÈÖÖ=á,0)ôi}öórqRœïo®•ç«í¸ÙÒ9õµ;W b1’È ‹Óªzv‹ÍŒl-ïàT+C‚oãJˆÀãý-;±L*IfýNA4=ÃÆÌ "ˆ÷k"§P=î«LÜg~!¥ ¡L&¢À‰à€b½†›Iaáb£ˆG]9¹ŽGAô¦yï0ú¸6aýA¸êû›ÒcKˆa뀫gáS0F*¡oHºáˆ="À¾Yså|FŒÇý8ÐŒäØÁU§xg† ëj®Þ”-Žû¥Êëä:W¯âé6鉑%†<ÚÚyU4çNXeÞ­²ÿk±¬u³_œ÷è?²‡™­Î<ΔJöF¸²Ï̕ʿ]ÏôêW¡°¼RwV¼Ž¡T¤ÏÁ™Yó;œÝ?5ßvzË" ‹7‚„+$ò4Jج…]°¨(¬$DsÞ¿˜tÀv>z+"¡¯ÁÆ*œÿœ,Ú÷7…[dc@dë_vAnòA©YŽ$b_FbÖ¾ú>Ý\Å û2Òé3¸*•ÿ.Ìßà‰´È[rUÉD›nL"‰Ìõš2â 9à/ÁÞ·Är\CìÊ'r7N  ”ö8¥Ç—a4qYWÎÒ>I6ÀUؤ{€ÖW¥”kp5ï€Ô®7aÞ^¸š<ñer÷O¹y½0 3ÄÓátP4Ô?}ÆÛ˜Ä´©¯KûÚÆ5ùˆ}nZ<Ž[úÓ™>/ûz¥¼€˜ô2EÖüöÅ*+!$Pç ~LÔ§ß:ãrI2”—Zja¶Šêˆ_ÀUaÏ1˺û§Ó×Î[5ÔUƒ•;W×¥œ÷«y}Å·ÿëxàÝñ?1ÞYãWs²Èy:\½³á \%Y°–Ty™œ>#ý—þžûÆyÿŠp(+ªƒžn÷àjÞê!i3¤›•æ²å©ÉùÖx³_kpN~–Ù¦þþòª×|œ‹E Ô=#¼ÕæìÞ’[ÁÕ1·®f.ë›@Ðç•·f±¸*s&8$11:G_Œß%sàóÑŒÙï߸R¥ÁÕüµ— ã ·áC¥®»WIa®],–m–ªÌ`Á/9)\å¤ÓŸ¬‘ø¡‘õÃñȤ$€µ•ˆ¡*ó8Ü!#3ÀmaAèÓ²³î{lØÃíïžP?¸Ê5ñ~d-êêØrÔnÔW Ó¦¾FŽCÝX¾4ü*±V"š’×ß³ß'r3ç¿°ïìi×Õ D ûùЍIˆò׺]ŒÛi®ªâ·3;¥.|½:g¹µ¨Wåðš´ÿŒXKšø¨ãcdOwLIgÃR²{BÖüŽfyv ®^=ŸIbB Gê—ÐLÊãï ¯®ž±W!´B¢ÈL…8uÁUôºx×XBt(CÒ--/ÇàêÍëÄos[¦Myõ©µ®ÞCwB$ÒF®ãïT ‹·{ãFý‰o±ÕKz M¯®¬àjøßqyjÌÈÐb’1¯•ÓZ‚1¦…Ú´–_Ê•®Ö”q[=ÕGqjT¦apõ\†l!¨»Aó‹­Î>;êç|=;'§apuǶâ©ÀÕËXN©Åñ‚]À`•ÛKe'–鉕_ÊÜ ®^¯.Ca×vVpÕë|·p[pÉiWU@rÙÙ`ëòÏgÀÖÊÄ}L˜éá5ô®ÇQ™z¸"v‡ö¨Œ#63JFà±¥iÓÞšÑýËHaHP7ì›nè80ø¸1}FóЏ]‚2e$ÁP¢ëãÒ¾‚•ÕYÿ†n$A±^¿(Øà©Š¿g×̉ªVƒ³Icþ„˜å,íC”…5™ö&y(A¦õˉþX¿np*Џ*m -!ÂÌ"Nrv  –à½&@Õ(†ÿVÄíΉkÜ0›®Ñjr­<Ÿx˜…ëõ%{#ðA¤{uÁÕ‚ºàêD£8< /ØäÃdж‡Øùt ®löåzB ºÜƒYÓ1¹õ‚«/¢PÅ»Æ7&TÐCª/éE"þÖãdቀ¼ã;½±ñ›`ÿc‡ˆ}j,Q±=¸zreÚÔ¡ Vp•i^ž·zˆ]¡'ÖzH9_µ?A7šÑŒ„ˆM‹Myý’ iNË‚Yî\|¬¤ÍÖäÿu ðîøŸÝöeþÒùyê»àê 'àjâ¾”‰/‘®¦ÍxË\Uu©¹êÿ?­àêé0POG8ؽóóNû¹¨‘µ ³:Ÿâd€“…\¿BN*›j.W^.J$;ÿå|2A¢hã—.„^z|‰#¤ÐøÑp•å¤Ïy¿þÜÖb®–”ÂPX€Ô¥Ï|çìÁµ[àia¼puÇ9d䬣ìHžð<1›W QðG•)_H$™C<£÷(J}†Ãój»x¸W¿]§»‡O©£ñ?Ký¤QHêÒ¢¬E]ÍSé±ÅÌÄn3žìXXÜ£2åà¹/æ&ŽùY§4ÿ"@ÙBpf‹…xÛÐ;4”è "n $gw ®Öä|S¼kì…¯W‘!æKŸ ?H5cÙ¬ò\%/P….‡pÃäqÏ¡ïäqW‘gTŒXš@ÀÕËòZ?{i¯ôY-ôéóÈ[98CpË\Õ ¥M,×kJ‚«äžÄÌä æ%[©›{^«,!ÙGxn^«I›ù¤¾r>SÅá]ÐnV ËΘ*íæo\•¢+ž'sÑ@eœÏ¯ Ö{VgżÀh#¦Õ š¥›ª¼¡zÀ¨êŒµ1઴B[㦷7²ðˆSq•V>û§`ñH“o\*'5€X!)³¯ê$§Íx›™“û$û+×è&DÒûfâKb3t’ WcÿbW‘¥ÂM>Ò(ãÚ-àjq2óDHȪŒ#ƺ.¥Þ餱\ ®^øv½îb_+fpÇ´ì£ØQ²ÿ|ÊîJ‹m+`ìÈxœ®âžÌ Ñ\ h.;ý põj "Ä5J&6\-Þ96{Qw²TÙ½¿¤‡Q 5{IÏ„Àf1÷aÏu¤mFùê•)‡?î¦Ò"[c©Øí¥GU¥.Ú1:­›«²*ÎÇ­›WΦ“'Jïké°†)©JÁNëÆcW‚/Àš-–Àè&ýË •I ®JO4¼ö²>ü.ŽiäÉãÿK7ŠpuôCžtlŸtõ|&* / °>{uÓAÙ qÒ઴Y¬)Óà*”‘’3Þæ'ñžW²?{xž®Â”»¢¿ÔF^ØåÆÕêšÜoaŸ§M~OpJå¦M §Ü`Ew‡€é·¨×. e ˆNQ@.ÈŒl{1i?A‡¡Ö`Ú- SÍ=Ú즡ÐàªÚ¤ý“òï6šÉˆè"$ªzö6¸,àêå‹DÑÐÍiH&ˆVÚ—é³ßׇ’™ 2€¥-ÚªàëûR&<¯Ì‘…å—cÌŒ’Blò±W1¹dvè=ê#Øþ‘WubR¤vÚÛƒ«×j]ãB[<{ù©>9Ò#3bù‰¡OãûìÞp5Á#@Âe˹¶C³$F½yÝévSëW.#{\_vr…œ˜[9ØUí ®‘ãü‡#ËžTÄïF[ívB’A8‚«~Ú¹jQ¸ÅOå“ÚS^ƒnõ€«RFcƒ—4õXëŽX$\oè%‚¼ÚØFŒDÝ¿hûę̀UbT":$A·W0†îúêÔ»àjbÈL·…ÿ’RðªÊ¹FöÒ>Øíü5Ãôyb<”uÀFq¤ÎYþ±ºÜMu4“²ž²27ì°œì(Ë!PÌZÐEá—WEÒ§ ?&wÕ,¿P²%2¨Cá–œKñžp»ÙJq¤ýSQ®Žˆü-F&Îç׿¼.ÁÕyíÃþL.†ÉrÚèÐéÀŽIû$·{T‰›ædÙ™QY‘.À’µ¨®ª‘·úVpõ«(dÕü9AÎ+1ø‰ÔɯEÚÀÕ²¬…¥íà²ì:\IÜâX‰–µ…!åL {¦üô8Î}tz§CÒ™õž?,¸tå Žÿ¯€wÇÿÜx=ú”çwÎÓ»àê Gpµ2i¿ÀJ#~š:é%ÑPgàjÒ˜§ˆÏ[=Dï”Ã2\¯¹€s!A`f++÷Ÿÿr¾]@$£¶)ÖwîRvž§{ àªvây«;†Ö„ ñþMŒ?¥ïpÌ6Ǽ‰ä‡•¼1,o£/¡)K#¸Âeã@s?X{¥å¦ìüÑE™óZqÛÒãÖ÷¶DP]|ú7ÁÏ’é\.L ž—Îç3ð†ºß7Ó+Øè]v"º&÷tBðzÃé'>±ž÷‰DMd—Nû8r md‘Rê± ! Q%–ƒ™!O(* ‘ìÓß"^ý>gØ®nò‘¾3ß¹ï¼É©1ìÁU)ë}¡©™™üϳg˜} d$ª!ß4ó±x÷xyïì¬a9Á q>BKƒÊ_?¢*ýˆ†­BrUËMf #ÌÇ1`Šô!µõ,N÷,&YFnqjd£©S^%–CžÓm…¤~ !•6³u« ®.ÉYþ±Ý®9Š»¤geÊ!X ®²4H!e±H°:å_RµÃýÇ$§$àÕY'Ý3#Û¤M}Ýâ\%»DòS"^$xÓoL¤Ô˜ \µ(Ä#oõ0þ%çU'¾(ͪ®ÎoÏluöëõ°t¬Ø?ùæµËgª©Žg[3Bå\U§>§Ôâ·–[DõdèŽàêÅ„=9K{WÔFȉìv>@[íê…\˜"­UÒ¾”²“‹»gEuB¨2æµ.Ù7Ù®žÍYÚ‡´=qÌS’+9‚«–[ðK°8œ"–Éãž+=¾TRø-þäY7Ùyè÷¨¹j–À•®vå_W/äÃ\µ:‹õeÁöÑäVTÄï,Þ9Öi/ ìpîgŸ 3RÓÕE=·Æˆ+"}Û—öÑ}©Šv†‘"‘0m ”VΩ‡ɋ׬J?ÊJÔP–9þoÈùˆÔþ=blàœU¾êšQ™|°h{ˆÔYÍ9U°ašNN-…C­{ŠkT¾_¡’õ€«d.%û& ¸šü¹œÅžón…ÿrÜf€«|eÉηÙïÕÄÖ>È ®Zn‘λ‘ŽÊÛp•e-è,Q|CÚhô(ÄŸ&=®rÛ¿è÷&èNƒ-Ò’æ°4¦ôo‘ ËŸ·ÆMz'mñ‡txŠÆ€´µÃb¹Qs¾hßT•v8cÎûR€nýȂ;äÝP[ V[naO¤ÙMVmq˜zÀUÄIàİ?ë3,WÎ¥ã4u¬GŒôÓikT™cÕXlD+<Ý&2ôÆ;W³2?m«<…ýÖ/W#[“øhp5óÓö\…h°)eÒË8Ü+Ð…wȧ0³ñ»`Sþ7ˆÕAê¯èŸ½¸‡\ä9ã¸T¥Và*ŽUvÆ.íƒÍ8wÕÐÄ?-ܺu-“sç˜ äâ¡çDAºüµNñW§¼–0»MŒ÷o°ÀXWìvá¶`¹Üè~<ŠP¸5ˆ% rÆ MÔYÙÉWô6ÑzÆ­WVûleêzwYƼ/œZWþÝæÂ­v@“U„.W7–_bè ¼9û#ï€Âþ \ôІ¡n\½qíbâ~n›9¯µvvç­u3úg¹WÕn[l&Ó#«ˆÛy1ns–H½C”W`IûSÂ_pJ¢&lµ*½òG+¸Z׺ʳv† Ö}j-æí`á„ÐiÓÞpZhWŽØ'ìÍœßîÚE¡ÆÕ²\Œ:N¤ïûˆzÜ„U{:<)ª„ã°¨7ã‚ o ‘“M‚®?gåÝ¥rœHyÌÖóG”]¤•K x.è„Â&ø7å‰ÙW¹ŒO‰ç‘±2%]†Š©}¡ÿ`™N•‹‡¢ÝqÞrª%…>cºX½á”WÍH)w&ø4^ŸQàÄŽú9ˆÚzñiƒ= ¤îPdÛô™Í³—öª\-ÿnŽ ûàø‚F€šµîæ¥a]S"^(Ü ¥¡ä˜§„øcÿzA½2pÙº‘Cö×­”)=S`´M¯Î>‰/Ãî!´(KbðDÚçª[õ¯WÀÕ]ãR§H×L„Ú>Ú9kQ·”‰/Iy–y­ìÒ%°2ù€c5‹ ç—ƒTAñÂq%ÉÏÅ4Ãrì0+Å¡k8ZJ‚/ïKtQ´-ˆDlþê¡H²ÜMÀÕD‚x‡Ý…K{3®”¤(pµ³²ÛX¼JU8%†åcÌs-‘mÔG5vWLE0Š÷„K± à'â~KÌcnN§Ûì:æ’ió;'ŒþS쨇¤¼¶ëtv£:ó8¢‚<üK¥å?ÅY §ˆÚ]°Á«‘·ú \/†¥ÒãüÑ…RkQíGhf‹D¼´uQÑ'(-„!W<ÒyX|ƨ•i%Ý«®pÞIcž>«j(9Ui_ýààjpʵÿuôïîøÏÏ?˜äÜ]ÞWïl8WH/*·{1§÷àjêäW ÓàêØgq4\P¸% vĸªãÜϪÊcYÁÕÀljÁr¢?¶ó®Îy¿þ6ÖFíkÜ, …ËœßÁˆyc̃K"N3þ$°$ìt <\]ëž¼ilþÖÜÉEò„¿3ëúùµWZnI ÙF6UŽú¹z™ÀÕÇr–õÅããF±™\å2ÜýÙƒ3™Ÿ$WecVúT>÷'¢¨giö¢nÄ™N7¢8翌”]µÇ—båãÌw˜!·Ïš%å§æµ¶ë«u»£x÷xÁ„ëÝéDœ@¨Œh°!‘Sp¡ŠhJˆ+ˆ)¼,…÷[â­Ì©1«æJÇ›«&ŒÏ¥Ný—t ¾RU²'¼p³±:¡ »¯–fë6”]¨w©Ù„­R^µGuÔ&…ýåŒ \…z²SêQܯKèb:Žsgf/îÞ ¸z© †èŽàìU{[a–Éb%÷põ`áf²¼¿0O\9É a^Þêaβ¸W 6ûæ®DÀ)=ßš¡YRjÌ®^-ËÎ_?B«Ïóùš 9äæÿ^ájSEíëh"úãÔ©¯ÃÙX¯_pW¯_‘‚BkÝ nIÆí¾Eäµ Ë•µ7.U¸ºÙÏúÉ­›d1*Aû›yŸ=)ô9ûù ³0 ðbÓŒB¬KEìv$BPW'½\•þdQàjG†T‘]7‚ ¸Zu.÷³ª)س²›Ô\…Ü'kaW}r®D…ɉ‡Q¢Üèþ•‰ûâý•wO¸zp&LÏ^Ô]«y0—‹ #ç%û&ó9‰"_m&…Dƒxz’ŸâV°5Ù_ç¯ó(Ù;±.¸úì Öàêg1¤%¦ÆŽ|ÚY§k…$&|·"n'ñjJø ıbGÖ®®u»ªÁU‘ŠÅ{&4H3¸zKÄ,QW›r­F¾qàêD¤…]\lcX62,Ù0?êç)žÇá ¸ºr‘Õ3°øèx¿GÎ}i¤ö˜²')˰¨»&mta­PX6U*³€LŸó–Gv,oô"»¬É=­{«©^óo,³4®JÏ”äð¿ã_,êÄká&_¤KÀÕ÷g~ÚÎ  I1Ɉðq^K}WÕx±×þ‚온#mú[R Áųiº¤ªU«Çeá¬k¤(¥¸úíúŒÈ6¨›>,C­Í¼ZZö‘´¿Üˆ"XÁÕ÷ãtä¥Fê Á¿GŠˆ[˜á¹Ãs¥!õª!fpU^djpµhûhr¨œýù.“žøABË­²G“ˆÙ5î´˜ÀÕ³‡fÃÁì;j/põÕ„éïÆøü&uÚë¡Ë—’¶Kû¨í£å¬‚˜!3²m-¸º=$ÆCʸªÛVGkþ½")ìÏœ¯'}6e2ßÚ¬[.:)Óg¹….°:©Õl{u%]ªÏ# Â2Àt¾ 7“0žar!*Œ¯Ç_Àw]õ‘°0Îç×NÁU©Ë´Å¿ìøR]_øfµ«Ùx(yìýë‚õžr*!í°T¢NÚ_²o"æ`æÂ7k¸¿®"äç,€¡p${qOæ£ÀU9ˆÝ€Å¸Î+%)¨¹ÔËU¨o\½ %‰³tb¥Ž}ëˆ3ahMþ4úÚ…|šúŒ\Å í 3ƒ«bŽn\“ §7°h›>ãmÝÇ EF•ÈôFtrTçÔ:Bn.½Û<~Rv"Ú\O@=+T¶z~½òbÒ˜?½\œœò$lrêVp²a¥]!_yîà,̦ž-ŽÕ¨'€'%ÒÐ/¸ê!}vF> eQmûÁ0\E;Fc3ub8ñh‚ „8­‘ઈ2œ4æ)sw](sþHÔK {Ænc¤MÒâ±~ª*Ú½x[<ô´³qµí¡ìëU)/f/ééX®¡ìø2IXLåd\ ÿ»T´^ÔÍø€8x4R$W-È ´ŒS\†aQÅ'ãxºq ïÀ­ˆ .% P9öY¨Ç™^ƒ»>¤žðçÓÅ_­Q æ)ÇÝ/eÒKÒ«·.¸ŠÌ#™rlÍÙ1v)ÿ+oC~† –\Œ–k!f0ZÞæ4;whŽN7®],ÁTÊ®›•ƒH÷ôÉòV‹²fP á»]úå»ô¶(ˆ%вV0«ÑýQjóK ¬ qf}àêª!(5&:1äÈ!Ó6×4ÆÔèÃ;vkL‹êø;¼Ãm«¤Hrt=ôi÷uâëòv½'ÆÂã|gªÄ{w8ˆ}Nòw$§¨Œùs ®ÂhԜ쌈޶ ï˜Y鱫êÛ “Σe5¹§ø ‚x3Hl‹ê,° )EœêÙ“v\½;îlÀe§2s\½³á\%@©(*ŽòPÕLjt°Mx† N‰øvXª<¹É>R"jÜYUÆ1¢&¼y"&Zz¼b‚~§^åü—ÝN°ÒËÓf6¯ÿÜ¥TYÿba­EEtäžFô˜¿~¤cy‚áÄàß«7¡œ¬œN%•vˆ® pµp7Ù÷“rkÚDŽà*I‡êŸõS²9ãÐdI™ø"!4^¾ôèBBbl£®B@éŒðÕ|¸ºsÇ×õl 0ŸêyW+Gh÷D\-ËvuÝÀ_Èüõ# ¿Æ{¡yêäWcUki¦!5Äæw¸øýšIÖ²œú“ñÒcKˆ¬R'¿âªS¡1Ìà*Y¤T0p»‡RËIêSÍïî­àê„¿™ÁÕªô#RÈѶ¿Ë<¸!Ž,uÊk]Ά È3Zƒ«LŒ@ëâ¼ͧfn^©”³À6à”YIÔ³íæ5I 2æ´$}H÷¬”¶íný¡‚—³¤—9Dt ®’>HŠŒc䀙‘m U¡œï¶«ÿmAþ hÓ¦¾N2‚È¡;)M›þº`qW ÕŠwŽE²—ö>3ürjR˜‚Í~)/œ;8Ó Žt„ßàÐŒ`; QÁêa¥GÖ¶ó]âyý:ñex'àêÈ5¸zµ4[ D[pó(Ü ÅÄR¿øþ$µWÝ+çÒ 4çJWÎen ‚³é3š›K”ä®è¯¶Y{–ݺy£üôÆÄ1"ò‘ÎÈ_¬Î8zýbqÖ‚.Ù ‰6A~β>®V—æ¯ó8ãþcì¤`¶¶¹\%çJÜ'§¤£ŠgÎ%EE¶‡¨ƒá=+b·Çû>"$²¥gåäé[BŸäÏQFdƼõ—AmáËå‹®ÀÕêì“Rêv£Wñ®qNÏo6rã ²jK°‡ªßºd²ü¬É> ‘‘L,ÞRˆ=D /|³ZöÀŒzˆw€QU'ô­"„Tè·rgÔÛy ®®u#…ìNÀUï_æF÷»yµŠUËùhsú/;äMŸWŸ¬ˆÝƬ䄅۽.ÁÕ«ÕäSL)oõp=g˜Bª^亶•1‰áš®ÂDÂ`é…mó;èuñžˆú«‹ÃÜÌOÛ¢Ôq>¿BΚe#K\FÓ1éX$Çð®†W1V†‘ÚKåä‘àF¥šèê¡iÍ%Jþ½>™U1•$wÃûÔdDªµHðDtß\6¼~pµdoDÚô7ω²®w[0w€ŽàjeÒçé³Z BPX8-Ú¢6lK¡0zòv/Öåyvi§¢Þ_ä­Š#`pCÌ £k#ÚL@Y{ü„•jp›»¼"–åD÷·‚«?AªÝêÌHªwþ{©11Ã…o×a Œê ·n^KýG²rD.kQ·ÒÑh 9WîÊÁ÷âé0&ñþMT í[,DÚ¾˜ ,ÔŠ«W‹wGÂs¢û™›!š›2áùøˆÆú5Ñ•O 6ùBÞÒãKeÛØ‘NÁU>‘¢1àêÕ|hRè31[åÝ®çCx^]‡SŽØ;äw„d< ÇÒeçY)ê×.i²ÍrFLš*Žøé…o×#]¨?Ê%1çÄ ·øß’mÿr„$èwfÙ¸T_~z^I¯å,ï+ͪ.;ǘ€îÊ—ûÙ é˜òEáfLÙÙýSS"^$rÓ}å%µÛ=×.–p[b-¬4|We¯G‰M *2©!/µÜ¸ÊC™6zjw¬Fîa¬Ê<ޏòÜÜèþx t­ôèbˆgÍàêåÂxüKöâîN®„ì©‚œ<¥1=øÎ'®ÁÕlµ€«a‘ôÄýÒÓd35¸*‰/Ôpª&ïtb°ttªÎ°—UuÃKÒQti/ õ\«,!ä€P¸š:ée£Ë””Mˉ²”H¸`½§ÔÍðúEÒØgñ˜µêyf3‰œBø«³¿\:aOòØgõ¦ÄÛW! 137lRí fÀhU£ÃÉ92\RBð²óÐýÇxC„AÁ³-Ê ¸ú9& ®‰ xÅ»­¯ídGʪ!Ø4"X_z|YƒG¹1Dé3›k$yÈYÚÇü^Ø<`ÔiêàX£CÇæj¥,Ÿ´Ž˜ÍßâmQ=8¿¤ÂŒ³§`¥¿¼6ƒãž;d¡Ú‡„;Võ,ˆ!µ!XÅ/ <¤K¸3ˆ†X6È IÍæb$·E”Å 6Hú­W-·° ßn@°]…7º·–J«R}GaåØîñ®Ê¾”G/|³FÇf7jÊP1¬OG´øY´c4.F?ÁC\¹LA éü|X•z8s^kí•x„yD©1 æÔOväî G}Hdì6*\9›*EêV @G`¢ÐD3HN àªÃÞ¡´¨.qþM¥­Û&ßzêÙbñ$²…—j‹õkÒpaÄýø Xϱá¸9ä?ÖëçÈç]pµÁ¡ÀÕÓ²†üÁü9ƒSH齨½ïT…¯—^¨Ê‘©c;^„‚D¹Ø]Î]ï;’ó,£ÿx1q_ñÎ0RlýŽÌé¸ ®Þw6î‚«?ìðž¼lìÂí“¢÷cÜ´ù¾;ìô’W¯wÆNœ½O>œ±Ðw`—°‰3ø}LØXŸþí|>éàýQËÑ£Gs%cLhؘ±Â&Í òìçå?¼¯gçW<»üsdç—½ú¼8ªÇ[áQôÝô3.œ…˜Ÿn7"n=&4Ø×S~_°Áß½Ÿ~#Ègdø§k쮟¹’ÇM\²ƒM\º“9=&bÑæIÑ{Í—qA ·›·¯_pp°wŸ÷ý‡ä7¤kà9¤öÊå{ý†ôôêÙœµŒêþfè„Éúó±Ó>õÔ%Àã“ÐñÇÏ\4iùž ‘«¡I¯Liüìe!Á¡ã™L¯'Ë„¤ž]ÿ5aÞJfà1`ÌØñ—ívµä€‘ƒF Z_YÌ#t|„wŸ÷¸í¸éQEhÞéeï>xvyUø6.$ÈvŒ2·‘7¼ã1vÊßA]¡ƒA(W#,jëèÈÍúwVêÕç}¦êýqï>Õãíàˆ…›Ì<õÚÓ§_[èl|>] ·{HHˆãÍù—wßVÈ'‰X°)8( 8ÐÜŒ#†…OÕý ‘«àlÀÈÁ¡ã'E,Úb– ØoXoý'âí;¤’?iÙn¨ç7´—Ï€N~Ãúpäð%ݾÑcÂF ˜0ï3ãÃ1ã"„‰Kêêæô£†›¹ˆ¥ù»}ìÕ»ºÆï,iç>è SõÜmT¯æhÜè1cø/ ÷ÐÑwP7ý,ÿ™k"–Z)9aîŠ@?î‰0‹Zu~y÷ ðe±,|âÒ]Iƒ|<¼zµ@a‘ü‰‹·y» k7=ó`&Ö@ØÚ¯Í¨n¯{v}ÎN\¶+"jCH ?j5:$Øî[ÁþÞÐaÜôùߟªoçqAÊtÈ@Iç­D)¼û~h¦óøY‹Y»g·×1w£†ŸCÞ o!‚“ýÈ@høT¯ÞïªUï`E(>ƒé€Ú^ÃÜûÁÌ4çs1Ñ…Ñ!!.}ÏP›ØÃ,”ÅûãÖZ¤1Þ}À™!ćÎ(l¨Èê›ÊŸ´×ñ^íC%hÙW—˜;QjÄ a?k)üBUY¶æCGâŽñ%*[h 0p7!¼û¤#.˜ùótîF %äþð3+–väà‰KvF,Þ&!YÏæfÙÀâApVÇ#ÆMû”¹aOÌjh7˜NçŽÈø 7-’0Vò¯±“fJÌ9ü#¦y¹Á¬1aã±®â|{¾ã?¬º/Ñâ1° ?EÓƒƒÐS¬‡ˆÐ‚m!ó69}ºsá\¶ ³OdC¡I8FuÙóx.(,ò°|ÏØÉ³¹ MÑ!%DC°ðX&ƒ›[¾GâœqœEyõjÎäeí‹¶â§¼z¿çÔƒ#]Pú³¬¿ˆ¡^\k3!JЉæsøÅp©æz‰—œYKYtVLX¸‹¡‚ý}ôl}t4.†àHˆŽWY‚Dœ€Uôéß·k2 Qt ›&nzñ¶Ð “ø·B\%f­ _â2Ì61ã& &–¦v΋·1ÀƒøÜ0ƒ%¬BFH­Cð˜aØd›åY¶‡U3(¢¦:æeù’\°þ‹è9„%óôwÉ)ÌA© #¶•˜¹o+´1+B¥…G2‰Zë˜Äå{á Ì!ÀWÙ ƒá,!Às07”jñ6¬ì@Gõ|Ûw@;ƒ` ¼VH¤®Ûëð‡5náŽÀéÑpkfݹ+]ÄBÎ\ÄÚ1§ˆŸßàî¨vƒ ‚ ¨Œ¥VÁ*²„`èDO!\6|ÞÊ@/wîì2¼Y¾fAmâ=¨‡œ£ïDbH/>2rsØ6y¶fDà¹0ˆ©Âh<2é+⺗ Åý‡}ÄÚ¡ CR‰œ± ÌJy¥}Ødx$¡—{?1 ¦ÔOÒÛà Ì8êi3m#®Î¹ÌŸ#öS—ÁSÄI®™û™¾W‹µÔ¶z†¨ÄGœ¯ß(þ$bÑfBäjÉjƒñÔ¢ðB}åetjl8*ƒ“€r˜-•Ý@ò1\c§E~ñ­“6|wÁÕ»ÃÕ¸ ®þ°ão=Æ6ý0à·­Ñôï&o~ôõ~¾1 é^µ¾5¸éû£ä÷÷F6yk6ys ¿Ë•¯÷{ì·ÇšmúîˆÇZ¸=Ö£Ió¡¾ÞÿÑ7úó“‹ù/×4méÓ¬Uí³ô}kán~ºÝhö¡¿¾§úÝOݶŸñD>±¿¾¥ï£ohÖÊ_~oÀ${×£Ù‡¾¿mUgüë±w†7iáþØ»#XÅc͇Y'Ïxg¸ùJHÑäOÔZ>iú¾§^MÞÊüÍÏÕËäYÌŠ+|È̹ ºAŠf-}ä†Í‡ñI³ºó1ÇÞÆL—æj4}ÏS-ahÓ÷½lÄ鯆üγ`‡ü÷ïFÞðŽs†’MÞd¦Œó9ÃÖ–þÆ·`S¡zs„–µò7ÝÖjÃÊß¶®%špI{×ÃÉ4àÅ›E8?ð’)±üw=X>sƒ)ðQ3Bþ|ϳ΃Z@Ã&oÑ>ÊXÇEH”Àp~ÿaI§™›Ù*Ÿ|èo¾L¦!—y³ º1%‘Æ·™®A‡È@ ß¡õëzì_Cü”ˆºsÏǬšÕ_îù.ú;Ìüh!ã;nMÞ î<¢ñgÓwëc®íkáÎ ™É£J‰gøWS!〦ì“ÉÀ—BVEBÞõ`žÖ?µqÀ½9°ßq”¹ûÄ ÑoEñ‡£Ñhu±ÈÆ{"<ÌP ‹ÜÄGÖˆd¾=X[¿&j¥¢¼Ð‡…kÓ'öǯVì?ô·IÚ(̺ê÷°Bä‹-}Äx¾)̲Jš‰DÂè/bŒ`ûŠÌ´¨ý/ÄÔÏâνën˜n{Õàΰ»…‡Ö‚~Àß–>"E"!ÖµkUƒÿæ@‘=°NŠV6óë]eþ"lE’•µ“n %ÞJV1͇*;à©•Q5Ý ­—eº aß…0ë'ŠãYùÛM[X©|Öc"ù~¿mÈ=AIJþ•‘qãâfˆƒã§ý|`«Z~=tƒJg+9l¾¸©ˆÇ@ípëw—un¡µÍM¯QÛC5nk ¶ZrÄï¿dÎÊR™tJ ªYÀûÇZºôhbë”5¶Ó]´R¼®Xlº3¦Ï°TPI‰–»á.Eé ž-PqÎ8wq7*zQÎe°Ù ÔÎ Ë e„1µìV¢%Ò0nz>\€eVÆA¬DKXÀýµ<×>¢U€òAò§H»h1ÓF_†[Ÿ¨xd}Ö=rÐe1 ïŠØó-ù.TRÔ–¹)£×¬•õ2‘V-½€bȶ `´¥Ñ‚_6:[éƒ)«KFnÞÌ!ŽRJ=@<©{ “p»<Ó¶ÅKæë•¯ïoÖA1Y¿öê¡ÂQ„þ"cXm¡¹2³¢w¨³zVKŽsÄÎÈ5Ôq–Ϭ†ö“ÜYdÌO}]̦žŒf‡š³˜Ít‰å$ r¤ü…þ¢ò›Eë•T‰VƒbïT8eÉï k¢L´²óu&¯ã[%Z®TH@9B+Ž‹)â¨ÿŽÔnEû/½(™'ërFqÐØëÐ}¸â׈º!™²x,“GƳBÞ nљﶮ ¾èÈ\Q^nz¶*º3Ù(Xÿ¾—EåGFh«hŽsDHÔ•pAEz¾Z”jî`/®õØ DŒGš‰`¡ÍâÙ/êo‘væ¦H­ÓCeøº%q^æÕYU )µYr6‹ð¼;RõºA© 9 Ô9šÒîõXsºù/è²ÔÝFNj×í£V~Ц]‡n#"z‡,áÃî^ÓÛ÷è×Í}<¿wÜ®[ß½wìëÖÃ{z«[rq‡ÞƒÚwëÛñc÷ΟxuÂ[·iÃøÙ¾ûÇí»÷ã®ïéi<¨Ëයuê7Âüt»ÑÓo^çA~>%¿ûGÊm[·âV|b¾•1zøÎæž|«WÈ.h×¥WÛÎ=ºÓ+pAŸYútêïÉeüÉ­Ú~â×eؘ¶»ðyÏ€O{/ê28 CŸ¡ÆÝ¸IÛNÝ[µ’¶iß±«ÛX‰&vè5°«[Xí<ý#Ûvî)³ò›'Fñ “éÔóçJ¦ ayDûžŸ@Àz–|»£«û¸¶z°Ò®¬¥S÷΃:ômݦmkE)xÑyÇ>C»šò>ÔÕè>jj§~#;h`ÎþQ}?µ±x.r…YrÒºm».C{-4ó´C¯íºö鼸–5A ;õóè<ÀÛéÚvìÊè6"¼‡÷ŒN¼» êî9ŽsgÈÂÜŠgÁPóƒà_i×µ·þ³MÛö|ÝzOÏÉ]††ðß΃ý¡mǾÃXºu6ºãGÃQó'ˆ"bY‡nnaè Ê(³ ŒÎ~ìŽ4"ó&Ê,`¶=ýç1I$F1¡pûýå¿!KÛšÓÓFIžˆÐBþ ˜v{:Nñ 6:#½ÐG£Ë¦À®VÄÌać\”ÜŸù¨9,éæ1)Á»o¡,?öøAdnò8æibnK@‘±ZÚ¬ ‡†hñÓ:ÞÓo+e`Ú÷€eÐ2UQ[aýGÃù½MûN=¼¦CèŸ Ê:tfQŠ5~Fì$s€VöùYÅž ä¹mÛcp: ðÚ¶ëÀ•0Š1gÌŒñTæÑ:U>Äcœ¹²ëðPøËÏZˆµéá;‡¹ ·rÂa ¶‹;ôðžùÃʰ•Î!KPXfŽG€Z€™¹RÃ@èÿ4µEùAŠÞVµ1qÐ]àJÔMÌìðÐ6íÚw÷´ŠDwÏIJV[bÞÚ÷ìbpZcèö œo½Æk$…#úTv;Œiˆ=Ô…#ÚÚ îÐkòq"á?ƒ'BCÅÁÌ¡CŸ!,§gÀ|»e²"ØÄƒD‰|çtìçýGY…í)>Æ·•βüúÌ>óGZ0àXív{˜}DçÁÈ›°…úÄ«‘Œ@¸¾½Ü³›a9!/skÛ¹;* Ýèkä†H&ªÚNµë¯{Úø¨×"d´O1F''þÚJßÙðÿØ[{ü>û`†°Cb¿¹µWzÏÀ* ÷Û´Åëñ Z­¬böÉ(´F¹æ±®žÅ<™¶VUXŒ„æ:`°»²›ÇøöÝûâ•!ž °ZðHl5¦u€¼€)Ój=Úuèá3“û çhw­Ö»Emê¶©+ýDÆ0§è…({§îbQ‡†ˆìÑÀȽg  <×^Ë‚ Q"®„1ºa©´Íd9<‹›¨¯,é´ˆÉC+‹âk†ñ8ôÙEœÏZ¸ VE{¾ge> c¥¦'.äV݉aBL^8pRÍçÜm úðfBð#_bg°®úæ #%­>2Ÿ.½ež8…¡Áp™é‰I ܹ×CFå%‡‹[WÚŠF›X7÷qh+܇H†¤ÜÁ0 ö’ & Řû̳ù‰“g-m;vã>ÝF*Ë8“ÕÓwŽÄÃÆ¨ËF‰Kmß±d÷œLTÌŠ´yéê1^™î.zí]Eì?uút§âót8ˆn"˜;I†2L:(ó³Ð®Gã$Úì7Âø‰@¶Tг¤ó/‰ÐS$¡U+º œÐ rêÁQè&†¨ÛGh–Pi¿V±îÞÓr ú€nh4QqæhþlÓ®#6ÐÙº¢¢ËÊ$ò“i@mn¢§ÊƒŒ‹¡n©Â„ÿæÂ ^\ª2áPµo«áÒ›ÊÑ¿ß&FÌ yj"ìëÍwkíþ™ü,E»TL'ôæƒ/ l%Ãða €]ý„´tÇL ω5¾Š¦ÑeÑÆFÎü)¹Út©Ï‹NÚÕ¯ô»»þñð~J®þ”\=ë²tM‚Ážë)( SFÒÖ!¯Åqer‡{Œ;6xòK¹hÉJÛ>â-}êR>ï[?‰vÍî¢Û8תەøíñ_^™÷áÖÁ/fLi¹gÑ€œÄY;&|‘Ôú¶äŽ÷&µ¹}Ûð·¶z!þË«¶|Ïn1„´oÝÄ”^¿ß5«SøÓ#ŠÝ¬Û»|xæÂ~|vØ-T»±Íí _^ŇÍ}¿Í°7¥×ä)y%ÜÚÿ™M]~·oÝ—ÇkÕef.ê¿{n7nãÏôqŸ¤Ì¶/qöæì]6Ôét¸ýùY«Fí˜øe}…y%›»?šðÕ5 _]Üù~ݦùêºqG|úØè’ç‡î¤m©ýþw÷ü^ªƒ®Ü€Óí±÷íž×‹öë6ÎAJ†­+y BÈÞ0¥‰.ŸkÑoY–Ú÷©Ô~Oç$Lß:äUcÚºìõ“6¶½sc›;¾¾!{ÃÔ¬±;'cÙ³å<>ôtŲ/=s~¯½+bv›1}ƒÓélô¶«{¯Á~jˆõÛýõØ2øE„ƒÖ!·¿ lL³ÒÆ|°5æew (t‘vÍì¨#¢˜3S7÷üýæn¶­Fo3öGÓÌ»’wŒÿtïÊØÄ–7óÙ(Ü6ì ýæE®\X…†ík¶ ø³úscû»¬Ù;ëêܽ‰Ñ7gnÎZ=•ΘÖú|Ê-¿,;~ÚÎÉ_Ûô™õ"J˜Ž*:örKš½kvW„¬tXFvj+F<¥Ï“a½ÈGñœn÷Ω-÷,lܾÑ!áí£ÞSÏÚ¾;Çî+<%Û½™ ú¤ýx{ì;˜|B‹ëPãèÚ­F¤½©ëƒi£ÿ¶}Ä;èvÆ´6Y«ãhÃé:åpØäž%1ˆkË ç7v¸'áË«÷,¢µ¡Ô°}õ¦®ì[;>âW{WŒØ5«£y÷æ]ªn_>v)þÄ7÷x4¹Óý¦B –½n’¨ßW âuº—!ȘÚjç”o€¦ô¸ö,dÙ—¦¤MkÁ4LÉåõlè†Ëëß>âíÔ¾â6  ØÔµ9·©¡áOìqïÒ!v«©nø,î½FPF'{ýd Œþ¦þ;êMh­ig•1£Ýî¹=vRë_³ )»çõÔ÷:µr`hÚ½)Ô_43ṁ†­+Ðv*Æ£e‚=nøìö‘ïó,«n÷ùÔáPÉ+±›²“ZÞL¿²×Mt:Òò¹=ð Y«F3èÛ×I}àu{Ô±Jz·uèkûÖŒE˜t%AßtÉó’;ÜmÚ•¬n3e$¦úkâ××'~ó îwyr‘@Gå!´1ïÙ‚~¢Õ»çtMîtVÃ(aPö,qØ­N— mÄ©´™qOhqíÆöwS'€#ò\9jS—¶ SŸ²8ZV<M0g¦ˆu˜²ñbŒ‹1}½ig¢êݞŃœ§ŒÚ³xྵšÖ´uðK)=Oøúú”ÞOfÇO }…FÑΠE¼F‹)cãÖ˜WÒF¾$A6kö4vËÀçºmîžÓíŒoJ¯ÇQ-4u‰Ë×7ð?íÜ=·ûæn1”Ò$›7SZµ.®Ü"L´‘ž"mµ ¯ï‰CIéóG>'iL;¥ã›»?‚»OÛ£³y •s¤¥§,7ÏÞeC„æ»s󀔓¿ÍÞ0&iÚÎH•2#y$Àml{Ãp€hDML„J£«¸~Ó®¨%(Áýá?§_hæ©éª…è8FD³ÜÜ3¶yûð·è)†“ŒQ£·¡HÂg&µbD˜šPu,ˆx‡±]‡…ª@Ãþ@ i9Ð*bYЧH!œ*ã¦nÍi~gŒF§/=mž GR*äÁÎÙ8N. Ùþnz÷ÑÙ…GмôqŸbÛF¼…JÃ]1[p¼<ݦè-†cÍÙÙx yÅ 0"æðíŒOíÿôænÍ5#ÊÂ@è‹ô4ÿ”¨cß!¼¢ÐÁôñŸB±¶ yfÎ=Û‡½!ßö}*'q&¼ekÌ«P¾œ„àb ‰ Jµ]ä«ðÆàŒ€;º ¤1,ñhaÑ®Y5?õ;ô7´mè_6uºØ3T-FŠ´£û¸%î“„–· »ætE»•:Æf­)Ä“oYNG²¥=¿… ]ÂÄÆ†W”†!sG¡èÞ¥1Œˆ"ɘ!°™ûçR pôÈúÁ5ü«%O´0É(>P_ò%üÄ)àR#,Âèð¥mKÅèžÓaCà ©K‰…F!Úí!È^]=B›Y‡jì!ŠÛq^ ¢qûj4¼¿º¶&é¦2¼¶ãöÕgìKyUäIg?%WÏX~J®þ”\=_%ú@«÷N9K¢õŦž·ÉI ÚV:÷¤¿¨s"ÊvÌtMxEíØ¤Ìkîu{NË <ÓÞuÄ>™;ûE‡UêÖú~mèr¹÷rÀâÌ¿[Þ¯k{©ܬ_Ú¸»4mªuÐoóVtj¢y‡K]Å›F% jç6R­/ÕúbžÒ葚‡Kœ¶!)÷i‡ƒûí#þ kó³¢äáÇUÌ7¬í•¿ªKP;m–¦Z×,Ë^mü@IjÜñÚý'-Ù:Á7ïóPm'Ož0÷¾3§ÕEúö?·ôÿMEö*u½Ú™æ›ÿEø–ÑG«ŠìÃÿP°¾¯: åTc\\)Þ<ª|÷j(N‰;`Jp{1t0Öy)U–dÇègìÃ+Û1CÎ( ž¬²n–ãûÜ©ïð?åsJRÇ–¶iôÀ‹ó^Ї¢¤¡ÅÉ#j\éÞéïGs¬Jƒ­Ês ®F…Ü“ßÈó±uðƒ{q3¦¨k«áZÑM4ñFW^ãΰ{Ü2àÞ¦¤ofa .GAÍû¬(iˆ¾ã•ÕÎí'Ou}A´1l{y꯲¦Ø‡ÿ^ýiì~ó¡üº#˜éH­w7*‡Ú»Þ·¼Ãù•ÛSbQòÑÛSWÊ3ø|Å•cUšޗï’ÓOÐä ì“HÎ0ÿÅóÆFð/nI«,›£ŸFÂÞé Fh…}nèÏW˜¼:óºÑªè¸:À=wöÇžiïaMy+:òôÓĬ~bú(…¸œcŸ7÷ý5–ˆb¨oä\¶svį¸_pùáÙ×Ìè Áê<)9S#{%½3õü¥œU}êÌPˆªsäM½n«õïóÍûÂ3íÇÈ?ú|Y”Õ œk°Ÿ¶É!Jó>ÁŒÝ~q¸Ø> –NÑÆá%­ô®%䘘ÃU¥Û&ëZ7ÃØåt¶Sç’„ÔžÚJÓ¦ ‹¡Ó5Ö÷bªÜYeK)LŒ@*S÷›x\ÞÊΡ­ò×ôtO~ÓÜ÷®ÜY–µ÷L/tHP;g(Î_Õ­0q•Ô¸vDË!`®ñ/o}¸Äq~u¸®ƒ` hØŸ¹žµ“† cJRâ,ýîFêN]iuÝ“Rmßêšð²3î¹â”1€³¥ß=(¶ætÖ2dõ)ÍI Œ¾Ýe?T•¿ºÃC&r³a ´ˆ`L±šÃ¥n´—QÆüåpùÊ|,+°¬}ÄŒ '®vl§=(*òQöU’:QËY‹[E„þÓ àBN3ÔŽ!@Ÿ^Ú¬zW?0tPïÁ@Ý?-%º”nŸìù'e&`àþ=‹ë¡`×<ï™ò¶3îYÐì,@>þEß"=F( ãrt`Ë ,ý拏ëzÿ€ñ¥›Õö-GÊ<þ_•¥O+LŒ{güMÿqJ'ú´?ž¯é­Â ÆB;1[ü2T°¾_øY-‡ ­þÅ­L½n§~s¿»¸â›ÿ¥œK¨ =Bƒ!ä-kßĉŠÇîg°þbp¨È*Gm‚Q'VË!†ã_BC,îC7Œ]Q–1‡!Àа>РpÃnÀüÕˆƒ ‡ Lr¢Y‘­Ò°>t’ˆvŒT§Ú\™FrR£%Œ‚vô?ÁҼ局Ÿ&€™ÎÑOS•¢IGʽ¸­Ê¨Ã)@lµÇ@€wÏÔ·ATÑ´<¥-Þ<5ÆG˜zÞšÓö2º tâqH *Z[XÒ:wÎ?èס"[P£F‚3“Þ`dë‰J0ˆ2cJh8¸&Ì ¤Áõâ”Ñ «®Í%4IÎê:\…óR'”… >·Ö—…‹AVùkz„˜æ#GÇ=gêq+G©j}{½ýrg:FƒEƒêHÐ3xýxéÖxg~ vOy -ëð•xG}B(~Y¡3Ö˜æô™`#4^Ë)"ÕNŽÃv ²4’+YË*²W “Û°Çý‹¿åfhaè)jË_ÕÜPÆ~®Z!¡¢M±rà`çØÀþ=‹êxò$ÄÐñÊ’­ã,u´V{8Æ9góhï¬åüz9Ъ™æã‚àzŽ…¢ úv— ¿ å·±/è;^Õ¨?\ì,m+gÆMyóäÉã¤Î•sÜ6ô—£—¶…Ï& ,ß=È‚|‚Ø<¢Ê–ڈѪ”N%ƨCí)ä7XÖV‚DcB7ÓBàAÜCá3#‚Þº'¾^-Ô½µÆ<„¦¡‡ïí/GÁ¬ƒ8y.ZÁ¾#Ÿ’ãAWwC24MC?Õ¨0Ɉ£E¡d8,ÌŠ`‡þ#o½3þJláGìôN;çh F~ EN)ZßO&†´¡ÊrÞM˺£O©9c›q˜›¡ó5ÈŠ˜0#ªä­êÊHÁÿñªõjv¤–á`|å@IÍA«B³q=røé¨§P úBdA—;÷Ó‚ ýj}ûN+@c¢Àf÷g-å‰ôNNö±dáÔÔaÄA!„ÅÈá€9¸’³² ÎÎÐõzßüÏÏØÙ=ZÙÄóÍý¬tëDÏÔwP´Æ»[3Ÿƒjµ»š~hiDa,PfbOæ€1ž&ÑSÊ Oa"8°gê»¶˜‡ FoXŸ†0‡ÐyÐÇ–#·&¾ÎW€ayÆlHZ¨Ò5î%¬Öu¸Jw ,4*„ãµåÎ1&èÀu¢ 6~ çNð¥ëÆar¢ŸnB}£4³`]_¢Nux%Î…nç4 áåXu)O õöã5Ž }LXX "ì®Ú¶ådjZyM»q ¦·0‚Æ.× ( †¾1кÖc)¤PUȧ¯Œ \Eàl880ˆ§x2º:â™!ãøêëàÿÃ䪖ð´íq/+>~âûï×TÄ­ØõFJ‘éð?¿ÿþŸ¹ž÷§ÕÝùÐ\Ó ÿáƒÒË“@ í¼ºäç#ó­KŠŸüþ»£‡ªWìð;Δ\udyV—;úÝ÷'U-ܘùp•LÜñ·Ýå¶Ú`g[í®÷§ÿ§ÅõSrõÇ*$W=»ðVðI8³ø¬Pruò›„ A-¹êžü†b}G*öáç´ºomÃóN¯xSìK2ŒÝØõzœ•ðÚ ï‚ ç¡ã Op\̓xHrUËɨä*ÞÞÈÅPèÚàþí k§6;¥mZœ‹+¡ øe• %W÷ëãm1ÍUr•Ž–l˜;ë£PmTBËéœß6ô‘Jý:uß¿ ”,tç±ÚýDa‘ÉÕR ”eÌÆaA AN|%à<Ž`µkDË>ôQ°JÅÔ¸w‚íÄŒ†Nרä*ñfx¨ûï+G+EIC‹càÎÑÏœ.KÖ0¹ê5t¼Ša"Œ‚ºÀŸ«,›Ž©$W!®ÔQ’«a§¥‡ ôgdxÄHÆÚŸµŒ–@ F$¹êØF„#â†ð„-ì”ßuª?Ó« +Á27à+ÝoÊ_ÓýüÊMÚ>XÞÁý{—ø~CSK¶M ©zYÚ4Buv-Á‚¦Th]§J®0o¤§PP«`cÉU”ãE9%Ìiw™3îùèªh€F~‡2˜v¢÷pióÉ"èԄ–\}z†í@8µÔÖ%¡äªœ² †4¤šA¡÷ó‹’†…Ÿ3þ¯PÂÒÿ7%[Ƶóµ Ý“^GÙ @¡îÑr’w˜´7DÐÑÚܽÞYÙcŸ€%MăêØÙc5å%[Æ:]E÷%¹Ú5”\}±PÄe(Ý$¬>q¤»“äêÄWù £ˆP{9ývËX¸õ,Ú; rhÂ`‰¼ÖöÆxi*à’-qŠgÚ»p3ïÌ—ˆÂ;Ës±z®Qm㦠w¤„Z ýùÕáð¡3Ñ:âD¼ƒ4‰Ø_K®ÞJ®n îsðθ犒cÑjîD±[â;-5$ž‹ –õí.C¯¨?oyGI®¦Ô'WåžÙ¶eíCÉUyÁ×þ c[I‘#å¹Zrõ ñ¹¨"¼ÖJ¤ ÅEPÀ)ÏÅm1âHD‹[i9êQ#MN.þ{‚}BiÕ;ì%ćaÎ’\Ý1³ ¡IbmÈÃèÊ@,ž\…í£c’8šðjaâÙÆ’\ô:Á9æY`Í¿¨%A:ÓY¼Ãàæ¸Å0¸ž„„®íum/ñ†9Mͦ&"Éððö’« –d¡EE›bU×;zÌ؇H”BzÝÆzæ¢Ñk,¨‰ä*žZK®^Èà%‘ã×ûÝ#ZªñœðrÀ°T´{\Ò§­.$˜r ¢Q9I …D$Wå@jofèõM(¹ÊWÀœŠÑTïÑpy¾ùŸ£*Þéïsõó,t$QÉUTˆVì[Ñ6Aàõ}‘<¶¬Ò‰Õö-·+ÖÑëv9ì~ß I®ö¸C³Å<¤¡,}†ö¦c0W¨áXm9ãHJ®r%mOÏÔ·…ò]óêž<‰½0(Œ á/tê’«=‰/Àab†Î×ÌÓŸ<~„÷ÞfâÐ*ûy‘Úê" óHY]¶“!€#á0yc×ÙjWº{Ò_ˆFÁ$ŒþŸºÓš¿º‡wÆß©>ò¸ƒù†z3Ù·Ü=ù/¸~~ Ñw:ˆBý [¨äv„¦ùæ~¶?k©oa ™0ë#Ü4‰^óh×ø—j<’±Aª  fN y˜š9Ç<ãû|þÚ^|† ‡’«e;fà5äýÝö)ÁSÉUÆÑ<›ŒÙ‰#µ¸?ivòø$Öî"¡P;ìiŸ8v ÇújýÙ`~ x®%Wýº÷¤­›©÷VÚ蓈·ûM¨’¡ xØægÇU6 胾ÃÐ Š©—à^ÁºÞè’°ú^·#Еz0 „†²¡ZS¢'¡Œ"È ýÀN•è&X„!#+í•î¥ [èé¾_)âÊÍ*¹Ê „ž4ÁÊ‚ÀòöØ £€VSúƒÓÄfÑ@ïY'WÁmרÌ}îDz´(Ú8´Êº o{@{Ãrdac!ÉUº¬ÎX?V]ÊEîtÄþ[Î_Õ-oEg¬Tß¿o¹WÄØ ¹*^~C?l-X—\ý«5¦¹J®VêÖF$r-žéïÃÖPøcížò&ñ‘ze^0P ½’¨õç¯é‰£Áfªþ$¹:èwrd|ìQ|1N —„ƒZª кÙ:ð·°STdÈ$ËdÞƒV@OaE%H…OäLŒàOc—ëpg3F¡’¿ª+-ôÍÿ²lçL”ÊØåz,W½Z’䪖«·5žT¬kÌá*˜!wÂ.Z¥1QÔú÷)óúM{7üf<¯¥ÿ½H8Ê_Óƒ˜Â=é ¶!ôL}‡Ç•íœÛä‡|F …¿ÅG@?LÝoŽpL(ÕþÝóBæ“ǤéÂ’«÷ ES¨•@Cy¿¦“«88Lõ°†êÑÏ‚/CÏñS ?0uÁ¹zP 06Ó)à›’cî Ðæüÿ©`Ë;äÎúPKn‘€LòI›vNÚ U•¢ÂñB° ÉÕÞwÀí›hÄ»H›{Ôf‡r3¡¢L;]rµÔíõÔ¡|#œÒË$ˆ¨.ÁuMS‚aÉÕ K*áLÉ–ñŠˆâññ¤¡Ú`³ønõö¾š¿TãΠEèNÈ37D$WñÔÊÉBNôí/· }©Šö.9#H—AojæA2“3x²6Œó8ÙÉ*ëûrÛ N5E‰ú0'!X˜g£·5–\½0°ø[ˆ“A‹Ð,µº–8½³>ðL}÷4ÉÕH/ =†¶™ûÝÍx1F… +õë$¹:ç è(üî³JNzƒAˆžN}&RMŒK£QA‰”ךzß^°¾‘¤îù-؈„£þ÷P‘U],I‰#ÌA±ÕŸ¥Û&ñ+ Ðù船-µ÷ÑÃrç~ŒJ®B,¡Ùüi çu|zcê%W?(Óœfž\%D%¬S3R"4 $ 2v»Ñ3åmIm…%W,ñu(jT·Ú±ýhÅùSPBßî2Æ=(tººdÛd¬^&ÚÍú8½N¤[ÆÑw@LK:ÝZíØ ¸Kpf¢HŽÂ+$@èŠAѪ2t¾V’“Á“® ¯XÜ FA‰/¬Š¬e'ŽÖò?!²b¼Žì÷E¨ý±šRBc‚#¸:L$ßáJ `ÅH ƒÕ†ã*ÿ¢oë“«Ë;„?´ëTÞÙòÝó\È6Fĸ+¶]P0ˆjÕy/ÈJצÁûc¢Š¦‹c %B'¢QóÁC-¹Ú?Dba¡´ y"IšûÞU¡[ãóL•-ÁVÙRÕ{*Ë&ßü/¬ƒ`‰ˆ!Ã8ÂêâÍ£ªªŠ`ák@iI®fÌÅd¬ƒ§ï|J­€‡(3¢@æüá3^ˆÔªÒâÆ”ßb8αϣÆ}DÎöá æ*ŒPmßXÜ _ÙÞ¿g±J³ä­èšr øhó›z§V–1APB¤î#!äp~Œ=dAg,’\ü2/Iƒ¶x¦¿‡l f% ØõÖA¿ýaóCÝ<˜§÷/nE¨HåÆn¿ œ ¿§tû”¼U]B0<·äj!" e«¨J¥ TÑð g÷ÈþÌ…Æî7ÒDÖD‚QÉÕÓzX”“xýÄXpZrõn,º‘äª1Îò,ŒZ¢ËÖͰMý¡w¨Úëˆ}Rô9”\-²*‡"oŽ×%v´äjg`„‹¸cß¼ÏdqÍ~yá’;û#")jC€ÜÂØbšÛ†<IP†ÃO$·–iWµ×&lûžÂXÜ_GIÊÒ¦ªw ´Ä3í="ÄGñ™ÆÓ •*¤Ùòîf]o”-mO‚D¬É¿ð›úäjM™¤¦¿†¨ÕIR‚'Alâc|øZºäj[EÙÎÙ3SÏÛ”ÓôÍýL£mõRŦ4Wõ'™¿¼Cƒäjr¬gêÛ褱ëõrµS’«´gæãsÕØ,àà÷’®õÅò’½ÍÏæ…%W³–á÷!BòÎ¥v?íd¼ÐÏ´÷Õû…HM«ÈCt Pfûˆß»4îŠÒ–g.cz5Ž>š{ßÉ=’dËYE d„¡ÙÐT1¤®0I„'WÕ”óPåŒÊÏ kóЇ}ÓA™À™1[hæÐ(ÀPßá îad‹7Ž£ ë%mÐtç›ûi]rµÍϧÅ/ˆ¢Ž~€ÂÓùæ}¡Âë9ãž;]r¾D ¯AÐç¢äá(mýEп°ŠWãÞY—\]ݽlÇ fŽ‘BÙhÝäµ¹™¡×"G´5®Ê(Йa¾¢#…¦êÛ]Ž„ž.«Þ:_ k•<ÿêîkzbÎ?|–rø {&¿‰ùð+´…‘ÂGÛGÁfdruæß!ðA çxgü½2gMP£I8h‚€ÚÒ÷×Î1Zr@'ütN’««º*2\ÈÆ½ÖxêRgøA!+ÙOß<±Œš{FX'ɉ)$¹Z}†ä*ÍÀÓ…’«ôEâˆ-‚uÉÕ­ëGpeàDJÓ§)‡Õ ¹ † hÑ(÷¸Æ½H´¥¾:v ¨Æ•~t ôÜÆ“«ûýÅ›FA!TrÕÜë6™ÁÛë¶&æÕü€BQ¾k´¹@æQô•5_Åvž" zÜÂW´®Ûä2‡óV?oUW"JXÆ´ƒÑqkƒäj™WsIf£[Q txÄÔˆ:õSéÍP‘þeDÑJÝZ(Ô¶I0¿=`N–äêìðt0pø ÜpAð€šû®¶ô»+zm<MþÖ­¨äjùîyèp(¹ŠUÐ…æ_G×k…(BÞˆ7áu(0*¹Šôdêæ©•Ú&ððèªTr•¨[& O®€ó ˆ|x°>¹:O’«Ó߇0ˆÙ&×MŸÉ+LšORŸ\­.–l^ÛKý‹[å´¾HͰݟµL’«›GG'WKÛæÎù°¥ °¯ðΪä*74‘\mƒ,I}4 ©ÎolažÈ°Ú–ªR1*¹J×覤ú»\G;áëú֥΂AT  ,k‡QK~»ï¯1ûð?`’(R•e“ Ìù€Lˆþx¬5”\¥òÿ<`ˆwO|GËÜV–1_@Ä­ïy‡©Ï¯<È H˜`A2Ü)´¶7ãõEáÁ1SÏÛˆÔðbDú}Ä}Ð*Ç.ôÀâVŒ –X¾s–2%* mqöÉUc÷›ˆR-òbh]è+BWÚɈ{güõ“«o–¤Æ NyKV¸#y-“O§gÌá ®sÜ €*Îm¬È^Uº}²¥ß=ËO6”¦M u?x.ÉUMò#ê×Yg. Ÿ3†/ÃÇIruï4K”59õóʰVI®Fe#ëk¨,À@ôí.Ç9¬í Á0ö¸%ÚC)Ms{É2ð~¢!â_Ô”`tÔÔ,œ8´ýgN%W»ßt¤"=‡mä‡Ðº†w³ {:¡f³ã’ ]®×ÞãtÑ C¬ƒ° ¼‘*BròØ!Ïô÷diÆ’«Œ)°ƒªïß³(oY;!*ã_–É{#þ>D2¸åŽQÿ«–¨äjþš3p› KÌ_ÝCÒja¸ ê}s?ÅLê×õŸ!ÛI-lQ–>=b2 óÆˆ—Ú(-f…c†„B¨I«Æ“«)cè—š¾Ž½ðC:¨æЧ;›äêœOB¦ ŒØeêõÑÛdq£¯Mán\Å=¡?²¶" X Ö˜æˆ”;VS*{‹õº‘5È!d¨@6l1Í¡£²áÀ†þ„i$WÆ_# µîÁ*ò†ûlÆ(TÐ4LÃ7ÿËŠì•Àœ•>•\­á‰ºv—0M/Ì9qôŒT÷›"B̡ƽ+bK%ž™ñ/øŠ'‚¢h „–.W;·£ºHØ3í= ²`}?¬ƒ>ÒGì“á»(¨íé ¯ ípR× •\íð?PÄ g±A^2È”g.’=ÓfL=@ÚMBÞzlÞèÜ$ÇÌè:rRÃ鶃;\⺵¤5Ô¨dËXJæ>Mz=¨½8€Ò Û²»è}‡šÐhrDÕ«Û€\*9?ÉÕµ½Â_áEŽÝ±Cå~{9c9VSzkÑó´qXDŽòùTrO¡Æ"TBÉUT ÁÊëž~w!@çè§Á(@–ˆò”gÌ ÿÁQµd§Oh;N¼¢ïx½ªÈY­E ’«¸¼ƒþ}ѳYβüàäêE}ãÿKËÀí1ÿܳzs3íÏŸOöNîwˆú6马c‡\{¯é՜š“åo 9õ«˜=É'N®›·‘ëUÇJ^©»Þl¤1ûäÁ¾ã/ê—Ò¢à»ú]WF=+kmJ³º+ßp+ô»n9m%I÷-÷$©8v¢êȉê“ßÀýÈÀÿ´ÄNS~J®žßÒhr`)Ù:þtÉU‚DßÜÏNe% òÔà ¤¢dÛÄCÅz]rµï]|VdøH)xþ¤¶[ˆÔ)ÉÕî7SUÍã¹Bò5¦JÌ×Êó1Î+bBK¨Àc]cŸÓÞ?èφ®« ¾Ž( º!ܨK®J›ß´%MªòåÀ“O“\BKqˆŠÀÐÇæ¤ÐW¡éª¨ä*LXmð¨ Ô…Ø×Oì€Öw¸B×öRxc„‡ý—KFÔyËÚËþ Á —9uý³?s‘´S÷±ÎBÖµ%£{—ZúÝMô 燬†oÔl˜\=\êQ±€Z8\¶sVhNKÝ gH®FzáJÝZ‚&IPèÖÊTÀøø,I®ÎúHÂj-¹ŠòàCÕ¦já…Ûà$ÇT­ã࢓«ÄV°š·$ë’«sˆCÉUˆeñæ1!ù)#8-ut g“\E+`kôHņØ#D+ºª&’« ™Ñ·Ñ;|=Pg ö;ç¸7C¬¦ ‡ýï–!q:ª…pà̘<ÒË_Ó“fhÔWí<,Þë÷‚š$@÷⣟a,÷n诺F$NO­ï‡I†'W¡ñàdQb ”»Æ›I¯ƒý#Æ„NŸ.¹z´ªˆÐF’«‹¾AJæ^·Ù‡=VºmRyæ™è¾}Ь¶nÝÌØã–ÜÙÿáŒá7T(›¦Ž{‰°Â¿°ExgUrÕ3åmbHõé’«p´ìÊ›³:”\E틇”eDnæ\_é䪱ë/øp(ß„Õ7z'šæŒ{/àžò–6ïèj0‡æ-ªKEΪ‚ ýÄ3'WÍO| (Z°¾A=x«&­åÎþÕõLOͱ,Xß0÷º•;5=)({ú~ºž{h%”\µz{qŽ}^æL.øJ-¥×µ¹ÄØíF>”\uŽ~&*¹zg}ruMOn®K®jËQaeáÉU-îÛNeZþ‘êúÁÒfà»ÝDUhˆ‡¯9¤-ÈÅ)ðUxšèøájÙ~á×XŽ;”\Å6%'9ïsZnèr¼ 5& j–ÐR6î8õR›Ñ—{Ý©¢Ït3<¹Š}q3âeÔN?¬’«@ «ïxeôÎôÔ3õ*sº* ¯ÜWœǸȬ­¡8ãžU{/×'WÇüY­…QÉUäV²mÊ_–> ~[·Óò†þ@tDr•žÊêlmÍÔé JwEDjÕý{–hk=š1úˆ+ìÝz}ûËýKZ)2̇Šl'W»\§§XЬ:x¿äÓsC•-UãCõí¯BDÞìä‰ò]ó0 ”ÚÆÐÓ” /Fè$W-ÉŒ¯¼UYÜJK®^ :ǽhìzƒZÝF y+»¨W®²éʞŦ·†fÜÕ%W·‚G'Wù6wîgå³ù}ÁÊà0ŒTãk¯‚'‘5æAm9­$ä%îˆ}òœ’«µ¹{d­Dï;$™ÿE¥~­0¢V»\_ÈÆØÑºðWEAåâMI¨DlÔ¦ù!UH>ŽÄ£5š\ÅZQµ7$“Q†²ªä*ÐAt-ˆNU ½‚_à÷ÎÓN”x¿Ê¸bS§’« ïqèÊ€«ŠXû,ÉUyÁw³$W«Ktí.E nµ3½éƦáþ`/( ð‹†¨(õ3°kþzHtF¨( I²¾gS$¹Úïn<;š¦Áqg`I«ºäêájm›šKq”ADT ªi„‘!€„v‘[×B¨@Ñ‚5=1¾…xg}XíLC\ò¬9ŸÐ#=µ…3ah¡Íä)He@7BÇv„Tý€)Ê£÷¥áY… ƒµäê}òraò›¾ùŸJØ‚J¬­²Õc¨âœó•®Ó5M'WÑ:{욬þO~÷g.ÄO%W!Š8V×ÄW¡ M$W]_#꯲¥ 0yË;üÉU =þMó[;]@»¢çnÕxvãPÐð#e¹G÷ˆ#dÉLÃÝBªª«=ú4°‘±ÆcòË*­ŽWqx&¿áõ´s̳XnDr§Yeß*;hÉU,ÎÐåZ@ã€%YÎ|i˜\•}‡À‡&_v4Q~prõ‚¾ñÿ¥eàöÁZrõ"íÏË´äê;CÔ·IÔ’«WÉu·ÿŸµÝÇ&ª_5‹³˜þy$nJ"÷ûOø"6A]¿t¢Ëûσ}Æ%^Ð/å+-¹zEä³¾ÏÛ™~™ú³ÿ–N%ÿôlÛ~õi*ùYœÕ<2sÉÖÿéÏõ„[×8~ÀýÐÀÿ´ÄNS~J®žßÒhrUÖ¯íœmêu»rÍŠqÇDêm µ£££n>q¤V«Ê"¦kà±01B å…²ö»§(a$Wcš¿ö¡Êi2Ú d,bþUD!®Ä]ª-²…O®í €C/Õ¢¡èû”{A'á''ŽI¢,æ!I®®êJ“ä$”éï«UÏ*!lKš\“o!¬(•m£’«rö„O%W ‚ò–·oôŒ˜ÐÍÄòp‰£a/¸ = ™x.®ëÛ]&3üµ­ÞäùDYú=â ÿÂo´™’î†rÀëµÂDø >±(yžºlç,¨‹l¯”åˆxÑÖ0¹ê†U ¡^¥éÓ^"<¸$WgŒ¿‹L®®ë­­‹œ‘K— 3Uj—ÏpïZïnaD3?Ð&.^A„H …r¢¿ö­=]réžøZøéÿ¦Bˆç_ܲtëDKß»B{ï”lJÚÐ;$C„…ÎG×·²sQÒÉP y’Ll$¹úOØsÌ3*64÷¾=z¿ ¶Ý5þåZo&¬U’«ëz£Õ×iCôþê°”CùF”зàK•àNRý[‹Äûí.ƒÏH›k÷ç­êZ¼i”E›˜¡â>B°âä²Ç‘6STMͲ{\Ë‹~^˜4$”\•Yè)c¬ƒY—³>ä•Áº ¥‹c¾¨MÅP|¨q¥K%ó¿ä«F’« eËÄ6—€œVÎÑÏÀÆ ¸ÊvL/LT¶svѦ‘ð^t¥Z¥el ”’\þ¸sìóàXĤFhp‡ÿ1tº |®=ÍYr²j¸ë §›ù^ ÕÔó60_ˆ½Ör™‹›08MOÉNÇ=‡üVä¯î‹®K®Ö”&HB;ap`y{×ø—´äêë€{eA*sÖ¨¥—U–Mëû•ïž_¾{ž#ö¸8?(œCü“¨‡øÚ1RK®,[ÆcAr%{[þ¶éDë¸4aâ¶€èÃ%ЛX•§WèÖ çÚܽ ½:ÊAN>Šz™"Gi´¿B×ö†X¶G^ÐB’«™ µY—²TÓ7÷ÓÐÆ g“\%'² ¸+Ó’«B_.¶ìƒu„“*ás6ÄÃ0ËvÌ”í¯‘yLs™~ÙòBn¨ÕE<"bK̳,žiïßUÛRqÄ•úuó ùàð†þMÿê’«5¥%©q¡ä*QsøìGô]’]Œ ÀKaü s¯ÛÑüã§NÉd µõìM&WWv&öA²ø=1žÓèZrõY9ÅoÖGÆn7¡êŒ!™>û#ÂOz-ÓŒûß{6ÉÕ²ôiþE_+:^‰ýª—°h d&wî'%[Æ‚¨À»©ç/1O4!”‰Â(øUý }­Hru•$W1y<¬sÌŸ ×÷—Ì}~e‹iŽééÛ]Îg0Jâ»– T:Q³Ì…˜¶fìz½ñ·ÑÉU€®`moÐ/"¹ZeNF’\=–\­.I¸XÖÍ×µi†WUYÓÀ²öŒTøÄY;°yŒì~‡@B›Jr5i¨a Ä‚!ËžBÆxI®jÊÖ觨&­-Ý>\•äªìUâOÖ LÐÖäÞèý´$IäȧÉÀµ,km{©ÚÆ*T *ø,*áÿ“'ŽâÓùañæÑôH\ÀðßótõNS’«}îDz¢uæ$K´ yD;Im®cÌ3eéÓU[[$ÕB•\uø}ãk”èÊ>~G$`ßï/ß5W’«Ú\Pª…µÊIg+;WhÓnQ‰ÊœÕ2Ynî§5žŒÀÒ¶pé#ežÀ’Vj€°äêE¨«J®B¨pý B&¨,nU‘³šñåq2›´"/BcO?¬mß}k¡fÔ ½Zœ">ô`>#Ú)ž}Þç*¹ ùij0^Œ]PÛãEŽþ‘ŒÁqÁÞá²qqˆª…’«²mK[ÅÍMo°8½à¡jrlÁ†8¦zº­dòü€û¸,hMϸj@ÂSß5ûþûƒ}&$]0 õ«‚ïªL{®œtÙ©ÒLžõý÷GË:NÛtñ€÷®), Öô›”tºJ.ìòkºŒO¢1 ß5¢Lf®ÊCÿãBk¬œ.¹zNåÿWrõ¸gÂC?»g ùHÄõ“û÷LúüÉ[/½à‚ šýâáF¥•5²I£ÉUXÎÇ'ÛiÉUp ¸SaNyæÀ-ôÊ-Tuí.“|Zút8°,pÓÖgÉ|€Í£ÔL@ñN_À ••svfþ½‰ÞáÈŠ‡@bƒ“'—] ;\qúäj®k«²̉cÕÎtbgâ\µ¦©Ê¾EÖVhg8†’«KsÕQªkáÉUXå¡"›LËoyAqr,Î(b @D¡k‰ðÕCH ZèŒ{¾ßüUß_G¯Pû „–àˆQPñ2ÁOA°@úœ\•#Ú“Gðè’­ãerTÊß¼/pIƒµ¿¢"7{sñæ‘ÈGK®Êù°}XÄ¡b{x4Ô]‚ãrœW°¾oôúˆòÝ çZru%Q6äœð­Ö·F„ˆPd‚s$pŽ&è‘ïé’«5î Túýï–$¬¬LŽe(CÛC#KÓ§…örF=÷~D¨2k“¸dî+‘‚zÇ\•#wµÓ¬ä„—âOUjöB¨å™ò6’9$üªÆÀå¸[m¡{ÊÛU¶-?‘ä*,²Áäå€×QOц=¹:^ßþr ôÝâÖà†D…j ¾ÔDkÙŸ0~ œãÙÿ7_È1²Íˆ‹SF´ù ?‡ŽHVgÄ2¡´ûM—-¹z3rßZÎÅÎÝ %Ø‘=W£“«Ú‚Gn…ˆv±è¤½Òvi[T’GË/"‘gºšøÐ*uÞ” 7¼³•9kÔ±\ê\׈½5BÅ;ão†NWI!jÂù*Äè1ΡSù'ÉÕÕ݉hÐj¢Œã‡ª Öõ®K®V—¢H˜'ÌSÒ,cþ,ÿe.´ô½‹TÎ>Û·\Yºlô±¡•eÌ_NÓÎZ¦xr ÍÅ•½ãˆe†=®-ѽ•¬v¥ÃZº¥úD¨;£žh‚wUì@IÌ}ï*”“ø6ÓŒÏ.†^í C˜L`ÑG´š~zg}È p™º#gŽ% öÎúPãáu¦tVÉÕ½‹‰ëÝ“¤¨h¥Þ”*òœcžÁâŽV"°±‰Rëͤƒåsª];#ž´ôý5‘ :ØÎ>âĤ%õGÖžCÑZH˜·¢c¥a>˜=c€|ÉÕÚòÒí“•#ŠCÚ±q¡o‰ed“äOTÙR±-›qyø0gL®‚ox 5’z4M»§Ñ;y:cîó+IÑ÷ºÍÔó6Ù:¯óµ F’lëûáãdnÉY$Wqˆ¨1™œs7áU¥«’“×N¢$¦UˆTμè|­}Øc¡ùæ~FÍ9ÈFm~fìv#(‡ö#žÉo§[úß+éÖ£ùrL›F<¤šÂ„‡%,åfžâ_ø ¦š;û#™Šy*¹*G®ëƒ|&WWd¯ÀÑáð¹:²õ¦X®û´@ÃM×ø—UŒ¾Hr5,F¦Í² a }É_ÕXSÙ6†¬0QŽrM|M’«ëz0lÀ¬$áÙõÇè§«¬u\ânÊÒ§kŠ6S›·È¢˜S¬€P—¡DÃUÊ K)KŸfètµØúâˆä*j ç»u¿¹Ú™\c°êÀ2YiŒÇ[¹Æ½¤:쨗q¶¡0”5îk{ËÙŽ‹¾USëe^÷›êޱ[Õz ãµ}2ÄY%WY¹Hd­c|U¶ctП †€Šø:ReOµ ‘‰tÉTdËZ'™ºw‰LužönYÆl™/—6 œ¿²‹–ÕI×¶‹ì Í¼ER#ÉÁk¤%)c*²––¶ÜSÞ<`N6v¹þh”ÆÊÚê­e9†šRxòþˆ6 IÅÏú(°¤U¥~õ`ÞY¡ˆ7wîgÐØò©äê4‰l©xIœ#jÏx…f£AÎý ¾’×—ñ€#(·7ìhõ dæÛ1ÐThìú 9”Ó˜€®FŸÖT‡-º5è?õ (9:€žSrU2ñÚ”¼ÆZÓsp}Á=é êTc2ËÌ՜Èí˜êöA•­S/¤αÏ[‡<¤–öD$W‚B—Šä]^‘³½Z]X.sá*ÏfQ¼Ñ΃`ôQÚ#å¾ÒíS|ó>k8”šoYwƒCxgå"æÝÉɉï7t¼’ÿñÝ:mBˆä{£6}ŠUŸ}øã¸°“'Žkçêv©(öG'W«¬)y+;kÇ2Æ.q”ïž'cØá>gSÀÁÒN¾hmªùÒ˜¤A8¡SDOWÜ^c”Õ¦Ogµ¼½Mª²yà•LoÖ­U. °¿‚cÈ;ޤ¡X´:–´™šå]¤nMD.ä9ThE¢·´=VSŽá0¾@M¥àá‡Ø V”©Éäê7ºN×Âêåýòü/¥‚DêDLÌÐåzFþº^uú ¢‡Kœ„ÿÎÑOƒ$P\¤Š‰i¸—ÔÉà `JíÅMÇqU 迲`ÿp±F’DªV«äêº>g³{ƹmÕ'ÎÖ¾5¨yYE8øA†˜ðV%W߈Äõ©äê—X ¦§öªU‡¶Èž„‹¾@ç"¸7Øx@ÛJW› ÿlÝ!V^À\Õ8YñîpõmòŸ$¹šuµöÕ¥qûb݇j¿£—'½ïûc7ª.¯›’w¤¨²VWX¹t‡Ï<ØwâÆ ¦¶(ˆÍ±™ó2x–!Í6«àè¡~â`夕Û.k¢’A)/§ï÷>ê*©Úë+’Qsü€çá˜ÿ´ÄNS~J®6Dƒ£%9s>¼ù‚ ¢’«Çüs^¾ü‚Kù*vîÒyq­Ÿ¸â‚Ÿ=5Þq,²†F“« ÖC¼$W -ÑóÏ%¹ŠksÕy%I$ÌýT¢é6Íê²3Õö†ÐN×ÄWÕ\V5¥ ’sõƒÚt&yA3í=E/‰­²¥à¶ªí[d®˜‡$eTæ•sŽ&¼â)g¦‡’«‡* iK¥/&Wã•ÔÛaéÔéÑ^•è䪆–‰¶aå¯íU—\mu¡eÀ}áK>ÏK‘rbÿå®ÛÐ>´ ¸W’Cù‘“«Œ:ù¿J0vÈ\Þ»5ô&û+*ìÉSì±OÈòÀ"›¾Ýeæ^·Wf¯"8ư6T¹ÃeØ©I«ÈäªÆ£ÕZŽw&š¨ÈZ†@ 7ôÇïÈpvj¾ê¤ÚW£OT‡ršAã×”[dû8kä ¹{i øwK²2gµœ:?èž8hÖrTT½sVHÇäž¹Ÿ¬ëK¿¢k ”äꎙt¤©äª¼ž~I^a{œÞ5º*„¨½?/˯’GHf¬¶˜­kì |[ëÙ-¹¾Å- ]®CñgsŒ~†çªŽðP É€9¸HzŠÎHÎ3g.ƒ‘5ŸÒyЧÛ2OZ—\-´È1âcÙ]jÃê7¢f†O!Y¯]ó4›}TÛíÿQx‹ÚCXº¿{ÖÁ—KRâlCÅdûîÄ!8ÙJÝZ´:UW"qüj Rgý9jòsÉÖ Ü“·¼#h,›rM®b€@MýÌöàIyÏ» ŠÀ¢fȪ"{e`Y[{ì“Jy0”jöòÙ¦uÛ$š}ÀœÄÓQN}ûŸ¶aÓó‚¾ù_j§=JR]öŸõQxÔ.jê²Fª%kzºS&ñ ¿ Ì7X?pÎÉU톆žX?È8F>%«„Ä“'JÓ§3â$8R]©_ñR[æ¾vº+ Û‡pÔC値†Bf dëyiާ¦Áù«»ˆÇlâ(Ÿp-ï Ǹ·¼CC2Xåþ¬¥€e¦ñÜÏ€ŽPrUvT^×GßñJÙZ|×܈ä*|R6£h}1Œ:^ÉÀÑ£hžQŽ(€«Èù¤Á BC ÷¸<ú²UØ{7@›f£…Úr´7±DúŒB…š·ê ¸œ¼ŽÑv¡;ˆZðyUWEš(¹³>Þñ’g|bþÊ.pŒTa{­?܆à =n¡ (0ßÊ2%-Òd½¬×–c‡*ö-?½Ë}0ÈØÉÖ»Q^Ê]œ«’« ’ì¥BN{‡QSw6\Õwý…œîó¼o,¬½-„A]um/Õ6uÿ"b1}úppBõèä*ÞY–¬v¾«G,2ÉjÀ½ÿÊži01I®.ïÐÄ«Xoþùkzž÷3­p%‡ ̘¡,-i¨?<ÈŬƒ~KH{¤Ô-»œmÑNI®ælóÍý,§õEbž­.”5þ¯±»*û–#åüek#ݸ ¼Ô9ú•\å"Ò3]¶+‘õkÿéäj3™·ùSùÿ\~J®Ö—Ú´/n¸ î_drõ°®ç¯.¸ìåÅ…ÊSŸ,ÝðþUÜÔjW$?Ùït¹ þ+ÈÏËÍXièñK¿a{Aaä?Oòû¬/|Y‰êÏ|¿Ç:õCBi”v'Ž)ð{]k™†þÁ÷²±ß½îø‘9­›™†=‘ï±ZÆ¿¡ïrƒgýЂ\›kU]»Ë,c_-äÊ3ÙÔ0lãé¡gù2×9—uólž*­Ê ø,{)†>wy’'å{íQM+̳eYÇÿ%7}QAž?wÇËä÷Ì£žu­ê0ïÊM_lþ¤uÜ«Òf¯Ý2楬±>—ÕûŒgÓîçºkýPëÄ·O !àÏJÐuÝfÜIãòsÑ ÿgþ¤sEï<§¡^Œy¾Ü]«}~í˜ßZ×õ&ât]Ï;Œ1y·/hºªsýGOMC·Œ~á«+Æ¿µÏkiŠyÔ³iòù}Öÿ!móÈgœK:ºßâXØÖ4ðw–Øgò]¦Ð n“=kë¾=P0ûìÏýú­Ù0à·¨\Àž­"ü_ÀšiŸõ¹}î×yá×˺;wÌóX"îw¯îXÔÞÐóvÏúa®åÝi 5ø÷%['½k‰{IY$ŽñïKB9C:úçÏÞdŽ}:`Lϳì2z8`Úyƒu¯sã$OÆêIFgñÏ»u¶mêߋںßêÝ8Ö>êé‚\§mêß=Çç¹ë„éÝ6Ï:åoŽyߢóÑ5 çòî„ÑÆ>wë{ÜæXÃEÌyoV–?Ý–»k•yôó’òxÀœÑhcòsíÎ%],ã^Ë×ïs¹Vö¡þ|Å÷²yÈcWÄOòœ:C¯;‘¤wßf¯>Í2á-}çë]kŸáœå?׺!ºv?7ëûÓæ™ûýÆ›:3à4‡ü>wë,Ì3ßcÆfmÓ>Dium/Ã6Ñ C7Lõ"ûì/Ýë‡ÑGÓ æèžoo¼kutF…ê„'y°N|G×þ çÒnáp„¢úÍ»rÚüÌ>ï[à+Ïšé˜ý…{]ŒÍl0[D])ûì/r‡<êÚ0Ü:Ó6ûKךHÕ¹´«wû|0S×ñj0ÓðlWðʳ&½k_ÒÕ2ósóè€MÇ‚6áE0(ã£'~ý–Feb›ñ‰¾Ó5t-?×ùo;Zaì¿¡ÇmËnuŽ~(r°Ïú ü÷f¬4~¡ÀïÁNís¾Êsë2÷Ìܹ¼§u¦˜GŒƒš»7ŒÐu¾6϶%÷l«tá`ѹ+r3–ë;]k›ð&7›G<ÅÅ—gUû„¿ÐSOêŒ&„æÝ±Ì:Ë“¾„îc°Xeè+•ÆÓ‹s2ÀMà"u†_—Š(èÞTtoo›þ±±ß}îĸ³¯-ôÏ6ã؈7uºc~«Üô%\Éó:üv]Ó¿r:±:ãÙÔðì\¡ð l'hH 'òmÀ‹©èÞÍÔÿ^ŒÈ›¾XH¡øfäï‰yºúýºçÒ.Øš;)ÎÐëLÆØÿ·Þ‰àÈ{ÓdWú2c¿ßhS¹.D’ÎøÑy^»cI'4Dßýetú®7…‘Œ ]Æ+zš‡ÿQ¶Ulu‘mÚ ÃT’àÛ›€áÛg| ;Òµ¹„;1õsû‚6Ô 2+õrðÚì3?‘LoûŸ{’ÆBf,#Ÿ1õ¿¸Ãí¢ó˜p!OÔ¶…ÕÀåø¡7e*NuE{m“ßÃú,c_AMPˆ-8wñ\+ûºVPƒ ¡Û‚‰cxt¨üääºmâÛèÏâ¡Ør¡ò>+ûæ¹êéöK›Ý £<›&òh 1 K9Ów\ù‚64R×ñ*±”M“mÓ>r¦Ì2Mú«eÒ»¾S¶€ßñlž"Ònó3œ²â·! qÇÇ"¨œÖ?3z®P³ϦIT¨FdzqB¸.Á:p[|‹Ç§w"ä.7`pÑÜË̱ÿkýœÂˆâŽÑ`„û ÛáSàÀ˜¹qà ŒT=E .î%´Âµz U9P{“) ß7ÃD(F׿KfŸöØèÝ2‹ú}é‹Ðúè×o3 ~Xæ•õ¿çåVƒîIŒcˆV×ŠÞ ´À¸ÛìZ?œ6€"Æù­5‚ÚeõÓ-q/ÊÍF@ Z;w4 y  COò,»#hU>cºf°)îUovª4² ?7m‘mÊûÓŽ€-Ë2þ/ ¢wóü£iØ“–1/:WôB¥ÍÃþ`ö¡çtïçZÓönžìËXFζ9_3"¡§às­“ÞŸP}N >‡·ep-ëŠsÄ R£æYß`·e¶cÃ(5¬h²eôóŸ¯éßÖWâµáÑ+CÏÛ,1ïî”Hsv'Eht¿Áý¹NzÊX‡_ÄOé»Þ¤ëtmN»ËL1Ù¶3yÑ:êÏŽmcøÌpißžõZ›·¤Øu”#óìû¢®FÿÑ$}ٵƱ¨ŠïszhϘPæü}‰ü_¨Y.„z`\ɳîQ¸aõŒÄP  Jnì{h]ï_û³âÅýuº›òe%4ݘ<B |v¯ 8rvdo[ïX܉§‡nóíK‚ö˜‡>Ž¢æÙs<)Ó ýï#ø:»×ýs®ê§ïv³m֗؈+ceQg$àM“ ø…BÈôãÅòœú¦ëa¸qôЀ3>m4ô¾ +SúsRl3?ó$ÅYF=kžßÁµc•cIðL“Ж•çsÂÂÀº¾[2ó}î³ï&CC€,cÑï^صuòû`”eâÛž„Ñù¨øÝ˜¬)ú·†©Ÿäô¸å4øeÔs¾ÝD+\ä[…Zº®7bËÖÑσ½á÷ä9²‰â =nL`¹€˜ûœ¼Ì•õt1‚Hðj”Ù:ù=êDgß͈Ä Öq¯£$yQ¬¨Çb#ê™ßêŒ!ù¹þ¸ü{ã¡÷¦¡¿Ï³g7x¨SJ‹÷oÿsÀ!`؆e€òݦðÛ\nwö–Õ¶Iï„ö5â6Ô’ é|vacÿ,ãþ¡‚¼[çð蜶—é:_ÏXcVöõ#q¯ŠWu™ýmÿªª«£³F?8¹úó¡É?•ÿßå§äj} .õ{ÝãüW.‹L®÷Œm~ÁZPxòÔ•Šõ¯üì‚{˜7¬$!1Ñ››[ZVÖ°”æg'AŠ ,;ùñmÁ¾ y›'9÷©?K ÎÙ_h»NÉ~ì¾ÍKKŠrb­£ŸµM|Ó4à~_òx]›fpŒâ€Ë1óc¨¸aÄÓ`»gÍ}û+lã_ç:?)°ì€]äç$—„ž•·w{yw =¼æÁù·Î,ÎóD5»¬È¥³M|+°s •v.vÎûšúyP¡}O`ÇbsÌ£¶±¯p[qÀgÌY;® à)ÎXPâÈ,--áznâHû”÷JŠ‹¤_Å…y{Öêµäª/eJI~´”:ȃŠs-õK‹ ô›¡(ι_ÛF=MP–»¤{Îgy™«š®ê\ Bn¡Ü´³®1±O¹—uµŒø“oëÌóû¬3ïºÁ–اs¿6t¿Ù1ïk]ç눅‹r­¡|;—VÄì›ò¹¾ËõŽ˜Ò ]o,J›^šk.-)ŒÖ·Bç>çœ/] [—–‡_÷¬îÇSòM饥 ~âYƒÎÀÍã^7ǽ‚нæ|}Š}ò»ÐƒœÖÍôßv­f{‰‹‘ºmÜjõgH¦?c¹-îÅ’×”Óo/ÉoD÷Îoñ§/°Oû; lèv³gÝ ¬3!†õm™.ö¢ÝصÜ1ãD©Zt îåÝ`û–ié{üÒ6úÏÅöÝêzNŽÄŒõÊ“µÁ:öeYº2ì Ì§ÑÆ`kÔf›ð†z4¶€ð]K:çÚÐ:Ó€ßbq?)ò˜芜ÙX2Ðt$7~ÄªŠ‰#õ¯"j&l'±ôÿMÁ¾xFÐ9ýïÄzy¦´"¯Ù³ª/Úå]{Ä„½ ±ò>¥Õ…®­|Éc]‹ÚAns¾DJž5ým“ÞVkå,ï/ÖTÚ>õoÐ-„ÓŽè³Ïîšôº{Ew÷².Ö ÛäwÝ+z:-z»Ã4åéR,ã^#Ft¹ãŠ{ÐXÏÚAüOÉ۳Ʒi"¸aó¼¼ Ø0¼¤ÐOµ¶ oú6Mðožè˜þ¡uÌ‹î¥Â;›·k¡btŽ™ÿ(ènD&®-±; nÿ›Ä^ìwZb1üŒ¾ˆ„Xºï˜ý96XhÝå]ѧ3:¨·c¡3Ç9¿¥sÞ7žU}0LÓ -ß䆜v?/öÙÄü ±bŒ‹°è¼ÌÕùYñ¦ÞwZFþÙØ÷7öq¯1E£Ü°{%qF ñ‚¼â™ñ±{u똲ӓ^ÆNâhø`ì{7mÃÍ™‡?YhÛ(rhC¶ 9Æž¿4õù•cæ' ûXJ„hèv#^ga ¨žÎ³a¨sa›Üøá8ã æÆqoöm”¯=è˜õY„‹(%=D²IÊ÷ô-ü[Û¸W¼ñÃÏèƒÂK¾.=ñ§Í/´î–¿Ýe ¸ï=þ´¹ˆÝ<¨¹/eò\çܯrGùR§by»W*mWÞ³)KÌ͵Z­gõlÇmpÎþTŽ²ï¬¹¤ˆGƒT¦íxI¦µºe()ÊW7àM°hÆôtõçålÄÄЈ ?ÇỄnüν묣ž5 ü£Yìwp›JT:]ÈXÆ î=0%½¶1¯\ïv£€@i¤ÿâç®%¸­MJ¹Øµà[*ä+ô õ€kåë7{Vö0éx•®Í%–ا•É‹5’ã^¢Sô‘RpËE¨Ô¬Ïdîtëf¾Ô)Ž©ï›5×w»I²jDÊ}ïFu17óÇeæ~÷ç¥N* ÈQB×¢¶‚cí¯°Ozë³{Í? B¤J€î¥] ÛBf@¤º^zÖÕwºÚ›8Jµ\ðÓ½ª·¾ãÕ°,ÇÜúö?wÎú¬Èc(Õ¼vQèÌVlJÚœkµOÿÓóoŸ-¯ÝcóïZ!òÙ—€p¸ß1ã#èÍfˆ±Yœ°ìš÷M> ­l¤0@ûÕÌUÄØý~ O Œ¤ƒÚ^JäæâÈmS£“›<>œX·ûßwàJåYÝ×9ᵂ=kÐ7lܰƽ¨  £ãY¹›&z܆J¶¸¶1ö¹° d,5yÌ9ï[©Z—ðZµäªgÝ`ËãõZm6‹—4ô¾³NyÞ¢\;ßö%Y§}hø €ÆæIºNך&¼cŽý_úHßÍCeGDC¯;aª¹ÉãJ5\ÍMŠ“ñyĵ´ OAÑ„À¶YîeÝÜk€±X¥}ÒÛâYúý¦$ß+cäʱŽ~äæBC*jf™ø–iðCÅ£±×…Ö º®® Pƒ’œ²Ç’ü¬ @% ‹¶Ž{Í>ý#Ϻ!¸TKìÿB–;9?«×Îy-^¶ÏAÎtßÐï>ËÔ«ûzÞnîwwu¿ÒâzÖÁXCfÜ+{9çKqLû ¼ h ÔÑÔ_–?xÖ<#h”øm€§ «y‡9æ´‘6èôúü‚‚3þö”†ÐeSï;,1!„_ìÊ.ÕÆ¿u-,hèO‘­?mÄ)ü"ælêŸuøL}ﲎ|&71Ö1ýïú^w2:8Æo•£Wªhù´Ž×þç ‡&‹{I'õŽ¡™FñŽyØy– üŽb#˜'rÎMó°h®à ¬ÿÇÞ{@ÇY\ïÿ¦Ã—ÐC „Ð!ôî†`Š˜Þ‹‚»l¹7¹w[¶…{ï˶ܻåÞTV«¶+­vÕ{ï–öwÎÿsg¤×«Õª"“ü9äÌá8«Ý÷wæÎsŸû¼3÷N} óÀÅØ÷Îus(ŽÀ%˜Wÿ†ÅfBûý…–¼³ñON°­ìš´Çm›„Zƒ†n±®êes¡|<©€ÒÈÇ™wúæ8°È<ú©øCË;GªA†élA¼ƒŽWõr.«BŹ_Z¦¼’xx™6þzÐ+jÖÇ,熇zU¯ð1ϱËÙ²¨£móØÐÁ÷&›²|l›ÇĬÄñà½*„q÷Êj}XÏ&Ú°|ÙóàóPÂIx¾txö§8_†.]qrÈC]û·as¿5 {„H\ ŸÐ&þØz@2)ÆäÚe|‡ùåÊjçêEácž‰šñ>î ds½NŠ-Úÿ/¦Aw•ÀŽz5ÓÃøB2Ø2á%\ ¶D05ó# ,mÒ„º6¼OÄÔvðm5Œž¿ƒbàçFÔR--%!þøɨ3ìa·P(9ú$&‰"†=BœÜãO1ë¦ÆÕ`5qv{ÈÜ«!®ÂQÆÞÒ뺘5ýêZÝÑLëî„ ¬bóà{ÂG>nYðoÞ´8sÒщ{üÒ’šÀýt+(ô°³·ÙâêµcwþÑ~ßíqµVËßýÑ•îâja࿯ouÍ—òOŠOt¿­ÕåïîÌ«ùsiœê¼Rä¨Ç<¦(/H/Í´¹–þŒ_ÝMËz)'˜œ•*cÒ»qó¿à"Y'WÉ1®Ÿß>[”°ÆËÔ÷€:eû˜Ä_ú„ö¼:nþçey)•gË lÇ  ùQ{]S©Èq¹Ÿœ®ˆžð©™XóH‹neÙñq ¾È ÞPy¶”ÿ&¬í)¤wŒ+N‰ä"tF䑃–“_ŽÚ½¨´¨Æ³Óí¸…_U”In(®gÞªv>dI‘ÜÎ på´=¾R}ÕåCI,à}½}Éwrî¬ç5R^ùôܬƒ=ñŨ±Ï%qyìS«c~~‹ú 2mïÔèI/Ù—ü;¬ßmöÅ‚»^1â]E]·ôƒ3£v ›ñ)·à«¢ø ó ¿é´ ›”lXÕEj×Ö<0•ºs‚eÊ«éûv;/–ºcœ¤üUG>#†=¨SƒÚOa :[¸.|ã÷VQ¼{ÑŸ¢„è‰/ÄÎù0uçD¾SšÕ@â¦ó×rB7Ç-üË ë{KòÖ!=®ä)XD˜Q½…ÕáXöCÜ¢oâj¦,Ó-e먨1O‡¹×<äîä-Ãôq³Úi bÇÎzO§w««‚¼T Ø2Ü6÷½ê´’kKò7Þçšé¢RdÆñ9uXåCÎx¸£*mÅoÕÒg›úÜÚë:ŒÁâûªcé÷’_Uèà‘óÌ;J³ã¥þºžiû¦ƒE±3Ú§î™"¹4j…½e[œ°Ö‹” Ë»ù&3Âr†LƯì¢Ïh3ø@_òÖ‘ª&åTò¢ö¥îžœ´i0 `›÷)v˜–ƒ×)/ÌÌ<ºÈ<øni‡Þ'§óв¹xê.Iñ ÜÄQÉOnæW!ݯHÙ1V.Ù>ëø2 À¾ä[ë´×Ýb æAUéËÿS¢jv×n‰þý¹ræ‘…ÏÞÙÔ¦skÇÎþÀ8Z•~pvrÀ0±Õ_‚ö¹¦-¬ÙŒCsãWvÖç£KÒ­ ëzÉQâíc ŽÔÑÎ×YÚÁ]/¯±Ö˾øß…öÓ’Æ0x#™o9€ob:¢Æ>‹]ñ¼RÏZÕ°È5o“óŽ®…ø€ŒTùó4׌>P˜—;ûÃÌcK bÚæ}‚a€WÅIaQ㟗lÃÌ[Aº¤À2HJÆ·G{Ž[®¨Ë‹Kq¢ž×X&µa"ðt\ŸéŽ_Õ5ãȂ¸æ5õ¹‘q;þäXÖQNMÖ=hR¤¸ò,Ï(Õ!‡=X{Ìõ¯³ó£÷7)ÉXi†»ƒ®¥é±¢°y_Ç@Źa[@Ëä6Y'W6cr™¦ôý~G&nèÉ5òWO àTKÀŒ%¯‚[ Sg¥”0žÞ®89‚ÿ†t»<ÜçFÛHf"5Ó·¡‡RÒ¨¢¼vT†QÒ_žyl)Ó'™%ÖôðØ|K`Œß¿"G=žo dÍFOxAømÅOtýlˆ3ŠÔµ‹>;Uz ’›ê"Änâ’ÔázìÓ…k©¢N£d½÷ø“ÿ™ÞÎÕ©%®óNòÈjbí%ë%†kЉ)²N­‚]HurIèzQXÿÛ¢Æî@œi°yA&£êw †~êu‘~p–$<ñ0ÄÃê“Ý8²äÍ>ÚÆ’6–´].Ænu†•‚kÈ<²¨,+>m÷@L+ÏKÁ¢nùñÝðX}Š\­8' ñ$ù².[¿º;ÀÈ“Z&½Ä7åÙ½®ÆcrSømEy1ƃ£Œý„cÙàdÌŒöø\×4̲¤:WÕNiöe]ûÙ`~¥x\¿[Ój&ÄðÜôÿT¶ø›mÎÇ̵­)iœšOú¶~#G?ÉÓ 0;èìA'Í0ÃŽ#Ž­™G;‘*BË:Z§½ÁÓIMÒ•Y’w´&å†0YLœSt#±›úÜìš¹½þÆŒ‡õÿ 𧬽PÂx0TSïôieVÁòOV½¶m¦Lr5{ßnÔ$-Â9#G>ªj8þEjrCéUël•|GŸ\f¢±„tëé˜àIþ°XãkÅ)pŒD €æ¥`çøúÚ¥˜¦Ý“xð„õÞ:ëN50ióæ¢ }“ºk¼®²¡ì „ Ì—ÎDÝÀP ÃÔõ-ä)’€V©„Ø÷ydg¥ªÛ;c€ôÖ.„Ô¼ÆÔ¶Ô,"(:ž‚IdôÒ÷ùU¥?R¤±vÂ"šey·È‰m ÜR˜oòËxü³Åy³IúŸ³@ÓU2¯ë›g=FŽzþéz‚Y‚PÄàk’giÑ7’@¸ú %i\•©÷À¾äIXøµÕ¯ެÙO]ä8Âp )Œ^d0Ë’: ÖIùâÔ¨âds]ùCó²¢\BþžWcónžY8ôÊ<ð¯*%þý¬Y)æ²y¨[Ä”—Ÿo=¹3vÖ:eÓ'uTÇ?/Ѷ wŒ†³cÕHÑðÓkâ}Í`o‰ëûÈ_•¢4.[Hƒ­ÙâêÍvÿÑ~ßíqµVó$®æíxç²V·t9^h|Rj|w«VmÖgÖüy]â*žQl ¹:ˆÐiq5¸Ë¥Z̓o b~ÖÊçZ\M9æ©WÚæ}&ÕE{^k_ü-”>–¾3¨Ó…øwWl”ÚЛ‡êŒ:Fƒ’Á·=B(~® ÎÃl³N­&â¶/î@„CÄ9Â=,¾¯:•cÂkDíY\K\‹ƒ¨(-„«à8R¶Bƒ~º€ß6ˆØ0Øôý3ÜR€Böicf¶OÙ1¢˜µúÔâ¹byœˆág»”Ê*I‹†dþÄÕ}ӢƷ¶ÍÿÌ<ðÜ„¤ÿ|—kzp¨{ĬÏLÓÞ#„‚¬ 7$®vMê.®îšHè!%,sjä‡ö@r¤ôö»ÃÜA$ËÜ)qõSFI‡Zw±3Ú×fV„NQãž%¼UUq{Ô%6þ ›'¾£Ï_I›u¾ˆ.šc 0 Cë9–ÿHtìVÈ j¶%$Ø„ðç[õ‡µÅU–’mîDz—|ë±HœS­qûW”‰é ñÛ=™Å%%GǘèóZ\e¥ëW焵=y"Õí± 9>1¤Ûå<š+ßà·xÒœ`¾†Í‹;‹;a™Ô&Xí¤ÍZOˆ­¥~ÞÍ2ù¦›__ÑA‡ŠKªÐI²n®í Xbf´‡KäjqUeÄä*qub•ù-cÑuò'­®—¤YyR"P>g@äÕÕ²AQà3 R«hö‡øâªiÍK…bu¹æmÊÉ^š¸¾wi†ñIÞ쓺k‚ÐH¯«¤ôö¾it’õˆoÊ5…ᔂ´S‹«R³rè}ùQûŒLžXµTxïýg6Ÿ/ƒðUAîO­2/p}Äê÷n\^ã3ôy¼[^Ä.)÷£^Ÿ1§,pS`=T’ aTùû‡ýÒ6´÷Ÿ¡ ¬wWq5öÄV¾€ëw›NpšqxcHxÎÄEoâuµÅ·-WãR‘#㛘¨ ×ìt=”ܪªœÈÈ‹Þ5ô>ÆŠ?5ô0ŒKÞµÚ-ÇiüÊ.±³?è?Ö()F×ö4IÂäÉn8¦ôð!@¥ìM‘´´:~=EÒÝÞŸî¡×—³’µ`ò¾^*-v»LË8Ø6›yt1㜰NÄUü †}b!ø#·HΩóp‚!Ù§Vá†bg¶Çe:Ü7!Ô7ŒGá¯Ó¢ÅœÙÇÏ?ðeX9:ÃjÚž)ðI8di–£.qÕºÒ+ÚïmH`ÔØg ÿ°ñòü4ÉU>ñ¥sìïƒ9À|8|èýçV½6rxÎä—™/•³ý¦ˆae0ã ø#œÀȤ§î·èûÒïjWÿl|Óâ*à •sMüȯ·šS ŽŒu×`ºÝ:Ç\E.<+ ×S{Ô˜M¦€¥2ÀLÂúßEgj ñn±g^VjÔÎ9ºl·”fèu]Òæ¡±s>bÅÕ#®‚éfÒmè}â/ý˜B?·¹h©ÖlqõŽ){ÿh¿ïö‡¸Z«yW·kqµÈø¤4´Iâªìû(+ª¬ÚÔneÅ0C½ƒp’ #||™ciG8 ° 9‘m³Þƒ¬J@½øßP¦è /àÇÁøLIšXÃ×ËÆ×š¯SÕ6›ÁnéÁëiJ\ýŽàÍ84OÄÕ%ßV‰«§V€@cÔË lÙêY·¸ ÉIœctW¨÷uA/”zÄ í‚v‚nâjIJT„Ï„pŒÈ1Oª öM פ¶ª¯ ]9wëôÛÜÿ‚¸š¾>81b؃RË ëeøeW—²c¬Ù÷_¦Éo†t¿Âê×® ö^¾aquËp7qš6àv|±[tŒÁ@ÀèƒyÀ¡Þ7à eK˜ã´mÞ§Q£ŸÒ¡–¨73ß+®Uô§8É=é%(GÔØ§S¶Ž8Õl]:,sûܘ¸Þ›žÎðPÄ}†,ˆ_Ù™Av%jÜs,+C8‚ŧœ ÃgÕëøÎ©*®bŸ¿±¸ × ÷¹_öˆÊ~³%–Q&„EÅ-üŠÅR’M”}#½ÿ VH)µ?³Ï¬å¬²Ç—uU˜”Q+Éׂ}É÷¡^WAª=nqÕ¿¾%ôKXïb Ãë°0ã×ôÐïµù-2WKÛ;‹ˆoöÁs‚7’ñk¼B½¯OXë•} $ÍÊD8>[¦¼b¨ºé5(®¦îœ·¨ƒÔÿm¶7¯ó¶¹Ÿ¨°½ÊÌ2,Lò(;±—~/Ÿ8åÅ ´¼YӻŒ#ÄÒöø™b´Ì”´q©÷RLmËM¶i•äãZ\•=oÑû™5Ì,ϼ$!J•¢‡§V'o&eeúÞb(«º™&¿ž—ÁšÊ8¼€!•ƒcžäâÀ2!†P_µÝQ¶ÝÎz`‰žðV–›ù®«ÍJ´N{]"޾7GŽz"aM*quçÇÒïܲìx )¤Û剿ôO‡Ü˳c~ ]QBJäÈGKR=o÷GŽzð«’”HÇ Ù„ýIJNogÚ6vöûZ’b,¾mmœ/N³·®%¹ÛåQ㟗rêgK3g3€\W63wºÇ9ÆÎùV,§·,ùš¨d].Á‚ºdY^ †m™Ô†‰†6‡öº6;耔¹quMw†1eÛ(ù“÷ Ž?iâ)ôæù¬“«x(xH×Ë­ÓÞ(ÏKe¬ŠB]‘-}¿³Æ ]¡€<‰t˜éæ‡Ö©¯I]ZŸls?ý³¦íPJPMj£¤­‚”­£^xmÎGæÁweYÍsåo„,®äÍCsš›¸ÊÝådÙ˜§ÁacÇ`cKÉâûªmÞgÍWó¢öb«4œ¾eò9XÈ‹Üc_òoßõËð|ÄíÄÔ6ZñSnèæÒ,ž¨4=6ÑJm¤¯t»WÂên©;Ç—¤9ÎX}_…‹j¿‘½Í8²»ÂÇ£ ¬¡=¯Ág1jí8KÒ­ò²ïÄ W×Êþ|È–€#à;¹¡n;FªÄÕNb‡çËÆãå?rÁ¢¦ˆ«Y'–c{ ‡WÄœÞÍ€`oÆŸ$:[Üe"@‹²YøP‘&)·NU¥ûQum Wq¿3ó]©o؈½‹Lƒß˜ó; 34Ûx“ˆÅ¯î £Ã¿hH‘òdrä¾ÙRuBé˜(ñÓ_Å,eKð:oP÷šõˆ«1ó>Çãȹ›ñϳ‚ÀyÙp2òQß2b€0H8`B"z¾ãz2ÏÈJ¦Z‡Þóó;q ÎâÁœø9ˆIù8TÞs›Þ›Þpµ1?¿Mg0]5eP©¢DSIZ´±4ätêüÏ¡¸jë—ËÏNÈ3ŒËx×`ÙÊ\ÞÌV”äCÞàua}n²scS ¶*¨¸sƒÉP` ¸*FØèƒ¼ÅÎNH;±Úäû¶l#90ËZÃJ™#9~¸exíW½º%m—fÙq¾ÐQ9ıº[ Ñ†äÖš-®Þ;mßíwÜî÷Ûß/¼3þþÅÕƒÿ¾¾ÕuŸT§È­ùó:ÅÕF7Ø Tâ*‚ËvÊ“MD ð=Wöšäþ¸3SÊÖ‘øk(œYë{KüŠN€'±l!¨Ó™‡çŸ-®îÓ ”AÞÄ•å$Á2.Î<² ~UWœ;ÿ°*J …õ…õÿ œ­òl q4!ÒCZ€*q7 ÊÉõ¿Š›kÞÞàF/‡ŒÀ9îâjšEŽf«Ã¿q ¾äñχ @0O‘ë‡cYÇœMçãŽõ´ôƒ³`h„¸õ¨1O‰úÑãO®~ÿ6þeӤׯ`•İPˆÄUUuÝ]\Ý7/ƃP7]æ•pȇSsjÕ‚øhÈ=Uùñz]'”“ÃÝî%;|_ÅMÞ׫}8ç«¢zƒMÄÕ9Y§¿©ÒJ| ã… 1PùÑ ‚$”Öö$.†Ô¾„‡¸FÄÕŸß.«.RY[\%jý6ÓÞ¨=FÓâjÜü/ô*0ÄÕÌ# ­¾maËĉÎjS„Z³ôD9ìy­‘Á a}oHÚo-®ž-Ô§qÃúÝ*USÂ!N9Áþ"Ål“Ý’<Öa#pÖûÁ XºÔÿíu\>Ÿy|ñ©ë~~I÷ÑëZ‚A·Ã•º¥ïŸ![O­aãWwO±áuŠS£ìË~¨*‚ÓõÒì3k!±3#L(?,IâÖD¦©{¦X¦¶…Ô¥lSh;=¾uö©Õyá;ms?BSUÄm´BÛq-#+qµ‹Ôö4&<1²ÛyÀ–mzç’±¿Ú©v³(qõ«*qUy ™ÕJQ’)q}ŸŒCó ™rð]`W↾aýoÃk¤îÇ?¢’Ôh0V‰«Gå(b܉஗bf³cŸÎ‹Ø ܉Z¾e8kG _5ÄÕñ/ç&˜m³?$laöEsþpÜâø‹ˆaª2­ŒmH+ Lí“6¤üÄu×AYNø&…tûß1ü!Ù…5ó]WwŒ·/ú†>9ê÷q‹¾ q"Äûbü9ê±Æì¨idcEÛ÷ ¥â¹ý!‘Q3®Æº ¸ ºIÚÐ_$úÆýªIâ*£GôÓõTÈ-ÏKaé‰D¶Íôœ*òMÞ:Ž‘¹;jô“1Rçš™eÍê8:ëä*P¾õ ã×®®[`cDРGQ|0]ŠóaH·Ëµ†¦ó!à `úô^-®ÊîSµ·*aMlµ4=†%/›œ§â¯”ºÌó>s}(FÃ<àŽ„ÕÝq ±³>°/ꀅVÍ`À˜YäˆGŸ¡U5žQNvô¿ÞÖWMñ«ºÄLoZ¦ü¿À §Â‡=„#`ÀY8\ŠEDÄ­]§SEúp9üxô„ÖŠË}™qp6(”~ͽpô1?¿•M2ö‘îñžøý1.ÂJgAÁ mÇð"–9!–z]’qxd’és…J(êéˆ4&'û„»^F`˚͋Üë"®N p{äè'p—Ò犳ðF¼¼¦¦’>¨Ä(ðá„3wºl—­Gõ¾f©@F’Îc]ÌÐd('b€\> ÉÛá‰@:¾µäOØ5‘qõàªÈQ3h‰þýY5ô‘‰_ñ“¬Á“+·ªœýns,ù7£/rœÆÏ‚9Xkîÿ €ýÒvO‰ùùy¸ø[î’º™©a!'øà;’6MÙ>:~eg–¹ë#0_À£~Š õº*fÆ;Ì5cÅ#¸R/æÞ2§z¯¬«ò¼4ž±Ð~ºÀv ûlôøçqO\Ö<万~@»Ry!rYbR¬vÈ=1ÓßÄò£÷ë¤+ÆÄýÞ"F€fKçk–)‡ºD{–ÏÚ×$tbvDœYümeE“ÅU&p-ú1ÆçX¨î&0zW1cÀGÞõ+¦Š›àé$ýÅ‘n6þ`9¶¹—dÄ` Ñ_tWŠjØ-„„yëKÃÔçÆð!28DØ2=Ár‚6°šp§" >÷[§½.¸¡’ó¸^“Hh€ ÷¹_(ôƾìvŒ¢þÆr–c#~ï[$¬ë™y|©ñ§ò‚t8‹T‹«t/ãÐ\õÓëiĉˆZvN\õÉVùÐ䥧߿rM®àùë\WÞÀ:NWÛX4üz‡¬ò)§VÁ˜D˜¤ÇluÍh¬Jè«(™jŸSqJ$+ˆq““V›†$þÒƒ/fÕþ­u¥WܲŸXƒt 0Ï:±œ±JÞ4„õh°2>„±Ð0ZFON– ¾Û°%Ý0|Dø°£Æ?‡¿3S^q=Å£r+}ʇĬVI&£a5û©±OŒ,G!º•5:h¿º{úÁY"ÞŽ~R^¡®é¬Š™Ç–˜zßíäúE ¡Då‘»æ×)®æ§ã.%’ø×à.—ä…ïð(ž¸6œTÁ]\͈µL~™ð_„Ö“Iæ×4H/Á>´Ê•‹ò˜9ÁΓœ[OKœ1òQÙÞ0µ-á¤$öé|‘¤C¬–ý„Ü4¾ ÃB$ñ†"‡òj·ÒŒX";B’Zâªîž´ÁõsI3ux¾däóº*Dí*t*’˜ÔT]|„f›ÿYííašœë/È™»õ›F j#R›ø‚ˆ«‹ÿMÌUœFà, ¡‹u%nèO\_36©šˆ3Ä×ÿÔ*væ{†LáA\M%v ,ªKŽsâjuæÉ*que瘙ïbÞDXŒ•þ” z ±3ޥæ¾7˜´qPĈG\pý ®9Ä%zp»Já(FXžŸj›ûIö鵄ØDC¾É0&®ï# ëªÄÕ±„®À”l¦Zô5ÊIBéš·ÐâjZMÓe fBJí‹;`òÍäÈã"®&™ã|aØ¡l´(-ƹ£}é÷D ôS ã?ò¢öd[Ê—±I H6!œZ±¨ÛÃå\ïUwB¦»“TLXëU—:'9OZ(}SÖRqVvÁ¹Í:¹’(²êXZ•[¯¢¼$;h=¦ÏU¹ÀÌyºô}~Á].f²ð @7á^ƒávº}lúÁÙñ+:Éæ=•ÈÓ]kÀ|'rôsØcg}gfÉð“ ÎŸW;]¾¨S~ºCç „œGŽzLžwÀÕ '•Þ%æaú:˜åp_"Vy/¶ðk¢›së.=†ÐXÞg ¾›Z&½îó@Äð¿øÈùAóèºÞE,ûçßEO°+ã\a=­J\ýD &$9[’Úë:dß¶Öio4U¯pk);LJõ»…«%¬ñ‰»q¿j²¸ºkRâj~‘#ŒûpÝ‘ˆá,xRÖuø»Y,Ì) Ù¾ìí %~Ù2¼Ð~ó“#ä5>¸6‘ÎXhcŸ-N4ÁO 0rœ¶óE\V“¼L¸zÒíŠFˆ«=ô«=Ì[å>’ WÎÏî™R–@`•¶{2Þà éþ:{†qxμÍ>½£%¬s}e@grÍÛ-“ÚDOh öòߪc‡æp©ˆáE6ÄU¾ÉÊbúÔ‹æWð­ÀWY–ë-Š¢'ÄÈ`‹ÎRb¤àÞq1R¾mȽjÿê§ö%߯ÎlOHŽSà^àÌŠ'5”:¼r—äÍ>úL£E‰&zšÑ – ßäF q^ø.¦ƒë㦓<¢,ˆ=ÆhÈXY&¹á;ª"§œˆ!ü÷}•rª$Æ’â@mtWù“N/€oÂVÇîhãÙ³Ž-Ꮉ*c&ùäÜž¼e˜‡™ûqø°âæ žGŒxTFoüóÄæ< $âê8>ɺoº¤Æ*ÉcÆ!ÀÀ5¦¡R\jž hÛf$Ž>5’BcTÒ‰ L}nLòï_h;†÷LÝ= ÏÚójõßk$;MÅYŒ99À‡kBYùókñmëú\ŠaÑ/w0{ •Ôâ*@znóžÓ™´q0&ûÏ7~θÁÕép¾å€¤C‘­ODyZÞùv¾0¤ëepiqdA$ãʱ%¬ß¤ÍC%É€; Ñ_ļÕàŸg1Âéí$ÇÈŽ±©;Æ&¬íéÚaü&#C7šzf¼$5:ff{Üh3ÄUº]`;žc HÛ7-nþgçpÀ.G{Ü^E•fBéÁ×ñÚÀ‘‘[©,/%eçXPÖ±¥nâjaœäb¹>ÙÜ8+ âXïBòþÕÔ÷|¢‰s±›¨ŠuÊbgˆ)þJqµÀzÈ:íu–pWž—B8–øK9|AØ^1£J\­NÀŠÃyÉ›q§ÇÍV)ks;§¼Ú8ÈXr´öÈBI«Òõ2ˆ¨¼.T޾¼ (Rr³KŽ”p$óøR|«ä†Í´ëß–å&1‚Øêõ+X‹ùHiv|êŽqò®sçãŸ[Ó9®YeR›`ëH·Mò-Ûš'®þ˜òŽäã3þÑ~¯íÓ¶ÿh²ªÝ~ÿâêÿ+ êó×V—½±"YûôÊôM\ÕêÆ¹ç¢i qµ$yË•›´Uâ:ox”ñ'ܺˆ«æ°Ä§ú¥žä|Ûã«rïÜÚ áñ¡¸˜$á9ÉŠ‡cS7¾3†¸*GfúÝêXþSº^Uâê‘…ªþÈKà!PIì¹gIiQ õL‰«_Áv®Ãw4 ó6tŠÖ6çãÚâ*÷¢‰È²O¯!¤rûkK5x¯N«Õø­Dç¯1ÎÃ&NÄ S@±â”HصµsV0#!C4OjK@9ò±¼È=|¹^qÕF Ÿ¶wª›(¤‹;à¶jZˆ“!ßrPTÇþ!°ÒÂWqr„T!PG;i’¤±–œ(âêÌöÕ;‚Üßìÿ–-/bÜ›¸ ¶;çcb.⠬ѨîáTÙ‡°mSï µ¯qh1lƒâªÈÎK¾ÅJeoIquÇ8–°þ¿J\!eƒ¼®† …½7óXÕþ•ÊéáèqÏI®ÝA3^7C†£Ç?ï²ý¦xt‘Õï_±s>XD¦+ͯî‡ fªZùQû³O­–³fÿËþ´ ˆ…aV¢´w¾(nÑ×’Iì—¾µ7:VtªG\Í8º#„|†û<@„›~¯S”¢+ˆWË "®äMƒËrsöY¦¼Zs8çÌ:¦3&’Šÿ\ö™uy‘»cf¾9æéôÀÙ®÷"úã :Îe‰§÷8ÍkY'WÑ%è·a¨D%„¢n:aHµ¸º&ãð<“÷õáƒïŽ_Õ5~eçða…18æw&mÈTªb.½‹âƒ•éš!ü9¬ÕêÛ6Uä©ç-¾¯J,¹â'óà{à·Z*—ô¶ýn³Ù„O›ÿÍ2EòRŠpÃNXjôÖê÷@ÁêÓpʀâ]¡µ(É;ëëÔ×qazC#S Q›÷Ynø.*ÂçA9ðÛýÿÔfÂGYƒWÁÌŠ’–ÙãTâ*ã;ç#ú€=ëÍÍn¬'jôñ+;©,7úUÓÄÕâ\îÒ€¸Z™àð+A"‘ïÊNŒ<8OP–±@j›ÿ¹®#™qpæA “ô @lX×- í§ãæŽEqMº$ûÜâuµJõ)1Wæ±ÅáÃÀÀB½®©O\=’0TŸWâê%F&˜3Îò/“tš?‡õµ¶¸ªüaÇòy,Öm?6W+Œ;ÅâëÀ À>&‡eŽ-akŠ«\Ç:õ5IÀ+›rƒ%"n¢æBÇÂÕ˜íeWüîI’$yiÕðÁcòø&ïX/r¤¢×u’xsÖûQ’ô^®À¨ï ñÎÔ¤sêOÊr’¸/½Å¡ã׈ÇyLæ‚ÁIò€¿c¥Ïê¡${¡§}>¢ õ»5nÁE ¡–Émd÷ûsV–«­YÒ­#ÉÆ§ü´Ô=¾:=ˆ‹¸ê„²‚ºUâjQƒâªÆÂ—é“à*èaêsSʶÑÌÖ÷fxoT„lÃø3ª®âjô¾¥ô ç’yt‰’rS¶‘ò|q'„)©L¾[ÒÅäˆJV¼*ܶL“gÝ®ˆó¤uú˜bÚî)öÅßâÎð)X£Êîâ,N4IM½_$ù”m±µÄUP—Žé­P9¡›$éÊâ"®ŽzÂõÝ#™°®§IÊ“½ub¹ëx„‚Øcù‘{Ef|=O¸‘²çK#G?É*'ÁsW ³t®F (ãÖµ}⪮›æ&®Êk Ÿ =F5´F¶’ÔèØYï6O\uªýð%)‘…ö“®¯±Ii€ã5¾™Ÿ%°/íXßÕòe3È ™ jÚ˜*Šä%»ã4–5¡u3EB ¤RØ¡¹ÕxuÊ<ä¾ÎÚN`·¬h¦ž?'®ZáIõž}Âõ‚y»£'¾þÀ3“6 À mÇ2g—å4!èævˆib[˰#×lüÀÐ!¶j¶þ 5€”Ú)o¶Žd)éI‰žøBíçjÙV’.'é`}¸{ý.‰È.q}ob½ÃüüÝ–ã×tw,ý>#pÃhdnqmÖUÞ #„M|1bøßYMâWHù€â”ÑN¦•þ«Zå¥1 kzÀ£\s8T]jêk¬n9ž6ðNX(þ.Æï_çæÂ¼¿ ‰þ†Ü .ñE\u)›Õ˜æú¾Z\ýBWï‚7BCz\éA\•Ý­ò¾[ÄÕaiqžæXò]IšçŒXî÷-/e7ô34O|n˱ä{&·ú¾ª^ÎJœ•ºkb¢z.n5öiX„rÓŒDúØ@ÕÙ–Áwã©EVë:]ÞÞS¸šqhŽujÛ´=S’7ûüoŠ«þ–¬^¡…m—ŸynΡ?Úﯵ[êm*<‘Üç'âjeÝtæôéÀÿ¼´Õm?¬9vútptFyÕ_ËãæþóòV—=õãÄ%«–øviý§V=79²Ìý"¿^\Å‘A!B{ ë–š#.‡Œp¬Qãž0ÁºÆinh@üê®RÌ}Ä#Rt5joyA†lDétQâÆFf’’”¨ä€an´êo„ ë¼ÓöNù(²®" ^ØŽã˜`ª13Þ‘ll¾¯Š¸ºoeiq sÊœ«øÿþ²ÜdDzE\ÿ|H÷+ ñþ¯¹½Õùa‚;_ U.I·ž'§CƒëJYÏfôlÙÏ¡'QãŸÃõ¨jJ/„õ½‚š}f²)-Œ_Õ5dÀßÂÆ½KR›ëWÏeçš·Æs#¨°JÈAbܼÏÊ´”䬄]sGÑrË‹mó>%¨ÑGÑù\(eç‹Bz^TUQýÇÚçG˜#æK¡à<“´úÁ¦uÚRt£ç5"ñuº0Ç´…ÐÆµrëÙ’|¬ºNqõÈ]´~qUÎ9.ÿ±qµ¢<ëä £‚’ˆ«û–tv].f¸ˆƒ4ôŸ$Yèà»Ìƒî’-^Cï5ÄUÉ¢6©M†KuƒßÂ.Šý¡ä “r]ß;g*ΖªªÇ_X§¾îXñŸ’4«$dt'd5b؃’,Ø´}Ó¥^Éôvr¸{þgéûýÖzÕ.Ž1‡õ½)}ŸçüH™Ç–bÝaÿj_Ô!Ñ´¯Sh?ÍÌÚü […SÖio&mÊ ASc¦·cÕä˜ÀU“þ³dýB¯©"G=nDUº ‹;8KgøŸWO­&|Ý£.qÕv– DÕâ,°[¾·àK]–%óè,ʾ¬##ÜåÛœ«ÄÕ”Èp•Ѻ¢$?vÖ{I›†ˆî7îù¤¹Á‚XûLp×K¢£%ßYM'ŠKD&Šýä tgÄÈGÂú߆1¸Š«\ Ç$É0•œRs„ñtÍP¿²ó.µäæ|;£½¬²Nˆ¸ê? v滢xTVDŽyJeÅTåb'´n¤¸JÐíPE~[pï ƒƒU8–vd©Ò½_)®ÊÖе= ÙD°Ÿn䯚*®9â;êÊQæ¬ÚÝ:QöhŹJ7Uâª>j=àöœ`]ç"fÆÛº`SÚ_7¾ÆZNùr]·pWWt zh¯ëªr³ÈÉJÙ”¨KoËüÁw×qSÉ[G`uaJåãûEŽª>W'ö”2j‡æ‡*ßD,éXÙÙÕÊs“YRIêàl|k¨÷õú nð™ÒìxÇÊN¶¹Ÿ2¸¹”ã°F•ÄÞƒ¸J,µ“F?)…ù"v*<;³(²O¯Ñù.RwOâv¬‹ª<0å%ijæwÐy!ná×²Ã­ë¥æAÃþY€æw„¹»4Ën¼ï3ò‘P¯«é«?1ÄU‘õF>Æ¿“ü¥˜Ë\Wõb¥gZ¥JÊáUŸ`rÌða&oEÇ,¾mµ¸ íæ…ûÜG”m_ôu‚*Œ.Íé·vº `!¡ã÷¹2’j§Y½âjE9‹Ñ›”´¸Ê5%“r¸}é÷¦¾7ËÆ€ŸZÞÄÕ½KT…”;³ƒý£Æ>+¤·Ž„™ÄÍœáó€~^FUé¢]ƒ:_\^©î+EÄÂú݆èý̽VÕùÚˆw³úý«õ%³Ž-•ãrÕœ $dE«tL×w-/Öô`Öô@V1“hêw+vU¸ÊÏ™_ËŸ5(ßiJzvÌ û1Møgôžnâ* MÒtt»â׈«„“xvÏâj^ª泟®'šøõ žŒ¹âä0šµ\ó>™%=Te'Mcµ‚ÃÖi¯C¥rS¶ŽJ«Î¸ëÚì6KA^V^øN9\3ô>~%{KÔYžÜð,ÿ¢DSêî))[G' €H^Ð_úª´Ì+Ý.¥ÅÕ¿v°²Ð^×ë£Æ_q¯r8tm/fö2&ºtZ#+ŽÐÌðZ\Ū1¿¸…_ÑJR£Oø‡‘¢ wÌø« ŸÓ‰—œN…™ü›µ8—¸2ª§U”ÁaÛ GS^˜ ÍÍþ’´yˆ$¨WÉÕñ\©;'ê¹%iÑ–I/& îv9·“š›ºWé1ñ+;ƒÕUâê‰åJ\}~›qxžØFÝâª&½€§d“I©3?Û¯oÍWiN%{› ?ßÛvÙéæù£ý>Úk+Î|µÛÞ+¤`ž©Î Mj¿qµàÀ—×´ªù¿'g:ŒÝ}™G|¿zææKøø¢??öÉøýéNƒ¶„¸Z–ytqhÏkkçXÌx)ˆ9 ÂÅTU/-+"4NXÓÎ9êqP4ϼ£,7žèI,¶¶—qþ¢Èq:9`XÆá&2üV½ ¯”ŸK€;UAu„Ú.;5¬ïÍ13ßÅû«}¶Dî÷ ®ÊéÎã€Ä¸Eß@T€z(bõp÷.ÈP›(jð²\É η’mõî‘hvƒVÁ`q1D(¿…áÕÛ2/•},#…ÎIVÕéo†¹WŠ,þªÌ(9–ÿÒïvóØÖo"‘ìS«-“_©[êÚjµÈ4ž‹Ã p N}”ÆvÌ:½N‡n_ò=N?Cñ.É-°¶—lgt§Ô‰èr ´³öÑi!ç ¿ÖñNQBðù«¨Þ`Ë‹Øe™ÜÆÔûÏÄ)–É/K:âãKc¦¿éúZN‚_ë{SÂZ¯ÚW ö×µ_ LPžÄÕhÇòÿ@¤Kë;˜æ”È´zß5|›î))àB9õr¼j‘2˜Tì/‹G=nÄ#R‰Ã÷ÕßX\-I³²ØSvŽ3¹Gd–såŒñ{+zr›È±Ïȱ ²"øLꎱp~aîz™” °J¼ŸZ±¸ Í€IAÍí+NUÃBòØ-®FŽ|ÌÔç&‚ß„à]"®ÚŽÛf¤O3­ùQrŠ$@f¢%E¡³š‡ù1àù‘{uåþŠ%¦Á?µ¸šå’ÍLÃÙ³Åy¥6íM\%¾c¹Y|ÛÖWöÆÎú@¢?þ˜£œÙ÷,¨®ïGo}¶$?ûÌ:Ég8ëýHuŠ6vÖ{Z\eQÛæ~¶C¶Ö{)X#¿UÁ΄üÖio2›–I/XÃN‰¸ºô{À1O‰0;þy¦ËŒðyÀè-ŽŒ1ÝFaN¡ãLÒÆÁ™G_`±@û±–¸_¤î™œ´q`˜TÒy Ña¸Î+uñº^F i™úZÔøÖ’ ®1âjJ$f5î¹ô¬\¸½®7ÿ³‚˜C¿æj@bÚž)æ!wã¿Å¢iâjI~¦ľ¦>qµ8—E‡1€ü®ñ¬›¸*y&δ½¾RïL9ÇÔã$Íi–C^Fš{Nˆ«ÕD\]ø•Õ÷ÕòütºDø)…¶½oP'#äe«.~Q-®Ê.è:®sŠðß¾¸ƒ©÷ º †*VS¯p:¥ÀV×Kƒ;_$¹’VwwÀy©÷¤”(9˜9ë}#wMp§‹ ãNT”˾ǥßKÉøŸÔÝ“X/Ø[P§ #G?n 9bˆ«  ¥³ïª£‹1up†HPðùð|eÊ+égKæIß¶:=‰óaø»ƒ»\=©Â®'¥b‘ϤþÁ"2õ¾±Ü刽¤• "zÕŸ°ÒqÖ…±Çp Œ! Ç!7âCÖfy~ƒœujµ~.¼¶Çì…LJÄÈǰ@ÐWa‰Ã6õ¹9jܳê}z_ãû™G†õ¿MšÁcÄÝñ!àê}נ°ó”m£õ Ê*quÀ©»'‹±­î&Gþ÷NU~ö­Zâj–=,|q—Ð^×nƒä ÈÙ¢œ¤MCðÈô$ýÀL·GR\î›yfŠù­águI²jý½» …‘ÊÞBÿ¥Y’vž¼ÙGrnèÏc2q±3ßu}ÆÇ¾ä;½ÝZñŠ—é6‹‹‘çËʼn&-²§Ì,iÏ©™ñÍ‹ØÍj0ƒ»]¦ñoI<Øí 9¸±w*4@6$,ÿV&›œÕáôn—›Þé±Ú&À̘©ŒÀÙ˜Š[%ì3ë#F<¬¦ Ù>Õü!’¤µMW=6\*èALáš´QâªÚ‰ùå…ï¨ç˜.ÆŸ¶ßO?îžÒŒB·ø †(ëø2ý‹MòÊC^jß—§Òeà‰`†à€ÔÊ”Ï`Ö@ÅÔãeó@ìQ·JyQ{%aH¿[P;oF^,u g^ä¬O"×ãj5ÅÕÿg›ÿnƒl¶¸ /Šù(С3XºŠ«X Ae‰Êªñëç½N{Èr°jsìVoÔÏÚbÃÏ•;? TdrekñØg‡”­#]r#ŸkŽøøÂ¢"y{èû*žlaÔ˜Yl0Ì‹Þ/?ß>VoþdÜ0E<‹ÛdÑÄYL|¬£|~kq)™ujv…Géûýˆv•¸Ú«ñOòàFÕ A§I)H7ç#–0€–qtaÜâ„ÏôÍ@ÁI:­s_`ÞP/•:Û;ç#~ÛÈTxg‹s싾Ácùgø+P ö 4 Ÿ¢93@éäá„–Öio$®ë…3,FÝXFý¨÷‹¸zr‰ž(⪤·þ÷Ô]“êZM©$ë˜û ýIÙ:J³ç©5[\¥í´çüt8¥·©h@dÙí÷ѼC :&Nm±¿qµ%Z ˆ«å`²¼ÈÛ7Ý­ºzNèfNV¿²KÕ‹§Hqu ÔA€æ¨òš–I/5ó5#Ý\å ¤ÓQ¹ÊÙ$Û/}mó> íu=@—¼y¨ ¦Fäý¸E #B/ûÔ•™Ð“¸zxÄÈúKÉ›¹ëãWa}oi|r9÷þä¥&¬ïÜõÙÔqÞÊsC«`YÄS¿}†ÕÚ QÄÕ1OI²ˆîWê³íDXðsbR*af°÷a£ž"Â".tÚÍ1e_â¬büþ…Ô;pµ„L™~ŸHÈ5öYŽ©4ÓN0Ûó´JƒùoÜhmª4ÓæXÖQ‡3%\ä¼MYƒMÉÑð¶Ð"LQÄ¿(1Ôõk¬È‘z¬š­‹ÿÔ ¾aˆœµÅUYÒÑÏ|ÏcÏM¥šõ¾>ÔëOI›3³‡æjž)ebzüIËÅtݧœÆ cÿÅUb(Y~ôþ¤€anü°5K–¶¨™%p6‚Žà®—‡B#é*¼1 =pQû²ŽEIan·P‚Þƒu¥;Ð⪎÷ºÚ6çãø3Ûñ:ÖÃq ¾„qµ¡3/ùqR›ªâ¿ÎÊÊŠ²ÊòÒÛ1¾£6£z‘Ämpôn'7&çC¥ÖvÊo9Ôõ7ž"~U¼€ñ€©‘Á~ítÄšo q5d#$9ýÀÌØÙBz|Y©ú™0Û¸yŸéD¦†¸*ïéB43g±;–vä ³Ü+Ñ„–•®‹ncŠrÕ,âªcÙÖéoFŒ|$ö;áúý_6z 8Ä-øJa¾~¸®TØ=EZÚNÚŽGOhÍD¤ïós,ý>;è—¬“«XƒÊqô³NCú欌™Þ.¤ûêŒí;„@\nضJ<ãêî.CŽY˜°¶—¼y_ÕU¹´PŸÖW ÏWy E‹âƒ¢Ç·Nß7%F—ø>¬RÞGŒy*bÄÃÌ2¡}ÒÆsIÿ”ºõSŸ›x´òÂ̼ð ›yl1!°WJ@]YÁ¨ŠZ¥úS–›„G6ükÚî)|Î’çßx=å&>†îBØ-®fžñúw­wñàܽÁ€q©È©0à‰döÛ>gaÈ:YŸ±E™?ÑùÄõ}x £§eX–D´­òð|IŸ2ë}×GHÝ9ôÓÛ­åàƒú&‹‹áŠ_ÑIÆPéØ,gÛ\ÉÆ=ñ·3âz¶âq˜8½å /j/ßáI±Øôƒ³ ãNJbÞ•]Ô.ñöAÕÉX0i‡§„ðÚñ8Ä,F?Óh@%ÆPë­¹o¬hû’o¹l Š«Ø-s­ëT–—’qh¾c¹‡G3ZEY!K•YË·¬-®ÂTU²±KóÒ%±Faþ«ÿ/äß*ÎîbÉÍìŠ2×ðl^‹«ÅIa˜«leÜÿ³ìxg%ÖdÝXœ>;ã]Iž³ðëæÀ'FÍø0|ÁXBYÍzU\3¸ëe)[G6›Z—¤Ç€·¬Iè¡Ð5E¥Íwª†Ø[©Ký÷óÑx"H/k07t“Fë!ŒÜ¬^¸œ¿û:«øä’Þyøß1©ph^í¯ÕWþ•ÈØŒÙÞ<àvÈUp·Ëñ5×iª¸ y£e9 z$Õ«ŸWFàrÖ©¯ãõ°CWG>j b±WáäÚ€ANÀP@ÚÌhOoõvÜ[yA&H.%]ªúŸ²uDÒ&©g_Ô‹;©Bm§zÕ"Ý[þŸ°~·EŽxÔØÎT”d’Ò]/ öº†ø7;ø¦Å÷ŸØ$Ë!räciû¦ÕõB>ô~©p7ïÓ”m£ Áö|´_#®®ŠLïx0¹Wha¿ð’ÿº*øGûõyô .èx i|}YÈ‚¼[ÕÕjùqÕh-!®žÍÚ MÍ>\ãR¹¡)š¸¾·á©Õÿî°h€”‰9µº$5Ê<ðNÉÐ>õuc§=POHèz³ÁcLÞ4Ü V¥L2gh"Á±SwŒ'XÀMHòÕ^×Âxk‹«’èrö„·¥YŽ¿· ‘¶yŸAΛ/®¤'oaê{³Ç3n-ÕtýJnãë$ž¿ÙÃGOxAŽvöø“mÞç{Žx˜aÌÚ' 'gÜó:óˆÇ£Æ·†`C“¬Óßlޏz|iÜüÏq²€|KUUÇ\ÓV<”΄£vGüSpƒ!cKÄ€ú¤LAÌ‘¼¨}µ³º•fÙÕáÉ$Ö‚5ešÑ ãN0€8wûÒïej§ è?Öènðà13ÞñX3ŸNªÄÕ ‘Óƒ¸šeW¯‰ß«'ÃaíVq¶T×ó…Ý1‰tU+²ÿJí´ îz©eÒKÆ}¥”°ß¿~cqUš³’Èväöj#R}Ó© #mÏÙV±exhÏk²Ž/ÅV%NT[’7ˆ[Ô¡öVg‚ÂÀÚ¹ªªžZ‰«jï¥p'ÇÉÍx­o@}1]ÂO]¯+•ö“^r=ì=ð¨V°wŒ9×¼Ó…ÝÉ–ï3k=ÞT2ø4A*?ÿ­$ÍJÏPÛØ*+Êdcð´7ôæ+À7”â×2 Œ‹¸„õ{¬ãËbg¼£jÓ\€=W¿Üw{TÖ÷±Í«ocîX2*EÀcaý¥8‹”?z_ºžVóéâ’96+ pä¨Ç,SÛ†ö¼VŽH~Âè­cùŽ•m™%éVU9}ÄÙ’¼Ô]RvŒisÍ;˜©øU]rÍÛ`û„ÉÌoâ/}­¾m¥Z´³2nÁ\Y%tý$jì³@”²}læÑÅrˆ)lkÃ[ÄγÅ9˜™¦(åùéöÅÂß-;µ [†›ß•±[²¸/û!zâ‹Ü.¤‡”Ñ”‰8¾"¸Ï­²xäc8n½£Uò“L3ßrPv€í²”o „"Â…äˆkõ9ý´ÝSt4Ý0°]r ¸AÿŸUŒž¼y¨ušåVvâ.®¦íóšt)LL‘´yˆWã}“ºk’~W{Lû;&ÔíLÌôv k{€0y¾ ²qÏ> ³Ö˜áöN§®§¨¤[FŸoLXãáX Ž€±‚xä™wÔþ+Vª_‡Õ.9Z“—ãrN¹%ÅU uçštK^œ%5nêþ!K87tö _àº?£å†ÊlËYÇ=¿'­¿åý"EîάsVã3 Ó”¹'Wap ÆãLÝ9!~M÷¼ˆ k?óÈ•PÅýd6 ,à,âæ}fñý'~Ð5B:²)zÆûá³>Sùjl"µ/í ¦lÕüéÈK•t’6D– pš²}Œ®êÅz éq¥ µÎË AÝTÙ£E²å†¥¼ÐvB²¦ ü+.æüÝש@U#†ð™µ=YF±צÅÕ‹ð+œ ãSh?eÞNê”휙ý0 Ù{¯¼#Æwd÷K­b—à³’ìÐ. á «€öc½™Ç/0"I2,âjÏÆ?—ÂAâ”ïT“_–œ] ¾äFÌ2dÏ£¸Êã`ÞBB62ªXm%ÈÃ#×Ú᱕å¥HmÓ•]ŒZrÐx#Ɖ[·Íþ°‹;ÕÊÏSvŒwê“ ¾²Íùð4õ¹Yl@EØ!-¸Ûÿ…ô¾Yö‡n–t ÓÛá8 ˆüQW–9Ét1ìA)1ë=DIFlcúß¼Ölquð‘oSÑ{Ögæ{dFàßýüÑþÿÞ˜Çgÿh›­Whá´3uòó?ÄÕæµW++ŠgL½oÄË»ùâ¢ÄP$þ:Ñ¿EuA™Ò̸ø?…õ»fžà“qxAíYš-Ç@x]Íî ýÈkJucøL5PPç‹à´¹¡Y'WJâÖ}ÓqꜲ1¾Wuxciq OÇøšciGþÀâJ¤Ný¾éÍÖÙÎfñóȱOŸ×ºó>N÷WZó5ñ¥Î$Ê !^WƒGOh-;¼®Æ¬ÅüüNhï›ÌÖ¸Ì÷U"#·[“ZÖñeÄ\ž w…q©D“ôh|%Öu˜AnD$´õ˜œô,Ê®š‰„´è“žM[¼ÑÃÒôX•õ?a‰)zñ¼Å5 Á‰Ž=Š«RY@¥>ƒ0•¹j‹«e9‰ ë¼ Çê‘2j·Êʳܗ%¯v¼C ¡ca&Eç’þm9ëÔêØÙÖ%BþöM6’õºŽèÕ ÿ*á’_H·Ë餼*:µ ’&›KUÒZI:ÿóÚç”a•@c÷ˆ[Óâjp'°è‚¿Ù®ÇëäEî…NUâ‘ á½òR l«d;œø¢ë¥$!UzŒ>)¬N(·Í‹ØEˆµ‹÷\í3\ºѤlõ?%®²Ö@"qãÄ®!®§Fñ˜<afÕÁyÉœEئ²ÄhÓÍ ÚÀàpB3Û¼Ok¿ÜO;5õ¾Åk_ô裟$Þ±ÍÿB6Põ»4°šÏ—”é\JÔ¤±ÏàÀ„ˆáËIüêK2'mdd¾]ÓöûIტl©%±ü?R))j¯l6^׋po•¹7a}ož‘Ѐ'âò£è|eöÅôÎÕÚ‘Kí&âªÊuÙ‚ƒ_QZh™ÜFj·øHªZ©-šÚ g¢Æ<¿¢SãJ4M\‘-zPŸ¸Ê˜Gì–•5¾£ÅUƒoê{‹äëp:ã×ô÷y€ÿJÖ…ÕÝ’·Žlx¿¢ÚËz×ßd SwMbÙ†¹—ÁÔuYNBNÐ/9!›¤tøñåX‘Çë%„@*bg‰Èoês“„~žîFO|_‰ó"HwÛÝ ®&mŒ ÇÌlÏøÀO€“JF¡kyc®úÕ ËŒߺ0îßÁð,¡Ç]ÄÕ±3ÚGŽ|Lê¦oÍJÑeYXxmµ½¹¡wq²9iã@">¼sGPŽ!U9TûÄø½%)1ç|LÜÍbf¼ÜåâȺ >…I”Ät™qø_¦ÏK?ñÖéoS ¡}éwæÁwé‚€:'¤læìtÚfì¡î6Ëo•f^™°Þ›–fØâÔù9å±àKèÍ¥Y­Ü"#pÓ'a=&mšyd¡cÙ4H•÷¬VlÎçÁU&ÙªÐÉ$L¢Ð~71J¸f™Ï¹]úÑ¥Á½²ôRy¡?ò1Ù?åŸLDꮉâ:_ÌáÇe§ë‘E€’‘!mïTI Ôç&uÒª•ÉûzB~VqøP9¢+ú³zw‰OÞ<*U-®²Í­‘æ´ æЪͣÀvÊ”¼m G·ÎxÛ±â?úe´@–Ê1ÎD9jdü÷ø%9êqqˆRA>¬ æ0fê}=Ó¡ù[âzïä-Äs»mûÞ’äï¡ÀeÿH꺾Ë(=pžšT4P‡w̃î?Yk-§J\9ã×ôHÞ:¢ ö˜Õ÷5°Z*Íuº0mït– ð¢ë,0Ë`î vú;(±dZð%À¥W4ƒoø\)°µq`Nˆz ì]—×C{§oÓÓ€Ó˜ís!QŠæiq•µ&YñÇ>“º{ \íü¿ßH–¢hù{aýoƉ׈A@` ‹œ•:ÝM#Ô”eÇÃ$Y2%)‘p3\IYn,ŽpS°1´ç5©»'3¹¬‹”cuÎÀÖ±¢Sô¤âð¡÷æ„nÖ=‡ÆË« âÜwÑIOgüù-?ÍêW!TÇš²m´Q$ë|´æ‰««"Ó½C [/>õ_×ÿh磽¼"¸Whá±$ÏÈù‡¸Ú¼öëÅU0­4# 'Ð06ªéhèù«eR›Dÿ†§–ú Ë:òP‚ KU£É/Wõ:³^ÓËÌcK’†4º$±ng‹rˆP¤ZA¯ë¥Üv°?toÎâ~ hÃ{Ám>·†*-­±?DЧY9¡Ï²ëO eµ¹ÇL@ÝÌ£ =žl©VžŸ†€–åý÷ÏgŸYO E§&ú“í£“$‰%3BÄÄðâ¹ÌCî5½Ÿ¹– >â§š#®ž\¿â'H#¦¥_ßWV”WÂ:´È,Å»|ÉMU•[§ê]mÑB28–¾Ïbîs¿eÊ? ™…nT”ë´œ,j¿Õá¿ÞH7JR¢<Ò ba¼¡erÉ0ÆMþI¤Nôª®R{]vwLJtÿ¿°w€ÛU»ŠsŒí¸t†ÞÅ13Û[T·ê»&2õ8—’dzDs;ƱYYáCïchù‘{1~þad¤G‘cd󖕘¥¢ÙÒïmó?“M°s>¿sµÅLC7;–ýîóÞ—*â^–#bøCRÖ³²BÎaŠö“’Únä£Z”L(Ù r| óEôÓc( l‚É’êÇY)•©7 )rœ±/þwÂ:o˜×,ËI(sIžkÞ>äîŸ䛉¦¬“+ÏÄ ý2ÍãÖÍ0þŠòV´¤‚94WäÓ3yF–mp·Ë¹läÈÇ€ óÀ;S÷L•¥YÔóÚˆaI“ìÙlÜóË”WzŸ€=¬ß­ ‘ŒýeEù–@áÉÕN3ýà,}Þ?¸Ë¥ªÒÙŸ°½”íc¸ CZêoJ¡ÍC£'¼À d_Ê“Æ-üªFŸKò«*©}Ô CGçuñ2‚zý"IjhN}M\î©æ{úχöEßHžðÎÅ-ø«c¨“·Žö@Ö‰åUâª)›®2½© ôqZ·¦òD=—°¦»Îë¾dâƒáðŒgS3‡Ë1œµ^Œ@ Š«X%ëEò›YÏe«nŒ¸*¯Ø,̃ît+E¡›lhß6Ú±ü?LG„ðn¢ížb(Ôe‰$òŽXŽÔ50#|AÊœ­ì,u‡{]Ëtë=ÿ­Ȱèø-TlÇY'¬÷v èÙäp÷ÏíÃ'¾l”@5ZÂ/0°|®UV ¤Y¨áN£+8òo ñ¼îc©êÌ8X„ eZ¥Šîä6@¢ëkóÑrM[̃ï’eÕïVètò–á9!ÒÚT‰«±Gp&ïp˜®eò+ ½Tõ%ªÝ:ô†%êõ…ÃÅB$!¶Ã½B¥dU]Ó]"©ùŸ›¼¯quܳFBiú€â¯")å) H] +•“_Ǘ霪dÞ‹° Ùb=æ)ŒpðDZ\Wë83ã×\PÄð!÷¨âV•Qcž†õ5Xy„~BÛ<7ÇP>¼–Ÿqp6c5þ9ØÿoÁgmcN.mèîsŸ¼Xœø"žHwŒ‹ÄÎþ0¸ÇÕæÑÏb–@èhÌÏï`$¸9½ ·.€¡“XxêkßÒ“²ó¹EªyâjÇC)ÿÚñ_×ÿhç¯}´ÝÖq¿çª+ˆ«Ík-!®:ÏdÈàÊ ZèÚJ³âqè’üZ\pìK¿öáÉ€ Ñ&½\ŠÿØêÊÂ-†5r“¿Ñ@NYŠ«Ž|Œ(#'tSòf‰6 Á³ÇÎù(9Àèæ›±±±¥e5ல¼DΟÎzOûŒz7D(¡sû4·IòÄó]tÇ”qd*—ðkºÚ2 æ&Æç|Xä’<„¿ôÁkzà %µþö±²ïnì3æ!÷HaŽía}Lz3ÄÕì3ë„Ho˜´Ù‡ðÍ©âÊŒÃó¥¶‚ ¯˜hÇò T~<]¹5´×u k{Òã5¨[“D|é1PÖ¨ñ­ë í³Fgà*ú44‹’ÓøpÈ•âæqîk‰«åùéIþ˜Ç0ëi¯AÎ++è¡:¥•%ãh®Ê pY¸Ïý’ëµr ëJúÛ·øU] aÙ.ùœå´×1©ì\–›Öÿ/°ÖÒL;|IGˆj§Ö‡µU ~g¼ã‘â:õNƒêŠ$Ôq—‹¸jÚÂT–dÄêø„± caÜ Â7æ+/|—ë@àÑ±ì‡Ø™ïÊaÒèZ\åjú­‡yÜ+5nÄë*–$~Ve«v¯) ©Ñ×tw¬øn:¤û•ºÖg3:&…±~~'|ôÓiû¦Õš÷~* è¯*üDT¨Ž7–8«ÅU–XþG ÿ{óvÛ6©Áóª7[ªÿ›eö&ëº6þ´lëÂU–fSo‰‡ÜZYRÕâ*$‡ÏÁJá’dÁW8gÂúÞzG„6‘C7µR'›ÁU©¾wp–Þµ5öi°·”ícЧaxœfˆ«0“÷Ÿ1W}ê?'Ä?z|kœ ƒ ÖeÂt¾È<ðN²ÚOæšDqU'ò˜t½[’89+™}¨]ƒu6‹’LÄõÆÇ—º‰˜QÄÕìÇòÿbÃ’7†ã[Cù’· —Ôªv$0eÛ˜PïIð3óÈÂò<9á˜o Œ™ùn°×µÑ³?aä°W[–—¨Z&µÉœíñÄŠSmßMÛ3E¡ësÜè¼:kž¸Ú7¼äñY‡ÿëàíüµÖ‹Nv?ãY üC\m^kqUí ëÿÜMí’îNïX§·Ã¯A%M–T½Æ±ì‚bOœcüÊ.²ÉdqÀ #úvŒ…&5õdÐÙ’|ñ2È I“°Ê·´#ÔD•B„ë{C0œÅÕÊ »”›O’B®.LÝ5Içöù_n5úXñoÀ+lø>ø¶TzM4á,´úÒí ¼aæ±Å*"û¿>ä^¾c[ð.)nþçÍWsˆ7ýûcWÉ[GédGØ!xM¿ZMÙ.º½‘‰.óèb¢E¾)¤±î·Û\¤Ðq†¨¼yoí[¶AËãWv éþ’gIeLjüæd)¤NùÕ/®BZX J\m¦§Sg‡’°&ÝŒé£_|`¥‰_ÀoÒL8”XŽ\s쵪òÎãÕîN.k²§c IAÉN'‘íÔTQÜÛúÜHS3‘bCÙ3‚O®F¿WålÀÑCL1+Ø‹`íË7sû6½kã‰Qu›Á_!‡³Ž­†îéöΡköa^È®ER:m5@8ü&kâͲ C1æ˜wþ£ÄHF=ï Œy ¹bÆ=4¹ ƒÇ¡ õâ¤gªÎl†Á!ÉŽìí$¹ÍüǾy¿¯™w~ÖX+Eì¹é‡ªÓ¥ICDx|“T‘òS͹LuVÌxù˜?“ê!1o¨•Ѱ¤>8¶Æ ëZ–ü-!¨©×L˜R;uâ-Ò ’Ö•¬}³ÁV)Å¿ã½hIºõŒ>oqkOîê Œ\Áo9û×'=*O%œ˜Æuï.ûÈÕÀ$(ä*„œ•óp’ ƇìPÍ_êðzôùJÀQrMt¿•¬ú®N fÑ(\)²=îÃù—/B¥ÈãE=CŸ*2s" ;ˆvFÀ¾‘,+[G#R¶»#WíÔ©v’KÍâL¿›d§9ï¨/p ‹(þ±G“ø(uìý?IF>W¼êÌ;Ÿ"W¯‚¯'‡£7ý NxÌñj’ ïx´ÈU8Öêâ4`*ýÁhúU8Ô¾ž*•NyÄ׈¡ès»Têmp¾VÇf’ø’sïRÂ2e†“¤ämõ­äü ‡=·nÆG|’»}•3+è†\µÖÑ¥²ÚÝ_­Þ1«fC«­Þxd%}øQºî ¬qÇö?râ !ð%C®ÒÅ}è:h´´Q‡ÓÒÛš-3þ»˜æ‚9î:æØÿcMèç4Â@ax=m"bžh”q‹(æMiA’Á ¯-ß hGQƘ«É¶€L“T²ú#ÜÎí©mCA¬`éK’„Á Ò",+ùæ$«YÝ=ßÝ›b:ºš¿è?ŽZ3€âV=·à føfþ‘šs;œ#…¦*a]œÊ²`.ƒö+€t>9UËÜK¿#±CúHr"i¶f×ÔóäjnäyrñÝÜG`‘p):3µïÎcšSˆRaÓЄüœ÷`B-ŠèΓ«©¿ñ"Ÿlµšé}JtŽSB¬Å ww9J„\Í_ØåÞ8SãÑ•¾Ÿ_ó\¥Ž½®v®>ï£`Ž`ÿæÔU'EôGr ­ȤŽNÀR)Óïòû.’µƒ¡–ÔN¿Ž_µ·¹Tót"Vú(7‚ÒS–!8&R´Îiµ³Ôqòa²¨*É$&áù‹âØ B÷¾Ìn'gÕÇ\@E×q£?·ÈÏü `°Á(±§ÜVËÜCÇÅdk}òP}nLE®.dŒý?ú¥L"É$óFuIbRüÖx8Ž.U–<”ì—Û1©³‡; [^7~¿ÜT%«˜~wK=áÃ1/xTR]ºÑ©2Éá¯b´‘‚Ô]T¥ÁHHÀ¤ÀÑÔ”»OÌ‚™,~–‡=ù6ŒZ"x‡åGÇ4î•û"š]S¨Ä•$5‚hô¶ÅRÅŽøž¨bú¿¸s"µ¡Ï“«ë™ãÿ*Yó 5e•hëD€OD(Ù3a²´{gw‰0Éa‡¸·1z¤Þw*#ì/˜JúÝf—=õX³Få9 µ/édÂ1¬É·ÂÒÇra„ØSþ)[ÿµKŽ 8w@L:”8Dµ5ì|ºW³Þp(† J õ¢ ]U°bÚø?FÞíÞTaaÝGÀ£uþJ"^ñ®!©¿G±ðÃÊÓ«ŠRÑYðÈUÁ’—̼‹ Iñ‚X‡Íê¹±¶A\èvÏIS¥ +šdüŽ|²>ïIq¯êÒí¦HFÍíáX¤ÞDÎÜY‘éÄ:L ôJbQ–‘R€6ÈA“ —–˜N¬eŽ¿IŸ€¶Óop¨úòŽb[%ä-xC”y±S5À?¬:´Ått⋜ÙÑdM&…™üLaçÿÀ’ÐTEƒë„Ë_À «Ô¹Èr•AŠÚO¿[µ}œ™X¸ì5’·dñóT™æo`9+Omh¹°U«†$õìÐirxUýÊùB–ímt® ÇëZ@hB®¦ÿîÓãØí˜©éiê¨Ñ/ÄP¤µ”¼¢ŠzZ³{ªpÉΣD¿ÍAÉó Ð8)«—0¶=ç̼¯žÖ¸bÚ]øÖ›u–ZÆò¢?gŒñM1ðk0°@q™ZVÖ5‹Ê€ûbÀi#`Ùhvv’Ô•ýgeê¯xR8AºÀì¹(þ]ƤH·†Û©*x€ ¸8•9Mâ\Å­I¹ëó–´zA‘>rµO< fÙ­Îô‘«I°ÈÕZÆîæ:­[œOÈÕÄ/ÁçŽa„aIX“þ×O0FÖdó¡ÝÅ™ý"nyò0 =í¾yûÓÜE»g6A¿@Œ5t©@V0›0žŠM?Ðû1Ü’«ˆ5h7HN³)ØI’Y{ÐÖ]ybæäˇ ú¶™Äˆb0€òØá7 Àx2©€Ò¤/Éö}óõ£™ú)Ó†»=è‹4™$pp4ʈEH¨Ë9_*^Ïf’Ð{ÚZ¬µŒlî܇z!#S…Ê!6‘>WÎ}uMY–ɱ uŸ“ú>[~u|Ø™\m³‘BØ€w˜Íp8Ëœ>ÞR>ê*D²˜zeÆè¶ aÙ¾µ? 0äCJ‹.w¡vÏ,çDØzÑñª3)0b3î!å›­u4oÀ™ñ/ü¿s1; ')Ó~w?Ú)rFŒ;ïa’ª1ö-qÞ*½VEbØUƒ ™c®¡7´Ôéê’‚eî*°““¡ ž  Ÿ=O®& nÔúZ«ýRÊÂ$àdݾç?¡x aÀuhEõÙ B®^Ʀj%@¦vOö#øgWlþ©s@ÎÿÎŒ²3×*3FՔçE>TŒãŒPQÂcZm6]n©x8úϘ¸:™¡4iˆ§žÃ4‘ÍÆ1o AˆÆìˆ4vÜA“«ˆ[aÖ¨j§uC³k I@k’ƒÚ©Š'¡‹J0Ôóå]Ì\r`Ù÷׎~‘«Ý‘óäjÂ`‹¢G³kUçâ5:_‚)Ù†o=írôE<’«Þºd@øFkˆ må®B=½A®ûç†K•¬ú>ñ » `CJÒ{>VßÁ»F¹u4]Çþ¤zNùY? òäzrhtêíX8$sQ‹M¸üUéÚÏôyä€-!W,*»¡´¢ïØSn£öØ4üJ ¦LΙ}?ºë„ö.õqìTŬJBX¤W1ý.’#—䢮¤ÓYsç>L’>­ù8¼óYc;M®F>EvʰAngk¯|½êZ“\U¦ÿ.\þº™›ïøÄGrÕ‹´ÆÙ3ÊÇ\Í‹z*(¤©ï *Óç/©ãäщªÏ¦Ã«ZdÅᤨâŠ÷¤ë>3\nÕñ0é³²cÕïÁ¸U—ncMº¹òÔ·´p—bQ” ÎÂü:òü8ÊÉ_ü‚ñ誠̋ý¹ ϫΊ€eƒÖ…„\5YiÈö7…¿Ò¨f¿03;†EäÖÑä*€"à/òIÀ!L„0º?L41A£®¯ú@û6°®£®âwÕöqžJQØ ¹š£Çw,¹)ð[½s0¶ÀàËS~òåYÐØfÖ”gAqMÀ*ãªâTR¬jÚ[x ž„! œG_Åšx3­®P`Ú•o¾æ#8ARr ñØX$Äì0>]®&rÊi΃òß“cPë¿ÖîQÂÓ5jXðïpµÐR*ÛŸ`™û‘̹QtbpRm³b?E®WÝ=¼äjmª«ÈÅ2&ÿS¶ƒˆ€µ¤”oúì9i¬•%}…G󦯖S~ƃ“è=™E°\íOÒG®W‚E®zGɇ×Ã?”#IbóÜ(šõÚ¤êÚ_Ðawޣܹøû§­ÙjD<»â= Àg[ vÍî©üEÏÂP7HOË“‡ÂÿÒoöÝ’«0’äœ/7Öf1H¾HºòþŽ†Í™‹ˆ©ª(•TNù !)ä=öÿ0¤Š”_à×½H€â0Î˜Ž€ÉÕæ5I°c"yŠ(cÏ,}Þ’Îç°HåVþaÁ’.—=«´8“«„¢¾{^‹âœtýWÌq×\‡Nä*a¤ó—v‡\EŒ@JmÖ¨H>¢¼%À~œY÷«¶…©3'8ÈU¬ÊæZí¥“a£¦,«¦|—ó®x%Dâ4nD€Ü -ÂÂǰ—¿!Œ~pÔíi# juæøÉi·w!DDÒaÌÂØ·DqïˆöÅèÔòê’­·é­›€ptžBä& QníödVå©dÎÌ{ «£±®ªhKçëèÔ¦ÉU@\ dŒ'süª­cê*(ÓG ¢û“|) ƒ¡“d«Ÿeµ‘÷/t•1éº/4Y“)rõ¯$ã·çÎ×qò©:jÞ‚'È!µéw7ªÎ ¹z`!à1göýŽ}‰¦ã @馉â•vîh!;dÅA9%zII䤹U˹àÚI °¿P1÷!DdXø__²öS,½Î…?¼I–R˜H%¬¸Š«6³Û=™MUr’¹Â¹Z/:gÁ ºø¦ÌÞ‹äÅPäê_ áb*Õðùñ±Tk÷Ì„5C€)ß8 ý¡-¾‚†“MyK5lĆÆc«¡ç‚èW`©ÚšXãoB€IvésÊÖEvCqòHi§9a=b„±`;ûV|Èÿ¨(þ¹¦J{òmž?0Ø YpcßìLãЂø]²úC1¡ïÂâàÎyŸ`¨ÝZòEt9ó°¢wåruæ½°cTgÞF÷';šª•†‚Xfø ²ä¡tÞ¼GHÚÕ°kØSïÀÀVÌø—Ö©|•w>Ëa^fÞ «¨Ü:PŠ*“D}ÛÞ¦Ý;‡1öZÅæa9ý W“‡1®eGüC·>z -Kú £$ Ý.:sô0PºÛkVÞŒŸó¢žÆ#×”ga@°霄.BÈÕù)SsË­I×}†UÓ¹G‹,xäjÕ™MXç“Qÿ5UɺÃÏ۩̆‚8AX;Ê.²Dú.Xƒ6“S`3H’må9’0sÑs² ßÂ’c25*îüÇ=%]!É.°¬>Kå· ¤’o£ª!îØù}¢éØj²:ŽºIØœ'W·üÃÈ|ШsÕÑ^ÚòÝÀuTrݼKs½Q³kJÅ´;(_ö0<[:—&W[­f`EUÆhØgÀ!€XRÒ—lžÿ3þ-\ö*,‰ƒ`‡24U)¼Da¤HÙŠ÷Xo–&}Ivª·5ײöJÖ|윈JË–@ï\êúYjT€d„|+gÖ}pUä¤á‰DL%\Ü%,‰jëhªôÉrÕnG¨ÓI†!Å’¬)ÝŽà…5±b@h˜²Š©w4îUoqSà4àý?ø2’ÞúݰoÀü%Ïcᘠ×ca^»®¯¤Ë™K³£xF\Ÿ&W‰[ðÙGdÖ2÷’w¸“o—í y˜aíI:åô‘ˆ‚©aYív±Cšj”ŠÍ?°"n!µÞz2Dí#WûÄ“ô‘«Á•^!Wuˆ:áß/’«TÅUš\µS©ÝÛRGtíÚ½³Éá)róêò1WköÌlkñ áâ•%¡pì0qˆ»uÔk>’ðsåûªmavä*‰’‡9“=“þ^U”ryíu ¹˜ùʴᆠõ@É\§dŽ¿¡;T™6‚”ÏXø |ÀkÂ_ L®¶5[ªŠÓI¾ÙæFÀ*õÎIÆ‚87¥ÒI¥ uçcJ—¸ ä¡ùZȶFw»žÜ pÂgL‡ãC·äªáà2‘[!™— b›ªät²wæ¸ëøQO«w·ºí|‰´5[‘èÝõVM0â<…4ñKÄˈÝ(E®"ÒôT½–¹¦Ožü-ì›8þ]aöbRRUœ&¥Ò’´·4‘¢·”UD8)OJһ˂ ø‡à¨QÍl2Iè’¾M=YT4èR}6]’ð )0tñC{ƒ¸3ëßÕE[ÈvÍý‘ Òó5¡êÌf·y iê;â˜îœÕ Ý-.f¯úQ.îL®Å’ª£ÿ A’P{É)¿xé’«Wªô¹ÚPI²%~‰8·²0‰$X°·sæ<,AXôq׋W¼XùZ¤ë>“oúÁߢ`5çvÀ2®­˜vû»±á͵ZCAŒ'rZ-XüâMLJyvðx^a1—á WíçkFLÓ–_aU ºt( .MŸ·˜”Økm²Eú‹D±oÿ´55àRdéeE ˆÒæÌ³¨Ê±Ä¸s‚—-½æ\fgrµ²p=wîÂÅÏk²gØLÖ„~ÁÝ–ƒ¾‘ Ÿx:;€ ·ºt;µ)è.fø¬I·Ð hÄx8.°›bX¤‰_81újaÞüÇx‘OU—lõýì •St¢ EÚˆ:îAX-X!Àcçî~«v;)áû&l?ò)&•ŸÙtbC½s"Ik?þF8#eúïT®§óä* ºpùë$íXÄ-œÙä™2u8wî#Œ±×â'¤6Ö”¢%y.¯¢èd5tRhIÂ`t˜9ño¢ø÷êØ¹X8€åpì©wÐ1ÂôCMU //ô ëGöIÄf­hÑýé7ïîÉUÁQùæŸ*Om„í…+©)ͼªD]FR/:®Þ1ÑñnPG¯Á_ø ¦•$¾Ëœ Ú6–¿øùê’ 4†¯‡çê|¢Ðg±cŠáIýÐf+®LòºM no ³kh…œÛ;ç‚—¿Þ‘IÞ§ßR •bË/†ƒC€ÎäªEÝ9K …Ø™”ÌΙ‹¹&ù²g ç=zÂ%¸ÒnowðT“»Æt|­DÀ&äjA,u(ì;„ŸÚ õŽ ]’«õÂãâ•ï7ÈŠ‰ošø7Ä&.Ùâéó—H×}Æ›÷ˆËoûÈU{/’«$ƒtn”lýWMµ€ ò^ÉÞ¤Á ¿‘Лc®‘®ý̱A:‘o†uê/¹ZÇÉCÉžz{Åô»=íÛl©7!ºôD®’7eÛÇ!Òô…7£¥¹FEmJŒ¤³a\œ ÆnݾùfþaøÊŠÿjªÑÐ ­xÅ{tAóÕâìífN¾8þ=’5άgO¾Íf’béÁ¡×”g5HN5UÊÔY“ ¹ºu´(öm3•õÎ¥˜4àÎ{T“5¹'ÈU fS¥ÜÌ=èq?úÔ֬͞Q1í.XL)PØ=r•¼FYÿu-ˉ\m¬!ÅÅ8ymL“dÍÇFR,/ìb[¨úth#\þ½ƒš¤$ztR—3ÏÇ£46£X½}%Yû)þ¡?°Ðí5ë…GK^ÀÕο@\žNVlù™”Ur×zÒfÕTrµ¹N+Kúª–‘m§²Çcüa´{f ºU˜Éªå(Ó~‡ÛræÉƒ""*‰áÐr̺ZuzÖ 9Íçá-°«t*ãq4GÖÈ Üle‡¯¯PIA÷8„…,MüR²ú#˜»ZÆžnªM`0¼Ý ûpˆ+‰zšAmÝÔìšâ–Iv&W‡ãaŸ«K¶ –¼»]>úÏœÙ÷“müóó›\Mø„ª:¡¦|w[³À°Í9Ôò\%Å׎¬€7D°XHŸôÇjBoòÃéÀÓîBè^è6á: º?þ,~^±ù'XµŽþ3ID6õv«žÏ™y/L+)¶âu ±>)µéôqB®®úh5éïxðV$ ޽¶´¢R±Áñaá¨2Ãk.æC7 iZM'Ñ=RgVrª¦4S°èyæÔ»eÙóìÔ$UÆ(ÕÖ1>¢th\?3üzŒ@êO¹Ú'ž¤\ ®ô¹  °G(J§]ªíár¡1}JÅp8Žz­ÿ8ÌL.0j wlk!dõ-ò³’5Ÿ è®<• ˜AŽ«D>¥ÝKÞ.¹%WëE…ÃÆ‚8’‹ìØy)T¿Œ¤^tÞ ~êü\´6Á ±&Ý"Œ~™Þ“Œ8 Zû–Yp´AVÌ¢üT7ÈU’WM³s &‘/&Ú{™éËH¹šsž\źðë$8)Sb«o©7:ÆwK®vSÈŽƒËÑ7²m¦ šUÇ…Øô¼ÀŽ•…L:m Òí›/^õb˯nU´Az¦A\ØRïaÇ¥Àµ˜õPrÞöIEå© nsþ×”í0 ޏ=Ô†h¸Q™:ܪãÑä*)vY½ô©eî¥ëÚ¸|Žg©<µva #ôb'§¨üQüD°äE€mİ0ˆ[)¶ós,XFØ_`m¤bÕfCDè®Ú6¶©F…1¬*J´ö^CªA|RºöS3ÿsüM¼O£û»l¸²0z¸5ËoU úõ‘«½I®nø¶¥¡3+ßô}«ÍÌ™y)±àqøt„~þR£Î€\…6BÁ*¦ÞA‘«zn«¯«È…êºý«^µ},{Úš¬oJÈÕÉ·bжŸÃçV—l³(J* M…I³FbçÙèóŒÑŸ˜ù‡aúškÔ0ìì©w\ÈÅa"fÃçšìˆ.1ൌl*w´«ý¬:³׬˜q¡ïô<¸° ¿n#tb‹Õ;¤Ý3 }ż)XòíL9³î« ”á¡*yý✓«QOÕqòbc4`v´{fJ“†¯=õÍ.’…¯­ÅVu&…¿ð9’ÇoüM$;ô˜«}?Wn3IÕ;#8³þûÚô|ÄûŽi‚èsbœuû#ÉŸô]]°ÕZ 7„ÎhvMVlùÅ¢(%oSƒ†»=õÓÊ›ÿ9‚±úCO;6•eÂe¯b´é Ú^kpû21(" ¹JŠ­û¼¦ŒM«:½I²êå–_›ì&¹ È$ ·åoÑÞ®Ÿ}÷ÕgÓµ{gò—Âøru΃âøw;o%í Á¯5iÔr7`•ÎQyr}°îÕT)3ŽÇ5Å+ßǧR-ëˆBÁ¼^È9fæð>Ëû© –¿ÔíÃ:“«¦ck`{ m¸äÅzÁQƘk„1o0'öÃê£*8øÛâ·²¤/q8Vx+QÜ€:g Wb:¾V–üíùO<ã·F [ž<”=õvXt~¹|ôU0_ð>ºÜHbdV} 5®˜~E®^ÕÒ`ʯÄw½pYüJ±éî¼Gh{ΚxsMù.R uÜõ0¼Þ´.g)ý FO$Yýì*RÃÁhrÊÀn7óc|Èe'ýNû¦2c$@8ýsô„ŒÃ®)XbÜy —¿GYUœÆ[ð$sú½ò½äÅ!W·ŽQgŽ÷Ѿµµ6IÖ|ÌšØ/ˆ›ºÝJ¹Ú'ž¤\ ®ô¹êVPœy¯ž>B!îüÇï„$Aúå+$+¾†í8® EB›iw"´A¬Ç»V›3Ž ¡œUǤ¯˜y/üuwÈU›^€ù2YÙÖl‘'«*Úâû ÙK\ä*Æ3ç!DXݼ`O«H€%„÷«’èa6Û[›]Šb\ŽÒ 9e<¶†œ?"t¨ •#TCW›%ÐL½s7}’FĬ<‘¨Úî&'"t²óÁ"5sþ©¶…Ù BÄÔT­‘=šš)èRÇɃ]5q}/üi:±N‘ú›&k²#•e{«Íßv°3$5îÊÈ6¹]SɆ–£+¥‰_üu³&ôÃR’ËeV› ø†÷m®Ó‘ºôeYìÉ·ÁFySééú!µ¬½Œ°¿bñ¬zžsÀ~Õöp{>.¿ÎÚ§óå†|B%½I®êóË7ý€ÕT]²Mšôæ7ÿ1€ € DjªÌp[72ãÉ7~§Ìå¶FikªGhm<Ÿ¶ÑwеΌ™³´˜õpšœ™÷¹-«çVškTSþIeÃ`;“«¸@Ö§}G²õ_±§Ü¦?°°¹î| ézáqéÚOmz¾Í(æÌ~À…1k6tûæqç>l:±¶Õfvk«‹ÓœÂïÃ~Z5lD¬!9Ë ÏâÎ}D±åiâÈÕÌ𘎭ùuÎòJ‘«OÃÄ5ª¦Â$Ùú¯Õ™³—‡]+Y÷ÅùÍ™öö’ˆï;æø¿’$dïÙ5ž¶€v–¦*…6{f¡Azº½Åoë<’ú¼%‚¥/áÖ¾?!W3F1ÆþŸéè*yòPx:}~4,gué6·)ÄÅñïªáÑ ž ae‰âÞ¦ê¬uñv8ŸlÃÞÞsèZ1¸æÜÒó#+Ø“ÿA’4Æèæ63(À’`ÉKŽ,!Ù±Ž®` GŠ Âª3)mx.·§È{BÌõõj› ˜˜Á¤!A'WÉÙÕJÖ|ty•T@êE'ø‹þƒV¾q˜§ôÎä*A›ÛÂLÇ„Ë^µÈÏRfkÒͬˆ¿CŸ}_}¸/bgñŠê]S`%°ÀaB¾uùv`9ÉyE^Ày),e‘cù¼({ç ú#GûÃþ¢ÉžŽ`&‘l¿É¯„Ë_£wÒäj-s¯dÍ'¬‰Ƽ ‡!r;¬oüMú¼E4;´/Ñš¬)°áXÌð ‹ŸÇ5U™ãÕYhX1ã_¸)ž._Áw8ªñâÙe¾A·¡Ì$Åô‚'áÖ«ÎlæÍœ9ëù¾%vʺ ûC”îú&Yû)$ˆ›ºÝJ¹zQÖ–®3ÿ—V²ÝÐÚö¿ÿµ6ÔÄí8óI¾Âößÿýï¿Z¹tH"Õlc—­ýÈÞ“ô¯žÚ,äÙ­±i'Bßÿ`K¹\ ¹ û »dê”Ø¼òÔF˜5yÊO¤:ɔۺ_V²‘"WaoͼCV—ä›v—± Öî‰\•! ÛfÞËzÚÌÍokA‚ôËW¨­zͲ”«9s8³ïø¡ŽÂ]¯ËÒìžlÐÚXݨ*ÇDksæv‡\%œ^A¬nï8t°Õ¥Û¯˜dÍu:]îB*éÐߺ{„\-ˆ¥7H ¶2Äéræ…|Ü‚%p²×bÝgt–æÀ‡¤oÈI«œ3OPû¼ýŒ–záq¬ õŽñ6“¸¹V ä©Ú>.äƒãß#ð«3Ã;W²ÐfÏ0äG —½FvO9J†Q¯Ûü»…Ý.Š}K¶á[þÂg ¦5U àa„TÕ›ÿ´5ÕË B®&À®··µÔ0vÃ.9§Îè,dÉßVmaM臟dªtj@ÈÕmc ¢_vù­UÏÓîðÒ©æÖûÒ›ä*Ô º„覦l'y…§ç –¼HUÏ!ùÙèJ‹__¾é² ÓC¢HboÇÊE,0–hµšaWy ¯<µÁÇŸ4×j8³î#©Îäj[‹ƒÓù<©|Ó÷¬‰7ëó—8âÁzñI² HUÞ¨añ"Ÿ‚åqnO2lç.äΔ.£ìVÈÞž¹㲊”Ÿ5l@»Ð«y‹±äuûækvF0©#¨œÙ¸­—ç‹T&Â× :>ÁCAÙšjT´å›T¦ŽS>îzyšó!»jÛ8ŒM“YRÓw=›5jÝþÜ9º¥, ‡–K“rE~hÔyr=jª0Ã-lF¡ÛýläÝÄ´;eë¿VlþÉ9•@3Óñµ]¾W­.N,~Q@Ïm‘\…3|U¤þ0€™%%xfÞÃÿž´;—ºÓX(ˆ~%è®Áp(V—3W¾ñ;ã‘M•2,CD[0†½–JȹZÇ9€^!Ê ÖΓ««?’&} ÏÞ;OBiŸä“$ÉS 1ΙIœ¥¹zrƒjëcAœˆÚ·Ì{,igÖ¿™ã®¯-ßå»5nœ‚¹%}¥Îœ Xú’™W€¤©Jé²~)ruH«­¾^t¢êô&O9pð‚%/‘CÛÇÁ¯¹!0Te†#0ÄŠB†…BcGüƒ5þ&š\%©9Ö%Zñ{ꢘ7ñ¤ë>§³¬Ð™QIÆ¿eýYþ*\þš#Á”C`¶Ôq‘¶V›jkÉ/½á[VÄ-pI¸;ËPOŽVÙáïþWL¿>‚p¼ÔWuœ<úRm-¶ZÆîºŠ€Ú=3ù‹_€ÑQy*"Ÿ•ç$ ‚ÜúJ®Â^%#ç)<æÁ’€ÉÕÇV»Ò$¡d­ùÿ³UEn;ùdÂéQœ–ÿµ7qy‚ÁIÇŸÞÄɱý?Þ‰â'Ñlmy–­ýÈžBúWOnríÖ˜Ôã¡ï°¥\ ®„Œ\Ý=&š2¿§ælwÞ#°«p—„}íö{œ¦*¹2ýw`{€Rº({êí¦ckìÈU‹¢Tµu4ü\0€­R’>WŒfS¡ÍcÒÄ/*¦ßl(ˆÕŸJQŒƒ¿ƒƒSCÔÓrµ¹N_©ÌÝÖÔ \öª™“Ål6n1ôùÑŒ1WsfÞ'Ž{ÇÓ¾&?¦£ÈUÓ±Õ˜b¬¯F5½õ}oÕ¥/mÍV3ÿˆ|ã0õÎIݼINJ˜ªâ¤ñÈJíÞÙ~ý¶Az†3çAJtâ)\ÊÓñáKVÄ…ˆhÃë,úÜ(UÆhάû©ÓÖ¬îÜ‚l0Î%Xú2†—Tái±µÚÌøƒ¬ok±Òä*)î€ðd÷4²½ÊÞ^ÇÞ€í}/ ] ‘d ›v§zg`¹K‚ü‰Ð€1öZá²×\~ Hߨ,ëþžóËZz\E´hQœCè‡ø®–¹A)œ÷6á³Ú=³K^Ä$v§œ´2u¸j{¸ßä*Ù¼jéΫ±ö¶C~4 “§€º³4×j¸s¬:µÑ…\µSï.:“Z€Iˆv†;^M6HNCÕ±|,²bÜÚ¹v‰ÚÁäͼª(ÕSjJ3âXúÉ“‡bqç<’ã pOü¨gLÇ×!l'[’Fý #S]²5°«µÂ׋N\üÐN¥J†±ÛmF14Dž< †ˆ~£<}”óÈ÷bÉÓ ý¸sðß".o !Wn6ÀÇÙ6º+îIþ«·cO¾µ^xL²æc,í^²mŒ¬v×^’ð kâͰá$/Á}îwLn'TOèêhv-+G¼ò}‡ÂXAYðÈUòø«©Ò u2¥‰_’Uú³UØÍXª°Ü„Ëú=óXué6ÕÖ1pˆp¸$yÉV^äSÒuŸ÷0öD®Ö ŽÂ„VI ÖHÑù#+aáa©êÅ…½ót!‹¼„x±£+Ä';&~wˆ3¹Zuf3"#`r(‚ÙŠéÿ‚)æ/zŽ9îºZæß3ë¨wLP¤ WgMfMº™”œqoç×”4¹ÚT)¾"µ™<ب¥G±åô sÇŽ¸HB ’fާ·÷“×a£¯Â5áJdë¿æÎ}Hó&0Ö £Ô/#ì²ûtùë0hˆÜ;gÊ{6רkÙû«ŠÓê¸ù¸HUQŠ2}$à+â,@ ÆK›zQh·™$œYÿ–oúÞª­€Ã€ã'°ç/hooµT“T‡ÍLxÅ{Ò¤!²õßð<É]þ–<…$ù1øA|IM ,PJÀ¯ü|”€ÉÕ?ÏÞw¥ÉüãQ5ÿOtøØuÔŸ7&) ÿ­»ŸúöÀ;ÌÖz^ñßðï§7ZÚö¦äÑ¿úË2vY»eZ|nèûlé#Wƒ+¡"WaÅñ9¢BŠî-~ž®Á ‹Wuº»¯8'êGA7×hlF¡j[,jåI²ýÃ-¹Ú¨*GùÆa¢øÐ(f59|®Þ6Š×%C\Þr›©0©RÁÕ‰È.5«ŽߤË]Ør•:ºб©ZÁ÷"ßî\í’’³Ápp#ì/Âå¯I¿è2•Y×ÓÑäê‰D$fݾyèdO×»ìeªÔfÏèæuºò¶ŒU–4ÄÒiI|%’£˜w°½­¹ÅRUyr}7úÞ‹²LŸ¿´ó&7cA¬(îÀl’QÖÏÓÖ."KúJ“=]û¦.gž£xb{k.k8CD“« ’S°íÚ=³Z©òfn>€4üŽ÷ñW¤ü„Ÿpç=JÊïn Ôwn4F2wŽãò[’Š­­54‰à.é5rÕNíQ!cÞÚ„XóUW±_’ð± úRéÚϪϦwg³œ2cÀ@ª{Sù—»ó\Æ£«Ä«5HÏøØž«sª>›!r;’«îE½s{Ê?MÇä³EV TËÈF¬*Œy£ÙÜñðr{;"AžÞÈÕ²ü¨g˜ão‚wn!:¹ T ãSWq+þ”;÷aïKÞ‹`4ªK·{ÒŒžnÿÄé€"Œñý[;1¨:½¹‚Ô¡¾Š7ÿqíž™VôHgi©7’J|svûÓ±5$÷g$ˆ™_€6U+Åñïbd¨mc‹<]3È ¿‹¨ÕZ×ýÁÊ7~§Ï[Òs“. *¹*MÌ[ð¤tí§¢¸ŠÍ?Á›sfÞÛM/Üf«¯<‘hôýuÜ|ùæqeôšS]²•õ´l÷½vjÞ¹ ó¥Ú:&ˆ RkcµéÄ:Øyiâ—ÝI¦}¹H£Š!Xú2Ø–S«‡úYÈÕâ4ø,¨«tÝgÍ5jaÌë@³°Ìñ7’î>ë`°f×Tø>mÎ\Ƙk*¦ß íêÌBß4ˆ aoaßUe0/)\*ÏÕ}¬I'ñÂá8è§lÃ7ªmc¡0AE©Í(ÒdM&¬é˜«I©ŽÑW!¬ãE>e:¾£(þ]ØXÙú¯ä*9Ü7éf7ôý¶ô‘«Á•P‘«ˆaèø¸|^ÇÞ'Š{»º8­ºt›zÇÄš²A¸U1f!°zǘßêât»'rUÍTm[*Yí¾noŸø%yã‘•Àˆ Ïy GŒS]Sƒåg'gfù·¬;¨>´Ž½·¨.{µçJ$ô¾êÐrƸ댩¿ºì d:z€\ÒÓX¨Ý;¸…TR(Ýòq ¢XHž‘º}óºy}îB~j¸¢8Ú®÷“¶j9Úì™t8ßÖj³øÐ;!•f³ø¡ËçtdÄû‹2mD7ÉUEÊOúü%Š”ŸMÇçݨM *3ÿp{{+M®6UJaˆt9sé3ÚÀù耙_àåÊ$Y÷–_•i¿ —õ'Õ¢Yû\’ "‚¨<•L’’­ú äC} Jo’«çÅn·êx¼ùéó—Â.lTžÚHöÝñuç²T5Ù3‚^ÝÛ™•§ü ãcûæZ-oÁ“5åYRßÈU¬@#¨±ãÕ¤EQ{®Ï[ ÷ Å–µW’ð‰rµ–‘Í_ü<ÙÑóó"Ÿ ¹ “+Œ~¥ªh 9ÈIe.åÎ{¤–éë`iµTÃ{Ùmˆ‰â°&Þ̘x³"s¢óW6£ ¿Aÿ®ÛhÝ“´XªLÇÖrÕå¯.N­,L ì ¦[û6FxÛp0Úmýq;IÉû53üFcAlP¶YZ5lx´}E( *¹*KúŠ3ëßüEÿ!»²g`Š…Ñý»ÙRø‰¹n+èÏ^/*¤3äÐÕ]ͼÉÚO•©Ã{n´]ĹŠh8´¬sÜø¶µ@ùé’îž6T_I‚…#€);½ÉËgrµºd+à«:k Ö/ 8Бjëh8DÖÄ¿ùå mzAõÙtÄnð§0_°oÊÔß:¿g©<µ®¶ºd;âUÆ(uæxÝþ~.F…=õvRd0~ÐZKCUÕéÍêd#kÞbªfI1M N¾1;" ‹¢T°ä…éiùæ%«?4äGË7~O1«W] X¯¯Äó wötBl ÍéÄPfÞAuf8kB?ôŠ5éfÎ,R¨•(æMVÄ-¸,îË‹z8NŒßj­Åu`oKbñ>#YóQƒø¤Û‘!¯ 7}_1í.~ÔÓ¢ ?È r5¸2ru¤|ãwõÂã.Ÿ“Ô.i#`Bë8ºyPÔEÈi…¬)0é4®vK®Zµð¢¸ÒÄ/C>;W€ü˜ E±o"(0[-^90çÈUÌ2|¥ñp\wÈUÀ ³àÉ¢v&E¾ù§+)·aKƒÉxd%süMä$xöÌîd ©ˆç ¹Šå ïìøëHšô¥,yhUqàPgïc‘ŸÕ훇[xºf7_ûVùè«*¦ÿ ¸Ž¿è?!!Wa{ÑêâtŒbdL"oÁãô&¥žè˜4ñsÖÄ~¬é÷(2;¦×¶Û•[GsfÞ#Kâû&d;U~ºòäzî¼G\’Ðbæö+᪋ˆW ¬.Ù¦Êí¥BIÉ;᯦£«Ú[}Ý‹åEl̼CYqM=Øäª¬F÷·ÈŠH]µŸÂ¤+ÓGâ.L:)+E®JÖ~&Œyƒ3ëß0†ˆ ñ¤Ú½s`g´9s`o£ÿLïqe†ßŸD­ÉžG Œ~Eµ5 7âÍŒN¼'Ej\×b©ª*ÚBÈÕÕz4×öv>¬I,~Qº=Bq<À”•§6È7ýP[¾«Gõ'`rõªy¹WšDRäêá«©?¯_'Sµ×|±„þ6ÿUB®–þ ÿžø[i»‘YrëüÜ«\Öô¿ÿY¦­<úþ[<‘«~I¹êP‘«0¡ÀrH]>‡qØð”÷©›B,69¼y?]Õ-¹jÓóÕ;#ø‹Ÿ‡Gùì\ÒÞÖï)^5~¹²0I’0¸ºd«ƒ\ÅŒh²§WžÜнóJöÉ)à+€^Õ¶° [»D„ìW)L¬˜~w-s/8¹»ÓÑä*žn$ 9tÅÌBœ¢Ù5ÕpÈ[Á#_pN¼ö‹Šy‹W¾ïoµÜ³Ôã¾+áÖUmøF‘ò3ŒƒÍ(îÎ¥ðsD‘®5èÚX°§ÉU;Éø=Ít| }<¼^\äÜäuC UÏ’żÛýÎ.»BSµÂ%ÙWŸÐr«F½sRÅ´;ZÒˆÖ©¹FÝk’­89sÝ\=-0 ¦c«}ߨlÖ —¿†R*øB®šŽ¯å/|¶ºt»ã“F5ƒ6‰zÚxl54¿ó‘|Ò¨bx¡J¤§¥ë¾8ÒŽ¿Ñq{[HÈÕ•âøw©$«=;<)ÑsÞ7«wGÚlõÆ£+%k>â-{]±sšË·µ¬½‚%/*¶üêÏßj«'5ßþ׸ɻn3¬ºÀ·ýc–MÇÖ(ÓFxÉ«Øükb?r(Àç<¡YPÉUx(²yÌ5$/"•2î¸ûx¬‡Q 7{êíÕÅé´CĺëN®iŹÚ#÷âá/zž°puúž¾WÈÅf’—¿N’ÛxnãL®Ö2v+Ó†ciC jjhµšf9³ï÷kç<-ˆ­ªK2Dqïx¢•§7Šâèr£Xþ ¼Ä ¿ž=ùV¬Âv^È}ßVŸËÄçÂe¯rç>\]² ˜ªÙl&})ŒyC·o¾UÃÓí›Ç{­(îmAœ™÷".ëo‘—‰I¿$‰Pr£D±oqç<çÂw]ù¨«€$ÕY¸f-s<>Ù%?`F¿BÕ¾™=埬 ý$'á,ŠR\Jû&>Ö5/òIG¦Þ‚'*Om çJ· –¼ Yó1níiXôyKÐCéÚÏ´g2”å×î™ÕÍ“5]JÀäê5‘®4YtraíKö¹–úó¦õ„\M{ðõ²«ôÜ-ÔW7®fm1¶Ô4X¹†š”ã ¡Ý2}M^èûlé#Wƒ+¡"W‰mÜ7¿—×5Õ¨`±¹s²RçGÜ“«T²€XâŒB=;W€PÇvÒ$ ŸØŒB€RÙú¯kÎe:ÈÕVk­™{Ð"/îfÑØY1¼›vï,²·Ç}î!! 6Om@,´éè rµt;Ö²|ãwÚìé!¡zTHÆÎ‚/±}¨º¾$KºkŽñȪ€Óý]yÒT)k2I\*m¦n‘«]Šƒ\5]阛Ql:žàÝhzU[ÇŠóé£BRîür—«ˆŒŒ‡ãRÅÐiZk»YÒØ@Ÿ·¸©2åɰF¼ìuóø–jõމj¦L"ò…\­.NEl[S–åø¤QÃFìÉšt Ì»b˯¾>vµå{©KvMÅÔÛM‡Œ\]ù~ÍÞ¸Ž½=éÑ÷ mM¸EQÂgŠ]®Éº1ŒÕÕ;'ÙüIí½Eÿa‚Üæ]‡b·Zj|¿š‹È7ÿ@¦8õ·ª"Û®0¬IïébÖAYPÉUX~ÖÄ›ËGýIÝ¿¦‡w—u_šª¢¸·™þ % É;ÙÞ$W-²³’5ñ£ž¹"ö¸HS•œäÍóZŒ¯¹ÊÊQlùE¶á[eúïŽUg¶ð<^/<æïÝÛ[lj†—W0•§7 —¿®ÉžÁž|Ùé=íNX~¬ššs;žÿ¨.NçÎyR1õxSÁ$ —½FÞ]ÍÀ ¹QìÉÿPmG“«¢¸w‹Ÿ·(ωÉÖUuz“™_`8´ŒùcìµhP>ê*EÊOX›ü…ÏÖ”g5ˆ ÑŒõ´pùk¬‰ý*¦ßE¨Úø’µŸ¢}üà~ªú)ˆ~…õ´ãÍb. 2`!.%Œî/]ûiç”V1]Í_øŒ.gÔ^£Õ6³@¿÷p0¹zâü>¹²¥\ ®8xHoªjljq+Ö&W¦¹µÍScZZ;Vmhk·»mV)*6ñNÔ×Vâ.·°5·z¿nàܾ¥«.µ´ï©¸š¿”3ïQsµŸsùºz‹KãZ@–Q1í.Øð‹]jé²Kö“àŽ]u©àÁϽ·Ç˜¸ŒRSW]ÂC;·oíªK˜Y—[X½¶·6»êF“»‰€—×mç'}‡­,ÎP¤ü\ËȦÉU¨Šß]jvß²JTT>ëQaÊýþ¨6§4ïÁRW‡ô¦ºÚ)~ ªd7aˆ7ÝèÜ%/ºak†Ú»¼S覺êŠwÈvÏå®þ\’9µN/ •ºzovîR«µ`¯©JÖ}uÕè •¦¡®ºV'iìIë*u%]êÒ”¹S×sm•¤´V#ôÐ¥àXW¾H\]WO4öìN#çÈÅ.u¥®è˜8c|é¤Û%™S,–†KY]/v)xÖõ|—º¡®4¹ÚËêÚP_«/ÙU4ò/ús{êëSW—.i²&+s—ÖjE^»Ô#`7­–•ù¢®.Še»TW]I'þ#Œ˜C7¬ZŽ|÷¬ ýÔ™Diaõ5?Ôµ…LD^*Û5û츿•NºƒŸ4Œ½ü]K£¥÷ÕÕxt•$a°ñl&ý•‘[;°’_èI]ƒb] e9 ßvÌꬮ² ßèö/hª’ûn]I~Îò]œyÕ™TnZÚš‰¸í’ØU™1pW±ù§šÒLOê*J]2évõ± ½]íA°®<¡¸ÆÜà—ºzEF;â–òQ¯ü€¤è¹”¬kgu5›4¬…¯œ » ØÌGuõ ­«wu¥ÉU­«êêb]«eå‚ ?0ü§Á\ã¥K—¸ºzÓ 'um6ë%«?2mõÒ^(–Ö7œÏqZÇ9 MÂ[òŠ(uŒ£¡|sÑË&îÑ ««úøFæ¢WDãËç>Y<ú:ö²wŠG__ôû5š›,çÓµµZk«Îlâ.|®"æ½’ñ·ÀNZ,Ä)˜Jc¥ðtC]•Ù¤VæDrç=ZSžE‘«÷•¹šù D 1þúïõe{ëkMFöAfäógÇõcF½G¯HnÕóH’“ÒíÕÅ©’M?±£ß*¸ =)ÿ÷³cÿ*Ü2R”>Ž»æój9“¨Ÿ¥V½s’$ácáatÞÂÿ8ÿ!Ö°º¾t7{雈nª¤ç<©«æÄ¦Šåä{+«%2…wuõqu_];Ï©½äêÍKöÉ•-}äjpeQBÆÆì[–¸•¬#å.Ž£Œ¯ôÔ˜¹®ÃÛCcM½÷ö'®»•rOWxÿ‰ 4bK´ÞÛ‹Tç“ ´˜õ†CË‹§?œ‘vk~ÉŠÔý©¹g\§îÊÛ¾l,kÒÍêíáŽ[œå{¿…ÙÒagˆ@aðÞž#í°§±©Ù{û¼3\—Q:Q.òþ“ʺ)ÄeÚ*ïíË…*çö0ò;—yi¿·Ð5î¶ÌM˼âÍ©‰± Ò² ¸“•i#j™{hrUmªõÞ¥bŽÜåÙÇ™n[¦dìˆ9 aê7†ÃñιÓÏ]ÎêJÄÞ^]]•¾§ÀKû#¥®iü½©+¥öÕæºá¯ºZlÔucÒÚµ‹§ÆOü"!jBúÞcAQW©¶Òou-8uume‡üÝW× »Ž%î8ìø³³uíR]z?Õ•ézÚ½KuuAkl±Æuýïk¬ÞÛ{R×´=‡Ós޹ý‰¹±[ÖÕ¡®«ÒlÙwz+e.¶dæ8Úçu¡®©Y"'DÿôºèYΠ® a‡Óè]ªkŽÿêªsQWcêzÖgëêP×ö@Õ•&WQ×S«kF^QÊÖK¾yxËÎ}pCAQWÍ®©;VÏIÍÊõò¿ÕUæÍº^|œÜÓéû }QWY™ž««ì‡Ü­ºnÚ´iÕ´6&¯w¨«UÏW¤üÌ“xãëNHÏ9îºJñyú¾âbG¾³|ÄëW-[=kÄÖ¼¢ÞW×Ê“¤‰_Έs<éÊÉßÂxR×À­«“ºnÚ´yÅÌá«MwúI)­®ò䡦£«Z̬ëù<·ím-µ¬œ3SHßW軺Båy¿ÔU³kŠ4iˆ|Ó÷uì}|êºf~XÌïooX·ÊGuuHgu=^d0ÐÙºfœ[™–»e¿+¼¿ ®l·êêEÊ6¯˜~wù¨?ÉÖݨfv­®ÜÞ³®´œÔë.æ÷·¢¿{jãúu^ÔuÖµÔź²|VWš\­©÷ ø¢®Îí¡®©;ö%,;zàV„uÚs{^]«\ÔU㧺¶¶ev.ª+bXIÂà)Ñ^Ú¯ÎÈ“k/L÷ (þCaw®Y0ÎÑ`sú¶¸ðO6oIó¦®Ç¨ë†„øØ1ﯚù+Â¥C[5ã§¥C_òõCIqQ2ùù[´ÔM…Ig¢ÞZñuô÷ÏÀNf(r¹~úÞ£{VO.£ÙlhµTó<ÎsuRø€”­Y ‘ãWϱ95<È–´¸q/ûù…øñŸ.ö¸t{DK½I–ôUUqš.7ê`ì/«¦ÿ¸ô»'—±ÉÒaO$D†¯[6gÍüq©€KÄj“îÀB¬ññµÂ˜7ÎÎ}ÎÑM)[ÒvåBlܘŒ‹¯œþPÄÑs®'miuݸfÅ”¡‰ËçmÚS˜°í óƒÔ7vØ<ïɺö„ºº„H´L®Þ¾¬ O®lé#Wƒ+|6ëúׯÝðz¸[¹sÐ4—×SWíòÔ˜–‡ËœÛŸbI¼·6Û5Ëú ?.ñþcM‡LG‹6ðÞ~}öù2- •¦ëö„=DîþÁ_÷úÀOY·hvOwÜb`Ø ï·*;„l ;{o¿,õ s{Me÷ö¯þ¶Ìe”¾ž¾ÞûOJ¸ çöù%ÞÛÏZ»Ç¹=¬ú­ïMöÒþñ¯¸tiÄÂ4·-¯mìõýÇ``³6,Wï˜PW‘K“«€vÞ»4&ÚµîüƒŸÏñt‹ë^þýö·Çè “~NYyù©ë†ìU)9Rí žW(ä£ k\ºä]]¡ö. Ú]¨ëòÔ‰€4¦Ú|5ìúþ£¯{e$þOwµ³º~5Í?uMÏ;믺þãÝਫCw¨¯Ô}uÅÈ;Ûœ»>œîb]»T×~ªëws6ù«®¦Úêºp£êZuõÚ¾³º¾7†RWŒŒ=–º:æâÈ…ö¯ wM¨ëª®˜¸þ£®{iÑðÕµCiò.Õõ‰oüVׂ³Nï;ÉöÞ>¬“º>àÁºÞpA]]¶UL^‘åýu¥ÉUD÷ÞÛ»Q×{ÿ‰wu%~á¥áÎsí¯º~ÜQ]ͼCoý0Ó»AFÈæ—ºÆ¤uPWµ±Öscr߮յ£@íKyÔ5í€u%f6üÕ°.¨«Í(R¦dŽ»ž;èæ×GÒw÷Q]‡GÑê:îúWÇÀ5_÷òüãúWFõšºÞýÑEu­<•,ß8lį?vxR'­ %ëH‡$¨]ªë÷^Õ•ºË(‡Å€ÜøF8MÖ‹ŽÛ ‚öÖ¦.­kòžSuxçÏÿð2 Õòî˜xï·€ºê÷GŠbß’%Å-Vgs¯E0€/ÿއòG]ÃݪëiIÞ⋺:‹‹um°6Ýòn„—¸æÉo"=¨«GÙÆûpù¨?)Sk®Qu©®c—mw¹E—êê²5¢+ëꢮ… ±Ó·ãÈ¢ƒÃ¢–³'u}Þ«uu¨«C¢’s}TWš\eKü³®>ª«s{¢®$¾ Êé¶}Lz‡ÔÊ]ªëëþ«ë9~‡4È©¹ÅÞÛÏ^×A]ë›þ>`’—öÎêÚÖÒÔ +ú1b©—öÐü‚’óÖÕ"+’oþqÍoÿÁ95K­å‹°³ºÞÿÙìÔ•¶ö°{ày¯§þOþÑÌöœzßKSµÒxtÕö9ŸSßvPÑ‹òÚ¸ÁŸ~*]÷™Ýn'äjäSŒ1×<öÖ×T,9ŠØUÊzãhçrÝË#oxygûì–U"9^ž¹²¥\õQšKû“ë·.²tlöÑØ˜añŽ_íV¾š¾Þ%žJÚ]è©1-ÇÊ:¼ÜAðâ½=à¥KÏG/Ùêý'µ θ!°õÞ@ˆnÙj5›¹ùEëÃéÏß±ìƒq+]3zøìÉ·êræ9n1eå.ï·€ËvîÒžãLïí·êPÉ Æ{ûqË]}ß‚ û½ÿ„¯08·?\Â÷Þ>yï)çöÖæ–/¦$ziÿË‚-.]‚_ð~‹“GóëX96=Ÿ&W‹*dÞÛ¯ØvÄå?ÌÝä¶å#—¼5øû1•d:çíOÜuù©ëþSÎíåº*ïíg¬Évé’7u 'j¯2tØóÝ•ºn?t齩¶ÁùÛ¿Î}çÛqo|<ôoÆ~èA]ç¯÷O]z{oßY]?Ÿ¼ÎKûÔµ”×3w_]ß÷îèXÇŸ_w²®]ªëñ²™ºT×E›º«®l½·wQW™ÿê:yE–÷Ÿ¨M¬kÀêúöïË>ëjð!áË3½«ëcb ›ðúûŸ½÷ÓŒÃW}迺Æû¥®¿Fú­®.!Þvêºr»k= Dß^ÚC]]â©u»Nx¿…C]ir±¶÷öÕuÔ’ ï?ñ®®ƒÆ­0l"þ°ºÎLØãܾ­Ù:9~‡÷ŸhüT×ÌoÖµ³t©®.µçuÜsÈ7uµ™$ªmccÿµè•Aß4Ö#P쬮ËÓ9¾8|ÁÛ_ÿ`ÌòAc/NDO«ë7368Ô•«›¾ž7Åû-N”w°®]ªëâÍ®ÅâÕõýá‘o=æaŸ|4~uuÄ©­ÅF’ûÙí]Z×\'up:³>|P'ÈêE]íéÑ¥º âx ž”mø¦Arz÷1†Ûfï|;öí/~øÛ‚î«ë¼¤}Þ"Pv°®>ªëEëÚÔòÙäuÄÚ{«_#S½¨«[9œ¶\°ôeFØ5êÛšºT×Uþ««K¢ŒuY]XWWukœ¿}ó“ao~ôÍÀßæ{Qב‹½YW‡º:Y×bÕ•&WeZÿ¬«êêÜê:hlÜ{?N{sð÷nÛïðW]cüVW—­5‡ŠyÞÛoÊé ®M-ŸF¬õÒ¾ƒºÚíí­M˶äyiÿÎïËK.ìDmo±Ö2²³|=`h¸—ŸtV×ïRW¤7>üú­Ï0lüë¿÷ãt ¦×ÞýhÀ·c÷n\Ú¨b;fÅŒùùí/†¿>ð³÷G.¢1U _9Ùš:Á„\"äê·_ù`ÔÒ߆¿óÕ¨÷GD¢Ùû#¢ÞþrþÄ}ß4D´;ª¥¡J™1J¼â=YòÐÕ § ñëïþÎ×cÞÿ}1ú00pDä{¿Î‡Ÿ8Í©)Ýn,ˆ­-ß%I|xÎkŸtàðÈ·>ÿuÀ·ãˆºv¢+iu}ÿ÷Eï›øÞÏ3†Åãüs—ãož¬«'u5ÖÔ¬®.!-“«­<Ú'W°<²úØ4nR”ÿqÈÕGÂV&­_A6n/2µvl–ž•sŽ#( nE¤2¹dÝÁb÷Ô˜—òpÞÛkLu.=G¼ãý'­‰Ê:‹÷ö5õçã¯öö¶Vk]ƒII~øÔ¹ ‰Ú¥1—Ç+ß±˜=ù6ý…Ž[( 5ÞoAòî8u©¦¾Ñ{{—ƒ$-míÞÛ»œ^·SÛ±¼ÿÄ%+`’÷ö.,Ûìv‘Ê襽TãZ;XWeö~‹úz3Æ¿½ÅF“«õÖ&ïíõU®Uf$šJ·-ÙçŠ ~²oÔݵìýÎg —³ºÒbkiõÞ^ep­dáE]ù CÁ©R‹µÃSWwO]Ëç_;öÀÔOnš)ð ®êžWWa°ÕµÁÚáE^÷Õõ,[x¦œçøS¤vµ®]«k£ŸêZ鿺¶_BêJ‹‹u X]ž)g‰”Û»œ¯ì¬®.ï̶è}c(?±/× P×Z?ÕU뿺ÚüT×j_­«À¡®Ûû®®4¹ÚØÔì½}ÐÕ•/ײˊé) P]~««Ëvô®ÕÕ좮mÞÛw©®.räLY]}‡[ÔY¬ÞoA«kS•\³k ¢ÚŠ9e.牤žÚ»S׺‹³ Só„™½ãÞVW±“ºVžJV¤ü,:±Ýû-:Y×.ÔUëU]g Ž­Ÿr,uÑÅŸ(ý¶®ÎïœêM*ÿÕµºKu­<¹ž;ïQùæUåžÔõdʬ㠣§ö´ºB\2)ù¨®.ÖõÈé2¶ÈýpyWW÷êÇÌ“®ûL™>Ò¢(µÛÛ{B]]Úªý¶êzpÞ»|P~2Ï›ºj½ZW7êÚà½Ku¥ÉÕ€¬k×êêb]ù2 ›QrîÐv·íC ® ]¨«Ëi ÄB¥Ÿ` Ò›º+fTÖ\œk‹¬X:îTÊ/?q£®j“—öžÔõlÎú}áœ?ðìþ{GÞ}®`ÇþñíùõïÇ׆ñÓÆWmi1ë5,ýÅâ­­‘3ú^VI!Ütç[hôFº|F«¥š¿ð9¸¡Âå_›ŸÜ2çĺqŒSùhÃ,:r"q|QÖJ§"oê‹ÚKIÇ“x W¦ÿ.;»ïÔ–¹ûÆ>X¸!‚Ur2gÌ}E;ã+¥¬³'xb­®fîÁê’m$3íºÏùk‡tîãô¡ãkFÎXèE]ù2-O,çKUeŠL.·5a+-˜MSa’™WÐÖÈRê}Å¿+Mú’PÁ¡¸;M®öÒíìÄÈÃG‡|Ì/QªT–Æ‹¹Ñšk5u¬½u¹½pëZF6oÁãÂå¯×‹ ÙSo·(J¸sfŒ¹F±åˆj[X½ð˜E~V›3W—¥ÞΊ¸ÅV)mowSzÉ!­5ÂèþŒ°¿È’¿E §?°H³kŠE^b'é[ õÂãVm€™`É‹ˆÙÑX»wgæ}ª­c üú¼%ÓîÔfÏ´ê¸Óîª:³¹ÕZ U!¨‹£ ®Ð >)ßø"åçÎwoªRÔ”e¡Û¾<>Ô^£Õ†\¼H`äêˆBý'Ùügמè“+U¾É—<®î¾‚õ‘«ÉÙ·O(iuº? ””–*”J—Õ2¾xß2æäÛÄ{†¼‡Wªð‚ 'ˆTq‹xk¾d„ߤ8—¯U«Bþ€—®hµP{e'µïŽ(Îæð¾`ÏyX”57ôx ÔžTµï¿ä\Y™\.à‡j)OZ˜!ØòG¸LƒÅf‡¼L9wîœ\¡à‡jA™(ksÖÃŒq×KÄk’?K`"=´Vü‹üä¶Þ¼©Z!á•b- ùãw=>ÇRØóž¤ŒTñÎzj#>³¢W„¼·>Ji jïVÔJ™‚[¢’pCþ\> 7v ýJæÑÜ],‘0™ÌÂSÊËË¥2™ãOJ®U(E½áåEÙ19Ë(e[Æ«DLöÜÇoæ-~‰·ì îÂç$['ÈÄ 7ÿ.ÎícFܪœÓj5^®©‘ñ+½T>æÞºoè‰vΦ…+Î呯Ô*µ\Œµ „V±äqÎRL€¬é÷6P²Nÿ5õNá¶ÉJö ÖŒK ’4*~…8ˆ¾¸’{VYqJQz€¿î[þ†;ßW Y* Ï—Ç‹ÅL+ä @‹Û]s‘«Ù¢êI,Ë»ée/'ì“+Oe²"Ø–³º ¼=ÿã«÷,¶»Çfûsser¹©²ò(å †N§sùШU¨Oeˆ×|¢gæ…¼‡WªH¤R@Ä ê%,ñ–ß™ãÿªœ5™ !ÀKYˆÚëõA¼ –yˆ¿âCöì‡äû£Cþt—²µ CÞ?¬÷j4š@~kÐe&UßÜ(À</äÝøc “ÉÔhµüРà+¯¬þ„1ö:Õ‰£^òg L”G׋SG«ÏîîåûÊd2ŸòÇïR4%Ùœ¨ç$™S0ã› ²2…¼·>JÀjeˆ ásiæ½°4$wW(•.7äƒðÇ6›­R‡ÆV#þ’í˜*JþÑdÔåX î¢ùË_ç,x’5ýÎÜG8Ño²õçÆҜݭç­xߨšLÞ¬ŠQ-á.y…¿ðõ¡F•H¶w¡d{„–y¸c©pÍgÊ#‰F\~ †=ûAÉÖ‰)[–³ˆ5ý_Ò]³uüâŠùOªOo5;†ü:•I§Ð² “§éæã+ŠKGí,–΄O`ä*dY©.‚mš/}7íÜkɧûäÊ÷2ʾ/PLb6l`çLå†\uüwÍ?ŸyPÛÜ©Y_Z—ÛÛZš*¥fN¾sÑù> ®ý|t«µ®–‘-KÚRo´ÛÛƒxå+Lz"-€EY&Yówþc•'7„ü/eéK Z 8-€ª#òþ_¾º´}xZ€¶¦†zq¡2ýwæ¸ëÍü#ÎÉÌ//©.ݦɚâãÑÎ Q{½>äߥX%Âe¯F·Z¯œX@Ô´—èó—ÖœÛAðp(îÞ«iú¤£¸¤èMim¬E ¦Ër|"Š@ò]ǾŞ|«(îaÌŒ±ÿ'Š}³QY†ÆUE©m6³÷TKh&Ž Ú:ƪç#<¯*Úb<²ÒªíP˜²½ÅVSšÙ¨fÂIUŸMçE>‰>´6V›Ž'pçÒ .¬:“â÷‚\.äªUÏŽm:¶æJÊW/ûc“«V¯¹Vª í#WC(!$Wíöv›I\ËÊq|"^5H™1R²æcöäÛä›&~ÁЏE‘ú«Í(noom©7¶·Ú¼‡l­Ö:ÉšôyKZ,UøQžEVìå­A-sÑs†C1mÍ•'y‘O®nùÿìÝxTe¢Æñ#E°»îºîz¯îÞXÖ‚`ÝbEEP+,XP +½÷’B¤@Š Bú¤w’F’“^H/S’LIrÏÌ„2 !3“w2óòüž}˜™3s¾óÍgNòßᤪ¨Àc¾ê\ªÉë»J¯™wè[óg„}ÇU÷äâISãäß'ªàUÌ'½_ÇÖLòÏ÷Ëéêò¡1/ 鸱#ÄÕvÔÙ›½L¸yJ„¢íýŒ«ða8 V&kÄÕÚÒ¬Œ¯¥,y¤<êüm—=ã* ã*P㪤®² ÿÈŒÓS®ª-Íìú׎Ø2m½J£ªîýÐÔWâj]E~ÖöÊ£öÃGbA¢cÇU,ÆU d\mh0ür±â–›^Í=ð¸ù„ïþ’wdFξ)iÎÏW&xtÿéãªÛ¨s>ëÔŠòîl_•⓲ì1ýÿU¤U—ý”²ä¡â€]?E™ŸÿÛÌs>kÍë O.Ñj5Ún_gI­ª’~¾( ÝÑÍ‹–ȳ"Ï®}¦$h‹ôwéYgWý§4øç®ŸR[*–…î¨4ûç{«îÉÅÓâä÷GÂ{ YÃöÄN“‡æW›\3Œ«mi« JU~•®*øë[áA·Ìú¶[2®Â‡á€X™P¬Wµêº¬¦­{®*éüm—=ã* ã*Yqµº¸Èsyü·ÖÔó?œKÖWâª]WqWl*®fnÿ àèÜœ½ŸùñïE^«jÒdÕ©¾—ô Ò©§4t‡<;²›ç Õ¹ÔÌŸß+‹t—þ^¶+Íùù²ð=½s°öW'¾x8 ÞÉzÆž'ùåš\3Œ«mU{½qã CG:k¥ëçEÓ^»çrA¸u²wyûÿ·ˆq> ÄÊ„b¸*ÉÙûyƆ15geð´e\öXŒ«(Œ«@fÅUyi±¿[ÒœhW/ã*ȸŠÃ¸ dSq5Çý‹sÞ«ó}—8ëöb?WM\Sk±ßžc’ZU]ê§*N—þ^±7}ýè²È}½s°öW¿KT Û€d=÷EL‰6]WÛRçz,|ÿ©!ÿû‡ËéÏ•·>öÞJßBuÇ-WáÃp@¬L(VŠ«Ò÷NY;&È3Ãáh˸ì±WQW̉«jEEYèŽÔåkÕìT—ŒqHd\Åa\²©¸Z}°:Õ¯èÔÊä…CKd ¿»ÊÚ——Ñiµjá²åÑ¿dn}§×®Wf¯quFr¼þ‘U q ø>Ñôé’qµgWáÃp@¬L(VŠ«Çæåþò"7~€¶ŒË‹q…qÈœ¸ª©W*rbJd›õ?®¢¤Ïa\WqWl*®jjåÒI¤4tGê²áÆë ö¦ŠØÃYÛÇWž9Þ;»c\¥¾Kz—M®ÆÕža\…ñ2¡X)®V§úUž9Q_U?@[ÆeŸŠÂ¸ dN\Õé´š:e}M©õ?nd‡WDÆUÆU ›Š«FåÑ¿¤­y¦4d{/ï·"î÷œ=“«’½{gwŒ«Ôw1®Zã*|ˆ• ÅJqU­¬R+*´ ¿¬á²Çb\Ea\2+®’WDÆUÆU Œ«•ñGõ×> ßÝËûU;[yæDmifïìŽq•ú.ÆUËb\…ñ2¡X)®RwpÙc1®¢0®1®¢0®‰Œ«8Œ«@6W«’½Ä-oõÚ/–j¡©W©••½vÁpÆÕ¾hÈÖ”jÝnY_Á-|yyC²è.¶Y¹¡ª!Þ+¤«mÐW-ëè±c‘‘ñ '>þ”—WLL ~$Ž'$4T†Š3.ûØXøHPHH—=·OTt4|(4,, > ÇäííÍe¡_ö2|ŽÉËÛ;šË$<"ÂÏß> ÇäãëFk§=wÄ®yåô‘Uð‘XUxx¸í,{“ÿ¿ãjGâªkȬbit¾'ÎWP·°E¥çb£èâ\ƒ^óL›¾7ðÞ.¶a\u¼¸z:..&66öôi$}ëë°ÇŽ%ú#"#áÃpL\ö(\öXaááÑ11ða8 ¨è興ø0“´ìc¸ì¸ì¸ì¤•Εbƒßçœ óN;µ1)èwøH¬Ê¦–}¾©+ĸÚQû¸ªkl’ç¿»Ñðhwâjw0®:^\%"""""""";c'qÕÐ*“ÃÓ÷©5MMêšòÕBFy&¨ššò33ÆnlÞrè¶„ÍÙ*…þÈ´999_loþ·ÿ÷ïHÚ[¤Ö65Ö)«f§^ˆ«¥)âäàˆaâêÍ1‹SjJtÒ«5–Íu7|ZµíeØ•¼ÿœZ×ÔX«hõʆ'…¥í*¨¯—ž\[³ïDèPø42®u›ÅÕ¦&Ué‚}A÷­ù,±¾I[›”œòʦ€aÛW5&ÉÂî3læRÖX“•6vsÀMQó35ºò¬1ëõ÷»•7V¤¥ŒÚpßO±k tÒkµÄÕ’øØç=Ëåê²é[ÚÄU·°ù:yžøÁVÙõ¡#k”Ê¢7µ«ë£6U6§$½¸ÁÈæèå9ÚæW>?àEûƒ‡º½\]§.ý|3zW‰ˆˆˆˆˆˆˆˆº­Çqõ.g?â±¾ª1+,ü>ÃÍûä—6*m÷7<*û U#ψ{ÈÙoèÞœ‚FåªÆûýîÝ‘žÖX·}_À0éþÅâæíýîߟ_Ò¤Z»+à.—à™çKâ£ïw _UÚp.!ö!×Ð…ú¸5ÌÙï¾=Y¹ Ê•ç_í® ±‡UšGdw¹†--kHö ½×Ùo˜{NN>o[ó6Ãöå5^¹í€ïþ))FW»yo~&[a\%""""""""êBãj¿™GmÈ\ÿå á‡N 0ܼÒ-#G[6f¡ñÑãODÖ+Ó"®ŸyôÚŸ j´¥//<ÿ¬á'5Ú_·Ÿî¯ª?÷‚æû,Ö*f®õè7ËkR~caXàUÒs7gæjk~tñ›RÔ˜,»ÒøjMMuušÊÚfµ šS{=ûÍö™VÜû»÷@Ã6¦_¹í€û-ŒðÑÔ®Ûp?“­0®u¡ÇqU˜yÔ†ÌõŸoh•ý 7âê« nˆ«×êïOÏn·ÆÃø¬«jW¯÷¶ÏÖVNXvÌxÿ —4±AñãZa–×DC\½BºÖ©±ÉššŒ”¥Åú¸:ظ™®ê³•ÇÚf¶ÏTC\íoI¶®jòŠæm¯s ¯ÜvÀÂÂoMíÚ Çñ3Ù ã*QzWg³!óæW4„öêg¸9xCF޶üÕÅÆGO ªW¦G\kØlNqcEj°ÅýÉ>NVëJӆΗî—Í/Ñ%É‚¯sL˜ë=&®¾©Iñ£óqaŽ·>®†]axÙë’"tMʦ¦¼ÀÁÒ=óü¾”v“žüäªýf{ Zâû¸{Ô}‹¤WðÕÇÕ£>ýõ{”-*k(8sÛ‚cý~“¡i~å¶GêãêÆø™l¥³¸zIWû6]Mäüû ž÷¨lu¿¶,Üuüc7aÀÃÞZP¢éåGñ3c]šâÐ-S_yð®ºLš‰+þå–^o+“ž+Ó)Óÿwô?ö“&A¸ÆéÉO6FVhzqzzòõÔÎCÞ>÷LíE·4g>ÉœÉ×–†müúÕÇÿñ×k _žnyìƒ52N~/M~+=9;“ù“ßã³3™7ùféÂD]ì ¸‰§ðl š|žm“ß Ï¶˜Éï«gÛÇÕËæxØ2C«ôîo¸yÅ1G[>f‰ñÑ“ëãjäu†‡­ŽZ–®”7JG¦3ıkN_áŠu±ësk +ä±îYÉ:ÅL——ÍõÖ_ <øÊæ|,DÕ¤«AWîé¿$øË˜Šµ~¢ÔuªÈÄÔ'¤ÎóÓ_à˜ïã+;ŸÞ”_¯mjTÊ+:•ž •ÿà|¼Ý€/[¥«›Nâg²ÆU‡§Î=ðÖúïcÛœPê³q…pùý—msß¾ú³G¯>±.µ¾WEÏŒUÕgîzýÏ‚ðÇÇÞý~¹ë×óV*ÐØÊä£'Ǫ4‡Þ¸AüÐç=B¢#¼~þzøÂÀ¹¤×sò{ƒ®î\ÌÏoÿEºñƒ¶9óIæM¾2â«[/¿ùŸã¦/qÞè¶dʳғú=¼"©Ž“ß “ߢ'gg2{ò{~v&ó&߬³3µr‘/àñl‹›|žm“ß‚g[Èä÷á³mãê€ùÇéR]³%+O[>n%~$Ýañ¸êééÙ®¬†††ªT*ÆU›¤«Žœwÿà?ŽœýåmN(ªØþ. ±§Àøi‹{­pÓäEï>j·ê37þkP¿{(Óv|”“oMš¼- ÂUgÏŸ Õ¹?=,÷¬L«ãä[›<`Ÿ„æ?ÿAÛœùì&]é‰IOŒ^›ØýOö]—6ùš²”äs¾‰­KZr· 8ÍŒ¯åä[ò›ç§GggN¾¹“oÆÙ™“oÞä›uvæä·ÖõðŽx¶N>϶ÀÉožžm!“ߧ϶=Ž«W.:IÝàù×­±¯nö¹nÑÉë×E,ÈÓ)ÄøÛÃGÕ-–«555)))íâjyy¹R©d\µAõyûßúó !ÿ )I]yOëŠ:cÍ}‚ðøÎ‚–/wå¿=?P¸}N‚ª—µOª˜ïþ&üõ³àšN­ªÓ¶y”“oUšìõ ÂÍ_Õ4ߣ)Ü)ý<÷€[V='ßÚtªâl1=#~Çóƒ/þƒ¶9ó©W—í1÷µa ýPÙî9ãHfÇoð´…»†üŸ¯#•è™±µÉï òøÈË…?M R\ü­áä[bò{xvæä›;ùfœ9ùfN¾9ggN~—Ú|ïˆg[àäw½='ßú“ϳ-hòûöÙ¶Çqõú%žÔ §îø%/^©ÓISÙ¨IMKÅùzHÝeÙ¸ZZZªT*333Ÿ_•þ·¸¸X¥RÕÔÔ0®ÚmMÄÜÿiÌnéÛÖº´¶'¹lü Âuãü«[¶W†O¹Yü²gU/?j—Ôé«¥SÆ=>yñö+ èèó¿>ß•,×qò{:g÷Ë× Â5O|³#¢¨V+^0là c)Ôpò{Kµ×Ø«.þƒ¶9ó)ýPþÛ{äôÚÜíG}üOtþôÁA‚Óôpy»½8à7½Ý›üöT±3þ.lÌîÆ&œ|³'¿çggN¾™“oÎÙ™“oæä›svæäw¥íðŽx¶N~×Ûsò­<ù<ÛÂ&¿Ÿm{WoZîEöͲqµ¸¸¸´´T¡P¨TªÚÚZ¥R)—Ë«««WmŽ:×ýÍ?ºofh•NºÙþ„RurÔ á/Ÿ‡É[¶¯Ÿé$ÿ>XÚËÚ%¹ÿ{× Âåw½úÃúÇOÛ¿î‹^+w´XÃÉï Š¸eÃNåƒn¼¡ÿÕO®Š“kqò{C÷~Ð6g>U±?üßÃ7>ïd`ø÷§‰ò¶{qÀoz{Wë2·>w¥pÍ« µÝxk8ùfN¾9ggN¾™“oÎÙ™“oæäëõôìÌÉï\û/àñl œü®·çä[uòy¶N~?Ûö8®Þ²Ú‡ìØßÖú~ŸØõuHº¥u\-))‘n–——WTTTVVVUU1®Ú ‚}Ï]}ýK?¥V+U*IUÂ’»…Ï)RÖÖ¾¦0~MS´<¥6®Õ7Z½ø¨]ªÒÿK‰¿~qá0µU~o.ûçŽ<-'ßÚ4…G?ú¿A›xð¬æ¾àƒÇn~Š»ó“#ùj]/O¯#N¾Q7ãjÏç³>}Í¡ãŸËžúµBÚR«©3~ÝSª™[xóA寛*ôÌØÌä·¢­ ™9´ŸpãÛ¿´\˜“oÅÉךsvæä›7ùf{6ùèi±¥É7ãìÌÉ/àñl œü®·çä[qòg[ø´ØÌä÷ù³mÏâêwgTw»Én_çKöê¡­a_FW™¿ÀWûÑe˜‰/KÒŸËG¯Òÿ‚ñ7ø  ¦å)ç?_Ùлڥj¯1W 7Lµ:ÌòÃOõn™­âä[™"ô³¿×½íYnü‡' ºÊð¹÷ Âõïx÷öô:àä7ëæGÈz>ŸÊ¨i·W򪯾OrVV×PŸ¶ÚÔ7e†?è™±™É?O[»âÉ+„+ŸZÙòù1N¾u'_mÎÙ™“oÞä›uvîÙ䣧Ŗ&ߌ³3'ß$Ó_À;âÙ8ù]oÏÉ·âäζ𙱙ÉïógÛžÅÕI²Â'ÝãâGöj쉌üsÍ_`Œ«}Žª(>4èÂÿ}ŸÝ*-÷ O)ל¿Ê?÷\ø0Ù‘…ÛfÇ.nߋڥڄٷ Âðmy-‡©;·ç A¸c~b'ߺÔ9¸ðÛ‡ ŒWM¿w¥þ7sò{Ã¥\ü°GóY—ºìnAxdK®ÚÄ+ëT…q!Í_ùd¿Í¼ë²ÆþäÛ|=363ùÚêèO_-\óìêÓ5m¾Cæä[sòÍ9;sòÍœ|sÎÎ=›|ô´ØÐä›svæäwÔéðŽx¶N~×Ûsò­9ù½¶…OŽíL~_?Ûö,®>[65Nþ¯‘ÃÖýyÆýô´xyxAù Œqµ¯k™UÌ·· ƒFì)0þò>mñoc®nü¨ùb&½ö¨½RFN»Eî_–Ô|QMÑÁÑWég¡†“om•'Ç\% ±7_sþžjÿI7 WŒ>Zªãä÷Ó?hkUy12ÿÀø²óß,™1ŸÊˆ)7 Â?FÊu-¯_WŸP¢n;¼V7'¿A]ìýÃC— zyC¢¢ÃwÈœ|ëN~k—vvæä›;ùfœ9ùfN¾9ggN~[]~çÙÖ¦&Ÿg[ää·Æ³mïN~ß>Ûö,®J–EäO‹“¿y<ý?;"ÝHöáÉ‘ïxfN=]³9¾È" Œqµ¯ëpBi¨ÏÜüÔ`aЃ¯Øá¾cÍçïú?º*¹®W…O‹õ¨ó÷ýƒ ÜðÔ7Î{öï\þáÐË…k_Ú–¥¶‘ɇÏ5)¢g„C>rù=(2Ì{÷¬n<¼ð´’“ouÚš¬øè¨(™ÛS— 7´?4**6µ¤¾ùQÃW!AxòHùùí͘Ouî¾±7ÂàaïÏßràྟM~îïWü}j”²íè›ÞK›|uÖÆ'ú Âÿ¼¶hëÎ]»Z¸{‰JN¾µ'¿­K<;sòÍ|3ÎΜ|3'ßœ³3'¿•‹}çÙÖ†&Ÿg[àä·Å³m/O~Ÿ>Ûö8®J<³*> ,œ¯˜‘\Göaj\ͧ²üÈ" |fÕˆqµ¯ëxBÑ5hJƒ×¼ûðMú_ÛÚÿOCßXæW¬éåGáÓbM:ùÙß>Ç5úËÀ\}ûsÓÜS[ÿß|àÉGOŽ•iJC\?ú·“aî…kïxöË­±•N~/¨ñw]»k =°>»yL}ÓkÎ|ÖeŸXôÎð[¯ÒïeÐûÝÏ‘åí>ì0ßô^êä×%/ü‡©KV=º-_ËÉ·òä·uéggN¾™“oÎÙ™“oÞä›uvæäŸw±/à<ÛÚÐäól œü¶x¶íõÉïÃg[sâª{rñ¤€‚©qòïUð*Hæ“Þǯck&ùçûåTv±f®:ÓqcÆU""""""""²W=Ž«3ƒs§Å+^9šöð–Ð!n²{\ü©¯“ÞÇG¶†=.N“¯‹.èlÍ0®ézWÝ“‹§Åɇo„÷@²†ÿì‰'ͯ6¹fW‰ˆˆˆˆˆˆˆˆt=«“ _<œo€d=cOˆ“ürM®ÆU"""""""""]Oãêw‰ªa‚à¬gø¶ˆ)ÑU&× ã*‘®§quFr¼þ‘U q ø>±Öäša\%""""""""Ò1®Rç¤wÙäša\%""""""""Ò1®RçW‰ˆˆˆÈ@“¿÷e'§áóN«Ð#!"""²-Œ«ÔÆU""""uå™ÃË>{õ_÷Ýæ¤ÿsǰ¾8nÊÂ-'+4 !1®™Æ¸Ja\%"""ê}ê¢Ó×7ÕÇßøræâeKΜ:áåÇÿ¡¿gôÞ5fTŒ«DDDD¦1®¶á¾¼¼!Ù?t|$6€q•ˆˆˆ¨×)¿ÈÉiÈÄ_²k[ß_w.zßâ%^ÅŒ«DDDD6…qµ × ×<Ó¦ï ¼>À¸JDDDÔÛ4¹;F99ÝþžWUW›Õ¦ï™þÖó?p·á²·ûÏëßl,TÕäì”^âßK¢.œðìPiƒ;;c_ŠB­H;¶â“ºCºkÈ“ãWÉÎOµÍOY¸ãÇqOݧÍ_úrSxyË㪺"vïœ÷Ÿ{@ÿj· }êYûÎTkñHDDDÔ»W©3Œ«DDDD½MWáõá]NN~åy®‹©Ê£ç}yÜç3®\ç¼vÕâ>}‡“Ó3+úG¥ÔéŽÛœœî9á«o§N9DºýàëoýËÉéÎÿ¼õÙô響1\ºçîñGŠŒqm~Šþσ£ôOùøåõ/ñúÖŒzãí⪦\6ûI'§»^œ²|«û½›Lx°yZz‰ˆˆˆz—ãÆU×àñae™õÒ1êtšÌ³IO»µ¿,À»’÷ŸSëškÕ³Suªu»e¦Ÿèâÿޤ½Ej­´±²ú— óÓq•ˆˆˆ¨/ÑÕÄ,}Îðk¬þõæç3Wlv÷ŒË®¬ïê)ÚzEŽûëÆöÙp¾”Þþüìcé aeÜâJ¯øÈ'[£Ê›kjþþ7nwºý2mCËSþñê ÿ¼ZãS´¥¾ÓrrzðÛðãömâª"rÖcNwŒÙ|¶åƒ¬š‚CïÞåôÀ´09z‰ˆˆˆzUãê]Î~}ÚнٹZùê}÷:ûÝ»!tì/á»øÝå¶´¬!Ù/Tºó.·È•Å)Iϯ÷»wSÔÒmS“jí®ÓOt‹p-o,=›üâzÿ{7G¯ÊkÞ~˜æ`\%"""BДŸÞ7ïƒg†8]øsÛc¯¿3º\Ó²M]A讟½þì#÷^Øè®jZþÿ²Äږ׬ô~÷v§;&øÕ´Ü£Œ_ø„“Óó3 ÙÖÄStª¸ù;9=¹*YÿaÔ¶qUùýƒNwOô,RÕªj›É³÷ŒvrzÆùl~‰ˆˆˆzOãj¿™Gû´ÁëRRtµ» ¹s‘Gÿ–ûgûL+nˆýÝ{àÌ£Wºedëª>[qÌøÐ•ëÅÜFÅ̵&Ÿx¥[º´ñç+Ïo¼AÌ3l ?Ls0®ië+sýŽl_ýß Ï®®:Ò%E¥¨.mû8}T}ðÕ) Ývøý„ÏI××nwúÇDÿNâjMà§÷8Ýö®wuË=ug×=íäô¬kš¡…šŠ«Ú¢ýcœœ†~¢hhW5çŽq2ýç±9± ô¼õ¦ÇUaæÑ¾mÖñ»dɯU65)+Ê\ù_5ë¨0Ûgª!®öŸyôêŸ ªêÏ=¿ yû~Ë㣵Š×z˜|b§ÃÓ Œ«DDDD6B»ï­;œœþµ4±¶AW4e¨“Ós‚*Z~TMÀ'wwWƒ&ßÛ.®¦¹<Óu\Õ¸¿âä4ì›°qU]´_zdÈÄÝAQíþDŸÉUhÐsEDDDÔ›zWg³—Íózè÷s 5S×zs}õqõ¨OÿÙÇoÐruò*ãfƒ7ê?¹ú£óq“O4l\ýÙ…3óÚnÜuW/ ã*Ñ%ÐiTj‰ûUñ wrzøÇheƒ:gÇKNN~)¿°âª"ü»œ^Ú–­¿AÛËÈC¾êäôêž\Í%‘Ýéq\½lŽGŸ6x]ô»eYxü²9'þwon¡®úëµÇ/›ç§¿,À1ßÒ6 •5ÄÅÞ¾ÐcÀ’ ©š¦&ÅL—¦Ÿ¸@6¿´±0>öiã¥AÓE­qcøašƒq•ˆˆˆ¨·©â—½>ná‘øRuëû5EÞßwrú¹o¹®A[æ1î'§×ZÚ¦¶*qïç8Y4®Ö‰{ÆÝíäôêεaƒ6qUWðÍNN}¼°ÕoÚÒ©òÂDUOŽšˆˆˆ¨Ïêq\0ÿxŸvõ¦Ôã¥êZý!6*«+·ü.»nÁñ ý§—4œ>î7ȸkÜOj­´¼j«WÆ­|†ë ÓO”6v9½1¿Þ¸ñ¯ôx­b–ÛIøašƒq•ˆˆˆ¨·?¡*ýòäØO¾³xùòE?~ùö¿ïîy|ê±B~m™×—÷Kw<òÆ”YófMýà¹æ_jen\urzôµÉ?.YµzéŸû‡“Óí£Ï(ŒÛ·«ú+œ˜¦çÏL˜±Üm£Ûš…ÓÞnˆ“ÓÇʵð9$"""êE=Ž«W.:éPþøsv¾¶üƒ5ÝÚøêu QZåܧàÃ6ã*Q¯ÓʳCÜW7~ôøGóo‰ºï_c¾Xõ{ruËV´5‰»§~PÿàŒút¥GìñÌ¿,À7¦}ñÚãwÓî;³÷%Tµì±}\•¨+Nï[ôñ¨Ç e÷ŽûŸxaÜ´Õ"J4è $"""êU=Ž«×/ñ´w§þöóé×·øÞ¸ÄóÏ.‘‹ótÊÌ„»–vë¹78Ÿ‰Ö*löB‚YW‰ˆˆˆƒ©k®Q7ô8®Þ´ÜËÞyß{(ÿŒ²A'ÍB£ælzÆë®ÞÝ|î_ÝcµÊ%[|Ї`ÆUËòöñ‘Ž²ëŠØ#y§U%z¢Ž=##£¶Îˉ.•ôß›ôŸ|H«Ó¥gdÔÕ×ÃG‸ì±2³²”*^r@úÖª  ÀŒW`\í¹ÌÌL.{ý²/,„Ã1‰™™ªZ~¹À~ŠÎÍë«?÷uÙ99r…> $-û¼ü|ø0ºÐã¸zËj²oŒ«–Ÿ  + ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠbÇqõöu¾dÇîtñûÞß]3®¶`\…¿ˆ• …qˆË‹q…qˆq…qHd\Åa\b\E±×¸úÝÕ° ÷¸ø‘½¾-|J´J ãj ÆUø[à€X™PW¸ì±WQÌŽ«ÔsŒ«(Œ«@"ã*ã*ã*нÆÕd…£Ž$[@öêÍ“â'þ¹æ/0ÆÕŒ«ð·À±2¡0®qÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(öWœ-›'fwô£›Éþ¼°?nZ¼<¼ ÆüƸڂqþ8 V&ÆU .{,ÆUÆU ÆUÆU ‘q‡qˆqÅ^ãªdydÁ´xùÛ'3žÙõÄ–`²Ïî‰~×+kê隟â-ó“)ãj ÆUø[à€X™PW¸ì±WQWWQWDÆUÆU ÆU;Ž«ϬŠOƒ §Ç+f$ב}˜W3Y–UdϬ1®¶°¸zu쌫(¬L(Œ«@\öXŒ«(Œ«@Œ«(Œ«@"ã*ã*ã*Š}ÇU÷äâISãäß'ªàUÌ'½_ÇÖLòÏ÷Ë©ìbÍÄ\+t¦ãÆŒ«-°q5÷À7• ¨cg\EaeBa\â²Çb\Ea\b\Ea\WqWWQì8®Î ίxåhÚÃ[B‡¸Éîqñ§¾NzÙ6ö¸85N¾.ºÓïÏW{Wsö})ý/êØWQX™PW¸ì±WQWWQWDÆUÆU ÆU{«îÉÅÓâä÷GÂ{ YÃöÄN“‡æW›\3Œ«=ø  + ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠb¯quR`዇“à ¬gì q’_®É5øÚ3Œ«ð·À±2¡0®qÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(öW¿KT Û€d=÷EL‰6]W{†qþ8 V&ÆU .{,ÆUÆU ÆUÆU ‘q‡qˆqÅ^ãêŒä:xý#«âð}¢éÓ%ãjÏ0®ÂßÄʄ¸ ÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢0®Rß%½Ë&× ãjÏ0®ÂßÄʄ¸ ÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢0®RߟjYȸs(gï猫ˆ• …qˆË‹q…qˆq…qHd\Åa\b\Ea\¥¾‹qÕ²€qµÃÍûä—6*m÷7<*û U#ψ{ÈÙoèÞœ‚FåªÆûýîÝ‘žÖX·}_À0éþÅâæíýîߟ_Ò¤Z»+@úû-1scKb+5ýg]Uþqÿvõ»Ë5liYC²_è½Î~ÃÜs tòyÛšŸ;l_nQ£þ¹÷íÊê~÷}~“ÿÝçÇiØ‘|þ…óÎ56ïȦ8h\Ug¬¹OßY =OùoÏnŸ“ 2/®>|øt\œôÕ¸÷%[›àüjÒï« {—È“’“Q{wd1±±‘‘ða8&.{”˜˜˜H.{œ ààÄÄDø0ÐéÓ§ÃÃÃáÃpLAAA\ö±Ò²ˆ€Ã1JË>) > džc  I8s> dS˾¤¤Ä‚qµßÌ£6g®ÿ‚ò†ðC§n^é–‘£-³Ðøèñ'"ë•i×Ïm9h\•ËÆß \7οºåeø”›…Á/{VuWŸûµH®PÕë:}e^µwGÆÂËqÙcñ²(¼,/ €Âˉ¼,/ ÄË Øñe„™GmÎ\ÿù†¸ÚÏps°!®¾ºÐøèñᆸz­þþôìùwk<ŒÏ°:1¡¡võziûlmå„eÇŒ÷rI?®õh¿—9þ³ÊšJ¢‚¯œí3ÕWûö•­«š¼¢ù¹ƒ×‹¹mž{ÙœSýVTÑP=uõ1ãÆŸ­<¿ñ1¯ÑÔŽÐ4®V5HøËça~UmüL'Aø÷ÁÒNžÒöZ øóýcç{æ×uØŒqµwGÆÊ„¸ ÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢Øs\}ÌæÌ˜_Ñ~Ø«Ÿáæà 9ÚòW=1<ª^™q­a³9Å© Ã{ô_$û8Y­+M:_º_6¿D—$ ¾vÎ1a®÷˜¸ú¦&ÅÎÇû/\š<ö'¿¿.:>p¡÷c¿åç5é<ñê7×WWúô׿¦lQYCÁé˜Ûë¿8ð› ñ¹ƒÖF½¿[vÓaöñÿÙ›[¨«þj‡aG …q±·K/ š&6oŒŸÀ¶:‹«—¤ÆÕƸªh¹§6®ë¸ª)‹Ø³e磞^^û7þ÷•ÿá3c”í6CÇÕ÷ËÂvAö®c\ÅaeBa\â²Çb\Ea\b\Ea\WqWWQì8®^6ÇÃæ,âªwÃÍ+6ˆ9Úò1KŒž|\W#¯3<4huÔ²t¥¼Q:>­˜!Ž]sÂø W¬‹]Ÿ[[X!-¨pÌJÖ)fºœè·$xjLi¼\gœyeÅΓ¡šçqÙ×ùô¦üzmS£R^ùÓ©ô­üçãW¬Oñ(­¯Õï¨QY]±ùWÙÕsÏï(¯yãÍžiqZýŽðØ–ƒÆUyÀø„?|PÓrÏùËTvïÔÙ›½L¸yJ„¢íýظš¹å’ -½ëWqX™PW¸ì±WQWWQWDÆUÆU ÆU;Ž«æ§Î\³%+O[>ne·6¾|u|¤V1Ëí$|Øí8h\U§¯¾Oþ¹§°åZ•1P¸mv|g¿Ðª½ÿw¯®}Ë·ºíýظ*ny»$p3dï:ÆUV&ÆU .{,ÆUÆU ÆUÆU ‘q‡qˆqÅŽãê•‹NR+žÝûêfŸë¼~]Ăѧ˾W­W#öŠ›ß`\u@¬L(Œ«@\öXŒ«(Œ«@Œ«(Œ«@"ã*ã*ã*нÆÕïΨîv“ݾΗìÕC[þŒ¶@ d\mŒ«¥¡;36¼Ê¸ê€X™PW¸ì±WQWWQWDÆUÆU ÆU{«“d…/NºÇÅìÕØùçš¿ÀW[@ãꎌõ/3®: V&ÆU .{,ÆUÆU ÆUÆU ‘q‡qˆqÅ^ãêá³eSãäÿÚ9l}ÙŸgÜOO‹—‡Ô˜¿ÀW[`ãjºÛ膨cg\EaeBa\â²Çb\Ea\b\Ea\WqWWQì5®J–EäO‹“¿y<ý?;"ÝHöáÉ‘ïxfN=]³9¾È" Œqµ8®º¼xÎg-êØWQX™PW¸ì±WQWWQWDÆUÆU ÆU;Ž«ϬŠO §Ç+f$ב}˜Wó©,?²ÈŸY5b\mÁ¸  + ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠbßqÕ=¹xR@ÁÔ8ù÷‰*x$óIïã×±5“üóýr*»X3Cb„Îtܘqµã*ü-p@¬L(Œ«@\öXŒ«(Œ«@Œ«(Œ«@"ã*ã*ã*ŠÇÕ™Á¹Óâ¯M{xKè7Ù=.þÔ×Iïã#[ÃÆ§ÆÉ×Ewúý9ãjÏ0®ÂßÄʄ¸ ÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢Øk\uO.ž'¾=ÞÉþ³'vjœ<4¿Úäša\íÆUø[à€X™PW¸ì±WQWWQWDÆUÆU ÆU{«“ _<œo€d=cOˆ“ürM®ÆÕža\…¿ˆ• …qˆË‹q…qˆq…qHd\Åa\b\E±×¸ú]¢j؆ x$ë¾-bJ´éȸÚ3Œ«ð·À±2¡0®qÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(öWg$×ÁëYÕ·€ïMŸ.W{WÓœ_8ç½u쌫(¬L(Œ«@\öXŒ«(Œ«@Œ«(Œ«@"ã*ã*ã* ã*õ]Ò»lrÍ0®ö 8®®{®èÔ Ô±3®¢°2¡0®qÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(Œ«Ôw1®Z6®ž]óLá‰Å¨cg\EaeBa\â²Çb\Ea\b\Ea\WqWWQW©ïb\µ,ÆUø[à€X™PW¸ì±WQWWQWDÆUÆU ÆUÆUê»W- W·Ÿ]ó4ãªbeBa\â²Çb\Ea\b\Ea\WqWWQWíÞ­) :ÕºÝ2øH,ŽqÕ²q5dÛÙÕO1®: V&kÇU­V­©WétZø‘Ú .{,ÆUÆU ÆUÆU ‘q‡qˆq…qÕî1®2®v0®–È6¥.œqÕ±2¡X;®V%yå왬Ì??RÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢0®öYC]»µ%ã*ãj71®ÂßÄÊ„bí¸Z,sËÛŠÜXø‘Ú .{,ÆUÆU ÆUÆU ‘q‡qˆq…qµ/Y¹¡ª!-&ë÷"U¾²>Ì+üÍÐÒd¹N'Í‚N”’6vSó–÷ïHÚ[¤Ö65Ö)«f§2®2®vã*ü-p@¬L(Ö«GÅŸÞRä0®šÀeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢Øq\½ËÙÏÞ¸E¬¯jjRûf[€áÙ«^)í êâÿÀÎÄ_j c£î7læZÞXž–!ý½ÿÒÐ¥%MM•Ã6+Ñ%ÉB®›ëqÙ<ï×â뛚3]NàÇoiŒ«–Ÿ  + ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠbÇquÀüãöfQàŠ†ˆ_}.7Þ\àýBPY¶ª.ý\UdvÁâÐuUÆ‹ô]írzc^ma¥ütaž ¬b–ÛIüø-qÕ²WáobeBa\â²Çb\Ea\b\Ea\WqWWQì8®^¹è$Ù7ÆUËb\…¿ˆ• …qˆË‹q…qˆq…qHd\Åa\b\E±ã¸zýO²oŒ«–Ÿ  + ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠbÇqõ¦å^dßW-‹qþ8 V&ÆU .{,ÆUÆU ÆUÆU ‘q‡qˆqÅŽãê-«}Ⱦ1®Z6®&/z ÿÈ Ô±3®¢°2¡0®qÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(vWo_çKvìN¿ï-pºd\mŽ« îËýeêØWQX™Pz#®n~]ž ?RÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢Øk\ýîŒj؆À{\üÈ^ ß>%Ú%qµ6®&éãêTÔ±3®¢°2¡X;®VÄýž±qLMzüHm—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠb¯qõ#Yá¨#ÉÃÖ½zó¤ø‰®ù Œqµ0®¬Ošw7ãªbeB±z\=’î:²&-~¤6ˆË‹q…qˆq…qHd\Åa\b\E±×¸zälÙÔ8ù3»£ÝHöç…ýqÓâåá5æ/0ÆÕÀ¸zÎÏ%qöŒ«ˆ• Åúqõpšó Œ«&qÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(öW%Ë# ¦ÅËß>™ñÌ®¨'¶“}xvOô»^YSO×üo™ŸLW[ 㪯sâ¬ÛW+ ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠbÇqUâ™UñiPáôxÅŒä:²Óâj&Ëò£Š,ð™U#ÆÕŒ«ð·À±2¡0®qÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(öWc º'½y0}ô!qÔáÌ—¨¯“ÞÇ_ÒG»'K/ îbÍĬ:ÓqcÆÕŒ«ð·À±2¡0®qÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(vWŸs0côޏ·6†Ž_ü¡[ÐDêë¤÷qSØøñoJïl@Ö†ÎÖ ãjÏ ãêm¹¾A;ã* + ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠb¯q5¦ààÁŒÑ›Ã?€÷@²†-‘ïIïofE”É5øÚ3ظzfæÿåìûu쌫(¬L(Œ«@\öXŒ«(Œ«@Œ«(Œ«@"ã*ã*ã*нÆU÷¤×·Å¾íô¡[ AЇþxþïíîlwP'™Ú²ã³ÚmÙÙËvñ í†x±'šüKàŶowìžhr¿]W÷ÇßÅœw6É­ö¸3þ}Iï›\3Œ«=Ž«ÿ½5{ϧ¨cg\EaeBa\â²Çb\Ea\b\Ea\WqWWQì5®GmžÐ’ã\'´†Õîõ-¸»Ö/Õý—µÔÌyž¼û6…½ íe“kÆ⪶,Üuüc7aÀÃÞZP¢éÖu5‘óì' xÞ£²ã£Œ«¨½;2V&ÆU .{,ÆUÆU ÆUÆU ‘q‡qˆqÅ^ãêáÌ—\'s H|Éäš±û¸ZŸýóˆ+„Ël›ûöÕŸ=z•0ð‰u©õ}¢:÷À[7 ú ˸Úã* + ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠÂ¸J}—ô.›\3öWU±?ü]1> ËeÈer:..$4> ÇŸ†’–}¨Í,ûâ’ëÇÕñ–‹{Ýy)‹lÓÅ—z8ã;Êø¶ÛŒïr/Ýsû²Ì˜4®ª3ÖÜ'ï,О¿§ü·ç ·ÏIPuþ¬ú¼ýoýyÐÿ†”¤®¼§“¸êyê”4 J•ª÷å{®J˜q‹¸ó#ÈÞ%É))Ò›Ú»#+(,ÌÎÉÃ1%''[oÙŸ ߟºæÙ’øðôAÒ²ÏÉÍ…ÃaIßpJgyø0ôÍ–ñcÃÔûRSS¥omáÃp@Ò²Ïâ²Iá²Ç‘~®ÎEø0SZZZYy9|HZö¢Í,ûzµÚ¢qu<Ù7«rÙø„ëÆùW·Ü£ Ÿr³0øeϪNž¢­‰˜ûÀà?ÙUßP—Öi\åeP{wdü÷Ñ(½qY€µÏV%ž„© â²ÇâePxY ^…—yY^ˆ—@±ëËàë_ï ú6H©)MŸêÖÅ6Á?FÖjÏýª«mú«U'G þòy˜¼åžÚø™N‚ð&·W线ùçA÷Í ­ÒI7WMb\EaeBé¸ZyæüHm—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠÂ¸j/&ïKÝéýiWÛ0®ÚI\=aŒ«Š–{jã:«Ú‚}Ï]}ýK?¥6ÿãߪ„%w ž=R¤¬­×´ÝWfüoö®!{×1®â°2¡X;®–Ç<»ú)ÆU“¸ì±WQWWQWDÆUÆU ÆU;Ž«.ã©à# qÕ> qи*ƒð‡jZî9Y€JÛ«E—a‚É?—<^Õfcp\ýþæ¬ {×1®â°2¡X=®FH]ñOÆU“¸ì±WQWWQWDÆUÆU ÆU;«².h¹Ùîþ–;ÚÝ츱ÉûMnÙzwÝ|µ–¿ý7¢V[žw(©*·¢®º^™<ÕͰkè|Y±¨l]§’úÅ|jxâ·JMIú7®†§¯Út¦¦º¡©QSŸqFüµ´¡(4j¢1®–d툫®ÐIÏÖH¯ù›ÉChù{×uÑãíló_Çp§ƒÆUuúêûáŸ{ [~¡UÙ‘…ÛfÇ›ü…Vª¢øÐ  ü÷}v« <´Ü3(<¥\ÓfKd\õ^?ýÆÌmïCö®c\ÅaeB±z\ÜŸº|8ãªI\öXŒ«(Œ«@Œ«(Œ«@"ã*ã*ã*ŠÇUgÙû.zë{¶IW›šê|ûÐE6áçäè:môÑñ.Óý«êÕ•…Mt úúHN†Z-;¢¿ÿ|\Õ?wV”J§(Þ°+h¼kÈÜÀ US“!®_Sû…[àä}bšÖøšðƒí)« ª˜ooØS 5ÜÔÿ6æáÆåÆ ´ª¼™`|™ÚÔÓmóš«E§VÄ}s=ãªbeBa\â²Çb\Ea\b\Ea\WqWWQì8®®ö{sÿÛkÞ¹˜qÎï9ËÞïšË%°T\Õ•‹ß5²4ĵ ¡$*zâúè_« ‚#?lÞ,xQ’Z‘ÿI븺>æxMc–_øã6ëcNÊ/ÄՆʬÖŸº¾ÐðšðFʸz©ê37?5XôàÇ+v¸ïXóùð«…þ®J®k~ÔOáÉ#妞kÃqõ:ÆUÄʄ¸ ÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢Øq\]xêyÉ"KXì5r©×¨ö¼_^îóêrŸ1­­ð³ÒoìJ¿×ÛYãÿÖÿ·[[ëÿκ.¢nÐ ýõQS¿t1Þ Y“ÛP~:vÒ†øpuS“N«¬o¦Ò6ªr’>sœnŒ«ÒöÒ6õº˜_ƒÏgá🋠C£>ìì5/–m–ÃÆU]ƒ¦4xÍ»ß4P„þúÆ2¿bMË£Œ«=À¸ŠÂʄ¸ ÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢Øq\]pj„Sm·x½`Ò"^l±ØëÅ%Þ£–znæûeˆJS˜4q…ïkË}_[![’£+‰zwmä᪆LŸ°qküß‘¬ ×\h[ÅU·æO®Ž7H·˜ò&ÆU;‹«VÁ¸  + ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠbÏqÕó¹¾e¡çˆ ¼?Ti μ½Èl}çdêJ#Â^^äõ¡gemmÙÖݲW–œ¹ÌÿÃq ¶ø½´Ø{¢·B}.eârïW–ù~ªÔÉ‹Vÿä?v¥ì;ßreSSAPø;«¦…ÖjŠ’?Z«ÿÜìÛkƒVäèÊcc>„7R‹ÇÕK¸ڂqþ8 V&ÆU .{,ÆUÆU ÆUÆU ‘q‡qˆq…qÕFy},SiòÞ\h¼é3;SW:Jß`}¿<‘ŸX­k”Ž]§).8·m›Ïˆ§>8%W%¿kŒ±Kƒ–ÇTW545jêScÏî+iÈñ ½Ø{r>ØŽ[â5RÏo^–®42|ÌïQFK½G.tÐl…ïØ•ç­ò{cµß›FküßêxÝÚu²‹_·–qÕÆ1®ÂßÄʄ¸ ÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢0®Ú½%aGjtq‡üFtcã6W?Xtê…VW-Ùb‰×KKõ%¶µÑK½_^ÖŽÏ+Ë}õ¡m嵎¤Õ[ÿ6ºþ5dëdﮓ½gĸjYà¸úõ5™[ßA;ã* + ã*—=ã* ã*ã* ã*ȸŠÃ¸ ĸŠbÇqu¾ç³Žê¹å¡s÷YèùÜ"ÿiþ•uê²¥kNõꌵ¶ÃiÛ_i¶]¶mŽ·­¯=ÛÁ2}¶5b\µ,l\==åJqóë¨cg\EaeBé…¸š²ì±Êøcð#µA\öXŒ«(Œ«@Œ«(Œ«@"ã*ã*ã* ãª=znUÌñ"u½þÂòÒâí»üF ‡dŒ«–Ž«_^!n‹:vÆUV&”Þˆ«K©ˆ9 ?RÄeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢Øu\}†ìãªe1®ÂßÄÊ„ÒquÉÃåÑ¿ÀÔqÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(vWç|†ìØ|Ïg‰Œ«–d›qµ®MöjSÔó»Þ41®¶°Í¸Z´%ÿÈŒšŒ«€q…• ÅÚqµ,Ò=yÑŒ«¦'‡ËŠq…qˆq…qHd\Åa\b\E±×¸Spø@ÚÈe~Ï YÃ*Ù³ÒGfVDš¿ÀW[ÀãjƦ×t:­tS«U+²£µjéÛ!ãª}ceB±z\ ß4ÿ^ÆUÓ“ÃeŸŠÂ¸ ĸŠÂ¸ $2®â0®1®¢Øk\•œH[x mäúˆ‹}žž{ò)²K|ŸÞ5bÚÈ€¬ Y`Œ«-qÕs¹>®nxU£ª jEù™ÿV[š©ÓiWí+ŠÕãjØ®¤yw3®šž.{(ÆUÆU ÆUÆU ‘q‡qˆqÅŽãª$ñœç΄W¤<œùÙ‡ýi#w&ŒÍªˆ²Ôc\mŒ«…'—Æ~98cãM­\ºY//™ÜOu.M§Õ0®Ú7V&ÆU .{,ÆUÆU ÆUÆU ‘q‡qˆqžãjLÁA÷¤7¦>$Ž‚WA2Ÿô>þ’>Ú=i\zYpkæí¡37f\mŒ« c¿¸ZT»×·àîZ¿T÷_ÖR0çuz6òîÛöþ´—M®ÆÕža\…¿ˆ• ¥7âêܻˣöÃÔqÙc1®¢0®1®¢0®‰Œ«8Œ«@Œ«(öWg¾ä8ì˜[ÐøCâK&× ãjÏ`ãêé/¯ÈÜ:N­¨Ð5èꪊZÇÕ¼ÃßÕ¤wõ+ÌÌǸŠÂÊ„Ò q5qÎ¥a»àGjƒ¸ì±WQWWQWDÆUÆU ÆUÆU껤wÙäša\íp\ýêªÌmï×WëtÚÚ²ìÖq5÷—©5i2«€q…• ¥7âêì;JC¶ÁÔqÙc1®¢0®1®¢0®‰¸¸ªÕj4µ5U5|PWl3®jjåÒZ>ëq¼¸:Þrq¯;/e‘mºØàRg|çOßv›ñ]î¥;cîb_–3ãªe¡ãêÕYÛ>¨¯.ÒÇÕRQW‹R´Æ¸ºÿ«ê³þVã* + ã*—=ã* ã*ã* ã*ˆ‹«õò2釗ª¤SðI@a\êWµšzªJ«E†Íê4YUŠO]U|~¬Ç®ãêx²oŒ«–ekqU™/J73®Ú1V&ÆU .{,ÆUÆU ÆUÆU WUÅi…Çåÿú#|ÚQ+«ÙÑje¥µwd qUS¯Òªk¥-áÓÞË:ÆÕÚ²œŠÓ¿ÕCÃf‘粂£syñðù±ÆUê»W-ËÖâªtê×jê‹ý×ç¸ɸj¯X™PW¸ì±WQWWQWDÆÕ¹§3·ŽSäÄX{GÝ«Z­F­´ÊO ò¬HEnœZ…ùñ¨c\­NñÍØðª<; 8*ÆU[À¸ÚFð‘µÚsg¿rƒÄ0®Z–mÆÕs>ërö~Ƹj¯X™PW¸ì±WQWWQWDÆÕäY‘iÎÏËÅ0k層qU§«¯..‹Úo1äù¡ðÄUq:|Ú{ã*ŠÇU—Àñv(øÇC\u…Ä0®Zã*ü-p@¬L(Ö«:]ièNÆÕÎpÙc1®¢0®1®¢0®‰Œ«ØZ\ÕjÕ5éA ßßl10®¶0ÄÕW¤w8ª¢“KWáÌŠ«².h¹Ùîþ–;ÚÝ츱ÉûMnÙzwÝ|µ.^Yÿ¿ãÝ‚gêãjê×.FÒÙxºØK»;Ûì´óƒºèñv¶ù¯c¸“qÕ²WáobeB±j\ÕªkK73®v†Ë‹q…qˆq…qHd\í€qÕtŒ«UÉÞé./HS UÁÑ9ù¿þ—q«ÇqÕYö¾‹ÞÅúž úoD­¶<ïpJMQº2ïìòÈZmIÖŽ¸ª tðšÌ„äoÜ [º…¯‰ª8§ÖOImUűcá¯à2OV,*¤ûu*y _ô'øƒ²ÆUËÂÆÕ¸©ÈÚùami¦V«Q;˸ê X™P¬WeŒ«â²Çb\Ea\b\Ea\qqUY˜dHIŒ«Ù̪q5÷À×Çæ3®êߎ$ϳkž®NµîÔ]Óÿq„q¬Çquµß›küß^ðÎÅŒsxÏYö~×\.ÅãjS“:ø„1–6ߌ ˆýÂ-pò>1M«>2^º?L©«/ß¹/d‚kÈL¿2Eƒò×½A¸N÷¯ªWW86Ñ5èë#9jµìHH7>SÚ0®Z8®N»!{ç¤Ú’ ýEÍóâW+ ã*—=ã* ã*ã* ã*Œ«gòŽü{p:|Úq¬¸ºJÁ±yŒ«ú·#ÑóìꧪSý€£*8:Gú/Bž Ÿë±ã¸ºðÔó’E–°ØkäR¯Qíy¿¼ÜçÕå>cZ[á;f¥ßØ•~¯·³Æÿ­5þo·¶Öÿu݈ºÎA3"j*³pk}3ëüÍÐõ… %QѺūi,Žœ`|–kÄÞ²Æòؘ‰nÑ¿V5¿ß9xa’Z‘ÿñÅ÷Û0®Z*®j5êBñßþù|\­WäÆ1®:V&ÆU .{,3ãªV]'ýp*ÏŠÖ9üXúÆU ÆUÆU WóÏäú.÷À7ðIh‡qÕtW«R|€£ÒÇÕß`¯ûjmvWœaAÆTÛ-^/˜´È„[,özq‰÷¨¥Þ£Ï3”[ß×–ûR«)Lž¸ÚïU’€i¡µš¢”O×ú¿³ÆÿµÁ+suå§c'mˆW7$ 9ƒWe7Ôe$|¬¿¿©I§UÖ7SiU9IŸÁ»(㪠‚ÅÕzU¡Çé¬ÚY\ÍÞýiuŠŸUÇÀ¸ŠÂÊ„ÒkqU«©“çDkê•:éú¨m—=–™qU£ª>ç½F¢Vbþ­Gߟ ĸŠÂ¸ $2®vàPq5gïç¿ÏÄUé¸ÔÊÊzyiïïZg*®Vž9‘ºlxeÂqÈxŒòýoî¾)Œ«X=«žÏõ- =G\Ð’s½? Ti μ½øÔ ‹$ÞŸnŽ[rêÅÅ¿yYºÒˆðW—‡ýRݘã2f™÷+’Á?—6–EE¾µ:â`Uƒèb³ç>7kôκ€wáÔâqõ’0®¶@ÅUM½RWøŸq5ÊW³vN¬Jö¶êWQX™Pz)®ÿ,}c™¹õÚ²­V?jÁeef\U++ǫ̀åðcé[WWQWDÆÕôqu݈^øÅFÝ«šºêT?+ÅÕìÝ癡:w¶÷ç¹¾¦¤2îhièŽÞßµÎd\MðHYü 4$ÈxŒ¤ÿ"rÜ?g\Årœ¸jš×Ç2•&?áÍ…&oúÌÎÔ•†‡Ž’îPèjKœò}q‘ïdâêFåÞŸ¼_Xäõ¡gemmÙÖݲW–œ¹Ìïçlñ{i‰×Èó^Zâ=Êh©÷hÃ…š­ð»ò¼U~o¬ö{Óhÿ[¯[»NÖK0®Ú6[‹«5!Zu­>®n_•tʪc`\EéfeR«ªåÙÑUI^ðÛÞˆ«³n+‘mª«È‹ÿöFeA’V«†µ`\Åb\Ea\b\Ea\q5/!ïà·6W×>W•âkíu7®ªk¥Ÿò¾ÿ«ô ÅÇ ýh™wpº²0¹÷ç¹¶,«Èsyî¯{׺Nâjò¢Ðqõ[ÆU8ÆÕnÅUÏçÌ )+T매¶²ì—_d#¯°Ð÷Ëù‰ÕºF馸àܶm>#:Ù]›«è?({áª#[,ñzi©¾Ä¶¦¿ŽÁ²v|^Yî«¿m+¯u¼ ­>Øú·Ñõ¯!['{wì=#ÆU˲µ¸Z꯭W1®Ú·nV¦ºŠÜb·Üý_Ál7z!®ž™ùÅ~.Œ«1®b1®¢TTVäådª••ð‘8 ÆUÆU W¹§s|c«qõÙ^ø¸Bwãj½ª*ñdÂ÷ÑÔÖè,|ý¨¬¥·@YØûólsq5þXòÂû+b@Æcĸj zWç{>K(Í]·ýiÛ_i¶]¶mŽ·m®=ÛÞ2}¶5b\µ,p\ýï-Ù»?V¥âêiÆUÑÍÊT[žsÎgmÎÞÉðÛ ÆU ÆU,ÆU”ŠòR1Ú»<æ|$ˆqÅ.ãªtB×jêt:-|$]q5;:Çý üT€<+âìš§m.®~÷ýÿïfé‹ógnû@z W%•qG“æÝS¹2£¼ƒÓ³÷|*Ï ŽÁÚW©ïb\µ,l\=3óÿröLVäÅëãjvtÌä~•ñÇ ¿7d-ãªc\Ea\b\Åb\E©()HúuiºËHøHã*Š]ÆÕÚ’ Eîiµ¢>’®‰Ø¸ºwrÎÞÏà“ÐŽ\ O]ñOG‰«[ÞÎqÿW÷ÛJ\­8ýkâL§²ˆ½ñåîÿ*kÇ„šŒ`à¬Í®ãê3dßW-ËV⪺¶&-0fr¿¼Ã?¨ “¥ãªc\Ea\b\Å27®**ò}ǸÚŒ«@Œ«(vWKd›r™¦È= I×Dh\ÍÞóIöîá“ÐNš²ì1ÆUk3ÄÕeÒÞ{׺Nâê}\Ý‘4™?¿+ý˜ƒµÙq\wò²oŒ«–ekq5æÿÙ;¸(®µÿsï{“{ß7oþ·æMnÉÍ ‰©¦šbLL±»&{‰ +¨”"ŠÒ¤(‚¨‚€"¢"R,¨(}ÙÞ u)ËÂRv7÷þŸÙÁuwØÎîÎî:|~?îì™™sÎ<óœçùîÌ9kÝZï¥/p’–pÕ<)Žÿ®*®â%®â(®â«aÃÕ6^ª‡ {'WÍWqWñWq‹€«CähpUnK¸Ê®6äsRVÚÿÔJ½põUȬq©*®:‚¸JH§ö]wEÀUkÊ1áªàÂvâB®š.…¼¯_ÒÔÛÆÃ½&¦ˆ€«x‰€«8Š€«øŠ€«x‰€«8Š€«x‰€«8ŠEÀÕ!r<¸ÚÓQ{ÅFp•;“{f W• yÛ£Œ:ßWàÎÅ¥>¨¸ê² ®f2¿ß}ÜÞ«ßrU…O£Z!>'àªZ\ÅýXE}í‚æ¢ha¶î51E\ÅK\ÅQ\ÅW\ÅK\ÅQ\ÅK\ÅQ,üàjó.'y)W“÷vµU\°\=6.>pµ•Óp倃ÀU…¼Oü w¸Ê=»–}â'®â+ËàjJ패²‰¸@B¶SüÃI§k¾pU-;ÃÕκ|ßa$%àªuÕÛÆk¼ÆOß„{ML‘©pµ•Ýxí W­(›ÂUy¿¬¹$–€«úDÀU|EÀU¼DÀUEÀU¼DÀUÅ®&-qP¸òY骭Od\ÍDàjw»-à*'y.†*ka /ú; \p¸ ½ÁJø€«øÊ2¸Z!ÊJ§O )·çê·„\O‡JÇŸgLe·—ßÀœ®*Ä÷£—}þ·ßº¹¹ýæ…懕´ÈõVJêÎìœÿõ;/ÿá7PþW1ncRD1¤¤áª0gWË­„¾v WI~î¼Ôu0ü …«¬ :I×lZ®â%)“¬™ÙDÀU+ʶpµ·«éfä \mãWm~®GD"àªZ\ÅWÖ€«ëyé›û¥bÜÛâ\"à*Ž"à*^"à*Žbá WÙ'sSVáÞ ØŠ±Ê(ÁŸ¶WåØúDfÁÕš/öu­»`„BÞψ™ÆNZÒÍ«°?ËšêrN­°ÿ©•úàªÏËÍ7#q©*è fü\ ­Ç:ØZ® WAùôýçéS=˜tã»=ùßr ~÷pb:}j 'Ö*æŒpµŸ{râ»=ûáÊФsÉáë?{Îí™1Ô~}åûéáï?óû÷gxì=4`ÉÇϹ¹=?;³;~Ù®rO¯j¼~¨WÌ„«#xi¥ìû:àjüÜŽÚ<›V†€«xÉd¸Ê àªueS¸: “4} Wy•~KÀUMp_Y®žóè—¶âÞçR{³ >ëWqWñWq _¸zâ'NÒRÜ;[1®~ÒVqÁÖ'2®"«EX®ÊûºÑSÙ'ãW³}Àìjå¸ ¹vkYr­Ï?š ãRT\=6CB)ı¶– ÃU©éjJíÌóŒ©Yìï ¹†ÒéSSjærÚZËÀœ®Ê*wþËíwϊЧUÍ—æþ?·×ÝíÖS^)a×ñzÔïY([/Ïþ_·ÿžyM‚)™››Kg0 ´È1sè™~J¹Ï¦¥{×ø½N=¹Š[~YÄçpîfT¬ûUÅZ7Öµ(jŠGýÑ)ì’Ó6­LùÇ<>ßnm·©”Gô ”“«p¯‰)¢R©u$’Ñbüú{ôtoJüBÜ+ìJ²Ù ¹tFN`µÏ?¨*=žåU‰„.r‹ _*•d‚Ù²‘UTp¸\‹w²È”„E”Ë„¬zÜÛâ\¢“*žÚA û÷š<…zôèÑp̞ŢÑéµuu¸Wúb^>HM^Ë«¼{M Ìž‹“ÙsËsÉѳÈÇæâÞ C*–W»ïöÍD[ŸˆÁdVWW-&ä2X…'ª¼^€pQ$÷¼"¡öHp#ZÄ¥ ¹LÒ¡qäcóx•öïgÈ\hg6ÖGN·ÿ©A•••,6ûÉ“y%¼zÇ_éY»q©*rÜ|Òáñœ;çq¬ƒ­…˜}M îÕ@Õ)ÁÒžaÂÕsäæU%"Ïj©7IæCî#äì‚븥²kU±°ˆ×a?V¬qÓ'W€«Ì#ï¹¹}‘"R<ÞÒvqÒ3n¯ï®•™v„Žë?>ïöâº2,Œ½|ù2“łްê#§12ýD´ŠF!q~gßë´äŸù®ÀGîís(\e_¡Ù@Ž˜Ê½uÖ¦•\[ Ú­í6t)ã‚?t&î51EtƒL&-&¤<`¤{SbĽ®$0{¡m̾‘Ïb^Ü_ãóOVn°ˆ^Uéñ,¿òzSƒ‹ÜbÃN'S(¸Wã©UeUÏ·x÷•÷#5qy‡¸ˆæ‰Y_ù0Ù‹:÷šØB <§¢@ȨÁ½&:fÏp¯ÆS(&“Iª¯Ç½VnTn5égAÍMÜkbX•••¶3{!‹Ìº›Å­*Òù-ÿa.9j%v¾=ÐØ ¤æÇ°Ë¯<©Ø£üºÀ9ÅI¶>5›Í®­«3^C›St²jÛ "zeSSã°Û+à•çÖ…~%bÔ4ðYõ‡ÇQbTÚ¿ç!s¡ŸÝ 6`ÿSƒª««¹<žf'³óTïø+#k7.õAE>6—tè;^Y&Žu°µX¦™½}Ô%•Z®úÝá{ÕtÏÌ¥r¢ldLé;QÅ„œ]p?M¼7÷ ˳ZñHô”ÂUié²?¹ý~a±D½¥çþ¦¿¹ýnƵNÃ;*úºÚEõ…Ñ _}ö¥y§9C¦°ó´Œ˜é W Óôv‰òë÷¾ËOßÔÅ,“÷õtÔæiN ÀŒÕQsÙ¦•q©iZÙ y.0-@¯˜ÛżÓ+æ)U/׈.ïe'-Á½Â.#{L °ë•¦GÐiºXeŠã·˜B!Y}EG1-¾æ´ýÒVöÉE¼ÔuĴ檭‘SwΗvx,î5±…dM´†+û%ôRÜk¢SÄ´xÉ%§h*Œà¥®ʧè‘„ý[ËNéüVB+fÆÍ†Áß÷I¡ÍÅ1ê-7-€LÒö0ÝZÓ(z;IW¡}mü~©˜9 ÇiÙ;Y ?ØÿÔÊ¡ÓôvµÜ:^ëý·†ü¸Ôëø|zÄÄNò ë`k¹ê´çÈÍ^ÕÒÑÉå¸ó@B¶Ð×g+=«¥eB:+®ÊŠÛwîDDDìß¿_ qÈdræ… pnSoŠÎ«Ó~ëö’Ç=©zKoŸ»›ÛØÌVƒ;v?ôü‡ò÷÷ÙQ•ìÂÎp•~t¼(wwo+{ »M”H>ð!W­¢Þt¬ ÀÕŽÚËüó[;êò•\µìWk}^n¸b\…L­›_ »ãÞ?6WñWñ’kÃÕn^%dñí•Ù¸×D§¸Š—\®®Ã…Y™%–-áj· ÂT}˯K¨EÌc3ñ‡«½:áê(Ç«=­÷N[ ®Êûeà„ájg#=bžp5ËQàꀬ³¥$¶vÇK¢Ü=¸ÔWA–ÁÕU·¦dÕãÎ ÙNsóY«Šø:mÆaá*tîܹîÿU ®žÅfÃÿCCCM½):óQ¸Ú­ÞÒ[m \•w±îå_HZôÎ3nîëò[p^Њö¥àÂz ÁÕ»É\5W®Wk´ájî®ZQö‚«ÁfÁUÑ¥Ñå}p¹q€«øŠ€«x‰€«8Š€«xÉUá*÷Ì)ûî51,–íájsiœÎoUpu†#ÂUæ]òþ ®¶Cºg=¸ÚÓVžî(pU•ÃÚÿÔÊ¡pU*†{ÖaàjŽu°µ\®î É>ˆ½;$d;Nz°é‘nè˜pU¡TîܹÓÝÝ=--Åb1…«r…báÂ…ãÆ7õ¦–,û“Û—–t©·<ž Ã´#ô3ÂßusNïÓÞng¸J ù”Ÿá)k¦kÃÕ»špµ¥4^éS{õ%@Ã=¯R1ÐÓã8f;Wñ’©pµ‘*¼èGÀU+Š€«8Š€«øÊþp²¼îv—Ÿï¨¸Š£¸Š—\®¦¬‚ ÷šË2¸Šþ+¦‚«[š‹£u~‹ÀÕ˜éx-¯–¸J¿U¿ç-‡ƒ«Û_ìs­Wûº[ËNQ‚FÁ°Û×!¢ÏNüIʱÚBئ 1Y ²FÔûžzP:ájÍŽ— ÌÆ¥>ˆ” ÖñáŠtÖ_Ç­¶—«ÂUrîôM52¦Ä›¤{¸tL¸ ‡5jÔþýûáÿ­b±®‚¢¢£ß~ûmSoŠFø{nn_žmP/h%ΞøŒÛk5&.h¥l¿8î×nÝ ñì«Jö…«Jrà{“¨á*%èc~ú ­T®6ãgx2cg‰ïŸí¨Éþó«r™¤¥4¡¹$³ÝájšKÁÕž†zA–7W­(®â(«ÀÕ§d~Z[ÈÞpU)gDãŽbÀVP9‹ž¸ºˆ€«„0"à*Žb™WòþîvÈMŒ–ìTóÒ65Òù­„ZĈšÌŒ›o臫™¶>µ™põÿd4%D5ÃloŸ´¥4…«LÒ¿aÅÏ…ÔÎ}>ÐÕ #Ä ŽW·¿ ¸°—ú(MqõÐW¶~_p•ó ®²N›qL¸ Ç1bÄ¥Ü\å¸÷æ›oš|SÈ*¶ÿÓí·ÏŠÐ_÷Íg?ïöÂÏ·ŸêTȥŷjÄhyeŸ"ìQªwW4çþô'·_I hÙžpƾú}ïjÁÕÏ™^äpµåV‚0ÇWxÑo˜ç…s ²}v`¶»\½À;»÷š˜"®â%®â(«ÀUpž=Âڞܛãt.\íje'þd:\…Ì‘1€«JW‡«RN93n6W aDÀUÅ2®öˆH yûAFK†«”Bzä$Ç„«¤€7ô­ÃeE™ W_€F1|¸Ú+m.Ц}Œ#\m¯¸ÀOßÜRï8pµ¿«¥©àpͶø^¸ÔGIÀU‡W é“sÁUôÉÕð#G”ÚpU®P,Y²dìØ±¦ßýì„oçöÛW‡:wêˆÇèÿuû¯Ï“û¿í£zÇÍÍí›ì6´ü'úãgÿßÈiküE;²Çcò+ðík[oubŸw²'\èn«ßûޏ*m«ÌªX÷+,\ÍöæìþyÙ;‡þlçJpºTpaçÔ ÜkbЏЗìWóƒ ¸%à*FV«Í%±¢Ü=âÞ§Ó°áj3óØ ÞYSájoþ-WAm"fÝ™í® Wcgp•F\ÅQ,‹à*d% £%»y•ܳkôÂUÒUZø7Ž WG´ÞM¶õ©ñ«2IÃÕ2®pµ «› ®v6B·pÕ"à*!ç•sÁU··÷È‘#L¦&\½œ—çîîŽN`²ä­wŽ,úäÅgÜÜÜþë/ïÿZÔüd0ÂÂUe79Íï§oÞ}ùÏÂf·ç^½4¼¤y`èaí Wû:Dõ{ÞÒ W{¥måij¸Š LÑß7—ÆpÕD¡“üpN-ǽ&¦ˆ€«xÉNpõʸv\ÅÈ*pr[AÖNHFpoŽÓiøp•3{fuW‹)å!U§†}IÀUP›QwÆ“€«¸ˆ€«x‰€«8ŠeK¸*å>‚`âßBøJ;ì(pµéÆ…|0Þ{ W“l}jSájw{˓ւ«µ«ß÷N¯˜×#ª§‹#\åž]G˜hÏS«¥®æ×lû ?}3.õQpÕaDÀUBúätpNðå—_º»»¯X¹þ]½zõ¬Ù³á?cÆŒi‹q¿×ì WeÍtÒî7¸g×ö4‡ÀÕ.qù95\åžYC?:¾éf„ kÇðáj¿¤Ypa»«ÃU*ÿü®2,{ÁÕý§p#®â+«ÀUvÒbø)å¥ì{0À¹6\…´]­360WO{RþtÉ® à*!r"¸*—IºZä}=FK6^ƒìi€«àÜ:ª/!Üo{ûH¹9IKE—÷ê<ŽƒÀUH²˜Çf4V{]Gƒ«ýÒVH÷¬W{:…Ù¾¤€×{ÅÜnA 7øÀÕ´M-%qÃÒµç©ÕÒ W«½þÄÅoÖ¸n13v&WqW )ú®ó¿»(U£ ”‰¹¤ýRaÙHÜkkm9\UªB¬€€€‘#Gº«þFŒ±mûö–VSW¶©ì W{„u0²sOÿÜÓPo®ÒŽ|×XpˆŸé5|¸Ú×!âgxpÕqd\ÍÜÆJø÷ »Œl Wû:„ÂK\Õ'kÁU~æ¶n^îÍq:Y®&.ì—˜W;믓|äÚpµ£6¯¹$Î(m~ WÇÀ@{­.)û#fº–‰±L\ÅKNW;É7ZïœìæW-Ùx-| kÂUaèò^EÐò¾ÈVÚ¦á|®æîÑy«0NÁ€åhp"C)§}ûþm.ж\ídx’üÝ{Űd¼à*/u}ÓÍî™ÕP{žZ- \ík€IW{þª„K}”*Sd›NÀUÜEÀUC"àª.›qd¸ªN p¤…ží W! !ù¿f\½ÆÏð&\…¸¢›WÉ9µ‚€«Ž#”©]œ Cp¨žŸ±ÕâU!ïëÔÈ©¸·×qdS¸Ú^•C>ð!WõÉjpõüV)çîÍq:Ù®‚+«ß7ÒµájÓÍHîÙµ½b®ábƒpõ ‹ÂUÖ=zÄñƒTÜk¢S\ÅKNW[拾}$Ô"£%]®vó« ÔKèÊ{¥ô#ßµÜJ€lSò1\Ý­ó8ƒp5v¦ú}|\Ô/ir@¸ ~btÒxkÃÕvÞ9:?\åURÃÆàW¹g×5Ýw ¸Úƃo¸ ¦8zpt{ÕE¼ê`pÕ9t¬<¶óz;KØÍ– H{ºÒòËÞÒ†«ºËÜZAéSB7)]ýŠÖÖôcx·Åzrj¸ê€²'\…‘>M¸J -¸°½ƒtU/\Mß,ÈòÎIaœ…ãP‚FA^s'à*^2@™Ú¦sRV¶W#C0D\¼´ ÃÕžNrì°4ªɦpzî_ ¸úlã¶)d‰€«ft2W·HÙ\5[v†«­w“I»ß$àªÒÕáj³Œþ­Ã4\ÅKÎW!ï$ß0ZÒ•á*¯B¹M½ýÎ ×E'\eŸ\,ÌöÑyœŽÚîÍq: ®Jšé‘“Ù‰?™W!m$ù¹»>\=³º·•e¸WqWñ’sÁUþù-¤«FK>EpU&©ßûNSáÑ~)v7)ç!ûÄ}˯·W_¤†~Έ™&ï•âØNW·½išàªTÌN\Tç÷j¯˜ÓŸC ù š/¡—Ú³ÏÅR9ÉK¯‡q’—Q~aÏS«5®rE—÷Özÿn[\ê£TMÍׂüIWq•Åpõ­È"×Q̃cÿfܾ7ý˜P÷PÑ›ZòVÔ¿¦wQ*?2P&úþáö_ê テ{+¬-§ƒ«ý¾»v¹ùóõõ…¯p¿×ì WI×TpuUè1\=ô•0Û§½*«R1pµáÊîéŸõ0& «ÇfVzü¦jãoYÇ„xCý•+ÁUèRè+®jŠ€«Ce¸úˆåP¸ ·¼¼ßx^/¼è'¼ä/k¢áÞ?6•uàjA8/u=ä¸7Çé4l¸ÚD ÿÖt¸ VÝ®W\®rRVÊšŒL½Ò&¤p/p/9\Mß„ÎuoX\=ñSã6îu6,Ö°áê€LRçûOh/:A¨¦¤ì¬ø¹zájUJö®¶ÜN´õ© ÂÕ(a6®þâ…b¸éð€TÌŠŸ§W£§JhÅöìsHcÙ'CêÊ:±€ü©=O­®¶²E¹»k}_fŸX€K}”*ÀˈšBÀUÜe1\ýµ_®ëhOq`Û/÷/\ÿ úqÿƒByoDì•_û¬þ»£êîóÊì¾éÓòËÃì‚ßàÞ kËéàêñãÇÝÝݽ½½é †\¡Qi4OOOؘpü8î÷š=áj{u.Ä*œäå=Â:,\•IZË’Q¸Š> C;ò(o$nÇ«Œèïá°•žui¸Jâž^EÀUMpu¨ìW½ÿ*Ìñ5 ® ²v.lïi ãÞ?6•UàjÃÕ¸A$´Ü›ãt.\íl¤Ë>¡®Bb(ïí’k¼¡TQˆ:ßWš‹c&ÜN*®žZaôÎmÐêR6».\½K;ü5W aä\pU5×}®Ñ’àÖX ?H(E¸×Ù°XÀUî#H7Yj¸ÚYíõ'puÀUÖ=æ±ü OÇq,¸z=LÞ߃nQÍÌöjsÉ1[ŸÚ\mºqDpÁ»“RØ×Ù‚ÄZp.#jJÝ®õŠ9z)%äS|àꉟD¹»!Ù$¾oÏS«…«²f†ð¢)`ëø|ûWF¡K9åݼ zäd®â.‹áª›_®ëhOñ>8ý5úqÿƒòÞ£±WÜü VªàêsÊì¾éÝòËÜ‚_ãÞ k˹à* îcÇŽ]¼dÉ€\ë•ø¸páBø ÷{Í®pµ2«ùùì§nAõ€T¬‚«cQ¸ aLKi W¯䤬4Wåý²¾v‰+Wm"¥®Bo SiÑêl\ÅK¶„«Ê¦‚A¸*ÈÞi\åŸß ·9WMW-–íàj¿´òV p@ájSa¾)¶Mõ®Ö.ÖÆ¯¯KZç²p•q›òW aä\p•{f)ËÍ p5~^'¹÷:Ë|¸*e?à¥mT/};ÐÝV¹ñw Wè„«Œ˜é¼stÇ¡àjCþ¹l0Å“P‹kv¼NÛÖ§6W‘¥42½ ŒjÈšhðÑŠp•1¡n×+½bNgýurÐÇ\UªàªèR@ýž·Yqsì_™^IýÞ·[î$pÕd9\ ¸ì:ÚW²¯ý—ûY¿F?•#à4.ßm÷ ®V—=g¨LÁþ/ÂûwŸßw+¬-}pÕ,Ù ®ÂÞxã“IIC¿Jra¸ú«Ýy®£ÀR8½ñ_èÇà‡8¿ú«=7V©àêÿ(³ûÊ_N±îtÿ}Õ×L{/ï¶XOÎWÁÅ}øá‡{÷íúl„¯p¿×ì W!û¨ÝùwtHíëŠòöÑ#&€«Â‹þœ¤%:à*û>=r’‰ëekÁÕ„ú:Dê¯\ ®rN­°Û{о.æÝÚ“÷pÕ™dC¸Ú/kÈ„«¶CöAÀUŒ¬WÙ‰ ¡cqoŽÓÉvpµGT/º¼÷é„«ì“‹Ð ô è1\ýBîŠ]AÀUB:åLpµì;iqÛÃóFK‚£cÄLsy¸ªPÈeTˆa CÏ)i®V\ }̈šÚ/ãØ}í¨ƒ#ÂÕó[9ÉK!³6\m"ªöüco+ W¸º@t)Ààj#êCúO¸ZÉ>yÿâòt\úÄ>ra¸ú›}W¹¶œ ®*”ʵëÖ½ù曕•šÛËËËßxã ø ÷{Íqá*òP«/²"gúfÌq,†«Ì¸Ùšë»\M^ΊŸgŸÓÉû{$”B®:¸Š£¬W2eYgBÙ® kÑEÙ47> pµñF8d‘&ÂUJÈg}ÎÁšÌW é”ÁÕ–ÒxÖ‰¦ÂÕè§®Êû¥Ü Ëà*t#9ð=zädÍåì¯Þ$JW¯„°F fì,+ÃÕÎRÀˆjÏ?àWa`ÆL\Ø ¬ß÷®=O­®ö4Ô svQC?Ç®6ߌ¢"¾—>±\®þÏ«„\[ÎW•*G÷Á¸»»Ïž={ûŽ ™³fÁGØ_á~¯Ù®¶”ÄÕzÿU®2¢¦€Ûo{˜>®RŽdnc%Ìã¥z`Žc!\õx†;â õW®W»50š³âçÚçtò¾ˆ^lWËÓÔprvNò2f¬Åpµ¢_QîܯŽãˆ€«¶êؾn^EGíe¸Š¯¬WŽaÆÍš2wó«Y;ŸF¸z=Œ?Ç ¸ªñæ^‚q¡W̰Þ\ EÀUB9\m.cÆÎß?c´äÓWzá¾®ôx–ŸáÙ×½ˆ]¬2ÈAØ'knTÈûûÚ…ÝíÑÔ£pu•µ§®6äí禬dÅÍ…t̺p—š/Uoý}o+«½ú"yÿû8ÀÕ»IpRAævVü¼:?w{žZ-,\Ö ²wÒÅ®6^?D;ü Wq—ÅpõÁ×¹¶œ®‚ ¾òòòzã7ÜUðOOO ºüœŠH½žuK§’/ß•+´V,º[ÃÔW¯õT¨µSýUxhàžÅ£ƒ=—D'¦Æ¦æ†íÛy`ÓiáÛ›‹Éšèj¸zÆ\ûÚ—¢·‡íÙn™¹êÔõûØ¥[2n<2¼Kw¯É4l® K‹?¨ÍUŸ.ß6Ã\ã³Jƒ²Z;´¦«1j®TmsíéÕqäÌ›‡}ýç¾µgñ片|0pc®ôÛX²M®Z×\Aç®a‹1Ý\Qé4Wµâ2näÄíá¥mÒÜc®GÎ\=|ꊆ¹–a¼ëj#Þ•Áo†d„u|~Gmž)æZ`¾¹öh›ky½yæÚÚ)5×\/–˜ç]-6×à91ço-ŸUT‰©’NsM½¼oõä›çǦæa¼kmÕÃÐ]lÑ,¶Ï{Ï’/Ä¿~¯Î\s-7Û\›0æÚ ã/Çž¹u<%>;Ò•TÐ0§0æ]ËäJ¬¹>à´e_Ÿ¹¢%Q¸Zìýô!îæ ÷NcÁán~¥iæZkÔ\£â÷­~0ýØa¦¹Všà]-0WµÀìÚ¶Aá6>Æ\ûä‰Í3×›™«™k®§t™«áS0˜` Ãpù‚ûØ_1æqözX²†Ágßêé³µw5n®¡æŠÀÕc3Ä÷N×ІËç‡ÿ¬ W-0×ü»†ÌÔ¤í]-3×àãÙ:½}‚~sŠO Ù¾2Ôg}‚*ž‰Œ‰÷ÿáÝP_س¹|ÌT}¿Ç¬àmK5{îJxH`d쉣G¤l…«FÍU¡m®·«f™«°k®ÇNgØ8÷P O\úuÔ\1põ¼aïªÃ\9&š+ Wuš+ä}ÁÛWÀ¨#é…Ì ®zý*¦˜n®O¼«†¹Âe ˜ÿáîAÃFFî[5áÀ†9e%ׇé]M0W$œîmãAN*ÊÝ}}賈þº.ܳì+=æÊ®w-§(’x‘Éòûo7¿úþ)Ÿý³!ÝÖ·Ki%ë]¯XÇ\cÓò÷®øöÐþ]×¼GiÂÕ¡æŠQÁ¬w5l®ÇÍ7×z¶„1ê]óŒy×Ès“rµÌUªõ³fµ1ïZIåk–—Xb®uƒf¦"¡²®¾x°€kËá**ðEpt¢Öm¤OŽ˜íÿÖ¼=:õéÒà~Èÿ5Ê%åë+Œ ÝAô¨þêõ©›_ýz‘ûøŸß˜¹óÍÙ~¯OÞà>nÕ²eKYñsò[JãP¸:nÖ’×&¬yõÛe¯MZ…_›¸s ö½úÑñj¸}¾È@}à\¡‹?@àêZ7zä¤Þ•×Ûßœ·Ç}†ï›swÝeÙÞdL/-ò?i¸Õ,a«fù”¼{†ËÇ](Õ,ß(–.?gG¦JëCS1Í|müÏÐ]ê-U4-›Ì)®2|а­ ¤»·ÿ£Eô~sNÀWs×càêΨ,çPà(\-,§ -3bêhȈi^ð¯þ¬ èÕ§øzÍaÇǘk_/ èðë“<,3WÚt;eÐtÏû´vh­kØ\A˜P 5WZ¾ûÄ”s}sÞn0{–Pkõ[ˆ” Ÿ">KË\Z;uynÀë“7þëËù¯Ž]4}u®® I5pü×&®+ˆÛ® W³Í7×ê5WÐx£˜^2Ý\Qé4×'ÍŸã¿~É,vâOš»`Ì<íë³üÔ?[‚õ®'xWˆîòö3cgµW_4Å\76Û\ÅÝšå£ÒÍ4W®ÙæºÐ?Ñð.,‘–wµØ\_›¹ë9CËÏõŽÇTI§¹Â˜õê7KÝÇ­„ÿ`¼kVÁ=°afù×&{À½ðú”M`a§Í3× æ›ë­*†fùs…††ßo…ÛSÞ?îæcW2p|0×ms=pòÊëS6 þÆŒúÌ-‰ÂÕÔ•/C×™e®Ó¶Zß\Å÷Ïð3<»·M1×ûŒ›ë3¶¿úõoÐl‘ÖD‹FÍò Íò"]ÞÕs}b‡3wUÑ´R6ÈÈ Ÿc®RYß ÷›e®Þ™«™m®ËC‡š«áS\¹S§YrsÃå·ƾD1WŒÃ‰%æ™kÚu-ïJá4.?Ô\ò3â]Qsm.cDßz79Ù˜¹î[5^®Zb®Ág ïRM×ö®™«>oš¸!B§¹‚{müj4ã‡9bú¶}µ¼:x­ÛÚæZp§Âý»åPXó°oÎö}mÂjˆ`GLó\;ûK \5j®˜_Z÷'šg®HXs…úÀhy @¨¹bàê÷[£ Ÿc®‘i7M4W®ê4W¨ôŒ Å[4ä×xý E…¼ßtsUKÓ\ßœ½ë__.xõ«Ÿ áA ƒõw+âÒµÞñ1j®óÌ7×ò°¢„VÜXp˜¸0jÃx4u}õëÅ:Ë:S yü®ž¾÷2ä]‡šëŽÈ ʃåkÆ®ÝÜGç#vBW@‡ëÛ% ë]¿úÙ:檊š–@j³ôMM¸:Ô\1ÚŽõ®†Íõíöšk®é×µÞ¸1ê]W¦ö®àp^›µKs §AË\“rï>EB¶V0 lé0×\×>6WLŠ„Êb¸úrx!!Ö+Goz“Ì{ÑC§p«Ž©é›Â§nŽœé«S ý1ꉜÛú £*©Ð"u,‘ú«É‹·Ž›öㄹ+§­ž¾éȤE[&ÌY¶cíJð'ì š #P¸º|Õj(3núü‰óן½ þÅœ‚÷à’&\…tÉ@}à\qk>„«eÍ pwèWãךî3tÿXì@ã“c¸ÕüævÍò—Jk —?ã‘fùÖ©ÎbSWùMüqí´õAžG20U:p2_«™¡殩·@Ú¨YþæCªá*Û×,/ëøÑ績Â3¶F.^ë…«GÏ¢ßNYî3~öÒ[£0{=zü¼. Wï×±‡yÊ h4þ0, WWìK1ÐŒ¹öµñŽÜ?iáfËÌU§BNaÚ–nxÌsw†Í”W+fV›«> Í: ›+˜=æ©¡K¥Õ†O‘¡m®-ºÌ.÷äE[¾?ùÛÉ3×yùcà*„^Ž?qÇ­Zpµ°œbEs­>€}áQm®úôHûñræªÑüȽ›cà*Æ\§lŠ˜¼ñèsõ?‰ñ®ÇyWˆ™E¹{! n¯Ê6Å\CÍ7ש–¹¦^{`¸<Æ\!÷1\^‡¹FgÞEÐÜas°þð´­ÑCË{Á®`«Ó\§o>ãx¶é›b¼ëõ’²‰?¬ž´ÀC³»õËó ®æݾw1Ö/=`ÎÃK(ÁŸ°ŽÏo¼~…«×Oœ\tÖëë ‡Ö§̽¶sŠÖš«šp•Ó 6PŸ‚+o~;WŽïi Ke}ÈW•Œô+¥7ËÉCwAˆÔT5]`¸Õ˜W¿Í†ËcÞ8îíÐYìJZÂ…°µù¹Ú/ €H,‘fÉWÏïûéüÞê-ÝZMc›Äp•0ßBbr§†©¯pÉýªç°ÓP¹Mè·y§#Óüg•<¨Åì¥þa…«­Ò¡G†}Ïï ‡ÿWÝÊÃÀÕû$¶ŽúT2J+h¥å$Ms•÷vI¨EÅa?æDï´Ì\u ó" è…gx—¾¹fyÃæ µj¹¸AsÕ/³Ìµ´’žžWÚ©M$¬b®`91>'½”²æÝëñ;1pc®eÙLIÕšsµQl¾¹Vë5WЃz¦—ÔæªO˜ßÁuš«Fó«ï¦ìÆÀUŒ¹æ•V\**W,â]Ƽ+ÄZŒ0¢§¶Wf? æŠÊZÞ5ãêíÂû¤¡å+yWTE·ïÃø•î?»èÎ-ïªT°«oeX f¬Y€>´·¹VÒóÏ'fì_rãFj®âûgxi;É7¬e®×.eœÞøInÒA³Ì5}÷ÜüŒ¤Rh¡öO]2=Á€¹æªVFþ­Öv­÷¬­î]‡š+Å"s5 á˜«éÞU³|‡´Çpy£æš»*§PËàQsU(äò¾n…¼ß\ïÚÕc¶¹V™æ]¸zt|Ë­ã‚ævÃåœÜª Wuškɽª‹±þ»ÞÒe®uÍ$éÖz„Æ2s=Ÿ«ðA½Îòåõ\æz=7Ò“ÌП‘&”×^I‹OZòÌ•޲JNk®×À'ÝMÝ1!}Ïš‡½Y\±+øÛ+©±ù^#é‘“4×ï3Á\µªd®¹¶waÍõfqišßL†Šï–£æª‚«/4^ EwyHæ>…ÅÁ WuškN´ô[šï4IïÝÈ^ôÓ„«&š«†w4×ÒGä‚üKÉ+_Ý,¹uå\üYϱi»¦SîkÁU ¼«‰æŠÀÕÌíŒèïË‚Æg\=Úã£ÒJšs™ë]‡šk£ò™×ŸŒ)Š×œÚ#`šß }»Xä]M2×¢[eg6~–¹ý®ÿÇ*¸zFŸ¹bDæ`ç+¶¹šè]ky×kwk² Ê4·ôè1W}Â}æ›+sÐ\1^•epuUiÔ¬úw¢Š¹ªææ3.ÆÚ’²'\-**r×ÿ7ü¶ Sö\ÐJty/ùÀG¬ã󥜇ƒ ZÅLãœZޫײNÌ'}Ì;çx©ë1ǘþ­”}ß”“v1nÓ#& p•vä»Á“×ÀhA+¥b@*n«¸ ïÕŠ—Úžçž]kJK»ùU¬ø¹v[Ðj »½åö } ZµÞ9Ɉš‚i‹¦ ¬ìû2ãæ «ÖJ9帪S Å@o3C|ï´æFYM˜ã[·ëUáEû?U²Ý‚V=íÂK˜­àV•÷_òÌ´u6!+§Ï7PÆ* Z‰r÷@ÖÖöû(;!£æ‚V} ä@d Ì2%½bNãõ0jØt%µ„—üÁCâ» Õ@OGÓÍHFÌôþ®+VtyOCÞþ Nšltu›6NumÂrœ´RÂÀÊN\Ø#|Ä«ç<:IØÇ-–„r“äïÞ\mÖ^Ôƒ_ˆœSÈm Zá%} Zõµ :jreÜk¨Vsi-ü›æìôSC¥ZÐê{ô· }‚`Y·èìZ[Ä2A+ µ˜•ð7e•Rõë|ë½Ó•Ïp’–ÂÈÎ;·HUýõàhÌ ApAa øÖ{)$ÿ×!ïèmÃsÍbtA+aÎ.õ Œ\Ýö—†+ûm}j ZAXNšB;ü5Œ¤Ð¸j±äý2 ­¸vçßÑ­àÚQ‚FAî`E?oXµyÇÂE‡4“{f5ô|Ý®™²œ«Õ…YЪ‹q‡Ÿ¾™sjTÌþ•_GÚý?sŒwõ{ßvØe­"W]Ð*‹&ö¬–~•RþÁ±B®§q窼j¤÷Ez‰é²\ííëûöÛoÝÝÝÓÓÓa¬hÊnTÓ€ì WÙ>ÔÐÏÙ‰?iÁÕäeä 5ájÃÕ`øˆÀÕ³ë`ü…M¡ÐúAª½2 µ”uÏ”“ÂðM?êèpU!èæWC“{ÅZ¿QšWy•Ìc3ìW¥âæâ˜ší/8\…:´W_¤}¬¹: êP¹áY®jÊ®pÕãÙöÊly_·Ñ}¸š¾¹G„]ÎÆ‰4 ë¦k ŒÕàê‘qâçpo²ÓÉFpµ³¾€vddˆ˜ð®Æ®Þ8bu¸ 7,%ä3qyW‘öªáòŽWáJ¡KÂYEäu>/p•Fúàj Y•¾½*÷ªÕ\G û‚:£%E¹»2+g…«”›0‚sN­P"pUÒrûD¥Ço8IKL„«àaèš ¶–©àê‘q²&Ž=gwD¸šíK ÿŽú9Äçj‘Õàj¯´£.¿>pdÕ¦çz[X­÷R(Á£ ùv…«é[háßP}w7W}_Q ýö^cW%ôR^ÚF¸i‡¿¶sM”ªÉÙ¸z~+tKýž·!¿³ì&W…« ÐB¯jéW_ŸzðYü-B®¡oRʺÆö¬êJ¨Á>(n™ìWáX#FŒX½z5î÷”>Ù®fySÃÆ¨àjùc¸:´´~ï;špUty+árÐÇÜ”UÅqO¯Ò~øMÙ^qüISÇŒ"Cå$pµ¿›WQ¿ç­ÞV­×ëÚ¦sϬ1®J¹Q“íWû¥­³Wmþ_èÌjp•ý€uüG®ZQö€«;^âgzÁíYéñlÛ£ Sà*/}Øy»§ šßx5„;Ó@®â«aÃUQý¾wQzàªç¹§µzð<\½vp »Ýâ“Spê†ü`[ÀU­Zï&AëèÌ€«íöO=†ÀÕ{§Uh뢵NPëýW®ÂÈ™àjq 5ôó¦¢(£%…9¾ÔC_uÔ`§Ô”“ÂÕÎúëŒè©œ¤%ð¹ …«Ï€ë€Ü„—ºR uI ½”ü)Œš»ÂÕ‚Ãàí Wå}R›†Ž2²F*ÔG®*%”›ŽWÁõ‘÷}éšµàꀬCúÑq•ë#kfàWyi›àÖ „~Î9µÜà*µˆ—ºŽŸ¾¸ÚÛÌ Œ ઃÈb¸ ºÆi_s«a[M·¹kȳºkm©°¼Ñ Ϭ¢²\…C|úé§k×­ÃýžÒ'{ÂUÕKY'æKÙ÷P¸ÊŒ›ÍI^VëûOÖñÕpUxÉŸ?ô1çÔ úÑñÜ”Uj>£PÈ{ê›KãÈ>² ®v jÔ_9>\?H…N€PÜèì W»š¯…€«ôÈÉ2‰¾ÝM„«p‰™±³† Wý”J{‡7+›ÂU‘ ®Ölÿ?Þ9ãM‡«irO¯rj¸ÚßÕÒÍ.püxÜ›ìt6\’ü^¯b*\ÍÙUëýWÈd­ 6ÍÒ@w[CÞ~[ÀUÒî7ÁW7^ ¥ù®£.ßpùA¸ü f€³‹Tpõĵ{i½› Q:k±UDÀUB:åDpµ© ¼>ð½ÆáFK"pÌUá*éD›à+”(\-¯Üø;HR®बÐJÔ%%Ô¢ú½ï€Û×Ü< ä WCZn%XW‘Uåý«Ýüª¦¢è¡±GP ¡‚®BöÔAºêpÕè=zÄ„Žº«Vƒ«Ýíâ{§™±³+=TpµìœÅ®pµ&—{f %ä3dæÄ…W)…p'ò3TOWó† Wû¥­Ð휤%•ÏÈšð°RFôT£?üYKë" ˆ`àjO\PE¿L©TX÷tpLdQ<íóPaàj'é*DלãWyi©a_"s®pWY Wýîð½jºgæÒ?9Q62¦ô¨bBÎ.¸ŽŸ&Þ›{…åY-x¤wÂ.‡‚«*•üøïÞýûï½÷ÞÞ}ûÈCþ î÷š}áêzÈqXÇçcáª÷ß`4®B†ˆ–\Ƹ £­æS Ww¿ÙÛÊÖÜn\…XÅ(‡´–ú;!g× W‘Õ¥Šc¸Úi\MdÆÍ6®VåßÓêö}n+ÖýZpa»)k*=%²\íïl\ØAÀUe¬W!H¦†~îÚ1ªd[¸ºõèd}j9\…”Sµƒ3ÍúpÕ÷ŸÀ"p5ä³öÊ,Ãåñ…«­w“Ñßwó«Ð-\%d9\%í~S½Ž¼™W…ý9IKqlËîpbNÚáoD¹{šn„ƒ{4 ®B˜Ä;·¡áÊ$Ìm© ®z©×aWË1áªê­‡7êüܸZ›5¯öü£øaú0=! pM7#!ò„°SÖÌh.‰…ëöêK¶n,*ˆuÙÉK)ÁŸ¨àêOu‚ ÀÕl¯É…hÍê1@ë½”†«!:ÅÓWWÂýˆ#\eŸ\D û’ø¾k®® WÏ‘›½ª¥£“Ëqç„l¡¯ÏVzVKË„ºß5v(¸ênòî÷š=á*'i ëø|vâBp5jŠèò^M¸Z¿çmVÂ0<=pµvçß{[XšÛ®öuˆYÞ¶€«¢2b¦µ=LW¢p5f:Êpeä}Ò¶Gç!`Óêtÿ‹NÀU­«CÀUÛ…«`º ýëÃZ® ²vBôîÚ1ªdS¸ZµåyH©4·; \ÍÜNœlm¸º¥ÖçïÀ:)\eÆÏ…äÔ*ÇWÈ ¯Ùñ¢)Oýi «÷NpÖWñ’^¸Ê¼ CžÃÁUÿ×òƒ–|ŠàjáÑZŸ0¢¦BJÂN\¤‡#puÏÛ´Cc5wGáª0Ǻ‚yûÁUZ ?}SË­ã˜í(\…@éÚàjÀˆ:¿W!/ë¨Îå§oAàjyšbÀùáê‰äýïS‚G±æÁ=Rëó2$tM7Žð3<{żáŸB˜íFˆ.fI\ÙiîÔÂÀU¸UáNlÈ®&.„!ïÿÀµWW…««n5LɪÇ²ææ³VñuÚŒCÁÕ”””Dþ î÷š=á*ûäbÖ‰¸ÊNZ\íùÈþ µàê[¬ø¹È‹O\ý›åp•SN ÿÆ~pµ]ÈÏð² \‚ë…þ ߟ‘-5ìKÕIÄ÷ΆÀÕÃ\ÅŠ€«6Ò \þ^Þ+ÕWÆJpÕ›ôqëDÜ›ìt²\õ}…zh,fÉû'põ„ãÁÕ®f^êzȪ,ÈÙ ˆ{v-dÄ૸üIÛà ÃåÛXµ±‹®ÆÎ²V–cw{Ur¡¯†˜³×5t4ÜÅÜ…µDÀU¼¤®J(…Ȭ¿W_k¸rÀèûË&ÁUi«0Ç×éà*4ŠzèK¦jåÕR€AÈ †‘“!†ÑYýɤ‘v¿A ¥¹;s2ã!©YÁ<=r’é!Ípàj'¹"®–[ ˜í(\ågzõ¶!dÏqàjÝ®WjwþþmÛÃóüôÍ*¸zÎà*¤·õ{ßEl&f:¤-*¸Êl¼ÆKÛÔ+æÿèc'èÊeÐXAæ¶nàj{õEH½¯…âWE$®BZG|®‹ýë`7¹*\ÝA’}{wHÈvô`Ó#Ý$СàªZ}ýýQÑÑɧNÉVžqÅZ²'\e%üÀNZ ~¾‹Yc(oò ëÉÅÕ[ÿŸN¸ Q DqœS+ÔëÎ?}p5…}b¾Ip•}Ÿ6Æ~pµ¡ épUB.ènSOín®'¾wZ9W§P~a¸2²ÎÖ{)X¸Êº±W±W‡€«¶Ñc¸:Uí¬†ÊZp•ø¾1ªR9ÐÓa·eYÖ«acœ ®rÏ®¥ke¸zfuõÖ?@~×H>ð‘øvº?ŒÄ̇µÇÀ˜®Z¸ÄÎc®N¸:³åö «ÿ \5á©?µä½RJÈgPîÂZ"à*^ÒW;É7,†« …¼·™Ñ/mÕ9Ý¢ÅBáª(wÑ9?M«ûA0àtpµ½ú%ôstnˆWEàÜöÀˆœ žœ3½³þÉŠÂUp}š»C¼J;4ÂNø·jósŒ¨ÉÝ‚jO-ï“‚£¶®Þबl.>öäjEõ¶²»y•\ÍðBÉ W«½þ$Ìñµuç‚«é›j}þíð7mÓmW› #è‘“1Óì W~ Œ í~†[ÀUzÄñƒTU&õKcÁaîéŸ;?Ȫ),\­Ì‚,̃ò©}ºBSRÎÃ:?wè“êßÓ´Rד«ÂUrîôM52¦Ä›¤{¸tL¸ Ç1bĤI“úp¿­tÊžp•; âäÉUÆíÞ–èò>ø¿q¸š´t@*VA 1Û \Ýñ’%p5ìKͽ ®JÙj½±pUµºÓìNJ¡Ñ# põàv„«<îÙ5áê8MÁÏðl¼Ò+\®ËpUB+Ëm]¸ MI†9ñ¾ÙR* š‚Èm˜Áç`¸jõKšD¹v‚«õûFÂ-fbyÈÁ{D$¸í¿j­£iøp²B'ƒ«’&Ωå0ŒÚ®„‹rw“|8tº?Œ¸3Æ fììþ.kÖÄ¡puª&\…ä·¹Ä:Yž…pU&±®ÊûeRî#hŽY5$à*^2WÙ'´=Ê´à˜`9ÂlŸŽº|SVÓ5W/í–›§Â4¸ ÁÀv§„«!Ÿ1ÍP>†«”àQ>ðÓ·`à*\Áº]ÿÂÀU µFØH|¯róæÁÕ^)'y2XXWO-o*ŒPoA#aÞ‘rê„«Bغó ÀU^êúê­¿Y®67奮CájcÁaÈ@p «DÎF±.$k`¤€ö€«×èGóÒ6Jè·0Å0p™¯ q!Œz˜5í#ÈLëü^eÆÍ”€«¸‹€«„ô ®²N›qL¸ 1íèÑ£¿þúkxCeO¸ ñ Œ¤È{îôRtD—÷q’—rRVè…«ÇfP~ÁNZ2˜œ*0B¡e`8îbÜ6å¤Zpõà0дW_”rÊ•Wú ž5;^‚°¿³QßBòô)ë]ڮ…€pN'\…Ê7EÓ¿ímå¨7²~€êIY÷ЦÂUúmzÄ$“áêÍ JB¹I=8ƺp[QdÍtût2*…b@ÖH@ši…£Ù ®"Óðfn{jáj_‡P˜³Ë!áꀔý fÛ_”J®® j¶¿^W;ê®R­Úô?AhnçŸßåq†«ìÄE6‚«ß /ú™WÁ9ü_ïk×=³“Í„ÀUSºyè––Òx Ì]JŸ`Ði¯Ì¶\èéh+OƒLÙ¬pÕºR(ä]Ì2 µØhIp""tÕNs5ÐÝÆˆ™&m•x@-® ³}Á2 µ]Þ/¸°ã©€«R1²БïháßðÒ6Ò£¦€Ÿrë¯×îü9ð}ÍÝјy1|Ï[æÃÕ.öÉÅ¢Ü=èâSf *û6Ý8¢Þ—*ƒÌ6®zþ ® ­;ß\åž][µñwU›þÛÊpUÒÔxí ÿüÖê-Ï÷4áÿŒÕï{Žß#"Ùº½ h XNï+¤€×‘gBTp’%¹g×ifCK®6\ …«LœÔVqÛø CƉ­÷Nc~ °áê±™`Š\Å]\%¤OÎWAGuwwg±Ù¸ßV:eO¸J˜(ÈÜ©„V*k¤Š.ïƒ{fMÕ–çiGÆiÂUfì,Òî7ÑßSB>Õ‚«-,´LÕæÿíòƒNA Gá*%ôsðí¼sš ‘8ġ઄Z„Ä÷Ï´ÞMîme£Û¸5µ£æ²Ñ#Ø®¶²á:Vm~y¨XÚÈ{¥æAà$kf¨7²âçBZ-¡ æ#&ÂU ­FdSáªÿ뚉ª-àj{U÷ô*H¬ìÓɨTSFT‚m<~~{xG³\mãñÓ·<½pµ/ÈÚ A5:#–NY ®î}§éf¤‰å1p>‚žNÐ:\¸ÚƯöü¸#,\­ÍƒUÿ›3]s;/u}ןq‡«¬ã?Ú®B~'ÌÙE|Ïè³”øÂUFi‡ÆJ¹Ð-ÐÝTxÔ*Ç—÷Ë ­¶\ín‡ðâ"³jø”ÃUpw¤kê˜Ê èm¼~Hti·Ñ’ŽW!–€AVg<Ùx5´n׿øç·öw¡ÀÚù^&ÂUÝÎàj;±,«ÕpY 0˺\¸;DÁÏ?¹‚õ×kw¼T¿ç-ÍÝј“ð:ÉϽrÃo-€«Â_KèSG]>˜SãµPõ®v1ïBn¸ªK9åšXØ0\­ôøM¥Ç3à„Ååç¬W;òƒ iêt j®†0¢§Öìx‘9Ù”Wÿ†/ÈÝ‘“k}þQççN?:«;ÿÑ#"5^㤬ļ“h™à°­e)h"Ðpå@ï?!ã3 WÅ÷Ï‚yˆËÓp„«È}td2ŸWqW é“sÁU¹BQYUõÉ'ŸüüóϤúz²ö…JÅý^³'\¥…+ÈÚÉ>¹HB+…AGty¤Ÿ\Ýü5ì+M¸ éƒêç¿©”àáÂÕNrº° W›nFAxç<”ŽW¡à|v”ûÝî¸pµ…ã5T¸¯³?CÌ©®"´â=sá*µ0ãpµ§r 8¾fº¡†«[Zk^»öªNʪ.æût2*g«½­^ÚÆÇpu5ä³O!\…ÐÀ“'Ö‚«¤Ýo4„›XW»Xe]Œ;ýÖ°%§“­àjÍezä$ð?¸Ê=½n[|á*øgð½j¸ Ĭ‰ntZE£âžþ¹zëïEy‚ Ûë÷¾3t-Œð„«J%$tÐp5†6r^«üd¯\uXÁâ$-Ñ$cÃ=`0Ç! K/\­/`%̳?\cûaëz ´!oï˪GìØ†ÛŽÀÕ°/ Oe9WßÕX,–pµ2‹ô1¸q4UpuãØtÚ¡±œSËá_uѯð¢_õ–çI#´.+¹€zpt­Ï?ê÷½[»óïfÃÕÄ…‚ ;ˆÚÌ–vÔ^'WP½…«oƒß³\U€Uœß¢™‘†«ê%0ZËNñR×Á¨*~ª®*ä=íFý¤\}«W0ͨõþ=b‚æJd¶SkY íÈwµ;^ªÛõ/HuUpõïºC­8ÉˬW©‡Æ¶Ü:ކ yȼµáß…«­÷N3ãæ´UdáWé“­|DÀU|EÀUBúä\pŽånð÷{Í®põÐXJÙ'«àjWÏy puÓsìsv ÂÕlŸÁ\Õ*p•t ]ØH WY ?@tªtL¸š»bKà*«Œò©Ýબ™Á<6Ót¸ÊˆšRçûOh#úÑÊpµ[ÜR¯®¦o‚Vi5WO­ÐJìÓɨœ®žþ¹£&·Òãqyš¼ÏørØÜÓ« ѹò©³è \Õÿä‰uàjæ6Vá3±<®Š.ù‹.ô4qï1ûËvp¬—?O'\…a΂7=­%¨*2ÿÛc¸ÊÏô‚|}¯p8âœZVµåy²Á»:>\m*Œ€TW ®üBóA¯áˆ€«.èaô9«pØpµ£î 3~pU&i.cÆÎúWw½áM¨ÞpÛ¸:º½2Ë@±A¸zb)£¿Ä2®¶=Ê ¾‡þBÚ×.€¡yìÿàœäešpµ­"¢YÄ›iÃU¸¬pSƒ+ ~VOEbüÒôv±âçB§Y Wa Qo„«T\=¿}'ÝvpUÞ+A¦\Ó |úà*D#0,>ž¥m œ”•Õ[ÿÐZ–¬®öw5CÇJÙ÷ ×W!“‚k‡rN+þ°2´9êÿ#p5ü[¸úu¾¯¨àê\­]ÚÍI^j¸Š¼zY‡NZ „ Žvx¬q¸z7Ìr\àjóNÝ®W¡C ©§}l­ÙxS\}Jsÿ`Û/äⲑ¸×dr.¸Ú×ߟ’’’¨ç¾Âý^³'\¥„| # 4Z)2ü]ÞÇOß 1*W~!¸° §ü OzÄdX<4¶~ßÈ'pU!—µ0‡ W#™±3‘¹’” „«Â‹~Ü3«ŸÀÕ[Çé‘“M«]Œ;äýïÛ®BŠg:\…ŠÕîx±“<øzŽÊÔt3Šf&\í—¶6—Ä"pµG\µÒsz\M^ÚI.°O'£rJ¸š²ª½"«Òã™Ö²S¦Ð°Ù'~‚fÚ³c­+»ÁUð™µ>/[ W!ÕæøpÕ€«`ù¼T õBá*¸tÈÓñjr_‡’5\E¦æ+<Ú/i‚ܦÅ0«æ„ù_AöN¾ë÷¾Ý\o¸¼£ÁUJèg ù¬rüaÁÕÒx¹9ˆl »­åÎI®šw®B ÁŒåhp•´û NÒ’îÇ·‰¾¶ó3¼ ’7\y§†«”àQ5¹z)ïÜFîÙ5” Qà6!˜|<‚²µ,¥jËó*¸úºBÞ'k¢›EÐeM.%ø“ê­¿gÆÍ†{úgõ*Æ/M¯„yl† Ó"¸Zs|‚袿z‹&\…𠡏ª†—ñ…«Ècä§V «¿O¨ï!瞆zþù-ÍEF&™„«Yƒp†]¤ àÞ7<……åR*a,SÈù*W #~­÷ßh‡ÇÂ=‚ÂUáEN’õáª0g²(Ø!cpU‰ÌŠ9/$¸ÀU ¥°n×+`Œ¨©PkÍÆã˜"ળ©dL-×Ó®DÚ®ì“ݯg®N.5û8\},{ιêà²+\ Õ„V"å>]Þ+Ìöd_WGÃ:WÏo¥C$$,ÌB`ƒ&†È²×”aÁÕàO› Â!©Ýñ’\Öeo¸Šü)t®Ù­†«‚ÌmœäeRÎt{sI,òë ±Aãv=ò›ûû´EÖD¥ùÎ \ýZÖôdá'ÕýK'ùúÑ\-< M¶®j<‘e+¸š´Ô>/©Ñ;Ü,NWÿ3 W[n'šWO.a%ühúc(»ÂÕo0ù¹»'pU!‡Ü”UÛg‰G“íà*?} ?mýèxÍíƒp5gžpµ]ù55ìK5\m¼ ¡-m™Có2S{2q!ºê4÷Ìd’ c£ˆå51?à WǨ²DàjÐ(Qî«_Þ+ß?£‚«Af쥂«M7#ÍzŠ."Œt\5ïÉ$V†«}ݸòR×¹Ú¸:ÐÓÑ×.$KJE_‡,ÊÀT¥(\m¹“hu¸J>ðø‡.z©¡#<pµfÇ‹ì¤Åà4àƒ(Á£XÇ$ïÿ°½2[©zK½¹øš†@ÌÙ/iäž] we¿TŒÂÕÊ¿eÆÎfï„p¨‹y×ÔK3 ¸ æѸ {§zKŸ;„©?#p5u½¬‰¦TÍ %]®6€ s|0p*fø)k‹ )|²Bu·¶–¥PCGWmüÄZ”ÐÏÉû?PÃU0§ÞæðϨ W}«·<#»a¸ ½ »°æI(…¸ÀÕNrAï+Ð30l!pUcÙ5×WJ%_]nlü’TC]vúÎ'±·¿>[í_)¾Qtÿ}sEÀÕÇ"àªZv†«Mᬠ:É7¤®úꃫ0à¢C0Dh *ÑGøøUëä Uóœ_ãõçA ƒN³'\•Ë:aXÔB¨á*$é¬óÕ¿w#KoúʔثûFBˆeŸ¶…«ÔõëÔá#$ã¦ÀUÈý‘¹˜Ì‡«u~¯ªìd0ß± \­ÌfŸ\ÔQ{Å>¬´ ™„^ê p•=W½þÌIZb\…ä…?ÏÉá*…«’#kÁU„ääšX~®zýY.ëR*•ÐÕ :õ Ë puëïuÃÕó[aü¢…«¹ÝQàjØ—”ÐÑèÔྮ[E¦åÉÛ×pe¿e‡…¼RH®žþ™äÿºÑÇQÄ´²šˆ8ÂUJȧRN9ºEW?åî¶Êña¼k¹s2zˆgÌØ«§ªd>\m‚ÊpÕ¼ ÔÓN;ð=ëö€)"àªCéi„«ÇÊc;¡W°³„ÝlÉ€´§+-¿ Á§±çzþÓV_=Z»ü»ªßOªMàʺ‘.Qðx¼ ƒ³Þú¡¬•,U"º*ê)ô¹ñª½¸úX\U ?¸ZŽÀÕãp•uüGõ|ìÖ‚«>A Ä ‘í W[J iЄ¡_©á*7e%+až&\¥‘у#puï;0„Ù§-†àjOgãõ0jØÍ–"?én~Ný̧a¸ ¡{ë“J ¸ªP=t§Ovƒ«m2Xq³!jµO'£RôË$´LJ«ÀC¾ ·gןYÇç?mpµWÌ\Ø7…Lÿ# øÂU$‡«5…›²Š€«¨·&ídpµ£dUèÕìãóE—z[XV€«Ûÿ’tH®’÷¿¯žµ¯©(º~ßHM1ÁmÕr+î/a¶×¥Cˆ„CÀÕ¢(s'ÿyÊáj_GD#â©:_²@pÉøžÜÓ?]«Ñd¸º|®v·Q}Õö(ÓÀ  aõÐX0i«ÃUzÄ$vâ"Ãá©pµ].ÑùàêÃôú}ïVmúJèhÈÀ¹ s` :“ W‘¹X³w" ź_×ïy«·•ÅIZ …û%Ím™ä!p5fšð’¿ép®):ç-DP}ífødDM߬ÞÎj«®nýT̺]ÂUñ½ÓêŸL‚«¡Ÿ7Ç ®B» íh'cà*26%-!í~ƒ4Šwn}si|_Ϻ­†„®»èÊ4h-K¡„|V¹áÙ'pÕû¯j±ð¢3n¶æ{| ™×îÆ‘~~‡Ûy3èã¶rlz¨ WaÈ_AcãfŠ`ûˆ€«%‹áê[‘EΪ˜Ç:ÿó©h͉â·"‹Çæ·Jú[׎ŸÊþg õ|‰Î]"ÅÿîâÐfÇ¿_¾—-W¶qfÆÀW¥³ (?Ÿ¾ý~TñG)¤Œ®7T>üÊGß ÿB.*{÷ÆC\µ®ð‚«]ŒÛ¢Ë{!¹dnG‚™ÏìW™ÇfÔùþ³éF8Br4¸Ê>¹ˆ?Ç©ájWKC^àP¸ QG'é*úÑ\ Õr;Q‰ÒC_mt:ájGm¤V†«ÏCb‚\¥CïélE{U6T y‘ÐÄ£Ù®6R ߬ôx¦vçߟB¸*kf@K ÿVÖì`pu2Ÿb5\¥úœŒN/äò.\s!¡¦Òס?냫E"Ì ×9W{ÛxäÀ÷Ôp•7Gpa;$z`P±áÀÕ:Ÿ—‘7!õÝhÆô®ú¹£™¾ý4®Þ‡4ÓZoÙ®6ÝŒ …cÞÅ"àjؘÖ;'>hj¢¬WQSÄ÷Ï* ®2ãfÃ}­¢Ðú`\Eçr:¸*¾<8ypS¢¼}àÜòƒê÷¾ÍŒ ÿ¢¢=¸²Êõÿ~UÖH…~ƒÂpo¶•§‘÷_Ayd¹^“á*®´Ãcလäå í•YÔƒ_h"S \…ȪõÞiÁo\ý=/uu»º¯³¢tSàê@·˜´øÉ,m7Ž ®B£X‹êI \…n«ú=o‘÷÷ïì:«O… ©0Ûî&tDƒQR°Šµ¿²\…c6^;ˆ²\®Ât 5MiÂU Â…9¾øÂU¸ Ìc3Uõ·Î:’Ž)†«¿öËuVí)lû7éêÍߢ<,•ËB¢óžOvüGê}$oè.ÿÃàþ"Ýùø«gÃIu¿ô9†)yùŸ;ûZêßÜûë€B¯æ_*/Ýx÷ÆC\µ®ì WÁµ6eŸø «ô[\½ÃSåÆßAh2\ý/$°Ù𬉋¶cáj~Œ†ÔC_ 2<é䇫½¡Wmzޏˆyl†:$sN¸Ú,WÉAUzüƸz¹võ×!CàªLb 2Ö6ÆÂUÕüWV‡«Œ˜é–­Ca±áêú_÷K[‡~+.Oó6}Éi®ÚHpUïû_Ö‚«Èô—üM,ÀUÊÍA¸ªP÷¿¡~7׉»Úb ®*ä= däi¥}#1ù/W3¼è½ã%Èïžœ.qaÍŽE¹{ð„«b.Œ pu6?c+ܪÈ\pÙ¾ÃUÕB̯²¼!S†ÔÉèZNj¸ ^’e»v‚R ÕƒxW ÂI~îXåøö†«…àðͪ!W!i¼`•ee¬W+³èÄ÷Î(í Wz:š‹côÁUVÂ<®Þ?cðí¼´&ÀUdŽ 8 Î Å>bYWï!¼Ž¸)ߊ.£p5¸~ïÛôˆ‰à¸Ð&«úM*¸úÈhzD$¥^ô«Wg™W{Å•{8ªáj}me™ð’tó¾Ø×‘i÷„ž_Oª@$èö…§ïðüœžÃÕ¢+[ Ÿè%gÍડˆQLßÑZpÕP”{4ÚfÍ^RrÍ÷ª ¿ÒÈ×ÁHR†puÕpz½v1¥p•7í±ì”iʵ?`† f>ƒÎâ÷ ux\¤©AŽxš½3°¦TGàêìþ£o‚Œ‡"Õl›hoH)ÿæ”yB!ÁÍyÙ=¸Zt)Qþa'\Ýwü–v¿YÌ\uÉ:àªÙÚ®Î|±*W±r˜tÑ{ðùpõˆ1ÖØNŽàj]µ^y‘7­2\w®FöÅ×Á›!FŽ)¶)\Í?Uf®îfûÞ‰k“.¬—E¼†ð€l#EuÁÕSHrÛ®úÞ©iUÕ\}5öÜcCÑ“­W{TåŠ[ÂUMÒ7ö°i&¸J=Í×fV_[U&:æ®J¾C—¸gbpµ•¬màjC}fË8 ®1ýˆ\Eâ&í…1lÞÜç_enÃUd(Ú=!H‡mÃUÖ®ìdݾ0¶ï²eCš¾îZ€«…*þôîȵøà'+¿Roþ»"‹cȼ”à>\]9 .={×4åêo®¸z \% ½Æ{åüpËy'cÚ®–d#9mc¸Z«/D[•°÷MaÚ²ã¼ad á¾0(OÜ‚&i,­+<´Úò|²..á§¿iÚ…«—)šàê†ß*²9Fj,‰"ûµ\­Õäžo³f/F¯ríª¿wÀU ®þ7+9@±jxá…x~ð“ÒEƒšàj®’’‚«·Coë [ÉÚ>¹ðbÚÝÇšÐú'ïø’¬“Í[¸ZÆ$D²ÎÃKÃAÑpµRǯÔò™¯(¼°A0ã)Hôù WK8{%Q¯«G#WÂ7¶6\%b¯ñŽ\‚«Ü)ÁÚ…«:.8'u^Ë—Ê¥§Õ›ÿÊÙ?ËH•VÈJö'O%ÌxZ¯H#›‘%Eô%eWg÷ÇPl ¸ ÷žpr øF ¸zùR\=©Ùæ+ù¤*Wâù7 ßç?¦¨Êc2«õUDù‚3«Û®"׫P§ Ã{³Æuꀫ6ÌØÀ™|_)ÿ Óßé¼enÃÕ›B\¯q†‚«Çn¡ÿ9÷*««Ro =Ø5);û Ó8—½;òpט‹œÏÛ¹ÿämg þ¯DÂï?÷`§9gþÕ eý"t^.WõËá<·ÌK›Wð¿ÿ•*pü¦ð“¤,ÀþÚýf=°¸ê]kc¸ ­á‘<rE²à­ü“±º}¡®†?¯Þô'ǯKƘ›lÀÕB•‘†«òó:¬±·¸ W#^„þi/¸šwlIlm=k†«Ò%ƒ¡ºõ²³%;q©²%@8~P‹¶¶†«¹ô .мÔl&¸JÉΦ®}–5þ¶Ö.zgÏV«A=HU%£5\¥öðÎô$p5fÆpÛ42m»¥¼Žàê‚·jJ™ÒãV„«9¢¸*è ´—çpµ¾¦‰†›pµ¢¤R'DêäÚrnþ{Ì=¸Š\ty ‚ˆ]¸š±3k‡¿nø5 W3‘ºb& g½P•+–ÇUÅ@Ê£W\@œõ®F¼HÖ䬯›ö˜ŽJoX»ÃUAh/½2>‚œ7µâ‚WÎx—wl±{p5÷ht­¾À…Oµ \%L~¢óÊÞ׎áʵ»ƒ3žBw«7ÿå¸ZSªÓl¯ÚðkÁ gW/'e®û™þµ‹ÀÕˆ¾ŒàêÑhøs—»’ÀÕ(ÙÒ[¾DV¡¯ûIµñ÷´ÎpcÃÕ´AHO ®vƒ{TÄ}…¾àM}T²ðüQÀH³¾Í†æ{:±\zZ=H“4žŸ°/Šsf®û© Ü£y W+ËÚæ—µÝ¯®²ÔÜ\t¹N ªRþ!ègƒê*Ãk.8·ÊŸí×%3~„ù wÊøräâ¨×Õ ” R!Э WϬ2[{pµ¦,a‘Þ Â>'u^æÚàs,´·x¯RËS%üaÊAØd®ÿ…v¼ÕŰü1‚™®B‹¢…Ås^æ‡ô„='_þ¹×7ñÄK¿ìÕ6\è %LàêV_ÙâÁÔÂO¿ƒÉ/Nhȼ¬NÍ®"e†A Ùpµ¾V/?Ç™|‰ûÁ=”k@6Ç|³€ëÑ\‚« õ5a-¥¼ë®všuðzµÙg#Kþ¹¼ûømô?£®¯¯^¶æ0õê¡GÖ VeVýCîýŸšÊãW.NÅKw.I_ ¨4à ™ÊÌo—’ƒ"Ž 9W¤®ª‘ç•]Qëæ¤éëÊ/Í>Ø)òT@Á?ìƒ'oo÷›õÀ:àªw­á*ô¤rõ·P\};ÿt„“ ¬ ²Óþ‹˜k†«üà'(è:Š~¤‚†«Â°ç\‚«¥üThÑfpuù窄QR!ÇpÕˆËc²W2)hW›ªÉ W¡âÐ,å²3f¸*œÕ§ð§'oc¸Z™#’ÌÓ\…pBg™¢+ñf²rõº†«W¶¢G ήi›F¦ a·„³×&\mh¨Ç„¢à*ã€ÞjpµRËWmøÍWW[teË¿®bþÒklš7àjDµp•ãmYŽA™ÆycؼeÞ¿Ê܃«È|኉J®?¸Z ¤¦Ä¬¬ÔñeK?ÂÜ4d^¢àªŸ'pU4çeͶ‰²˜OxSÕ:«\$½À]ò9C¸ ·†l½ðüúz¯<+GÁU|¯¹þaÞÑEÜÀG°{¥…=«d“qª\ÓOµ\-8Ǽ²÷µcf¸ªÚð+¬àìjÏω¾Ól§ŠáŒ3‚«DC;d¦puÁ[9‡æÔUØXÜXWYBÂh󇉚ºÒ!\UmIàêùuî¨á*b_…†EV6¯CeÏ”®ÀUâsŠ4¤bgÐãÄ[N}T“4N±bX)w?wÊÃP¡ ô"xQõ¦?é§¿åË?+Å|ÄH\ÖØN¼ îÜ€3ãG`¤e'”ò5}KC=Q¿”@ÍÚæ‡ó×–ç™›K0óYœIPÑå$EÜWeüT†WމɛÖí{—rí¦{©«áNyc¬„µKõºjãoY;&+V|ÑZpµ$[<—\-΂أ‹*`#S@”DlÊ=<ß.\ÍæâlÂÕ2áeÜ×Hf¸z2–†«É8Ž€܃ÒÏ륞p~Ö„ÎhÞú ¸ê{')Åþ<þOÃUéâ÷«rذèqOÖÿ“U \E,£¡S¸Z.>¡Û;³„•Ò>pUv–†«¼©Ý2×ý$žó²n_X[^C›Kp .…=áLUøü¶Q‰nÃÕ;g§vØmÿb¸ÚPt)ö××»ÝîããÓé¡~ß/8]`[AÑo.¼ç÷国írÞG÷×G.>cëýíW·M”.MRpn-ô «3Ÿ‘/ÿœ{×ÔΞ¦®Ñd Ó½–µÍO½éÏêÆ¸/ÍîAvŠûãNò•á•矎ãM}”í{+rÄh¬«*ã<„†B`2ÁUÖ.ôš<öÓV‚«¸~"ÚÀUˆ\'E ï’.„àè\&Ûg$Ž6Ú‡«hDaéâ÷ ™—½wËÆ†úZ$}È[ÑžÈkê« ð- t½|£ ´þY&:f†«åâx§'{êateŒ¹‰ÀUùyõ¦QLà*šѹ”wáOÚ‹®áÿ1€qâÝa`eh¢rÑq®"àvÀU+«¯.Ï=ÍšÐÿW¬ü’¬ ®Ðm¸zïÜÃvcÛ¿®Öª×t‡ÏmýÿˆŠß²aÑØ×îò¹õ­¥’Z{ﯼ<ññÛº½ýSÀÜeqËçú~ÐÕÇçæWk¬ßÙ–p•ÒºW“4F2ÿMDè®R)ÿû²%²Æß†¤ÊÒEóIfüˆìä€&¸*?/Šè‹÷0‡«%ì8.òàÌÄ»…}²wM£àêO™ëö®’ßæçqåtUXÇ–{ds¸:w€hvÜ„¼dÁÛLáªäoz÷k®"Ô«莼ÀG²w’­¢ (“î@ZÀ5¸Zª¥—®Õªpõâ&ŒÛüS+Ú¦‘ik‚«-> W¡Ÿ«ò¤ ÏÖFpuÕ7…i\‚«Ôö×ñ.KØêÄÑmWÙ~]²S¦1üˆ%\-NO„>+~W/?×î-Ööæ>\Ýø;r¥âŒà*\×ÿé¢÷ÍÇ•k¾‡ßÓí ¥6ÚkŸ[n WåË?ÓËΠĨþp Eí™bÅçð„ôÏ Œàªø 7ú#æpãþÜ;[ºý³Ðf¸š“:ÓÁkpµcO¼‹ô—Ñ£Úð+«“ïÍ\ûC +…”ô\ó×ÿþŒÑ7¡ñá¸èÒµYÛ'åŸ^i$¤PÀ6¿**—Á8‰¹<{u‚7ý1®¢ý1ÁKX»^yþ©åÜ)ã‚1ŠÈ£±®²”ð %\-NßÙÐW½TÅlUyx3ܬyà9‡«~]dKSpõOà*"šjÃo¸ëpõ·¬“‘ ›àí½ W!¼!¹‹.oA;£ãÐÎÈP¨ŠÏdŒ½ù,7àaXoÌÓRÞL®¢§´{fxR‘ ã“ì"±Õ·\z 7H¯‚Ò¶z[s¸šJà*ÿ^™&šÕ‡~üœäh{B°òN+Õ×àöÑþ®<€ŒÝÑW͆ɒs0£Ew`2÷2áÑ6¸B·áê#óvØmÿV¸ZÅšö„OçuôêÓ†ü½ÃïñydÌ{•:ê‹Ä¢¼&ôZ#œÛÛǧg×Zl¤>œ““WÜÆúh΅Ͳ¸oÿÍ{]=Hwzzo8kÜ­ÜÀ®Â¹¯H—W£ˆÿ¯²'Þ-ùT¾~dæV¿be>®/-*àDôcM¼;cÌMùœCL¾4÷âVõ® ÙªïxÁOòÃzgn™ˆÓÊVã±.¡×=¹£ò¢œÌ„?qI%YB§oVï “¯ý©P|ÖÆyJ‹r/mcûÞ)˜õ" ·¦;³^±ñÑÜWqÍÚ“qNOŽPmøZÛte±2]8ûe\pq&[¯/³|©D+UmÎPÀ?FŽ å%…¼§¸²&tÎ>£/+FÊT©L1ôL¸rüªvN„¿ =¾ç¥ïFöÎy¥¼(×ÁÅàÕ»‚¹Ó+Æ©Lý~i;®èÕ ”êd^¹kÝ™u¸˜¬ƒóÚ¦‘Mc£¤ ÷òŽŒ17—å*é&2Zc—T¬b3<›Þ`ðt^¿Î"iš|õd.Oí&]ñ¥öÔjü­=[^œçô³²•Ã%K‡ØœŽ æ´P_ iËî°{ûЫиßEQoÉ.Ú{Ovv¶Ê<ì]±ò,®¾P‹9‚Á Ø8Š5áø1†Ÿ…ÛÌgàLº·DÅÑ\ g%ZðNïh»·XÛ›H,.,*rõSEò+òu#ø3žÉ9Ÿ€i‡låOrÓ’2·øÂ½#‰Cä2—.Æ›ñ4\S‰†ß^·Œ¯fSp•øH‘ü’xÑ`ñâ,`òu¿¨vLqï´’%‰ T&ŽÇXâNyDµ#Ðñûµì#ìùÆôfŠ•³²rè!‘,Ë÷ÂÔFDP'OÅÙ Çé#š=áì‰]äköJ —æ*5û#9“ïWm›ÄüSÅ*® ¢¯fï,|Ü…Þ̨¶ù "û»t…"‘¨Èõaßtƒ9 Ñš=¡e…m$›úî½$O_î~´’, m ]6g^äùU•j¥Ê„?åk~,ËS;~§.'G©´Ñ¿ºS«DóßÒ^Ký½º·@x ㄼéCü@XÚ;'&… ¼:%¤,?«å«ù¬ýü°çËìè%|V³/B¼èý–/A³ÁËÁhéeÿÛ³”›þ†FÅe“Ò—!þêK ¬f4ô°rÓhiìç¥ZïH/Ó97É:0—áxbØ3=¹VB¨8yÖ¸NôêJøI´'/èqÄ\h-}yY¡ä‚ìZ&—ÛêD‘tÅWtQqô{êÓe+¿â=®Ù?n߿ɋä—qñš=a-_ÊËØƒ“ÈV}«/+)ÉcxdY‚\£@pZ Ú˜=ñ.ò] ßEvàÉ=êóÕú<%젅Ѥ¢9È"ÕO#wC†’uh>rLaùÞ‰˜ËŸù,´Ò\•xÁ;èëìËUÉÓ<¹ .EþqB(:ùšŸÈ•H[LX‰DRPP`j¢ô=ªä©È¤àa0®ÊàX \ Âwk‹@tJÞ•]ô¼ 54Öü(œ÷’qCcŽvㆽÜjØÃCiÑÚ[æÊõZ+À˜Qï&;ΨSf`žæ±ö‘1–¯6xï,ÍæÊ1·áj÷EÇ;ìÆ¶)\­S,~ÑÇçÍ]Cã‘â=ßêót(¯ŠÙJ½ÍçÁQç¬aì®”—+W(ÚÀXþ‰­à-ùŒ¿ò'ά—¸óÞŒn !?öMº—ü4/vx¢Õòï8a}!f¸ ?à-ÿ–¿îOéå#ä b¾øøNä+¬I÷‘rè'™|©85NàË[ú{Úãì §ø«Gò~ÀùŠ»øÓ³'‹%OîHÆ»Ây–3£—4ã´Ó7 &ò–|.9—bãU‰P”º·ÌšúÚ·&ÚÍ‹ý†ú;äÑî(ç·ybËï?œð~.ß…"Hîꧤ—sÂ^ÄK¯“ˤÍÚ„}^?†ÞW|zu~¹LÈæ?ÍžÒ•5¾³p×l¹TÄf³¯^½jz¿L"Ê8+¼| VÚ8ü”pW$¹©#kÙ!OãT2!ÇQ/à&²§<*9»Ó|/¢ƒË93Ÿ'éüФìó.ô©D$¼tT&´lÑÞE¸á¶`OÆŒ«&óE©qðÒôS¤³,_•Š„»£Ð’K‡w·üì¹sûf&3iÚ~Þ²/3ÆÝŠŽæ."Ú³ cl'áöPÇ}GwÑ'ܨ¶§†ƒ–‘ŠÄçv󷇶ewØ3é¥TþŠï9$öÚ{ Ã>=Ý“s^–Ä`à¯ü‘5þ6þÚ?˜~\,gM¼[tls7rwΛ’Ó[Û½ÅÚÞÎ_¸€ŒÛÕOI/‚+fOï!Ú3?cÌMœgdì –oZÁ_;J°ÙQŒñrS¯- W&Ø4Iš~²½nNƒü9Ú‡åwäÜ.îÜ7Ñû0ÌVAüX÷NËûwÞÛ„œÈWÖÆ9~?ÿĶˑ¤ò9{êc’ ûå ‡G"ŸÚÊšÒUÆ¿ê…FËëÿb>*9³ƒ>"L @$‚ñJ Ë8H×#›^õ‹ ýrå(gfoAR Œ{É…Oeœ¬Í íãÒº7ì-n03û5Á&?Äq¯´sŸß+<¶QšqÖí3pæ¼É‹ùš„¤¨Ü¨w…;ÂݲX °¬£­¹ÒOA£ò– “q/:ùv.÷Ê•+-C!jßàoJnôG’³Éä{ùWØÿ¥Ìu41)83žƒW‘ñm„Ìk(R{‡^$NáÎ}»åKÐlüåßñc‡ÓÒËÁ·óã~æÌ|—Mð² y–øì.+(M?‘ÈD34iÆþê_…[ƒä2Fêåüùó"ÆÃ.¹4${Ê#¯&Ÿ9áN8 NX’q@ÌìšÅ…øÎ[:Œò¨÷bh‰ö-‚DçÌyƒå{ù kÎëü•?ˆSWr£?dvlž,>½É4*Ío˜ør©˜¿jbº$m¿éÛ¯ž _G,Lž…€4¯TÌäÊ…ÛgÀùàò¸ó‘#”ÞfMº'¼?²*’M å‰$Ú·׉lÈ[bºþ+Ǫ •3IŸé’ Ï&½z÷HZÏ÷nþúј•êÂ-ÓàömŸüâA\<’¸–/‰Å£å¡¥¼«â‹‡x˾‚f=‰^ã-Ê_ÿ7gÖËtE8¼ áÏ“{ìš-ØLû@™…&EFÉšxºú3·#ã;£;ØÈg§>Æ }^”ºŠ÷ gV?dLÂäpÁÆñž\Æ'ª«FŠ'±xü”h§õ„MKKM´Ñ %9·‡¾~É¥TîVR±èð4‘©TBÌWœÙ¯cØëèÀx<žÕ°‡Ãì^ ¹z‚ü-d ¶L‡3½$ä ªfŒ» m‚yŠ>…‡Ah@ÀõÊÅÚxðÇm¸úôÒvÛ³1'§ \Ûÿñ«†3¿ÞïóŸŸN•›T^òíæÓù‹ÃeŒÎPÅšþ„Ï«qj벫mY€ص„»W¹ú[ÕÆ?Äó^“Ç -a¥ä[ÌÛ‰3ù^~p¬­¾lß;Õ›þÏ{(VS%Œ2—¨¯©(–,|‡ðkì-e¢cægÀX ;E·/4sÝO‚=…aÏ‘‡•V~©N#_þô³‡ejËóxA=„³ú0yðS·/L±êkóžÅ–V_[Y|•¬\åMíÆy·Vx~}æú_D³_†?_àp‹Úð´¡hv×n¡¡¾¦DëF-5Geг´)өʱ'©#ä1%axoAHO¶ï]gV7ÔU[>]WQ’shŽfË8z÷[ÝÞ™‚™OÓÞ—r÷რu޶åÅ7¢myÓ»“¶mÅW¶Š"û¹Q º@)‰z½RËkYÚ«èâ&ñÜWs,ðd̸jÔfåIcn®.TZm倖ĨÏÀ¼Z©—Ë5Åz鯲·Qe†Óe0»™›ÿG½n~ú¸¥µ( `l¨­"j9Û¡Cý.Æs]e ]€5¡sÖŽÉÌ[©„½‡=ñnÌ)EÜײ¥‘=Ž™ÕT¹Á̃²¿Á)^Øà´,€dþ[æãòåŸ#âè̪.P´×-ã«é²¿.tÉ‚·Jù‡Ê©Êµ?0¯Üke²%` a’}´]* ÔÃéfjˆ†eÂ#œÉ÷9}ìÚ5Ô×b¾Ð;Èdï „S2—©A¸aO¸#³qÿ 4ç`$‚¯fËxæŸBÜDxrµ,dFö®iâ9/»t…–¨)ÕÁÿdïšêÆöôT´„'5L0àUF¢÷eK>ÄßyÇ—0ùT…:½øÊ6{mªòê„?”k¾wZ Ê^Y€‚³«!íh]GʬFÜ#e‚/8·¶•Ê +uûé²ÖÊ9;e©u°ñ÷ü“1ƒaNÙ—Þeµ*_=¶²zT¿*G¤Þ4J±â ¦Q D«õtA~{ÖªepÁªø‘pe¼iÝ8þ÷ó¨u¤šu:?{Bgü³àìRZ}5sÝÏÜ€ÑèD(vÄ}öDWá1¯á Jy¡öÉf{BàÍp^×/B×$Ab~B¼*OF{iEÜW¹G B{城«¯10¹r4{bòãû’¨–4•(¼¸©¸±,æ¼=ÆþÉX¼ÙÃfaÚzTY"öǤ½²H0Ú骶²ek¶LF”Fr\ 3~„ÍPUÂÙ+Yð6òÄŠl.]N¡ðb‚pÖ zéåªoಎi¸*]4ÈÃ:󺽡YÛýèJ5ˆ,…âIÒ:ý1xãâôhsÜ>?¤'úI7à!t=æx {·jïhôuîÑ…¸$󾊎 ‚hBëIÚX`B)ïâY)Ö;ÿLœÕÛl–@ØÅ ¤ òzkï+ÃdAËÐûi’ÍÚÖýˆˆLÍ“-½®qkYãÀH H8 ú%ŒøÖøÛ³“§ ;Ê„GuûBµ{gzR•ש¹WùUýVž}>æd‡Ý¨öFü%ßt/Àë®–¥~v»O×q æ#ÕÜž>>“ |¼&s݇wútù29§Áú¥6†«e‚ÃÐp³â9šÁÕI÷pÌÞÄö½Ë W!ÛÔ‰cZÂUHe|¤”»Ÿ‰Ê²†«Icáë²wNñ\-ËEˆtÛS¸ZSY˜–`‚«AÃC*àÍÂðç3Ÿq,wi#puÒ +\½~à¢K‰®Þ¸-¸jR4\…®@g‘#FcMyž0¢/Ÿíן:g$½ƒ‹qW-6``ƪ|Ú¼"‹m®â¾t"<3®Z}U9:È&\%…žN.oG¸Š ÀT…Ä5R )æ5©ŸÔ‰ƒkp5æ“\Eܱ€«¤dîŤæ]ƒíæZÑå$h3ò2äqîÁU¸yìPÙ’ÊÅ'Ú½ÅÚÞ܃«Ô¯?;‡«©óO]ƒp^Ú®Š£Þ@jæ9\ÅÝ!ÙÏ{‚«ÁŽßï\­© µÚ&Ýë \5¨.Ëb†|AÁU„éréú¥¸êÚ ÞpUºhdÁÛ¹G£™|ªàü:åêojËmw×á*Ùt^tÜH~¬Ïç<íç®î s®–h!†¥‹××Yë^ÌeÍÖ êÍ;«%ÙêM£,ઠ2Õs¸ZS¬Ñ¦Lƒfs°Y• ®YØpNé×ÿÈoÈ?o3\…¯£]( WõŠ pÁ¼ÀGÐ\çÖ’­á#^„¸ÍsnÁšà/~*«]1qh¸Šã•pUû©y 3\•¯ø"÷ÈAh¯¼c‹¯(0ô¼á‡Ñï’#f¸zaCñ•-⹯ªâGäŸ^©X5J Û*p5×e¸ÊÚU±rÉõæ¼Lrê<·àêÉ‚·0} päˆpüÏ€Y ˆûQ Ù"Mö0÷=üAÙ®ÖŠòNưÆuâÏxJ2ÿÍ¢+[ÑYf¸Š!%€‹1ÁÕø‘hùŠaøgæÚËegœ~‚’š–¿5˜àjÒXHnø·á*”6½µ‡w‡•‘DïrR\u WÕ‰cH¾| ÃÕ?Ïä|–"ê·ât‡Ý¨ö]ªòïSYž°ë®¢áj…ùH5‡!\m(½Ò÷fŸ‡~Ø¡³^¶jl_¸ºüóRîþ¼ãK3ÆÞÂö%…qHÖ3ñî&¸ºæû¬má*²È1f¸Ê~‚5îÖk®Ö”æÇ…Ÿg¢!µ{gšÂUähH®#¸Z©@#Œæ˜U.%¿„Ú€«ÅYx3îú“ü"_[Õ:põ1µZÀUË">õ[•'%{ciX õ6ájÿk ®¢©õÎx…ÙZ®B¼!!ÅD†Â”Ç ù7ÀÕâ«Ûøcä™ÁÕ¼lùñuæÕSÈ&*ÂÅѰN¯H#ë¥ëmx$QD?Œh3h{x0Ìt—áªï´wE ØW™[…&‘¨®ÞÄ~Çò ÅW·gmŸDr« î×\…ëÃ5[ÂU*ãÛSÊ;€tÛ¸Š™lÇ<ïUn¯Öp5ó2ƹ¸Êàɧæ \ÅØÀÇ™  Ò¥ÍáªV2ÿM¸›4¯UÍ+p•@³À®¢9/îA¸Zpn-bŸ®b 1«¶f‡ÒÑ9\]ô^ËE¹Cš­¾êÄÑ®ÁÕ< b·çpïGS´]–ï–ƒÒk ¸ wwÍ™DÈý´²~p -ÇéU©y'bÐnzÅåÚ‚¡s²¶û!šãmpkpƒ¬q·e®ÿEý.ifmõ-åíçÏ oÎ\ûc kzA“4F¶ô£rñqSsåIYão§¾~˜sh® ôÙœƒ³þìb®æŸ^Yx!¾Bõ†tñ`nÀC­W‘ Á›å]h“Ná*oj7dCèPaXo¨nížö˜[E “Ñ1\-º¼½Ö ®®ïŠ[ö\ÕîÁu6ÁÕK©_ZŸGÄ·‚«È4ù¤HogK¸Šë$«â¾fWÑMh+ÙP_WMïz¦Jø£8c§rÍwpõZ3'pµ¢8ç@„m¸Ùï¹fájŠ´h2Ç0xsúk«ÎvØgC¶qü¹†K:ç{O;µë®Nÿz¿Ï}#OëÍGË”:ü`ƒžµ`Ð>w¾·ch°õ†6ƒ« õ¼iÝà@ÌpU±òKÁüÓq¤$ËØNÜÀG +¬áêŽÉÙ»¦V¨ÉÂ<à*µôHÚK½ùoø:í®©²˜O<…«ÆÈìŒÑH·{0IŸ¡‡ñÀU¿.&¸zf5êÚ…«:Â.Ø ¾Š^¨¯6@‚"’éÕ5Éþpµ¡¦X#žûŠhVÜ4I}u¹wáju‘J›DÚMtÔ\•9½#dŽHy XªrÅizÙÙ–£ ¹†ãý.Ë¥§!ê=ûÃÌœÃÕÈ~æ%N­Uà*{7ZÀÕUß ‹…¡½dËÚ®BKC6{«©]5ˆm$Â5¥:#3¸Z  6û«6þnê‹Ú*dF8 W³“¾Ùl.4iÑÅÍ®ê Ü…«whÉswj¶Œ'¹<%öþmæ\ýA'÷ÈW§w¯i¾¾èÊjŸâä>ÈìÌǯ ¸*3óëׄdS8«R³Î^#á*œ6ü<×ÿ§£Ñ¸ê÷ŸZ}¾Û7î®ÂY!ìzÞÂÁÕ½3k\xª‚@˜¬m¾m WK²ÑËêÄÑ×)\•Å á<ˆÖÍî-ÂÕ³kd‹»W…a½!±ZÂÕ†úºRÎÞ6…«¹y̯ÀUUÂdi¨}¸Z•/Wm©ÛÚpU/?B/;E¼(~—ðÉSËëk+É:U¿.®_ ÁCV®ÆàvÌxŠþMlØ•7½;kBguÂ(ô&B9d@æú_¸i’Æg$#|À?@ÏÃs"øâ Ff™ Õtk¹ú'0¼ŠÌxZ»;˜¡gÈ98›5ö$Pø,]b}Ä x€ÀÕóëEs^&IDè³cniE¸ªNÇ€_5a†py\·w†vOˆ]¸ªÉÀ;ÁÕØO1rÐG–pé$¤Ž·à*òPUÂ(:'$‹‚ÆÜ ½‡3[ÃՙϢYãoGÖc†«0ÞÔGq#Là*) ooqЈIÍ£6´ÂLAª…S1«ôp¡å’S–pÿD^I ëyuXYC]uáÅMœI÷˜á*:E»/”^pCšM¸ gRÊ?d¤ªj÷Îh‚«%š-XãoS'ŽA^‰÷``â_ƒp6ÿŠÎŸkø!U1xÓÕ·Öžï°Ã>HLÿù¨j2[¿†ëäñI†výÁÕ:ù¢}|ÞNlz®¿(å£[}žšÉu°¡UCyú‚÷ïöéòÁ"¶Þ&Y5¶\5!çzÊDG”«†ÃÏ“@#>Qpf«ä ‹§­àj溟³wN¡àjº‘*>‰P%_6DÞ‘Ë%¸ªÚø)û9ãiüE)ÌAÂÕ††ºÊlÑ ÓcW“È£@¶°›®’ÍÖýï+ãÊ?‹Üú)\eO¼Ëëpµ"›‹£¥â­ÔòÖ \ͼLÁU=d „‘ÒÉМ–pªXõ”‡¼ãK šÁUC‘v"ÎßôcPîÀÕÂLŒWñîÂÕZC!´´|ŰJŸ3é?åÒÓ-×"BhS‰RÞMÒX/ê&p•‰`£Í»pµÖP„n-¾ºc€†«\ÿÃBN´\½°A<ï5o5µ«•‹yJ£ÑŠ,6F.F/· º äéü5¿™S+¸Š³!=±©<ùÁ=£µ‘PgmõÅøD"̼•Lp5e:&,ô$®inþË̸ŠÜY·?œ”n W/Óp5.HÑ×|Ü&\­)ËÉ;±¬Tp¸¡Áƃ$^73\EÄDR‰)ë… ‹!$×=¸ŠÉŽØ”¹ö8mÜ RZ8|Ç)žäÎ9\E gíT[î\]ú‘M¸ªÛ? ­¡\û#],ÚCÃ`@Ìr®"Õr¥d ùÜE;ÀÕÈ~™ñ#éU[mi…çד*…Œ:li®.ýˆðä ØÜÔ(&ŸB ‡:µÇNI}Î #=«ù§VŠ"û›á*ál.ÀÕ|~È“Y;lÂÕZÌkˆ@{øÂ1\Å9Õ‰ç[äx0XÂÕÊ‘4zà W‘‰È–|@ÃUHÅÊ/y]јP\ªø‘ô3ûyÇ—VåɰȦ«dï DÎeˆa–µÍ—<GàjZfü¼UPœ¾~y ?ø ô{ g¯&iŒdÁÛäüô­åŠi/k€O ØvÇd&Ï[Át"¨êVºSÐA–af¸Š¬ßN-m”wlIkÀU WÎFt£Øƒ«–\ÅTbþuÞ…«ÐÒPïEW¶¢­LpuÊCè/ȉ‚skÛ®Î}Å[Míª5ƒ«šŒÌõ¿aßø¬_K+áÇoW£Ìpâ“lSb+/æMë–jy­¾ÀÕ“ \M˼•Ìp•üdî±EòØO;à*s3ÁÕiÿÕîfûÝc®žZΟÞ]ñ¢ù¸,f²ªœƒ‘–Ñ<»ùoxÕ½hf¸ŠÈRÊ?$]8 ~ÑåÄ’Œò˜¡îÁUÌu$È™ñ#Ô›ÿ„>KÃÕúšŠÊl.õ+gí‹Ç9ó2…«ôW·eŒ¾Éi-b¦W¦!€ÒpUCýÑW÷…Bo`¶z®Vª00Ú®"¶ÖÛ©OhÓ¼W×ýèI•÷¬ðüz¸;O¨"‘lɇ܀ W ÿrÍaò)WW³'ê*u‚Ìõ?+W oN?l˜=¸šw|)¢¶-¸šÇžÐÚÏÁâ.Wƒz8‚«áÏÛ{¢Ü1\ÍÞ¨NüÛñ~-àª-l®ÂKT劙4x»ÃUâ£ß… Å Q,ÿ\µñ7ÞÔGÉz3cƒ&q f7´kÿP溟ùÁ=ËÀõÁ"ds&áÕ› Z#²“ý¡|ôŠóîŠC¥øêvUÇ)¸ºçÏ{ ÇÉ·•Z¾®B x¾Í·*Oâô²+)ÎOÁU²‘¨bÅ0äJVp‹ÞŸ )©!ЮpÕ ¾ ±G­H鎄¹)Š K^ÃÕ”é-_*NOÏ}÷…Ž u\(a¥XÂU4Y²2ö/ÀÕMpµ<׌Óâ[0È1è#°ÞÔ¬/Šæ¼Äžx4-´±*~† ‚{w Í–›…ê®R»à}á\ͼŒ´š©h²or+?¾„ •:ŽC­ú¦.ûw$þÿ6¸Z‘Å’*÷&¸ŠQáD¿Dàêæ¿1s«¾†*#pug rç*j‹™V2OàêQþ¨ÓºÉÃTAU»SÁóÜÐ~,ý¨SÚ“G‹É3†ûس–o¾áê?µ™«ßëìsûË-ظeãâqoÜísËkÑ¢Ó«5²…Ïûøø J)¦ß_§Š{ëfŸÿ~={]¦MfÛrTYÙü´m WË¥§ï„³ú(×|oP¦AŠÐëj‘ø³ýºXÀÕßlÁÕ~¬ñÛ®R›%ÏMïήîð—-ì®RUôi¸ =Q$˜ù þvzò2A*b½«p2Lû©¸ ÁYtqSËhhW¡ó‘ @ËêMp5²:ˆêúHGèyÉü7íÂÕ]S!Aé§¡²ÐM4\… Åí· \…,„ò$$?Ïñ»ººe=yWƒŸÌJppïÃÕÊR$ÐöUy2«ÕnÔ³H‹ÐéôS'LÌËpµTKàêå$òC WÜ…¡=«Tœ6kh˜­Ýá*’¤ÉÈ7k …Ô“žý1VHÖ|N*/ú#sjG¤Ù2ÞW×ýD”§uZm„FåvÍ?i†«þœIÿQ'Žax‘&¸:áÌJˆ[²õÃòÏi±÷o37áª:C¹ú;¸b8pÞÔ®ü ÇmÃÕÓ+á¸,áªtÉ`äY9‡æZF‚6þN0BÃÕÑ>4\…ŸD¬)NßAùnœQI=«3Ÿ¡áj­>¿0m)™Òü S¸ús¸ —â®Ö×Iɺ8; €õŠ ˆ8ä‰r£“…3‰ü^FGÝÞPè ä8^ƒ«)A®ÂUª®N_7ájd{ÙÛ4oÀվʸážTipÏ éò•nŸJÊ„lTò$fnÎÁÙ ¿W¾â »pUˇ\QÄ}Ué, ¶ W-†n‚«‹Þ£íª-Ïe½9÷h´ƒ½ÃœÃÕ°ÞV;îYt¥C¸ºkªËpU' ®Ø«²˜!x“‡WÌ\ÿKþÉX’¾Uá*½’5î6x6øF8mÞ´ndcâ&\¨nïL8yR1`ÊÃÔ³ö½´{gB¯²&t†³"GfôÄ?1<êªpãêÍ#R+â¾&GO¾Oµñ7W#^,NߎG4û¥¢K›TÁ´ M†®f%û“['`²;½ìüÓq‚Ðg¡üÉ&õ]qr\³\…$C’B¯ÞÌIwÀU$ƒò˜¡ŠIÎáêÊaY;l<Q|uUÎôíì”i\}ãßW—~DàjÜWP켩Ý$óßðä冺š¬“-àj^ÎÁH4;Î5Ux!ž94í ž÷Bò8Ü)º>sýDIô)Ž¢ R´¤&iLó¹Ó ®œ[‡Jš1ôÙ–kolÃUÕ\åŒHÍÍCÝšÏXÁU²”=î«\5¨®b<-D…G0ßáàèè—\MøY’bÅð &¸ºmbeްõ®Ðm¸r>ËŸ[1lŸì•µi}–Ÿy>æT‡]ï†~|uÝÅá•“9†¥é:{c憇«Æê Ï/þù•Gnõññ¹åÁ¾ßFÌorŒÖpµFÙËÇÆ¯Åkš¶á*RyìPhË̵?Àá¦m4ÃUˆ+Ž%\Mø]»;¸%\Í;±Œ„ÞAFp•Õ®ÆEdD ñ®Re hÑήB/I½Ï®[,‰z=?¤'“BaîÁUèUÙ²‹.n²÷t T´s¸Z–Å^pv5Dˆ ®F¼ˆ–§º¾¡"‹-]2Xºh$Ùµ²Ô\ÅßhR\e¥@1†«Ý2jL푞Cï¹WKIé<ìrñI ÂÎ^Ûp5èq„?Gã³Ø»p:9cÌÍ•:¾©5""p•1+ó2\-!pS¸¾¦B¯8í+ŽzCÙ/Ÿì¦ê>\­¯*‡ q pf 9ñÜméZšrõw¸AèÕª<©fË8ä_ŽájÞ՜ٯ)·)G6œ‚†« õ5Ê5ßÛ€«Äs– ?ò®vÖ$…2/)V 3ýðq XÑ•­„UÚ"r^7÷à*‚”bå—H¨1¯AìÁÕ‚3$ÏmW½Gï_oWódÈm ήj/¸ŠAÒ]|u;²ÓÇùmš ®nE$¤' WkJu¹G!wð*\µ»¥K µ„üfk8# W£Þ \ŽÀÕÑœI÷hS‚ª‹TF ®ÒÏÅx%Ës®Vd±"]‡«bMÒ8 ªz[E5‘”‘ñZäËÃÕ,aØsÐ]žTipÏøÐªÁÕ¹¯ˆ£^§÷ …BÈÞ5 ·Së¬x,yô{Ù{ S½Wß/8·ÖHÃÕè´C®-ËÍsSî‘…­W³µ{gz®jù¢ˆ¾E7Û†«Ë†@´0é&xEåêo!ÃU4;2‚Ö€«Å;1N ²T‡+ƒ¤Á€1(ÓàÍÐ,®œÉ÷+V G+I¢^'3²ÚYw "{çox6Qd(1!OQØ™¸¿.¤"è¹uœI÷f®û#1¢èR"ÉG"^,¼o¤àªAu•vÑèˆg~p|¶R眱o;kÜm¸BUòà ®Â?“µµMpõ.åªá ›…¡ÔW1  ^ÌÏ.\U5ÂÕÐ^²%ƒÑhçpuÅÈžlôWÅQ¯¡Ñ¬à*¢[îáùÈ1å1CѪpy y ‘ýÈâGÐõ0kËóH ±ˆXñE\ýæ5¦³4z›týP¤uØÈ|yÓcMè,%Õ•™ÀÕHõ¦¿*²9›ÃÕ³kèê èq8«Û«W%óߢ఑$VA=½2œJn6ZmeÞñ¥l ¸Š¦À ñä”kÜlÂUÑìþ¥Ü}¸qÈoˆÿ&¸j(ÂßÍáêÍVßk®nåûs ol¸Òî<°ÃZÃÞMdMæÒ´¶Kµÿ àj«XÃU$V ²¥B™ ÇDŠQtq«:Kæ¿™jÔ)]8wÒõæ¿tûB)¸zÕhWq*!*±rŠÓwÀ­áT®†ô„7ƒÚÉ=%žó²‡pµ®ª¬èr"B9$“úHH<ñÂUºâAîáhè%²‘ ƒBae|wáêâ÷¡$í½AÞ )\=³ª¡®š†«ŽÐ«FZ:f^–Å ‘-û˜ðbŠ%\­5f'û›á*ùá>èñüSËñwIÆ.hpy_&H%puê£ÔÎJ¦Ô7%œÕ‡9\E’‹¼m^ÊO… ÂÃ6\íî8‰†nQmü­5àjEÇjÀ›àjxïΆgó.\­.TA9 Y07¡ßäË?‡ü“,x ãÐC¸ŠžÅÀÃqG-SQŒquMöqðRk»dÊÕßa<×iIÑOç9«“Ø3_P4¦6–pµ¾Ú@+Oë´ÚØPS–Ëòp#\ÍÇáL¾×¸JÜf\U§+V^Cp~ƒÔ7nÒè&\%1ëSŽÿÊ5ß Ã_p ®ÂŸ 粤4UyåêoòNÆ8xÖkf4š«ùÁà%¨G¤,8»ºèÊäÚpÔnœ–†«HÿÕ £Ð.ÂÕÇ–Ð$põRbÆè›(ên£È€‘zæB¹j8½fÞæôŠ H¨é-i¸ ÉAc:W!36þî•,. Àõßâ R]Exr®Vê„P2öà*ÂDÞñ%-ÄS¸Z¬„<)[öQÛ'Åy'bà²<„«˜’ènnÀ¨Š•_^Øàt‡,²@qñûöV]z® f> ½d¤6·’,|»„³×è\Ý6±%ëv W1k´»ƒìÂÕ”é˜¿ÐÆîgÀÄ!Ën)2L×Þ/8·ÎJ™ÇÕþp®JsF;‚«€ÍJ°÷{Š•)]«ð$È(¹8²¦,§èÒfÞôÇ*4ðp®Á¢ÈþŠ_@ðà%IÔë䇳Cs²¶ùÑp•`ü¹¯’ç(¸J~Ù2ž,V\úÙniÂЏ¯1ù!=‘òЋ=è¥Ë†ÌK¦}—æ¿©I' ׊¶u|ÍÖš­  YãoãNyˆ7µ. ‘ÝWOÄàüPG¸ ¼„!MàªïÈ¡6 CÓ+Òˆ7Ûl®Bl®*Óä1CÑbH€3žÒí÷®Šæ¼¤Þô§\}nγ Rœ«-ãÑ_^€«ë~¤C9)ž¹;˜5¶†«¾Á\ÀÌÅ]à«E}é:Ïf¸ªX1ŒÔã |ÝDÖ¨3¨tšs wÔ ®˜øÈ4áêj4£ ®µ.’ì®"5Ã+aíj¨ó`CgF•¡¸)-F)Ú H¼Ã¥2×µÙ„«˜éèzµ‰› ®"}#›åM¸iº£”:J³eÜ5WGÍùd—°Ý`‡µž ?¤u2Ëæ˜é€«îYÛÁUCâ)T"B òPUüHÈT®Âý,)¸ LJÖøÞ©I“s02;e©œF-f+¾²ò¸®²”®Í$4@5éöÏ‚D‡‹ã?€’[ÊO÷®V”ÇÇb†"¦Cø9}?„«dá@så7K«¯©€@eûÞAÇC ‰‹0MgcW PîÁU²÷õzKƒxƒÄ=:…«óÒèApU–µÍ×®êç!çädÓÞ‡ >kõÍાâG¹ö3\…„@VedW1~òŽ/…ÎATâMíZœ¾ÃœÚCX ß'R$~¤ÓÚhFSÞ,ŒèƒÖ€.‚lkhQ×MÁ›ú¨ãr—®nøµ-á*:‚Ü8³³y®R•û¢Y(¸zJû)ozwÉÂw„¡½\…«P¤ô47ÝuE1N+]ò£–¡áêì—l¢†60èjRQ³0“¤Ûñ#Èò•9/;xú,ïÂfvȳð`ô?i¸ªN Å‹VR®ŽZïclÀù‘ÙaœC]ה鲓(’îÖU’߀ÈFÆ›þÄÐ­Èæb2Ò¹|£ê\ªâèEÃè-¤¶ê ³yW'ß§X9LüT3¸º;n)Imy>ŽgïšfM0êÑȘÈãðRu±&{ç^`W x&>Š?ÌÔöèß“JnyR´¶©d}³˜¿…*/þà’aôR^Zq…ÙÂUäÅèsp1ÁÕI÷ Á€Dk®âÿHù!O˜Û†«9byìgmW©j~,3\-¼˜@|ÿûóNÆPpõU7à*NX&<‚v@²I8@Pw¤Nø›‚«ÑêM:†«ð ÔÒnGC—T™>ç)\•E4´„«ðêôo &¸šà%¸Z Ôîæ=®ŠÉüS4\EÚËp;uÚÚ®b$×–Ùà„­jy'bÔ›ÿ"èògôüj‚«:ÓOOc¦%8þ¸¸ªNW®þîÚil®n‚«'c bÂÈ46@G9‡«åùüéÝ1ÑZ²îúšŠâ+[Ípƒ!Òò¡\~·Îê'¼þQoúKw j™„?;ëHU“ø_šàj3º%\Åqè¨ë®œYeú->aõ¬ÇN(Ϫ¼Gá… ‚™Oc¶bÞ‰£^„ôÌx ·†‘wlFÛïÖ¸NÒèAÙ;ýéÒÄ®î˜L*E½ž"úü°5é^œ~˜ÀÕðèvC¯•KNšàꜙëê&l-‹íøš¡œ!è¥)øFoj·¢+[ªó实| ‚o@üÒl‡KÕîqÀUŒR4n# *1kÇ${ÏaºÉc‡Ú„«Tí¯þ0ø^ ®>„à"[òA<û%¤Q˜#u•%%ìÝH1<«˜GHj\¥ áRp5ú6{×T¨ýüÓ+¨ªb³‘!ÅÃÕ*×|g W!ØÈ;co‘̃þϱi÷„`ú Ô6´€«!h1Ù’ÁŒà*k.R¯¸@?ŸNJÀHÕ‹é!õnÕg¾‰îÁ÷ⲩ÷ÿ•p5ó AÜ;¡X ½‘)ÐÞéœòVŒÎä{K¹û\%+–,Ygdô-Ž»W§‹jÚþuX«ZŸå§§ l‡Ë¸êžµ\­.ÒÀ·Wæˆ$óßÏ™„¤¾8}‡ ®.ùÀ®ö'puËøÜ# šÁÕ 2×ýLïMÅ$4XÀÕ>\&]ü~Á¹µø§M¸ŠoÒcB„àóŽ/EÀuWÆréi¨/|©ÍgÜlÀÕƒ³ù!O"#`WK2vAàY®›bb¸Sé¶áªÑO”ó™Uu-j”Qp•°_Äh](IÉ‚·ÑÐ¥t%K¸Z.>®Xõ5‰#]íÁURÒª!Ö®Šf¿D/hi®î‰¯£á*4U™ø8nJ›”½ÃŸVËʵ?T:X`4bÕ×VÒb˜nÜpKt„IºãJ3¥œ}®Mûq˜j¹m¸ª/È¥ ÉÞ•Ìàêü7 ›îº¢’‰‰£–i„«öVvÏ •+µ|§ÌV3T·?œÀU¤Ûk¾'p5¢/€½÷çž]Ïžöx\­©ÌN@®JàjY.DxK¸JøX&'u^\ö_MÒ8†t™à*µU>K•Yb WÉ.'Á-{· š ´.¦mÖÍ2„«èd¦æJ/4\…O@ê$‹‡Ü®&em›X‘ÍEæˆWÍÇmÂUü-[úâZ;ÀÕóë‘ô‘]-¦v‚à\Í94P8ëz÷d„T¸kx`W,$;áÚ†«ÇÜ‚«2{ûU1…«B ®nþ›ãw4+.O·7”ì/“ð®ÙóFF¸AöJ?‰ÃüS4\E°cRP¨ið8€«F#.Ëp•,Q6Ö×\ zœüÄYÚpUµá7&Û5b¨#˜Æ¿è­[Ds^„=ÇžxWÆØNäê±/èGÚµoÑ {tË º¢\õ<ö3òظÃóØƒ«PtüàÖpµ¡2’\Íã>¬Þ4Ê&\ÅŒ0ÁUJs"Y> AÃUø±šœI=W}Ñjг ªË6¿Ý®jXuŽàª–1\ûʱWlU¸Š^À¦*Cþ áG6S€Ÿ'ˆ,'†¼Ôló•.Œ9‹à+˜ù "«Ç—PëQïãL¾W¶ìcË¥†˜×ˆ#¬ñ·c¶Baì]ä×…7õQèmWCŸƒÈ‡Z†+CR@»hÁŒ§¤‹ADÁµ¨bh6†z}-‘¦mCöAëUÁŒ§3ŸF_ÀÉ#A€!„å[B/Ç¥ÚÍÀÕÝÁ­W‹ZMp5«e, ŠG}fÚ¿øpT™è8I£N,Ól`/›3d^FÓÙ„«…i P\0EÜ×®Ny¨\r ¹!Ô„i\#ŠæÅ{¢É‘iÇ@ãÑ¡úÉô­n_8½Ž”l·?œDü…ï µU~¥àê§4\åNy˜®Á®"R›Š“S 2 Œ®â2à"ÂÕâ«Û1ån`ø8gÒ½?…i(¸ºÙ+[:Ú3\6Ú¾S™,ÙË)þ ®Ú~úø°–p•L°çŠÓw !¥Ú„îCT5RéŽÀÏH¢^gSÛ|`cä8 +L¬ÖPd³´x\í0{†^¶9–:àª{Ö.pU<ï•ì]HEêjŠ3vRpõNyì'f¸JÊdMèŒøõâ¸JöØíKÃUòËæÅM"ÞÕ–pµ\|²ÐæÃûVÆ®Bùg'“mh3z2ƒ«»ƒ‡²(¸š“:Ïñ•е¶Ð†–©=ƒ†D´W« 3Ñ-«{Udqð]¼iÝôòsÔ&V\%ËËMpuVúYõ††:$Gʵ?(×~àŽÜÜ\í®Fö³Þ8ÕHr)üß NצLWmIà*Dþ¹uRj-š.síLà*RÈ2Ñ1Èô t{#\½«àÌê–Y*«~÷ ü9hÒâ«Û ·IõW/Í$Œ¹G¢mÂÕšRÔ ôý|ó.\E6!ŒèCડ*B±â ä˜_l²®k\§œ‘u•vóD³ÑÙYÂU †¼ã‹Ås8à0&¸ÙÏëÅ /nÂn¾¡€ 3ÃU«ß1€«ëXÍàjüRæzWá1lÁÕ: N®ÿ–p~L³e<ÃUVp*]¶ôCú‡‹7$¶\}Ó6UsÃUÿœƒ‘Èåéšàê„;0Òq_Ú€«7ÑK‚ ª+Íáê ®Î¶†«K>È9á!\%•œ5š-¸ú=7ð¤cµ²îÁUŪáÂðÞdÑNü EÞÔ®\ÕbˆÂëÚ„«…ü£œ¹o¹ W+sEö¶36ÁÕK›íÃÕ3ðÿ¥üT2ÕÆßé=‹ÉH«­Ôí åM{ ×LïN⡵-\åÑpµå¿ õ58›á*´äM¹ô4\d®Ö+,Ú%cWkõ…çÖœ]Mÿ³¾Z_*H…2†õ¦·’1ϲ“TãÛì½Õ“Íûކ«ŸÒ­:0{pa‘?½»\}™`Æp•ÔÜNp W Ü²¶M¬²Øk• \Õî )8»F¶ô#›ßn WÕœÉ÷Ù…«K?ªÐ8Y~i:m®XK‚©pÚªp5—¬%~Ò®îÁ?ͬà QSOÒ“ëÿ (‚ìÆ+ˆ!ý·OV2[TI%e¦ö„°ÆÝŠñFÃU²KïÄ»¸S†Z#§šù´bÅ0MÒXtÜ”y|Rðaô¯=¸ ±„ˆl7+†+6ÁÕ°çD/r)ÐÝ®*Wƒ~‡.ÍNh=¸Š“W5n݈,Z£ÎlùÈ[¹„üO*Ð.ÿœl¥a42…«¶v: puvøCœÓ®"º‘ðW¼#ÓÔîQœžìö â"Éãu«†Ó?¸Ôg¡ãйy0y'cÉVq{f`ÀË–}¬\ý­:i 2ôoaÚF ®>d‚«QÌàêî`œ„†«ÈPàˆÐ\Õ \]5QXºè=×áj7®b‚#w+8¿žÉ""· Šäí{.#?k›¯&q Û*»?_§f®JNÂ[]Þ‚C ·¬ájÈ“ây¯™àê–ñHf½WKX)63‘¸Úaö¬®z×Ú®Šf¿„¨D3\x7B¿®"UAäò®R«âi¸šµc’xî+põâ+[øA=ÀUÛKëikWUõ$puÇdæp®wÍÚ׌Lßqó¸ÊÙC®Ü¥~qW*µ|Rþ”ÀUkx…â»3ŸAs!½E·J¼Õ ®†=G?|gW©zæºfpµ<_½ñw—à*®yMM‰V¯Là AV«Iƒ^ЈÏy)÷È$ƒJfpI¢^ÎÁÙø df¸šj¹itY $¦Ê5ß9hRWW~éM¸j(Ê=umÂUº : }¡ˆûmNŠùO¼›†«¸<y¢ÙHõ­y¯6ƒ«åyÈ1ÉfUuv±@#\íëõçŒÃÕO0ž‘vé•—è4Ç \=Ç xD±â úQÍfpµ@ ¡e®êåç\«Ö.Ë ®â$å–u$ê*ŠàÚ®b<_›pU»w¦y³f½â¼lÙ&¸;x{~5\ETÒlG{s¸ŠLJºp :®\Õò1Úu{C=«ø,\.¢“·5‡«ù§W ´að ÙG>ë6\•Å|‚^Óî &.}Z7²ýÊæ¿‘oâ¦ìÂUî!Nä+pb.ÁUdöZ SÞ&ÿLœ½5ÏåÒÓpŒˆ ˜ è5Ú#!¿&Ëi®[¸Šw'C?zÜh¤1©-W&y®¢áŠI Ggò½‚Ð^Œ6"!½Ï¨\ cWkJ² ™´)AÆÆ!T˜¶]ƒ1ÝÅÛ©\¥v’² ÆüSm WŠ®lm¸z0=Žf,8»š1\MwW¥‹[nRéÀ¨¼àÝÞ™ àª3¸jTº Wq/e£üž–è 2 mN=ß}7ifüÙÒ!ó¸þ÷óƒºãˆrõw–ËtMpuì-Vpif±`æÓ+™ñ#‹.%–röYÂUÞÔnª¿Ûk:„õæ¿ ³IµåŸ½ê×EHÃÕ)ç[Ò®f®ûI»wt)©TÐpUBà*üy‘ ²h•”gP^²zg)?U¹æ[hu :Œ2‚«‹©7Ú(Æe®æ^€Þ1W`Cþˆ¡eîö b®¡Í[ÀÕÛ‚1 s.¢º{$}‡vƼ@³œ_¯X1ŒÞª˜ª©û*“´(H‡i¸Šfä>\•/£á*ü?F2räfpµ1òÚ†«ê«H‹h¸ ŸƒSaÚ2Yùà¶5ÁՙϘàjW] y×—9€«êÄÑ$͉zÝ ®BÀ0BJ8{áa  ¼Ww•X¬ 0[\í0{ÖW½kíW— ¡öÙœÝWÇÜäu¸Š`a‰¬Ö®ò¦?IÌ®–‰ŽA™^ˆÏ=e½ÅL£Qpu1|&⩃L I.B3IÏ™ÀÕ17áò\òZÓþ aÐøN#¢|m©ÎJ^"Á,aí¤džáj½^™Æ›Ú• \%ç‰zÝ\-aïE“BŽâ^ ñ ü›ÃÕ<ˆ›pµ8}úcâ9¬à*ò¾ìdÿRÞ½âz'GÔ†Â$KªÂze%p§<‚áùÁ®’ËNmWõòógט¿ÝWWë IÛ®:{αi(¶\Åå!]UmüMÖâüåyVpóŽ,Uj¸ŠÎEŽ Ýr÷êÖ0æpÙ¹â"¢25 i„쓹™~4;pU<÷Ud…Hr›ÃU¶‡pµ¾¶²”ÐqÑ c ¸šw"NXöf®Jþ¼{p•”LŸñ²$åšïÎ3„«Ü9o ÏbW+Š ŽpWUŠ•_À!Û«»Ž¤ßeW‹.n®«,ó\Å|¬Ô 1<Ú®jXôs=–œíY] ÀTjE¸JjE>n¯ò¹¥I¼UIà¥*ù'–©6üê®6ªòÙÉSšàjEqÞ‰edýaP+¸ ÑIãèluÕm W#ú"û&¿˜ds ÿtûÂ[b2›S¸ ÙS•+u®æY€ÇG E™ÀUòßìL›ÁUê=ª6r\§TÛá_Ù*—\…«'Pƒ4\…‹³ü™ ‡=± ®Ê—®Ï¼DÖ?P›x"°¬íH­Ý3ƒüœ¿?ˆfõÂ'põd,Oºè}eÜð–pCg³”C–f†«zù9t ›ÿ¢÷®"Êù袖p“W±ê묭Z®Â Ãz[ÁU%ï")ÛbQò×HÃÕµßã:]ƒ«ÑïÚ|^ )t#ºo°„«hpyìÐr*m4z®Âõ¡G¬áêøÛ Ï­Å]›áªbÅÊÕß Ðîæú?€ ¯Ë?7/›Á¥:ЇfËNÀ©šà*ï âWE)ÁAtõØ[0LÉ}\ÅŒ0d^B_ÓÓÐ&\EìÀ¸"pµ®º­àªA›2×Iª^ûu逫l˜¤MpµbÖQ+F\]ø®ÀûpõR"¬åñ¸j×b/ÌÈÿ?½˜= éHZxÁÿ• YäH칯Ë’ξC@ëâ’Ço4ÐÚW½kÞ„«F#y›5Ð W*uBÉü·ªr%4õ‚¼¤÷É…KAÎ…Ôѳ”wP2ÿMÕ†_Mp•< ´F»;¸\BV{’…j'c5IcëÀUÄIÔÜMpuÁÛT¹ø÷”!À!ÿ?{ggWuíÿ"J)”B)RhŠ{Š-Þ`E^‡<¤P(Äeâ2™dbO& q%nÄÝ]ÇÝÝÝíÒ÷ÿ®½ïœ9sï¹2“¡¼?/|ö‡O2¹sî9[Öú­ïÙ{­˜°SÎpµ$jWâìw N.Ená‰PFL‡&puÛ(+aR9´ü$¯kЇõ½^…–Ž0àjH÷_ò¥WWõ éy¥\­Ã7e¬àpK‚Ϭæâ­„«ûg8÷ÌÐÈ9#wpõv W+‹qÜÈOµ2# a‚«µh]< j„€‚¸ cÃàì„P¸Š—Ñ™]ÓVö@"j¸Zp| Ò”±v€« ÁEÑÙµW—u–“8 ?E¾†ôº*Ôçj]´%~úÜžg¸Z˜Æ½¡OP¤È'¢0¾1jø}Äe¢ÒO¯äúz‹í}ÓÇñ3ÞpÓ¥'¾•jì?\Uém› SMqó!|P;ËÂü“¹ÂfÙ㽫L3–@IÄvû ‰­h”dêò®ÈxI$põ5ûöÂUÔcEzHµ–Ü®ú·w“èO&Òÿ69ÞknùÇ—HΫäS6uŽ›udqÛãŸ&X¸*5pßÐgN™®.›µgjP«ÌpU*¨Îÿˆå\‘Â<—Í_åHVêÓ+™Ø¬šš¢tïàªq Îf‚«1ãžb8X¡„¬Mã×kK²&<Ѷ}èM³ÃÕc‹½©zvîÍK¸š²ôë”%_X@ÁÕ—AÜ[F¸«D^¡}¯#ÊÖëÔ®Jšâá÷=yIáZ}mUmY>‹Â+¸Z_ƒí îv¹Ç$'ê¼ E¹%|Jø ?¤,íØÒÀTûcÉùk$Äç®flôejµ!\e\õ’ÀÕÉi)\EN0ÿ37åÙºÚ{CmÞ“Kyc©Ì­(h}ÚnUba\[¯«P^rE±œÃîá×Ó×ôá·ÉÞ5Þ®ªÄò=<ÀÕesvMŒô‚¥÷oWëªYËÜ òÃaþ`põ9Dš'¸Z¦«ņžô®bÍPÚ ®vÃ:á ­!iþÇŒSˆåÉJÇqG ¿Ÿ9ÏJÑJ i˜J²ÐÃBü|®I_×_oa• ‡Ý/GÜêô,Òè€ÇrÌÄÅw»Ì˜¢˜èäÅŸ—5n¼thr|oþGèÕâøt,­ã¾ Õ§á*à箦.íH|¡àjGÖrÜä^v‹— g$pue7C¨EÇŸÞ¾~€™ž]ËM¢Y•Dyz¢oY©Ë:¶®bÏÑ,U.‹2ís]yòižNWï26Eœ;\Ew%/ú §—<@êö1òªnÓP\@u~rƆ!|)“„™€…i‚«Ÿk1\]íƒÉŠÿ K´[xf±aÁ‰¥\³ ®vû…TÙÀo!p5îªÛ¸ŠdfÒWÙ•9VÓhÃÆJÄ&3±>îœéApÇ´4.ýôš3\%¨¡ÛóÏ“v~wG ¹-Òï"n:ÇWÇ?m†« ³Þ.óäV¼iX ˘å<\uÙÜÃUs;WÏÃU/ZÂÕŠôàò”ÓÎ9Ìm®f„aF¤*èŒ7#†Üšµu„&„põJbRÁ•*ï“W±ø¬’p)û¨àj —pÕ‡D!´4àjì„ç¸,j$nêËz3XL¨\ØÁ_’½#Oä¦T½\Í?²ÀUÕr1, —ú^Çõ?`ÀUücXÿ N-§è“®"DÝÙ᪭¾ªÄØ8ÇwœZ!œÓ5\•„¨£bd‘vÑ£ÿ¤á*ÿ„2ÃÕ‚ߦ,ý:mµl%íx¡¼¾Œ9ÕWK²ç¼gÀU´½®gmS/¦“N{Ý®rc‰s?à‘Kã¢Bã§ý5iÁ'öó2].‰|%¤ç• 7wè®Ò“Èõ¬-þiA\„1Š xœ@CÃÕüc‹¸s;\­«¡+˜–ñÓ^sӥĹ2ÁÚ®¢â®Æ2ÃU¨*7ÝÎcêîrhD𲝲yŒà%\û"°Îõ‘|ÝôkYædÊ’¢®¥¨ôèG<õs€«‚ƒÂ·V¸ W™'Ä8E!ôç™N‘Ãïׯ`,›‚«ãˆPësË?*™²´8'àÍØ08g¯¾Æ˜¨Ý±¥Ñ{ã_Upõ&-3Yª-;¥kÎÚ=ùl÷+Lpµœ•B\Æ$,O>;ñyħ¸cÄeôü•†«2âkûFøÞ™º¢‹eÂÉœ¿¢kIÔî¦ùSYÄ4Öe²5\e•'Ouw"”¶íCoš†«yGæµ”kµ®yW“|b –"›±‹-ÊÞ=1´Ë´’!½®"xÔŽÉ®¦GøÝí}Y‡F`‚£a”‹Î®ó WÕ†íG®n‘4ï#–¶l5_ÛÏ‚Ïmé àŽÃÜ$‰[wŽOœý®>0n‡«†Èž(põ¦b)âì\u°xææ®ÚJ"w9ÃU>Ѹ:øÖÔå]t#cÄÒsÞ è¾žY# ÷v0š\PÒÊ­îå öšš­¦$«8tj$m!gÆwƒ÷@Ú0¹® ÙØÜÀÕ£ ±!LBW¹\ëà*6$vÒ 1cŸTEp.ù:Âcn‘Ãî•Êm”åCàªT‡Üàn¶T•­#zåÙ5\ey¦­ìN 5üŸ«ƒ:_¢™˜nø&÷BMpÕâ‘Í€«S:°¸Üß¿+¸*åJûß”³g •½kBkàêìÿr†«’¬øÈ<Ö#½‘4ÿ#œ©#\•Äò]ÝÃÕ”¥_1¥]ÁULYÒÜ5\­¯­*ÛÊÄà€gË᪀S´´pê-\­*Í=8 ß2¸ºe„ ®ZFÁÕ‹Pb¼òdY¤X 9eiGnÞ\Ö–ÊF¶}ý3¼kœß’’ñ/6à*_1ä¶(ÿß…§VèŠ{º!‡’ÿÃ|üÄÜ®Îý "=‘)ÛÞý)TžxŒÎá»$¡MZ0Ó>c£¯z=-p•iwh6s†è)Ôçš6?¥¢á*`x:¢è¸“Û™TÅa›!ðäpÙà[xvÆQJÂÚçžË_]½‘q WgÇK_×7÷À K¸éÿ@¡U&LsÃþ0^š±žZ.põôJbÌÜ}Ó_c’È ¯WpµT%èÐK£\=µ"}MŸŠÔ fpuëH•žwÒ¿ ®N|ž@Ràêê^WMuß~bÍ®ÊÒð½ƒ.™†Ü>è©æ6óoĘ¢ÂõÚåbæ's̼ãú\Ž/àüóópõÞ§¾)ù>îlÒºŒŠ¤ÒºòʲÛŽµôW›Òú<ºÆFOÙÊjò³ߘñc?Qµópµm[›ÁU›ÈûP[j¡˜á*™>T¨ aiì¨Jâ ¥_q”ØW7•­ƒË»dnR™Ú ®N}¹(h=†«<ù”%bå_ñãeñGšàê¤äØò˜Ç⦼T¶ê®nLJæ[ÄJº×xÇ®*iíªê°™ÁÝ~á®fïžÄu"|oÇüâ” j$(ð®V—žYÖÂU¢cÕpÀ½emeÿ®úºü£ P(4ç¨SÃU¢Wb|AiôÞèÑØájªPJ´Vþ‘ùê:µùGæ!ڋ÷!xDô™QÇ ¸ŠÎOøæ-®¦,ýšÉ ´ÐfÃ%1Lx"z&%8g¾]xz•ì®™ÿ1ªáªjHíEÅHé:«sÞs³/HTÓÜåu?·=ÿc¾:aÆ[Lp´Ù´ Ry5ÿSàj '¸:¹ƒGå}“­V›üœájYÜAD]âÜ…¬íοH¤I·;¼&þAàêFßäÅŸ³¨£F=„°d "à*±+¥ðÌjËëh¸š{p&Ò4ïð›JrÅ(8u]*ÎW£Ûª·uË;83>ðU½KÁ \ý'‰^sbK¢vc‘4\Í;8 ¡‹ªtN’µkBPW9”§ãV« >M˜õNu~rÁÑ„gáªT.Ú6*¸Çv¸šM7òÈÄ€–yùtYRóöøºŠ¢€ NEúÝ“¹ÅŸéD\»ºÁg¸,ÂWw79Û°5ƒ«¶‡¥ïÀ‡²¾ô_͸©¯„ö»ˆ5÷ÀLpµç¯Âú^﮽³Õp•y";ÿwŒÅ3zW„ö¾«Èä$Üf¾ÅNz1kû,ƒÔ¤^Òr¸º~€®Ž‰¸êsuø v,WË‹'÷pµÿïÔ‹'·pµ¼@¨½ 4v¿¸ºš%Ì”*Ša[ù.‚S3\ÍÙ;UÒlʬ3ÃUéå]Z W‘’¯{ûF3Âï.ü;ÓÀ9å©Ó½Õgmq#.–õí?eg‘âZ&¡»ú]>–0ëmg¸Ê'ºçfÚ®î’LJƒþÀZ8Û颞Wz WO­l«,ÞÀU«õ…ï`rÊO2#ç‘O ºh3ƒ¬v¼PÎþ=ÕÝp5Ò-\ÜÁÕÞB£¹‚«ß D­ñ-u•Åš€IvʺšòÄcžájI6Ï宩:à¿S[Û#˜]fâ‡û`ž \uªM–¼ðï¬ݨj‘?g¹M¢2= Ae‡«5E!¬á*jjÞ·®fFÄŒ}B¬â9ÃUæž$ºl\ îz™›L)’sµÛ/ôë{ý6¤®²=ò¡Â³ëJ¢÷âj›†©,/GÕ±Ò»4ùCLÅ ‰)4\Å,‡õ»WŽ/fôñ/4™¢_ÿŒP%eÉ—æã'æ†*Nl„«tH„ßÝ \yÒ ì¡€ÜU=Ëó3\M_׿àÄR«Ë»ð¥h-/»ÅËf‡«ß~¥ÏØeŠ=¶‰Å›wh¶ñ1 W#†Ü6àfbœÚ2™äèC"“k¸zBh³+¸ªŠÑøeWƒX›‰sþ‹Á2d?WÀÞ5´úÑxº0„®æ'aló-ÆÑà‹¥nnL¢®êÐÉ®úÝíq-¿ sLÉ{窒‚“K¹Bæ–º–®úüšQ¶ÃÕÚªÒè}ü«3\¥ÏÓVûTf„7ÁÕÒ\æÓ/{G€óK–6l¨\k mÌ* ®—cÿÇàjQÈFÙ?pha&FǤH}zK5òÁÄÙrгÏ*HšûA›ÁÕƒ³ÐÕÎ??W\ýŸÿ)ÏüzÞ{<·=¿´6¿ólïáêù«çáªW­­àjuAjÌøg²wO´:ÆkC†É Ž€ÇÅI)”¹q¨>+û¦vŒÅæà÷®[,¡Š¯ÀU"â-iîû1O ŸÍp5~úúìÚqˆO,Å•”Å6àjÜ”¸à¨íÞ%Q»=ÀÕ#óU­Ï‹ÕùÖ‡ŽeÌæá†Èù}$ñæá®’’ႉ:%›½K¸ZFA 5âA´&gÔX9ô¤¸q¾.Ý ®ŠÿUYdÏ ®ÖU#˜m™ õu ™”)ß6ºÙ˜<7Ô•'Ÿv„«£¡ðv¸ê{‡®ÉÛP_‹J[Ù{&jPï¬?Ë?ÔW‹³øÒ˜qO™á*²°¾¶Š_$OœõŽ\åÊñ¯1² ®~ÄÈšàêÏ„Ìwý9ÁQXÿ®Îz[o3°l„‰³ßElð™Ä9¬<2aZ}uiÞá9)‹%ù•ßÛ5A‚ÈáëÜtiþñ%hc)þÛF+•ÎTt†«y‡çሹºuçü‹éëú[U¤5›Š^ÃUÖ—ÇYê> ½ 1);1ú^σž]S³W—3ÃÕòäSèg³Ò67 WsöJ}U% jŠÒøÝÈa÷¸Qb?\%Þ‰›ô¢9nà*ë4uE7«‘»â¦¼¤á*¿[´ŽtN™µs\P·Ë¾yK³D Wãg¼‰…)=(IœájM9ƒês5kÇ€«DLi+»Yf£Å~㘌»;8SʾU—çËÜ4”¸¾ºqKsMajæ–á? \å"†Ü†ýùAsÍ Wé–âðmE¡¥{Yò¸£ò ÔȘÒëŠ1Ä/`™½‡«R¹xûsi>#gÒUNWY_ E2UèWÌÍ€«'—ã›ÜXàjÂQ¥ç\ýn œm |û†™Å´¶®ú\>ø9g:GJ“ð8É >Á¼33½€«7b"ÜÃU=E½€«/fïš` 3¥ \èæ°~7Êé ›-aÖ;:7ŸgÚsq‚\«j#½ÀÕm£ZWó³Ö¾¸ºÚ'Òÿàn¿H^ò…›Ó4ƽÅM}…9Ú÷úÔ¥“þU¯Oê$–xU[c>d‡Vžt2aÆ›pÝÅ ªÊÿàê’&]*q_à-\õ»»àø’¶ª“â \- ߆ùÊÚ>aIðn³ÃÕçjÓžÕ .—¨,…í*îHÃÕQ‡m±üÀ¹ÃÕôõý¥Th#\v_þ±EBHbxWÑÆˆp5}MofWUN“v²ÃÕ±O9oÀó"ÿ˜Éüþ!ü¯-q<¯d“—¤¡‰³ÿ ÿ.?«ËXË–pUj~ÍyQ0—Vlv«…4D¦þ+RÞT®ê᮪Œ®l‚ýÊU%9{§båbCOxWØíàî¿ÔSȲa-Q€Á=®ŒŸöWm:„‡'ŸŠÿ4±Œ¼å1™>ü‹>è$¯'æ¼gÌC~‚Ö¯{è:Ö F©àÄ·H ÌM~úPüÔW’ÿÃUV ;‹™]xfMÜÔ—™¨üË «.b˜–®bÖ¢FüQ¸‘Tðw‰s?H]ÖQ^‚û?àe·xÙ,ájÌáõ˜&S5^9‰¦NF· ®âò‡Ió?vþ'«ãŸFºà 1›®&Î|›na° éHçdnñ·®Ûë]³ÃÕÀ×ôfõê¼T™J\o‚«kz3YÈØ«ÂS+,á*a‘šûï2à*LξiºŽ3¶KÊp˜¶7£Cä-§‚«Ì=$&º®ºßÚ ®_’¶ºk§®^Y]˜–¾®?¿›µuD›W+hö U¥¬V ©f½ƒ¹K_Û…ð®²B1›L º]¶¦†§¶$ +ͪ´ç,:2/qîûmW±Ï¹û¦9ÿ¼Õpõî©û~"múÉ%ÿŠ?|ü~ý×Ù᧪g/;pwà‘Á9Ò¶ïÿÕÐØøkqäÙ‡øØ´ãc ¾Úwì>ùó‰ E߇ï9zïþ,mÚÎÃÕ¶mmWK¢vpáeœß‰#9„1ãžÂ’('õaXßë$d£8,O<.›yVûá•$-ÀÛ®nñ/‰Øž8ë]œ&šGäÊîIi+»#êP…§Wâۄ¿Íæ~®_ÌuÒ×öAn!*"üîŽð æKòl‡ž´†«Ó^Ë;8+ã»AÚºÊèˆm$ΕÔå}®=ÛñB|««Oâ‚Q>Á]ŽuÕ)Z}u)]‡ò÷4òCÞÃ6f×Á‡róÆuÄCñEÍ£{ô òŒNk¸øªV¼MpuËó˜2 e Çr÷ºF ¾UÃU±èQ+þ“a‡«CÄ¡¨ëÔ*ÑÞKŽ”iþ2)=t¿\EZëqÔpU¥3*Ì=03¬ÿMÎp5wïÔ¸I/òÈWç~;ñy3\ íwƒTtõ°Îü‰·2’/97T׸št"aæÛø>n/{û䇜/Û?ƒ¿"Vu¹U£ó²Ø ϹéR„zÏ2—xëšpõƬ-Ñ¢Jó?rÈ ç%\Õ‡ô=ÆÈRÈÀ÷Žôu}e[¯_ÇM~‘åÃ7F¿ß®&J÷æXÞ²pu×DÖµ–v¸êw·›¢!v¸:ìÞ6Wk(â8-¤=ÀU9 U¾-vÒ ¬Âd©Rí ®n#›Žæ¼§1N}u¹:köv£4z¿â W¥xß”<£,®ÂTpUNØI}í¦0®ê-[ÄqbEwMÈ2?õÖchÔȇڶ½i5EéáƒoÍÙè¦lY63\­ÎOf‚ï­Ì-yÁ'q“ÿb fhø+óã yϼƒ«Œ~tÀã„áx(óÎùò”3aýnH^ønްQo¼¬-Í-:»ÎÀ¹nZ\=±ëþÃv¸:à&;\]ן¹‘ðÍ[ÝüAN‹,ù'‹½E o›àêÁ™ø_)h5ø)Ê–Ÿ„…t WŸî~…WpU,Þ«Ñ{]Õ¸ª¶àZÂÌ&¸zt!¢‚%†»¸Ê´ÏŠB{°‚RWtÓ¶9ÁOR—uªmá6žü£ó qÜxd–Op×˰·-†« >eòhÅ?ñȸhãîÿàÏC÷Èûþôú]ÿèÏÒ¦í<\mÛÖVpµ(h½.\è Wê«òä\êðûõ@)j¹i¨±Q¤<éDä°{!ÚlĘÄHtÙúxhNiì9KÞóW’¢§<_Q¯~\¸ÅßRfïšHlUw0ÿÈ<\V«5âRÓjÂs:·•%\-ß7¥Cî¾@¾HÜÀ›]7ä{3¾$¹Áû^w¶ã…ª®vÐá#b'<ƒ‡ éq…åv® ñGIà¦ßQJ‘¦_£'5¶å:8J¢r‡ç W§#ì èxjôƒN©wœJÕÑæpµ*+š[ŸöWQšZ:R¶ý£O.;ÁUIUJg .Ópuî‡éÁ»›ÁUŽõ|°ÃUÅ̹±ð!·G˜Ë°Êàî¦Ê?¾¤$jò2fì“L’ Ž1wŽٕª{¸šÊ®&Oøæoê¨ì—9»&ÐÏuU¥¸§Ä9ï—Æ”Tc >•b¯Ý~ÁPºéRBK¢Ý\}Kàj¿ëõqH‡F¤‰Îd5›ŠÞÀÕú:B3´¨ÇY+‚8ÉzÑý—Ü â“Þf28ÀUfZÜÔ—‰zœ3‘Ú4\õHÖöÑñ¯èRήF ½«<ñ˜ËžÑpÕ-€m]câÅŒ{JÇÎåɧ3Öt†«˜5“À°8tsì„g%¯©{Ä6FÌ®nI/1W ¸Ê슟þ:«›HŠAmðnW+‹±„ 3Þ à­ÎOö®¢Ö¸Ÿ¦+8ÁÕ¼Ãsè[##Æ$c}â ¶íCoZMa¶.{÷DËd2mÞ¼„« PÌø§UjPù«ÀUÅ·C{_[xv­\] pµ YàªÏÕDß’p ºŒ‹$ÌxaÞ=N·ó"59Y¿×^®·ÈjµÌœìÐ4\%ZÉ?¶_æþÃp5}µOò‚OdgþÖÄòLEáJ"ïûЀ«DÊÌ´°¾×sv¸º²;kÜ®†lù¾¬EpUjê¹Haê®ÖÕ…lh„« ,1 W³¶ø³Z®Ž|(mUýâ çËCùƽl’Ʋɯ®þœ^õXËIàê”ÉpUˆÇÒ¯ípµ®šGÆEŠáu²“µ¥¹…gÖ(¸z_µ)‘fô˜ÇrvO¬HÅsµ%\Ø}“šžãŸö®† ¸YÛ¶ÑFt«Ó_w_{Hª]Ó¥'kŠ3¹sT3\•ýoŒô“£n.XWU"[þ\ÃUuN¡CÜä¿ ÜßÿW·Á^µ®Î~—þ‘ÔV»Ú4\ìƒ+©,.8¾Ø-\}ZÃ(çÆW°ÆCa^ÁÕŒ0l³ÞñW‹°o¸ãØã-€«ß DÐz€«+º§„ ü}ÂŒ·ŒlKÜ0vÀyÕÓ9,l,«5.ð•fpu“vX7WG!eEäç'ëk(dÖ²å7›†« ®ž\ŽÉÚ2¼"å4® &u|âWõCŠÛáêÒ¯$ëéÀv^v‹—­àÔr¼€h¡Æ¤ú%ù™‘ ÁnÐø±¼ƒ3#|ï”-.¾wð€ZzWGü‘ˆÏùŸä%øÄçTI [dGJßë*3#®NxV&4fã9w¸*Ó~Ö»¢o£e;1!aòâϱÆDdM,تœÖNööýPU¹q;ÜjV”a\½Qsÿ]\;fÏ·ÉOrÒJZ§‹±oÁ]›ªž¡䬢\-Éq WÓ‚°3®"6ä0Ô¦¡Õ^˜ôV7«óþ\–pŒÕ¾®?’'Ò…b=7[^ÞM}Øÿ…Í®o Öp5¨ëez¥´wn\¿’ÐYñ%ÝÇœ÷PŒSy{Óˆa-ë6¶®þlð¦ŸHóÛ?\ÁÕ õ_GœÜ]_=ù›­?²ëÿ*>z¹ñIßÝ_gþ«àÌù‰ïž^ ®^ÄŸ‡îí—÷ýéïv]ø£?K›¶ópµm[ÛÁÕuW­Þ…ူíA.Šýˆx¥ŸªtëCšÃÕ{Ó×öµÃÕ%_à8ø+Í€ËÆ7¡gT•C}^ÛWù¿zê:¶††zC›áL‰Kc`²$ÅÙ&?Ô ñ;¸úµ ¸º)fÂ3ÃÔÝ”ƒ»ÉK¸š8÷ýÊ ëz=rÎZ•³ î~¹{¸Špû$aWPçÿPxJ²!Eò,°puY§ê¼Äºò:Doìi5\¥è)¬PSAL‘½k"úA—§û¦9ÀUzµ¬´hÔ¨Gxp"ÂôO#\=K¬ÝWëjÐÞt”dÑÜ$p•’vf› ®fò¥(®²Äcµ¥9 ·†«h{t ’I:¶y!$úŠÛF,©mƯ]âÄrFé•°è>•lÐ\Q:ãMt>¸•¡Dñà©Ë:Ëù²Ý“ðwÄPü+Ó#(;W,‚nÌ7î燫áêô7⦼$…i–~íü‹(¨„o8Tåð®F¿ß{¸ÊœDíË«i¯¡„ÑNŒŽ\e¦±î²¶ø;#G›‚«‘þðaI¹m=XE2ó]m}±éš;Æ¢½Uk^7D{ô¨‡uE ¦%QªF¾æÆ’‰Ѿ\í| «]xzUtÀãŽOjk¸Úã \-ì±”Z§VDxPÞ›4ßýΠI…µ-þ^ÃÕÿ.6v7ઔP!œ¯(àöˆ%mWØ7FÐãó¢ÙáêÎq?hî/£YÀÕõÖp5zô£ ¸:õeF6´ÏµÅ!1p••ˆMÓ—Öïz[âD"‹ØñÏèm¢Íàjò)> àj»´U=´óÒ…fäÕƒ§G(K8‚d2Ñ{WㄼYÃÕÔå ½1Ι›‡ë·!·òÄãÅV¹\µ&¸ÊL›ÿqø€›"ýî±ÃÕÝÄ6ZÂÕ  ¡#U9Ǽƒ«ß æž¹1WAY&|—+¸Z_[)à*&¥"=Ä®&-øÄâнkdŸ #ÕüÑôù\|ËmƒJ‰Ÿþ†~5énPêkcätóßÅ×,íÈ xt<¥+ÑEbšÃU=^L^?M¥Z•Õôw“½# <å ¶Cá|§up•;á‹ðwQþí%Wd÷˽‰ÄÑWȉs«“bcøD„HrÚ‘hì•ËÛlzGöÿ'ÎzYÈhb½á* A º?c]77PWY¬àꃮ nIäθÉQÙ¥¬n­Epµ^'î9ÛñÄ’%\e"–ð°|†õë<]\Ícfnô|KúŸ–ÃÕ>²xMï˜q©lpµ¢0ÿȼÖÁU9µ¶¯!­\}èœz W+Š2· o\½6¤çUé®ç‚ »&AÁ6í£h¨'N1ò çŽh‘<âˆ¸Šµ R•"|ïc~d>#¥áª(øöŸ)KþY¾Íò6röJE­”ÓˆL,¹ý|Mj'&}Ö»h-.Â,â‹¢F=Ì*FËi¸šº¬#}Ö÷:÷¸¥MÃU¼·õfXó#ö„Íü«kN ž{`&½=æQI¿´£6Ý ®.À1¹²œnà*aËG6à&9ªÖïúê¼z=)å·d”'+¸ªj@´®U¤…0ñìpÕÖP™NT‚{"äÌ=ð úœu!Å áªMe[b.á¡¢ÇJèg'¢ƒoq¤…øƒ²|©nÐhðYûLû¡Åu}E¿íŸ!p5ðU]Ýø{Ë£5ÂÕ+äý—+¸š‚Æ&D’2K; ~_?ÐU±æ6i<¶‚YZž|šAo)\•ã'a[~]Úêæ WÑ!, I&°„ój&ãà`Ìt¬éÍj=«ªm&Î~—Ê•ÍlQ#2B8ÿ¼õpÕwóO¤ ?0¼èûëv]¨ÿ:ê”ÀÕ™Û~6t·ÀÕc—ŸôÛýuÖ¿ ΕŸøí¸ºiÏEüyè®OÒ¾Ï8qôŠ¡?ö³´isW[ÔÎÃU£µ\EÓbç36ú:+p©‚š|¶ÓEDvô¿¿F@6F®ÊvWãg¼‰[É?¾Á&jpiG” jU^¢#\ýæ?±Ø:)ßBøSÞ¸‡ ýŒû(ÝŸwxކ«É >ÅçpÙájÇ bB\ÀÕñO Øáj¿ÜÂÕÜ’†«’ÉÅy¤j_•{‚«É‹>çÛ‰^ƒ:]¤²„]Š>‰" ±mÍájQè&‚bP¹øÐˆ¡w†þƒ«tm–MíNyHtrU‰†«±“^¬-ÏÓýÉÏéC3\-O:™ª¢W¯ÅGðà\¤(h½ÀÕïÕ¦á:“æ~Ø ®î«¸kRIBG¥žÞÒW‹2—(ÿ’QprFÃÕê‚䜽S¢GÿIζ7OšÊÕø|Þ‘yW_‹ù°”û>šÝ˜:þ߯\M9CDÌ8âÑ⦾Âp§­öQpµ“ì`Ù€<(=¨â)Iì ¿ÿÅÍÙÏ®ær{ bï3’Í;<Ff³v¸Iy¹PW#1N£HCìIÔ3kÌ”¯põÈ|pµðì:”ñ²S =Ìx“‘¢KÕf§æp5f?ëŽRo•ÇUàê°{XËÄ}²g#rWqèfþÊ,2¾w\€ÅYÌ;\µ54´dæ»o¹û‰A4×-K8’¶¢sØá3HÇ(;\- ÙÀ#k¸Ê-å]ȯ;ÀÕúÚêŒ-#‚{]í WQ晪;ÓØ!ÒS@¤@×UfFÐ\mŸ¶²»%Á×ß³ß3ï¹2àjˆÏ5Ll†ƒ¨-}mŸ’h;¸ºªÇ WwŒýqàêÆ¡–û”B™ÿØ4ýW\ýmiÔn ¸zpVÊÒ¯kKs ÁÂú߈ÅvW“N⣰þ¿K˜ñfU®lAdX‰¦™9wR_[ÅeÍ ÆÐgl"G,=ÁÕz•ÅQªË)«ˆsþöí?±Ÿ<‘xì¤ç™Ì^ïûÃ=qMVMˆçbPÒ×ødn5êáè€ÇYA,gµsµcôèGBû^osª¶y.Í W¹m¦wòŠ!à êt1Q‰ñ±Ü}ÓQtv¸º¬®Vå[Ìôk%\ô½>ðæ˜qOpUÖøê^F-T)QŒ«„ÿÞ4"»„Yï¨dA»±ðúe::Ê€«<5k­9\M“½7[F0ôV}–ß¡®W+8±¬,þ°1« ¸J¬Á‘Êh»'Ñ“Œls¸z+–YïnEopÁ=®À-rK–pµ2=”n éqeev”ô¹Z*#»(ÖÜ& ®k£0+þÏÂÕ‚“Ku¾Dt¾1v,I¢¸*»[gþQ.nzg‡‹c;ׯõØpa–•8Z W/ºå'Òü*¸ºû"ý×ѧ®ÎÚ~ßî/\ý¥ñÉa{:fý« HýdØ>I °yïÅòO[³(ñHÅ÷tWMnìþ?öµQ;WÛ¶µ\Åe`ç3¾³x&Yߎݛájæ¦aº¸:üþÌ-þ®ªcŒ?#,Ò;F‚ö¸×¼£óà*†J@*š”wdžá‚ч!=¯*‰ÞƒKÕp5eñ±Ÿ'0´ÃÕNÅ·†«ãžB.ê¤âܪ«zåØF‚ìãÃT•O÷p9Ôùb÷p•h?ÈM;05\Å8ëd•W¥ ®Jª©qV?;ÝEEúÝ£èyûVÚ ®NàÛ5è°„«8ÊèÑŠð»;>ðµfpõ캨í‘ô8kÑÕ³ßUI¼§«Ñ¯ÎÜ2\ª}Iå²¼‰ß;¾Þ®2p+ªÌë[®¢íèsg¸Êéx„Œ(ƒ¾eðutˆ†ÒêÔÌ-Lp•™ø*ãÈSÄM}YÏá¼C³RÿC‚,©•ÆÐI5 9è$™\FÐmWKs˜ô33ÇLø" '§¾¬ëæÈþðŒ°Š´C¤F…l—¾¶_•é ©÷p5Oj¸{8Ý©•:9vÂ3,¨„™o#ò™“±ãŸ‘ÙÛébu¬IÔ&¢”îYÆÝ¬8ÕÁd`4 9¤›muªð·3¡,ñ8ÆD ¢µ_ÍÚ1– @‹œ²„#˜‚¬íc>c†«…gÖpçA]4\%…†ßïW+¥Þ«Jê«—˜ ®†ÄMz‘øË \›Ò˖ŸªÐUéÀïóÍ‘,…gך¯ põë ‚»\*cZYÌXÐÃF-lÙ6¹¬ýßV3Öû¦ájæÖ6÷—ÑšÃÕ$Vº%faÉc¾ÔKùk‰†«#$ô.ÙwÎpõ ‚Æ´çêÝ58ÉÞ‰4ßIC}yêYâsç”ÆîǵµyWk*J¢vž˜áj¿¾®?±¡:²zÒ‚OÜí tj©+ºpç‘Ãî+<µ‚ z WO¯ ù(«Càê™5ÄÑ 3Þ4Ÿm77±x+»sÃE!ÝÁÕÑÂM¸…«×çœm†«L{";«£–²Ú rŸ…œ¶ª»¬JWpµ([*1lóøG|‚„g¬Yþôª·puÖ;¡½“º´#3$qÎûú’T:½Š VžrÆÁz”FïÍÜ0˜u7ùE3\­¯­Žý(sL*.þ¼íájçKÂúݨÉÓÞ²… ¸Y冲0M^69g}pS‹¯sWkK²™„.Ö‘¼:ÿ´W%/MÇ ä¶BB. ë1>ÞÙ¸ÊÒpåÄÏ®¦­îÚçÚI‡’ƒîUbf“– /puUK¸Ê<”3,ªJ—%\å·röL–ÂÜ«z\]Ý «bv(•Y‘)Ë:¹ƒ«ß ŠŸñݸ*_·wªÀÕí-…«R|méWÆáz,g„ï zÀÕò”_Ý"¸Êˆ„¼9bÈí,sWŸÉX?yŒÙÑ“Óã4fI¦®ì†0ˆ’ôMpž8÷C}@8\6÷F覯ñÑp•Î, ÙÀº†«Sy:üHÞaÉxVžtRwŽ[&¹:{ÅÅy¢Œ CPVXZ&*$/ú;?ÁçJ:}«Mîš|ÞúWœájÒ·_¼xÇ W™3<¯ÔŸ2ÃÕª8BÈ•åtWã&w  ÃÔc( ¸Š@¢W ÌìÂSXÖ÷ñ²1”jªa[uéFFŠèCÁÕ™éëû§¸Zàj¥ ¸*/z.p†«XúM—‡³ÿ¤,(ùͺ_®óöh¸jÎݪӷÒçò:€ˆ¸ª”ÐLàjNœ\Í?¾XÁÕ( WùŒ> Ö÷Ù˜äÂ7MãúºúÚ*¯ážMO*îAŸ>Ðp•eð½$‘à&?7á˜^8È'Ù(òÿ#\-*HKŠ5¯,"áÈÐMpuÌc¬ô6‡¹„ ¸ºk"«À®G ½Kâ+YåªÑéëZš²VÃÕ‹‡o=ß~Úí<\mÛÖ6pÕfË?ºÐ5\­.‹?ìW· 7Š#»«x(ÍXPtxdÉž*pµ\ÃUì•d)T/‘±?9û¦%|cwÁ)‹ÿ´ÆæøÆW—|‰ÿ íõk«©A!=¯Š>½¯ºÚ1è¸:öIâ\® pµÇ•.ájQ:ß.yAߊïsW#üîæ3îàê¶Q1c-8¹ŒëÐ?JŒ]`‡«ƒÚaxõuäÄÐÒ¯®nÈÜ8ÄWKsòÌÇuž \•¬ [GÒ9Z´›àêp#ûƒ"§QßÂÇÌpµàøœ`Újœµèê¹p'9»ÆëÑdzðtµ%Y®Æ¾šrlms¸úT„ïí±_ÈÝhÀUé*âÖp•™ã®®àé䥤 ®2Ü|)¿Åj•ÍÛêX7¾/uY' ~\mÞ ®vN_ÓGÕ™júlTìä¿4ÁU©¢øˆ×`VWãÔH]Ú‘Õš8ç=3\U©×_Ø×#&%qö»É ÿ;ñùfpµª4zô#<‘d§_ðIÛÃÕN¡FþwÂÕâˆíòκÓÅÂÜæüWLÀ㮲~#†Þ)‰Pú^¶qóª:t[ì„g±´i+ºº¹\e„öþ ¢Ž©ŽîÅ÷áÍÛ®l—º¼KÒÜÌ…0_XpuÚ_ñPxa‡D÷Wp‚«=®`˜€§G¸š²ø‹äù‚¹Íá*²6&øX àꪞáÏ=¸‡«¨)Æ7íÍZ°©”þô$†º9\í+õEä \E6ËÙ®ïqM«»&²ô0€® üVpõcV+jHÇ€«Ì.‘G€‹A¡ÅNzQášìá¬a—«žo„«5ÁÕ%_… ¾=¬ßá¦7€®²N¥ž`[ÁÕ©¯°q͸ÔVÃU,­{ñS–x'‚‘/Ù¤Oúà\J¢÷àó-"êä¡è«'³šÃÕKY »\-ÉB$äîk‚«ü"ÓCüú¤9 Âé7F–A7ÃÕÈa÷0Ž®¢-ñw„'ăŒT3¸zd>wKÀh†«,v,$Ãä*¶5Mà„Pef¸7“ÿ(“¤¾–Ëæ[hÀUþŠË£7èX_¥qîRUã ³wŽcºþÿW Ãw&,ëfÖ îàjQº¤ÝÛ:BW¯ÎÞ>†9æW —XÑâÓ[²ZsvO r+vÆùŸ¼«ß;ý7 ªæ#·Ÿo?íÆ(;}Kÿ;WÖ"¸*o£*ŠÂ.ã‰C·„«ØÚ’È\EòaL¼€« êkjK³å ã”—ð¿Q#Úc|27#t¸zj9?',Òûƒk‹›bOŸž8÷|®Ê®)/a©ÜÃÕ¢à Ñ£åf’~æ%\ÅOuvWkQn¢ó;^hYúVàêöÑ„{¸ÚÔ]Þøñ¨ò!½®–¤åŠí\]ò…H»¼„¬-þôv[ÃÕèaAàꎱ’»iýã fTÅçß¡0ÝÀU|7Õ'©-àꤓ/w€«áƒÚqµœ½StÍS)±š½c’É®¦,ýÙÆÈÊqì±OEøÞ‰”B´TfF0Ê:ŽFÌèÚšžàêa;\ ÝLÇmgí0à*=Ìœ!/<»VpD÷_†õ¿‰È× uÌ=0ƒˆ/ÿøâ,C·~Ó%\Ý?gçédójÀÕ…©ˆ(âtœ\eº¶#Ló®&/øT'Y¥Ó¤fzz(£¦á*S WEfY}“JsCïdì˜ü9yñˆR«ƒÚº.®jÀUŒCÊ·ÿ¬í^mðêͦà* V—ëuWég©õI„˜*;ºÇ<&Å_Æý9cà k¸ZQ”¾ixèÀ?Bp)%p5á(¿hWÕéiÉŽõÝ °¾×3¾|ëQø€ ¸š³g #nÆÎp•¯“1oy¢“—|P÷È…ÚºÙ*3#Õ댮fG39]ÁU,°‘M¶ÇOî ¶µßˆ/î~¹t£)cF àj}]iô^®†ö¹V» Ù3ëíŒï›oCÃUV–°ºi¸ÊÒÈÙ=‘¥WçvÈáêüO˜{éëúã¶¢Ç<*g ;^(üO.c®…nÎÝÈœ7öÞX6®b{UéI©$BÌNø–º´£+¸šwbY¸ÿC1ãŸ1ÃU N¢u:¶0h]²z³É¹ƒ«£ÑoZÿ'ˆ R±s<÷#9”SÀ”Æìc¾ÅLxÆ®J… FZ•whÖÕø+¦5iÁ§<¸ƒòÉÚ:R¶Ù¯ë×W/Æe{W#ýÀ­0Žø©¯ðÕ®r'<²l2ïö ÜhÓn@›MÒ'Žh/lÄ\Þ+;ÓÚ®2¾ƒoe†uý¹—p}ˆÌØ0Äù¼oŽpuâó®à*š)¢8ý 3Þˆù`ܤЇt©†«˜ÆIº4ÒïnÔ^Þ2E¹iò4ÂÕãÖµTŠTZþs‡«| SKàêÛuÞû6‚«×¢!Ãü.eÉ—˜2ó«¯àjà«É ?Å>˜÷Û­<å4ƒîE4ê´<îà긧,³ú44Ô3Q“æ~¨å«Í;¸ŠŸe ñ˜îáªlü[ÖQ2m[¸JÌ" iWõ,<½ÒcÆ$Ý*3Âô[9sz )4¶è³Ÿ«ípuUO,‰œí*ÊÀdå"J*4½!57Uqà‘²ÄcêPÞH­1Xõ»!làïuÎWp5nò_¢ü¨VÉ9½ìZ©z!ëê– Ž-ŽP`pdEÁ߉]ð÷Pß»å¨B¿Œi¸Ê‰õpê²Î µ2:çWåìÀÔ—äÄŒ|À€«ÌOÕåÒ<ÂUÉf¯Ô»ú€†«h$Ö]Ü”øô˜|h¨ÇJDÈ ýv„$„<õ™»ÌpUÞw¬èÊì’L5ª|†Ñ¤ä„:²ç W%x™ñ!0ƒ(%KÆOtà W彿ÏÕ’-0xCtÀcúh•Dâ5Çû‡t¿‚ÐUK‘øéo˜é¢ó”&ÚRpu“ÀÕá÷Ó¸HB¡aëûët©‘^U7)»Üý ©…¤þªrt„Ìn"Â:1ÀÍf†«é!Øj/àêeñS_ÆeÐ*”ecDðqXómh¸9ô.bCã‡\ÍÞ51|Ð-î‡Ì®ò\)òÚŸiÆŠ3Î¥æ_Â'“|Ê`¦¹O­i‚«yjVN˜õŽ”ª\ôQƒ¥)Ë;¶$|x{½Å]Sšƒû( ^ïŒF1û²±SE",«ÖÂÕâ¼#ó HñžD Q#Úã/ˆ+¹yâDä >È®" $(¬c£¯¡dª R5·t¨gŠýˆÎ)pµÓE¾·{\DW‡ß‡¡`½ÓçÜ kçU‘Œ£AÕè=KüÙȰÍÒ×ø°RÔ9+¸ºÑ—ˆ¬ájðw|£~G"ÑŸG¸jãÙåøÒúΉ÷kËr Ϭª•­ĉ\e2¸ÚA*EKûHÍJ =p»(Ìôuýð†Z’Éi‚Æl‡ô¶LÔoÅMy9åÛ¯ÜÜ@mY¾Î6£Ý[ôŒ:Æ3îéâ°­úÐ#\-HQpõ6«²oy¥¸Ê‡%AG¸Úû© ês5ZQàj¦\ xª xòÍfJcëç¼'p5Õ ®&à_Ñ™ ®fònà*ýoÙEõ5•xÅâNÚo̸šLGq{ na‹ÀÕ¥_·®ö¸:ô®ÌÍÃ]}†‘’=§V°èl^% ÂÁIš/µIÕhX©g×ç·b~þ>eÉ—†è¶¡}¯ËÝ7½4f¿ÀÕÓ«,m)Ö ƒV–p¬œ‹x]éRjºÍy/qö»A].u W§¼D´U‰ j~ñÚÒl.Âä·|üc‹’æ}äªÒ}Þa` 3ßfzžY“º¬cœ†Ý?ã-3\Uï¬Ûi¸Šѧ<ÃÕøÃ,gnÛùŸ²wŒÃ/ãdéF”XX¿ñÂRfqàïÕ>Ÿ$cv¹‡«•á%‘;«\Ÿ‘G~r}fæ—‰ªàêQ«'¾å¡Ml‘+¸šº¼+:–_dÕ;X•šâ \£o¼•3ÃU¾T™ˆáè)/Øí2#ÏIÔ¨‡%|s¸ZžxÂ#\-O:©§Èæ^OBK{yoJ^"Wp¬Œš’,‰ýî&â‹ð †gŒÿgVÖÉ#\Í?¾˜ÉOdÇ2/:»ŽëüÛ_ú{j6[}U‰ì sz=«"Š4ÏdÄ: Á†,oã£fV7ÂÕÉ®Ò{È웲éR,6#Î|F7:d%rÓ0 8â¶…«×Ýu¾ý´Ûy¸Ú¶­Ep• ”Äaï%K'‚a×Çîªr߉’ž]ƒwÀìxY%p5{G€a+ÊSNÇŒ{ yi†«úT&A_öÎqzShÂ7Ãbà¤ø¡zÏ>KNè,ýZÃO¢-±`ãŸÑ×Ôå‡ Ï®ÍÙhÀÕøi¯IõÛ$xǬEŸÚcW×I=Ù ƒ“æ~¨-¡+äW¥‚gsh4üÞùï ®Jí† C¸ÏºŠB´SøÀ›y:IìÓïzô$ú„û±puÞWåÄIÂÀ•ÝõžLt‘¤úýhKá*7åÿ€†«H匾Ä2•a6 W75ÃÕºò|þ¬7…*¸ú›˜qWéd_¶¢[Uv¬®rYÆKr l¥!Oøà[cÆý9qßB3\¥ÃqQþí%éë䃻 \-K<Îo%ÍýÀ®òÃàn¿`Â\óXø€›ÓVvcrÊ»ÎÐM„anæöt`øZiìW=€#Cýê—ò<;}HËX¨HMà* ‡ÒóJîSÂpÓ±Gú0Ü8ž»F„ÄeÞ&Ï'š·´u.·\º«Ñ£ÿ?ýuæ Dv.-ü)bg õ:+>‹Îü6DÃÕü-å)g\‰ W³wŽ—,¦nož(Xd-RÍ¿½l¼\òñ¤I83ö)®2 èfZ’ È³õÕåt 9ŒÒp5iÁ'‘Ãï |‹ìâÛ0˜é)Pøô¶òäSλR5\Eåb$áFèfó;n ‚Ø¢–lÏ0Q€û’r½6"‚q—puÎûWË#„¨”#¬‘œ½S¹g3\Eв`£Æþ9Ì÷îæpõ9âô²¸CDÁÈ]b[3\Uà=‘™ŒqÐYpr™põ…Óv_y©±sœ6>Lc¾”–eæÊô0¦ÐW%Ws#ÈÂü"­õQÇ6opU˜Ø„g12Ù*éŠÑˆh‚ºþ‹ª'®2½™izf:aÀU,g„ï혦º²<ÁÕÒ¸ƒ ÎÔáç*‰½?>EòT úCÖÿÆÚò|!ŸDL¦jMÌvWÝL-ªå\µßCÌ~9þÐõçjE;ü]X¿ë¥”˜­AÃÕàW²â\ÁU¢Z9Í4ì^Ö¦ChÀ"ÒÉà ÇÁm'ÍÿØW_Aj¸Š5—ÝÉžç$&à r#\•#("ì§;¸Úý—ôgüÔ—±`˜J³q°lWÿÃMn.óp q®¦åœá{*W)„o#„áë\"pÕu8¦æÒìä…ŸIF š &Í¿]—zzÒšrœ5ÍQ½Øò-v€«²4þ^Š Ox¶\;DGu½,ïàLýž[Ší•½¾áöRHÊ ©€wSFÙ¡±êY ­‡«ÿú—CUsóÄ=çÛO¸µ›¼·_Dµóз´‡«Fk\ÅÖ©ã*kš›šÊô5>v«+»;8’º™§Vàð8Ž´U=ºR`´Ñ •§œA[ÂUÌ ¦ŸN,Œ0@KKêïÚʤŸH^÷qO震6S!T}Í)0q)7ÌÇ®ªí:èj©âAl’Os|[u•ãË «ÃîÅ.%ÎzÇ\-L#J%B‡ \ÒÁUDžBçÿ4ÃÕºªR´%!ªMÃÕõÄÃVÒ²ïð<\3¡+v8´”Õ×A9h¸š¾®?q®V§5Åy’óé–ÂÕ³ke¯æö1|¯:ûn.[‹1g¸Z[’•¶ÚGàjïßÅ÷¸‚%¢,<³Fˆâл„•™< .5rØ}W+Š27 !:ÃÚë ]ø\~7aÏ\g¸ªrêŽÄ¹\Ý:‚qçÿ„½Îp•¡ êr qß…À@J!)‹C6 \ ßâs5FÏ÷*}òªyë¦C+ߎ×cNœ\žº¢²V6œ]K¬MŸ0Ÿ¹ÙPtl‘TYíýÑßüg×²Ùø«s2|-«¬„«¿)puEWK¸JÁ¬#BG^–DîHœû~ˆÏ5zr?úh­Ü¿éP†«É«û ö\eÆÓpUerÈvó®";#‡Þ¥·dh`[—˜0ý ®¢Ûã§ý•ƒøº<å4œµÅ_oÖÍWç}ˆ”bù#)™ð,gÆË:‡]®"<$UןK¡S²#&[ÎîI˜FÇü]F#Ògþ0cÿ‰gGµò¯ %Ñ{R–|é W u1RhïÈ<¾Hvø\#» ×ôaf¢·Í4XB›y…½'lè=ÖpuæÛü.ß«_mØ¢¡®2+Šx„¸Iàê’/‰¾=ÂUþÕŒ#šÃÕ¥|) \í °o×ä¯ÌŸ®®émÀUš}¥+ ·ys„«ø‹qO¡i±3æ!q±ç¹¾a¹éHAÃÕð7×W—âA°æã &¸N7w» SÉ/ÆMyKe†«x®¢MÌU½ç̲å‡eï¼B8l~; p5t¾’8ÚØeÄR"ôÀ HÎŒóÚ¾¢ä]+;\~Ÿ®ìƒ%ÄN2W‰€¸Oû¹Ô¿çþ¹—ìv[ÚÑr± §ƒŒô€;O•£ŽÍáªÿÖpõð¼¿{åäfßë ÷˜º\¯QëT2OÃÕè€ÇUj ®æd àª:NpYü5Ñ¢l™Ò!}}±¨U¥( n›Îi‚«›‡ÉöK®æ'«ì+¯˜ƒ&Œ$ß.É—wI]Ö9á›·äLGßëœq±C¸êw7ˆ=”2Lãþ7¹Cö® LÂÔ¥_ç© L?tˆaí±Ã˜VB0ä 3'Âï.cW!«['DH$Îý yÁ'Î`3))©¬0›Ééñ$‚¹5ƒ«nê|IqÄvì°ó56;\5Òà››ÚüDYÂ1o»êjXzˆ)9ç®&|ó7d'Ê*Â÷N—þ´ÃÕ‰ÏGhŸ¹qˆÊÕ p•!PÈ &!½äæ®nð®U×àÔ[¸*{?Šòoo W1¤é¡,X‡ŸãtP RÊvG€«+gïÑÉ‚¼l•ÙÑqꂤ%iÜsÈTgÙXbÌI,?ÒW.$ bЦ­ìÆ­rÃòæÝBɺ®\Íçç¬<‘¼ìr Ë0mu¯¬í£µ¢(Ùµ‘ï’¤”ÀÁá(¢7meT´ù‡ùÇ£½%Ìè?ao1È–éW¿ý*aÖ;±S_)‰Úé ÿâ¡27u7õeŒXËàê [à*ÏËœÁÕï‹m_úµ®.þ6àÅÈ5„Ì`X™±®†©<édúº~ÙªH„õ=DïEÈÊÁ½ßbXä¥'’­~#^“êÝi W‡ßO,ƒ³†«…©:ð1<¾qc¼Cá1Õæ¥Ë‘r¯1ÏIÌØ§X_v¸ZQ”t¾ÀU9½å ®Æìgžse";KõÛlVœYär•ÂÜp|Ø^ĉT"–ö6î›Oô]"gôñø(vËT!FC·3 …§V*¸ºòG„«ø,úÇ9ó’ŽÖiÛ¼YPùGæ!éÍ…€uˆ„jÒ‰¿ìpu䃌Ce`Mé÷,põ9òË6•¸C­€«(æ'wèüO­ƒ«}ëî™~ðö){Ï·Ÿj{dÞñ®gJÎÃÕ6l-‚«h?¢3‡X,ù´Ýt~Kk¸ZUŠ`0àªlÈì{½3\Åð:ÃU• 1V•—4ï#\Îÿ•´à|eLÀÈÈJ¥.*3ÃQ,Ñ£Ñ׌ý(ºÚ€«ˆ´5½ñøÄ‘~÷7É9ôc[ª«í•®òá™okK¨}¨soT¦âÇ%ÝèðûÝÂU[]uihßß"uøR®òPhœ­9\Í;2?jÄé1]Ô8vÒóº–MYo<ž—NæjÈ ;\-J'‰ð\ëà*ýCØ¥á*á‰~ІúB 3\­¸*§Ò„^Ž|¹H¼i‡«û¦éœ™ü.Ž5zÌ£ˆç¬í²ùsm_¢3†O¤?†‹OØ5³9\½ÅBœNTËS0—ÄGî$îPiá*!Ž*<µ?EÀÎЇnjh¨Ãg!± És¥Ô¬¸º‰¹Ç¼eS—wE2Ÿ¥¸ÕÄçëÊ ô–$f&óhKðлg½kð‡úêRf sU;>¼aöî‰-‚«uˆagý`¯ P_SSœ){P­àj¤ÿ„Bv¸±ƒø(¨ëÏ%íRC½œó]ô¹LËÉ)VÇÛí—Up5~Áç “«Ìx|5}Hç×–¸Ì~`¿‡ßÈ9¯‰Ï#¥dù¯è¦ƒ,–¹ŒQ#\Õ§„ä`ò¬·ËœÚw15^GÃUU¥ýp˜™¦ájúúþ„o(4çJÃUY*Êu¹´@n6þ5}M}¼(mUOË P´>sÓ°’(‹tR,=«ƒ®(‰Þ“¼ðÜEÇòPX$Ö&6M”sŸßÒÛÌ%Wß ®FîdŒÂ†Þæÿ SZo<3à*r—õB&ûLL{Šd7@¸œßèk†«º,wb‘Üt¸ñg¸Z™Ft‰¡Ó`ÂÑÿ®±ÉÔlmžN@qã‚ú÷ÃÕŒ ƒ‘µæ1ˆ²1~_ vkøCƒ;àVF\«4>ï WY³W§¾Ì Ë˜6îSpus5zÔÃÌ[æ “µ_½O2¹­èfÞLÞP_Wxv Ë¥m° þÌzç븬Þ*)Ä̰€‡oÃVË«½Žj¸Š5c>‡þƒ>ŒfÀU, †7eñ–U–¼ä –<žKËÌÇÖ©„xžàêÁÙCïNšû®æ%¨Ó+c_ߘá*7æŠU¢¢F´w WË 0MM»Å:^Üã <+¨èìZ}þ.cý@ ‘¼ºZÕCù²— {È”í—s’…&¹:Ç?Ýltj+ùŒªÌÒIR¶ÎyOÊÓ÷ü•7p5|”ÌÖp•?ÄNx–®À÷!fr÷j¸Zxj¹‘…€(Lv®ö½>Ê¿=ŸgŽç©kŠ3ôOt“M^¼:±ñ¤¤¤Â„Sú0H³éQS‰¿&ê·,æ‚}ÐJLÃUA;Çaˆ\eI2à*¤óÛò”ÓÜ'¡¢pµZRÁÌz·:/»=úO®à*~GŒÿ€›™ÃtwHçàqXÔ1cŸ,K8;éE(Ôçj923öÉ”o¿’^šÿ‘›°ÃUß;ð°–8w¸š²´£”2Ù6J'³ÒpU«}Ë<®Çy"Uç'b²4uás/Ô”d3‘ήNxNÒrŽ|HËéÎËŽà»uö$)›¾¶¯5\Ùª¡ÏñSÅá[1/¹fò¤:U)óÃø˜ýÆRÏ¢‘mWsç~Àðű€«õu%Q»#LU–*3Â0ª¤ãÝ «¸Ê´dº*ÑeÙª²câ§¿®S[ëwý®¦(+Êä”wÊs?Ä€œ\VW)p•Ù^‘”0ã-L s˜á“œ!¦]ÄXþˆ!·3:òFfû퉤 ƒl¬ýTöÈMzØÁÝfoÐÕˆJc`öésÜ·T³×®r̓;Ÿ,8¹kÏ âV]%ʸ:ä6&ñHÁ©åê Àë±S_cî{‡:@ÝW%·É„ç ¸ÊÜÀva~ùŸ¤9”%µ„«¸†ü£ X\-I†ûN9èÔW1˜SckweV¶ËÍÈrÛIó?fXz›Wu‚‘WÒ|—ìê±5 0±l8ýà®—eoÓW‹2x^µCæ®/›0‡ßÒë×Üy³E]B×5ƒ«Ù1L`í⧽ΠÇtW óÏÁ}ãîY‰Öp5#\—`щ˞ñ&÷殜Zs7Š{º]w¹Ì½äŸðE:ÿ›|Ñȇ˜xuJèÒyŸOU ÂÙi¸ŠÀpŸþ‡kØdÂpg3ë®ÖU3 ±ž1« WÑ´ú0Nc¾ÜöD®²¾¤ð¢\åj*Áµš —ȹ<¯á*þ ób™>ºupõ‹ƒY¯®‹¼7pßùöSmïlKørÚy¸Ú†­Ep5ÿØ"Â{qáÆÆ’ljk¸*9²9É¡àƒ³ ¸*ÅYú݈00ŽB \ÿ´ÃüÞ†pEÉ7ÁÕÆ†x@1"å_Ò áêÎq8®ªýWï}èÏëí:¸‘ÀÕícÒ×÷Oš÷¡$as W ϬÁ¦¯ñAÞhK(G’­¢êWO|+‘r—K\ÂU› ¨¨H•Çb£ÂOœoöÎñÉ‹>·5‡«…gVÇŒû3—Ò8éÂ%¤E겎6—Ih0÷«+»*¶ \Ýâ_[–+RYÅ2zÇ££”ó•pµ×¯%e_·_  áj †«²)qëH|Dæf¿Ì-þ¨V.ªRb^W¥0Ùöi\ÅyñCbFw`‡«‡¢pÇDCÎpUÛ½”ÞË?¾8J%uO^ø™†«eñGzÆN;,pU—ÄB~0·¹!“u5Œc„ïíµeyR¢eì“É‹¿`àé^ºKR€6Nrz†›×¯YQ’|;ÚÀ®ÚDÊ:Å•zk"PWÑL?ÈÕ’Nàv™Õ„ÏLr"÷âÖpu᧸àâ°­zÇ4®«Ñp•8‹(F£‚«qóÿÎòq•\Q²Xôþ ï®æì™,%˜Ç?Ã%âczègDËqKpùp9*GŽ×Ñp½1äVÙ€4úQ¦ÀÕ~7`R‚º\Êà:gâþ36 –”€½~²Í=8³ióƒ­%L|Á™ÅáÛo^ç/µ<凒’F¼Úª’è=X›ÌMC>ÃÀé‡b~2ståV)±·¼³¤¿hWÑKñÓßrgø¨G™Ò•éajÕ—2»Xì‚^ç¼Ï}:ÃÕŠôЈÁ·fm‰ÍL^ü9fAàêÄèXËb:Ùab:¾g†«ºü:wÎÄfÙÚÍo<=ï{Ç¹Ôøöظò¤“æ}¹˜)–›z­ßÅx–©Aÿ눥ÁÌ×h«{0ÃUB‚)ÂFÆšfþ~*´×¯™ÛÜ–!´÷µ±ŸW)IïÔpU˘ŠL \ýö+Ì…3\Åzgmaøb7†€E9ìžž²ãš­+Ï/Þצ.ël®“ÂèãYÂEg×AŸ®~ûËS¶äõ¸Brw¸‚«U¥øSÙ$©à*ŠGÆÏâ±faý®×çRsT5Ø ÏâÅŽªrbÜõá‚O±tASúšÞt…¼,sWm ¸§ÈL]ÑMʘ[™ÉselðÅsUåÆa9 °‰}ÀW®žm¬¿fyL˜¿»08–û‹œ½SíXUJY] ‰¾e[WGlµ®â…U‚» $[ucÅ?ÉkâFŠ(p5ðU¼¼ùN[Õ³\e8º^æ1Ä,ÈöÑ ÖpuôŸ0Ržrý@,‰¾mÙÐrl¡ñh’òhMo]p'zÌ£Îp1ÀrNœý®zñj_JÈ$ƈ®HLLÈ ßÃã;¤Îc²å]0ý KZÅõŽ ¬lšêù+îv•X^ÁÕbæs̙ϳ˜ó¥Q{¼«*ÔÛÕy’»;jÔîà*]'o(üîá>‰%±tŽ.Ö†QÅÊž¦ëk‡õ¿)rؽrDee}8ÚÍ ØáªÏÉ–ê–*窸*‚*?)?3É®.þ‚þÌÚ6ŠÉ |kö®‰²ÝZï[îr)ÉùÔU^‚Nõ#p5àqô§Ã˜ ’µ×Õ*oÒå)‹ÿÑ ¸Ê£±X\ÁUfÖCõ龜¡õpWC|®¦Ï…©V•Hå]ôÞi¦GüŒ7â›J·\íã\ü¢G¸š0ëðAˆ r Wépí¤¯öÁÿ²:ðæ±žqƒà¯Hbçƒón‹-*f¾­r³(¸ºðïh39KÞí‘Ãî“­Ôê䵆«ª8{Dü4…@c÷s·Lió¹lÌ—«Øƒ²s{€Î#DÇâP; Fo$:ÀM°”ôÉ»&¸:í¯ÜLqÄ6‡¬º—}t“\=½Rr¤¬è¦+ž+¸zÒ\•2Ž—âa­SÚjK²ø:B¤¸)/©ûU#puûD‚­9\-ß7õ¥‚SËñPøV|1f°®j¸'Yñ®Ahëà*Ýžw`&¿b‡«y‰èL"ed›MÁU‚Ç^¿–=’ÈÑÖ Ç£¶IYò…Q¡Õ=\-<».:àq«G0Á䌕­¡FR^ÃSÓíwÈQýªšøµÀÓw˜{CnÕ¹鯬­£˜–Îpµ¦0ˆÌy«a}M9 $|È­Åg™H²iV%ð,ß®áª{WÙJiH8V„“^P™">* Z/x¤óÅèÀúÚJ>)šsèÝê$lSj8 Wcç|˜µu„¹(¹é,RÃÝ\ÍÞ9>Òÿ•™áFbp$‡}L S“|ÒW.ˆPy¯h­¢ u*nÓ h¸ÊH1ˆA"õaÛå]ŽD’ßãìç÷¶zk“(Þ.—JeðÝ­ejööàwyL¬DQˆEB~V"¿n©ô4\Õ…~<ÂUL"1o\]Ö‰%>àfsðÂ(ÇM}9dÐmá£ÃZj‚ʪgvÅŒ{Š%OÄÊ4s‚«5,R¾…~Æp%-ø˜žÄPÈ¡æ5½-«>1Õ¾÷ÆOÌpUóyÖˆ@8e7°åɧèy«Ná|6©O·sœQ%J5[yâñð7ËQôÆL³,%ºA«{>uEWïß×{lf¸J¨.hkÔÃ̇äT¬)¬GÎîI.úœ É0aR˜–®2"ë–»FÊ’ÖU9ÃU¾‚`Agƶ)Ú‰Kb‘F ¾…%Æ*À¥Ö–d³f¥ˆù·_™ã®ð‘—\Íq¬ê$\Ý é={ \eb ”°`a}¯×•Öù¿TÓ¨. x‚“3rø},g®Ò ¹ö¿ò–MàjÔ ´ñþÌ@¾š[Âù&Î~Wמc†äœiX3î$ã»XÈðí¢G?â WÕ–³•p•;DŸ”'ŸNˆÉ ßÛÕíÓ¼zä°{,—Xá™U¡½¯Õ%‡î{^¥*ætÀíZy°ÙjKsñ’x+>¯K5!dÏRËàj/®«LL6&vÌØ'äÈ¿{´ŸT!_Þ =汪¼܆«²¿zÔêŠY_n‹»¹ WÃßÊ“Z~€gA¯;Â3·Ò¸Cèä̰ý–p«b‡«9±Œ,^%PWYdl·–ÔÇN¯>Ån/þÂ\Ý:’+ËÛçN3±ã§½¦7.Ú £·ðïîàê® ø#&$N¤4z¯ÅsÉéòOèaÙv›—À2A fll W{þJÞ^mÌÂÁë7P6µY7¹v'ˆk@.z†«©ARQÈ÷̬4z%uÁœbdµs Wo1æ|Ôȇ$ÓìÔW°êLo7‡ÇóÏEãKÏ›V•ǪÄ#äìœ@G1pò6vÞ'/üTRhö¸’~ænéRI-U]Ú÷z„"¿%UJ§¼T¹Ë®¦¯ï6ð÷˜_3\%B¡'uº0ujOà*ËŸÇÑ¡ ®N+! šYÁ©ÜX³TWÛó-‘’÷ìV™«½Ü¹fð¥"ê¢÷ÿ6iî’zò_pˆ¬Jãõ÷†ß¸:õÃç*¸ºUSW`aZoá*òX%èα–±~’§bçxJ}U kÓŠ3^{„«¬ÖøorWæÅbnÅa[â&¿ˆYæÊ¡ý®‘ÍáŸKY[›­DésŒsp×ËXÆ~`G¸²QíH¹Ì!õ+A:ØÏðtX{B<½ßž%Ì/ÒWÉ 0ðfºBW¢Ä%©Ê×`$áê/Á9ÀÕƒ³RWtÃÍIú߉ÏëÚ²iaY'¦¹V¦e+8¹_Ù ¹»h„Kj'ÌÇR_`ý€°þ7I&¿{Ê3Ób'½ÈˆˆIÜ<Œ'rsÉM7ö)„¢N'á{çªKÝ4&6ŠfDÐ'ŒfiŒ˜DFJN«­éíf“‚´†«HÍ€ÇuIk Wé.‹Ô!¬ÓpU¥xÊW%a‘Ác‰V¼/ìE²íæÖ:¸J 8•áRþÞÖøg|lÖ¡óí§Ñž[|êÃI½‚Ëf‡fŸ;Y=WÍ­EpÓ‘ðÍ6áãð¸bvçÙDÝw¼ç…ÖoU̇#*RÎà&Ôem%Q»ˆ ,àjA2± jDÞÍ)¸š¹ÉÁœ8÷ƒòäSÅá[f¼…iÂÉjÍ>à&Ô Ò‚ÈSÃ0øê8ä-®¢·£­­®t<Â÷âpxsmÖ$å]³:#õü•ÿ£jðªŒRG¾Ûå±ãŸ6òó7}¸®¦:?±:7.Âï.´(~ª ®¦ ãFmÍáªJÀø·Â3«é¢Ì-þX`©Ô©²„i¸JÈP•vB é×è\ Ùƒÿj\U›;ã¬áj‚Ä2#*U5”5\ •å=uö¹š¢ ò •éÿ2CíN¼Ï‹ß!Ao –ù3® $Àû ðøŒJ×_¨S³¢Cb7ŒÉÊL3F6LmŒ‘Ý’} ¸ŠžDháÂø ]j}ª°žg"Iöø]òŽÌ“³6>W'ÎzWïÏl°Õ£.¤Î‘Bá*î[e×ï†r–-…* fÆF ¾µ<é*‘ÐUÃUÙ 1öɨÒí†&¡¯˜®’°²„ùI“BÃNéÚP¶¸éâPÇ„ù„·R˜~ÀMüÁüsIäëwWp_ª7ò}4\-8µ\ŽP­/<»¦º05g×DÙÈ1á¹”¥_Ë~rdÌcÄ’ô²²äŸ8úŒuýÍl4\ùæ]4Cµ‹ê¨®2! ÖÜO!-b€¥Äp Û26Ñ?—‚§‹>3àjÞ¡YÄD2Ó^#ì"|0×Ä´i¸ê{;ÚNæèm, ÏÅ”9ÖåÒ“˭áêÿcï= ¬,¯¶5ÆhŒÆØ5ö{7ÄÞÞ£1¢Ñ؉:R¤ÃÐ; ½Ã MzG@p&M2ÃôÞÓ˜J`Î÷­ÿïºïsžyæœ3}]ÿoáz– †3ϹË.×¾î}ï½´³ ÿ‰ #ꛯ=¤ÄXý!!AkF¡¹ÈvE0¤ç%WMòXeb#äj~¬—1žÜ\èº×Í„~@†­Æ /o@®îûBÈ6ôº¸ÁÍ«ïkŠ\Uk°,¢.ruê›EÇŒy5A®bAÚÎO«1«XF,’* øš^!çØ:‡\%ÔÅJ7ÑXä‡=ÕiÛ‰­vìõ‘«s>r²˾›‹I'pV†Ý ®±W¬¹J €SmºEmÝKþ¨²…W÷?°{¡¹î}‹ƒ@& ~À’«D:M! Ãš±ø"WËóƒ’«šÔwsר®W:!9Å›'…)ugÄã˜Jwá«îÚ¤qö#iÉÕÚòÜ“$WUaq{dAB>í!¦!W‡³Èˆ"ú+YÃï"ÉicŸÇ¦áÊM[‡ÓÃ_=\”¬ÚwJ ó'W¹¢ã2f¼¯ ‹Ú‰\Íf^ááâ4¼[î’ÎUA<þ“ˆõ@ZKõ’«ó>9¹Úò—†4>ïÀ"óíû×Ų1ÔüÝË#—²M&’m@®ªž¹©îý®â4ÖPVÚÅôÚ:¨ØgvÍM®jƒn‡GE>‘«]® fDNÔ pÀÝ–\elé^Â{ÚdÑ¢ £k†JªyÖÀûLÛÇ»«r°æZñüôðænr¹Jteâúôä¸âè5øA@Eñ¨)c_b:]3¸ÈÕ³úÞGÈ]ÔäÆ0‚ßë4‡’L ùô+€©d}y]øžä*+Œ—úuÈ3ÆÐºf`cËžõÿçArUéÁÃð Qè;âÚÄ0ØYì¿ÈÕu“«#ŸLõ´ßzºlb–óí¢“"W»]ƒÝuØ¢‘¦zy}€ÓèÔáâT~ñÄäjÛó…]CNϘòƒt'§ÕdïŸß8¹Z´qŒ9÷$(·*È‘«¢g(\=€ñäÌ ±m©ƒ’«¶{¬®-ª(XÙch[d"Ïj«4ò©ŠØ5ì2öG4Q§KÙJÀ¼Ä>Øî&˜|*¾A°1¹yЪ°G+ Í)mcäêQ0ªZúJV[Ý`ûÝÁ°í)¦In$¹1ès¸$Çeð‹ }o·-V18ì#æ ³¬ž¤ã_À±b*ÇÔùr,¶ª*™»ó˜,F Jo@®.ëÓå >O¼°m˜;K»‡¡úÉ/D®Î|¿hýH['„°”ÂÊðf¾7äO®~7—¸£Áô=ܦÉ}ŠÖmŽ1A§‰±Bä€åX†Ò³%x#ŸñêZÖÀût#À’«K;Lj\mΔó–wµ¿ë%WG<‰½!-îžž/¹z/t~š$ z°3¹:¿¥jsí^Àô±®Ù³E®™œÛÙ'&W“71¤«¦¡•ÎqÞ@­öµ¼çåÄtú×¶çá\œ “$WÙ^ËÇO§ÞÍ“_‘kî|9;X²}ºÒ$úÞÆž&{”mµŽ›Ñ²æl M{Kø¾Öç˜ê"ÙÙÙ¹J`¨Œñªb/¹ÚæÜ²= b»ÖµÅ}ÛþM<¥;gLˆGN,êE)Jó˜úfUÊ–Ü…m-ÏÜuðøQ5m\?’=¹Úd{,{[Aäê᪲³Fr³`«X •ñ¬˜½úÁ ëºÊüÖ~ °Á Ì}øÈ"ÞfÎxGií¼¹ë˜œˆ)šqMâ‹Ôérøc–|V5øÝ ~¹Š¢)7&غ ¹úùï묊¶vŒ9šX{êùãi]ýñ–ü½ûkÛôïûß)rÕy¾¹ŠéH÷¼_á‚J|†–=÷ã`äê… !g¤O|Yü¿ì—8à^7C+¬5úYsù«QrÜNn4UejEw¬ì›¹š¹ f»l¨üõÁØyýµÏîõ¾5{¶ºxˆ\r“ÈÕÒL>œ¸yá‘Cþ¡™!W KýŒ5kUIÝ8~ÃJäí‘Kˆ.‰”Õ˜&ìÕVê°;ó;Â`¤›\=RšÁXOCr•oW%m8”žBЭ·­S¡n}N}??ÚË­9äª.~ÑM>È’«QËùÞ².¶?rѺ6Ä Tgb:_|ÒmÓ¾J_IŸôwwÄG¨bëŹ:_8m~KeÏjaëì±)£Ÿ-úB=ÜÜkóú”Ø0ê™ÄA÷éæ‹¯^¨îtt½Šècq˜8z3Éý-ì& +@۰Ε®üÏ|Ÿ°"¹Úë¦ÈO~¡vóBÜäjÁêþ k%{¬ÉW³‰™ÓßÑͬ~w²† é"Z]¢¤ßɯfÜ1 C®æ¯èÑXçK®æ-étBT^å« dÔDµÇõh™w^åyÙs>vÈÕâ͉ÊMÕÇX Æã.Ûî1䪢¡ašÄ¿_ó*¦œ5ë¢{ÕõmuòÈ¢8ä*Æl œpØ[«„oÉøìB2Á¢`["hö‘%WYR^hï ’«˜/c<áE쌉ô¯Íoޱæ, SöÄÈÉvj_èµña~Orõ[7¹šÿ… „fÍ|¯)rU‰ÓM‘«µ*ÝiôN$c§ózÝl1!bÃÊ|¯Þ7'ó ƒCPrSæzõäê¡ Â´”áŸ$¤$XÆ@9e*ƒ>AÈÕ~w(GzAk÷Ç’Ãþˆ*!:ë1^€è’¿&}Ä’«DˆnvÂE®&(€j}™E¹:³!¹z¨œµE‘.œôp¹ó%3Eæk²vcö--–í^Óá¢ý_wâDõ-úìõ¬YÿÆTJò?ýÍáâÔ@>Óûu ÉUØ=«ˆ²g¼‹y´Ù¡"W¿&ruÀ=Q-ÏÄ5]‡ ë‡=T½Ä”Íȹ)>Ù Ot(?–ßE œÁÔ=|¤8Ab+ ×Θõ¡C®Ödí‰îp¡ „îO毬­c r•©aóýRúçäjU¡œˆÁÖg£›Q­~U™¸ž³ÑH—ò£V÷gsËvÍ7å›û‘« ç Íc›g™Ò îâ-¦¥òÕ1à˜èL_•<ŒRÐí8^{ˆ1£³˜…èö 3¶ô /!ICb7‘ô±Ï®`ÉUµƒôY3Œ€9v|Â7¹Ê’&ö¿ xP´~4ûÒ\Í—7O\Ÿº+"÷«a*^º{AƒUª)e•ÆZûá~*¶*¯ÈÕ~w B9 Z‰“ï~]ðÔ#¹*ah(B ‚}Ÿž«üâÉ’«¯ØÓÞFÈUÏñ£‡ (ޏÛ¥<®QO' ºß43ºËK®N~%ÊÜÅ6]ÞÑ$še8ËÕØáÞŠµ5‡Î׉* ö ¢¨$ kÃYîg}bruõ€Ãû“êÉÕš2ÇP$œ¦`‡‹’q ˆ ;Ëd¿¹:ò)[5Ë>˜ä¿Iru,h¸Õ(¹š´Ñæ¾jðE)¨ ÒDôË8µä*ŽÛ”]í€Ý´`om®)ftÀoà?IÚ¬|ßèÎ¥¨€&0 ùv¦)ÉDäêÑêRä÷ÍOa²²2üÉÕê¹úë’mSãzÜÈk-¹Š‡]¸[ÁºŸ’mÓ0ÕÚu?Âa¶­Ts1´ˆ!LAê|ü(£EÁÄ™M$ÁF¼ÉdmÀhâ Ÿ\Ÿ!®‚:IE®*\2æ%Wç}âΜGõÄáG„!¨@2ççºBRÇü~ß&¯´‚uF0ä¡Ê„u±]¯Œ4}¢ñ’› bâëÉÕÝ ¿¹º¤ƒ®B r0ýß« ’JZl.h]Ó%þðÏÎ žzþû‡}lUÝâ›ü͹Mð¥§EžÖØsŠ\mâù^ä*¾#eäÓ~¹1‰À‘«mÏ3äªhhÌ_ÙKäêäæB³4ö{’? LÛé’K®ªÃKKÞàÔÓÆ)«B¢¶^rµ4‡bÓ¥â{ÞØ€\]=@„ØÌ÷ê¶ 5î˜ØSͦüÃ|f¦|å·3¦µ;?ºÃÅÙó[Ùa˜¢C¿ÇéïksnÞâöÉÃÁŬê<àýñÅJhìq=žÚK®®J›øþH7=7Ž%Äæóx.bggj¬¤­Ük{d7уD§t—¹#BY³>° {ÖŒwÀà^ ˆ”˜ŽÒ/¨ãðŒwk²½ÈªdódµhÙ>™*ƒôóZT®­! s"uüÐ+8RšE@Tûõâ«ùFQ]®+fÍ|ÏM®æÌWmÛ¢u#qýæ¿ å5¸;¦ö’«›#{WdëO’\U[mÝW½Õ²WùNó–yK:²/nrUèÄ—öM’íCå®lR´PÕ…w8˜{4ïdÏþéƒÒŸÅ[¦4E®Êò|ÄŸ8añ8'mâßXù²Aªö5E®.ï¦næ›'©LGìjd¸ rUݎ›‹ôèy#A0„\ݽPU»^?L™Æ6aÀ«÷&‡5ó’«^¹êÊ%°ÝB=à 4D´pu¢ ^¢òLEášj<á2Ñ"W×õ’«¦'?!†u®za?Q:6Èæä°0ñRçÊãaÄÐzêT¹‚Ö5<›Ó0tõ’«¬˜Ô°S¦ÎØz¶²dëí${ÅV§nae Žì”\e%ñ îaÏYsÓ[ù¥8sFÃ’‚W•FkÈUD´ÆÕŽ­ž\-LÔ.·>[JXå1­ÐêÉU´²dËä˜.—#±q¡Wg„¿jÉUµÈö(n "¶‹¯æ³;g©ñ͚ΠG>‰Ùç“^É÷#WMz¤ã­üÈÕ¨_ì_v07ŠÝWO“w­Ã5ÓM#¾Ï¢>9“17]‡MÉBᯪf2 ¾f Æ™‘gL}ƒñ#W˜J¡ª%XSV¸nT朆J¨Žp"ÕD…È3aoñ¦ ¬žSÔ« íXEðÆ#WØF Öú´ù5ßÈŽT%m@a³ç†`y VõÁYrõÈ|«ÈÕ!ד«è×ìŽ,‰\e[[ýÊ}¦[³>` m"1Òb¯ó*ˆ ZDèhÕþò}˫Ҷ‰\55p¢Zý ·bQÑÔEmQm¦[ÕÇ’«¦ûךU%ƒýQ‡ î×!9´zruRBÿ»x²„/h@®–ç¡ÔD…I‹ºÇö½‹ÇÙ¡•fÅ'E®îš›·¬sÓä*¨]k@®® sÊr)öÞ+AËÈW—°×6AÚï,À%ö¹ªúá'M®zêЂ’mS1eJÌëyCB¿;ݧŸ˜ [ƒ¹ÖÌ2ÃY³[°ø’«-Ï´Ò«]ðqÖ²Ç@ž"£–YrðŒªâ†ÿÿ T›\E»úÞV™$ƒšEà=ÈarÔ¶ýß-D–˜,Òb•W-÷}Á·?åÁhƒ=0ìª6è~D÷G&WK3q.–\aÚ5€zöœ@Цï}DVWÛdÈÕ„¯V—âÁç qkt?nÏÌ};ã`ö0•—\]ÕÛ¯r¾,íšø/¹úÙëL€íQϦü„™bºÙ¯âo&ú±/ûn®Zj®îçÖ2–%gnHœÁÒjØÔÈqCÑú‘l./M!E)£žIüPê„—&1 jK®.é€`0rUw¬º$}$0„ØÇ†^…Ýv~¢xªÿÝX]<†ºð«l¢= 0äêD®nã$bIaÐþ>ö©LX‡)fúneq¯CaÄmõ¸a¨÷YßÛ6üd®¦vIä*Ú„QŠjùKw%g<ÅÁœHð­p²ÏÚ#®–\ÅÁeN‹Uj}6îI4Jºe2s·‰ŽX<¹ZBpá½h™º53=¥Qr•M\7—¡ª¡+zð]¶±6…D"„âÍÁkíº&‚¼©ûCÜWH,’Œe#L;˜˦('|ÃTOU³V8~(¨;˜»¤#þEÙ)¦"!WoJðô»Vðeߣ•E‡ 6JóÓF(Æ1w—n&À9!¹ªeݯ¹µ t‡m/Ý>_?Z¹ŸQEªtÀç>rõN wTë_gÏki‡ÁkY=[*gA¦Ýö<ÝÉݳï_¸f€9òûƒ´a;KÆPˆ¯‡ÙZ¯€ö¢ÆU“¡H…$EüËÕD{JÜ7Hƒ‰ï_?’M·H¼§^H›&ll÷f—4äÁtØÁ*ÁÌ׌‰hˆÁ—lŠT(Ä6ÝZ‰MT®MõõŽ)’õxÊ÷­ˆïóð¤_ÙUþJ”DXáO®n™l3oc:_¦Sßp‘«ý2g¼W•´É!WùF“£ò´Jùõ¿KΫópÊiãžÇû$ºß¹ð›»¨É ‹v¾ËÜÊ£">C}¬¦ßľà^NåÑ®vš æXöÝ\6B%,º\akïdÏýÈ´Žº$·ÐG®êfMCBh%i.•Í?r5br¥<çFÉÕºÃ%‰ƒLý¸¡~4“›‹ûìuf­+<ØUÞËS^³¹mX°ScÍAT‚Içj‚\ElD®ŽùŸ&ÈU¾%wA›ìmóòó²U ¢ár!]†\íÉB5 W#Âdp>>ÍäÞÝ«!~äjâà‚«å"Wg)#Ÿ0yn¯`!Wë»’Õ¯e„¬c.Ú8Nw‹TÃö.ÀɦÂ\? óe¹¾äááª$˜Žl4F®šM¿$wa[[™6ñåZãVpj ̬ Ñ—¤¢økT«_‰íú{œHÐ"Ànr5y·ØÐkL0ÝÏ·/9rkþ¦É¹‹Urh]¼Y—‰|äê5殺ç˜ÉØg$ñâÍÆûÝÚþ/Ì‹mQ•º…ÈE÷w>> ÉÁ\ˆ\ ½ABsS$íR[V¾*i#Ë•=»…RÍwΖߜñ{Q{ —=â¬6ÊHÔƒó'WØ¿n¸Š'„œŽKJŸü ®Ü^Hñ’«#žHŸòZî’ŽEëGû‘«º>òI¤Ñ¥ež¸î×£â„CÎ/üf=p—¯cQp‘«#Ÿ"²Høw,'èE&Ñ8OL‡‹ð €,ý]|îÞž-ªbóÌ÷ýÉդ̷¹iÈUÃ#We@Íá9ä*؃B;h ˆô¬ìÝØ6ñ»&õý™ ]3r§à.uè#W—6A®ìƒ?L59QÄY³Zä.n§V›¼*î+, !ÑŠÈÕœ(E¡WáApÙ1/¹ºa4>EgŽýï=âø°ðIëg9Ø`îX<ÞC¼IÜç«åêSŸç@‚Å“‚Ð,¹ŠÙÄ~‚[‚’«±]¯*Z7ŠuhYtd½b‡…mñéüU%²·Sfc@ÿŽº£GÊ£¾HýŒ§!¹šþ*‹ˆõÔ“«/7$WO¿JØÂRØËø*x~ò䪹Î/Ö“«ËCã{ß ìbq€¾6H9ZYØ6å|R§®„ù!g'ì0Ž”f༥Æ´Iè7™ˆØG®ô#Wk+ Áñ}nU¥¯‡érkÈà '›Ôcè{•i_ë³Óƽô‚›}êÉÕµC‰Å,§Ävãžìmµ¸ž7"*ªê6üQâß”áeÏþÐÉ’Už@Ç‹Mz@6ÒúÊ™§…9[y¨ Ž X-ÂU˜ýfXhX«_䪎¤O÷»…]üÍÄØ.WzÉÕio¥‡7¯'WWöR „¸¹ÚŽ­ítÚ<.Ù~´ºøhU1‹)ºfuw:‡\eœ<ôxê ›ËhkœàÈØ’«ºe¶s¶ß[ÐJ$ÁÞvTû†–\]­B÷}owAê˜/™Ì‚÷¸ÞK®Îù(¶óåD=Q-Ïb/I6/¹r¿[²e ÆÇá¨-¹šÐïÎäaÅ÷¾µäÛ 5£J·M3µjç{NŸ˜‚¥Ó%/s³Œ£¶~ å=†;²±!¡ÍmFD®N}3oI§†äªG×ܳ¯ëµ #ŸËYÐÚ $$®Ç ¶þ1¿hKˆÔ›V¹ª›\Ý®fõݧjßLDœøk`þ•²º\á¾}O°iës:ä*ß«ÞX¦ŽÖñ£‡1¼àb%i_bã€|Mo}àcŽƒ-Y| ‘Uyç_1øØ‡†©/žª¤ jöÚaö “{Lw–G<¹Z²}:¾ :-H‡k³­2† ÈÕì=b«°ZÓÞ²­½ rü˜Ú ŒzœìÙˆ+ö‡G<æìC>ÝÛ”\5ù'Í‘I‡\Uiˆaæ.éÀ†ªj2g¼W´aZfÉÕ ÂÞÅíð&G •z’äª;U’WIa||:XYµœ/uÈÕ{?T¡NL}ï°Î\ÅÖ^v?ᯖí^`#Abj6«!¹z­C®I©Æ·3käD ËZÔѶ³D—«S¶ˆ\Ü\7éÖ†aÏ­Óñ˜<¥ÈOWÿ”®WJë–Æá¢d‹7‚Ї lÛ«¬e»æ‹ÜHÚ`JVþËle?d>eo Ñ‘Ò,S\]‘¬Óà‹ªÆ>‡"rÕ¤õ*̲Å|&€\ýecäêÁì½™Ÿ½Áj €ŒŠ!±ÚnrU$(b䓆\ýnWÖLÿÕ±éì~Ç–:O[M£!¹z›JæúZ­ÕÈ ½º‚tUĬZÝÅM®æ.h¤mF‰çJô %Wó6LÀ¢âÁJ•ôx|äêÕZ^/¹z·ªõ¸>yh3ut:‰Ð'ÿ¨”Ö¼–à[4¦Ó:‘«Ï©SꀻÙw,¤ {T¥³ ¹ªÇjñòiÏíÓ-;Ò€\œt¸¸€…tŸ€ru„%W3¦½™:îùâÍ­ï¨ÎØ ÆHkÆÿ9\¼ƒçU÷Å\í€ñíü?ºÝù¨R;¯µFŒT^úÝe’„5‹ës{jøëAÉUõ Ì‹q’“Ù‘ª¤‰ƒîOýÖ¬ëg=ÉÕ²]s‘•ð"&¢*q}öçXÃêd¼Ýù'"Wèlä*FXÝHG?Ë×a6‘ý_%бûå<…«ûa1‚«K:*{3'ª*ySrõèa“¹*ŽqÒË,Û¡Ì]®¹:öÏ–\-Û9›µj‚\ÅÅg¤Ä7J®¶:‹ïâ†øí|Brµxó$l©.â5RzÈyªS·²á®y„Ï`o7¹ Bµ¶àDT}(¼yàݨª¤M¼AµüÉÕ¦ŠÀÿtiE÷k7¹Zæ%W @>÷j6ýÙ†\­òÜä*±­ ë˜ ?×ÖÌ Ç÷ùƒ=Sû±ÈU­0",èÕ#W[l-ü˲„Ÿ<õütÏ«_eüç›ÜSäêø|?rueO[ýÒýÃzrµW#äjU1Êî«j°ûFŠÌL|¹R Xãäª.·2©üTÝ1€+ÆðJäjìjð§¹~F|ŸÛªÒ¶É|õ¼«ŒØ€døLuÚ¶â-“ù ·H®òZë¡l] ÄÁ%WÁ´8#“Ñq¹C®âmÁfεèú©åÅàþò–v>1÷䪮á«#<îûØ¡rþlúw«Ç2°¨Ç!WÇ>/ruâßÔ(q½†T¬k/6¯Ò’«µ•ûæD6–öcð$«Ýöï>yrµxK8¯ W‚ÄTxà½*Þ5ìQUÔõtöÜ`‰›\-XÕ›ð¯Sä>ëƒ õ6ú·é€sS¨ˆ‹ˆ ½šý-Û9G'¹äjI†%Wk"zrµãÅ“_q“«Èž®_í[.rµÓ¥­¼%[´†!gÑØ´CP}èA»½C®­à¡ÇG®òÀÜ¿‡(˜ :¬B‚Gübd†Z¼i\Ž~–\%¦O~¥"fUéÎYÈ•;d&Žé|y:;êi @§KÓ'½¢ÂM¡WÇ´ÿº†Dª†%W Ê*¤%kÆ;Á‹ü#Ìæ~è}¬@‹Ñ²²=Jlæý˜¶ÛvšsÈÕ|Wo/¹þRdÈÕsfïu*9)ËÊšõï‚•½y6Ý~Ÿí|F2ê“3M»vZ“8à^µ¯5Î[Ç"£tŒê„ä*Ñ“ª:›¤Õ¢ÿW‡\Å ñ‡\-Ý6ȺôÛ™â|¾𹏳\†NáÊ•âXj3B' ЫJÝT/•Õý«ý{x2rŽR € ƒå²ÅKY=B6UJÚP{ 7sÆ;h†ð½¨@Pr˃T4M®ªI“—œÓK®†œ¾¯Ýo«3¾s§¬×›‹äMÂNëGʺ¶=ß’«b¶phö¼•~eZžiÉU\mMÖžŠØ5¶WÁ—}sw òbݧ“; ¨r|Ÿ&C×ëf^â¨H@É¢‘K&¿Ýå÷¼¹hãÕl{>ê2 $WK¶~†°>ªônÈUà©qv»Ö’«ˆÜ¾6瀸üc7O8„MIõŒ[„L_¶EÖ—aóý Ò"½3÷ºÉÕlÓRØæ·˜èruÚv ÒU“¹‹ÙÊä*Ý£â ×rµ†Ÿˆ\ 9=kæûY3ÿe[^oäè«‚gæÃê`}ðC±]¯dA­\î¢v˜4X®&'Òò¸ÈÕÔ­‹Uõ"¶A/K€“Úwbí³÷ä.é€ DgVç¯ì©²œ!§£J‡}ùZ"Wgµ`7Ä¥O|iß§¿i”\-ËB¿NŠ\M­'W1_(f_¥¶«ŠjËsÁ±ê,?î/éÆây,Y:áE?rBM@DÁÈÕM ZþÔ H ¹:êéØÎWäÌkY½’Yë~Š\UÇó`yŬ•˜g ç·lœ\ÍU¢µ!Ws#Fä,hžgÏù8¤š†\Wüx<Ø1ü2fY%ßr•Áä‰ëû-vkUÕ’«*¤ÙûÖ´qσ]ù³5t^rµî˜ò§¿ä;ä*n"m쟋7O25%. îP{>WÛ&#œ@ÈOdCØèTóyÛ»\ä*ö0ÿ/XÕ§ð˾äªi×ҥѤ4uô3r„l{žÈÕ`5Çö=\júÍ`"«{ÝÒ¹êkâà}Ïñ£‡?47iÐ*C-0p"ruçl›ÕÉêÙ;…ƒ­H³tºáØþl»þø“«ª„q.$ª,ÏðÇ‚’«ºínèeÖ bðHôã±Òª]æ&W+ ÷¯ ãW6æH®buÙè äjxsd&yØ#YÓß!„Ù׿\‹?\-&*·ª¡ÌüäØFÉÕ–g!ä*®fÉUõø[Ô¸T€má5fw§xXÈšôwà=ãD1)<ˆ­¸ë%Wã×b«Ím¯§+8©<ø˜ÿÁ¹ Œºªö³“«á¯2`âQnrX[\Õ ]e}É—ýëGŠ[žü ‚êæ@Üä*0;¾Ç–\Õ4¶`y(–»Ç¾ø“«¦IÙ$Wç}‚ìoh“íóÃÈÕÎñ‡ï™´íg'O=?ÝÓlÆ®6{+O‘«?âó½ÈU%(êÌÅ}µ“h´ŠðD=¾ÈUþ ß„;ÈžÝBäjø«êr¾a ˜Ù]SäꤗÍÉcãäªéÿ‹+9\œ†§põ†×öÀµì! qJe|„©jò4ë{;æ4Ú×­Õ¤ *×ßïÌcʈ'“¾žæ&W‰Ží]B‘«á¯ò»^r5Ê öšŠ6#ªÍ[ÖEµÈÚž§b×É›ø"{·HU®8ÏhïãØÞþäêˆÇAG†\m”\Å1á-´°ä*¿bs}SF=ekÁ0l QžC®–Ç|™³°Ma2 „°ŽU÷’«¹û@ÔD%ö¾°!W•çcj®¦šoIÅ]Úü•Åëâ#W7ŽÍ]ÒÑ¢‚âµÂ¯Ô3BsEë‡\凛~ÀöÕ™@ÕM®ÚrF¼YäꎙyË»o‡ÃR"å’¡©GÀTÍ÷¡N¦½nA*çîªAjOo;œ¶ûmÚ¸šhO©ë¦åÃÆcZÿ/\;TE}ûß×íÝUÇ?ŽÿkÞ⌟ÐÛrÚV#~"W÷'¾á^Ù…HSÉ0oIGVƒõ©-Ï75äo0MR „9¡¯®+Pr]“)Þ4!¦óåê’6ìQ‚?r5qÐe»xöµ=_Ýx¿èÎ÷ Q+Š|ýª­(4äª*%W†=á.*è'o'O®2GçÞ™ß#r\· µC®ª$iøk„N¥;f±î«ë†\Õ…S™Åt¼„蕪 ®¹šZ°¢g ´P ¶ÅÿÓ'¾Œ’"'N>ò¬Â’ݯ'œá{ÁuA¶~ó$vÜM®¢‰DÖ¥ßÍ&˜U²ôêþ¼ÇK®.õ'W+7ÄrÕ4¥z9 ƒ¸Œ!WkϪӶcXC®Þœ0ö¥ïA®©)ZΚ¨o·«“š%ôV³*vŸyñó@êÉ’«Ä\ÃÓ\Ý‚^UeN{ÛF‘Æt 7%¡ž÷’«ã_,ÔĽ{ÊXÛ@Ëø¨cÝöi¶ì3ÛíG®ª›ù¤—'W½–ªž\­.ÁŒÄõ¼á$ÉUL·e¡ýքɪ¢ÚØç5ër•€ˆÍ͘òZýç õF>ÅOXU˜ìq½µíÕ©[ª’½Œ‹O¬ää‹%Wù@ÖŒwÔË!W¿›‹÷TŠò´·D®ö»Ã!W‰G°`ȼ oŽxÂvš«'W¿è†ßd^ˆ1òɾ‹MšßÒ’«5.rU-o¦¾‰{² 3n®l×<õÎîv †3[•$·[ðe?æÈÊëÄUäjÇ‹UÒà‡ÜW6Ñ!WÑ öÎE®¾ˆÉrØ3·¤ÁøÈÕ°äjÌ—õäêªÞ¦¥·½Z=¹Úï΂U}#WYj9¯O~{ ÌaIóWöÔì:\‰ít)nšWeNý'ÚÁô<‘«[?#î&¬nš\å»bµ€g+íîRí2{Þ¨üä9šãã3bC¯ªÎØH®¢Èeß͉ÝËM®"-lM‚©M¡« fÀÈRÞ²Î,ν‹X=‘Íùˆ1óˆèèx1FžHÖ+ÆÙ{-Páÿ8ôrõô.~Ì‹Ñ.cü…kfÍjT㻫 ÿÙ‘«¨ªaZX“ä¡ÊšñnUÒF/¹Ê6MxÑÃô’«mÎÅ ãýJÙ˜æ,ñ¨ŒøyWEâºãµe¦ë±ÈÕmþä*Þª`eO§y“Ç\ûql—+í…n÷£žïñ¦sV!Ã9sCT Ý%ˆ\­­aSlò-È™b;u2U4mĵϪv½ÊØ^á”…t?xœŽvduÌ,ïaUýðµkß<+e‹n%8%…íSO®fíÎ]ÜÞÔ'ìî#WkÈÕ¶>f×>@‰ð׿õ¼FÉÕÒ,l…C®¦Œ|Ãå&~ƒ’«Àr˜$à©;Žä ²Žzq²ŸÁ„ªeò&4YÅtøÈÕ×RF=H®VƯMŸôwl—!W[«)CG°96‹RNmÜó¦é˘¾ü=ÕM¯ÕY¶нKW¾&s—M¿³dTé×!Ôˆ}®-œ¹5'b89¹„Ô5^5„ªVËÚЫT¾Ìãa<ªÌÓç¨aÊðÇЬ›\Í#™^x|[-Ó¦A²Gê¥5¹¹0@ßÛíDªR·Èßyrµm¹Z)BÆdÁ±ÑD LÇšP …Áó·)«í«Aȉ_z°m\¯OE0䪩±ð;,‰‘Ø~AI6$¹ð«Á‰ƒîÃaëXϘ7¤M{G†>V§ï°¾PªÉ’Nní3äêvó…aA$0`Ÿ@r˜a‹]órÔEÀTV§mó˜£Ïµa|¾lçlçRƒ¹jØ>EëG;ä˜-žƒ$WpŒìr Wò󲮺õ°w±.Ô4¬ªJÃJ9?QSÅ £³ç~Ä`¼äjØ™ >S_Æç %W³ŒŽØeiÛý-³­lq6ü…îîšgÉUà"NÊK®VîG­j¢¦'îsÈUE¬ª—Uzx²)ƒüKßÝ¿nxÞÒNè2Ji àYr•ਉnJˆà¥NU,.°õ`Íã–Ûgš¢šŒ8M‘«#Ÿ<P}¤4äºÔÓíöëhu©­'ös‘«aŒRÒ‡fÇÈmBˆ—\53ƒlSG=6öy‘«®¸[íHº_'¸5òɬï¡•1/˜ÂSo"«¬Ë…WµÛ—8ð~\¶ÇÇxÔ“«[?k:WÊýüèäjhbíÏÎþz~ÒçÎ ›»Ä9E®þˆÏ÷"WA•À¿®‹&}ÒB#¼§Û°]€Ó€ÝÏúô\l `8·¤ƒûýI‘«5¥Å›'âJ^ruÆ{D¾©cÿŒ-žÙŒJLVyäR¥“ ~üßó&~¨nÔ¦,´iÈÕrBÎį&©©gl°]¶DLçËÒÛƒ¬Y+Û=ߺi%-,騫(K:AG·S±kœæ ÈÕÖçd~ö:8'(¹JØBL×¹jjÒ ûu?ðxmòðÇù|"Î ‹m«‰ªæÚ¡æ:›—\ÅÁñׯîzx ÷×ýZ\-¾ÌG®F©ˆ\¯›mJ[ݱà XÛŒÞÖí¤°ÑQ-Ï´Uãr•Ï€A€«ÂÕým_ÈÔ1ÏéŠÖàøŠŠØ5º5¼g¡ À/¹:ó=küA>NBBæô·úߥzªk‡Úë*VBmÏÏ]ØÆ"4`§f:äa‚wö]@®Ó¥¬O­«ì¹Ð—¹²Àˆ\ZÖØ:°æñ½oABx•SŠáÖs¶Mès› ™ºŸØ Vcžcל” ð _N(Ùcü_mÛh°(ò©jŸ† ØLÚÀŠÄ"WûÜ&rµ8Ý}ïTÆ*ñOì´ µäjé·3Ð5ÖÄখà9,{ÁªÞÀos—ö—9 Ú˜´Ã\/¹:÷c…~ÇÕš\VŸ Ó?ŒîxYÆ”×ý2¼Ï÷!WA¶,TÐÒ¬nr•¡ªN¯›&ì^NP®Ž¯ÎƒÇG®˜›“߇ñ¨§*Cö½ÍdsýÒ4«ò‡ˆ%ï×E³¹!€7€ha±±]¯›a%‚v¹•h}ö†ÍÓvì•79dÖ¿Ej­èÁ Å ´M‘«ýïDï’ÂÆÊ1’´‰/yÉU‚O]Ášêžóe_æòCÈÕÈ¥ÔÈs\·«ã{ÜØïN ˆ—\÷B ­ä%W¿îD»nr•àZkßU´iœ;AÝ«cÄ'rÈŠÀìãþä r5v5’/¦ÎwVU•¼ û@Äf‹Å´=“…¿fZrYE§X4uVª,Ä©Eúz½¥'DÖ“«ëGÙÊä"W'¾ÄK”Ÿ<÷c•ˆYÔ®:}Ë•=7Ä6ï|,¹êî®D1³ví_†íb‚€U@ E:f¾(z/®b£æÅèdùãÓXjwÕzû”G¯´S3䪮xoè=p/àçI÷¼*œyˆí–É Õ!W`~ä*Æ{›:ú9?r•¥Kè}«ê*x‚€Hðrà}ȹN†=*‡x¼–øyV0N41à^{Ьlä cr•ð?ÍlüaCU Ø9È)rõÔÓØÃ.Ÿ"WÄçû‘« ?ü«Ü?¹:BäªZ=ÎjáÎ{±E°· º]‹ƒ¨-ÏSÍó-áîÓ(ù¾õ£-ïdÉU¿S„Í>j½}:~JXÂS‡¿À·òIÌxéŽY&•ô´}mÎZ¦ À {4mâ߈D‚“«^L\3ÁM®âÔxËD ¾zrõ»¹ÖMóÕ@tÂm ‡Nu‡=ªUã_P”a%WMߊ' Ó˜gÏ -çÀ²gÿ‡¸òðþ¤«‰ëyÿñÚC"W‡þ‰uÆ'‚¸š WYv }ã䪚áÂ, ó’«Ù‘êðÒóFË€–3Â_Mñ¸!W•JŒ™37d_ës|äê@D–×}ªÓÓÌ÷q…«ûožŸ\žG¼Î7MÁسP°¡óåâQg¼k³eoy `X¹Íÿþ$Nd:Å›&ÃØMæ¥vðs>²M4¦¡ LIÏP•ë ½J¯¨÷tæþ&/O>ño\éçÀÞE„'û× ëyƒ©CÕ¸ÃÆ˜€âAÄÜ«æïSû•½ VöFÞXò}+ˆL+bV™³ø lGÚÌïð¯éæÚ h?ƒ6ù3"]¸6ŒÕv7I±C®7¹¯3³}OÞoÓºÌÑÓqÄÈaî’Ž*1ºuJáWjôlÈÕ>*Åf¸Q€. eÉUe)¬Äȉ/,Á(ÀÜïÞÈ–g¹ïb7xêŽó»À9tÙéðÒ¨A89r•!±Gìã] þ,›è0'–\U ;þÛŽº&SúL,»U·wõö'å.h¯ÖfÃMâ'´Ãβ˜ Uè~­_²½}”m Í9?!€ Š:\˜¿L ÈÊ£–±ûä*¨Ø–žÀP$š²½Èƒ²@Çÿ5gA+K®;\:öÏꦷ¢G|ï[÷õ¸5aü+¹ ÛØØeײô=¹:ñ%Lòâ% ºŸñøÈÕ¿¸³Vˆuãuú;èé´«p“«DX6(`#læð¡‚€1_·:m»Ã漤‹w ±)Ü~äj|Ï›,«/RT\÷sÞ¸nWrµÜV§Dã‚4õp=nrãŒåä=x¥¼å]c:]bÉÕÚÊÂ#¥ÌŽïU ­ÒŒ¼5C2—vsÈUÞÛù2,Û¡¼6ŽÝщž:gUí判°f†q ^Ó!WYËØ¸¹z1Ë &‘(zêsÛH¨*u A(â*rÕԞŌØj @6NêàËbò‘«¿`´NL]±’Ð÷và Ò"–ò“31梺€Œô˰Ï\±gO‘s¬yzBÿ;ñ/†\}O·Ì•ürˆCÄÛ[Àj¨·º?»¦B=|8(¹Úëær5KÄ)¦cÐÃQ­Ô¤5”+!¶ñDUò7†\í¢Ï|;ù:êi\³ÈUƒ£ð5yK:XrUÅÏ ¢+³>ðO(rÈÕ¡rƒ@ÞÌlR.šâG®²n|û…%W“‡?Žü7J®«-ÙúÊn/M0Z`Xá5 g¨ xfÉUd’ â…ÌÝÞ7 l€—A«õò]ˆ¥®Ï„^•³ MàTJ÷5Æ!Ø™3ßc¦¸œóüÔáÂDõœþvæ†))ßÌÓ×™b}΃IDz±Ñ ÈÕÊý,5^RÅxG>é¬ îÜx¸(ñ3E®kš\5ºnQÓ«÷¡ÎîHß¶Œ©'W=u Ï‹"0k¹eZ¿ÝƒjÛŸ¨˜ö°G*ÖáÂÔÑÏr5ÒÞ„Í™×Ò‘ùŠø²XÑC—©»\©†8R7ùáùÈÕÅ8 {k@§Ø‹ÚYnAÃ9Ã6?õ›]°²—õbà|ã´¿7xîcÓPÆä½[²VôÅ@•íšÏÿ8»c‡«Àó±]¯4u]¼äjL§KMùÓçîRðÿý£n’«û™6Bw–\e_pÓªK6ø´ñªyÅâûý"ð)wQ[k~;ƒ-Ù2Å6?ÅY[r =»…Ú4¸u;ì»9¹j˜ÒéÖVãpRhqÞÒN¶<ˆ¹Šç±³YŶ§†ÇÃÐY¼¶ˆõa¿°Þ†êÛo´–\}´i<#Œ ½z_ÇËÒf¶ð'WMûõ`äêf‡\ÂÈøÑn"WÛ]€^ÔuÓxD%Þä£>ªüSSj»ñgÖ ³Ïú8TJÏÆ±LÜk=ŽÍž«ã0‹oñ8 ›Ìޏ/Tz%?r)¸‚ª½éÁr5§;~T\@y¾Å}èG®¢éöÜGØÌWAyÔ‘K™8›åPgh‘AÍý»óÙk[+æÀî…–TbüÌ÷÷}ú¾p‚WeýSÇýO‘·Û!W÷¯©Âžµ-¹ªãÔŽç/搜{ ?­NßÎÆ!‘«ºtfö½1Gì1i yÃ@i$#Ÿ™§Oz[ä&ÿY$߆ç…ì]‚ͱN)²ä*ßÞôiïO÷¤Œ~6ÒpÑØ++S^ OÉœú¦â:Ñkì¶ÚMºNÐ[òé*Û9§"v þÑ"œ„¾·a‹§#%JBnw¾!Wï N®n}òä*ÞYwÄ‚õ޶c©ÔÜÍÄÅtçüû ÆY™#%é:+Ÿñncé=΃Ðen;î§¹ºª7ÊÀ ÅßLZ ÆNrŽ%WµËì,!¼ú?É€-ÖŠju–îô@ Ó £·ŒƒÙ{ÜëÐ,6½3B¦v!¹v‘UhΗ2ç1ðØôQ`m QËHÎÉUä!¾ç j%ßã61Ew¾”ˆ ÎÈ-¹Z“µ+¾÷­jñöE7‘«½nOœü±¤åFÐz¶ iGBT¶ñó!`بú54‘ éœ2ß䙟 (­ˆ‹°ä*¢xĤˆÞŸþ¶®°uº„Mw®q'W§¾)rÕð!,’™þª…»(21¾¹—ïûB‡&®"®=Bøk‡2öiD0¼äju oPíâ°?ú‘«q_‰\ý e(ru蟘 ¡:"êîž§G«ö*ˆ JægÏùv€/"6÷²d>9,^ѹÊ|-‡ šÛF‹¾0<ÄvŽx"eOµ±õ´;¸ ÚUÕÁ¯Ùûû=ö®îø1‘«£ž¹šùbƒ“ñ²ªOuÚv&‹¤¡°ÉÃá["M½M¢-Q3ã]5Fìr%?¯Œ þ-Ý9›ƒ¸2w1Û‘e:d½¢ÎzÃE ³M¥}mΛçKQÐg&ý]‰y†÷#Wûßc‰Sp ª=nÌYІE¶±-++ƒeFl‚¶•i@®îœÅwéÈ€{ÒÆ¿ lÈUdÇÂÄv½ 1@‰òVÊZÞËK®®ʨbC¯BVq‚„ù¶û±ÃU'ÈÁ„gY¥ ÌͶC®"·ò`¾¨›L¢ÈÕl'Ê+isc0É6C÷=”LtŸÝ’«ùË»!¼_•± ¹Ê Ù”ÂK®zïe¿áŸzä#W“?àæç1D¥ßÎT-Ö‘O¢)nrUÝgµåUî+¢–\ÅcF%WFq0¹6iiä[P«„þw²>ì”%WÕ«ïm,¦Ò´–t°…jË£–ãXÙ;¿~ß^§°q¬ ¢©±àôÜt?è8þ̉ ³P•Ir¶q÷X'²fšbV§þ3c}xò¦9é^rª^Øe±BCrµPîw§)ÆûˆS+Uäjø«ê‘—`Ó$¹Úò,”KŸéw'ȳ¹š¶Mç×¹ZwܨüøQOד«¹ûl&‡ôcü O?rÀÙ¡S:ZòÉ<®*oq&¶Ɔ^t±#¬*«!tjTU]™øÀÔ7Ð}} ZË»}r&ÿ× è~XUÌ…Õ– ZP¢Bí!ÿE(ËÆªó±¤½›±9@æ˜Á0²Ú^rµË•Âêž:ÖÐ4u½Àžña±‘ö ç‡=º¯ýÕàÄw[±w“«L'yÄéá¯v2|µmë%üø1äJQLø«D†\Í@ªy›(JC®ÚF½îÁ–Þª'WUuæ1o.GÁ ;‚ro™œ=»…ßEoYìñ/°û#ÂŒ:« -¡Î•ZŸ×SMâ®ü塸ã>@±ä* ÈF¬ìÓñ’¨ö¦Íúצî«*„.³é%W—uu[l‘«É›0ƒ t¬ð”ßéž!W›ÐçõJº~TBŸÛð}=oÎÀñcÞéÔgm­i‡Ã4äê8à„om"±¬†Å·e»ç'™þAÉÕÒ³øjD®d›[½l½¹Š+ ¸G࿌ùÀžEnréEMòüí,×~G§b±“˜…¼Åíì]¤›t]ÃùŠ\ýL‡JÌù0EOö7-ö»FÉUs+„-.Û9ÛK®® C;*7¡ Z‰Å <Átö—@ S½íB„€»Bz+{¦}žív{pŒ§ äº^Ó±{>öŠááW^rµûuM\ÀüI‚_szq+NDÜ‚9w¹:þÅôI¯¸–] y‡6cwªÓëãn ,îÆÞlm@®~¢êö.±ª¡ÁD‹õäjUÑ~_ÝïM®~þ¯†­cëŸSäê©§±ç¹úã>ë7l(Έº+hЬç31ƒºô¤£½ú:Ÿµ>îü¨;ò¦Ã©:þÌj€9T˜€IÁëá¼ W÷W6ÎÐfÀBÀjиØý)ËÊSe×›üÉU@Ñž…øz“‘%r•HSšI¶ÇMØ#9â到˜Î—á ±Wæ ÕiõäjÆ#rõPEÆ”×W:R]ÏÈÚBv†\}VÍ[JZ¥ÑUQpK¸5’ª•t}|ï›U!gÊkjú9äa?×lÚ.lÓmÁn×r5 †±‹à%W?H wr5ùE÷•ûrW¨|¡áÚûéDš8AÕqò‘«Da)£ŸuÂCÿÇãQcßP/¹J„…OÇ…ÙöÙûMÃ2¹ú„%WËcVožˆ·,è¾Ögãù«<õ×Ã,V´çe«ûtWĮƊ<ì} !’ÀjèFž¹š¤‹0Sÿ‰tUÄ­1eÞ½ä*rBTå=xà0¤ Ŧ•vûêŒLJ­£L2`Gpxsw}~¾(Át`´5ñÊvÍõ[>Œ”ï[Q°ªR$rui'§Â˜)é¶–ßOó*u¸NÛŽ¤4©cèU {£ü rU‰Loš‹!Ïšà  °¢½ÐÁËã{Ý’5ã=¿z†h²±¯õ¯À“î ¾Î”åy„½Pw€î×%‡=l‚ŽJ⑘ŽÕ“«îQ’Ì´7ù.6T×s–vÒÂÂļ%ò–væc–bE<¬LÆ„^ã»~¤¸¢C®fN{ËMR}€s(š;²~…ÉÕ°?ªaÄ–pâ)v1pôÅK®¶>džÿÄMÉ#GÍõÆ3bÚÿM ¼ ŒXŠ!Y¦1—eÅ…^íTµÅ'÷µú’à íû¬^çãÿÚ€\=KàjŶ°éˆ_ѹZºs¶msz òÀo¡S%Û§!–\­­(Tcâîת>ƒ’F®Ù×ûޤ)oå.î`K%+xéx1ac`%ÕüèË~¾¦xÊã„—ÈÁìYOê¸ç‰ E®ö¿‹×½Aü"ãDl5?Ç’4 W}>HàŠ=ñ’«3ëÉUÖiU5Iñ$ŠÁ|®YI¬{ê"×óF‰‡i:ƒÄ€X©sÈU ?ÅW2e¶†è¯dë´ðš ×"W·g´l"Ñ.q+R§„«¡ÍØnôˆÂC³  ö³&câÛåJ ¦ªöÍ|ÏK®&mtÈU•‹™ðc‰#?r{b‹aV&¬Û¿vXÆgo0Tì3ß…ryÉUõêÚQ÷•n¤F. ,§œ6á¯å‘ˬtÈKaMdÛæ>ºýïpÐÄ Ì=yøãŠI·LaYrWÊú¢·‹\ë«H>êÂYÔ“«­ÎRë¥NH®ò1ÿAzê Ö{B˜_‹uª'WßÃ,3+z¼(Õ¶ðFxTÎýØ–…¥`m?á%Pg ”s6á1—73 }á"WÏ"<7äjás ‡YÇ÷¸!Ê4Xôv­ju–àÚÿÎÔJ}Å:ì$ޝ"æK‘«ëGa£i°™zDîž·Jö¨›\~Ø+6ü"Š_O®²…‰|x#&ôÚÈ_˜ª;ï`4"ÕƒïáŠè•´cAðìö]Npâß0V(¦%W‰ñk²÷"¢üÁ2ZÖ’¨½QÀQ²%WÜë‡Q^ȶ)Z7¯d‡rÍ6(#p8oI'>oÉUìFàÉ+l.Mt;¤ŽAªÌ~ë_Y<NÓ{ŠR°üÙ¸•U»\œn…1(£ß{Äc÷»)Ûø³“«uÇñwÆÞ´óèÚÆ±/¹úWá tT¤ž7‚Ø;wEk´ ɼØP‘«q_© ‰váôX¤4z•½±H®ÖŠ0×E0Ý0 9á=ÉÁŸ"WügÂwCüŸÄovÜù³ä'{N‘«?î³~Æ‚ØM€¨è¶ç¹[ÌÔdïÁêj’ëúÞ?«&ª¾h@¨z¦‚º-“H`{0/&oYWÂ7¢•ü•=‰"úß©‚„óBNH®zL­Ò© ÉUÛÛÔd¿œ Ž«Ë8D^Æb³ŒÏ^/XÙ @\ɼäªÉmó˜l%Ýù2äjæ´·¾z¤ºþ®10ËX~‘«òƒ>ruK8æ̦ü@sî Áé"^—+fïÁ3¦MüÆÓ y“ š5÷µÏÓâU9mÝ{Å6’)NÛvr5u+ÈÔ¯òï{»  ºßô1T£1$kààrÌ Zn‚\W˜ôM0W‰jºç8í-“5ª“k0ÚÜŒ~lÊödúY3Þ3Àõ4³Ú^rdÎ?¥Ž~†¿F .ø²}e\ ”Î*fUØ’=U!Í~wìks1,â¡û¡]®7äjâ õbMDš­OgÓñ;iAŽþw•íœ 5»ˆNÄÝO$…À¸3?AV¦Š×Y¦&^ó@ÀlšßÆËU£²ëï³f¾—»¸ƒÓ×WºMe†?®b¡=od0€“š¬=Å[&[N|°!†Šnw+À&Ú.öMŒûa.¹¶&íŒ÷üpq»ÑÍ)W…œýC˜2N—ÊúÄu»š±) ÁG®‚„Ùq‘«Z+Ýc#Xµþ\К×ZrUåà"®„ɧ½ie2¦ó¦•ðsA¯Û|?ruö‡%ÛOL®æÑÝf› tŒI™T«kºÊD²ÑíÕ‡ZW'½ÂÜ ÿÙwµ7UBËu™Óß9Zí/É!WUæÂêBkì•)>ù†¥¸ ñœþéî‡@¼T²­¾ÆºƒT Ýl1‹‰ø*L¹:úÙ¼Åü~x'iÐ:eè|¹nZéæT{„)µ=ÿHi¿×íZДºY}ú› ä*Ò…,Ù–+ˆ´--‚ö­) $WƒšÌ¶¥‚¹Ê;ùj[±Ö#ýéo|=æó~IÔÜý ÚGEü:\˜:î/*®h–×>Ц•Ç~«¹jdÛ¼t$Ój=Ö£ŠÀˆÚ TeÅù-Q÷%ŽŒðWUªtá§M«è…­ÍÈâÛ>b„i&âîò蕪3ò)$ÁK®uFÈ£L¹€RÓмpu¹ÚÚ\-ù†X’9"¢ ÉÕ Žé`±“á¯Y†MäêÎÙ¢‚ ¹Ê,,cƒœãß ‚P4‚V{£Ä’«h%^TŸÖ,㳸WÒ>¼„ñÛ4!S÷¯¥ÈÕþw%{Ä’«¸0|œÊÆý1¦ó¥xÏ@r¡bßmgF&Â.0_ï&WÓ'½Œµ-¹Ê2úÿdljnÐâèÅtºDòãÃ0:§k­ÌU&5al>rRä* ®VÑßfÙ€WäªI€GAì£bîê«8äa´ÃK®ì~ÖT WK3Ñ ä°f¦zÒŸ¢Ì¡‰ëð®ïí/¹zr²c ‘+žô‰/§¡`uÿÊÄ •‰ël®¾C)T%oB¶#M•oušø²M(EÍÁ±®®þî'd$nr¡Eœ~#€\=†Iµ»¢'P[ác~¶×fÑ{Íò7óí¥‰l°÷ø¿*ý;c'Ó´7‚rUY ³ÿƒúgÍx×T'Š&¦}>¡ÿ]^rõÛ™È3NaÆ}‹B׳3°u »Çqðp«"î+'»˜Û»H¦éÞ†B?Û”³¨öÛ tÍX‘«‹ç¿ã‰ÔÝ ‰_‹À ×(Ú6yê0#âsZ¢K›øÃþ‘ÉÕêââÍÊõ’«ﳛĬŽyN¦cÆ»1/ÉuÉó f:1ét)¦q¸$=¾Ïò–wÕ â¶ç›zYoÍ­_ÕðŒùRÍvÛœ£Â§/¹j8Fá…ŸòÕª:òÝ^âWƒ-æ‡È¡÷¤@µ÷‹£;\¨$3TŽuðƒj冈†5ÓE¹éõÚˆêúÆÌ÷ö»l%rµÃ%éóÛrõuTÏ{_fÊ?0 8D÷‘µ:}‡2Ú ÕŒyÎïÂ]eâú¨Ög»ÉU‹G¶= õëbÀ° =´¿Ñ«êËÎû“«µæÄêïHWÙÎ9)£žRìV¿ÂæmëWÁ[uú_ÿ¾õ"êÉÕv¿UÚ¹”W×!ÁöŽ>ZpÄE+­¯A[™i|Ÿ[UzhyW")K®‚ ù&´|ß Æ ª7uÚzÉÕòüˆ°üe]K¶O' LÚ”\å[¬ë)\Z½ÍUyœ5 þUÐYèf_·kù¢&ú/`Uv#üU„…ʉïÓªVm§Kݸy`A¬{uš;¦ƒ¹3£X¥Cô³"W ü/<M1Ž¢/l.ŒÅô˜:W˜M7¹jnIt;óýÈUL«:k÷ù?ç=˜ 'BDñqÞ^o²—€£JÛ®0˜: VfðS¬ÏÿÝb?E®ú?¾Uþâ7ˆ5½cjbtðU©ê2m[óµ©çm½ãgðOöœ"WÜgý† ùQk•“Ðúl{.c°\â tqØ!W=­?Vôp¢9,Ò’«öB"8ù`ö^cáWƒ±ç  )á*î@­-éOá~@€XrÕ”þÆiÚñ˜Ì¢G ýõ˜½òlŽ>ooä-é€çDaÖlyO¦>Xruº?¹ÊdÕîAâ…€sl½…::ZSv¤8-ÔÓÄ~‚pë }ï`ê<åéá¯*sÕ\G·ÕB>S[QX¼q!3?<^[Ã*ñuà|P½ÈÕy-7AÉU¢Ý´ /‰9V‹‰&†"ÒQM‘«+=–\]Ý€\U5´™“{h~ù‡=f³@n|‹½çhÉUÐrêhàß 8Væ¤OxIh]®°WKbC¯vÈU"2µwŸó!€çÀžEx sÛw7GŒº¡Ä~ÙsCÀö€µú-L«ƒ¨*à·…p)#žÄ)›;›Ãr·³HF<’ÐûÀ•ò}_€ì ;h!iˆøLöË=A Hžß"6Loˆ‹Ž”fá4'ˆ‹Š\]Ø&cê›Þ«;¦8±ÃE™ÓÞæcñ=opº²ª$ûÔ7uýõP“jûr òU.ô ûmôêG®jkÂþñÇ‹’‰¦‘¢ªäoÜ•úÔ¬ªõ9„€g¢lu–œþ¶—\÷ [¯ëW_öå3EëG¢¢¿™Sß(Ý1“ïb¿¼äêÝÁÒì ˜¥T…Ÿú‘«j$Ñþ¶ÌòÏnrUÃh}6ކˆÞ4îë%WÕ#o¢!úÝ ÀV;§qA/,¹Ê¬ùƒÌ)!Þ‡Ð)¶‰Âˆ\ߊÏTÄG ‡ª7bšp¡J†\ýue|D=¹š²;‰¡¶v†( tûtÁܺýúPA}qKÕ0o÷[ÆcËXÅcâžP+ä _ØÈ ™Gzíj ‡ê¸7þ¯JÌ0•KE®Ö”‘ÙšLýBJs¿˜µ¢¯$de/fŠP© ÙÐ?É N{S´äØ?c´ {+bVYµe‘±ͪì㫼į44¾^–g~K<”ÈUÓ}Ûþ“Îé”:ÕóÐþ$L++Ì–YÒoˆÂbÞmìÃÈ€%ý0üV|¯›ÕöúØuhÚ>=oi§Œ)¯«Dƒˆn‘«:ÿ"kXNápqºÚƉÿW CÛôœwªñ RÇü9mâK6õ—ÍEåÙ“½3˜µJûg„ ÿn‹pÌÂ@9STFÉŒ§À‚°öN¢uaì){aSbìñ·î˜â²ÝókäâMÜä*bŸ>¹9{‡_.Þ2Ù&Ò˜E9âRMa^{¯Gìç8{–‰²còaÏåE³\Ì‘‘¬êãtã©-Ëf‘•$ìjoÚ€\ÕM™ß2¼@ç‚7QršK+]äê¯Ð\‘«ªÝúØáâT÷ïš5 Æì{†¥K܆Ãïcµƒ^—휭̱yŸ¨¯Ö¬»½[“­ŠÍO²§éã’ÖÏ@¢JÖ¬F‰x?¦"fµt¹§€wÆå!QQ-Ïd"¶h«ŠóÂ&c=Ðt$A‰j0$#P’tɪÅüÂO­¥¹ÚçN*bé=Eõ’«Âœª%rÄt³´ h É9´ÂJØL*”Ú»¶F1àŠ¸5ª(2ïücþÝØµäO€ÄÜäªigÿ>h–ÿ«ž¼mAÕêWÌ‹7Øb›Hxáš aä?°€6 "Êè&Ã…A ä(½æz³m©‚´£žÆD#·*”P8÷Hi¦ò«Áf{6¥Ïo‡#cHŸ½ÁŽTÄ®Á:±Êl9×ÇV$ºO©¡W™»QíÊvÍkÚÍ}¯ãƒ<¨ß™À*â=¿fJ»<—6áED…Í z³ÆÄ/—Éòô¼‘5Á:Å÷ºÉ0Á’mÓ0ìrâ®8¦ DåyCöìIa£Ëní@ÍmysîßÈgTÇKÓªš ˆ¥âGÓlý œ L]°v~_íò#Wuy$ic\÷ë½äê‚6º•ßë|1 '‹×Æ©Ôìÿ¤ ·…9Šír%c0|µyó®TS Ë)ì·|ð‘ªúL{UáS×õÓLC„Mï†Ó‰&ö¯y´ª˜8ߤè¸Ïm6sÒö´¹úÙ뙦z¼?¹z¬–1ד«•…@S\<Ø€9švÃo( võ±ƒå¼³xKxÐ& ì‚ÚåÅðB%d~r&NðýÈU]£~Xýs=u)£ŸÁ«ÙPEqÓ·å¼§ŽaÇv½ÒM®V¥la0hJõ®Ag’·ï^Êf臑*£~–သW&sþCº¨/õoWL®Ê§±Óê:_$ÉÕI_`°÷®æÓYI®ª5t73©©U†”ÛÀP_jÆ×‹ÀÉH²¨$ë‚É\9ú”äꛡÉ. ïŸ^4îË’ÿU£tr cGå’« Sìúhù—&W/fdú7Çrod ]ïÆ°Z'WÞ-bô*îó2r6¹¾x“ÊäÉ‹™<Œ„Õ*¿×±èKægÍm[°ÆׯXƒAÏ\[+³CížMpz+ݧ!G'WÕúÇ;ÊÒ.]$§ZÌnv]1=Š’ „UrUmP:½|d¡l20µNŽÚ]YC;U³Y¼0ñ ¶»´L®òCþ 'I®ÊÄŒêFrU6lÁ½Êì²W/î €ló6xænðº{%ï¬ÄbqUròQÎq ~–]òîß)Œ]£ö¬¢\ÝϹXePõ8Ýݽl±>Zmä ßâ›h?Ý‘…Ã%1Œì>üu9òïrŽìֲơÉN’U~õ]OÝ¥Ó1êDc½ëZ–É„“«ËÜÚwoŸOÕgxÁØ ì‡a •©‰£m1ÕÇ$WeSôiBh-a$=T’«/ò®Ì5šÝŒõ–¼(ôö™„Ì9-Á•>a JrU} –]j—؉ÍÒäêÈßP`irõá=èò)A¾L7õk¢CaŒöäêyÙðV<ùÂh-Çú]¤¿”I®z|Yš\•µEkÊ:އx7Ù€ÚýSýUm> $Œäªlx÷&?€F" IhXœj™\…èÔc’«wnàßofì·ü"©’«ŸËV-:¹zÿ¶’^ã2‘:¿&M–ÿ|Yz† *º"G«Z ‡;{|IT&Ó‰K¶ ²¼nåÅ`¶PÐÕ¸u2Ññø’œ°X¨ñ÷¹ѯ¬-³S·‡ #éC‚ #šõí¤ï~~ôp9—'zؽ«8wþ¤ŽvúXoÚ#›$¨ÓZi…HÎ6 ¥$We'ÌWi0îÀØ‹¯$¹ú¾ŒÁljàZÆGvsrճʵ„Mr –)ò•gNë¬y®‘îiò wøëÆ)öç·N£Iå“«™‡€+ͳL®ÒH%ÁôEo1ª¿Å›Ü>¤›:Esq_ ` L™Ø¿a¢úVõ–/éä*q!±^™U¬¶ÆR{õKrU>RÐAûç¨åNûf7t9–°áØöÌEv²˜w—ŸJ8ë[øÊœ\õ{9 ëÑCL;uZ}½K-À…b¡t?nø÷É q& GI–ÉÕ+G#õ¬QÙ2BV.xqw€,„ÿf1ÜŠ²\bëÂxÝr·Að¦$»=,è åÊÖIó:ïâ.éÐÓ ¡¸¸Qïf/º¡â+'–é/ýEÎK[ìYš\ÝL¾@u*—L«˜\ű¢M ˜ªü9çâ8Öq=y‡±–íÁ­+—«#q%‘Ec¾ìùÆ$‡fªé"H,Áù·X=±,P梫ÁÂ/R=cF|Ÿ>–Iâ\èÞ çyÉ1ÍÃ,“«z>DMˆAa°²la£n[FG ¬ä,†­SäÓ¹ÚÓÌ"¹êv-a¬’~jOÑ­[ð3¢;»Áv‚ ï\Ì’iÒ£dÊЭüxpbN®n˜9_1Ê]J>Ìv¬¸Ãs)ãŮΠë.'D{Ve8~ˆ‚°_„F_Ê$W¯ð2šóùþšº–ší¥l:•äöQ¢Ë»Dkô…‡,`åw~ørÝ/º¢¿c}X ¼‡ñ¢â’䪞¬b~øæ%‚79ÌK¬kÔb¹-€ª1åXæ²óþíonú,?ÜfǹÄ;?üío?œÉÉêd~«rHŒw*@?^I +ÉÕ‘¿Q¼>?â 9¨k¦¬Æ•󪢇QZ–£<§7ÀCq‡ƒ/žôHí@û1[F@ K‰¡JsÒÆ»¦J®Î//ÒÜrTDZ( •\íË å ùàÙé ZŠ«ÖòȤksb É¡? yÔ6¿r^ÒæÉ(šØ)qÌ“&|"[[$Wq—2„œÓ ù”Û§Næ_| w̰ÅrÏX ”}ÿZÊ ã#~fm$Wå ûoeé1WêÔz¨XføŒü m€…õýÙʆ«SôYðŒt!’Ç.O©Ñqýr3̆öð>ïÆ =3°­¶š§\À’˜ÓØBª ø-’«ù+$¹ŠqIru³—¤Ž^$dÍ‹²×ëI)*›=E޵{œË¡ujªCÖܶ|VX Œô 3\eÁò:=KþÓIoø–2¹:¨³œ1U"d/ÌDz¯0ÿò¡0È$Þé­ìù]eé¨Áˆâʉ¥`¯brõÌ:Æô. íܦɲäðÈB0‰ trõòáp@KgcÕH'Þ£FZøK¼÷®ÁêÕ‚Ä?ÉÕì® _NÂÊ9NTŒ`ur•@Tö¯SGÄbŒM®¢I ¨“mϬ{ïú9ž”oSëHrÕî¹ý™C= WèäjQîI Vö9 ï­ƒXuJ—|¸ÑcÙ+rÂÇpìOò¶œ¡¦>ßË!§–ÉU9 U>ZA“«0­š]ü©ÎÉ6S:¹Z˜/s^T!eñµÄMŒœ?5ãëÇÎ!Ñ{&Ž}/Áå]ª»žºKç¸ä$ÄÃOO®ò.Ô*[±…õ”‘”šêLE`ÕœYãZ.¹*+y‹9—K®2ЃôÚ_OÙßÝ8QJ*¹ žßá£>ÈþrÊ|‰¥×—ÌÛŽYjod)6Å«&B êü•ÎTÖNGö¿s!­ðD´|¸lÃ_OV?+¸S¹äªØKH½ý©žˆb‘\}óGé–CQI®º¾'¬buû¬IoŠ@ =ÚŒLcÿzAí¿my•I®š¶ P=!GïˆhN®®Ÿœä‹‰Ã‹’\‡ë=r7NeP)cÀµã`l ‚ágÐ]_>º,<¹¼$¹ê û=)¹z6I³kÒÄOe3ƒvîݒ§՗-w¼k&Œ~ÇòÌ\Ì:=»Éƒ¸EÏeºs>U¯àƒ•Í9£™ó‡Óêëüá­‚xIRM­«g _9¾T’o?ÇéŒôYß`þx[HWÜòö¹d•Zt¿|$Âð ²Oˆã¯ˆ. Ö¸Êé6Óà’dKöîß8_°b$$"ÀaÚŒ¯,“«’ü<²PÖ–ßHÝ%ûxŒ|S’«C_)M®ÊbÛC4»`•‹Zm­Òųê#“'}yé`(&&Sy‡¾‚@ô$su.I¯¼(;LÆ"¹zV'WåK"l6äå§%WÕFå:›W°zÌé¨AE¹Ç/A2Œ”ϬŸC}v­Î_kŸáß\o¾­çRâgQ& ½ã â_+“\-.¦1ÄB‰£ß–¬.gˆOü K—ï’¾1 ¸+ïIùäjÊ. Ëäêƒ[×ô ˜1öuntS6eõª®¢Í ÁØé“X%d #Aw²}¥Ê%`²ý ÚY%Wç«Õ%eòÃ:¹*g\FöÓÉUtJÉ2ëÌ¿¹úrm>#ûáýÛ˜˜ö pBà$;;¿-ܬvQ§™#æä*q”ÚWeØž«2?êáäv#u7^˜;D×È&!– R: ÙÞ,™Ê«–;B§ÉžUõ9‘sÜû×Ë&W3Ð*9XÇ"¹ª÷Þ$Þ æÔ\Ôõ¬x:×?›“«{çbopíXª6¶›äªÚ]]d‡v7Fà\/%ƒ¦ô¹H”)K½*&W/e©=ü²wYFx_$F VrÉVc¥ÉÕËd®uÎqÙÈÅñW0!Ñ8š½³ê'=Ýß}aËÈ~=Î뀭AA¸×²ƒ³Ì¡çß¡AsrU>÷ÿŽ0 º3¼J÷m,ÉU‹ù*ü¬ÖÊI÷õpµÊCbo$¦¨ëòÁ0¤u…d‡JÆwˆ]MØ>#'TïõðîåÒä*æ2Õ +\0³´Ž‚•NZ§(”ûPJìè?e¯r»{%2‰ trU¯m¼‘±ßr¶­‘\Í hQ³’ÚK¶/1Øäí²Q­û'¥Õ­•áߌ`(–ŸQY\ - Mà]JÅ‘-×»VJrÕ¯ ؆K± =kZ>s~G’«'—E!O½i*µCû¿H×â|÷ËbO‹ä*´&GX–| TÉÕPµp£…Þ+†”ÝíB»éo+÷‹.>9Ó)µö\LODT·ð4Ã+Û?>¹ŠŽ$´‹&Yå‡÷Õód`hÿ<šEȰ¾ž„1×ÕÇ!°¸$¹*Ÿw ?‘–ζz@TN …¨OÛué2mÀ¾TRº’åN¡p>Ä‚ñÒßr ðwŒq9è>(•yÿ¥ÉUj×á–ZK&Û†O­«çHr•àpVCc“CÙÑeñ@9ýÍõÏDà–Ó€õdoµc€9¹*›T/새Ô.î±Å*1R K¥ðòž¥ÉÕÂé‘ó°¸0·cà“ï—™¹j\?™\¥ÆËžËV ß7ø_-®ÿ&Ws=ºrlŽm½?¾üÌ3ϼð»jÝfì»ôsÒ•²ü«¾Xi¢éîãعkWÞ¡eÉž•õ;ã3hQöQ<ù–]Â¥˜¶>–¿_’NQÉÕ¦:¹z:²T@\ c3¶’ÅwgLxpù ãöÑ?˜\-wÉnSjÃÀúüÊœPk ƉWf@+Æ­ø#Ü7ýÌä*îFïø­’«µô‚_¼¡œ}%WÚ2F@Ÿj-kE}üÜ:“(GOFög(Wn‡:Ëä*ÈRßœ£zQ€:Bú Ë oþÉÕ\‰ºodì³L®Â·°½öP·òc)ðŒÈ¤Ù.F’«/3P¢ñVå’«™‡pdz}¢9¹ŠÖôDòлn<#™Ç5¸(/…"·ì`+Š*—\Ń+Ê ¼j¨5?„Ë<ØàÎWã×#FTz0®Åþƒ¬]Í:Dø!k²d ÿÉA y !K<,ÉÕÉ8bÆêh’WÒ¦Ö‹ù-”“—¿´?½3Ò|0F³”ØÍìc¨CmÝYf0N,'RµÊL¾ÝË[îŸäFö%)=¸¸˜°Þ1.“}Gý7gìØ çJø6æ28¼˜4þC|.=•̼ýó¸QÜ+aäÀA)mZrIz™]Ü%¹êô]“ŤCrdÈ‹¼Rx"ZæÈEöÍ ·Q=\ÓÉÕó;faêé¥CayËäèŸ[yqò ¨A#±rS;§K†<²Ÿ^šG¨£ÇÚ |,?î×/L®vûYÉÕèaX Á-‡ì0^H÷kœôÃ:¹ *GÃ’3qÿD'‹â†½öVL³È7…Í“õ¬Âàœ=TÆ OÂuu¼|_pú-¸eŒ/3ºË¾Î»XÞ …ÐËXžŽÏiD³ÛÊÒ9ÇNòXÅäª:¹«ñA„»ê¬Þ%D˜æäꅌˇÂÍÉÕH;9]Ý»æÝ›\’\ý®ädp¹.Gh²ÓÚèwôuzWç$·JŒßÕÜO M¡tÑÔ œ…Bô”¤Ùý;ê’çÀ°Îxï™\ÿ|æq›Ö–»îœO;½ÄE#+J0’«€œQ•μ寴غV’«+dGÇ_1rg`E¸~~Ç,\¥ýrÀ“˲×ôƒ{-¨M†«W\«^¬’«q²»È[”†yW¯ïCÈr&ÅøË'WÓTruÄ›÷N®öPŽª¿—5¯£ìqçþ‰ ]g5d8yùH$|(ÉU‹éˆ8{zr8Éw„­S-’«³t¶Š±dêÔz²=ø&\•à[¦è­‰eå³ÔR‡‚5®ÀƒàüÎ…´Ë‡#TfìYuzmsruè«rÎÝ­«ˆÇ'0·ÒdŽ–Ìø2’«ô(yÒç2%Ìâ E™äªìÏù‚Îø6¸EŽ2õûsÖ«Z&WAˆ,*œ×Ôé?Q1ãAà‡õ™\ÿ>6¹z~‡¼š:¥Îµ¤mpˆ>0åâþ`Ëä* ÕÃFÉŽZlün¶ý’ä*ȱœ` ò¢ñªêð¦&’\-k³ô‹qЬ¹Û¨wÍÕ+8trq%«Ž¨9±µÔ€º;’ɳ¾Ó‡Uå)6Ã{¦û4R3N¿Âë]ØáCK²C»KŠøNy'®––xBn0³erù_Øé$¹:ã”~S}}c ++¦cÕŽâõ-“«Ð Özn³7vA€öd#/eTirõ®cÿ‚̲Vû'¨ I­&‘öž¹2¯,Â6Áé-ãü;(HöÆ—äj¸9¹êU—¡“«töÆ<Ÿ–\P °Irµ¸iç†÷ÆÐôAú°º&[è[åãyÈ5éá3Ì–Ú]–·,B!¨Ø"¹Z2¢WIã„Ñ¿ÇÊî]Í·| ÷ó©˜\%ö&Œ—tJú>b'\-ŒYu-q“ú ù»ÜÈþ‰cþ Ûh€—ìÏ©\ÆçfÆ[ã äÈyUKì1y„@tSOS/M®n"_Q#ûñÑWéWf»g1F  ã…ݰ‡ÞÈr±~Y–Tïð!’),Iu^OÙiÞíßáEù" :('hWX5#ÉUêù›Ä é­1[sruZ}\ŒJ®a¿²^^%W%8üu™2ÖãÿAr•p%ï©Ì[p¨oÁ*Ù¡"÷1G‹""]”&W—»hâ%ž”Edã?€]‹-V2%ë0>‚Ÿ?k¤ ï]=£wDÇ´µês#úÜÊ‹E :¤ {a—/ÊÕæ ¯ÉUÜê¼¶¥ÁX(>Ѩ—_!NлŽKruµA|·N®fø·(<myrkqirõ9tt=yC¹rA²$WÕfÔÆ‚•Îj#q5ßûZÙ}cŠ‹ÒTZHên˜P2®ïÓ٤­Ý/Xá¤q…ÄÔ ÅŸ^1GÅîÞ„·Ñ”ìLîñeiÒõç]øAM’Ì,I®¶ÁÛúÐbu4¬…Z!:ÃØF½X†v²šL%WÑ‘¨U6r¹Î0–FÂ’\Ýì?@ž2I»$¹Š«•U–‹Mb0+g­^?w3ç(îõFê. ••·ÁÓ½"qaJz“Œù#À JÁÖäÐIméÅ@Ô•ãQúÐLºF!øF Úüe÷‘o&{V¶œ¥ÌÃâ‚åàÅŽ2CX<»ùÓ§˜8óêí ”¤|rµB ð¿z!R\•Éæe{}–·$W§×BÆIšâI#û©üü»“«rÜøŒäª,ÉYêÀh…‡Q«–zâñK’«w%¹êƒŽÒf|%ÉÕOÚÞ@¾ö† $%¹j±Ç£åõw'W?óßóozÍ=xýÇܣǫ¨_«.É;ûãíY‘{õ_¿\˜™ñ㽈eûžtÿ³9Çf]ýÁ´ëðeŠ=àPðãÃÓ µ;sŽN½òCÊž#_–ÖxL×X}ù™Ë?ÞòŠÐ%ï·I{X”_ËO•¨ÜünÏ,©ñ³y±«ï<ܲfÿ¿^bO¸þc“«÷O/höê3/Uï7-|i„}Ýמyñ«Ùi÷ŸúVñ½ 1 ¬ß}æ™§&WOïÐ3´/Ó由뙖ÉÕ»…ù¹‹ªJn÷JÌz‘M&urU}‘¹–°þòA92›0õvA‚äF¼‘êU½øg'W!œtŸ†?™\.ÚìE-ðpÎün„é~MÀEP=ƒYÜ–^Kûs“«);3ý›«äê cOÉ¢~éñ9c– ù«œñÇš (sN+NÙ£{ÑÙèÕ»&#ËFVL®Þ9Ÿª·V£ÍŒMŒÅ›_òôäê­Ó1V‹ä*LNìª1¡,œ2W¦®Mü vÅÿ…"" •\­T&¹úè!a ‚(ÈH®âÂl™J’«·)DÉÄùè‘qVf`»ŠÉÕ‚ÕcR§Õ¿°wNvH×Ì9m$¹jÚ¢wp½rlq¼ÓÛFrõV^Ìå#‘êCÞû²·RÆ•\}Êïô[œÁ›^C9ÄlÄ]²—û—èQ‘0ÝÌ_átåX”^å¤ÏÊ .³‚¨Iv¼wü`äj…UW´Ð4î¯úYéHd„ 2 ¶Äû?¸u5]Rèo—I®Ä3¦V{>«‡Ÿ²©ôH‚d¾å°×’&~j$WQ4KKúÝb&Õís)’ý›ù ¯[NÓÉU"«qkãÞÂË–¼{æ€\Å ç/®“«ø}~¦‘˜šB€fe’«AÛÊ¢i¯Ä ²ß…j]P›*?² ržœ\-®˜å +<±´âì‘â²ÉU½[Nx¯ÓQƒ0XIFÙ¦ÍúN?¬“«häâ¾@à£N-?½xpNXwÙˆuõh‚´ŠgáÑßs›&ëcø=¸K]'ùH0Cªß%RUKxš#RË‘x±:â¨9EÅôôìwÙîÕþù ßFé’qê$Ô±ïO®ž^bŸÞKOÿNpzëüö™e“«¯ßο|(¬Lrurí´EC%¹êU`ÕH®žßé“í¨–¢××ÉUˆz¹‘y@¦{­ÃÐR'Wó–9ò¢N®ÊÆs ³eÚ˜œ²÷LR’«jiÊ—CÒí_ †¦ VŽº »\0’«pfÁš±rhà¨ßÁç&·e³ý‡÷ϬŸàü[Úöd/ccsÁµºˆ|NÝ­’«½*&W B¦šh-Û/€T&{ªË^=¥ÉU\˜‘Aþô ùcàå›—„ÈFÎo?=¹zSJ˜t­d¼ì ¯ÄraO€xÒQ¿W´}“^âžÊ¼žy5©v¬t&‘òÂzHªA–ÞWåõÌ 3R¶Ì“5۪Ȇ±þÍ©"Ñå]øY’«.ï"[•Ú]ŸkPš\½[D-1jÆ;mK›VL>¨Ïâ²¹ëÌoÏï˜*Œ?6¹Š @õðV‰r3ZHrõÔ ¨^¢Ù±ï¡&Hô‚«ý9,“«:%؆:Û´›N®bÂçÊ&WaNX4;´(Êðm\š\UkÕõâb|%ªÁÖx˜’õv[å’«‹”ŒíµQ:¼§“«È_Ç0”S~6Wq1T){øøuÜØR¦Ö“É¢[§à€°5¸åþÍ‹„ôåÒÁPËäª|a°¡SOwüƒ—N®ÊôÿX1¶)¶?­Þcç¤ÁØú»iÜô”~Åÿ5ðÈœÛVo„Ž£)ÙJð–‡û–]#^ä*Œ1/r—TÕ&Ïd÷Oq7ÒöR,〪x@2Þ ¢>MA· ô*'sr5¸“l`ÐT$Kë ÀCžPŸþ7äåØ1É^çIÌ–¿l(†©§×>=¹Š@@Ψܮ§æäê˜?wà0cÿî Ùõâû×ÎʱŒYeö¼Âlq4øb<aè¤#>%kTY&LºÂ¥h £ŒV-à-YÛâ]³ðfÝÍÉURªäªœÙ!KË7{Ï AZ+Ó›à1Êì+i7 jU¨~éÊÑÅòEC’«³Ãbt÷Á!zZ2€¹‘¶GV]Ü¥“«ù+@µ‘\}PtE9ëJzÕ€ìÀÅ[&We+ª}óˆ KŽ8­¿¼Èá_Ç¢²KbЇ5ãñJDÈD${Y3HœÓ]YÍèòqÉU'P­Ž‡Xø è²1MK’«ÓêÃ{0³ÚÈ˹\rõÙ«þ”äKrŒÿàEéËã“«7.*Qš\…x‰¡â•\ÝlŒ•à7ºLHiN®¦Jr•háÓYæÓ“«‹ªS}Ÿ×'>¹Ár‚xxTü©b7tÒ×ß\}nü†Ókâ^ÏÂŽ­Úþ‚úõgo>ºÜnrÉ_=m}øhmÄ–'ÝÎ}·ë¥N®ÙñB™b·¶ÏþñAÆñ7;v9]ü!výÎ+Ôø«¹Yy®t4—¼ù«÷o«¥Æ¿ýíÞ½‡×»?<ܾdÛ¿^bO¸þS“«wbǼÿÌ+Í¢Îê壋ë;¿ñÌ;v‡Ë:J¯¢}}Þ~Æüï©ÉÕÜ=azçy"0\a±N®Ž~W&'”ÚÝKÙØ,Ôù—·/Ì“mŸUróÏ ·9»qAã\F—jçÃŽ²GüsˆÑÌTée>¥=î*Xí‚!²Å5Àüz}.wˆ?eçÕ°P1ô®J¥ÉÕüØœPkL|+©¹%£ï\/jàp™…«¦”@†j пàˆ$ñ†Ääø)•½üœ±6n:+¸³ErÕ™AGùäê½¢«qëÌÉÕ¨Áp²F<»wÒý«) /êOÉ?‘\Íϋ̠ƒ°Ääö‘^ï“àò.ô®8Œ(ó–Ø]9º(yÒç é ÃíŸg`¢šµà¹\r5ikæ\¢Êÿù9ÉUÀ@ØwÈfD¬Ö–O®N©Å˜"{~9ãr½ÑÑÍì£8ý‹{ñ¤ÆÂ%‚ºpqwcÉ¥î"H0'WǽOØ/Kà ùæu8»Î f‰ÌÉÕI_Èi/Óëã€@Úµøõ+G ÉNP²¢¤ÌÁ¾ ™Õá>u(FVL®^Y%Ë=Ìg”‡N uO-ŸA)4¸brõöºË l¯“«D–ÉUFsHøM#C›Q¿—=ýšªM3ú¤xU?»ÉÉÈ÷衯R”$Ø-æ;1²F,9ó»]ß ;U®v1’«²†nØkFr•¦ðÄ2srõlñ0ÖwëtŒN®Òl".ý…Ê kF¾X±er•bQÁÅ=j¿åbB&ônN®ú·°Ü¡‘Ÿ/4RÑ]F’Ý(¸brUö^X<†atÈòFƽa¬þ"[ÇŽÉÊ.*É.KÔé]³…e´\&¹zOlÒŒ+‰+®%n~úSrú,õy×É,Dœ ¤/ìô#î%ŠÃ¨õÈfûjK4”%{äf|Rr57¢Ïé(;=ãZÖÂïö7'W=«‚aˆ/í›g'£]¯ziQÃ3Õ¶Ï@´4¹ºc‘0vDÕ:¹Ê0–xžÒ$ÜZãj$W VŒÔÛoÊ–•å’«»ýeøøLcÿŠêåt•\Mpþ]¦: Ó&3ó§‘\Í:¬·/–ðx–œÛçøª¦uîy‘¬›súíc7­-Vë¡xWïÀ/›‡„ë#ì_ÅèÎmñÖeÍÉU†ü#ß4ÄHß³‚:Éj2¿&²…àèw®_ʈ›Ÿ¡D„ ¯Ê$‡ \1ö Y¼ùÚc’«r.ØõˇÂäàõ1Â4deÙèw2¹Êh=ïq¬ÃK¼"ÇX_;#Z¦7= &TâÝtI®2¤#’\µèµ {]þHãõãM®Ê§ uv›N®bŒªô·HP'œT¹ä*ÿË’dÏ*g7¸ÓM©`͘¤ñR8¯`§2;wøë¸'°¡÷¨ÑÝÌ>,§Œù#5¢ñ+'–ÿŒä*…C8`P2ÓþYùر |¨¬œÆAݵ¤­æl§Z'ˆâh¶yqåˆ7Å!.±ÏšÛV¯\¾°; (/æôºI¹›gVL®Ƭ–)Noñ:,ª’«ÑÊ¿&g£DØ@8²aEÙÍÌ‹-’«ú,fã>dˆqI0àßB>œÿ¨Lذf ð7ù‘M6Î&é‰:¹zaO€8¥J–ÔBÊ%Wñà©êœ qF2Q§Ž^Bßò'íÄ•®'ë‰ÌKqQ—±3€N®ÂŸ¨ÀX‹-‡{]²v/a :éW1¹ AQüˆ7d]ü¨wS¦ÔIñ®%„6§µ öèb='€dFõÙaÝõºo`†rrŸùäÒÉÕ¬Àv´G’«Qv _Àÿ¸ÁÐÒ©çÜ9—*Çü…õ$`L¦¡ºUzzrÛ1¦—Óñó[§ÊB¹˜U7Ò÷ x‚;Ónjbo1|8 “‘ée“«êØ>Y¤<ó[ê šÞÀ¨W'W cWŸY3  ý({³$W£/!ê§&Wo>õË’«jM“Ìo\íRñË>Ì#§ •M®Â6²ÂÂýShƤxUÃUÉá [ÅØ-×ÉÕG²_³éfæ!â7pýBõGrU¾wOø˜®Á´ÄBø&ZzoI,}¦lrUv!ñkqL–uÉáby ‚hƒìÅQ’\¥#zçÒäjÆ~ äNHrU¯ÅS{h—$Wo2úÀ×ࡌäjþJç´i KÈ\G9ºÐ[ÿÁN4O}ÓOÄ-–ÉÕT¯ø/TfiR’½¦ç´ÆöùÆ:¼€´\׆©@5X’™Që'˜7õº{SçT%9){[U–äêÕ`ŸèúÞUµ  VüÆZñ”“ÚÊoöK/#¹WìkN®ªAtÅ䪸ªPkÌSOr¾¸/d&=zø@æ¯Ýéä*ê“tëòá(E’«êøéb•\%=¿}:á´ÎÀ Ó ;f©Ï-d”ýÔäê#YgÚ(Ã÷û‹{æÊÆAQƒ/îzì“wrõ™ñþM¯‰{=Tªó9õë+s3OÿP4Úw“þë >I‰?Üõ Üô¤ûϸïv¹ôÃɵ;ž+SìÖv*¹ú†qg®‘*¹úücj”äj‡ÉúÉÍõUr•_ÈÈ.¾n?sã¿^D?ïúM®>Èò­òÌ3 "Ï>*¹S¸®ù‹ÏTrO¼ó¤WŠï\<™•°°ù+OI®®^³æÄ’Iq®r'Lk˜h´l\FzZêîűNo§lž“‘‘ž‘™É•vlkbP¯ø‰UM ‡¤ÇìÓ7ÓcÄOª® ¦pûÄ€N¦ƒã'׎òŠ)´_Úáõ 3›ðsüÔor~òJ;±3Á»~Ê–À§²)Ñ¿C¼GuþÊ‹Gƒ§Æ3ÊLÙ± ~ÊW1/Ç {#Îå½9×÷)0aF£´£›SwEšÂ%ø¶Ž÷¬0嫤Èá ~mcGþ6íÔÞĹ]M¡ýãÝ+§ì·ldzr½=ʈoCú¤'OO5Qš0ö¤jñžrˆXÜØ’W{§›N%ú·O^7ƒ†=F G6#yÑEZrÜè?èI ±.Ž÷ª'7iù¶ú•²=,n쇱C_M7ÅÄ»}cÿeÄfÄ{×þfRôøô¤8Ãf6÷ªkLG¤I)k§%Lùš¾$ÌjfZ0ƒ2Eux9vÔLóû¢kÓ¼îè"nôŸhvzR¬¹¨£[€ýÕ—ÜÌHKI ·§(¥ÓPtdŠtD IËÝS¢FÆûÍ"SHU{äþT;â- ˜vr7 K=¸&uÿ ô’´bbÒRWDúx‹V¥ß«f€ˆ]ÌnŸèÓ")l€)¨‡i®Uú±-)¡6i;æón¬ãkØ ¨0¤þ“‚{&¯ò´xH†dÊ€?%1iít)6áXâ¼î±ÃØ z1Û€ ¸‚F" $Ìëü ù¸’7ø&÷Žqx‰¦Ò}Spoú•¼Þ§Ú—‘’Xþ7ÛŦ¤E#飚)Ü!Îù.²qvâœÎ±Î¿ý'h-~ÜG±#ßJëÏc¥áð@ D‘8³Iü˜¿ˆNížÌñž53 HÝ»4y½¤—Ü«\|Z$† ŒóWº&-_1‰†Ñ~ÊT0õкäån´Á`žp¯q2¨_´ïॴCë ÌÒSˆ­ØõÎnÛ¤lš%/uIŠÅ}„/ø‡câePêd“ýËöð$}ä­¸1ïÉc'v¤\ _ÅŽx@¤ ³šCV#=ö`êÞe˜i±“ÂØ°Ùµ§" IÙ “´`ÛÇðpZrú‘HI\†f×Ù’ñƒvhMO<©îo'1C_uúÊ5Ã#áx<$0½!-oðMZ†6)‘¦l›oðÎ…Ú‰!õŠþå\Á?é%¾ÆÒ‚""®Ô=Q蔶Ѩl§­š®ˆ`x׿‚Š ]-öÀ–“ /õŒÉñxdô%|èÛÝ.!"âdÏZøJ‰&RÆËéiiIq¦h7‚œ´Ãä™Ô¤´ƒ«M¸?"OÏš S1pGÚ iK)Uk쟲}>Îïœí¦h9YìqvÛ´˜ý´ýi Óƒ›—š’’$ÞèŠ×M2¢vHƒ¶á°P¨*óû Ê” ¾F³MÊ*5ðWÈ8œ T˜mzCp¨„œš²{qœÛ'ü*N"šX•ˆ”¶á˜L¡aHaišÚ³˜ O5A,BeÖI %Îë‘„¹Ï`ì‡â¸‡½Žg‘(Ä&=f?q‘|"Ù˜AàŽy–Õéc/Ó´oSw„tôw_8#Â-x ªÁé gÂØ6CÇ®nŸ`Àù%oJ”Ö 2r÷JIÙ £’yÖ@N 5± ŽOâm\\ mœß¡¨ þÑìÐþ`¬˜¤µQ§ŸÚK8¿/ÞD¶› Xžë,¯T“„Ž£ÿ˜´Ð1íÐZœFwéòåŠ Ÿ¿?¹:aã¿éå±ÏãêÇVïx®äW÷‹?^MK¬æ½éy¯ýS_Ψêñäûî;zçÿpæØá×Ý-‹ÝÖ.çÇ™Çß0îLÜ-ÉÕ »ž¯Pã+ó²òvðÖOn©òþmýâ¤=CùCfJÃY[ž›°éå)»,=YÅë_-®'_OJ®þ¢ÿÿK®í·}ë™_÷Ø{øsû˜ãŸy¥Ý¶ë?ñî_{Jruë¶miëg˜ÆË´¨”é_§uÎÛ0¹èæõ‹±ãGýþì𢢢[êß•ôÃ9‹íSg|}z•때£×/žææµ3©IU$Hú*÷3Ãzå,ž2µ¾|c]2ôJÚÁTß&„Çi³›ݼõóþ]+HMõýù£ËžòLnôÈ숾g÷ÌË]À&}N[“ÛG™¡=O¯C\š9àæÕ‹×ò“’½älÜìÈAWO'ðVaæñÌÐ)Sêò×Üå£"G\=Ÿk”yáÄ*ê•MþIù“Ì¡šôeþ&oÄBß/Ƭ§ð¬ˆ¾üš2­~þÆÉY zÇ;ÿŽÖžÝáwvW7/Ƭ³l$µœ?¶LV3Ù=‡4n\Ì»u«(#¨s¬ý I“*'M®.3ô&}Y°ÝçÆå3™ó»ŸÝ7ÿfá…Š-Ì>Åëç,(ºq•†é¡Y’ûgi¾Ï‰âs‡!+©L>Aò4Éä&L©(}nû”i èTÎG£À¢¢ç/Î ïcr«ÄóÙ ûfÇ\8¹&#¤[F`Gê’Æ_»’ì];kMväÀKñ[2æuLóç4ߦÉSê虫&÷Ïr–ÊÑ´¨À4áÓ Ç¢ 6NNò¬šÜårÒî+釲Âm„iÂÇ7o\-Óôƒˆ1=¨ë…“«ó7O%fæ­¬Ðg¶Î¤ jÌ ë2ãÛ„±ïg-°½š—ˆ èH¨wåÜñå.w>½Òå²igÎRG–o  –U\?›N¯O¯Çcyk'ð@9‘ì˜0úÝ‚­3ÁgòäÙ d†tÓ/÷/ufÃ8Ç× ¶Î¸yýоs5'i$O1'WSg~—µ°¿iJý˜a ç7Ya½rWŒJšøù™þñNo¡Ú‰Ð(Å;¿½Øîú…\C³ ©Àí™Ý7®œ3Ãæúúˆ^Å¥¸M £ÞÉßà™½hPÁ6ŸTߦqÃßISm’§}-µÏøöü±èÓ+FSòµ3i×Ïf¤L­w9eÿ%ÓNšqfg@þ¦) := „¯cÿz%ã˜1‘ ]§ù5£dŒ‚îƒ~Í[ïq)Q–à¥Îü¶0'Öùƒ S}çmò6äÀ¿´Ù-Î]z£ð|E¹Ý¼vùìþ0ºFg¡ÙžîøòÜe#¨.Ë´Ó«ÇbS´ª¹qå|¢š¡ °—œ%Cä„\·JXDN”ƒL—ŠYOï®d¸˜°={¹ËEÓ.³ô²Nä­u/Øî+¾q-o[œÚN6w¥ËÙ½Á`ŒbǽO#Æü™5mNÛ" (‚"jî.ÆmÂx‘s’g5‘’[%d˜½h0H¾”°»|Fô-×Á4¿æ§WE¿ô"eJmD]t½ðüáE‰ã>Lh7ìu:X°e:03F—±žu’EÈI¿¸œ¼÷Ú™t€°zŠÒi†˜Oê³{CâG½“90w•kÞº WR÷¥û·ˆötílúÅSkSf|ƒy^Œß\Ú5ãã~›àòÇÄñæD@w—Söaþ°YêŒoNá¶½ÐrŒÀ\JÜNò6x¦ÏiCKÒç¶SY5™lþÈ’ëç³Á-Å¢µŠ*¾”¼7-´W¼ËŸxý–8ˆ#T'I§‘oJ™ë=n\*P÷Áÿ’8ö}˜Y¿{ý|Nì°×°4ÿ–rÏð7Îî Í[ç;ô˜üšŸ$Ͷ-¤ÄqèV¡P ARt«ˆ?¾*Þémµoçg £ßI›ÝŒ]ßË]1šgn\ÊÏßèQódjZž^¿ WcjzÏ«ðõs™7¯_ÕëðhØ;hÇ`yŒŸQ™eÇÏí ItýKƼNWÒݼqò³#úéºÎn›™4¡®$+¢ß™³y7#´GzhïüÝAÈ\f M®~­ @ü5gÙ0H€¦bãgvø%{T0*âÊ ±Î^lŸìYCà™¼uý‚Žh!¼gà*#¸kÁv?z#Gzý5ͯé™=óDÈr‘4’äQu+Túwƒ› È᩵歼‡¼œäU3ÞÅœ¤êWÎZ¾…KÅܼ^hÜÁ¡ÁãÿÜu“ð#x7⇸¿F•—M»2WŒÍÜ8Àç­Ÿ6è/ŒmšømàY¦=¹zö";ü –«f®þÏÙ]sÒçuƦð–Ç|h*ú g÷eY¡AXCëjnl‰ÍIæqïó+¨¸”° &I÷oI³ã]ÿbd¡‰R}äS)2ü8¾’žNàѨcÇ \8¶œ¨)Å«¦yÚaD¿«¹ñØ|•äQ5'jñ’ØE7 Iîã£á.`‰ö¯å'ßR1 VfšøYÒä7¯]"L¢R WaØ3€ö‰•çö‡ì—¦#¹*QÞ`Ðå¸fÄÛ$Mú"7z’§pˆÞËŽ²Ïß2ÅÔÑ‘¢›7ÄX†¼|vw`ꬆbkžÕð–²å1ÔÄcÔB®Í€üÓü[ç®vK h‹.ÎìžKw |í$HÈß< /ƒáD„(2Žb¹g÷/uðg²o3Ó¤ÊqŽ¿‚^hê•Ì0*rÐáESÿ;³kÔ“pe†v¢p2„¦åVª ÅŠ ÿüñf[Ž)öôZ÷̰޲´ÛGt3eÆ×…Ù±–ïž;¾*oóôÜh' \˜“PdTŒ/¸˜°-Å·)í¤›˜!º”Užñkga_rçeŸ“Ó2oýHoegewöÝòÔû›ß^˜}èÖܽw1½Š§.d[{I®žøµQˤ=²-ÀÆÝ/T¨ñÕyÙy ;NÑOnm ÉUó‹ÏO944æjÞìƒ{wN$¥}5å_-®'_ÿ¡ÉÕë[Û¼üÌ»G‹Œ;wÆøÌ3ß®¼ü%Wg.œë5jvÿ:³º}0wX‹y.]Ì·j×ÉÅ‘á~}ª/ ò]µ;fõžØèµ[G„Î÷ttî6Ý…¿.^Îýåë·ØÇ»óF[Eø{Oè?ò9ŽÍ}z|<ßËqiôŠ@§>=?¥X]ÎϹ–oÜÅ[‹=å™Ð)#ç{ œê="h¼íÛ“ŸÑŠ»—­Z·tùʹ#Z/ð¿|ãN£@jY´ ØÏ¶ê,ëC§ŒX±e?7ƒÝû#ÿA_ùþ†¦ÎÒ4|öä[¹õYìË+;»lõFú»0pæª'üúÕžÕíC>ghÓÀQ…ÎEY‘A¾óÆXÓ )³û'ËV­Ÿ= ψ^\ºÎÖÒ·×󽆮Úu*2dö|; ñíõ9r[¶zÃâð q½ƒÆÛè'Wî8&"õtñ°[¼0|Þ˜î³ûÕBžs‡·¢XŸîûÛ}ê=\Äë=‚îð:" tj?oL·%Ë¢—­X3ßc0½æ±U;[vgÅ–a³½æ¹F8á~“(jÎÐfá¾î ç͚ݿn°ûÚÃßÞ•ƒ'ô‹^·-ÜÏc–õG¾6•©—Ð8ŠXºlùüÉC}z|2ϵ;0÷X¦Š»QÓ‚YãiÉ‚™cøº—)êCÅ”ŒÆ†6¥Æ q6´¶¢ðç:µGMáþ“^D¯Ù„ üí¿£v-áàñ¶Ú‚üúÕ¡Sì. œ²†4žï9$À¡ eE§¨kù’ÝrOÏÏC&Š˜3¸ê›H>tª“OÏÏx2jñ"¿¾5imˆ‡}D€·²¬OÁú{b³#Û-^6m4¸¥×+6ï ÚŒ^/Y²„f€$*˜Ý¯6 êNÑk·bÔ‰´Ð¶*V°0ÈgÁLWø2 ÷÷ÂãÌÖÂǺ8Y8o&ræO€_ÿµ¤Çaæy.Ý´QØ?{@}!1×"„)#Ûì`ØTY¹ípPôöeÛÌˆŠ ‡¬h-UØ}·|Ý6Jóë_›;”CHŒ¶E-Sh¿¥êÍŸƒ–ƒÆtÇšVî<¾Àw"$inϲå΢°y`@ÂÀŽÍp7(H¼)DAbÑþ“/𢩠BÈôtþdGðC/xfÎÐ&Án}ágJ@ét$Tšgà `Ãut™Ÿ ¾xáÜéÒ÷M{ ®Iƒ`r~Ðê0.€•ÁŸ Žv¢hïÊ…¶#.˜­Ü[´RZµ£ÔŽ… æ£øëJs†·¢=³}ã×·b§Þ%K—†Lu ñõÆ´lpÁ“XšEtÜÄZ¹CƒÎó‘fôúba°@&`R›<ä¶pî4ä ¶¿j½Ñ}ØÂ¦Áé„Ïö€„é…ÿÀ¯B§"8±l¼8ýÁßò ”ÞGwÁéëŽsÁQ˜tƒ‚É¡ h„p…†azÈ„P“:WˆbÅj(ˆXˆ684Fìü ½x”¾(,(lÆX‘O° ,º ž§Ëó=?';qƈÏÂÇAb–a³ô;·úN$æ,aÕ9Xªþ„¿èâmáó2a§÷ü#0@• ÅaÔ^Ø5<™ P¬;<ü8uœÿ "êš‹ÌÁɦ½**kÁ3˜*¿£cªÁ_ë¨tA¿„¸«µ©…X4lÖxjÄv$prl•QJ ›9à…¸4ì¸Ð#˜ÁÒyLû†P©/†“‚4®»N­.‰À…®tÕ.Áð¼±= æ<ßÃÍÒwü&V àI¢ßÅŠ)Ÿ"+j47@ž T(3KèE¨É¯o lоÐýLè§åw£#`‘jhjý Âahàg+Áæl¥ î€"ô.&Ö¿8GƒØîÚ#ƒý dœ”¥ï~ìžÁƒ&"ü>C < Ed‹èVn=„1¢roF"ÿPïaâàFu¨æûÛ£qþ„)áÇ5WH¼í¬ZÏ„ŒÝíÜ‘mTôúí ×€À©ó$z§PA ,0 ÁPD¯ÙˆuøöüLÜ®Qȼ9ð9<ƒýªI‘Ò‚àr ^µûÔ²5›€"‘ÿ²•k°Znö,¡s\€œ;ª7^¡:˜~ ð0Úðô‹>†L@6}4Ì@À œPv¡Ãxètî°–ÄðŽøˆ"v\€¶/C’?ó‚ê1 '†4^¾i·Y§äŒÕcgl§@íp"+14uëæ{ Ç,DC“¤ÁQQDSðª„üÅMgȆk@Î2E}sçG,Ýz”ö€uÐ%Ø~GÌÁŒb‚Ýl‰ žx£>s³7ïƒZa`=7-ÉP¸ˆ@Qh'%)‚…a ,>F °ûö¦/\øb\°Ák¬Ðãš’Ž`³2RDŠK…L%îñôµŠÒ?•B†4¡Þåëw ,ÀÚWl=4®ñC9 ·`J¥àßyŒÁH’ü¢K9‚ÛŸÂ{WKà•ˆöB,-Ô/‰^Nªé qaJt #‚Žôàzo²dé‰f¸âèšÐænåY¦:SÆ¡ O â"á®Q}ŽÐò“Z‹Bud‚6—DE![Ì-!ó1ÛüÝÉÕ<6ÿ÷ú¿}ý§&W·èäê­Òäjü?%¹ú]ßÉUZ®Ü¨Û—ßu¬Ú¬wÕ}k´ZÇfJÍ®®•¿ïZ³“SÛ©um§Öê:¶fgçêmìx zû¡5­F×ì2†ûµ{zTiÒãËï:ÉÍΣªµT½Í`ʩܰsõ¶öµ¬Ýª6ïS¹¡Uµ–ýu9?çªÓ˳j‹>5»¸<å™êí¸x¦z[‡j­úS~•¦½«µ±«Þa˜TÝΡŽw]›)Ü—_ÛØÕî1QZÛݽZëUšõæ¯5: «ÒÚ®v/O£ÌZ]ÆHku«Ü¨+}çªÒ´'ªÒ¤g-ëñRWû¡tªj3›ªM{Õè8‚Ÿy²N¯ÉÒæÞ^U›ÛTk5 Vw·ÒŽôöFJRòi7¤NoyùTþÞªJcë*»#dU£ãp^¯Öj 敊¥ñ¼^³ÓHô¢4ÕI)Ë] ú‚šBíîè‚þÖî>¡J#kž‘ÇZôu|oEkKf;E´ÙÖŽ6Wþ¾Kµ6ƒ©‚Ò~š¡Ÿ¤XJñ¶L/ªµìGÕè¥js[Š¥ýWéZ[{ú‚ô¨Wmѽ#jÄ.jÒƒf—ëQ «ÑUÛØÓø†S}©i5Š ±!ôX¥i/Ú='!ºLäÿFݨEPåË3­ 8­F•‡P3TÌc5Ú;òCù€“F]©ƒ©´Õ„\Qø ÀQ·Ñ dE¥•Qß÷]h’Zÿ*Ê‚ƒ4¯Ý0ƒRøá#@~å&Ò[h=ˆN™‹ê>ATÓÆNÊïíen¼7ó$÷kuK—lê-þÄÿfý6ïS«««<¯ H!<\ku'˜éìŒô*-û‰Ö¾ïŠ@x]¿+Êjn+íoÙO Ûmœ´Vý Èln«­Ff*µKÕºÑ~ áØ‚ ±µŠV ,…¢ m cî vä/(½½¤Í®U›öF•b›ô´I­j¤;P„Ü´—˜¤bm΢ÜN#UuSKZ#"«‘H ù‹ ZôÕ£µ–P„%¨W@ÒÕU ÖJ¨Œ'¿ï‚4±hÞ“ÆXôÚÜw0F“Ä1^hÓjtåÆÖH›ÒjYO¡)`è«2Šh;TȪI4 D¤ß[Q–"if£å//Ò È¶ÝþŠLžpäÜË“ÓpKó,º3„WT/l]‹Ù–”c©&m4@áÄA ¡E?EG6•¿3C«De‰X"ÑÕÕP®˜»¡4C¬£½£³tü»NØ‚¹ÙŠñä~‹¾¢‹¦=µáš‡¦Þú Ù6´¬¶*¯7îN÷k÷˜¥ó+½SjÚ³²R õò×R‚µm–-JS\üŒLcÿÞJ8ÖÚ£vo3” ûèwy‹Þ)víJ«¨‹*°V¤'ºèäDû-U_ÓÊ…FÊ_­Ýð†aãópŸVÑ/鑼ÛGÉJhAêjÚ›&‰+QM#ám´O!Ø ‘‡…٬Јr¦½”ðÝyE”®¾JPÝÇÀHÎiÜ]õEo6Š^žT!üCpJ¥½ÐÀ×Ù UVVnE¼°„^@£vpÆ%ôÒm¬¥ÑYm¿êêô¥RVP¹‘5š¥µº¯ÖnhµÉ€ M• óT$ɸ(nº§­ÒÚ„ÒiÐëZ]ǘ»Ãëmì »Ý_ ®Ù¡6l®¥ên‚“öŽ´¤LØ î(2‡œ@ÍÎNF9(ñšŒÛ;ÒS0 iD<¾0LGdÅÅëèHN‚ŸÞ^J§#Á6µˆk¶-›õx ‡ºº¢‰I”‰USa‰¼%þ¢‡ŠRÜ-ùÌ€déK#k:ˆptÇQŠBãîâ)øŸÅ œ¬\Ð5 I#mK{?ˆ-‹¸zN¢(O[; ¡\ü—B£"|‰O´½k?¨…Fû…‡Ëù\Û)bS-ŒÝu¬ò’ĈZ B2D)­ I‚stŠL€t˾`¨¢„(ˆ:;‹{ä˜3ª„^0 «ÑÒªN#yE‡(·\°¤®µf d"†Ùi$Ò6¼­ásU“ºSf‰!ŒÒ,M™æª• T: /Ãù-úR ¨²‹«´¿ÝPMÚ$¬@ш ö„í«´.ÒnçP&8iÙgh­ÂÔ A1¥/·xdå¸5ÅüU“ä]c C6ê* hf#œ6Z2ð\êwT.•6·•€§‰èýjÀhokxU‘24]©¶tíÑ$`ë(vŠ¥PøM%FÏp.Ú®¹#èmÙßl,%ÔºïÓq¸ 8–´°³á(%zW,Š4ƒvî Z?ÃÿÔ«ˆº£E/²Qlj$º¶ÖòTaª½Y› g„%N¨¡M»ëXq(¢™&™ÿÕKÅ £`uµ>ýaÁ³Œ­:jó—Èí»ÎK´ìoÀ«F„V*‰ØbÅž}Na,Šzr-èÐQž„vº íTïà#Æ#(ižµ›” ØCðÓJ`/tѤ§@QüTOà ¨o”ð cIíGšôªÖÙiëH@EMJ†uuTDÍ[wwWm6‡4¸jËþü/νQ7ã YÅ©õªØ?é:’‘WWM1€$’§X+öE@ˆwáƒD¶FãÅÀ»ü2xÀ¨B¡ô‹Áo‰UAŽ#UMš$ƒA5üꨡ(Ý—Ñt[‡:#S­Vi°õx‘§ ½Å1ô€k‚%j‚Bi­•k­ÞÞÈ÷DËQŠaȸTý ä/£Z5ÚB}%ì4Y,·Õ@=1^ÔX^‚" -ÊvÄ á¹¯âMDâPè##k_c\cÖi{Ǫo0,mSSI#ÈpX^iŽ4zë`@Â’FÝ4Ú¥ê²L®$<’^XÜ‘¸”¾ƽ'‚ ƒ]í­û9·îC_õt–ЬÕÑ^r©Ç±#0¶õë¶ØÝWhï ¸j?˜;ü cŠÁöÔj’Æ—h Äò$bZnً絈h z§jà„gÔ cQ» ÓxýTÞª‡ü€-ˆ9t‚…P®Ö5 Ø·è)Fjaò‚ù¦],‰¥¤U]…÷ºŒcu;­ÛÅØ@G:~àŠ¥ œŽ#p**ší©b©ÝÚ¿&8ïîªÝ7â’fsº©òíi*iß¡ œ.ós9ØÓA±LÕz´YÔ`Ç!Ê£©¾c’:ê6Ð$°„7K$æ kB4^:Ò~°"®^øh!IÅä²ð¿µ‹á2˜!½Ý2‡aõèW+aÉ€ŠÊñibQl6³>é@§úÁÃÒ`M}½• cþ©r–qDz?UOj÷Š–ePf=F)ºîŠÊ4 s ñWù¨[ìn´D/x4:ŽSÆ0¥ãf‡èV zÈX» IôNuÏ×}&îbûJ¿ˆnLI¿úâ4 tÚ´èU·Çc‰‡{h?f*6«Q|h©‚OãôED$îðª6}y’ÆóƒxC"ü’ñéO^:ø½Ch¦+ë¦Ctz-æÖ´K½NŽ °IøŠ_îBhÄàWÂã_¤ë’`y±DÔüt”‹-ÈÀA‘6Š™2 ö ©: -§_~¥I2¶êã)ñ vA™è¶lÛuã,ˆTy€¿Ö¶ÿu¿é@Z‚.¨IsxyL–°\,ÄŠKÈ•IÔAlcë¡…"m ­†ÉØ/¦áÄø7Mˆ(^µ§8Sè‘«Yw\ôHƒ)§"P)G,£`ñ¿}åNOƒèd0+Š7ô”೉mc˜êÊ5Ä–)G•PrÇKÔÊó„£ÿ{çUå•õý˜>obzbz&&c’I7ÍI™$¦ÇôLЦÙb±‹‚(Vé(HÁÞ°—Øé½÷Þ«´;k}¿}ÎårtÞÌ›¬ï]óÆõ,\žû<çì³ËÿÏ9ûˆ¬þÛ¦ªÉ8 uKŒPAS‹=!:Hò¢nK!p¨ôJ‚P™¼ 6j)YÀ$*ôÁ(6 CòXœ@‘w¾1½N¼% ˆ—~>QcuÝý—÷JH’=¼+¡Ïfha)7kЂËEJ2/u ;ü’«79ìùãúϾþ’«mËŸ¼ì²WŠMZUF¼sÕe͉»èVÿ=rÕeÁäßÿuÕ7÷s¹Œ~ÞuÌ ï¹?nX³_zÂõ¼Ð@¿@÷©xLûÄ{þ(ïy#¼ç ÷˜ö1·m=¾c¯ëøW7mÛµõptXx„÷ü^³†¹Ž{•¯ûØ t›üÖêïñž÷ÓÖÃ1ÜÿߺÇlŽ<¶åàÙKܳyïÑ͑Ƿì?å»h¼ÛäwÖ;Y‡ùoÞ÷K Ç ^à±L=|û^ëO}Ž ß¶›_7mÝÁýîVo9pÚëÜŸÃw2=3È{çô/è©ë˜¿­ú›Å»ÑMÚàjï>õýÕßýÅyøSÖŸ­_6}óÞcÓ>å™[œéÙÙð‘~«æø-Ÿ¹åà9çC¶îVù¯žï³`t ÷êa×/³ pwÚ´e»ëØWœxtƒË"çáO®úæî¤U®ã^Y=ì!_»1]Ï<å·b¦ßò»Êsæ ö÷æ Œï¢q.£ž[¿Ä’–¸Ž}yýÒiž6_8ÿ¨4dh÷)ï­s˜ä9ã+çw›üöºÅ|è3$_ X¯ž|¡mÞwbÓÖ]ë§zÚ|‰ù°[d7Ê¢ÉË)rà4)x½‡Ëè|í'൓‹ -ÍÓŸ…㜿ÄkδÇÇîgw«!Œ  òY³iëÎõK­ÖN| ôZE#¹aÍÈ<ÁÝòC:å5ó›aaº‘a›6¡3ë¦û­°E¥ù1­s£y¾öÑðÐ ÔÉð+OÀBÑ%zm‘oî÷˜þÙÆÐÔrÍð§‘!OX;áu^rbAëÖŠž{…6¬_j­Ä(ßBæ<Êkæ·n“£ðnSÞãg¾‚ü1Þ ë o ÐÏd@Ñ1õÅ^¶ß˜„ƒ>„¬ëÕT11º¯ˆØs„‡z;Gì>¼n‰ÕšQ}ŽÁolÚ¼ åä‡-û~á½Ò—iŸ2L|7Ðs…ëØ¿yNÿÜßyÁš‘Ïb2> F­þþÑÕCû¯úöA>ô±ƒˆh£è±\ 3Ðk%.‹gzÏþFýøyíÄ7ñT4{íø¿£?4ëX;þ5Þȵæ§'Ñ÷ekF=‚1¦(@>¸>´7ØÏ»ÀPã÷¥|HÃÂ6…o=ãòó‹ž+=¬>â6ļn-m^ïÎ[Ü-‡ êÐ š7Ãõçi³»³Å%3Ä0¡X#….¡c(†ÑF÷šý_>§m^³†2ôè6}A3éµùèø¯Yè·rC€¾­[<9Àm ¶j¡Eü¯Û ö´qç(¡ï‚ѼTûg\ ¯`PÖŽW Ñ^Æ]Zýý”ÊÕ¬@«ôÆ ŒJÔ˜7\«S€ÛR±è‘Gþç!¼nÝK†üWÎÆàÍh<£Ì¯X±÷œ”~»6özÏQ­–\ˆ]‹Ö½3¢$ Ǩ{Žø-›®ÕÆÃËÛÏmî”ÏYä©¿ë:îeL2xƒ»Å»¸Jz!#kó…÷ìï j=u{ãÆPlÊcú¸ß kìø–ï±úOh;•À¥lÚ²sãÆôõ£ãÈÙºMy¿+â¬s'…ElÁÑá‡C×cw(¼ÇôÏ‘?ªEøŸ¡ä¾Ž/ í¿eLMN‚WDÂ(c„&àñðáÛ÷ 0('>!ÖÈ<Þ!Ú‰c4Å«àĦ¾Ñ`äàüÓ“Èœ÷®ñ ?p1ôâÙ‚¶˜¹ô ßµ.b>÷/¥?2Ž?¿Äc‘êê½dš¯ËRtXµg ^ £C†þ+ç ˜ü:Ç)¸;Ô@,å‡ÇÐ=¤á·b–Òsw ß[¶ó]ï9?bhÖøºañ|Ü#Â»ÌÆ}ÊûüÌðz­ÆA]wœ¸Oy—W`¿øjúEKÖŒz.,l3§ãôZÛmðu'Ì´„îãúPNŒÒõÝh³ ²ï0¶ì?‰CWi9ö‚;29Æ@?ŒýD3Q-ü2Gg–ŽÁRAPÊ&…R´‰qºá9óL’VqÒÓBðš9ÛAC°/^„åÒk·IoqQŒÖ¢KháŒÛ…Õ?<Žþ˘â?•ó§ã´Ÿ·{Ú~ºÒ6§ƒ<ŠNá?)D ºƒ:xFÔxØCA¾.Ä/\1¨¬Õ-æû{¡{`‚Ä“q§|ÑeÌ œ[·3šL@AqÄbt©ÒN”'àñ½Œ·‰üùEŒzÍð'ÑçùŒ)ZL”H¡b“éBb®c^sù¬¸ˆCçÒönº6mF‹~ÖÞ›'„lð¡¿è<_\·x –‹ÐèÆ±8a<'e³‚yøgb mm2š´…$²ÐM|8ЋÑAáÑXÐNÞÝ~ª«ã,$6y'ÚC@ÄNÑ%þ_ç0QâÅwtx ˆÇž4õC!Q cÈþþîçs:è¹÷šó½Ë˜—£IûÁØ!ëñ3]–hvI¼ ´.`w™aªÜϨe6nÚdQÄž£þÎvZ’ßJö0¸šqD\>óG ½Á~^8BCñ¸_A¸èÆÐr ºn~ =!Ø¡]¤ OSï?K xÀgáØ›Âñø7bŸ KðXÔ5È×m$4ÐxžÃ@£W»˜ô Ø(Á…Yb‰âñp°ÊÖ½ÁÀ‰­;MüjÄÎý–CŒ÷Šnîý–ÍàÁå爼Ø5Èg"“n¨æO¦ƒ¨’GIĸÆÿ¯#aÜöˆ"ÑY•ûX¡c(ðY02`­£§í7ý~ÕXKæâ± [拦@¼Î£˜V;¡Jœ6aeÌ߈ªì&¼ôPQtþ‚1=x–`Dß¶‹>IVuð¾Ô{Î÷ d…c—ñî^ëÂ"ÏàZ‰nÁ{6/|ç>¬•‰u0ÄÚ+Û?Œ{Ä¢A>‡ðáHŒÞàK«ˆt¢kï*a:4õ ÙŒ»‡ÕÇølsƒ‹=ÎÁÒí9/ðÀ[w¡x…(¶ÍúåºU𠘇ab¤87ÚÆ Œ ¼ÅìibË+f¡{]Ú¶ ÇŽpxxö«† «a°”3‰ÁW Ì˜RB‡%§þá1d¥ED«Œ)²0vž¶_1p&Ç "z3ø£Fö!yÐÜQWb rã-Œº½vÜ+¦Wû-³AV„$²6"ˆÈdÛ.~&1Äw­ú ^6Ù2N'U²ïL¯ mÞNH ñ÷&Bñ¨Ä¬¢ß\í·$òë?ûú?J®þ³9jÚý—]óN@Q‡úµ£lËg}/»}ÔÑ}CGsAÔ‘CGã*Û~%¹zÊmôÙÉ7kæ[ßosO†ËÂ-³¤Žºå-Å;”ì]Z¼Ë!yáS©K_Éñ™ðsæÚÏ’æ=–éöiGkóùò¬¤ùóGG{c^tÎúŸ2Ý>Oš÷¨T›÷Y›¼/yÑ31}ùÙ`èøíÅbèÈ™œ¼ð™‚p›º´Cm͵•§ƒb§ÜX¿³£­…ÎW䤯~7/xbsY¿6'súª·Û[Ë®IôÞ\ÝU–¤òÔ†Œ5¦¯~/yáÓÑ®M[öwýyÊâj“ö–q/ÞaW¹,Óõ“Ô%㓆ìS‰s楃¡ý|}ªã Ø©·”tÖŸ´Ö•–î_3ùºTÇ—b&\ƒÛ«õkvѪèñWÇO¿;ÃõãÂÛÖº2n«K=ŒH{vó|e._/Ü:§£í|¬Å È6?dRuÌ–üP‹Ê“þ5ñ;òC§TÇnk*JLšÿ×ø÷–ì^,Çè¨ã ’í&ΕS®rƘØÑÞZfU¹¬µ¶¤$ryê²×J¬æÊrÿ2?xbÌäëDD”8û¡¢­sÓW½ƒH‡79¾TvxmÙ!ô$eñ‹a–Ñã¯Êöý>aÖƒµI‘æmn.M/ˆ˜‘¶üMĨÇÂü*‹Úš4µü¨Ï™ô_Yÿ IÕ1 3ÿL_Jv;ò¢¨±—Óæ¶&Ó¸i·ó+o‘×y-Þ½¸¹$H wØõªH¸dÏ’¦âdF-×tÙ!×Çó7NÕz˜³î§Ø©7¡Îï3èÙ>Ãø¿x—}Ïçd¸~ÄKVóáÈ ž3ñOù-Ó–¿Q>QÐ zŠâñ×ÂͶèdCÎéÖÚâò£ž¹þ#åT¦Ãni+äô“L—ê3ŽéQ¨Ï:‘`{?-,Ü:݈ÛFS³}¾+Ú:‡_ëӦجIØ™f…ÄËA3}øJ¬å-zDhCÖ‰b5âêúbmâžêØ­X1ZÁ`%Ì~(gÝŒ¯é[ñÖýPã\ÿQ¨zŠÃóÉöÏ1âhÊ“8ûášØmbÅóÿʈ Ø<³­¡¢p³œpA73]?6‰BL#y_ÏñåBPΜu?`™k?­<ÔÖX…Jà rüF´5Õ4%¤:½Ê8bŒ¬ôÅeHCÖI¾[qb}ÒÜGèD“Zª #lLJX´}>ÝÉòú¦òäÈÍ"ÌŽ¶Ê3ÁqV·eºN ó‚ÆFÌàù˜?ÇYÝÎϘ'ÝÁ›%ØÞ'g^L¿‹gb€¨\¼ÍÝê8žk1m®è W#®ŒÕïUGm*?æ•8÷‘Ûr|ÈY?á×¥aìø¡êl(ÎD¬&drut„ំê˜Í¸M´#ªK=X´m*=þʘIÂã–ÎØ¼0Ëý >¬8é_Ÿù Gë‚MÖ4LkCLÛxH²Ý“¨hÙaW„ÙRSœºôe¼V{s]c~  cÍê¥Òw>aÜy…©ýs 3Dæ( V3ñZœ@éþUæ£SzÀmo,ˆÃÑýòã>Ù^ßðÞÜ‹ò±SnB©ªÎmD31FÚ‰T‘Œ(mæ‰Ú„Ýñ3îÃ𵫧‘-5EuéGhaÜÔ›S—¼Ìw±‚Öú2¥ÃGø.6žåù5†¦Ô©·#z8ýNFÙòR>ɳ”Ó¢g>€(P WÜÔ[p,EÛÐÚ\¿42}Å›<\÷¢¥¶8?tªQ¥§ßÕ{ÖèßÚšyZî†ÑüŒ‹Cx¾èùŽÕé>?á·ùm§ú»Œo}ÚáŠã¾M yÅ`|†Ÿíõmc^TOÝn.MÃ@èþDFsVÿ¼À±úOh;jÌØ‰Lªò b (¸z…œå„Á寛žCòÇ1vèUÉ^§ÆüXîI^ô,¡÷‚?ÁBq¿¼¨!÷¤yé+Kà°¹‡1M˜a<וËòú–fó÷g{£yÅ{Ñô*wÃϘ9ñ 4ï}”˜¾~¸ oÑ7qÞ£_Ð#qŒÎïåø~O :iË^Ëòø’(Ÿ´àñúŒ£¨é9UQa r"ñ ±S¥BH5q΀Ò}+ˆP9á3ó¸£$X4ã’ìð\uTxÒ‚'Šw,D†(!¾•®ŠGiµúáúÄmÕÑá¼H ê' …ÇQë±è‹¯C8é+ßÂsm››áüA^Ðüæi.mQûý+‘jùa7iö™àXË›ÑØÄ9¡_˜s¼íýx픯»Ž¾3 x†Oň!˜Åç`è–+§½,D¼kk®ÃXˆGt‡6W÷Álõ{kwã²07äÖs–ÖÆN¹‡£Hü•¦â¸¦óÙÆ¦v´WžÌ ˈÇY÷îG´?å}N /M˜Õ?Ëó«â %YôeÜù" )Ø4]< švWÔø«€"ú¬:d‹Åbx;JžåñU6^º¾œ‡c§ŒAAV6FgÞÚ„2 œª¨M(|ìÔ›“재øÅ×\¶ímxKºÉ_é/VóAñø·Vu6„+Óí3$@H"¨Õ¥¦ 8U$à Ù§ \SæÚOðZF/msM*Þ¹O›8)aüÜ\œ„˜7€AITa¥Vu´·à± ÌÐü¶¦â$$/0iÏmÌòü‡q¬/Ýù}9¡lÁ㸚äO ÃùÜ>'`ñ:Ô óÄeÕ¥îÒ0žÏXó!£a¨( Ì×QŒ"5Ð21l`:wX›y¾2OFÐó+dÂ(•´ê"4}òTÉG\o§ã„‡> Š?¡ \ÚÌ… ¥Iê¼!Ï…~Á Îê¼ÐÛd»§°G>Éî ñ á6bá6 [-Uù&¡ Ä íTE1 †´oDO¼¦ü¸7öt¤× ¾E¬aX±8 X+Þ$)ó™z3„i€@08Ë[é hì¸+0ÄX€vX yŽÉŠñ0@許WФúŒãto¦qQÿ@û+Nú‡Ãót†¾atÀ<ê¨MÞrr铘À<â4<¿ÆÛã‹ÀD¬ñBÑgF_ŠÇ`ìzE’¿á…]4—¥¿Ð4PÄ¥oÆÏ0Üâޭ0ùzÓhV ÓÀìW\Ê¥0^È S%JPTü<8„ð´àNðgb’5qÛÁ68,å|UÇ'ʦc­A’8@”“ÁÕÄ.}3/5LKàFÓø´€ú º7ÌÐÑ\–‰*¢W¸8Ô®|NsñnT‚ðÍKAh (mÀ¡i´Á“ü7»ÉÐ4ÛÇ–ã¬nE…è/ ãUg‚êÓŽ`AJUñË:‚lù1ïlßïðX+þ¿.åÀ¯x[S5!ûÅÑ‘¸ééš$¤ãpõõ™ÇI«Vžip#øs…ˆÓ T¡pô§&Ó*ž‰3L8ðóå™$ƒ|Ècq­©'w5Ô×e{ <ÃØA§½ ¤ÁŇƒÆ“æ?¦=°Aa* @ñìSXa1ÅqÀŒÄ„„+E²ÔCÒž¶ó˜$š Pîܤùƒå0sÂ+"%IlÌÆ‡ãÜÀ«Ý^MJ"ÄéYܾòmñÉEI@bã霫ÞáÊ ™ŒƒÅHÑ1¤ÑXÇØ‘Øç”4ÚÐg;¹M5=¸ôï“zíX𫆠™ ltœç•pÈ“ˆCôÁÙJæ²þ'-¢X«Ûˆ2Š÷hCëRÚbÔÉh„0•¾P´m>é¼ä)ÊÇ ®h¯~½àáˆ×ôjdH(“ $ÅxݦÂü'ÍÀw¡ùÄ)RKC§—£k¨+N€p†Æ¢Ÿd¼A'ê¥^ûøo“«÷-ßÿÇõŸ}ý_%WÿÙšíñƵ—]3pôÒõAëWŒtýeW¼¸,¹¥Ó-¤;ýõ²Ë.{=¢ª+˜ÖçÄ;{öˆËW_v÷¨gÏF§–·vìé5ߟtƒvk`9¼%H‡ ~½Wƒ£~$Îî+ áà ¾Ü†l©.Ä«'Î{¤¥2_×XÈXó!îEý\?¼&a'ÈŠƒú]ÈÕþ“¤ƒW>ÈÅÚ[HWi6ð•`$b©.øl´Ô~©¹$G¤ÈÕ&ü¢Û°šÔC¦ 䆣Îtý$Åá⹪þœp$ ×ÀÇÍI.€:Äbà(ΟGvÛyà«+¿Ñ’ØÁ3qzDsBgšÓk¶tßrbº~`mâž´•ƒœÌ¸¸Bp¶„$ÐyÒÚåó«ò%Ó Ÿn"Wù Žš±(;ìJ(Áñ6'†ü‡£O&e&>ö W[bVkC(—ñb IÆ3Ý¿(Ø4èx¦x§=á°d"WÁuÀ À•"W­ähK¯oˆŒµÉûÌÛŒbnžEˆAOz!W£·g["LÞ+äªç×B®Æn¥Ù ±²Î$ˆŽç>ë€9-7»}N‚‹wØ%Û=YÒÉ´t»2\>,ÙëDúI”í= ¨/ç€Ïù‹npE¼õ¨%ØŸí=T‘«½<§¹Êph)¡ô‡6`•‘导+yá3¹çœ$"“ÏcÒW½«ÀûuÉû Ÿ€»$}Û»”Ám­ØP–f%¹É¶yü CÙêÒ!¨¢ I6ûô`œ:’UÉ56äœ)ÙíhºèêJâChÖâÔzÍ(Ü;Ù¤4ž^$Í{dEûÉgy50mÑäªf§ÑI4hÊÍ*£¿6}õ{ò"ƒ“4ï1”¡W¥íI®2” P+Þ¨ÒW¼ jk¬¦= k,‹¾ðÝÊ“x2è‹6¤¹¡ìÐ3Œ gy| œ#±›ÈÕªèpİñ¨Â[~@{ù„›3\>bÄi ŸÇM»ЋÃ.è//N>,V¿üuî$MZ§-´£ÉUnàQH›W”qßàI(8Äÿ]†ÿ1’«)è¯ä¿® "ç¸åïeíZ àLqxŽD•¯04Üß\U )‘Œ€ÃÁ½“–£ x­öó2¡Fú)ôѹZ‘H«f> äêØ>ÜÆ1aü2äǹJƒ…\Í–©™É'ü„\ÓGѳ}TÞtw–×ךf¡ã(!5k.Iã–D.# )Юß‚@¹ú Ÿ£lh†¬ç €ßycJ#—Ó`ÞbPÉ;ê­C ä!˜íA2¢Þ¶÷£œøpÔ5qVlŠ/b#|…+sígÅó)dÊ„$Â×ãmîmÈ=×éßZñ·¹~# &rUKuã¼çL#eN®bÈBô…N¾ÝùÌ´Œ[á÷Ô펶fÌŠ–'/ˆëK°}ÀŒ\-“ÉÇ…O V](ü•ËDŠ FÀ ±é9Fr5/б¦Á¤NÈJÆ}îÔ,uéËÙ>ßñEÜ2B ÑC«i›:Yûœ¡f¶1(™ò µŠÛ÷{,:aöCÜ–¶ìuF‡ˆÖ+¹ÊÈÒÅ{\)c7ív Ÿá@ttœ€€Ç„y#±OHT¥mõY'Ìy-À¼VÍŸàú4­s¦…B®ÆmÏÞ43‘\õ7ý.2úä…Oã£pòµI{ñ5ªˆ”4ቱKœó°Ösœ}Ž·½ÕD®¢™ÕÑá¹c‰G¨ ‚ñ õǪÅ<ß5ï2¾Û,?¢ÈÕ³¡1SnàáIsr§:í„É'2—§›ã7\‚ï¾å„Z‹?!‹E»ÕTÃ%j,÷rsYºLÜì´GWiÆR~ÌÓD€Ú0r1í9 ºm"WI¬è¹‹\5tÐet;Óõ#Z¥˜‡ixÃäêÕuÉûÆ{$îcYÿ ïh2¾N$9ör\z´õÝQŠ‚‹žx­Ð­ÖýPZ¢ÉU”œK“«k>@†Èœ`à ·Î6:óÖf¯(|‹××<\èúãÞº;Z„ª:Âàâ¨kv×&E¢ê8=™€4Т­ØæAg¾^›¼EÍñIþˆ[“ñÍ>•0«¿Ìj¹|$,·õxÝ„™.Ú¾€'¤:B‘(oÃÏm Ý e¹:óÏÂN€Hóc°Ónj/ 0d2ÁdQoŠÃó:/&šyäªÏ04™a"Å„‰A8ÞT§×ÐaÿÒ¹pY Þ¤¹rŽßÚÌÈ‚¾P{F9§øOLÜ8_iém8RÍÌ ºÈÕ¥¯0L=»kÑÏ ÜbwM2â.$Tc,®GÉÛ:É 4ì̀ʴ孴¯«}BÏ ×MHpÊtªýs™ö üßZ_ÑÍ¿µ5TÒ =ù%Ô´¡ Lïl@M¼4ª‹|€‚´Ÿfi'VÀø¢®z—½NPÿW %0¡Ò»É}1jРÌ\ƒ ã6©‡Å |…®É뛚„Ýø1̵GK1b.B3µü,ÔMÐn#Ð`&Ô3¡&rªy½¯h*AD‘«óLä*ð Óf\ÐùæN†ö÷¾-Ñá_“«QaÂ6+å¡G2c¥&­¸ª£Â5¹ª†@$Æ`› âd^iöC¨™ÄŽv\vÑ}šÀôJ8krxLƒ‘Í8¢¢\ 3îU¬o?ƒÊ³È•pq¿ü¨'Âä±ÉÞ#ò³R[ëË „Ya×`'lDÚ³a-5…Qã®ÀÆQ‡xª&Èú¹fÅ( ÏB®z~СE ¸Nm,G»P?Ó«Á¹þ£%kÛlKXÄTÉž8@“«9¾ß›àA[s-Þ5Ëã«æÒT2þ”ºìïˆ2¦UgCdÙÕéÀ^õçß&W^uàë?øà|pzâùÿ›äªáŸíÇW {¾ßU—]vÙ·=õǃe]î·rµþÐÐ/»ðß³®¹Ý=ö™U_hœ™ô'Pœ$n€CÐøÔ›Áä›À6@fÂìþø™Â›"þ¸ËÓ–¿ŽoÁÕ“ ·Õ ÐÅgâ–ù\¯c!©‰ÛÆ£„\ û;‘«jeËã ²úŒã¤µ)û Oíjí¨A¯#ZóaAX'¹Z–ˆrµµ ´–°âƒt—MÀŒ@#<žÊqø6Ýù}ý9!§W²Ç,M¨%É%>ê%væ—‹ñW?êÓàô*Õ$”ÌÍ­z‡¸Sº•‰\­KÙOÒ§³<'aN„óìè-¤ò×òÃkó‚'t‘«á6„æ¼I6€yÍ6ðWF$×oxa„­¬V/ËTH7;åœhm¨ÔmàNò8¿–v¢$PŠDF­ yGÈÕéwÑeY$@Rvr5fr_ÒUJ]êAó6Ÿ¯Ì‘,cÁãéÎïõB®Æîζ"%DÁ5"%œµÑ1z$”šÒ""Mm*J"ôЪd»§â¬n%øïv½Ç1uñ‹¥‘Ë{U R'Ð#Nd]Ý”4ÒSŸÎï¡™@&‚)CÆ 7íéå9k?¯Í†£˜N³yµàÉc^äãà^„V›¼O¦ÈwØ%/z†±P¬WP¶÷°8Ë[d]ôê÷Hg—ž¾×ä*Í»2”za’ÜæúQ²Ý“zmƒJÄó£%á ³Ò£¬Ož~—4œ\²× œfTוoWÇl©ŠÚ¤ÉUÞ…”ˆõ´Ó´Ô õô‚ˆ\s¹z6$ÆâôP“«€DÍ ‚ÏWåá4á Ù! Ь¿šz³¬\moë)· ÈU×1P–,Áø2¨eä¤!ç4ɯ¤Bã®ÈöJOEg‚è£LjÄm'A¢ÈŠÐiwèÆç¬ûI›Šíó]'¹ÚN¦Ì=àí,·ÏÓW ¦Á´S-Þ½˜Qf°ôfƒÕ£Ç^ŽFѾ" §2+=­Údp…zrz­òä´Q¯ý¶1¬dÍXD婾UžáúIå©@ì¨]­9WäêM’[ôqåo´TÎDÖ#ånø9~ÕG§7±rÇ‚fUøcÚƒ\í“êôjéAg:ˆ¥ ø+^@ÀÏzÈ“o¡-Ò÷Öæ²ÃkU²´{ÂÕèaÒ‚'2œ?à2Y¹j÷d7re÷6äœAÂzš[‘«zñáåšÝ¥#ŒþÓL 5û!‘øŸSñiˆ­ÓóhØ#ÊLbE8ÈtùˆÔ x¬mMØQQÅdôFrµ¶¤@¥öH†üZ‡¬F}Bhl™M²# û’¿1¬§$r9ÏG[ÈÐÉN'“ Ü•…gV·%Ì~È|•)¶nº‘«~““œÞÐK/ÌÈÕ>4@ÍUMFJè’$r ]éû=(½W÷"ƒ¸a4›³ê"Wë˳Ԫ³Â­s°è–ê|ž£<ç‹D"º™¾ò-ÓC4¹JFë7²ì€Lߌd¡õ´ÛS L±VLzÅ|J÷¯”%©^ßÊӛŠ$M:㎛ÖOfvV½ƒqáÃKÕ’]†/Þö~ô9Ù~`~ðD4¹ü¨GoäêëšÌ¤aø@ÆŽ€dª&~»Ü€Vø ãÒó]ïäjì–Nš÷*aí¼¾‰Qñ"yѳèAÞ6#ï·«2.Ã0=„,Ìš€âCªÎ…’Gãóñü’¶[ÞÊhÒl´»«:J€ ÄলÜeW…‰\åäÂ'Ï%ŠMCÅ;hª“ô¡¿ î^‹{Ä¢ Â]lÂHÑ@Š&Wc-úÊžÉ»Ž½œ¦â1ä™»b ŸD†‡kt¡ÉU¾…V3ÐB®ªÛUgBˆÌ‰bè5cAz¾Rša0Ðø ÈÕvqV·Ódblª¡£**,×$Rϣѽó¥‹\AUð± :–¢æ;¾&çÅ@pkøI¼:3ýž(µMƒÂ? ±¤ùe¸~l$Wbïoõ"s!WwÙó.ÚF44í 1'WsÔF„&Œ¨Á€Â‹Ýu´›ÈUšD~Z»EÒ¤ ®¦­¹=jo-‰tç»çªÁðñ âÓ²NJÐß¿R“«tßÈt‡P–À±ÓÚXÙQµ°'ù`"WéàÅRKqÙ:|#.½Dxµ¦—ÀDt6’«¾ßcƒ¬…£Cø¤´¸e^'¯Ï8ÖT˜Àp ƒa{?ÝD>Hß"j}É Hòúq‰¡s´>£ê<›Âë2Lš\E£°Ö̵Ÿé…[ R¥mÄb‚ÌS¨)rY¹7ã>žÉý¦ÅDöÄN*5~ƽh ¯ˆé„jÝ.´:qVºÌW„\Ý¿JÏõhF«›ˆè,ªeN®Êd·Å ›¦až¹~#4« €Ä0ŽiK_•Yûzæÿ¡2ž ›æyÝÂêϸGûùzÙAäÀFruÊ!ÆåúVs»a ¿¬O¦-ÿ;qü„™÷Pé*,K/ðd¢W’—M»MÐé"WǽPqDÎȲCÿQ`ÂI†w£‰\Í‹2‘«jÊip–ÇWÈ[@Œ±j=$æ£,½ݬé\ߨë¥ÉÕŠ_|uÈa’¸œqõ£¦žÜYW]ÆØIÚ>óÏ—"W14™ÄØ”à£e‰ŽÓ«µÉ‘ø:$Ïàbø²oÃh!WÕ‚BÉ ñW ó‚pk<žÌJ¯ùåÁTœôk*N¦k¸T«Û«Ï—ganÀ„ ÆlµçRK÷3Ý¿ çð¡‘\=âN(g¤¾‹šáë ç+²$ïš?5YÆx¸,{Xùú£×÷^ðö²L\·É‹ê­ón!WW¾á+Âpž B!ÉжÎ-Þ¹HÈUå‚Lä*¹0M%&Ï’½À†qW$Ì}4/p|Ò¼Ç@#7×~ŠŸ”í“~6#W+8ÆÑÔ*¬ñ2޲&dÕ»¼ˆq”(¼w©&WÑÛ.rµ¡,TûÎ,dBœ@ p»¼îLðoN®Z'4?½öè_þqý§^ƒ|OM:Wû•\ý]®³Ë?>;ñ:s†#’šá@@/¸l™z3n6wÃ|šZUxLñ$ìj*JrxÖI®ò×[ápðí„B`'Ï1mÇþͯ’ÝŽ8v²Î†œ³²4µ`sW>uqrµÀ7ÿ©Ø©·Ôg×7ãî ¹cd¥ÕíäqúsáÎm” k÷bIy6ŒrUí-5¿R—¾"åÂg¸Éä…LöÉâœ?(š‡K¹u§ µûŒ$‰!ä–ªü˜I×Epõ=ûH/Ó9뇷ŸoÐ,Þ;‰›d. U£×m¬Êß8… ß®÷ËÞ:ÅJÉŽþ#Œ@ t5¹ÊDÌÈtÿœÄ‡/’ÕÉÕÝŽò(…𻑫©ŽƒhFÂÌ€(¼ES¦«¥º€xDæ‚òt´÷ Wãö¤O+Ùë¤ÈÕ뉕ímµÉBŒ3@²Èså[Ø:ƒa…Gñöx›»R^QH8›ì0§=Í/B¸ÀL"–áò¡qQܬÏ“ÿÓÀ`¼ð¨G–Ç?2]>B+Êz›'h¢Àzi±k5ÅBAO¾¾ìk{KSùqo=ëjN®·_µþmÍ8ë;‘<ïb”ÓW ®R»\;Z›šÚ’ã™8–/òaÅ/> Y3¬–Ñ2 d(DsÄ’éú‰Þ–b?£ë"W‹’h I¨Q]]?–yÏÓ…[g3Ä|–í{§ƒ’æ>"ßwEâ¼Ça~ð$ ïJ˜q/¹våéI9-o% F²}†&Í{”Dž'œ/ÏFÓ¢L]úªA­S’ kSöwÛž©/sr5Ýù½ªs¡ô o#é’A­ ÊPLäjÎú`NƒÚ±Ë«QQ½UÐWÎYA_jåb”ª*õ'ÓI®Ö%ïrõ˜7M%Ÿ*« Úo¢!¹ãòB&#XUºäÇØ©R%4"»˜oˆ·¾Sï¾”UÞßÊ”E_, …*–F.×"àJ³.  Ê&lÌè½ùúBth é°îØ8ÕH®F.Cœ?+ŠÝ×T”HâYºo%X‹&q'¿„Oǽhr• íeì4CRy*€Jƒ¶ãQ5V4'WQ¢ nLƒwá[’ížÂí8ËZ‹¾²Ù¶¹zÜ[ÈÕìÓ4ÿSu64Û{˜i•8MMdÜ8'@ñ>0˜î3‚Q²ùh¨l^X98^Ñõ?dKgQÎ,÷/ñ*ô·¹ê¬ÈUÉTî†Q1Sn4_’ìžB¤´תÈÕ»‘ŠgÝOJÄlæQbËUy¨ ²ê"WË3³<ÿÁ ¬¤ù›ïë$3ÊöýNÈŸÚÙ«º–à;.iÉkzˆo‘][Ú=ů _ÍV©¥S;‰¸Ü¦â¤^Ý Êtùc‘˺ßäªç×RTa—Ck].5ÅVÒR¼A—¶ÄmË“UpGÈ´Çi€Ì‰JX1y¥‰\%òâ(²}¾ãMu&Îî’K±Ûû¥øÌ’¿!"r+r:q¼3îSë0¯"þâc…\%õ WñE¤zø¦d¥RŠËGèž2ÃY:ëþ9IZ=^š\E[ª£6•pÖA*Õñ%+äjÔ¦¬ÓóެÇÅ‘³£“¨‚JZð8æIßëÒá'±ÚœâðœêÔ}qtJ¦$fÜ‹C`Q~ڀŵ5Õ˜ÈU<[å ?¤$3ë~(ÜLøXw1´@.‰÷¨8&K.y#¦!„•ýsB®ªš3ô4Ù~`|§wÍòúÅÆŠ+Žy1Ä2Öÿ¤K :ÉUY§vm`¡ ‰_Ç}ç (;äÒÖXM!|¢Œ±é¶°FB®¦k 7õfe‹²íñjâ·“ßÉ.!5¡fF®&a’Jo¯, ŸŽ+rußrE•<@D#}dyKæÚÏpn2v¶ý£'\‹Ìu.^Ñ|#ºÍX£ä´M™ OUaC7 ¦]!]äjüîÇóóbbG[Kå™`†¬½¹ÎD®¢¨„ìA^übÂŒûqG<ª]ÈÕ­²¥½GG 7’«!“„\UÞ‰@ƒÏ)Þe¯ÉÕ‹p2„ìTFû¥D†û—`3ÙHÒOv‘«sèÅo½^´¤&v[Úò×y.T¶kM½)F­éøª|‚ðë‡eã¦õËõÍØ+eO¬ïÌñQŸy‚@™3Ý¿ru惺^Gmâ^¼®Ä ™õ¸#ÙwtB 8$Ï·Ð+4Ï&;eœß–{Þc¹ë‡K¡ŒOhޱòÄz|x}ÖIÉ #fH! µv‘NIdqx¾Ë¥ì'¹ÓO!4ën>G¦ƒÞUº÷ÆYÞ"|šýsX¥Ì ÙÜCplkªí&"|íŒR…Â9:dŸu?úˆ™0Dp™0Ŭ~·&n>_o,Ví°c˜¸%Ô䪰 /bÊ¢g‰•mÍu<-m̋ҨL'ȯ‚¥àQñ½²·H- b€)‹Ÿ' ›Z˜ã72Öê¶¼ ñ²Þ5`Œª6Ð.µ†Š“Ñ+Aw4IàÎÙäGp5ød!@M÷Mäj~˜ŠÝÍ=þ~ž…7±¹Ø%|î_0¬4[\Ó¸+L•‘þ=r£@˜8adÕ\šŠ.ɶ»'k“#MäjSAÑÓ(]œBæ-•ÓêÒàô´Ž^SM¬ä¯h‹ì–ŠÛ‘1 +[ºêêò ¹êÌñÀÄyÊ$frdφu’«óÚ+P¼=™æ¦7þH{¬ûɼö¸+Q×ó•9`uÜ àüoö«—ŒÏê6 >"•j*î_ð+]ü:kÎð+@$äê¾i+ó×Ü€±ªTű_%m¹ Ð5…K-C¯«MÜÍ_qÑ<\/;TùãÓÝ ¬u»4¹ªŸA%­HF›3Mmk¨"@§ü²½®ª ¯®ËªôJ®O±2™òø·iÚšGâ&…ïd‚u'ŠæirU@µý@L¸FmrõðZ=¹F~È$¹Óâ™úôü ?dm.IÁb漣¦‹”Ú)ó# à—ZëJdÅ©"W™.wÿ2?t 0Ãgèéc-.býðæòLHŽßpµê#•W";Ÿl@ é/òLR¾e2ÔôvCGñ®EªN ñÃöÖóç«òõ´¦*¹ð75“ÛBÎR»…Œ;?ÔB0ç¶yÄŽ';é¬À’sé²"Ww*rõî¨ñW'.x’0 R¡µ‰áVö¾Ÿi"W åÄMã@uÆQ3 ´ªföšÚ"‡*å‹=ÉU2Ђ0K©¾µË?Lž‚”tr„CF7~sruÔÑâ!ÉO»þãúO½¾Úõó¡ü?ÈÕßð:·ôÝsþdN®&Ø>€…&Î{DÈÕÀqd7€%@VÈïr ÇWkƆÀˆ× 3îSäªA“«z«…&²„Wœù ^‘ îw"W‰Ý¤„„ƒÆÎ=¡D‹“«øÿ¸²¶Ç4 ¹~#ˆì’œZß™åö¹þœNá¯dõÔnÇš„Ýy!“ñç =^§ÉUà ñއ¤¯x“¨d$Wg>X~ÜÛ´ŸËD®‚ð¨9¾?4'ÇYÞfb_»]ˆ·òt@–§d@äƒQªìd}Æqܵڳ`gÜ §ºZv2^ O¹-%’Tª›$ÛC&•¨už­ÍüJ~Jr¤ÉU`ª¤Õk?)=¸†D›£ÉUbn‚b;ÉÕAUQ›h?`UêBÔ–ïqd| ”ºp“é’2=xrγìF®ΉYÎuLk >ò$¬WÌ–ìq$ÐÈþAç÷MÅ‚º]*ÍtQïB ¥®î…n«}¾™Þ]úJ–×7jéÎw¨„0W'üz>‡ IÄ/?ÒõF ÔD®Åô®X4 ÉÉU‡çˆÔˆÐÎÃÉÈ„eu"º*eñ‚ Æú`‘)‹êÒ4U$sÄ]öOëg^£ ]a+Cß§;¹êöÙù² ©qÑI®"pž¯Ë£÷õŒ<íQŒåc‚'÷MqxA¶øù’åLSo&çÊXól†š +9iO–××BkØÜƒèêÒƒ”ÈAâ¬n•Ú•öÏ+:/¿ŽéCšÙ«ü/ WW¾…Ú @™ÒÝdmPH|[›²OÑ,O «(!/âOÕQ›’ížJuÔI—@éŠÐ»AQaO‘Ø´;¦&W í’›[÷£ï…›m%+²dz7nGM⮪³Á².íH¦ÛÚˆŒ|ׄ«M«}0©tá¶¹¼lÉÃËz¡Æš\%=4-†É š@ŠªÖ7~nžÈ×ÄoG[è¶cN®¢«d.‰nC‹ÒG)"ºÓ¾:&B× A¶¤¢%‘Ni+#Òø÷í\„_Âr».ruùë ¢~QCöiÆW÷Q¨’¼j‰iæÚOÑáÍ6Y‹ ’ iý»‘«<“6Ô¥%MÃÉ#"SñR^Jꤙ®˜É×Éb~Ÿa ÂÄ+òRîá±Bè-}Eçþ²¸:÷œ‘\uxeÖ䪚/0Dhr-åQ€í–ª=åQŒ¯î*„w­O?Êøsr•ûsÖý¤jÕšÖGůý6ÁîiŒN6„ž’tz4S¿Xu.4Û÷»Š“~`fÚOD§.M®""FÔ“\% ,=° ¿ÝÞÚ¨W~šˆkó’ا*ž³‹j?&äjÐx)E8-2‘«DÍêä(E¿’vÊ*»±—ãŠc­n“ ë€3>DJÕír™ËŠÇ±—ÓBM®bÝXÍ”vËž U=ç5¨œÞYu6? kÆ2( Ó¥ÉUÔ¬©(Q—=rÕéUDDÄ‘çt’«²aòuRN§¹N› N«$e“íèêìþŠ\} ± .ÉîIlUñË:ÆšJvìú1Bî"W— b¬3Ý?—ÊERÞD*\ -”õ$Òì+b×KÑXE®öR.²Ò(¶û—˜!©ŽÛ.K¬<¡ÏdvF[M®¾¬Ëñ‘ˆ1ÀY뮦3âTcîÙ2>žhl†Á€”@M(¼.€åâñäz㿺§C AxM[öz7r•ŒRÖªIš‡o‘zÚûVèuhø[Bv"]‰¡j úÄÌúKôÄ?ÉÕ©7¡ö)Ïg®ý¬!ç ± õÈpùˆ\ƒô¤g„ ¶@-Ùëdtæä*=UUFç ˜³¬;èÜ+¹ZqÜ'ÙþYY!¶ú]Â%ÂÁ¤-}•(P¼ÛAÈÕ¨Mè³Úù¸wŒäê­üj$W'_O³“ž—úrë~À µ.Ëêîàá— W…ÃQ³»¡"|nÓ‚’E•6÷¨J§ß¦.‘ØXS~ˆ0”éò1ŽŽž¢½²<ØòVúˆèTåÀek†0”\Â&\­f‚&iÜ\Í–j´71Rà ŸÌe¯ý”BHÞ¥ºæØ>4©.yXvp:0D¡¦ïRœÿºD¡¡F&Í<ÊXRõeU0ö=³*…nTº„ùaBà÷ z²Eí½^úùbw”Ú÷­w(#<€ìø5¢Ë™ ˜©øÅÌS» }PŽhÒSóC’ìž’Å™Š\EU0µá÷ƒ U¥§WvØMB„YƒÎÔ›y,^E1`¼å*‚¬æ{9öˆV󳮡­¯Ò}ËS¤šúnCÿeÿKSMmò>µÞrKڲײ}†ÆZßÕ¹*€öëRK²•8Ây2ˆB®žð#øš6¯ý¯ºÐálïa„p²¦4±&ÍÂý›äª,OvH:@Ôèv¬å­2#½™§ÉÕ⤿‘ ¦AÒ¡p©‘\­Ï:©Ë;Ýô^6,¸Ž3 Õ$îA—yØuMÜvM®ªúàÌѲÒoú]ªŠÔþž #FÓ¯’]¸8Ì`4Õ¬ètYúîú±‚ý/È=»,´îÒÞóu`wà+¢’Þ'œí´;¸4¹ÚT”â¥kª¾«ìõ+Ú±}–•™aVz!å¯zc'¹zªÃ`\fßZ_Ftε¿!%=­@ èZ¾²øÅKwruéä*X·pë#¹Úh$Wk+Šˆˆ$Ð+¹ÚÞ\+‹çgI1UŒÅˆ‰YäRî#:BO8 ¹n#ûn¤ÀÔ3Æ¢ ­Í¥‘NøYUb™q, pÿÏ–l÷$ë&ô,&gˆìqÔ±è>QFÅâ4]Oè!ða•È!ãš'7Äm—UÇ^ßàu‰þ  p`SA<ÎÖœ\­:"Í]/Ud%|{|)åÔT5ã¥NiÉ øÙD®ò@©M>]ÿ ‚? ÉD^=_`"Wõ¾TÞŽ=2^8C]ê <‰eÑf“®K\ÀLéÕé+ß"JÊ‘1ªörìÔ[´ÿl.˲o ŸÖ•!Ic-ožý®äª¦•p2½ž<ÒZWÆŸLä*Þ 'i"Wc-$õ¨ëÜž (PùŽTœý°®¯Â…Ä‹âcAn¤Zx?$ —Ø™_š\•"üœ¥Ð嬥®»â:¤ÿq¹Š Õ˜Y“« (u”Àž¥¿®¸©¦**Œè&äªÊ[4õ™B®2@EÛh²NÝY-™÷ð€º Á”uÅT((TöÓ©ó)ÈÇåC‡&WÁyã3Ý¿(;äJà·Ô• ©¨÷¼«’²¢U•ŸEÉ‹žÍPûýÁÒ ÒU^}¡äKJ#—Ë–¯o{†×ò¤CiÁÓ‘$Z„š![pµ‰\•íHÿ 䙾HĉâÍÿ+—EQ•WvÄw;VÃtù2'Y“2G>ßE©Ýs ¼ˆ$‹ ïôKxc³%ˆ¦«'¹ÚÖXI¯–¼I$¤d¨ZDZŸ~´'¹ªÓÞÚ¤H©¹}@Hg÷¤0€ŠTÇ—€£ÙÞßê%t \µDp‰éš\•%…ÆÅZ]ä*xæ|eYvgl°ÏP2#>r5õ`sij~ð$ iuL„—›|}̬)Ž+?â–³~D<æiÑ7vÊ B®õ FÇϸ›#压·¾|UyÊ¿!ç¬ìб¾Så)Ï¢6tS“ö¿Š\åɲ¦eë\å.Ò Œu®ÿÈÉ®ëS«Âª£ÃéÕ¤¸V¹ ž %¤æ H˜ýViÍ ÉURÑÜsdŽ LÀ2”ÓRÖgP¤@}{kKu>®@qÝï˜jw^}:×Ïܘ:Éã²jâwb˜å‡ÝHí䪉UŽÏ÷@šúŒã &óã|Kê Ì ÉUUOï]0ääji:‰&h¾=fâµ$òේحE[g«^b°ð±ÒÁ©0A™JâËa:;ìôgÔ#DzE™ÍÉUU.õ5¼qÂÌ»“«§¥éGîÉ GžNO ¤ðíŠ8½‹ôœæú“nv.L°¹W¶ó«…RÑRmà)½gYj¡d ·¥åˆ%/`Œ«?cÂ8^Ð8a¢.y­Íöý¾½¥ 7Óõ#9KÝJW«&Ù×µ¾i¾¨êŒlZWäê&¼ˆÊanB®vîõn.IÁ´J¶ØXÛ¹’ò.sr5Îù³„ùO`‰àa9êK•ÁAþ’J¨Óvxž_ëñ‹«~Û.RˆˆM¥Ø? Œz<ÔÂè÷:ÉÕŠcÞŠ 3ÐøA®ÆnË ‹§ÕF!¹ê¬K"—¡í8¢O†ó²2DêÓŽ§SQúȳiý¤šëØË¥¼ªíRjì+¶&+wÙË7j禮í#äê™àžä*ÈmÈ=Gähƒï÷rZÓI?½¢’^êü¬xS Íù=’¦K“«4’è)yz5†Æ{é/2'Wñ6µR¨¹E-FºB”'ó ]Å0•Ö]ŽÅá¸$„‘uŽíS~ÜGÖœûþ ¹æC;žV‹4ÃåC½F—°®ÖνL³/†*Nø©±NGáôÕïd¤LG;ʬ§NäH5Y&¥<¿®IÜM0Ba 6M‹S›F»vç)r5ÍéU]Åe“/Á±µÄÙ2!äRÚalV<ÿÎ…&W¦ÉUnÐE‰ù^÷J®ªÅ“r˜c¹Z–‘«*UÜqʼn³úF؉¤Ù„øõ?‰«Ùd…Ÿ×5¥ˆÄüg£']/eñ¦Ý!lçÊ·IH锜9µò-òÊL—!4‰çw‘«^_ïr(íÜÒE®¦"‹O²{R¦ç¯•ãÛæÒ :Ò\U'H¾¤¶«JÑ2“¸/uÉ ÆŽ·¹Gï·Å ÉUƒ¡.ýØäê„kQzÁ'£Ô¸°{R6óZß)üyùzFM¢Zø´,êìECÎib´‚5p'ñ=ª³ô±ì)P‹W‹¶ÏCµ@q5©úey+bhd"òT@ωo­É X#¹Z˜`"W•iƒ'ÊâO©†7c¬Õ¦±Yü!¦šáú1}?kýÇ®Kö:IÙ¯o Âô$W-oÉ™,…Óφ蘢NC{Joê×¥ÎóÆšZH@,Ý·‚ªfý†â‘4†-}¹wû eNrù"nÆ}z+=ªÏØêF®Ê2ïÍ3iÉ%´åÿ×…†Ÿdi÷ÎEræàÔ›RD’èÿG®Ò_µ‹¿£‹\•“éžÀ¨¹ÚyD À ,Ã!‹ß. W¹G—¸1A&Bg¶ç×™_ÆO¿›ÖêR–ü/5¾4¹Ú(#$õI&^K¬ìV=L_Fr5rIhDKM‘>Ò]ÅGá1hU—µ!ë$¾è×/eP¡™Ð†ÂZXôl®ÿhÁ·¶èGꜻ±:¶êit´ OB|”Êóÿ6¹:ù:™b69+ƒ¡ò䩘‘q\$ :ÂÆD®ÒMM.v‰"𛑫8yl§¹ZS’“¹ö3½3K/fènã2Yÿ-¯ÔVzÓó3VËÖ'UÆ_Ö0/B¨z)¤J…×vÙ†¶$Æ¢¯:±w´N 0p ¾‚®0F}Ôuá.Bãmî{ÂÕ²Vù\˜Îhè £Éßh‰F¡ Fr5v+1’«µÅø<6€_r73r•ÈNKäÁ‰õ²%S§òïÒ¨ÂéÆÌ¢QŽ d$WKRP ‰z"ÅW[›ÉRÑ:$@S‰Ä_"úO{ÿ¼]ŽŽÇRdç”›“—–U+4Ã绂p/ú\]Ø•à+31+M`$W +B®Ú=I¶‹bdº~6… qûÜ4« ÁHe%ŒõÄb ¯£>pÁé5̇LJïQíyý{ä*ÿ–ž-²Œkøfwæ`ÿ³/{ÿãúÏ¸Þ 87,2gjL½g\éÿœYýƒ\5¿¢¾T¨-RÀ)JmýÆÀFZôU«¿†Ê‰Hê(:©•tÈEíúyAJº~,uêÍ:ÕRç~!^¥vAÊä”å-2yôû«åG=Áxk?íu‰Þ ìÚE®VæË®¥·e¿vT˜Z x™„{UB ¬›f‰J©U²KŸ)CðÒ:s{%Wõ:"BA‡dGåD}@Dd1„Ÿ©²wCÖ)Z¥CU~ð$ÄX›¼Ÿˆ1¼¤uÂß’ÂèÜW ´:Âó+d ¤×wJº·uN–'o|–0j´G猲 ×ORΨ¡’¿ê$Q“«Œ2>œ FËåà§¹ ©-) Ë_t’®Ntý;Y00ƒÆd¹®N«ô”,wwÛýÑÚPQ.ÕîH÷B®¦žH ‘2YöÀZ¨ÃLäêÎ…5 » Uj馱HBKm1€ ŒÄfõg Àrˆ³÷PÌèv ÆSµttUü,÷/5oS·w%̸Ñ"Yÿàô)@¯³á½«Íµ²ƒÞ¢/¯cèšœ„òîäj{‹ÔÕ´˜0óÁºŒ£­õeH•ñÒ'ªt’«ƒÜ,/Ï«CQ M‚í}¥ûºjÉš“«Â9½fZN¬ÈÕÜòcÞ¼Eߌ¢ò+_GQÉ1[*sÁ!µ®¥Ÿå=4)bqêª÷„éòþV¯Eѧü°?$Ìz°tÿJ²?lAÍà_‰Ì± ÙÕ®^Jʃš5ÄÅLîû/ÉÕL—[ªóÓWÖä*h¨¦w›r„Ì ÑÛ„y5íÔk•«c¶$Û?—êôªi.—¨{å`QH}¢ýÔ›Èmë ˜¤Pš±[刱ù•Ó÷B,e][@¶A­ý”LP¨¼Î¥ªbuÌô ·Î!áBÛ ‘´·pË,µÍórUë ÙC=îJT1mù›€±¶æ:óÅ? 7hJ.E®Ò† ×ä ¬Ã®à7#¹ZžÉ(FHÅ0œƒ"W'ƒ·rÏVÛH:ÏÃócH–ªÔ61.ƒ¡µ®Ô„ÇÔYÕäjsj@¦,kp8ž_¥,~ éI…“å¯ÇÛÞ/[«8›h6OJq¾*§mø™Ñ¬KÙ¯³rdúNn¥ÏX žÈ£„ܶ½?×dÌ)‡ˆ’<¡]}†Ë‡ŠDÚ“âðé6>MöA«’_¨É‹ZD½ßH®žo`èt©f<þj ¥ 7ä×;èe‰æº±‘lϯ’h>—Ó÷jKƒZf`<ļ©8ßT'¤î’Aæ>Y<¶ßȶ†ª ÈU§·cmÀèH²ðɬª4-J¦qÑ™/•ƒº:m·‹äHÈUÇ—„\UÌè÷:ÉÕª3ÁKçŒÕå¯õRócY4¹ªO¬ÖŒ_sY¦3·àÉš¸íÉl~ðÄG9>vòõèIŽßH#¹:ýn9"–ñZü‚´Áò!WålCñnIfÕ Âäjs/ä*Û\–?­Ñ…Cõ*De†›UŸWÐZ%„gY:ÿ«ãt»2¦ ÈÕŠlž;õ­9é+ÞrõÔ†¬Pë¼£:ÉÕ¥uGÒCPôiÓ 9|mâ5úx²¤¹x” Hà3•“ü‡(›óû¤lxý'U¶Eª|ðœû¡â¶_ -HK<¿ÖÓ1MEIt G'Ó‚íÂä¨@I³ùY£º_£fúj“÷ɺÙiw(rÕ¸Ÿ¢½µIJyt`W䪋,‹šÕ_`@¤y4šVu.”éšÝè$W± ]Žoñ+&ÜjÚ˜lè ”òTìø3*JX×¶/ûš7Z {f}'’D2 ÍK[ö:Q[Æó“-ò•UóVh™E/EOî+Å0§ÝÁÓ2œ?Ðõ{eŠaå[8"µu/N‰´#ºÕí³â]öhTgO»ÈUt¬"+W¬Ö ­1%Ùk 8î“<•.Þ³$eÉ ufÓËDOuXÛ!HÈÕÍ3÷X¼sQñ9¯J€}Œ¸à«oé³ù„mX1¸pëì —!BÌzÑÉP‹Õ{žH‚†'ᑬûÉUÌöb—‘\z3ÞL3¸b)B2YÓ•À'<¿Ô•3¹þʇƣ!e±ý•9ë~@ÕÞ™UjF /m“ˆ°ìï|E*L*ªA–a;¾šì=B×fI—ÍJ}ÐDÖ! Y JZAå«o ÛuéB®šW’¢¾ršÏ2U±ìïæÇ’/’ížR^å:üjÁ¦éæçÊ%t’«ô GtRý@ãHxbŒè>»¹Úˆ@. W<ž(›¡df_Ož¥<µÇWx ‚:óî)·xb}–Ûç²NÕå#Ð#EËù0ÍIŽî*\†Z㟠šfôÌFrµœ¬ËÑíR쟓#~æ=&g$ÍêÚ›7²ìˆ›Ð_öÏ¢«xcœ?_×Ì$”“½~L[3¤³(Ö‹éÎïÉd_E0C¶'¬ûQÎVÛ¿RÈÕÒÿä*!]†¡¸¸Œ5CˆøH›Ÿkvëïÿæeè NÉÒÁ)7æø‘…ÏDÓD>å™Dd©oé7‚”»a”.WeóÑæ%nŒó; ŸN_ý!ÛH®š€¹Ê·eíƒõz,”¹ZSaË àáÏWæ  ¨Щ6ÊqŸ_Ðç_{¼”¡s áR¬ûˆ:¬ë-류ª Ï8ó t¤îa­ø GCο(ãÐóu8lSW\1}ކãÌ¥ÌxÔ&ð€ÎŽMäjúªw»íì!«bü€9¹ª+¥ËöЍMh…Ôý8¾µ¦$[ 5žö‚¥›&Wäªò±²UÊD®’†)lï­ÐÝ]Gͪ?®÷›+rÕ1FÀ‡óÑG@ )j¡ÉUYÏP•ßëq ª:£Ôž;T';SÖëSrüV¨EŽßÔž¤’p¦ÈÕ¥²Æâئ┖ª¼,¯odF ë„TÉ–v*³6h ÷›ÎH_ý.‰$pÎ\óõ$,˜VO`á‡Åy†Yi“(z€3Éà´JóìР)*»ú=À,Ô×õ±¹òöNru¸œ]k}w²ë—º…”ã–SØd;ƒ´ÈÔÛ)ZúRäê4R•¢­s%â,z6fÒu ´fdѬë'¦lˆ¼CíÄìCîÀè« ‰}Qã®”aÕÛêxâߘ\å_dN͘cÅVq3’[þ¸þ3.ËØú±GŠ¢Jƒ5««Ý®˜ùOWÅnÓ5ôäXÝšã7œÄV½”£\û©ì¢Õ;Œ6ZV—­@²à!bFÂì‡pàDM®¶5T`Ô ¶÷‘\ÄYÝ.›GÔ  „ ~'r•öà*ÁW½.1"‘§ý«;Îqž2¦–Þáà 4üIÎ ’³SËÈ•df³sØCm2ý‘èO"ƒÄi÷œìVÑ_–Ùù„±œó0QFq_ËÊ(Ÿ‰\Í>¥÷×kàÕ'úØñžç*{ÑÚ„ŸOqxAÈU©l9-i,ˆ“’Sk>”SY;׳‘>ƒÄd­ì¢gAø’-vž1 |£æoœ"Ë«ò‰eZ&š\ÓAºLHÅQ˪†ëI-…9TˆøÄ8ÉÕܳ™.CÔ~ÙWÆ®Ï<Þm|Û«Ê{Ë–µB [Ê3Φ†Î$@¹:åFÒTˆƒô¼d¯“ Êà‰¥ûV˜î§ã¹þ£éWê’—ã­eUgKu!M•éÚ‹l0]Œ¸œï£ªE!°O?çaµéò老_BdúÊ·{]î"µt¬ï*?æÝ5- Õ1[º‘«XDÅqo‰‘\]üâ•CXÒ'¨£¤H¯Á [·ÍÓçwg¿#mé+u)iž.û#ëg> óêêþäêäëÈøº6®z~ÝÚPAKx£Q]C-Ó’ÝŽB®f—H»R_VÓÙÔ¨#Õ'i˜p‰ ( á™Hž±Þ€|r$Y³eÓGBØT °Uâi÷$Ȉ+4ãÄkzÖ}K­×sSµ+³ö§6¤kžü ˆª8éÏAq¼¥hÛ|½|WΤp| ìgZ5aPLT✮™DVk_Ö»º¤æsyf¼Íݘ³ìH]øt^ЄÂp)ªV–¶Ö•J}3A²êÒDvM¼Öü4œ¾£Òü cˆMEr¨ë¤ëðúø@~šÓ«$ËÍeÝ™703c'¥íf=XuNޤÉtýXÈù£¤ÕI^Ë“Qõü0ü U+’aÕäjc~ŒÌ¡,{ oÖ\šÖ}स÷=ëVq³[VìVŸ¶üM9»½î'ôŸ£§õõ¾u½0ÒtUGGÐ69•Þò©dU–ÞTœ¤ªw^Ï`É!>Ûh¸+‡Pïu*Þå€yÆÛÞŸíûBÖÔ‡œo«ŠKµá¤H$/ÛÝ¿ {eXe…ð¤ÿâ[`~]¡Bóù¨+½K¶N@ã„kƒ^˜”£ÖÇF©­aø–’H'tU-@NƱ˙;†R“ÙT”Ä›KÓ1daYÍÉÕc^`fnPGDu›b?(vúÝ5 »d]¨:¨7vê-üñ–õ”EÉû“>E~'¥ç¼‡¨'¼÷¸4¹š¶b°TÍrÕ˜ø·ÖWàHÉ:«c·iÌO/葱¨¯E_$`®ÒôŽÄw§Ó%r[dE:Ãè#g96w£¥d 㮚4Ü&7`Œ"O®L˜ù º-Kû–üM øäëʻ鲲Nlµz“û%ÈÕª3Á²¿2yÞ•Q8_Ñ}‘IuÜ6}.ò”5{ë~äEº²J×m’«zŵ¸&¯oô–p’åTïó~ i­-)Ùí@LDÁxºMGp°ä­4ƒ›eþbⵄ-Œh"Wʲƒkôv ¾Å)Üe<ÞîG½P6Ûç;D¿DͺÊS´¡± ý$ŽãfõMa„ ú‰‚:õÖ-Ù“;çÑTodõéÄ?ñLЛ¬¥¼³ßÈúô£€ uëhF°© ¾DNC›Ù\ÝaGDÖ•ÊšІÇÖÏd ¥j÷¦i±¦U æäêÞ¥9ÊiK…(µ ?o#õWeÚ®6ÅnkÁi+W|ù¾¬WŸó´ž4`ÈÁ”RbâfàGuL„:‘á6}.rÓ§Ÿ#:!W3Že¬ù .í+Ú>ŸD ¥ºÏ€ª`€ô×H®ZÝV6MÈÕsaú¼ñZË^—‚ð³ú£`Ø`·*‚(ªÔä\ðxÆš!u©‡Ð.àM¼u?ÆÔH®úŽÎ°Õð5mùëŒФf¯¦c ´¼£½ÁÒÿä*ÂÇ䨵÷JÁØÊ\u ÒMüi ÿ—ÁÐÖT-s@ã¯*Ü:›%)ruvKM¡>o{—³¨‚ÆëƒVEßÔ ìdø­)*$ëi1‹¾ui‡ÌS#¹ÚTƒ>dHa™«´Yõº,Móa¬æ~UêÙxS 2”]·É$‘Z#-' zK#eد¬€jPsÐ2ko÷$…icPH•ÜGOÆõ W¯”ùDÛôÄGÑÖ¹½n¼ôëäˆØÉ×w[3C®¦’}C{¤.õ8ÀT§Wu‰àL—.†¨²ª-N[~¹JRƒ„ñä† ˜vB Mɉ€L×d'ˆÍ½Å»{iž&Wõf¥éwÑG=|ç+óðÛÉ /?æ©W“"m|š¶#!WOmKã Å­MºmÑëOb^?_›p©3¹¤®ÚÞ¥²jzÁã²™BÊ@Yðœ$t—0–ç€+x 7ÈAÒ'ýc¦Ü¨ê„'È\Hê‰>9ëBtF  "R«ÛÓä,c¹f\ ÃÚõvµE±@ÕªJéø@”®œ äê¼ÇÇB®ÚTgõ¶ó(^¦åó‚0+©ï7BWTãQ@DÜ—’w…rMW e:ívMÎè©¥²C.è<Ï2bÈ‘Ëtu#îQg·Ý!‹7Æ^Ž)IµÛÎ Â]L‘ ‚˜I¤Ò+Oæøsä˜-OPS²ïÏÅ©§ðB¥Va¼c0›”½\•eÌÙr†×¬þR?0å@ÏÊxM…ñj9ÜJu`wY’ÝŒ¯Õmy«âTßD…e]öºeb}g·êÕqÛP€·.ÜÅa¸,©iéö¹T*Þe¯¡5mÃUV %{•bŠðÑâ¬ûɶ²ñWb¹§&aæ)§þ ­<À8j÷èÄä‹þfH•†Ó€ØD)ïi‹ú1L5q;²}¾Ë ž •¨ÇÊÌVP¼C¶årsŠýóúuÞŸxc½ ªMŽb§2Wj&/£©(¡+.üâË'EÛæ’²W{âÖæ?=å&„\n (åŠË¢²Ur‚o©8±N§·:Bɾì0«Æ‚XÆðsœZ‡¢¢$:$Ó'}€¥>„q”*%Št*Ý·Üd×—"WÏm”š¢éGqS$,ªµ¬¬¨IØ™åùµìµ_òr}Ö Þ%…ïÆ_Õ˜{Ám±[“eÂâ*E®æàE5)Š¿•“âw;ÈîÎ¥oæýJR¦³*Ùÿnè w%!| ½Rå`ŒqK&J¨ª:«’’K_)ŸÎ0)&ÿm’ E®Ê¹ÕØ‘~2DRøúâÇ:W Ã$uQVÂ1ò7®Ø1#WÑ9®N¯ '…%…ë>…âáñ=dè$Wy©IÌ˨ž<€„óQE6nB©Ì ŽV˜ª4”÷NšÿâêZÙbè@àêP³gôŠÁ¢íóäjM‘œ·2á?¦ëÉÕç/Ù³D4pÜ•²èKèë+b¿mq£:^ê>ÜWmÊ~Ú™ã'¼1 à{1“‡ðŸ'ý”¨ßA¦"äôTxõIב¿Ët0*·äoÀ¼7z˜¾b°ÔrÕCÈU»'Q­Âp PΦwxNo´lÈ:™8ï~ 0h°¸¼€±¼N~×\’‚¾™Ôµ‹\uÂýR Àêö8Ùk9¬>½w^E“«¾VÓ¹`¹0ê)ö~HI W­ÓûYVÙ*g²¤Ê¢;5c®C­žmį6ÄP€mŠ¡º’8HPC“Ê,E5ÉU›{Ó×Êd¢Þ¢™Iîa¬ë3Ž©IÀg$¯7ttÈi*NªK?ŠL»VñÉöÑ%F÷ïéâI@­)jC(x@Ö ×ñ_]äªÚªÏÏ*9KËúNà´ÛiªLÿY÷chÄö{;Œ’¡™hŸƒ¢ ¹:ûa D•qîCpΪªó­²^.:\Ïî2½üƒ^ÊËwñc4Œ~ñ")X>‡WÑ;°©N€q»Z½ÜN, yx`©?¶ú]´KjÍÀ_[†7]ÿB§HM0ç>¶œce÷ÿÓÔ,ÅRù© ~eÁX-AhaÓaÙöóõèjnàX]åÛUŸu’¦Ê\ü¾åÈDÔ©ÉzÔãN®)ô~Uu$ã‚’_´à™X—J¯äM0YQ[×Ò+ qì8©¿ðiüp}ú^×H®Ê&¯ 4§Wõt6˜¤×e™rüúÔ›Ñaî§›¸ ®L-ì¼ÝSdøW²ëyé+ªDÀë¸Ç_Ûëöór¦žhÔŒû¤ø[êÁ\ÿÑrlnüƒª·™2Ù˜.í#1=Ä3ÁNA°Œ‚šRüu¯Ã âüÍwtåÛUo§:½–ð³Ú¤vÙaW}zi”*Úëé!æ²’C‹:kïh 1j­ã3º2>*né[9ÁSðÒ'ëµÝ.ì‘4–PÇê™YÌ“@8«?Š¡§× ,#R"NÈpŒúÜ(Áˆ6Kdbqð$ìpé3¹ÀH%û–ãä/ƒ!ЧãéFŠÖ©I¨!W­n+Ú:G§ À­¦¢$|#ÛÈqfäjA¸°ñŽ/¡$(VàD±»zÝÞ*²ÿ®‘Ít†bÍÐÑeGÉÌ?Óq¬‘ª rR–9ôÿ±÷`zV×úwƒh ZÚ"EЇ-RhKi–R(ÚBÜÝÝ݉»'$!$!$D ‘qwww}û]ßïÞ{æ™wæ• Nû?'½öuÎ0y摽×^ë^÷^ÒI`Ú¹4ÿe¼ZT o‹éä…‘Ÿüc«˜ Üù Á·D®èb‹Ø8„€v«·3,÷¡ÂAÛ†$Põ¼¼¢M@A£~Él;ä*.aî¡|¾ðÅo¨ËÛ(ÅrœÕØÂÏÖÒñ•¿óÉÕA‡S{†”¿¸=öþ…Gî˜}ð3÷Ÿÿ¯ÖñEG_þ$¡GpÙŒ€Ì3äêé!ƒo.M<Æþe;«eÕŠâ;`GâçýpŽs§€Ìƶ›é À^àŒ›–%szü5hZ}]mìŒgÍÎ4ì…­†ܽÆQ|‡Ä›¡¦´cîE›y.r  Â§©fø.ÓK÷{¸'jZ±ìm¾܈¢.K>Ómµ7A£Š,ýBöÞ©x…è7=ÎÃéF—êTtðhxLŒ*AÅ~=ùqô¶ÉOwâ‚P¡6¿ˆÓ„~Nß6_¦¾Ö^rÕ+©Ï•L¾ÜÛNmÑÿ¶¯4wP¢F‚«¶²$k÷D~©zkCnr\lˆYI\òR ª¯.”“ˆkÏkc¡æ¿ÄDÙF&ÿmMA[Qõ@£^hÉUlxL䪩‘eút·œùê þÖÔSíîiYòR¢¢6›õwÔè­Tx$ðÙT…¨5¿ÿ„¼ºæÓ¦kJr¸?³çµý¨û°•ÍLÿµi[`Å€ú²§k:F »Åw ZÃ^{åç“—¿Çšºw 6¯úŸV¬|m&D\¨9vw™’õ¸·†\U¦¤štô¾Ìo!bÀÇ"Qàö-Æ?ÅL~,çà|¦×ö Žæ4Ö»3“Y†QÖIǶr §?c«¼š£ü¿‹\5Éõâ:Š+Õžxé[H²¢‹¿\Êú–Æ#e|2:6*¼º¦¯‡G;[› ÔÇ­ßÕø•‰bhMZ5ß‘&åÖs_‰O$ÇgÄíøS>ÉUƒdTËwm'tˆ4ܦ®íœT>;[ÒÔ'œÔõB[|‰Ÿ-V¾›gáùÚ)µ£,áˆB³V¾¯ÕÔÝÈF •t¬*? ­Â¿â,#~¦ßy‡—ضqaàvv±‰øê_]˜ŽöSC–iOÛ¶([-ß¾éZÓ~×°Êâ øOß6˜+ÅŒÅN˜ÿ2Ú ïid¸W†á)Qcý‚Ré—¾ÙpÀ4à†ÀÎnVЬiö§†n¦à0+b[bÙ~y|²ÈÕ5<—¸A‡'ŸŒÿ0sˆð´$W•ÆuŽ­ôë2g1Ø&î¯X}®D¯6‰tâ1ÜŠœóø"ÏBØnti!ª¸;óyÔ»-áÈ«²%S×uчtù>_gÉU›å¬@úUÖCÙsCŒÍLz'W6%,ü›’|ì_•]ðW‰wF_™~¿ôB®†îÃÜýb‘«ùÉ•9±&Ž¥­ªÖ|øJŠ©{<ê&rµç¥æ=]*£×©-7熈‡Íæ0QCç"´,½%©ì·ëdmꓪ­:íéò”‘«íÛàî™F{ºŒÏDll‘__d¶ÿÙÐñJ…SlÁ=W}]Ô˜û¬+Ää…õ{ä—W)ãY¿W¾ÞŽ‘ØS+® úÍ’«†ìuYrõè {&mCOa'“ˆðÕ½×Èê²È±÷¡.š~ér!Šq3žÃ¥µgI¹Šá“Îì|N½;œS¨ê‹ª;õ)>iç=“–½£€Õîíl.mð¤g»·ÃĨÕûŠ"Û(XÔšdrÂÖúc†¹Y™_­JÛܽr\x‘«ËÞæ†(™´½¹­J+¯éÄNAþ•±˜å«X‚ãk™:.ãåÕKñäzÀ!«†ë ôB0T†zï4rþW+ 6¥mìeÛ‚x’«xµ€Ø©¿Q!ë>WâÛú²8_›\íri_%â´4á¨éïö¬¸Ú·±äª ×0“J9昃9[X[Åg:c1k‘4ö»“eJ ÝÏ\÷P˜…neá« Rl‘ÕÄ¥ob8L|ìù–_5;èÛåD¶fÕÜ•6ð§ªkÌ oÛ"a¹é5êëÀ6 äjÜa¾Trh*½³.©T–œ-Òë2ÐQaÀf„Íðó6¿dn-¹ 8A’pU_g{ß0ùêùÅ"ä#kSŠ0©ª±ÏsÃv™¦9[ÑNìe$!rÄÃoCI¶à>WÒÁtØNž+kûá_ÀÈ63zýÀ’ä@ÕïEiÌxõ‚š5äj/ÞÖÖSR}ï5=3Pþ’¾e€xæÏ¦ ‚]¡„„£*Ãõ-ÉUË2õ½*°ýÙ'7¢äœ˜fÜ—iež{x±)×y1æÆ)]™k[ééôaä]˜u{Ú.¡SÛ!©äj {D²ÑóR„De꽑¢"W{^šûÅB]r#j5bŽ#Û!´¦Cèí†×m6°¡Å’UøZ£Sö‰I«ü1༦,?MhƒL*sãS7ôpÎ& dÉÄœyòu§Ô*-'rucHŸ+ZÄ̘êâO˜¦/hѺ¨>ÜÆC&.yýt¼×¹ÂâøíbzRVµç‹Ðÿv/+ÿhÈmqó_Qãéþ×ap|¼ÞJv{ý˜}ÁT›ÂzŠ–¯ÊKŠu7Uš³¤6 _‹ŸýG¶ÔØT@ûà<æ 0€/‰ÂL`‰T5®ó©{a§ð}¼VÖu¨¥¤,û™Ïi 2ó9“Ft ‹;fÂbûXœÆr>Ÿ©Ò`¼ô0µù›óGŒ3©„QCíËh&-{‹7W©Š©O!¢\/ævñëÈ0NA]UóbÒjdè-à7|Nø°[m$7gSð8L9ëbEZe´-Ì Þ£'é°+Ƴ®VQÈvV; ¿+jm_$Ç‹¶ØDÀz9Ãr"W·eéM±}uSºÄÐ[rUáµë»‰LˆÿŒÍžUÃÓÅîõ#åw8[Mfý}•—ñ±ߌ\]•Û3¸ìá¥Çÿã|à™ñ]ŒÇWö.;šQz†\=#pÜ¥éá©k» ŠÑK(jêË$Ülëù; Lƶ!à¤eïÚjç6IV€¹öè°¦Óy@ASgû&žJ‚Œ¸ÝFX}ï_pb=&>aÁ«^½``!@®‰\-ÊÈÞ7Säj}RSWõ îÿÐ]öÞ¢z´Ã¦c ñÐ¥Nðì=“mÇyÛ·G¸Ö)昪ÏYÊDd<ú·¹6+Ý-“˦—V#Ô©¿ÉÜ9:|ÈMÀu¥Îy«Õð')(ÛØiÏèP¬ësÎÃQñð1÷*‰µ1¶®²Ä¦*DOhI®ÊÛêvïÛ£ŸÁ9ÕEråÙ¼û¢(£cñ§Lã,fþѸ *>æ>ÙL¨}YÑ€C®ò{ë]6›ùºÜ%[MÝ ¹š¹q86ˆ‹IÍÜ9†±ä*f·ÁV6[ÇjìŽN*MýŠìÏg*¹8'Î62ð/!8Mjg0íiVdºðñëSÖvR˘E¯™’ûª-ìT—rÊžnN®ªh^z¨)˹ö¬Rüä‰uÅ1ò± äj}-Ò•ê¶c¾kJólWVæ‘3äêïðÔL[íI —ROäGðãpê'"“¶´‘Zc˜|SfÇtVZú–!šŽd66LÉÚ3Åž8s½Mà-ŽÚËz!IKÞd'ÆFGT×Ô¥äzw>ß–{2¨fê5{%€;†¹·íù|€_ä˜{Xh(5~PI‡U„ ¸ÎÊeÝÙz¼-Rg/cæóŽ,µ ß4 ”íß÷jœoÙT•œúÐÈ݃à¶žiIð¸K ÎFÜÑ@®þÛ…³fˆŽPÇõxÆ'£¬¾†E`@&Y»Ç›œå6j4ðgi›ûrMjcÄHDgùp~Ÿ«ªnÑs|êÐ~j)Â+•%@f‚»éôÁ‰as†²ÅGß«cëiO›díŠ\í-[‰õ\Þ9#ú„ò‘ÎÇY`«šêˆ?>e|<‚7êÇN{Š?©.LÃ'ecʽUl¡¹š‘õéd„£¥Ó7÷ã3Ó6öV¸Ýº®±ÓËzñæÈyôø‡=ÉÕâˆ=ìw“«®l…jÓ+œ Â,ŽÜ ¶DNL%µ·(-/ÀÅP?è‰ðáGäç¨}Ÿ«JñÕ*@&ªÕ´ªdÚqä|ê”úÅBSþ÷0ï€ÿ›i’þLËï%A]€ó¨`ïcäOMyd]¸aÚ¦Þ¹‡¡À»áƒnP³#¬bƒÂác•âÚÿ:üwUbœõ;÷Ê0ù_­Ô™Ñ„_!¨j„d¦^Wtl«ýnÒ™+•"ìy)°™=ËSl‡¬ì}3ªó“mƨ{aŠf 95ˆ›Ë/˜ö´WrU”¾[²FEz†@ïãÖó‘NXø7LŽà •ÎÒ Öxƒ†ºPÕø™ÊB®ïnš›\²Š\íx.sÎþB+2E6ûLEƒ=äÇ„%. Ø\Û<™ú”ä* Šÿ0s^™Ôí‡ò£;œÓ’\UIJJûrUuQL€Üø^TšF ¿Mäê‘ "W÷Lb7ÙsFv+Ë-ª*=TEnMIU{=þ!–ÕT_¼šéÅñ\Ïz1'e‰_YrU °ß2wcÙ;,¯/R3÷ÕœJ2hΆ W}üì?Xb*ÿØj,3ƒ< È?z²<=•/¹mˆc&ÈUÕRœ¡JÄœÜૼ‰ÍÚ0õü´Ùbï0ÍÚŽ˜º¬ˆ–m“Ú÷ÊÌ#­žäüPç‹ß`õÑí<AR4Ôø‡4*º=!Ÿÿ’ò§ý!°Ç¥¶,ºOfö˜íÓøï’íÌ´Ø#$¤ˆ7áV|©“ZhÉUæ#¢$ýY¿`ðçìk^ƒ[irS¢ðÅåï23ªK<îÁ ­¬8×(Ë©¶*yU{‹"{W¾Ÿ| J¶0`#ºÁV>7r»Œ¡Œ™ô(®+ª€{ú",¹ŠxØ:?ÃVûTå„¡·Xh„̰MðO[fU„ð‰u\Æ«: íd©TæÐ’Ÿ%QûTØïêŠLüQ¿TÓÁÐtÊ» °ó÷–¼%BoSo[¦C=»]$–)þ0’†õG®š,&€!5æœó2K\ àAû¡ßÜ-NMqskbÚu1)¢×›BâçÅNýÍ/H¨ve¿k„|oH¯ËÌAùO€µ>§Èå*Û…ä(€íÀ\”¿ _ÿ•ê\™"NX.î`K«é9PvÊlæ‡yC–=K®º}ZÒ%ýÕ¾RÝcW=+Ŷµª%Ã5h?m·”5°[þŠ]ñ¨cî-8¹¾ÅKò\%_ô¹ÍÝLBÙT(¾ïÕI*EUóÙ¢ŠÂL¦ióý¢9èélÖ¢b7ëe‰Çe.×vñ•žðŸˆ°àäF‘«C~Žn‘x¤œr•¡¬ÎçcîÑÒ,4’Ìvv5ôXmõ0rë„:Tå%$/ן×iÑW+cÌ©´)zóýyú–\5 b#R§ BÏG&½æ¼[rÕf^  P,¬8K£âÀ#î@£bÊßþ,i×ög¡¾n’¾«¡ºÚ§¨ „Ó¸oÍÒ*‘«=O÷ÎQM•±÷EŽºqU;ÑšJÏÆL§x\U‰-So k7ÍLø®Ø©OÙ4@•ÜÁb¸ëªÙ¹€1Ü  àk´ WÒ%z^ê$ZÊïë}UÌôß*ÊwðMh-_m)0ìGä LÂþµ=Â:^‰õÊÚ5΀j«ºLÓžQ&Ô²·ÕŠîóYìkK÷±Ø_i¼îu»Eá¿hƒêçZ ,žÅ¯ƒ*qc2Ôù|ëûØÆjh3\$1P À³éIT(O@·à`/æ¿Â2ÉýÔÿêQþ‘£îŠy&Éœaý ¡Ö G ‘_£évv•3wŒ2­µ,aQ™qëÚqi¼a·Yµ^Q{MDÇCX4 \Ø Ÿ™ƒKÁelÊlcÝpjRÖtÒìÄ'¢Ö2áç¨ÂŒÉP*Í©òvÁZ8’ŠþÚ7C)r=/UcÜÁ7ªí£!WùŒ ÇÛ‘¸ðUQÓ;ÇXMAç¿ä4êU6Áߌ\}ïPæó›#þãà™ñÝ—w&üsêrõ4ŽÃ+†•䦩¨ÈòwjÀ0‹­S‡éd›+wÏ!W?Q¶SÅ ·2•Õ/ðSWéYðÖUmâàql——•±qDø Õ±´ç¥Y{&;䪒ƒL[d¯Ãúeøƒ~®i1xa|\3McîSHjc d3 ̉ÍÞ;ͤÛ+VVÛÁUoš8_`[©˜„)O¢À=ÉU~™þ[{°Îw™.óµ†oFåªÏÙ?;bØ-@Gó‡Òvªä?ì6ÓG{´»˜0?ýßÄdæ^ŒháêíTM%jYÛ·Á)fG›ò¿_r+õ&ÞÔ‡[áãàSðí W.ÍÍÚ=Áß(½©SâÀÚ.¦ßJ­) û#ÓPÉ_™;FÚLN€iQ‡šUøœ;¹z| ÓbêH¼ÞD®výa@‡³™vv2g\§B”½.‹âã#„UùI¨A?’´üÆë‹«‘\Åp0ÕžäjP— pEݯG-dÆ ¹ºg²©0¶ÍeâÞYw&„í©ô®Iªøm¿kl½UÞØËì—«XYö¸s¬#§—oµ„ és¹󉻊’¯ÈkQøë”ä*B‚õ4ç>“Q/¢:ÍÞñ$W•µ1ên$Õgƒ¨_ïËB¹ü]T„ºq~(õ«-̪R\ßh} „}—²º}Efj„¯pìTô¤Ç¸BãVüX¢ò}®Œ›óGŽWBc£"í¶¥¿Ê¬õ¹ÂHsXh†×êë ¯º#u}wËc#åjØY®zÄÒ”¬Db7ðIKßD6@™;ÇÆLýMeVt¹úñ§!Ê?k÷D„ß’3²ÑŸ«4hŸ+u<ëw ÜÚu܃6ùÔë@¶»µq¹˜“˜©O©f)û·ß5jïh&­¶¢Xñ±Ý.« …ð¡l¸£I5}AT @9Ùåê­ÖñœÐY ìùcS©ûFŒYGnùOÖT-,;§°Ìž—ò Œ¾Ø§1÷ ã™t5’«ükyJ ¿ÇàǨðþ€´Íý°ªÌYW“sp~êún¼0Æ‹•b°ü§)¸]ϱ !;K…vŒT›¼ë‹£ö¥o‚AQm÷vxÍMäjû³0Ð&Pö‘øyR¡ƒIøZßruÖï½Úq÷¡û[‰v6‘¨A]¾Ïîá êªsÒù|½sÈvåV8™Â¦V€>MQ"¹ÈÏò”€„y/ÙŠ… º;±žY²QÜ:èúÃÀî—$­ëá°U–¡UaŸ)Ob‘ÁN(®¦NgÞÈU” ç~ÒÚ¤RÊ ”ˆÚåûØ/Œ©Ú„õ¹"Úô(ÄF›v&›Eê(Èá6)o5î~Ô&Þϙڞ—²%Uç0=Ô@Êǰ¼ü9+ÎAž˜–›+ÅwÍþƒMìeR×u‰ûŠÚ½¥Ò¯’OÚ–øù/7¶Å©à5¬å5®rÄ$ŠBÉJŸÏLß:P•ö'>â™hŒ­4—ˆQ5בÆŽàCL‰à}ð—å%¦›ÒyH,{á¯ÌŽMÛÜÇJ/[ü¯%Wëj+!HÐAçÐ[Š‚·ô XCµÚ9UÇSæ5R{¤5î!l½åùëªÊ ?2µàÚ T¼ƒ½¾º E]~ÀQbÃoG±û*¿ ˆ²ImºÝ’Èï,óýñp6» Íêö‚‘­üÊíÃÔ#jÊ“ûÛ£/wWÔ[}å+>¹i!j«€ú"„M-Œ¸ÉŽ<9a³ã¡ËÞÜŸ ÈÏ‹‚  YwÐcÜÌçŒíXÇõ Üs»ê£Fß˾¶E$¸Fñ«cî·¹#ïÄïãëlûK¤‹ïBÙòQh-€œËD=YpÅ.CãY‘Æ-Å}pcX1(=ÞÜ6DÃG«ðíÉ;'Fmb+öØö(¾{þ6“–Ê[OÕª²-½~Œégטn§Øe|;³Á÷ò%ž,} cm{ªÍâ²wLÙ=Ñ}3rµOxå/ç~ñ'ÏŒïn<¼äX—“ÅgÈÕÓ8ö~º‹¯Fo€LðO3¶ª«,®ÌŒBo(ª°ûŘ€ u½ÑžÅøâ> NÑujÝ2è4ZË9Ô3ˆírÎ3cn·GQXFµGÿŽÈÕàmØßÄÅoÔgû² |š=ñÇ0å|>Ë’«ŒøøøÈéÏ£*m[^)¥µ]¬ŽM˜ÿJÆö¡ö2%ÊmêmÈúê9¥»Íûsæ®± ;UhÈ­ë (ÅGŸ´¸O-qÉ"*#÷ð˜Cµeɉõs¼U‘†Êç]ÎùGWðE&˜äò´½kÝ=‘«æ*ôkú3‘£ïU'2·ÈU 7€Šç&¯ümó\,¹о zëÓ@®v8ó¡ªØCk ²²äju~ HØ«u`!zc¶m‚›MùoñOù¹YáG*‹Mv ÛÔD®úÐ=¼Åh(×vhŸkZ P“¸Ó-ý™v•}|ÖPäùGùÙ¦+ªy·Sg$¯xÏ´È\Õl³c~%±ù“ªü$Œ3 äêÄ_×V‰\MµÀ,»ˆ΄ؼiªþjuQºµÝöR„üÖAÍÒHã‘o:C©ÿr¹ª¸¯µxa$$Ü¢ s;[*ô¥0-..Ö« ±ÓžRú‰©8Šx§nè9â^U•7÷Å)³m³°ã ´Q¾oXX6øÆ¢°9æDŽºËO…(>_ÔGß+“Wþ˳_ ‚Â6å•cXpr£uT€qÖïãf¿Ðl ¤…ˆîØÔ›µC¼Ó6öâ­ÜÉÕ¦+3™¢•¦,ŠK^þ«i3ñSÖt¶ì~´-³Àk¨@›È-‚h¹|ð°?e/çüÄygÖ«º(³¥Ì'‹™ò:0qáßLÅã6IKþL²«‰™Áêà9â?ÆÏU?np#ŽIÒòwØDMäêâ×ñh _ËSƒ<'XG”*úª8l ÐªŽ¼/—©d¨éˆd›¸Ù’Vžä*Ÿf+XÚtW‡_[U’±m¨M-g‹©÷ú¤GDT>ùGnfYUoÍ ÈCíØm…ü›ŠÖÛƒòáÃñ‘U=5á(ª&bømˆeIô~~`òQPy‡©²Á¾™ÉËßUÕÇþ×E½/jüCÈŒú­Ô׊@è|>«l_ Ó“´äMô‹…öàz®I\øêÈ]ÆpXØ¡¦|럛X;‘É8ŒÔú\,îõƇºŒ g-ÐÃ5%9¦‹ßz&D-k7ôpTk‹PfôªöŠíÑÎ!Wù|`?Ûª*?¥ÅŸ 4Xe÷ö eÉ'™|[¢\”qlMaÛSû¢ÿu*ÖÑ_$pÌ¤ÇØ’È0H;lÀO¦µ¶3ë‹'?¨Ï•lIkds/²9† äÖÌñb|Aé¢Å|·ÏPÏ»ù¯ Ô¾9/òJ®J?¨ºïσPÍ¢£âPƒhW•8S+±_¥ß.ruï4ÆŠ«úÑŒ¼Cš9;FjKþјaq¡i\¡žòÇתqÏñ\T%‚áÝ"ÇÜã2-msv%¯î`"3}R%(jôF¹Ú¤`]2¬ƒo0±Ö›+ÒBÕÀÂHÁùbG³vª2ÝåL¼“'‹ÍÊúlŠÓ‹Ð¤ÃÄÚô˜ÉÅÍúÕç 6²Ÿ2t–åvú5Û÷©Ê‰ã&¬#‹ÎÏÚ5ÎþS]uPääö¡A/ª‰¶2ä*ÂÀdŠí\ôÂljû¼#oqîß{^ŽGÏÙ`lÛf¹Õ ]a >Ü­«¼¯fùÒ· (nl”iÉUþ•¥ç¹Ì„Îã6öÂ¶š¤£¬;»ýŒ:R«ÍÙ`)ÆuÒ£öÛÑ«LŽÈÕ¥oéý· ‘ƒ|rCIì!l"  Åï“W½oôÛZš=yU{Å M{½»5îAÏr÷Ζçµy®Ö < RPtBDÝÔŸ´"3‚EQ€i±èLd ˆ…ËÜÌ6ìVÛ¿ÏÐqñfGǤ®ëæ´’ä&2몑{šG-Zú\“¼u„ß³ÍQ8 á›ö4ûN­mV¼çÞ+³\ð7ru’ÚíœçùèCñ'Ãn- ÚZ[Q¨÷¾W£Ù°}ê=·ü]¡®m†`êÔblÀO”/Üïj_É ;%bÖ?çà<”Oúæ~ü¹º~ø”wC^TxG böæü—uÆÑáV[³6€¶9 r±qØS…Á[‘v=ŽÌp+cy¯ÊÚݲíNEV” c®ú@ÓåAʾi%Ç ¼£‰|f홤 9¥¨âã*++½¬¦o'.þ{ʪ”uµ±'ˤx×/—€:Pò^KŠý— “C=s©hU4Œ9äbZ<˰ÝVA  ¬,‚aÉU•GN:nj%µÁ²Ô4æ‘á=)&¹KC‘(€Ú½±èÚG>ÈÕê²BÓ8û… a‹=»3¸ÉUs~ZÆ£èbŽ}Ív~]‘ê¬ßTäF¶ýœ ù|ø ÌÌ6iÑdÊe£Ù75nöNç«ÃTÇsÿ§ÌŒó5 ¹ºÖ‚\ÕÁ–‰ldþ‘Û¨ ¿Â⨽ãÄGÔÖmSy‚¾oÛ’\Õ‰á'¨bçðÎ4:<¯gAµ¡¿n¡…çÈûriYÒ nÈÒgîÏ´¨žjÿëlJH¨éb¬8«)O*ssï´¬]ã3?…ÅWô²°ÓBȆîù#¶pöÞéü§¯°É†…¨¯!ð±©ëº Ä2wÓ!Wû³P2H Š1çó™"W¿\‚¥@ ©òð¶¡|5¨ <5PÚÓhμ£+lKìšÕ6ხg›ó'h˜ø9/š:äwˆ^>±Îú}¨h¹ÒóÒø¹/ÊØmé‡|&-U±¦ò´`‹ó­aKM}!…B-~Ùõ/ Ø„a²1Þ¨ñÔ½XDt»âvŒÀ*ʈÜ8¹UÍ"…6µán_«>0jY©‚}®ä&zç€Í:OïÔ–¥Ô!ã„_!ñ‘SÖuÁÚ–'Ÿh(œÛñ\ô?Þ­?ÿè=Øì›’«ý#«ÿãìß™ñŽ;fè^u†\=ã³½{ùf9 D‹æ˜‡-UªçÖA`o†< ÖÍÚ=ÄåáÛë*rä]¹*-Ôÿº¼Ã‹tG߃¶Äþâ,«íìwC®Ú 6øeÎk‹aóô- ¢Š©ç7#WgüÁ¾þ5I¶UJEz(ÌI×* ÞŽó>äæœýsü@à%®–­£3õ©Ô½mmR”^‹+U¼hÉ›q3ŸØ`_¤óMÅìùœ¢Ê¬(!Š·<% •| 6¯3rĹ?tJ¦s“¼/‹Aö4ÓìF®ªny÷‹Á¢&ûïJ@ë$6« t|»*/¡Àt‰U[™ž?Âc*;ÌÌðÓ~¨C¹Z”©,õÅo𵕥ü§WZ’Wå»°Å^ÈÕüüˆÍcl~+S¡*y&°A1¢‡×zëlGúÖ6ØÆk¿`ïÃ¥„qÅ‘ÖVUæÆãä|>‹ÅJß6㕺®+Ž  Î× qî<+æUå§(šp×7’«ðPá¬hì8æ”nÀ.c©Y&6gß M-/b§¨€Ø ëíy(à¹Ü±îƒ] ¶1…Å^‰y‡MülV©ÏŒÂ€¶™:5x_Ö»\qññÕ558˜J³ðKM°‹r0sì´§¢'?–þÑ ƒû¨6æ¾`lÄ÷Ö¶ö0M„O° ÌŒ_rµN5N bD~Z~Nq&F¥á:ž£jÀ‹_çVV“”ÆR²óü—[l·bíÀKŠi™ÿ’Wr•OŠ4 lX—òBÜy¾0+"U–l[ xŠoQ¡Ô_ÚkгxŸ’˜ƒ¬{Y‡D}®T-åM½Kc"'`Þ9}Û‡fi’yÓ`ZÕþW¾oó@SVµÇ³(8.0Ü@®–æ Î|^ñ6Û‡²ÑpQ¿¨‹’¨½j-·ø õΈ@lD®¦{’«\Àü'|øW9XݲUè@À­IÌTô—å[t¸ßǃ\ÿ’YT†Zµ¦Áq‡­Hç^¤êE¯9µ›T–Aµ~ZµW…×44ïSÞz“™ÏKìÝÈU|Ö§“ðÁË’OäµJÅrç¿\öIÔø‡PÝ8exÙ¸!L)†Zf#È)Xò̇Ýù€±­9 €÷ â¡=†SÀ5IKßäU݃L@¼¶ò0“?ï%÷þä•ÿ{‡jMoŠs÷nfq™(iGØÜ[ª¹äD$ÒÚNj•Ûû2wr5UÆâçžà¶*7!ëÓ‰©ë{4IKZh”< ûÔfÈY&»ÍnvþíÛ¨:^˜:οˆnÄåQ:óàùüÓ¦–Í=áag¥˜sÛ¬„Ï7ƽÇ8‰\eÓùîÓ0°XRSûç0H²âú:µm¡špµØ’€K®Ú_b)rÎCHlÁØ&ruß ¦á‹ÒsöÏ.8¹ž*Òð•òUü$ゞÁøò{[' áÏÕÉ"âSdÃ’Z•}Dޑ刞Zµ>܈ýa”³m®×|¸Xtø¹`"WßADÓ¶ôdzc¡M£±Ù|¾z)º•ÏÞ7]ÔÞlZø¡îx -™þ¬(n£¸CI¬Ï6[¸x|cóHBÀšª˜ÞôgUµ¾‘\e5‹Ãv©fégSð|-/„Ú±õåÔ{Á8ÈíÐxHKè¼7{]nŠÉÜŠ§†~ÃE¶? ÍV¾›­Úç*ùû†\Å+¸Ò™(C®¾ƒ@²ô¨,¶[Ìõϳ¶.pIÌ6¾Z40fÚShu¶Oöž)6xÞ¦uTåÆóÚì,¤N ØÆž(I”FYÂW¶QþÑ"WW¾²Q—,ûŠÉãÎbÇÞï«ø¡òúÇÞ×:r5•¯p›U_³Í)ÿÔD¬•%cY™À€†öè—ª+éÊ$ÛwPkõݘ½ÆYª²5øL“ }]ÐÀŸ':ÝÄï}¤êý¯ ô3›ãɨ³Þ¦Þ@eçÅ,¹ÊîvZ,ù!Wuð4ñ‰'†eìÅÆ ã8þ¶mÞÑå%Oz {ÄÎxN•j|$ ÛÁþR]Í£ËMõæ6¶¨£ÉðzœOÆàÑ ó_ÁXr5qñßAþÎ) ØTS’US–ï‰úê]u#ïÄr±íCйÏ=¼¨\ýt’çk`Ñt;ûÏžS|uô¤ÇlQ#^Á@M)ÝXy=D®&&VVUY}2çÀà%åR×uSLõäÇÙSì–Øó ì¿g°­De¸CÅ”\õˆ.kaºŒ¢Šã)GøàBz_Á­Àf‰ _Sí‘F—§¶¼ kÏ$Ö=s÷x§º=cÇ•ƒèõc±y!ÛUávä]ª»Þ£] ©‘\-ÇÊv¾ƒ©ix­Ù‚ÆVA @uYEF˜­í¯=cïOXôZôb›MijÙÙûfúQò¾3†š²wðTÕ…©j¯f‚ˆTmæó\Éo|®¶báJØõLT]ó¥±_`2¬ÌëPrÊ“6°ˆÞÎýb¡-׿k0P6…¿aª#?Ói®nwíÏB“à° mlÀ?8 ÎÄ4x:/-؃;ƒ¯»~`޲ñ<.sL† b/+óeø/@ày fTer£öÅLùMÒòwÀ¨qÄò±%Ñûù49ˆ=làõˆ ØØFP^Õ—Ku¼'¾NI=íÛ°.*µw:KŒ¢6^XaÞá%VðR×uáí¹3V¶oÈM@\l¥NjTÒ¹†ãÛ¥H­ÎÙ7SäjjPQVb䦑ŠkE)µ?Û¦Eø9¿ö€7|^ i¹¸™Õ…ôºŒ]Ƥ©óæ>x¯…Á[« Rl€1V¾ðäÆÊœ8<26–ÔWúÆrõÌð5Xå3äêi–\e«ªmÓžÉE¡ƒÞ1Cu•Åø;jJÒáìèñÚÜá¬=SjÊòtAm5&@]k;ž5æ^‡\MZönøÐ[óŽ®@&.~Ã(ãæ«dåwC®âgék雞…:í0‹Y¨†êN®FÏ};¥Zý?‘¦4ÈeΪP§™î ¨O!¬ÿµ9æú4(=\-°„QÅ?[’™²¶‹Òš_‰Ä¹Xmb†Ý5ú^ÿŸY]˜ž¹k,ó\_S9ê.¼à}â’È;v‹#ÌäYf(•;3Ylm¬w tÅ~W«N»i€ š²N¢:‚½ßdItľ¨‚–½¾Ëéá¥ñG"†Ý–|hÙ–õƬ×Vae2=" Z ^ŒïÂôB®Dl›Œë„Ä;¶¿T.†± 67Üë0I Wâø¹ÆÏ¨ÊMÀXã$.x5cûp…alîë?n!cû05+oN®ÖU–¨B–G°±;¹jz¦$‡ôüî¡Óm‡u S}›”‡µklâ¢×YµÐþ×€mL•΀O|Å0—D~†´³³"Gßmº2©B]‹kHªö£›Îž‡à¹jÚ=ÇâšZOßãüèñÅ™\ûÌ£ò­Á›VƒÝ옲”€üëðs £2›WVå&ª½ÚØûü¿B\Y\î‰QyüšÐ?1’y;ÉSw8aÁ« _m¶k²¢E®nî‹Ì#Àm[ÔÝ3ù,O>Ù"€ ¡UnÑ„_)¬ßÕ9ŸÏl*&f²DAh¨©ÚŠbD‹÷)‰9XSVÀ>E3¨·òàùóS›T‰´ÏÍút‚gq?Ì%ܸl6úB)W£~i=hK®"!L 똾e€²Ñû]Õ¶Ö– ÙUÝÊ’Ę̂¸ϳ…Q#ž;Pª>¼Sž`/0Wn}Æ]õ5•lÒÔ =A¾ÈUVÍ6géy©C ºþóVnxxCs,ÕßÉ¿+OPblKäÙÕÕŒm[ñ~ó^BXrµÌ\ÅY`õÈÕc«ÔkêS@k·ÿׇï2uÖ©>çôgÃvp¾º9/økiâQD1`S…í´…g•wfª€‚„I;ü6&'yÅ¿Øîä*~M䨻MyÃGâçþÙ\¥ ´½…m¢œë¾W¡±Õ¸çÜZЇÛ‡ú*?R©ÀÂÇÙ}Š«ìsEêÆFrU®JŸ¨±xÖ0äê$÷ «óÓ醵(nÎøI\wŽEÌp$Ù¡ £U>ûÅ+v¹‰J^ÝÕqò$Gà 65˜©.o<Óñ†\õ×>C-ðæ¿>äfÃí¸jJr0,YEó{²4x…ìJwrÕ¯ãc[D®æ|>‹UöÔo²•k:á‰àgáõ³ ,¹Š$§¬î :r].HYõæ[¡§A[Uèuòöé ¢îx[–xŒß¢;s3S–W™íy&â2¾0\ÀÁÛùÀä•ï³¹P ©k;G¨F9/"WM¿Å¦c\‘«:¦lÐ$싈¡7ãj¡{­°A?³±ŽlC?ÿÐØh äÙí—.,¾Ì{\¢øüá·9q}†"8ˆg§Ý4èXU‘† ;ý™ômCØÎ¸Š¦ÞÅò¾X„G¶ðÝÀ^W°I™¨´-ýT7>% Á”Fù ÉÅ‘{l‚<ÎraðvnÂ1÷N­J]ù>Ê–™AäPP"W‡ÝÊkÛòªìbà";Ø7ó9•³ÞÔ7ïÈr°Bh£Úÿ¾WÕ”æ1c:\ÛEäjÐG¼Læ'c2wté~1X+RŒM¹Ê˰â(œý³QÂQãôå6ŠÊ÷@«ÈÕ´Ì#…À´TfÇòþ¬²…C¦½Kÿé\†JWû?£Ò±Úö¼ J=éܹ  û׳µ‡ßrh…(¦Ù;#ïB¤¹ [yP0ÿ—KÝY)‘«iÁzŸÆ„z°Ëê•\e ‚’WþË–…DB0U¶z/sçh[ëm±c¤ï´§m© …7t'u=‡ÈÕÑ÷l´Ç©¡}¯V¨üº®ªds@ãçþ üoêXŠ\å5ШڢùýÜ6vÚ3XÆÄ…¯"óö7 @³Ý:x6©ÁJ|“!̰gìeú‘5,"«Æd_kR•ûº“«˜ –’ù¹š"eO©@ñ†žIKßÎÞ3¥ºà¿\ó+vÛ^’Òë²ÓC®êèüZÄ{bTÝ¢Ñå©­(4åÚdï™ìnf•0e—¨#-W•gCD¸s’\ã7¸>lÀu:ç5…¿lîxÆVª÷¸1uc/Ðî0jÍF ˆz÷PØ l´< A™çú°$f?Âè—°Á7&,ø[Hï+4-{&¡cðEÙ)›Fay½^òcú=aúb3ìÐBÛ©°ë™"Y½Ûƒ¼vƶ¡æ8ÞUU ve_ocsØ¢yÞù–3äê™ákœ!WOï°ä*€WdRáväT]”®ƒ¡ömþÍ6ÈÀÑsüpu•Ðé¼è‰¿vÈUÔ ©!£0-ðaþñ5YŸNŠ›únÈÕ“H›¼ü=_ˆš—ÏhŒ1ó$Wc濪6Çê yÆÅ¦æUâè­î˜óùL{àW1¤ç¥hf?o’ðá+\ ì’½B\—±c„R6ôô$Wqˆl±>0’­ï Rõÿ™˜N§¢ ¶ (x+ß‚}IY×¥º°©Ç!W—«âèqÒ£xý¶Aƒœâ—D ½5fâ£EAÛTdfÅ¿,5„%~ ÷å¼*&£(ô“FrõûÕù)e _Eޏ£8ì^@å.§?ëÿÔ}`a1gx£^ÉÕ¨³sNÆ´Ëø×"rEœúôŽU¢V–t•Ÿkü V'j̽  8GC J|$PØQ¶Œ—lM+á\ý‚C}ð¯|‚Šêàné—´ìv0Fñ9ó^`»}J{ÌVÖ¤¬Þms9ÅÄz\£.|/e]WÏ6¸MäjI¶*%bÇæÚ†ÿ‹à2ó¶u¾*ËÁ„ÛQÔÙžÉÁÝÛw¿ˆ÷ç—jm?å ¯h¹aÔ×mEìARÕ”æèt¦Óy|2Ö%~eŠç¿í~½*ÓŽ¼WK-Šð˜vO®c/ø.fØl]*Šù¨ð¡7Û;âQ_É41WÁ|'f jÌ}Jt­¯åhVдZ›©(èê2Ô{*çÀÏ®våi!€:ðî° ªI]ßŲY äjyaþñu1“KßÜõØH®þ¿Oõè´¾ï Þh~fÂZ/Í\. (0Ltå?[hW`^ÆÇj§C5ëÈÖH®òáÃnñÚÙGÀiNœ‚nÇ”§23é[˜”À6ñs^T•GœÜˆ~0GoUøÎ–\UaØ#3?Už|’gæ]‘0ÿe4ˆ‘OÆ”˜òƒj¿•¹k,𞊟ûGŒž²¦cpv¦j‡Ô+…ŒÚúâG "WW¾Fu/ñW¼EDÑE޾·¹=ù1u({OaŸ†ö»šª¡¶‘jç)k:ámù'WÑ$(R»‘Ä Wes_œÏÓE?P‹´¦›r5@mnþТÛ2n©b~Ls”dÎÁù:/ÈKÌÚ5]=áá´-ýÝÉU¬€£M½ÙÛ”€nñ½#NI®â$.xÕÔÁþÐ~Ã’y’«â~×uu'W C¶«N鎑¶þsðØGROî`Ë£ÜthâL-ľ¡¨‚Á7âY0!xª:’À$c+™d<¬üãkUŸ6p³C®VeŠçïs…Ó¦êL6Uñ©ezEõ£mVþ‹íÌ.ƒÖåû¦$xÓ®¹:ïϵ‡,¬ÿ©²“z°ëYKZ"~Úl•DïGÚX>gÔVF޽VäêÈ»Üâú\e)ªÁ¶K’ ‡Ï~W Ï,%.ú{Ôø‘æ$rÄíáË»ö¾JmbFÝ•þÑ@EËßµ>bY]bëH„»€Že)Ùw¥‰G¾«¶JªÆÞσØË¦Ê“ [ZÛ¹ `#º‹ý‹zÌÜ5ΫÏóèô©ÜÁ‡Q§9#0H/OAÙÆÏ}Ñä\tJ^õ>_Í¿ªžÒÖÁì”/ïN®bëÅ6Ô×…lg³DOø•¯ì¡Frõ…SbƒjQmóýÏe«ò’ê]u¦U¥’@U«'?¥¦$‡io,ìðkÓÄ䬀g‹´§®zÌŠû fʪöè7“‹úBÔ˜{$ö'>®gWD~ر­jTš0ÖÔ롤'¹šýùL&ÐòäÍSÖvZ€Üpð•ÿ²ê‘«Ý/¶g< iT¯Ìa·JQ/ø+2€bG3]~¦˜=þaµëp–¡/®fbÓ6÷³fíÊ­@2äê9©k;³:Ï÷O®&.y3iÙ»Hw¶¿ï‰ RèBK$c™²¶‹—ªã™‘¸Mäªé&ZÃBelê«Ø_µ¡/ËÇÌ!¨/€.X]ŒÊ’7röÏÅëùÆÑ‰ÿ£\}·€–Ë…(©Çåé W¹'bPšpŸm€âÍiä·k+ŠrÍæ˜Û¬—«¾4ö`üìP‰h-ô€òtú^Åòù$W£ö‰\Ugä'Øò^»5¡]Q&Åá»'sèÿ[,~ÒÒ·­¢àíh•ªÜP²Íâ¢4l–¯=LÝxÓ®îOa\FY–Ï”ÁW/IN«›;x<®¾®²¸JÕÞš;Z_ðWùy= EI+ì…S5<ò3˜R÷½cÉUü -’ƒ}ô¯Y_ Ÿº’u»-œýÙ4; ,®œ”Á7¦o¬tª…¯nÉÞ3Ó–{x±­”¦ r“Š÷vù¢ª¾\*ÿzÎOY¨®4¢Ì R­ÎFí[ï²0`3vDI ß1÷²[™(ìR‡˜©‹Ó€Ÿ$.~l ĵ™t†CÎ¥4À¦*÷dìý¦qØcü‰‰Ei—ññ0 JX&r܃Á=dSäPø…aE€n…öoèÕ[[Y‚IUƒŒ£+JãÄÏþCEV4X”SY ©›ÄÅòà‹rÓ#¶Œ“â5!ÐB>=Úùéùë9Ô¡{Ì}˜……ÿEiÂQà @B ©™Øèe4¤Ž Ô™nøJèúÄ:? ¶gÈÕ3Ã×8C®žÞaÉÕÌ]*–R–pÔ=þS±‘‹þ® ù ÝCû^­sLmr?Kãu¹…æøþh¡˜)O¸Ç’•«3ûøÝ߹ЭGÅš|Y¤¥oa;šÈÕ/—:‘ñññ±‹ÞÄ Uw×.ßWþ»©CU™qÒôªrâÐýbL­Ÿ7Ÿ(¿¼™ÄÀeîêÆF8ÇÁÎÀŽ –Ìy¡,ù¤Øu]A­ÿdô<¶¦,/iÙÛhu÷CL~. ØÔù€tìÔ§ðROØUWëõcV*um—ê‚4S{­»³Ö¨e"[Ö\ýfW&=Vµ·ÞUŸ¶±—H€VTç¶Ìϼá1yRCì·ø#[G1øF§¨c¹z|mïF¨x‹VþÄk!‚SP0ÉWÒâgêÇÄêø?›¶µ:}Õ„÷r½!W™4¡_W}•Ò¸~„cëàì}3„F:ŸÚïÚÄ…º°3ÂÝ ¢ýë»óz-‚ ›I{Üa(W}±÷Í`bÙ q3~[™ǃ@ËCoQð›q@rÌH)eY&=Æ4ò†iz¤¬îàÐbâC^b—‰U˜û'wr5bä]l45;}wìôgÑ'àö¤¥oª6‹Û ´vŒôO®ònü-H8ó“ÑŽ,¥mî?ÿ%¯á‘-o¢J:áU[Ô¬ãKcˆ\ý|&/†ã©ß×ו'˜hO(JÐ\m¶v )¿_ýÚø&ì—zÁg&.y3zÒ£¸Hȼ"gŽ­vÈU—9qC®¾=¹ªzË™‘fëŦ®ï†±Sª¦ZWßSWQœÿÕÊ ®?PÕåæä*pÂ=¢Ve1ªyU4ªiò¥ AœÓÊÆÃµÖ¤¥o‡ö¿6qÑkø°l™¦GT–”Ä}Fµ]<\¹:ë÷ìJR}ˆf>‡Ë‰b›G¬ØçõZsÃÛ"x(üMV§º µ®¦\ËÔþ,¤‘‰Mß6Ÿ=æx…–\ÿbM‘p=ès%Ï0`O±DhãÌcE®ÎVô¦Jó…ïböØ 6¼¶*/‰ÙàgÛfZ-9VwàqYQºç¦Þ¢¯»](Ø\u,y6fÒã>åÙ«ÎѹŸ!rõÓ‰èçÀçDŽþ%»-Æä¤méÏ»±ñkJóröÍlwWæ‹x+,Hóãf=€<°^ þªbÝ“›þ¥*9DíÅÿEOÚ:¨h$¿äêMí)÷ÏfUVËÛãT½±H#¢¨2G뻋\íq {Ö¦›az°•Ö[GëªäêŽâ²|v™Š¦ªçµ×öÅFIòÎF‡¹L¬5â¤äjÚÆž|5ëz¼ž)òð—’˜ö7ù&ÖÁðÚ´Ë&bxÅöL‘ê‚¶?ËÆÖªYØ'¨Çða·¹“«ÎõÌdòêöª£¾¡‡ÈÕ‘wÅN{¥Á^hQó¿jXr•k¤‹We_Ÿ.r5|èÍþºÚ”UXú¨á¡•%ŠNü Î’š«tµuØ?‡µ.‰ÙŸ²ª=<|ð aZ–äƒ\þœŠ™ö”|>%¹ÊãT+~Ò#À€šÒ|%5ôtÕñ{àYøÐ[pClo0p¸Ø€1SŸòF®ªÄ‡­0ƒJ^õ›]•Þ=ª³~ËÁÆWùè>WFmŒVêÜ·ðŽ™=÷®”QãäyyÔÿŠõ “Ê`÷¡"L2Ý8K®¢Ñuè"lŠÈÕ%o¢qštZq`^ÑӤÇ,­&³Á.ç]?eh±Uæ˜W•¢+öP…p1öF-;Àõäÿâ.u[ØÐ] `à…;jÊ"ž y æ ŒùœÍAò(ÐkÔÝjx7áaœ¬ “ ªzYSžêr »YÂN!äh$Ü.w”˜±*ÚôãÝÐÀæÌ#í/ ÇÞÇk³šö#NgÈÕ3Ã×8C®žÞaÉUn$ÞmWbÚØ Ó©|´bê¾Xèž³P–p4¤×ÙøŽïŸ¶¹–Q»»É”ÆNæ»#WKbaµE®úHîä**±¦,ßI[ú®²½@òΙ[$=ÅtÒŠ™‡˜É«÷ŠwˆkG]u…W]®‚ãkæ¿‚7„7ŠÕó<·²äjüÜ™pBξY¬Ÿo‚‰áqU)滚&Väjà‘«ó^ÂÞ…»%væóX@‘«}®Pm´èϱÅê|ñÑ@ÇI,‰Ú‡q±üU`µ½ªlÉ Ë‰³­v´¸›úˆ\M8ÚÊ÷Tß®…³ÍªZüû-=1 p®ª2-‰-¹ªêîu>ÏÝŠ#÷† ºá[«É,eâ¢×l÷¼0ð£Sœ»\`kÈZ3À¥Àø˜ÉÛ¿#¡rFMä*0&´ß58>áƒnÀ#ÈS? Wüœq1²÷LaªýÀ9uÀ™÷’‰»»ß¹ ˆ}Ï)ÉUžÂjF™t-Uâ5íâg¿0ÿ/Ûæ˜‡T¨š‡–ƒiñ 7aÞK|6]í;ý’«@÷°×áÑxN²ü±Õàøy2H¦‰\åçÔu]Ü[ÿ¸ÜÈÕÔ =Aé9ç% •䪜”s…Ê¿Ž?e¸Ó†ãI®:ÊJa“Ý.ÂÇW?;“›ÉSHaÇsAÅž+ÅñÝX#>ÜòHu2(×’«|¸º|޾;iù;ùG–£W ¹ÚÕ!WQl*øŠ«Èjo"Š@~—ü#}ûPr5^äê¨_òh5êm‹Yb¯)MX ÂúJ=o^´•%pwÀËÓBØ;àmQ%®zK®š®]¾–º±—WrÕD%]Ç’¡QÙ³jÊ6îA D/O éu™­V¶Ë–Ãèr”mô„_×eð \žUÕ(ÉL¾eª­e‰™ô(s…kß‚\5Uã&v¾€o·…¹œÚïjžÎã˜=¶€ À‹žøk†»ÏU™«x6j· ÒX˜ÆÇiì!{šÈU…£¿ÝštB¥@Nu¸àÕÎ)sU–Øé|^4³SQÍ–Ú0Mçû"WµO§=èúozR–t"÷à‡~Rbm“)‘«¦<£TYŸ+<ÉÕÚÊfÃá•\Å_SÞ„!WUw¢¾Öë[!T™;ǨoÑêö ’i4 .fjØï·ò­Â~¥oÀû¸“«l"-ŒÑ =àg°1YqUæÄâÂóDž­ªò,Gâ1a€#ËÜC¹<ÉU«U²>„\±_T¿åƒï©éÕ×ïHŽ6@ÇæZm@ÜÑ¸è »«aû¡£m’—¿›´ä TtHïË…›r$hÈm äêŽu5•Öe |£ÊýÉ:»ü#…\1±ìý”¥wÚ’«(üG‡\åþl:Û¹8yÕû˜þ\ÁƒBû^…kŒ§ 0åì Ì'áêTbêoy§¦ua;Ù¶,±Ž–¾í‡\EƒEH5%|L:6zâ#<î”+ruÏu¸îúCà«ûVE½«iÚÊ÷YñÚ²üœF(š­›Ý»É´yGW 3XɤåïÆL}2tæKé‰*êRšp„ONYÓÙVmõC®¢™ùF§X‚•Eê¼>.~ÞŸyœ%W¹’­Š:J]ß=´ÿ5A Ü‚uÃê!©{ÆÍ~Aí¹Ýà?©‘\ÝÒ÷*\¾:s÷xÄÉ&2 ®m‡\e£'þ*¤÷ej«çû¶¼ƒ²•üÅ)†€Œ!E»Ø÷zñXDÞP¥Uüê{ ®’èývòê@VOr5÷ð"õ×Qf#bäJCŽÞ_×X ç¿s¨µú‘eXƪFÑ…F:-ä*÷Œq»uOR×uJ nžW ¶ë>hBó9®¢°]‰‹ßàÓ6õNYù¾BôGÜÑ‚A²äªÔfÒq¼ D:aá«é òllêrÈÕ¨½¨& .Á.SYUBkp\[ȳäN+‡ÈÕΨrHµ‡·ˆ¬*ÅÚŠ¬ëÞ.}ÛP°"²}Ú‰÷Š´à³Í>U¡9,η[u¨àÞ¥B Uû^Ðép5²glyÓ›c·sMyj0ÚL©»ß ¹ŠQ@±‹‡ñqwrUÃØkû³ÈÕ˜):ûŽ™öTÛËÐÖ8è…OFíchòŽúMû’º¡§_åUz–Щ)Îæ…-¹ZS–Çä8uG[3€Âº{] »ì«¸h`Ì+N¢í¶ÚD­'€d»ù¸*)ýÓºoàgu-épvØÀë¹X†»¼ÀÂþ\V­&W•hóÉ¥‰¹¼«™é'7ø W}§¶éUQÈ—·X¾S¿RAjÜŒçpî”ÛrèÃŒmƒ[cø*2"ü—h¶U¥@&7rµH•Ï×vqR™Ô(jèÍæPøö°Á7˜ü8—Ê’÷»¦àøZ…SúÞ)¦à¿ÄçŒ{0¬ÿuÍ=î†Áz)ˆeÈÏM5þ– Ç\-dâ®J¶»·ãé¶<²Áê³ÓKcE޼“Wr–Cá…s^,O 4N· ïaóG"¹DSBP ^&JÍ>Å¥o˜l{ÌnÎ ¦éö÷LÓ+mJ|-ùçK½ªzg°AP&IKßd®`ȶ tQÍÚª„„ø awZru¤Å*HÅâD ÿ…£™M—«c9ŸÏdWf}:QµÙç¿â$¼7«ÓžªÌj"W±É+ß/?Ìs-@â¡JÜ64|ðl䲤‰‹_OZþŽ•^–o—®~UÚ*Ùsåû(„ê‚¶Œš@ ¾Qäê‚¿Zr]­†w¹ù/à'0«³¤æù^GMiNÎÁylyY½™Ï7«î⪯̌05d»-ÙbN*{‡ô¾«ŠÎ,óÝý™]™÷åRæ?e]vnnjLFFºZÎ%Å£ÏÜ=Þ4[¿Äh{/Z×e”'¢âœéø'WY#PY¹z`.{ ë£Þ߆‘â‰Ì‰ª@¤…€aL3²a‰‹ß@Ô®Å/«.LGø+2#l‹v‹òÇ«+,xf-xŠ*8ÕØŠçª6ìŒß†ö»Öü{[A:aÁ«eÉ'œïµÁZNØd+GMY.†•/µ],=ÒÎRœÜ(Ò¦®6¡9¹šljÜ›²¶sòªöReÝ.dZ¼f…ü÷ 4*3£²Ï. ðÓP謹î@;ap-EƒºC–ð\ì?¡~ ƒ¶Š\‘zœ W¤…‚—ÊSÒ·ôc_°ƒTµÀ/¹?û6&âç‡\U3MùJ.Œ2(Ô‘¦©¨«Á®e}6¥¦äܯ‘U¨ÃüW¼R¦H‚z›~ø j=†ŽRÐì7Šâð39Ô¨ ƒåk_ÍárDZӞ óp`·v_ƒ\m,9kje÷V}· cg<§v$ãÄÄÍú=/Ìl` ”¡ðÉh«U0°Ç%é[³£q L†Zjó”{Êd½£f\$€œ8éOÙ å§8äêäÇMhz›Ì#UPôðt…!?o‰q‡-‘Ôõ wmðeo©ÚÛ`µÒHÛØ;bØ­ ˆÿ ×RU['þZí»_¤VãÌdïš{h*êlæN®FޏөäÛð†%¦zƒ•þ_ÒŠ÷T£µýY*oÞçJlh¹¸¸0r÷‡8à¦æùó?è<¦Ö¯f]u™\†)O2ÀÀFæ'£l_ð6C¨~Òcü§}=Þ<ÆUy»Î@V¿LËrUã ¹êmüO’«UUUµµµÿwÉÕòBõÔèp6à --' üãææ›»+§ñ—èôaIÔçMפ£u…¸¾#r5é¶Ò³gº3Z’«n#>>>au—Þ— ›Mz4ïË%ÞD].P=ÐÚUgTfFf«ˆDïÔ”åð½Œ1ªÈŠtPÍ·J@ ßÔåûXâȽê2´gü6ð§¶(_ cêX@ã±v³MŠ#>åKñ€^-R¹Ó· x´ž\U׳Ât¯µµÅ2eeÙ*jNÍLcÄðÛŠ‚·û!Nys¬¤ïgðÕ*5ö~ŒoÞáÅ8 ­ÉÞ­×yzk!–WrÕ=ÞI)ácïWGìIl\eÜì›!?Ýï)¶ þçÆs7ÄU]S÷Nóò¶õuXó˜Éexkg靖 &PÁ„ð†ÁÝ/G%,|-iÙ;lùüc«U^`Ô/%èpYÑ'7¨¥uµ†œñ‡£x ËêÊÖV#x&JvnuQ¦û}pmŸn÷ë™@¼r\{>?ï«•ˆ-gÚZrµº,ÿ«Uf¥•5ßæâ]¿XȢԹؑ¶¥Ÿ"Û;‡w“gBkTã(æ¯Ýè 4»|•¹Sî[½*õ'³¾ˆYþñ5•&¨²‘\Uì«Í}. û@ÛD®&ŸÀ³h W󓹨U47åÉÅÍ~ð–sp~‹ •?>äçQÐ2×TdE5{Ïü$–TY¤ÎÛI7¯¯@>7® ð¦pµ^?áreí™Âæ-8±^åþvOH]Û%÷Ї¦Tf#¹ÚóÒ¨1÷*ŬÃY|>…ËÉ«Pêè{øšÒ<ÕQ1û¢4á+Sø.à1â… ‘àóm<¡³,óV‘ž¸ðµ¸™¿S‚íCÓ6÷kQŠU€£'>Žú› îí€Á@q–gA ª þŠ[‡Ìó¶Y{&ûõt* 7í)lúö¡*³Ù6i!ѽ~j›¸Ë5©+M‹W=ïÔù|r‹í£Z©‹^W¡Eô/s?ÿ¥´M}Zù-¾+ž¼â=õO4EQj+ŠÑ½¤×væ®°…ªûØÄGï*rõ3ÓAd•¾Ø\rpŽ;^åü/É!WB5ßiE d+‡%W+ж¼*0/{»1Ô­éµ½Z+“£}Câ’7OC$iÿf/ƒ®ˆöLöÞé~®©ÊKL\ü» ·•ž¸ðUôgc„[]bbbð°»8þa¶ªz“geíž1òΪ¼¦-ƒÄb/ø:ž…§tþƨfK®²»ÑQXH ¨ë…8­eIÇý=t€j›„¹‰'œ\H£l%?+ßG‰ÙÍ[]Â¥²^¤‚áw±‹#?³ Õs¼ÛEìMžbÃ~P5¶‡¸}TGܬß%.zÍ×$ (¨ÖTXb-€gხgqy\‹ÒÙ(«Øk+Kò¯µ¾vÖ®qêî=÷E³ùN-Ÿ”ÆN^Õ^åISƒð(223ÙŠÎêvQþ±5AÝ.TŒeÌþVê‡Üƒ&,xÕ £Sò£ì&,z¯pÉ1phfÁ³TéÝdÖ³=M+öXCC~îßå×v®P"¶ê–t8›º×ùçTn‹IJ=lªS.ˆgáßXéï %ÿØ*ì]âÒfÕHJc¡K¿.¹ÊêÄN¤jŠÆ«¬±¨0F$c×ø!¡9¹Z°)fÊ“L:½€ôwo÷ßÜÊÊ‘FfF1l fš=k„çÛúS*/3é1KŠb@Z'TOÉá»P\¢Ë<2èÕ/5k‹6¨ÌŽÎ90'šû4ÄvÈÕò”@Ó¶ãµ’¨½J˪ô²wÈÕø/í¾Cm:§±Í¦B†~XaðÖfe`¿Î`¼ñR}z—¾Ãv†›ò³ >\³oVê9ª‹3‹‚·…|Ì:–Æ<íÃFõr`ï«@_En þ‡ö͉u!½¯0õaÚà(,¼ÏÈì}3QÚ)ëºâ®f6ƒn+*žù;à+¬³©Sý×Öûe%ÑûLÉ8S¶ÈUg‘þÑ…CïÙÃ"( cÅ?ãfø¦¹ºs ž³¡J³‹^CéÙC´Hïr™Sø ˜ÃÖœ!W1óÐ;QÕ.>ÕU_ZSŸ—™ðœÃoÍO¬ùÿô;W]bLÄof·¸&±ãá²ÚÒ”—æ4ÜäÎeq®êÅkþ§¿åtŽÓB®æææf›ÿù'W«««+**þï’«•%9æ™ÁØøkÊnÞ3]Q©³~/}ØèR᥮ëbcûkD®F|ú‘«(@Å À{¿@jjçh_äj⺞hfÀax/ù¤¯0žøy/ap ޝmÍ+ÕÁùù_ùÄŠ€^÷Ä@_e£T&Œ'æ'j/æ†ÏÁvty„:(õ½2lÐ YÞ:׸LøMi‘ Ó0‹•„antpÜWd|<ŒÔzrÕϰ,6ä´60‘-·›´2Ÿ¢RS–‡Õ¢ùKëGuQ†š¹›¨N…„¦Ÿöƒi[# „Ó°"u5Ãn-“h5>f8vÆsØ\ün§oimY^uqV+¹’˜Øz¦Î+¹ê2ºêƲc¤gøœC®²¸ñsÿ„œ$/7´Ï•<HÊÚ.ü\°©<-ÏÅýì[UþÊò¿}>ZÃPŒPd`§¶ŠŽhàm?&Ö¨ÙÄV–xÐ0 $.ÊD°Ó6÷ý:䪩•Ú©-wn¡ XÞ+¹ŠÓaºÂÇäXígkvl dòœ Ö‘õu¨6p ¨H$ã5X±ç\®S{¸˜ýÒ?nä*ðÉj31ucO`›i(æeGT¤‡™&¿W›ÀÂæäjQ&»œlNÀ6[ðÉ5%9U¹ñÌ¡‚x[ç>ØºŽ¡}®¨×çBö>ü‹Ý‰¹_,JÛØy‹›ó‚•yS«ùÑøyÖñý߈VåKÅa@æÃo3…dkoö…úúÍú½Èգ˹&næó¦_¼×7iˆÓPþÔ²·ãç¾h ÀK;¹´®Æ­‡ £ ØQ¿d†Ù2aSŸ uЗëÓ6õA0LÀ˜÷Äi½l[r5ëÓI@_îÜäV¸ê±›6æ¶5÷)Kø*jìÀþÊæì·Ë¤áuý'¹ÊRâÉúi‰ÎŽHXð*ÒÊoñ5H^Ìœ°((TmyFýRD}ckÅS¼UµÅ÷™ò|Zè7t$+sâ*sb‘X6‘áëþ… |“C®ªyÙØZ¥sÊ–Ã*!‡%ÑŸ£fÙûæ÷.¶€#±þŽž ›¯ëšùÉ\!•ðÐ-­Ø)ù¡à½l}Ò²wÒÔ=s :G‘áŸNBÃÈ­sÕ‹\q{w2kÏWC½ëÙ¬&³êåå÷Ï1I”qô¤%WÙk•Ù,D6 ÁÀL$/¯"-•Øù¼ Îç'-ù7D‰ÅÎ|® `£íÌîôzCÕD޼Ó5bCz_Î6®Ô–çƒÐðèU>¢ÛEj^6èú n†ö¿6züC<(=h«†úœ¨Ð(œ´M½ýL”5eyy_.ÐFO~ ¿ÛIái1P¼…›¶ŒíÊÃv‰\üz¹[ËW/R]Î  {™æª\5ºO\j_=Ð_ñ¿çu ZÁ·¾ÈU`ÖîñöP 3å [™ÁF$2™ÍâcMBKŸtEøÐ[¼V¿l9Q%Ù*áØáldØìRÌ‚TsìU þ?çŸXËË ØõòµFè[Ö¨Y}ìØC*ðõÊzØ8F”p䨻MYãçB¹j«lï„æä*Žžôhpvl”Õí¶ða·Vÿ·²jøLK®Nzô´#ÕÌÝãcgüÖ’¢(™‚€ÍÕ‰Nõ¶ÕmŠL+Û–¯T_˲ó{åìã¾ä'!¢Í÷E¹Z_ÆhVòÊ÷Îá#™dk›Ð;}còŠ¥mîç¥)’2¡âd¾)ÅãìøÑá¶£»)¸ç¥ÍraNׂÖU£dGj«=;¢~û¶‰Ú2*hÐÏQžªúÒÚ?t•%CBz^ŠË¬~X¦`¸1=sâçüó6(8±ÕÔõBKB¦nè‰ÏÞ7C`‹Îµòq%1æ¿ìÞºM›¾u°ÝÂø­oþ¦cðñ@ñªLëö¡Qã°O·Mya´“i)òkÛ*Ë›µ{BæÎ±ÃÚïZHì´g¢Ç? ä3;‡ö»d¢’PƒoÌ98[NN\ú¦C®ªgèø‡‘ùglÞŒí¯¯Ëüd”í0dRÛð›p'E®î]Úïju˜ð0š3bØm~ÊÚ{ø@z0âê«8>a Æf*‡Ü,¸Û˜V†”u¾ €Ý ÌùÉÕ[g|þ¿gÌújrá¿Ãö~ù óŸw­NN­/›²öÐí3>¿}î‘—7|uÿÌ–×ܾ8êd}ÍÚõÍüáhe]AÂïfý§?ä´ŽÓB®fffæåå’\­­­å‚ÿ³ä*î[þ1õŶÕÐ`-ØEÀsÒŠ÷jË›Žs>Ÿ•±mHYRSBGMinaÈönïia€ºÔ Ý}]¼ª½šù W“6õÇã0Oíý ^l‡xN®oÍ+)»$鸟ÂþµE©ëºêž(‡¼eÜ7†\݇;ÀWW¤0pŠB>ÆhF޹7ûó™ÞÿŒT[e v-jüƒe‰_y^nÇ€–{dë|ƒÑ@®F~3õ)Ç"#fø;þO?ëëjùÀÖ„›z`iü#Ì1FÊäŸf¼ê²äªI3q~ÃÝåh—¸ø –C=/&=ú jJsl3w_ä*óà `”=ø›ÈUS± ¼¡öš~bêb=Ã{¦o„ßÌà—Wü7ÿý–XÜý⢰]-ÂxÀÕÙŸM1AVn[]5æ¾ì½Sm!‚ÚŠâì=S"ÇÜ×Zrµ¦ENË90§¦Å#Îûr©Z#yD!ó*Ûåû /»ýŦœ ìÔ¶*7Îsíl¥>G>Q8¡NŽg¹ZWS¹× ÁGme‘«zM¥$.yÓÖC¨.Jg-Ào¾J#À\iê©înA®2Eª‰Úïj[<Ü‚¾6ÇÕŠhjµæÁKRsœá·Ù$h5–Ú5Îj°Â Ò6÷ÅŠŸû'3 jË¢Ò…«Þ·ÝÒ"$ªá¼sLêúîõ5UÍo?÷EK®–%Ÿ@,ý´us„$eMG6‘z«…Šïì骔ÆÆ™*cÅp¢vL]ðºzË~:QGE‹þž´ôm.Àqés…B¹ZkY[^hÇ­ÈÚ39eM§í¨Z?ÊSq‚˜§…M“XV•†ôº …üu˾¡W“–¼i~›ù`!”]h`j+K¢'ü*zÒcž¯êk€âf¿ ú'3ÿœöÅ7{‹ŽÌ+¬±÷NùM”[é4j*ÑþÅÌiìÁ˜ÉGO|äëÞ!çÀ<ö5V—°0p äۚ⨽l+¯½ÔQ•—”¼â=Ó=s,›(~ÞK(´Ð¾W©ý!WCÆ<¤ú3~kMŸÆþÂy ÂÌýb!î[â¢×œh‰´Íý¼ê,}ÚÆÞh-¶< 0qÉ:~šôXIìA´JMq&8eËŨq§QöËFC®+Þ£]ìÌçJbö#WYŸN2õ™Ïʼn\ðSåBÎûZÅF¼»Ì^NZò…¸ÝGQØNÞ9}ÛSN)f™Auà´ª$¬@8•×ÛÉ{¢ÍPP,(Û¡*Ïoí\“8Z®4üpÕÖvÈÕŒpõ!J8ŠþTÑïSuÓvFÞáÅ|µ¯œ©äU ,º@s*iÚh6ö)ê:¸ûEžÅC¤—¿5E€±#±SŸb»E½Ï¶²ò¸›!W;µEýflŽ*³=¬} À3£ôM„¶ÚtÎ~áëޏâfÿ!áÃWl$[ÜÌß5¼!JÜTÔLhN®²bg<ÐálÙ^Ó‘Š™ö4Pêk>ôz`Lys“†pš£SòÕâe[3¿¦,©pt”=Aø ‚“}†X7¼Ÿ½wz‹´‡\!´?KÔœïúQöqÚ††b cX¿q×*?£2+ ˜QWUâ/~£8 ³er¾±£Ñêqú#Ž˜ð„㻂GÜ=á×þ ·üÃìX p7ÿØêÐþ×a>t,¸ðo*I:ç¸ ˆGU^¢)¶¥-tÌ/ÑçØ‹”µj‘ÐzT÷E‹3#¬Cyj…p‘«Û† ßÔ–ô ò9ê—ÉËßþ …­šR]¼žPî”'Ñ*ü ˜{x?sçœýsp'QÚ¼|Ô¸‡°ã™;FXQ tCî¹ ó_‰y' –‹Áqs^l$WÛð‡±Óžv4æµ"-´™™pÕç|>ÓF¨ÞTû³R×u­.Ê@ì£>_mk_‹îxN䨻½fúøL…ÃE8äjÎþÙJRÛ?+qákaý¯KßÜÏÙ x©ëº˜ísjq:%µádzM½Ë“\=kÐöÿ=cè¾þ¹ÿ>±eÏ9æ?ÏŸåªZ¹õË›Gï8ÛÇ5g ÞýJL}~ð‘vü<ìàä¢ßöYÛÿø‡œÖqZÈÕðððüüüÜÜ\‡\-**ª¨¨(6ÿ³äjUUU]]]```+ÉÕÿ¿ù¿½{÷òÉ^ÿ©¾¦¢8ô“ ®?¬)J/‰Ü=þá“Ü/¨ÎOÎÞ;Õý7)eñ‡k‹³š~e°Î¿]õßÁ»ëh!oÚÆžÿ{çÞÄ•w¾ða挿@?Eyç‰Ê:-]„UrÝ/©ö0iYsê]»*ë‹K–&^<{aØE ¢G°EF"Èçó#V0g ‚ú[ƒ $ˆZSºêEµc³ DTi!ùÛ.Á•5”zoabÂ>4²rûûäŸÍiG@IÈk!«Lá…Î S½ï[#q¥´0ÖâÞ…Ù¢ƒ:ëîL—X¯–«Êímˆº¹¦É¥«‡³N[!Þ×!®§îª±’øêС‘¦ñŠ 'p^›:òÚ\°fâ2§ÜÉ==©"7¡.f;Xû¦„]­ÅÑpŸÂM‘0t¾`ÎĉàÔ%à6',*´S+Ê;}vñ@”ü’² ÉPÙ®½ZŒ$¨®[m‚E%Þ~¶Ô³.™Ñ)úepQ$…QD”­[Þ9‘냅»¬Jéš—‹v}Ë+Lñ²?F"ä`óBç“/…«Üù1¹,@Åæ·%Þ·oƒ¬*­2ˆxG·»‚ͽõ€àÇ UÁ¥4Íl<€X䓸‹¢\©¦ä}`ÄÀ¯-|˜øõºiÍ6`˜’«k†ñ×Ã4­µ$ÆHX<•„V½çKû[hÉ8F‰}x¹™€¸¢þÒ"öáŸÌ1‘\8€sj"(píÑÑÄzÔ´ÃpwF«†I7:…DQÇ4B”mx½xù3à…ÁÊ1§ÿ™ø>fE2¨7ˆ‹ü`tÙú¡ÛÞ+œÿ/¸s᮳ÂÁ—‘‡Ëª3@«ëÎNïL ¥ì#£À$:)Œ tÂ9#ÄæSØ@¬A/…~‚ÖÁLÖô^¬cö.•˜Vðù|£é6‡1¸~¸Ù!ˆÛåb 0÷ñ ³ƒîåG®‚.‘¦,gÕî/ $àG®³¯n®û¯j°‹0 °`!ªwzvˆªv~ î <¯²¾Ð¾‚¡#¹*­HjÉ8×\Eƒ pjâ‹·N bŒê=_‰™—œöÇP`ÎÉñ`‡M¯5þTÕPa¹Ô&qgI­Þ÷ kÆ_*¶¾Ûxm›é“=ÿóSèK zD+Ÿ7 J(f\r83g XÞ¸›À³ƒ­pÚÜæ6÷L¢ëêê óꦪ¼ñýøáËt105 Q?Øi>tâ[ê:ài¥ xÞ¡¶”Á\ùJÙúá¤ãv0‰¼‹ çÿLwႇÜ îLnKúâCQ¦pn[°ÌÄ·’—<ž?áfP!ÀËqLiN"«N¯=>t¸ œBb˜"ÓaL¾ BbR‚·¢ÅÌûkÖ}ì#?ÃÕgQsà;p|`îWÖ˼MkBšS‚ƒ &ÚEKŸ$¾»TÆX¼ô©–ô£ìÃ#!æ‡ú-™'ÊÖ/|‰kÅ–·!৘ƒ `öQ`zÛ3ùõ+bb"kµ/K<’'Þ$pø'âýk^³ïúU0š¼³É“À¨¦ä*8‚¢Å6§/ôo Â1ß¹p·ª¥]¹=NÓYéUª&¹}r•¶0¬÷”%׿š§ýÈ?E>RÊS)®_WˆZvœO¸c‘]…a÷©ª¾X~ÇþZ¶åÇuáÝ?ŸŸ$WsrrÀóŠD"2Åj¿rU.—ëõz‡5ûlrîq˜\@4ÁÄÀå›þC¦Ìè"Yej—t³S B€YsÝùÙU N® K¥)0¬[B‘-£]ô„".öJ¯Q蕎¥Jî%¾3uà;UcEgu<ƒŠØ9ŒÉw€o²Lq ³Ï€‹8Üi ÒÒkàY”u,û] Ä­‰ .Óû~’Y&¥ ¢\‹É±²¥µ$Öûö;CK|fh  :“SÏ΢àðBçv–\…Y!ñù˘MfmÆ2¹ªn®Yy3ñ¨÷iæŒA03…i&t>B˜+Áÿáöwxãø âñMa$u»–ú#¾&Ÿ°Ó|á ú­;7Üœ§¬Ìûò' ”×dÙära†7‘\µô³dåsä—FÉÙñ´BTW{âwô‡T{hCZ™“»â%«[8¥«‡ÉÕ‹óÕÍl¸8'ÇbMº*ˆ^1dgÉUˆÿaÒ ·¤}J”X4ôaýåEׂÊ7¾ánWíy1çÄ¿“’éw²o`„Á~/}lšÑ$"ÔAµ`š_0÷æô?;µ<àbàX¸¾¢œ˜Ñèä"§ýí­¿´¨öØXŠ:pë݃ûÔT¥²0·¥$ f÷Íi‡a2H<¼º"öúËK Dwk&Õž\MÞ· øAr¸èÐÂûØ%“¡Í¦ÄÝ0L˜î¹Õ&8kÎéIüˆ•žuÉ LoÁ†Àì µ8ÆH9èC^è<°`.¶Jò/ßüVÉÑuE>4b>Œ‹|ÓZÕÎOÉp_Wl}ORé}û6€­¨Þó•ù‚ëÀ„ækÂÌ“Þ÷AV‘Æ4¢‘-rà6„@…5󾪟@`ÓdÐ.sræ¡à»Ûï,ƒ^ÝXeΙæœ)]óŠéÎj7,DrõòbØÚHn©;7 .7dªÉ,üç2)p{}p"0·iV#æ‘àÓJaÖ fæŒDö&ììö¡‘0g#q&™\mN9¨j¬2»9;›{f L;‚¤0 &ì±[:«`Xè?Ø[]'¡Ü€ÒÊd0`èÀš¯ÀªJuë)•9¹ªnª® ú®QÕŽOêB¦©›;}ŽoCKÚLäî•Ug€Ë ÓPà jöÿ¯1a?rUÅöà&uœ\5YN­Þ…,1¸æšý߀{*Ûð:ØRû ÉÕr.n–º³Ó쯻%䥷yb+«N¯Þ;­D xçæÔÃć#g ‚Þæ¡Mr:V2µzï×Â܈L¿eë§ °§C¼Û†W˜7þ&¸éÌOX¨êkU6÷E{rÕh€Y•)ÞÞ ^Òoýu¸S¨õ³wP[QÈ\õÄ­ÅÑ®Vޱ¢páÊÚÜ¢EæO¸¹zß7Üi0[aþIµš¬>…H{k¦‚§Ë1„¯Ä[@M¢ä—6Æmë,t‡†¾Œ{z"8ÒÑ@Ô׎xÿó¸›À•m^´øqpI"ÆÅÒÕ/«F›«K×¼Ô”´§µ(¶+8ùÄ#•/€†Î³æüÈO&ï'òü‘«*w~"a…sNޝØü˜MaÖIrÊÖ - ~fuùŠ`â{Žü’N`0À) ç=húfk?âµN¼Bð’ ö•YÑܳÓZKb¢×—¬îŒ*Ië "¹ze !ÂÌSEK‡Þ²ŽfL¹³îìŒÎž Rã4%Qé.1øb…Ö6¹º8¼÷”eñsšŒ9—bûYo¿iYÌK—DFéô­ê¬LÛ#3ÄŸOø¨@+)É´¤»Gáëâ«ä*Àf³ÉTªL&“Ëå …B©TªMh4p d5W“«mm=±ÉÕÖV‡»ˆ%§MÕîBB|™zë»bÆE« z-á1»µÿê6Ìš‰»“ õ—ÂÄ„xBm·«ªº®4Q'|icÂbÎØI#0Y¨Ùÿ­¸ Ü'}¹Ö]˜]sèG"ô©4àŠÈ9¹ŒÉwÀ¤ØrÈ¢¼sàbÀ:mü\h%Ääv»â¶#¨×ýŠD Äï£Ulë!03m„É8¸ÖÒk¾•‰e™€¶€7lJÚ«SŠýq ½F!f^ßgyQ¯fñ'ÌÔ ÆfjÉ<áÙYT q[Z2;®`4°Œ‚1±† ö­Ö¼úPºîÕÂEpƒ'ëÕ2˜qçOì/ggôÿ]Ï ¨GSò^b.lú´´9ý1áuáXÌX3ïS‘ù«]ZIÑ•šƒ?ØÕ”¼¯bËÛ¤_ˆƒÙ±‘˜z€ل›ý'’«ðñÖÖþ›iå-š’« À”)ùÅÜàIIMºÚxm{á¼tv"‚Ç‚ž;¬vIËUåÄ{tOŽó^øj·!nksêAòO⋽Ú¥WIÁà°fý¤Ô."b±4âáªK+©‡k [ºöUâÇ.öGÈ€ŸÈ-SÔi®)@GrufeQž´‰[sð{aN0Ñmµ¼1>¨dÅs‚+kKV<ë–4@ø 0®XTêb,ßü?j•VÖäý5"‹¬& 1¹—í€âÁl…ü©/1d­²>l1¸b‘’k-4&ìd — öÚ>^¥‡V.„yz{ru×§íã­L­Üñ±ÃÁËB¼¦ãЕAº{ Õª=_c¼ïCM&ô ‘ÓšàzÄ÷èA2Ÿ)ë aZG¦ÁkØì‚5Ãáæ%ž”¹pF#Žåœš`ÞbÐi`Æ ÷šZرÀüšøNô…9ÄÓíà?`ÞG¸¹Žú0;¶m 3Äï¸÷~FšbÍøKÕž¯dÕÄ^ƒÌÌÓ‰ŸmN$W9y` ‰¿f9póy¡sáNé¬Û Ðgðz. bׯøÄ×m,ÎbY@ÿÁM³f S ¶fåÄÓpw®X"á F“}æžÕ©eì#?óBç»ø 3OrNŽæ†8¿jyç¡qиñA÷ô*YíÑ11­‹"bý9â°QJA©é5²šÌüIUÍÕ0MU¦@lCÑ Ô›`Óè@õþo[ËÜü zÔˆëŬ0¸C«÷ް,¨½J}#þu"’±)à²*ê0(Ór8¿=¾ *bÅéMÄ/šõ:Zh•Jëx<£é®Ï›pssêJã2O7zq©­®`­}æqnM¦4­ ‚«‹= QSéšWÜÆ_Þ’vìjíñ_b6’Õˆgú¹g‰OŠèÔ-}¢µ$¦Ïp_ÏŒ\;—NÕªj(‡û×á^ie ?b9ûè˜ê=_B³Œ)wð×w/s[èLí±1åÿ  jVïù fh°öÄoÂì`"Š”ö6û4„Ö Ωñપ÷€½ BPÝœv,9ïÂlò÷h°Â?âË•«_&¯ŽïÇ=;l©ÊÑ,Ø\ è…Б9íO`ýˆ©–)Jµ¯­(„Ù MÁeÔ]˜C¼¨Ü‘åt±¡uìf5ÅÄ»\žåŸ×iZÊ;Åà‘&»’Ϊ«.2ø%|©\­3'WoZÑ{ÊÒØQ\#/3íî¥ÄŸ·nËu"éo+#oZõS\¾¡uêÖH›:¦õBŠR#j.ÔiމîþQøºt–\u‹œŠ‹‹È¥ªdrþ…)0“É4×é³ÉUÓYC¼cÊ “U§C#f^îöÛ®xç×_ZÔYp Ðy˜ Ûï2'W›SÁœÑa–,â‚ðº³Ó}–÷3è¡ÏÄìD\ßJƒüA.8#˜[æ½Eù¡à’lrã Ljˆç€BÁ?¸¹ºs3|˜\µÙ¨•5$~ZâS™XŸ¢1xÏÓÒ5œ‚ø6¯¨Îé(àž‚éOgÓ:§..œ‚x$ÚI˜DHËà,¶çµK®Bh D¼‹ ˆB–ÄæOì¯ô4¨ök)ßôï–ô£úŽ(] ³¹šL¸»]».:˜/ë”äB;™TÍ5b–ƒG'äw±ajÉ>:ZRíeÿo$W«3 veͼ"ÆÒ5/ßH® J¸g&ƒq G3åÂu–\%^ï§–éTªQëÔF¶–Æz/|Ð ðÄú4G{[ÒŽ.øWíÑÑ–!Ž…ØR˜sÆœ§¸:—mN¬¦s­?¾ ³N5Äl¦ª#kKÈœþ'æŒA¼Ð¹•Åy ¥‚wi!™'‡yDÅ%+Ÿƒðµbë;nI<#Ø9'×K©Âlú0Öz>¦„ØT¨!v“÷MÁíV±åie2ñ§Ñ@¬u—·¸þXÄ[{l¬˜yI,‘Ôó½Êó.¨MrUÎΆ±¼ÖG4¯€x“ð®ÏÜ=\-ïÂ\i¥KÏ}œ\ÍÚÜÚc¿@ˆâ´&ÜDDrõ[k|3e⢠|œ)¹ºöõÆkAÔ‰¯/‡`x9‰¹eSrÕpÈ-pÌþ¨Õºs3K×½fÙX û\ЦUPµû pñ êÜ©¬™÷ÕøñîÓ^iE\P˜/ÉÕy/@ÖY=݃ÉxSânPÈκ ‘ô°¹ó ¶âÒ©uLp–ia«BüB„Åšñ"gÔKË“@ùÝSƒŽäjG1 ¢ÖÀ(\Ïy ³OÃlÚ¥ä*ãbíÉߛӮ¬­Ùÿ?£é,ÄZb/tn7°EKž¨Øþ_Šä*¨ñlÈú‘eg|ŸB$Þnd<è¤VÅXC¶¹:6ÉUp^äKŠ£‰ä*¯€ø´ååE~ {|1}~.oüMÄ;{݈l´N®‚¨! ´±ÛÇÕ7 ‡Ã) úÜVkY¼ëGÁ-ÜT¼ô ˆk|_0çYUšNÞ¢¬/s ³?²ÄŠú""`Zügx̵‚Ëpæ¹Xà¼üˆåÕû¾©ÜþxRÆ”;®n€P™xOøŠgáfD¯‡€œXYQ“óhðM°·1~‡¤0Ò¬fdrµjÏä— j„¨¯`îÿ‰YaP*§€ˆrÏ/} "íª=_2§Þ7áæÆÄÝõaK>«ÚóUáüAߒѾÊÔžgR{¢ â‚ÎéIà"=X`ÓêQ`¸Š—=“”ºó3Sï&^„èÑéJ: ©õ5ÂÐüz¨‹ŸJBys/N® ¾˜œW’_ÆuXX•<ƒ)dRpó!0&níFqg•É"lUX¶/Uª©ëW×Û¦4KØêC´ú#Äi¬s«®î›GQ¿Il•ÂRªµ°1¯Œv-#«°þŸq*õjh«]\Ûj9)ñÁÛÒ“b;;…Jc•‰jI©‡wh²erU£ÓS×/­µMEVñš4[ÂÎLO=3öÁ„s»[Å7’H¢üPæþ_a˜§à5ñÁï«òt1³¢Î²ÂµS›£wMOOŽ#ÿ,ª¶ °ùBêQHäíÏÚÈäªX¦´ê|qMFZrNA©yK­À6VXUOѾY]ÍÅF]s…1ûœu_Âù=䉺X]¡ð[$Ôõª+E©àÚN™Ë9*^',.]ªPš+KНælÿ_èì7b-É+®N»üóý©‰ Kæ£-Vs_©«e‘«¬¦Ò-­rû:—˜p~ona9©®ƒn%¯€Ð[ƒ‘a­®6Å3umÉ:Y{â7˜õ×[—A]ß©º&dÅ¥3á?i×"ÏüúÏ ×ëµ¥k_ÉŸ4L®V—²®ì˜zuÏBW™Eñ!;ÎM~6¯´ÖÜ‚PÚåêÚ쒺¼µtÍ˵ÇUX¨+ØÌ¨Í¿¥Å_qE]Á¶\^òIÒåcö§ph]AW³óYÙÙöõÍê C¥ ´|ÿ÷!¿Óc, »›QP²3->ŠlzxaÖ°ôM6+`}¢®–…´®æbV×Ü‚2uܱ5–vÏ3umí°®  f•›©ësìÔµÀκ&^ضrDZ¡ù&ëjUŸÛ(¢>EÅ•0¹DÉUïÕ5¯¸*áì®Ó?Ý{æ—„­øŠTWE ¦ZÒò×ÕÕ\”ÖÌ`òî‰Ä›±]³®fuU6”I+’É'Nƒʺ¦'ÆDnþLy …uEùqŒe ñ™Ù«^oJÞ¯íx®Ô"¡R×äÈ3i‰I™Û×i5±Dïš‘•CÖˆëì¤g®î_•• .5zõW–ýûŽ]o{ÁݾndôÎéh] šœ9ûaÂ\pä!Ínrø‰ÄÐç¿svÂéÉñy%5–‡×Ôr`–j9áµQ×äÈàèÓ òOÔUdg]3R“B~$‡YœWÊÉaAˆbÕ¥zÛ\«º&å–Ĥæ[n‘r˜`‘ÈÙ½+êZ³L“y=?…º&…ŸˆÚ61'l‘y8ò³[êjo]ÉÑØ¥«û懯ù.3-Ù^] z­¸&÷ÌØ€ë¬}uÕk䕾õ]–sp±etmk])Õô$÷øœšƒ?˜óù¤uµÏ,¨2WËÊÉM¹gAåe$ÏA™Ô²ù-ÔR2[W²ØÄ®ö…Ó`û°ÌÞºZB]­ë»­® 'ÖÕ©ºZ¸[OºWÑ\k™Ÿ¯wÙº’ÉUPWhç̯ÿ‚©Gna…}}·bW§êê°P[W§êjô  T×|‡Á@¹»±+•ºF%f3LŸhN®º¢®:¹¨9õ`éªL?QYryök¦[>+3#æà¢„s{Èš&›P’G|~ÎôY–pò>TWˆc,NXýq厈uSîlŒ‚^•×DløùÚ©M‰Å^éÈ £c3—”+gÅåļÉö…9gRV¼±~øÄq€…07[ªØCKó÷Ž‘]å7½ÊõѪ³sAWOþøÜ´„h{›VYg¥®õ—G/zóÂÌ¡I—’RòK£SrÍ‚JO¼*È:K|q£ã7ÕU©Âx¡Û`»àDpEï™}æw:øâÎյɡš‘%صä*‚=7¹úæÑ^×YùÓ[ÓÁA5E¢0DÓ6Ÿ¥¨ått¶eûÉŒJêú_ϱý×3ÿ[N}(ËúËö‡S×ßuÎêG©…UõÔõ߿ŦKoüº‘ú·-øuýIŸ˜ø¦€©~]“˜ºþ‹#WÛté³»¨É,¬1W³Â6ÍI]öv«5c2¥úŽ7¦PÔø³…6]µôõ)®¤·¯´$“«—“XÔõ]iû³÷ÿûp.E}³ºšËÔM!Ô§@uÝ}>É-u}gÂVwÕµŒsC]a~´åÄêú«[ýäâ(êúöêúét7ÔÊш êú¤º €MUP×Û_ŸLQß3u³Âù‘«jŽ©=ñÛ©ƒAÔõÝU×?›Ôµtí+s\Y«qªkðU«ÑNÕuÄ\Û_;U×F‘Uöié¾0êú¤ºJ £*·ý·öø¯•<êúöêúº;ê eëé8êúVêj4pêÔõ_øv!88¿ªëœ  6Ö•Z]韻­®ÑÅdM¸¾µ$öäÁÔõ[eûN’>œCQÔÕ&ñ>eãêSì\:{vš¤ø*™\Mʯ ®o¯®Oë\]Á¶dž ²í¢ºš‹SuöáwÕûF¸¥®åÖgªëš#VÖæ¹Ôõ‡¸o]ƒ'>K¼g¸cuô‘ðtêúc¿ûæ×æöa"|Ûð?(êÛ«ëOKSŸâøªßઙ×p^JdR×wW]½=Ã]u=ce]ªë7nªëM/·Éí;U×5ó&pC¦ˆ¡d}–3uýÏ÷³W7ÔžøÕ|Šác7Pb£®[N¹¡®àkjª©ëÛ«ë'ÓvR’UͬïT]ùú=î™É漊SuýÇðïóÿ¸µ1q—y›Su½Úa]]T×ßWŸtW]u+u¼Á=uMÌs_]¿YFQÔµ±Ed¹ yÉ^'êºçB»u%“«NÕõ݉¶Á€ÏÕuíQ«9µ®/ýdû:§êš]lµÄñpXuý¹A¡–õ[ª[‡Q©ë#_Øþ0säb'ê¼mAÝùÙÒòö™ïEÔU¯’Š«vNü*'óÄýoSÅ'] ®|6‚}d”œÅœzWSÊ>½VE­®ý^Ï-É2¿« Æ2}ÚTêS¬[4µµ4V”¡xÙSeë†f§ÆS×oÒ6Ë!ˆrC^ýf&õ!66ŸŠ¥®o£®µ!u}{uýxj»ºÚÌèÉ‚ÉU¤gÑs“«}º`àÐI‡9.ýï,2[¥l(ç]Z$«NŸµí|g•Ér&Æê—’)Ì*êúß-8`Ó¥\M}H£u¶jåÁHêú{/XýਨšOn0t¢Ã±¿ÿÇv›.½3a õ)Ê­§ÿ;B¨ëO1”sj¼ù‘¯IL]ÿµÑëlºôõœ½Ž+4à•ßh *ùÅ{w8¼V/ ©4~{Eý'¾^bÓ¥_V£>…9@%“«á)Ôõǯ=esЇ?[HQ߬®æ2së9[á¼6Þ$ŸÀU×}¡ŽÕµ³òÁä ·ÔÔÞ&@ ‰§>ÅúcW-ë×5º­®_ÍîD];JV1Û²þ‰¨LêúÔõ­éõ½QW5kOü|xu}§ê:`(QLz8”ð¯ïL#“«ñA¦—¸êfl=KèçkãI]øÚBW-Z‰uO]¿_pÐ]uµ™þ¯8ኺJ+’jþÀ==©°ªÞ]u}{<¡®`°¯Ž‡!Û⵺м:Î$XÇè˜õþV×ù»ÜS×'G,uW]c2K,ë‡%³¨ëO°Sׇ>[@Qÿþ÷gÛd«fl9G}ŠÝË&Ö› ó2¹šÌ¨¤®o¯®/ü¸ÊAÍ¡Ä}1àÕß=VWsq¢®C'þçÓ‘ìC#íÕ•¢ØÌ§œªë†ãVêÊmÙuc’¥ÞR©+°ØXÿ̤ç,“«Ç#)ÕuèÄq?}ͺ‘“*ÕzsšU›¯‚ý½ÝR9R×1ËY×´ËEq„ºvX<2€ñR]ÿöþwÕõl\že}§êúÃBgê:Ôdvüyë°?š%î©ë†ÅSyf‹Yadý‚*uýwGÍmˆÝÌ=3Å|Š·ÆmvK]·Ÿ±UW“eg¾"ÎÕպث뗳öPb“­r¢®vÖ•T×ÎÂ{(ô7büq[KÆqób§ê›eõV§ÖuâºÓM¶jú–³Ô§°Qפ|·ÕõùVRÔ·W×在ëþ‹)dM2¹Ú®®O0?œb x¯®6eãq«×Å8U×a¿¸­®9%Vêz,"ƒºþ‚]Vïâ–*T÷X[W›òÔ7¶Öuôò£õAó/9Ú»Åü=‚ËI.¨+ñ™C¹F‡@T^“õàûÓì°¹øW]Á‹½:î³oª¿´PÁ+`N½[˜}Ú SêjsS›j’nè¶á466š}Š˜qqÖô©Ä.Ò§€³‘Òkã7-#òÏ`]KW©ÜþAAe)2ÿ½3ýhêË!(ë‹ÿ=z¹u¬ >›Å®Û‚¯¹¥®œ!¸æ÷F·-=¯½º~1s7¹ËfŠDL®"=‹ž›\ ºZÇo”ÈUK«¢ã·0FâóVį,5ÚÎ*“Å&»¥Ó¨ë+Ô¶ßÍ‘)ÕÔ‡ØüôNI]_­µêDÜävfQi³¨Õ¾¾Í¯<Œ¦¹0õ) MËúj­“.±/.åO2'Wáhêú ›.ÉvI¦hpS'ý™_œ¬ÕZb4¨5N†WÖ²}H”õ¥ Û.)ÔNtÃ<Ù!“«Z½ÞI—Ô¶/Cƒ“RÔ¿¡®f÷g­®¢–¦š¸ýYóžhiàö8uí¬¸§®2%³¨De= §êªÒZýKï+uµ(6¡\'ºÑ…êÚ’y‚øusU¦“.9S×Ú:~%›PÐÉ…]ö@¢P{­VÛÝéI3OpOORÔæxÛŽPØØØØfz…uÉÊç‰w9tÄÓùÚ\£VÛz^!Ò+ÄDmƒ^/*ØÙ¦˜(Ð0—¶´.dªÇ-Ôr¸+ …{EͲlŠßQ]ÊR©T>oé bæÂ¼¤n¬”H$|>߇Í-x¨>tž¯ì ­˜×”°£öèhŸÈ FbÖëREZ¯j…-7²Ùì¢ÍÿmI; ¶Å•FÔMU-Ç`rJQG¹ ܨ8ÿ‚+ ºÜû­%1E fN½›øRs0.j/¼i®BýÅùV˜«« T¾µ¢µL'oßäÃ6»P{µÚñç5Í5¬Ù÷KKãlîÄWHM_öiÿÃhèÖ¾ô98ŽB.“–Æ*y6a44ÆÁ\Ò§ýrèvíÑ1¥k_i-º¢â—Ìù»¤ ܨ#¦êF½¦ÍÂ/(8¹ug§7§°oDRÉ>üScìæÖ¢¨² à :µ© W¶‚Y3hU’‚ˆÊ ëB¦‹´*púnh,Ô´pÍVjï  ?­ÅW›wAoÛOQžÀ>2ª!f“g bréY`rµ'ÒÉUié5 ó’ï3 F£^)©9ðVâ³™¬?è®ä*LÄŒPp£0íú³˜\õ7_̼¤ykäÍÉU%—QºæeîéIFâ‹ <Â8 çŒ2¤ |Àì(jsdIÝÝ@ßxæ³NV—brµ+{«WŠ:µo“«òêôÒU/Šr‚}Õ`gÀTNÛ*P7UùûD~…Ífs"Ö½iÐÈ]©×K'k¡ÎÄ ¢VÕìûFZç£>šÎkЫ¥åë‡åOìÿÁäj›ÉU¤êäjÁœ¿Ëk2‰\ â|žeB\‡H®*ê¦Jp^7"«L÷íÃ^¹Žª¾ˆüGÍÁ´’zp…ó”•'õæ,औu,M3Û~WkQ4çԄ椽à¤*· ˆ\ÙÙéZ‹®Ôü^µÚûžû^íÁ *[uÒF³7ÔÉš¢×5%ìò¬=“«b¥.£Zx‘ÁÉáuû7å±ôšr6—w™ÉÏ©)4zL®öbº1¹ ó}½\èGºFƒNÉ+ ðœL·%WMkcš“öøc\“«@.ªôþžº‘\­c•o~“¹²$H` ²»¢qjŒz„èZq=»º “«Ý‚“«ì¬Š­ïÂ5õUƒ½6›-åWYnßYAÔªÚccœ\_5HbPIEÙ§ó' T7Vô‚oÞ'WœûL®v#7’«¼‚Ê ‰p®ç'z0ÝÆäj·àÛ䪲ŽU{l,L}Õ`ïÆjßœ¼O¹RÓÂöm³Ä³áֆЭï˜Ö\õøi÷ÉU½²U+ôÙÚxErU¯”4%ìÔ+ü²¼iÃäj·B&W½m¥ûn ¸=µbüÛfJ´–,¬à2ÜÍôªøÅâüPEm޼&£öøØÆØÍÕ„h\˜qLQ“åm¿»JíA&ª†2ÏŽuš\+u¡ùõbÎ?ÒЪ5Si ½8¹‘““SÐ'‰ÍÏÏïî^ôEÒÓÓSRRºáÄŒ\æµüÔè³ÎÄÄÄ0ŒîîE_ĬöÌ”¨Ìcò"°º»S}ˆ¸¸¸¼¼¼îîE_$333))ÉW­1S"sÏðUk½¨}öÕ3Y‘ǘ¹™¾m–€‘—qb +/Ë÷-w9¾U{Ä-¨ÔžÅdf§öå Ðßdee%$$tw/ú(ñññ½fRÏȈOÃH‹q÷neæfä§_cf§±®Éßõ#óäÜNkf§å%_! ‚×€Ú'&&zß5̼,W<¯ÃçzN“«©•-UM.½>A¼U'Éçˆ{qr•Åb1 fŸBß>;öî%77¼ן—ÅÈ/ÌNb1òºþÔª}waVû‚¼Ì’԰œÔîîQß4???¿»{ÑÍÏÎÎöUk¹%)—|ÕZ¯§§©=Ãd{ƒ‡ò­Ú#nÑÓÔ¾W‘——‡šß]deeõ͇ɚ—S¶¢¬„ЏCe‰Á>ìUg”Ú;ü­ÓäêÙ\žFëù¿#VjÃY‚^œ\EAAAAzN“«˜ËBºƒÑ’ÃÃä*‚ ‚ ‚ ‚ ÒSÀä*8¸òy5THAAAA$@ääjpiÓØÄúéLÙœ"å¼u€èÌÔ|éØ^"WÜã:ïå ü &WAAAADÀ&W¦rg°äŸ‡U¼| }ðΤ§ƒ¤@g^9˜ñudõt¦l{žƒ×Ørç½T€ÉUAAAA¤˜ÉÕàÒ¦LÙÐ#ÙÝžu¤(ÿ9™?)˨—öÄλ;¨.ºî˜\EAAAAz™\›ÌÿðBq·g–¯£ªMàöÐλ5¨®“«‚ ‚ ‚ ‚ H"0“«³‹”ÏïNéö4£Ó2ôpÖä\Ií¼[ƒê0¹pe9ˇô£õÿ ÂR% ¢¬£_{` Fëß ßmHjÖwñ^¿ 6€Ð7g˜ñÅÿ»ã&Ämoì¬Öšwu³ðý4à@Á¨¬º°à³ÁéB ÝEsÜÞ±áÆn¾¿ÑÕlî–G—©ÖôFžˆC\¾A˜¹gڗÞøû]&óôàП·$£ð½ÅuÍïÀïŒ8Ä-á{쇸,|¯¼3bÆ©wpz[á®ðÑÛú4¿ô¶Þâ™ð{ª· Ìäê¼u·ç])ƒw&Î)RõÐλ5¨®“«†ŽòÝ}DkåPtœCïßFðÂØõ‡OÝ<ñµ;h· ßV¡íÒ½]$€îA[{ü›¿ÒhymäÜõ;öìØ°|ÓUA‡Óèváw™º½àü·ƒh·¾ÄmÍï½­÷x üìm1¹êe®öÜλ>¨®“«ñ îÅ[ÿòñ’É[9cÞC´[ß?Å'mœ¡ùòˆ»i÷OHWtíÞ^‹Ž½çßû ž—$2ØïDáû=ïàk4ÚàM•Z_·ÿí™ä¾?‘'¹—ÖŽó‰¶7òt£0ê××?ÛÚMΰkqOøzQYiÓ VSºæ)¾¨€< …ï&î ŸÄ3ïì"(üNñÂ;» ¿¼òÎ.ÒG„OmÀíAoëCÜ>z[â®ðIÐÛú·…ߣ½-&W1¹ŠÉUÄïÌwøì‚ô–òÏX:]õÖgi´aÇfs'ºôÁ-´G—ª»xoïD•?ç_´¿OL“áש5Ö£Eáû=g÷íÉ©²ö Á±¡4Úµº6¾Ÿ1ªš95ÕÕÇ>¸ÕùDÛyh¸˾~þ¯ýaRÓŸŸüxþE¶ýù LJÞòÓr”¾_@ã–ðíhüxíÞ_SMa- ß]ܾ‡Þ™…o{Â÷Â; ð­qKøÞxg~§Xp{ÐÛú'§®Â÷W„ÞÖO8~Ïö¶˜\Åä*&WŒ²ìe/ÞzïW'8Ú6m¥µC‘'D»çÇ™¹¶2kÊ´[?–vñÞ^‰®j ¸Œ§ÇŒûèÑÛM :n~àIÇKFÓ^¾ÑÕøüí®áÓe7h ò¼Ïß2hÄ9ò‡((ü®@;âçmoäÙ¦o¸ôÓßÒ¿^v$<.!æÜöñCÒè³²ä6çèƒA¯k·EŘÿöÊ^Ž · ¿S\¾çÞ…ß)® ßïŒÂï5ß ïŒÂ§ÂÚ€ÛƒÞÖ8>u}¾W8>z[¿áLø=ÜÛöÑäêÎÌõBcIBúà€M®îÊÞ-1²bÒ¼ï!&W÷ÐÕÿﯟ]”ÑJX1[‡ÒzåÓ´¿Mʼñ´I]°ˆN£ýûœ°‹÷öJä‰?ý‰Fðä—óv¼qfÛ¯ßM£ýåǰ&â ßï(Xë†ÞbråïtóonfÉIgŽÂï\›h{#OcÞ÷ ÛkZïdÂdâî›bxõÁ ×“䪖}ð¿·Óîúò\¹„…ï!.æ÷¼ðÎ(üNqñ™ŽÞ…ß)®›O½3 ¿sl ¸=èmý†sáS×Gá{s᣷õÎ…ßýmO®îH[ÔØ&-e¼tcKú²¦6qqþKGVr5é“tˆº01ãYŸ'Wwfn‹âÜ)&Wû2‚àÿÞù§O”KU&¤…kž¢õ/´A¥ÖšlZiÓnX#5Ë"Ðê½½Ó/%þþÇa[ãÇÞG»éõ£õ¾¿Ñ7„ýöðÀ=WÁÎ<½òç×Á,îñqëM.…߸˜\õ\žäóp;nzû¢*õU;ŠÚƒ¯ÞòÀ©¢ö¿ý4à@ÂíäªQ’¾è¹~´û¾?g~!0 ßC\¾ÁïŒÂïÍŽçÞÙ3áûm¼…‹fÇsïŒÂï Üô¶þÁ%áS×Gá{Š ÂïoÛ#\3;=ÛÛbrµû“«»sËÚ„BAÂþ|&W1¹ÚͰƒžw`–€Gµß =ˆö矓n<êX;»to¯DóÕí´Ac’-†) }»íÁYy*¾ŸQdLüížï£Åí«aŒ­YËž£ÑþôClW‹· ¿—y.OUîÌiw~z4§ØŠRŽ "6mÕæÁŽ­æ¯î%W2ÆÆ7o£ÝþÖ&óú±6¾Ç¸"|7Þ…ß9®i¾ÞÙ3áûk¸…kÂ÷Â;£ðâØ€ÛƒÞÖ¸*|êú(|pMøÝàm»bðÝ«šßým¯O®Þ—·ºTÚd€¡´ KO'?c“\5¥1«µáõ²r‘Z(•Êx¾ “«¯]l”$‹ÎU•µÁç’-“«eÙUç4ê¶ë:Å^=w¸`_­RN\=‡Ã™t$É”¡Í?¯ÔÇ]j?|ðá²bƒbÓñ”1¥jbè½T£oæWºËÃAu ˜\ Ô ©7H žøOíåõÑ©Yeb}Ç3¡×OÞXÌ/ }ÿÚ#KLßüëʽ½uá’Gh´¡‡ëÍÃ46žN£=¶¼XƒÂ÷/zîž!7¾>l‚|k:¹ …߸óòCä©-_÷öê:GÌj+½Ýò%_^ôäMƒF¸Öþ·Ï†¸¸‘\5Jó6¾s'í®÷¶0eV2 ßC\¾7Þ…ß9®i¾ÞÙ3áûn€ŒKÂ÷Æ;£ðíéÔ€ÛƒÞÖ׸!|êú(|÷q]ø]ïm}=րà ÍïáÞ6`“«Onw©¥.lh“–æ¿xcKÚR"¹šGlÙ‘±œgq«GH|zgÚ˜,©BÁ½—ؾ¶ÅXŸþ ÔÙ™µKrýº²aòÁ„'·'¼z¾Ž£—o=‘èb&W]í¼©ÿ385§høŽôÅ‚6Y%ëUr;Ù+hÝ™äg‚’>‰mL½Ú™µ½¥MÊ.ÿroÂ3{³—Õè Böç;ãŸÜ•wN©»˜D6ûÌ¡²"ƒb㱄'wdn ãÒžv½KŽÕ5`r5±}ÏL›*ö?iß?Å'š¡ùÒWwÑîû­ýe&]¶··¢Ì™ù öÂúŽ{ÐÐpî³;ÌR@áûÉ•¯î Ý £4»diâ¯÷Ñnû,LHÄ(ü.ÀñDÛ¨âå''¦;®ŒòTfOy€F{|aŽÅcsmCAa³®ÍŠ>ø.,…ߦoŠ÷ÒÚ½Ÿï)VØEÈ(|ÏpUø–¸çQøâ¢ð½ðÎ(üNqMøÞxg¾5”½­qSøèm}‰»Â·½­—¸)üžím6¹Úoa˜KeQÌXži§Á¨#‹± þlÉM½kaØ­ÛË«Œ²9["Ú+/O=,Ó†Šê·8nF£1ÿrì-°qi a[uBÂmdűãëUñ:+“«®v~aØ€MÙFýåÑ7/ àl‹Fß2j]x¿ö^]ç¦$ÝÞÞ«¸é D¯þ´³²Ö(›Û1¢›‹ ª-»"ú-K=(Ó]:En¿e=+Woø’kóšŒ9¡1ý]î’ÃAu ˜\ @ìJ›Ž½ïí[i‡ü¾ñèéc[& »“vó«›Ê4]º·‹ßèëÏŒø36è­éÛO†[ÿËshwr¤ãÍÜÝ.ü®D7 È[2˜FëÿìoAa©9™±'x­ÿË«˜í®…ïG 2NA^nnò®·Ðø-$#7—QÞÒ±JÉd…h´7CÅÕ½§ŽtÛC3rm¬>ôº'|]íÞáýh´ÿûzÕÁãÇÔo­Bệ›šo‰›Þ…o‡›Â÷Â;£ðípOøÞxg¾Î 8z[?â®ðÑÛú÷5ßô¶^á¾ð{´· Øä*ma˜KeQÌ/¼6iqî“b$˦”ùDrõŽ…awª—^¿®VëĪö¢2ê¢OEÓÇM7%Wo†–&,³Ccúµ·õq…AÈH»Ãµ8L®ºÚù…Ï\“_W×ÿw%ñçM«s"u×™Q×né¼W÷ÈôÍŸ®ìhaEf”Nz$ж,õ€LwþcÚ~³)¹:{Kmɵ¹¦äj?W»äxP]&W{‡6O˜¶eäË÷Ÿm½ùÞç¿]—Фïâ½~j `TT„Ìþà±»ˆ×ÀÜùèg—[>æëfáûgȃ¾%}Çoÿ¡›dO»û±÷&bH,Œ¢ðý†,áÇ{lÞôânN»½ÞÈSÃZõÃÐÞAœeà_诎˜s(Gd³0¸Ï½mn _Sºê G¯¬zõpÇÚj¾;¸­ù7pß;£ð­q[øÞxg¾5î ß+ïŒÂïÀ™GoëGÜ>z[â‰æß½­Wx"üìm7¹º8Ü¥²$ö^›˜™~‡yËÒØqü¶–¼4Ø2pgeµ¡u¦Û£–^#’«aq7Ãÿ—'.]ç¥'ßFîZ?«±­*!q kpœ\u±ó+SwË!kt½‘øC\ùüòö^qS“oíèð´#ôêž]UµFÙìm‘d ý·U›÷DÒV¤ìê£N\!·Ø^Vf0U[?§É˜s)¶Ÿ‹]êdP]&WAAAADÀ&WoZáRY;Ö”\½Ó¼eYÜx~[K¾iËòøÉ½°²ô­ÍWn^yëÚøáÁ¹Ï­†:ñÄk¯õ‡:+’–‹®_W·ÌÞwµÿÒ+O_´e‹wD¹Ø‡ÉUtR ½®XøÚcÉòðQ6÷ºöÐáèŽ^5OÛ ½zâ¿Ñ`êÕŠ¤¥Mm¢²ÂÖDö_ô{‰ÖÐ\ñü Bÿ«Ò70²î] £‹ý4WuýºlζHØ>Škäe¦Ý½Ô5yv2¨®“«‚ ‚ ‚ ‚ H"`“«ý—GºTVÄýZß&feÜsc˵ ‚¶F:¹eÀú´Éù"Ž–‹V­Ê).c]dÿ• 3›ŒŒÈøPgUòJ‘‘™Tz¨^£l»®—‹wO¸Ãų/t˜\u±ç£ÙFM-ë_+,6®ŒŸÄk“—çým5Ñ+Ñ+µ¢íºÎ¢W·oÍÝP¥0­xÕ×T×|³í yìAÌ£ ¡TQ$I`—dswDõ_uÿñê49±&VÝXñü*Õ5`rAAAAéAlrõöUWº¨¬MY#2f_Ž¿Ó£Ã&W»®óþ)˜\EAAAA§lrõOk¢»¨¬O]/6æ†Åòèp‡ÉÕ®ë¼ &WAAAAÄ)›\½}L•Mé›ÄƼˆÄ¿{t¸Ãäj×uÞ?“«‚ ‚ ‚ ‚ ─M®>¸9®G‡ÉÕnï•ÏÕ5`rAAAAéAlrõÑm׿<?§HÕC;ïÖ ºL®"‚ ‚$zþ©Ïèô¡Ë™Ý%"‚ ‚,™\]¨|~wòÓAñ^†Μœ+é¡wkP]&WAA½¤(týÄ/ßxö:ÁcÏ¿þÑSV¸R,ÖwW0¹Š ‚ âÀL®þšÌÿ$´äù]‰^¾½Rý{·‡vÞ­Au ˜\EAÑ7DÍFäT‡}3yÑšõëV-š1æ³aO[>;Åï¦ì*&WAA˜ÉÕÐò–éLÙ;'r_Ý›°åƒ3Ì,Y6_Ö;ïî ºL®"‚ ÒçQdÍ}‰N<ö,Gc¹YÓ˜¼fmL&WAAŠÀL®rêg°dß]©zçxÎð©UÞ=™ûc {:CºŸÕÐã:ïñ ºL®"‚ Ò×Ñ×û„Nô§ØVªZšª“³þ÷þ°Ÿ2½6àÑçÿ3búîäeÿ^›‘w~Õ˜wŸƒ ¿öõü3e ½¢2bã¸^z 6 ~sôæ¤ÆŽTmû!«“-üñ­g‰6‡|¹ª3N/õÞ‹Dk<÷Ö‹ƒ‹¤?HAA$  Øä*ÃKáÏdÉ畨ªÌ`JÇ'Õç5P-ï ØÎ{3(ƒÉUAAú:Fqì/OÒéC¦F7R,RUä­ñÙ“æ¯Ú´=hÛæ5óyû1:ý…Jb'™)¥?öþÂGc¦Îž1ö£Áð÷ß½A§?þŸï&Κ5雡°å©ÑÈ“´B0äâß?B41âPµ–¬`“\5ˆ’–¼I§?ùá” ƒCNí[9f8Qý`•Æq‡AAz+œ\Eú£1$‡‡ÉUAAú6Fyþº÷LŸ±zãÛI‹6î ŽHfq$:ªC :7x„9÷Ù¾øõƒ%áÕ £©‚’µæuhñ•qsÛ×¢êùg¾y”þèBS ò'¾Ü˜P¯&1¯Íz‰N2;SNÖ·J®*r¿FìËýæ…¬zÁù‘OÒ_œ™!÷¹DAA§ÉÕ³¹<àƒø±RÎ`rAA>^Ì ^þó;ƒé7xäµså‰o,fÕÒ¯œ8âÝWž¹QéÉß’ˆ!µÿÆ}±Ú\»5vä£ôÇÆÄßø’ª`Õp:ýý=Õ¦´­ƒCÚT¬Ãèô77—‹Q­“«Šœ¹CèOnT©Í(8'¡Æ;AZ?KAA$ pš\M¯V5áhÄï°ê$ ®“«‚ ‚ $F­¤®836ôÈ–cÞ3½]õã 2SöSSuä"©:ä‹)«v ¹|%îÊί¥?16±“䪂FüHC«:4¿^¥5`rAAÄ}]ðwÑéo¬#ÒŸ²”)ÏÑéצŠÍ¿/“%{Š*¹š2á›äjeÐ;ÔÉU=?øs:ýùé™vÉU}Ù/èôÁcO¤æÚWT§Àß¼!‚ Ò§påBõbÕE¿„/•«)ßö„ î#UéXu’ËL~³\ãT1¹Š ‚ H/ǨW댶« V£Ó_^˜§lÓs~B§™›£¸±ÛÉUEÖœ!túLJ¹Ä»¬_ O›úþÅIÅ7·AAú®$W™ZŸQ# ͯ‡úX°ø°\bòskÅ*ó5«˜\EA¤÷£*X?âÇU¡B«E úÆØ¹Céôç&]یˆ£Ó¿2ç6 ÒâS“^¡û4¹ªaŸüñ):ýËc¦ÜªMrÕ(Išþ"þò´HE7j^VRª AA¤/ìZrAL®"‚ Ò›!W¨ƒß1nöÒ56¬^8ù»?[†Íˆ˜2aìä`Ã+ßLY¼|ñŒŸßkÿ¨•·ÉU:ýÕ¯&,\»y˺…cß{‚NôÓ ¢öÕ±ÖÉUâÍQ3‰~>þΘùvîÙµuÕÌQï ¦Ó¿ 9Zw‹ ‚ Ò;1!9¼îΖ!ˆœÍåiôø*/AAz+'-x˜џþçÅ'Ú¿õì_þ±ùr©ôFd”Ÿœõébçã¯|2~S#ê7ï_ 0øÛ™|=ìI2µûÃ’àÂVóm“«Ä&1óÌêß?fÊì>öÂð~˜¹%$»ß€ ‚ HB¬Ô†³Ý-C7H¯V5É»ûÖAAéM8zç*‚ ‚ â V„Á•tw¶ AÜ@¢Ò]bðÅ mwß=‚ ‚ ½L®"‚ ‚¸MC«:4¿^¥uõCB Ô‹Uü¾T®Ö9WtAAÄ ˜\EAq©JǪ“\fò›åšîΓ!ˆ'ÈÔúŒah~}pv,X°`Á‚ ïJíî•ïÓéÃFŸ­îîž`Á‚ ,X°ô€r‰ÉÏ­«t¸fAAAAAAAAAAAAAAAAAAAAAAAAAAqÀÿćâ endstream endobj 10 0 obj 461942 endobj 1 0 obj << /Type /Pages /Kids [ 6 0 R ] /Count 1 >> endobj 11 0 obj << /Creator (cairo 1.13.1 (http://cairographics.org)) /Producer (cairo 1.13.1 (http://cairographics.org)) >> endobj 12 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 13 0000000000 65535 f 0000463044 00000 n 0000000184 00000 n 0000000015 00000 n 0000000163 00000 n 0000000504 00000 n 0000000284 00000 n 0000000761 00000 n 0000000740 00000 n 0000000861 00000 n 0000463018 00000 n 0000463109 00000 n 0000463237 00000 n trailer << /Size 13 /Root 12 0 R /Info 11 0 R >> startxref 463290 %%EOF stephaneguindon-phyml-76a39c8/doc/fig/phytimetrace.pdf000066400000000000000000002224401501136442400231110ustar00rootroot00000000000000%PDF-1.4 %âãÏÓ\r 1 0 obj << /CreationDate (D:20180621144741) /ModDate (D:20180621144741) /Title (R Graphics Output) /Producer (R 3.4.4) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 68187 /Filter /FlateDecode >> stream xœœ½MËnMo%6~Å=Ly¼«JU’¦6‰ÁРݯ¡MÛ¿Nlšüû\ÒZ«öuŒ1vÎ9¬³÷®]õ¡R-Iãç/~ÆÏßþüÃoÿéç~VüþÌŸ™ùûž?c<¿güŒØ¿›ÿüãßüü—Ÿ¿ÿíOþé?ÿùŸþüÙ~¿?Ïóó|ýý‡?û¿=¿ûþù¿ý×ÿöóüüõoãç/>þö·Q/üü‡ßlþ>ÖÏšöûœ?lè?k=¿óówçøYç“ðü¬¿;Ÿ®çóíó» BûÀñûtÂüYÃÐ>ó{<„Ñp³¨O÷Ö“·¢Ï׷ƢΧcUW÷çe¿ßžOEϧäèö+Œþv±ÞXÝÈÁ§á]‘z”CÒü4cîßg×»JfõôüT4ú—Ì–F8` ¶Úœ„ÑÜ|ú©¡ºÿ<„Õßç÷s×ø~ú;Æï‡ß¶`?ÿð©•Ø×ï„Õ_«îÕOŸAè€|Z‚ý´ya5cÿžì ?ÝŒ`#%{äø}%lI’O#ž˜³»ð°‘‰ŠP²UëêG±M¸û„Ù³ C´å]/cQõ짃ɧ6{2¶Ê0ânT¤z÷îm1ør ö.2ŸùôiƵµFï°Î¢GmvN+–üùïµØ[°i¨Íùô´ØæìG^ëtoÇýô³º`<ãÛhÁÖ=€ã{}ŽÚÿß5'Z°Ó85¢Š|ço´`?ÉYòÂ6á|º‚eÉ%ا…è pcãlU ö³æl6ã`?Z‚X( «h5`Ì[”/¼ÌV•`¿Š ü¾ª(0q6;X‚›¿QÔ ¨nö(±¬®([°ŸÁa´`!É„`Ëu¶~U{7Ÿ–~U‰O'úû,ÀÒ¯>Ðør v»¬ö£„~µoQ%Øñ6£ô«O½XFúÕsŸ–`Ÿ|áÆB!˜]ïbÉŽv°¿EN=¢`7Ÿ¶~õÔÐ0¡È EÁöʰ['­þö˱ñmA ¤îþîGü¶[]˜€s¾²*øµÿ~` ¶ªA¸»¢ž)±ÿ¶ªöT\ŸRqM¤âê,j£¿‹O[¿šH¡¸–\úÕäd/h]²Š¢`'»ÐúU`Âî‚5(cXjÀ4 þ‚ºh¿< ¸.–\ú ²¿ ØŠ«A7+¸!g¶Ùó]Ü>‚Ý|ÚúÕÀÝ‚ÝЂ b£ï¹°'×…#OALœ•€¥_mêu?ý=›ìÁ¸Vb²`éWÆ%¨à§¿~ |~à‚ÕJ~ÁO3êP1K°¦‘3[¿ò í«à§¿nìïlÁæÁì.øiFämdéWqøÍ¬?·ÞÒ¯lÝF–`¡g4,5 6Ö[úUí»,ªk\‚>0ÑßàÓÒ¯l°‘}^Y'¡·ï>¯TŒOK°1 n¬mq±¨ÕúU >ÂìÒd_­_•¾ÎoK¿Ú‹Ã¬Uësè>ü¶ô«O½˜G ‚ØS ~*Š…}ð[¿rœb ¢" †ÕúUmǬ¨ô«µn3úD@¥·àÁÀŠúfÉ}"˜WýÈØÁĉ~°äÄùëF+έ] ~ø>°ô«ZÌpc²OÂìÅÍøòÄy?øtbâ`U±Ö¯j1„þŒõÊZ°µ|±¥_Õ€¥_Í}¿ÝPä’m¬Ï­]àÁ wóÛÃó>Ÿ:æïâ·­¸.(TXúÕgî·òYp¿‡ô‚ùÒ?°×}¿mÁ¶"õúÕ†ÖWÐßý6¾>=íÖ;úHK8Ñ_ˆ}CqP¨ö†âJ¥è[q•èv«¥o$`+®Ú6Nƒ‚ÝЯ6§ó†~¥EuC°Æi·~56÷… Á&»¿!ØÅ™²¡¸ŽÛ…À˜¬¨ô«R/Ù£Ä~„Ѿ¡¸.œC âà‰ù´`Ÿƒ#@A6K¿*[AB°›pBŸ„$ô+% òD¸Ð üÜ­ÑtQl†aâ,eþõ –ÇáÝf­w/;P\yz*hP&!ö£`›[¿¢YiÖ¸ÔŸÖ¯‡¶YŠz°dÚ¯_N(6ê/OÞÞú•Ìw±Ñ?„<´ih;×äÜwÖ8ÌjÏ)ÛeÄžâì¡è\†ÁIhX¯œ/N¸9Å5¸;×EmÄ¥$ë•aßTì‚Óòbþn> ü¾ª(p> –\‚ÍÁ•Ð[°I#[íðÏÝå+Z°©­-jjÖSl‹Q+„=“‹[”`mñôôŸ9aCãªÕ=[Ρ%X«Ã_þ (ûŒº‡õ–`3o«>ú•É"·ûÑ…nTüö3(ªäÍ’?‚µ2gñéG°V“ßz5ãP¿jX}{Øf¯þ.Ør?0Ð_üTôŽº¨Eݦ¶˜hýê³¥b0d+®• #'[¿úh#÷i¶’ÐÖ€,ýjk³NèW›ýí­µ-ƒ†A´9¡¸Îûm+®› TBq1€ÖßneПOiq|ºqâ;,ІÁÁzÛâ:ùû&N‹„„aPºw¶â*SØN¨ûv¿-®¦°lÅõá,ËÖ¯æÆÚ~žÖ¯dS-¸±2lÀƒIÑ‚\(‚0ÞsÙNœŒEMXäº §¹¾8„Û"‹jÁN˜hÎÃ``xÄ~tتl QV´ã½2øÀƒ…q ¢¿ÆoµŠ'‚ÁfÐ0ØÐy`4üFçÁ‰€ç…ÓVÛ6¢²-XšwÎhýêórØ‚Øú÷ý@ ¶ÏƒÑŒ^¾ &4~Û‚¬w@¿ÚÐÌ?pÍwQ=úÕÄ1ü Áa½† ·§Ü8ˆ©›1E‹«³GÔ¯~KÁö0û@‡}r²"*®‡Í(Á.îÝ÷«‹̶æ%aŸÖí`éWFeìLúUAïãƒ`Á‰÷²œ0¥ ôçÍ—ç×Fð‹Ï$„… œP\y–<Š+oÄ>p?_?èlýJÓùLèW´¹}à"g|zxc€Ò¯Ø*‡ÅFÒÞ ði vnŽØ ýj`Ý(ˆñì|9¡¨÷Ú~WMýjr.˜² *ÄY0 ¬“gÉ08ø´ô«iPÔ &lŒ¸ Ø¨ä…f<|jó]EÏ’âê|º¡¨cî¯ì ýù,èWZÜô«ƒm¢`¼Æ®³`ÜБNÛί]ôƒ¹‡ëUëW˜0t–œ4”%!ô+<55Ú ú•°A¿¢± -rHà ~PkÁŽäð6د Ç®a/Ó0Ø'‚Ó&üZT_67¯Óÿöí!Ÿnô7Ùȃ…Â1 vó勺±UìÃ’vŠëâ·-ØàÂhP\l1q0 W­9Š+MCgËâ:ùtà ¦§¥¸ÖLIÀ‰Ô†²³qñJ;p)Üè'!®’!Ø Åõá ÝWqeQ4 B*®Æ¢x£„¼xm± ú»XMÙzÙq|êXŸ“0hf÷©¸ªGÉŠXTbþbm?²¸¢‘‚]œVG7Úèѹ‚äA{Nœ†àé1 âÈ~…Ñ~Z¿zxû_}ÎG‡E毳U{}-æG7Új$©{tÎk:ø@û\vÎ/7Ú±ÿ>,9`Ýìo´'™¸T(XèÃàäë°¸:n‡`y³üÍ8‚Pä°ò{ öÉû2õ+#\X(°‰8n´ŒNÈmÕÛ‚ n^ýJ˦C°“sßaqõÛ…ƒ‹*g«¨¸b\yëWÏÁÙªàþÒûÒGiBêW‹² ,ŒÁoŒÃ’uñÚ Y\±|….^Ѫhýêþ¾½æÕ·žBQLj èWR]'šîO@¿Ú]@°¼ ûÀV÷ßhýªV¤CX7žÎͺ5‹µ&—¯CjXT W×€¸ñ¬×qˆ4`¿’p×Äa¹ õÝbêi‚ÌâJ¿ZZ ŠëÃ%7¡_Mê“Ù‚ÝÚ»³Õ®9M‘(è|¹-®¼·ªY~ö7[¿ªùâJ°gsmƒÊÚÎ%·éeÅ\H–öº“R\ÕÈÀõôë ö†ýÁfÄ’Íp¬Ï‹/;~ßÉ—+ 4CŒüÒ®ö«àÏ0 ,AþÀâJõ² Ö«$8˜ô\ð×D3>pâ|Ô‹¹?²¸vE1{âxß‹®M:‡÷ÍgëÏ Xú•‘¡Q†²žìþ@q}îÓ½ßÕÌ ¶Kx¾nxý~E£NçÍ¡„þšïê&ÏàËÁO>Íç½ö‚å ר¼{òý*ØßÅuCsóý* ·{ßç\5χWãË¿/º? XZ|@¿¢]¥ öß^|ÜmA÷2ïÓê5)ûÀ‰``LúâÚkNA´¿¥){³‘¼x5~ëHjU`˜-¾XŸ{j|`>ïõ·y«UýíùëS'§ÍK÷ºÿ6‚^ ŒA-ŒÆàà‘§àÆž’€ †îÍ’ û*yÅ«™;ƒ‚MŽ:07cPJàžç=†;ƒÃØ_0uÄó Å•–Ÿ2 èïæÓ@Os¼\µ‚û=;;ƒÕÆà“P‰ â÷}øòÀ~´iQwÀÉý7 aQO¾L‹+?ƒ" 9ƒ¥ŠO@CEG1ü ‚Í[{°ä3^½Ý».têÏ‹Šœ³dç ¥_†ß‚8ˆ=ü–¦ìÃoŠ – kÁ–Ý{Ò^§§`”AVÅuáÐM7ÚWÅub×pƒ`“ë3ƒÃÙ“`EÚ˜V` ŠÞàÅ5°;;ƒOÜ6oü¾yh¡b½‡ :åTÔBº'[Õú•ß6ÇzMÆàX\7À|’ …IqEQ/c0¿ ¾e¿‚$Á¼ÛӖ⊒Á­ÑÁ|®o–&Gcð9P]ê¦ûo°"Ãï‹9¸EÅ\¬w¯—Fâ` >‡sŒÁG£nC°ÚÉÌû­c¡X¬(ÐßÅFÚ‹$UàáÓä~Äo©_ax Ýcp<ÜÚKN¯v¿OysÀɃ6‹šXŸ16ÀkžX\É“q0u>òÁò®ÜûTÑ¢Û€Û^uÚ›2Ðê4ë¥ý*YÔ!‡E96ú6ƒ;ƒcqQcP$O?, °ÆààÁÓËÃ…ƒ18 '/wY\1ËšiÕÃÌK¿zÈuóB,úvB‘ÃðvîÙÝu£=XòÂFïü–TLÕk8˜@t~WAjŒ‚ø}+“Í8¸ˆÄ‚ìR\ëuZ¨i¿ 6#¸0²äÀUãdÉ *µ*JÌßVòŒÁÁã’_Æ –ÍÀ¶±d0u w0Çអbšž~÷?†Aä ï42$ù”T=Ý`,@ùcp$Wþ`“õûúA‚¥MÆCTLt¬Þ„Š~˜¿ú6qÐN¶Š×Íî“1ˆîƒ1øð0UTÄ”~…oS×E8qƒ"¥_aÍIX\ ƒOÜzi,Ê`±Á¨»ŒÁÅo7毱ä }ÃÙæóÅX(Èñ,ˆþBt` §ÎŸP\ªd ’bä)ÁnÂä¶Èzëô«¼7ÚÕÈ cL¶cPöØxt£í‚Päz\}࿼LÆ`ïìAÆà‚‘-p\Iö2Éí 2ç­ˆWãÓ FJß§Äs-®xP‘³GuÓÓ|7‘ c00‚ŒÁÕ,6𓃧U< b’}WŠ\߉ƒcBÅ•‡åòÈ„ýüv|qòcèâµ·ãR\7áâFÁìZãÒc°TS¾lñ*1 ¸ÎÛÈMû»p o ~{P‘úëØœm¦Åu rZ±¨€þ|!©Å|YTLVDÅ¿ï„`l1Æ N^1¡¸n,A1å‘Ñ'¦,®Î—'®Þ– —~»¸ñ%!&Î 42Bù­A‘kÍ-ÀÔ1-ÀÎM ãŒA±vŒÁaX?WuÐqÐ~( §Ï¥!‹ë&Œw_ø@“Lm2Æ ¨‚,DÆà”`,®¤rœ³ÆÀ‚KŠkðe7_nÆ Ú Æ =ØébéD ’K¿Z<>ƒ“*q,ù Õ¯dVGSÊ»a± ÍäJ1xîË%ص8éÀ4’‡ŒÁÅ£tÀ9Ëh“ 0MËÈjÁnRPŒA]­ƒFÝ, W‰Ý®GFfË ¿>œ³–70©kÑjubûl` /"ŒAã}YÁÝäRUú•ñV+À<ús8®ô" 0óáì6X\çm†ÓËþ–~•t‘‹¾Ðhã-Ÿ–~uÈe 0#oQ%ØÃ±cÐx‡‚¥m3àœuèŒ` :I5«"ÿ£ƒ6¨nƒá0³DŸƒí1ÐíŒÁ¤ßbô_//>mŽ+5ócp“u½ÔÈÙ‚»ÍÑjdéWûp5Û-ØÅ}?Àœ‰ÃT€1¸‚«7œ³ŠºÍ§¥_Ý( îþõaéWÇïÓ„Eý° %ØÅo€18éö` ÏG笭_ŒA0ç–âzŽKÆ`Y¶7aÂü΢ *ª ƒšÝG>D­Œœ³}iŒÁÇ)œÃàä6AÆ )ÆàœÜËKÓP€1xwÉ£íÁfãÚúU€1XæYv7Ú›õ&–McÉ Ã–z¿>D‹úzÆ ¬Óá8P‘ 0Ÿ¤Úã°¸N6ƒÎY¤ …ˇ˵Ë08ø²‘±À— Šz«µX‚ÝtÐ0EhÿÀl,*TpÎ2R£ƒöðæ"úÔXß:;Xú•Ó›2À´ÍqÕ*L±þŸ6c$ühÆ Íç¶¹´™ƒG:R´`ƒ®ÄÆ <›¢ƒÅ‚C#›ÃUf¨=ͬ…âðåÒ¯VR5¥s鲯 i݈+ØIXËIbÆ X%ÑÄXó¸/“1ø°Þb .R‹£³Ìè|` Zrùjb-žCŒA£KB€18h3ÿÀ`m:¬Ñ~“µ6TLR£›cZÆ`òá\!0€›1hNmœ(ØghóÝyáGcÐH 0–¾^ó–“ð` ºÔélÅuÓ¡;àœeöBïåKm.ÅÕ4®À#RWìe©ARt%6~0aUsV)r¬ˆ®Äɧy^Š`‚18xO—` >aV0_T‚1øðî)ɤ­ áœ57ŽyƒNÈí„ýªí“ ÆàWET\ÕŒoÅ5ÉÜXÜÎYâ¹%ƒâÕçó‹ó{^Æàf›©¸ª ¤ ,~PÔ+j‹+Iç¬y+¢âÚ?w–Gž$cÎ,yƒ½ôå€aƒ?Á\ÍŒÁ'1TrÈG;ùtÍ÷R àyÃ9d¿J¶Êp>üÖHmb«6ˆ@Áf18ùòÁ h±¨ãïé8,®ÔúÎYƒô³cpÒ¯­ *2~ù5Àü ÂÖ®s€*@?‚cp,þ Wš…ÎY:'ƒCcrB°Žõ*Áœ’3ƒ·‘W^&æe .>5 ¤^7ÎY“tècP—§y„fjä¡kŸ­. Æà“·¿ŽƒØàËþ{0t·µ ¨\Á¢†”Ão“>€-ö‹«~P0ŬN0¯ ÎYƒ÷G ÆàXló‚apãÄ—Kö+•¼Ö{é“ Îïç”$cpaéK2×-Š>Ú‹m0R‚]ؼ$<˜¿[ðË•)—œß“Ípøx>,9ès!ˆþ&‹¢~µ(ÄX/È ç¬I7Õ$cPklëïMª9€d B’&ÃàæÓ‰ßwðÛIFwrâ$à‡ª·Ô$cZÁÒ0¨oí[ì` ^T¥‰*°éê¢V{¯ûÎYºšIÓÅk²^)®lU̯Ÿ ŒÁ¹8Ì ‚¥}2M7ÚNÒ"×ÍØW°I‹:†è†q ÆàÃsJ‚1¨À¹å£Ýv³Ür%^,™TLã· Ô5Lg0Çí:·,®ƒ/ïùÚùŒÁÇÁ±É mº›%ƒÃo½‡14Ø*R0bÉÔ"³EÅTQŒ³ùrbÿ}تÜ_¿Ñ‘+160Å(+EãŒAùáæÅUÛ1œ³d“É£‹× \ ‚`Qcp8tïcp’ÂG‚m#L]¼nBÝh ’Èñâu³ ¼ÑNÖëXFŒ=’»ïPlZ÷N0åPðËg9霵9ÌȤ=6†AžSò2MO¿Ç³Ãù4Î|ƒ HÆ  sòåEÆï&$Cƒõ¶~uø+¸,®›E eX]7Ú&HŸt–|`a¬—†AÕë°0ÖKŒ>ï§_‹«’ã*iÄ—Ozº\]œ%ËG»aˆŠ‰ù,m#IÆ ™ºÑ~ø-©*¡‹W¬H` ê0‚¥e,ÉÔ0 ÎÛ*ÃEäá·FWS>Ýèïâ6í“„T\'_&óaåêÂz}ý !*¦ê ûšÝÁÒ¶™¡8ƒ/'Ö+,#)",¹)Wbèu Åõ¹/܈¡Í` Š9P.këKaN¹>e œÅoµiñ©ñ¼ÀŠŒëÕ$äÕ9[EýÊXÔ&uœE0œ¿ep¡Í’Iõ*¸_ŒçÉŠ¨¸Bt` Šðœ‰í犎¯-ñ‰õ™ÚÇ!ÈUŸÛ«6fDáÀ¹~ª¼€Eì>ORœôœ×§-]y.áýÒÆ'´V=Xÿ]Ïy‘Îù±EQ`ûAUÔÕraz‡ßï0j'1u»£ú ×ËÏÅÐߦާ'3÷Û-*èV{ [¦Ø%Ly›Úë8“ºäCGñTùýÝõ}€È7…i œê/ i/ä.œ¶c¼qÿ{q<ê/é‹ö¸ŠÍýâ‰ã8ûs@ ­GµGõ­¯ð0…·ùªÏhÜÑû䇽¿qAvËß$^?ć­öWu8gݘ_aó˜zÏ÷ú~²“ò‡ë˜xGº|µ—òæúèŠ.I} œF²b¯õø¹û?õ ÐŸÐøq¹èŸ)ïA­ðš¯Å£1ÛóÓéyª}†õóìÆ©ñìò˹ýÙ$&-âƒñozŸ®9¡ç<„ê'Ç‘óÓEËMÕt¿R¨m§êÏ/Oú»Hëèo\}{ ÿ¢ß‘ë8¿0äF”OBß6íàBê”ܘóM˜nÝÕ1¿Æ¸ò¦¾ê¿sþ«ýõè–'jê$Nž·ô=M¥X?¡èßÀéGæÂù=žäþIꋃ>k‹úH°×èÙç¥ò6|«¼…ýúߘ’÷Ðû?\ècð-j’Ê/yÆ|j\Œ¬©ñ‡x÷±Þö8ãrüTyœûÑ@Èû’7h•©óé¯2ȯ`EÚZo} ¦Cª=%ïÜ\Ÿp06‘¡&ž)cóÇÆ£õôJŸ*üÊ|Ôÿöe«pRìO+š¦vÁûL”ÿP÷ÅÃáøÉò<ú=ßµÐ,}ë÷jž¥í©ñÑŠ–íGýo¦eÅà2Õ÷‘w½ýæþb Üòý*¯"^™öçÑtK³¥õ¬ù–ÅKïwÐ+º`5þ´Ç¶ÖÃ&°ÛÝ8—N–áÒÿ­˜pŒ¿h—!}÷å%Ÿ­ò;¸(ÉÞMÅÜ*ÿ#o“ŸâÀͶ=d7Þ=>(„Æ·­ùDú% -†…ß9ˆKßv²­{Ó®†Þ/ýOñ=oPU“0í•Wpü_œð„Vûr½ääzŸòΪħVÐ/q«XóúÑ SçM0àÚ^ÏKÿÛt ¸]Xû®ˆ–¿¦ú Fæ¼ë(™6Þú›E¬óü )só|ÃCµ'ô}Ó2ïü/Ó§Æ7¢æ'É…}"$ž75ó®_û†qRùMÎÜ´oÁpUÏSÏK±­ñ´ʉú¢çÛ­ M1Ú ¾"±ý@ߎk½h’fÍOœ×F‡Ð·s×£¦iÆy†“"ÐmÕ¿ìÙ .ý/µ·ó­¿äí[ëÈš{ò|3Jßõžq±5ÿÀ×ô©ñhúÁë»Æ¶Ø".ýï Éõ-5ŽØ°Sò*y;C“ â¯ùÄߣy›&/ƒÆÞ:–×ÌM3Óú݆µšï¡ç%ï)û ݵ~±ýÍÞ,׿ö”3g¦ÆŸöœ+¿¾31“}»ç¥ÑÎ"¦ÊÛ»×Wþ>Mâ´=ÞþëçSåä]dKWùŧö×÷Îýï!.ý/—ö{R9ã­¿ää{Ã?†Ú›Ùñ)ŸVljÿâz>çNwDÛ÷”>F§-­'¡ Eß!²¬«¼§Š¥ò˜yg__ç pËÞû‚Á¨û:ïÀ ¦ï?ôýÆUÞÒsžo8¿öÖóöþôúïë[ éÛ¦ò附óËq’Sý—o’ʧ}›ëoÊÞJy&ô¿»¾2ÿÏ©\<ü}…ßÕŸ7™òÕó‘ýp¤âm-•¿H~Âùu_¶Àk¯à{Ž;ÿSAão{7ƒ5¨} kú¨i2Fò<6ÉÕz?¥_öÈùˆ©àÓù^å1PÿP{HVHõ4Û­÷é€*×ê°×LB ­1ï7‡nÖãbØ[¡OÎ!7±G˜t[ìÿ÷Ü÷ I<×—= )ºšÃ¤ç öÓ÷tÆ=')ÄUt=÷y~×Aš½ÎW,´Ëîp²lûÆÅtPùLã3Õ'™m “½§úëÎKsÈqŒ¿ÇPÈÎÛŸ$cåÝ0þ˜ßóREÙŸ©°Rì/üòFP¿`‹Î¡ú¦ì­XŸ&#LNõoÊE?/>_ëédÉÍóÜœ"‹<÷ùW<€Âd5¸Ú»±þ=Âg}ŸçKUý²·^ÌöH´oµ‡öí£þîwBÏé°ëKØ?Ù^H•¥j Ù ƒ3&)¤ÆëRœÔûýÀ}êÐ÷d‘N}?qß‚õ{ÂeOÞaaÞûß¹D!I='•ô¶‡üö‰ß°ô>Ù¤ü½ë_ú¨ÞmÔ÷{s¨|RIBý£¯9Çó¿ÁïsÜïãþÎ¥}¥þ0Â'Ç7ƒþË~4M÷íoûÿʇÔRÙ»çå–r}Däÿ'´ƒ]zí7“ôRí/“ÁÿŸ÷{LCÏé}a^Š©«½â7<Âß÷©Óä×ÿ¨þóå/4æM0ô¾û×~8o€­úõó~Ÿà2=ú>¡oØ}ÎùˆþlPÊ‹±ßr>‚p:îzŠtXæ€I9M½?aß§|@ôÎ1·ìܶýq? Še냓ߣïiß^j/9½·¼ÃèBG˜ò~„qß~ûG~ÃÑs&˜zNêTý{#÷Ç­û×sÆYê?q|ÙÿöÅ´7:1=Ó¸¾ñî÷´os<ÀëOÎZ…]‰û92(ÌBã/ÿð´o‡¾7ê[ªã~ã•éÄ'˜ôþ3­Gü†yŸƒ­¿„Ý^fZcì73¶ýR÷m8ÿÌ#>‰_Œûþþ®hKÜ/\™™ØƳ”ýt‚ž:Å÷™H°®<@Pù–7á :…ìGß—þKë)2¸ì_,Õ%ûëMuÉ~5]|’­ö–þ·¦ô%0U§ÎsÓo8ÖAìøý)d˜_íuòM‚˜ü†u1î7øû2Ä¥øAÓ#€¿WÀ¾}õKrVCúG(~(åJâ:ôýà}Ó&¦Ã×û¸Wú^ADõ>íÛÔÁ]}ümSŽ>÷y|¯w¡ÜMób¬ÿSõ1þV}ëß-OAL˜ç Ƀ|’Û?žo–ž+‡“¾OÞoI~ ÍÄù•×k Cßb.—•ëU*`ë¸ÏqÞpá }‹ã‰Éd?Ÿ)ýú+­ïy*ýŠúßå´>*Ï0ÿ¹ÿ¤Î7®ömœ7•Cå1¹£«ÿ>¾÷ãTx±%Œ¶¦ò©ÿmµ'pŸ~åIzkª?‰ú°~­G|Kè/ üÖ{ß½`ˆ¿².¿uëý‘¿–G}ëÑ"¿Uúób&—j|¾î{ø­W^ëÍC ú7|/Žž3E©«ü šxó¾}ª>òLõñ|cꯓÁ­çŒ>ºÔŸør–n ·°©ö%ù´[˜ýfRº(5fp›$&ŸØô|ÀùàÑóÉèsGü¾¡÷(‹íºoߪŸq°ç¯¡è¹¦òÓiéýõëÅ"¿Uö¥5äwÛs0þ§¾?_ Óëè}‡¾áª?hÿy„É!×ûI~¯ÞOèÐ'׿úÄbMÆKmüͧ]SçÌÇuù­S|âTy¿Oð[qÌV.S•¿âKX—ßzÔf-À~¼¦bì‹¿×ÛÅÄwûø­Š^Ù˜ç Õ¿1ÿ‡ê'¿•ë+$š«üãßú˜Kß~.†½a«¿ÌG5ÕŸà~£ò˜˜rëûÄþwû“è?çk\ûŸ s,<¨ßéùàø_˜o°/ð[ï}Ù"¿uj¼„Î7œŒè)ÿ°WßÖsêÛSõoÚ?TÞÆ}íþM0íÛKïSÞ®ö:D×ÅÜÿô}¿.y0Oõ¯P¼ÿ[_Ú—}}…ìÛ_)}›ç‘TÌ®·)}›ýKÙ·)”½5/¶¶ô}gTšà·šîor*ØÝÏS±ÿ·ê+ýo™~_¤UXòÿXà·ÚÒþÊÄ ºOYð“4ñëVÊÞºT>#©úÅüýÕþÀzÃý%¥ö¦½õ¶/íû|Iùi{” í7äXÒ푽ú€ßúœ÷ýù|Ý/Ø#ÿû>íÛèŸ=:ßàÇL1[]í)yoÆÚll„ˆã‹üÖGó™L÷SH&_ûgêýŽÜê&þöT{KÿSðÒÆòSy%ï%ÿ¿ÕÄ÷4dtHÆ¡øÃoÿéç~û“úÏþ§?ö‡ßJ‹y~¾ÿþßýÇßš²ò?~û¯ÿíçùùë߯Ï_|þüíoPyþÃo»©Ž3ûóÇî Ä÷ó‡þ‚ ,ÈŸçÈuqŸ ÞçˆßrŸ Þçä¼½-~ßø¥M_m¼oüé_RõOÿ‚þé¯þþ·?ù?æÏøùËÿó§W–çþ…üÍmuœÑä‹¿üãÏÿ²?Ÿ=ÿëÏ_þíoÿû_váÿÚ×ÑkÈ××ãßõyßÙ­ïïç/ßS…Ÿ=þøXÁk|úþÏŸsÅÁˆyŸŸ¶ôÜç€ïó¢Ï÷{¯çÖL©ûðë9tŸ¿íûîÿÛëÿíżaxúþEÙýkßîVkëÛøw›4¤·ùGûW>."éGÑìç¿ûcorPlÿìçÖXÿŒývíÐ|¶`:JÿWxßîõuîV-Ɖ/ôóó_~þþß4}ú3ž_‡00Ì‚–}mVúËÿëóóçÿßÿþÿ?ÿïßÿõßüãÏ_ý÷¿ÿÖ)á­õÏÓ›a÷‡ÿþÇÿçïþæß,ßéõ³ˆ«5ú¸2Ÿó%¦v⊟Í Hîš:þ'ÖÔ‰óª! ýáæÑÇò ·:;³í²hÒm6(ÜÙÞ'Ôô $3Òb'îlò3¡—ÛIoA_z¿Ô²Í¨É“nuNšåDPú_ñîkò­ò¶ÁGå9ÜN†Ê«0®Ï|ÛÓ™ßë¾q¹Ь7q¿Z‹Hèýv;rõI‚´ñI·ºœ’_Û—Ûmi—Zvž/íF2TÞ„›Gèy-‚A7‹‰Ì[åz¿Ô2§›â¤[]Æû~© ÁÈÊnuåÕ×Lü³Š~ô~©e9¡6M¸Õµ[Ê/5!ÄmÂ>SøQù”÷vál7¡©÷KÞJy×8^µh"Å:¤ùNºÕ9s/Lø3–[Z›é&¢`•Ãñ·ºiú=Hƒ$ `ÂÞV4¶4H#­d¼Üh|—›×C³Ò_¥_µ§ÜŽVgâþÆÖÖ|h¤)„þÜ!ˆSn>·Œ9¾Ú­®â?ª¿Ô²C3\ãÝnCõ•ZvFf¿Ô&ͺüójï}Þn^<&NØ£í1õ) öÐüYŠŸ^na¨¥>…óuë*\ò>Œõ<áVWn"[ï/º¨¾Vƒ×û~‡yŠ/ 7'7a¨¥KõmK[ÂÑf§ç3³é¼Ø{ýáz„F·ªÆP:nÿâéñ1õ~©ÁI3ýŸ·æï–|rõ|2=/3h,µŸ™ h–™t«;tK˜•j¢5L佺 'Ýê2Ôÿ¦AvŒë%}laàV·xìhìí63U^É;ý-¿ÜŽÞñ×?l­¦ú>ò.·ÅÔû;ÛÇõü,”¯úË­§]`‡ÛáÐó’÷ä5Ú„[}Ë'vï_¦úA¼¹Þ5 ÒN¼í)·£Ák­ ·ºr›ÌövÛz^ò>©úۭΔÁ³p¹i{ü^Ó5êDz4[CëSÇó²‡fž ·:[¤yO¤U©ùÎùºáæÚŸ6äíÚßšy#œO¸ÕÕþÍùÙ4H[®ß§ý+Œ¹©?euÒd'îºz£ÝÔ–Ú_ò¶ÔþÓ4È*ï¶'Ñÿ¤ßñ ·ºó¨}Mƒ4ÑÞ&âe´›y—¼7c6NÕ_'5>šo{ÍP“nuÎk™ ¶jߣò7ÆÿÖóÒGö~8z†Ö;¸ÕÙÖ~ äžÚÿ;kŠGëÜêâÑü ¹ù§Ê+y‡¿í)ý/–Ö¦NxT>ÜêÎ#ý4ÈCZõ„bUë-ωóÍ#ù€™©ùß j<•_úvšÚ×|ó^õýÚ­¯n=/ýo¹öó¶×Öþä*¯ôíýh?Nèf݉¨µ×Ì8éV—wýîT &7À ·:S^Ü >†‰Æ3‘U°æû.ygj¿kdí·÷ûÒÿ–i½‚[]h¿ŸH©€¸ÏÄí®ÊúÞjÿo{ n¾p«³M·± s¿á¯ö'Èþ­/q…U˜ «7áVgr{/\úÈÌ÷ýÀï÷y´Û­©ÿ¥ÿÃMðŸÌèö;áVWúÆ\§ۋõIíLý­¨”[ôsŸ'²–O¸ùÞç­ÿMõ¿7–*ª¼…þã¼4›YúåÛþ¶¥‚ŸVëÑìûÞZ¿ŽúSò6º¥Ldg¨ñýtöD­ñ³T~É{=ï÷¥ÿ †Ùšˆ·Uãñ¶7ÆÃT ;ΕW§· ýþ A·qŸÝaŽðéó$å ¤®ü^笇t«;û-¯®Á]ë+Ýê’fþ ç¬³1Ôy‹¿wÛVožÆXÿÊߘÿ[õ·¼ä×4HSÌ ·:ƒÚCŒk‰#Ünþ [5éVWþ AºÖ¯‰œ ›´îI·:c(ò‰xgKa &Ýêvª½ A:óæ4ÆyûèyÉÛR¿hÛÔþ¥ÜW¡÷'ªìûnзqŸvþLø;ÔøYª¿Ã*õ§Ò?ù{ƒ¤ÁOøtvž!œ(OÏÃla\;ßòJÞÇ©/N$jð|û«“z°mặÔümþGµ÷¶¯“6îàƒÔµ¿‡[ÝY<߀ÏYöθՅÎ'ˆÖ)Þô\al/Înß.ýÏŽÖ3¤m8:?Ó­ÎîúÄ ¶4àVwd_Á}ÞŠ¡õ¹ÎÖx‚[ßõ 4ÈÍ0>±Ò—¸>íÎCû h¡ó$ÝêBúøldéß\¯ÃÁe?£[ÚÏz¸Æô‰4žZ?áV—®þn…U`ûáV·ïú ¤…öSär—<àVç¡ö™KóéÒµ_µéØ x£=œÈèpLëá¾Wª¿ô¿kß¡[Ý9¯ Až%ù#­ÃÖynu¦0»½×'îÙÁ”¼o­®Î—Ü_:·ƒ)!á„[)ìNãìçÞ¡õ-Œó-÷ã¦A–þæ*¯ôíÅkû ·º²?l}_úŸRKN¸ÕÕþ»T_é[úÝìƒ)lÌ„[]µ—óë ÌS¾ÏËÞzBëI7ÜLöÀÙþÀµ.õ·²”ÙkgO¼Ò‡nÿËÞº¤O­®÷[õ7±ÿ»¾/}{1ËÌ„[]ë Sx÷sœÿ èõyÒˆKÿÛëý¾ô¿Wpœo¶ÖwÐ “4¦Â¥ÿ­­ýÄ¡ooíoŽ0OW~p«‹£õ°iu~N•_úßs´À­.I;-\ö¿Lí{ëÝ_úàhÏ£õ4Èt­=pаô~`=õ·õ¿¯þÔùÆ]ëŸÃÞšÒ7aµ¦ö¸ÕEh<‚iwÿD2¿ûÜê|ª¿ÚìÙp«ëýBå/´‡ã!ÎÖï ·:Z/AƒÜ¡õI!ΑüàV·]úL(¬‚ëûûΣòÛÞúh½ „1;ZáVç¦ñ°·2lAcëßc«¾¢컞#=Äép«Ë£ý9eÿcýÈá[õÁ­)ˆ7ôÍG8[*¯ÓÇÞóhI·Ü ·º÷ü7Iƒ´·¾Òÿ–Οt«ó%ùy†æ'‹èßSßw3Ë; Á¼ëíVý ó4ô¼ô?»úm+&}¿¡úçÍ­þ•¾½¶æo+&6d?˜ {ëæú ·:S–²ÆŸö8i®…Û¾Ít´nuÕ^è3 4È`˜°ÆÖú9îèV—‹ëÁ 2Ÿ÷û’÷Ö~B·º#ûãBÚˆk¯‚[Ý¥5Þ½?Þú˜]Ö…ô[œWh•Kd;~ÿuñéý1Uë¤NºÕ¹ô£¤Òn6F»[éÛ9Õ?Ð ìkk ¬–ìët«;²O/¤8¤]OºÕÕýÈÞ=¿Må—þtsšt«[ #Ð8šV„ýs …1ÃúG·ºÃ°J…KÿK†í˜t«S˜ÃÂ}cΰÈíË>·:ƒY¸ô¿¤[YcØ›—êoyožWhIÚû¤[]ÌW>‰þ‡êK„±Äü¢[Ë~¼@ƒ —|6Â]ãnu¡ýa¡öÁ­îèü·@ƒÌ­ñ´ùh>Á­Îž·<ƒþûè¹aýµ¯Â˜!Ú11ï7'qÉ{ë|L·º”=t!m„OO¸Õãþ¹@ƒt†™+Üúv¼ò „ñ|„ËÞºÄXHá 0éV·Mói#vj¾´âÞ÷'‹¸ì­›aä;ö§I\ò^©õ¤£Ôz‡øk&šó¤[ë~m!mÄaؾI·ºm¿ A†Öë…´¡ûf¸Õu;=ïLª[ãi#|¿õ·}›a”'.>ª=·>ç}ºÞ„U¼ï·};%¸Õyj~‘Ië\Hqt_N·ºú½@ƒ|¤OÑ­.õ“¤ÒÔ.{«‘¶:éVw=±›YUÏÛ¾½ßò˜´6UžÙ×}7Ýê\çí¤3Ì]cïñqË/}{šæhïþ´gj¼™ø ¡ö”½5¶æ'ÒF„ìà 4Èmúý‘6"t ·ºÚ87ÂØÞõ i#îù—nuq´^!mD˜Ö{¤8ÒÏèV·¤ï­ ý4ïI·ºmú=7ø ²7¬ };ôûÀ­.¦ÆãF[†y)\òέõnuïúƒ´ûŽ?¸ÕÝ2 ;ì ®ò¨ÿq?ݲo_°ÿõ·ù$:/ЭîÚgÖ†¾’_»Õ½ç°·ã<´ú¢Êž»_µ[]É//ίû”…´±´´aÛÖV‘6bË^B·º˜o}¥ÄÕ:m„¥ù×þu÷¨½|+Óó²·žù–_úöy¤¯èö–ï c¹…ÆŸúWúßÑ}Üêl=o{Zÿû’Gâ¼éj_É[nçs9ô?†Åk|ÀØÄö®÷û6ÓÐL¸ÕÕýwª¼‰ýëý²ooñ àVW÷ù8 ¾q·‡ê7œ·ŽÞ7ÜïÜú;¬êÔï·º8Z¯ö¿ÐøGÚˆ¼û%Üêœnš…;Œ­ë÷CÚˆˆ÷yÛ·CòCÚˆu÷;¸ÕÅÃóçr„U ýÞ.û6ç9³tûkìmÿåúŽ´÷¾šnu.>ËBÚˆ4­‡p«K'Vè¾Ýô¼ì­S|1¸ÕÙú}:~‰Í»ž"mľúÜêR|…´qÞöl„1Þ­lo¤Èù~ïäÓ©|Þ·»Þ/ýoïWÆVüŸ…´G÷ t«{õï€þ'~×BÚˆ­ûºÕ-ÙÛVOìâÅÅXï—¼ýÑ~´~x°6â輺÷í²Ç®¾Ø,ûÐÅÆûô) {óRýÍoÍG¸Õ…ì! i#ÖvÂÐSëå·:xŸSÿãz·:—=p%ô¿¯ö4¿a¿òHØw•Ÿû ÞûôgºÕ¹qÿ7¤¸ú&Ýê¶ø¨ö€ßÀ°¾…KÿK†•™t«»üë‹æ_]lÐ?a蘿~«Â:LºÕÝûP#¿Õßönœ·MõŒÿ­÷Ëþ‡h+Äà7¤ÊoyËþeH²oÀ­ÎÝ¿ƒÈZúÁÒû¥ÿ]{)ÝêBû³ßzLío~kÝWaþЭîòQ üÖM·âI·ºdX‹Âúë¿õ®Wt«sºá5Þ-ï¡ú[ÿ“ýnu[ãß6ÂuŸjH&yß*~„!mD8õKºÕ¥ø ~«Ë~`Ci ŽúWò†w pß·k?°ûö£ñ ·º [rcœ7ùû­îò!mÂíhk¼€ßtCšt«Ûú~둽Â6bow¸Õ™ô,tÆûâöª|ƒþ?ô¼Ã˜ w¸Õy¼ío·#Ù¯ üÖÅ0nu¦´&Oÿ>ÚßòfÞÆ8o¿Ïqþ»õÖÛ£ò÷­ú›¸ßÙú>qŸÂñ~ëy4¿áVwù~kN§ý/´>À­n‹ß`K|bè+~«ÂvLºÕÍ;þÀo:ßЭni³¥4Vì/ø­ghüí.]¿/ø­—?`ä·ÒMqÒ­ÎdŸ7ð[/¿q}ªòJqÙ§üÖÐï·º”>h}pêó©ÊKØ(ºÕ¥Ú~k,Éi#ÞùŠ´'¿žcüÃþ·ºj?åep;¿Ñ úö£öÀ­.îz~ëŸÀ6"V~Ò­.Ï{†´ùÐþC·ºxÞö¬Çà·NÝïÓ­.÷[¿õaØ“Â0î®ïƒûÊîjË[üFk"cŸÏQÒF˜ôCÚˆw½kâBÎO¤X:ÏÒFl×zƒ´G|lkÅ«Î÷8_Zó[û°oëþÒÀo=ù>7Ø›=ßàwÜú6×[µ§ø$ »5qÑ]ëîß즸åQßN}Oý/ô~@ß õ¿ì&>“!mD2lCcüþyŸcýçúI~ëCû‡5‘°õyáÒÿÎÖþÝ­ýI&ñÄú¿.Þ_| ëxjµ~„êk~ƒÎ»~kè¾Ã:mDéëê3ò›…Éo}¿qþYúž|â©ö´¼§Æ/ø­¾5ßÀo †õjì°—¨üN!ÿ CÚˆËgEG®Ûnãû(ɯä}RãüV×ý‘ߪûN éÛ,üÖ<¿Há©öµ!óµïø­©ûV(õû­û<{ýZúÞÆ„ã1`ßÖ}·5¿µï›/>_þ2âÃ>jÍo-ûDª?'¿üÓìò[9¿Ào}× ¤HÛÔU^â~cª½ÅoxLò¿Õïùi#üêg½ÐôýƒÞ¸oJ½?üëú>áOµõ~û“I_Ýð M7ø­G|‹´G|žýà¾aIcÿÇøßHáLëÜØ;L°«¾Åû†)Œó}ª¼ÖÿÄÿÚHa ãÖëñÐóÍû-Õ×öm—ÝüÖÚ¯¶úG}ãù“꾿ïFڈðaoYz?°ÞÞòKÿ; 3V¸åmŸ¸ˆ¯ïq>ÝHáL‹Ü˜|ÂC­˜–=åÑó’·3 Jcø7áü·'üÉÄoÙMœ®4SCÏKÿ› S5÷‚¼å?½îä¶›ßZ|öçbþþú¾Ó†=¼ŸÚÍo­öaÿÙ òýþà·ºümÄ®È^ào?ZoÀoÝ÷÷Z’w\ ~ÇCó[‹çÂÍ'fØÉÆÔÿU>ý÷–ÚÓò–þ²›ßÚXïÇ/¿ó[Íä?¸ÁoU˜ÅÆà“@ŸÚ¦´aÐ'p‘Uò_zÞòïû¥oOÙÓ¶ÁOöÍmðobؔƘÿ”W_ä½þw &¿|ê ~ë‘¿ÕFÚßÚÀoâÃl¤8S㵉7µß¦¾?ö½_˜ôí©ö;î›^ ýgëýÀ}ÚPùóÖNøÓl}ŸØÿýbØÛ í-}›ãy‹ß0ô|ÀÞâÃ_–ëø­—?€x3íÏ}1ì›”/ø­Á0Uá¿7ôܰþq}¿õ‘ñnÇ´N«©çuß¾ì-ÿà~ÿÑóæ“„öÿÞlÞùÐi#¾Öëæ·öýžúWöÖ£óáîø6÷ÛþD@Tû’ö]Ξ”ø­[÷»ÓFÔüä~~ëïû÷{°·î¾8i¤†?ÝÐ÷ þy1ü7Øð[·küÈ[þY Jµ¿k·¾-ÿ¶ÝŽrµ~má²ÿ™âElò[Ňßí/iKþÓüV“?ˆVµþºÚÛüÖÔz ~ëÑýýîø™¦Iíïûvù+lò[—ÆO§è4‚S÷”_ÇÓ®òLß¿ÁLë ø­×^²ñ2t_¶ÁoÝw¼€ßjñ–·àOjOó‰ïzâ·î?¶CÞÖ“æ·V¶êk~ÃxŸ¿u‰/ÇÈÒ§8žû¢¶ùµ÷y~݇l—½5.ö¶=j_Ù[÷Ñ~€´[ü– ~ë#¾Ò&¿UþŽi#à Üñ¶ô3ð[×ݯoÚî‡HqŽô¤Hñùvˆß°ô}ó[íqi#Rþ_;¤oo½_úößtÃ_Òt¾£ò{¿²‘6bOžq1Ò|DÕçû{½GÚgš¸Âeÿ[ò7Ùà·ñ›wûK¾ö³ ~kÏKi#öÕÀoÝw¼€ßê²oÁѹôù­ïÛþÇ0Ï…'ø¤®ï'ýWõ~§Mõi#Rüœ°·*^Ä&¿õÊ i#R÷á;‘6Vö&½ÚÞ{ˆî·î÷÷›Så7Ÿäž_6Ÿ7ŸXñ6ÒF˜øT;ao•ÿÊFÚˆó%DZ`ÈŽÅ-?>_öꃴÎ0’q¿‰õ DÔ¶Wª<ú“¹¾oû¶ø¶0\õýÅöæWMÕO{+ìi#L|lü5^°?|âÁùpØÿ´ŸœGic—Úsà¿5TžÓÞ®ö“ߺտ€¿ø­¿ì­‡aÉã¼}ô<ùû«¼²o»ôñƒ´!~ÙðoÒù Ž~íÏ3„1ß¶žOÜoá¼"ló+ïsè?&¼ðûßòî7ØÞø â×ð[Ó©ßž>1Ój6¿×Ô¾æ“<œgÈŸ ÷i#B÷9g€O"þñ¿5eÿ;}ÑQû;Ö‡ƒ´©ûÂ~ë–}à m„ÒJ7†¼ao9à·æ£þMÉ›ò¿5æfXÁ žð_ <.¿ÕUÞD¼ŽøKºø®P”;m±Ê3øo¤ê3ÿº/1³ã©¾x9!Ü|â;ÞÉo·þA¬¿§ û¯ǙзSóüÖ-þõ¿5äß„x“îbøï‡êKøR>ð— ­ŸÑö¾‡¸ùÄÒοaëûö';*i#–î‡Ï‚?™Î7¸l{nGóLõõ}»ìõi#î}ä¿õ<ïóæ7œ·¼ƒõ/Õ>Ý·aüþ&\ç×~‹^¯TíÛž—þwψØþ›ã~ö¯Ómûߤ0Î\ß6âl­/ä·2LwcŒþ>ð— Å£9à·¦Îi#rê÷ ¿Uç›~ëYúý6âèüvLñÒ†ÊÛð§[jÛ·u>8à·>ºÿ:HqBë1ø­©óé¿õÈ¿ Ž–Aí_Ö¤ÈñÖŸãËŸá mDÈþv6âúÓ@pÍ>ÂÙó‹û)ÒFœÔ|¿5îx¿5\ò¥¿¤ô­Ó†›KëÙ–¼Mí1ò;C÷MÚg8ß^¼ñû›ÚÇø ·¾ƒøl©ç¥ÿ¹üÒFùð[S|˜~kˆv6"ï~O~k¾òLüþ·}Í'Qü~ëX±øTp<¯ýœú ÒFøz1õ?ê­8v¼á~ÿQïÛô=ù Kõ‘ßpË ì··­oßýüV“?ÇAÚˆ%¾þ¿ÕåŸr3VüÖƒ´&¾ê¿5ïx#¿UñšÒFä’¾ ~«õi#`v^ðoŒ‹½ã¹°á~óÑ÷ÆøMÂ¥ooñÒFlñŸ@Üïó«Ê;°·=jïA<¡¡þ;ü‰Bý%ŸøÖ8ÿQ_ ¿UñNˆO²T>ãwµ'/’ßÃ_ò‘=ò¤ô?ê—Hqé€ßzBû7ù­²×¤Èç}¢=”/ÒFø|Ëo>Iê¼~k,­¯HqùGüÖ%þÄ¿5Å7=H±åOvÀo=.ù‚ßê÷üÉ¥ûò~k~½œoz°õ7¡oÜþ§}ño@tj†.ÏÉoÕøt¤ˆC}ÇÁo]j¿#m„‰Ïîˆßúˆ?ïà·žõ…1ß0~üÖô¡ÿlaúo>±â#8ÒFÅÇCàš¾OÕû­oŸ·¾ƒóßçÙëäåà·ÞóŠ?—O¢úóúº#m„ëþÝÁoMùÃ;ø­[ñ `Ø®x’”â·šâÃ9ø­®øk>ŸN|¿5BíAÚˆXïûúýÖó{Û¹úfêý…x±˜ïÞüÖ:OÞòÍ¿ôG°ÿ)ž‡ñIRï—¼—ìé~ëÑ} ˆ½ßé{·/}Ž8_U˜ñ2¶Úà·Üö&ùôzž¼O†¼&ôm¦¡il¸ÿ½ú¯ ÄçÅþéHá²Ïb#¨û¬_pt{ùMNIãzçH‘ò‡r¤HÝ·9â·>Šï†ÀB­¯ª¼ "øK8ù­â[:ÒF¸ü_¡ø5Wå9ö?SûþË·~ß&ÕßÖ·Åp¤í¯>/ ú›ƒßz¤:ÒF¼ó}I߆~åH‘W¾ˆßû ƒß;õþD}/†þÃñ ~«ËÿÏ×õß;ÄöÍ7ðy‹Ÿäð—œòŸqð[×ý½‘6"u?Œ@_ë ø­. GÚW¼U8R÷~«òšO¢øS8H¿ñ&}Aß^ZÏì­LÃÕ÷í¿}[û!^>'ˆNÍ÷ÔóÖÿ˜f²1ø´ÞŸˆßÄõ i#Lñ£üÖ_ÃÁo½öCGÚˆÿÅ ÷í²/9ø­7¾‘Ã_òÆOôËo}Ô¾ƒõÏUù [ï;ü‰ù{ø Šê&>q¨¾€?¥«ü@|Fè«n²·É«õí©ýüÖÐý¢÷@ëßëo¿5îü¿õˆïíèÞi5B8z|˜Ê[ô_¹ñ{–°!^òVûÚÞªûp¿Õî|¿5™æ³1Ï·jÏŸ±ü%ý(žçþ}×ò[—Æø­qõ‹ƒø Š?âà·æÐø¿5e?wøKîùÖgˆ_*|bèN~ë]ôm?½ó­¥ø·~ëÂÉoýzîð'à~~ëO…½Ïgª¯ì.¾ “ߪxå~/òvéëbïõû‡ƒO¼5ÞÈo•=£‘=ðÑó ýç\L>Êëø òÏtð[Mþù~ëÖ}ôyL¸õ?ùÆï„ì_8O¸#^®ü5ÝÁ'¹¿Oó[+þ ×g‡½õhj"dÝoºÞïûöxåÕüñ¯þ’!~‡·¡¡ËÃû{+Óú6†½•úø­©xv…aoã~~ëÑý¹ä}çsà>AñºüÖ->_a¦© bCŽ¿ŸXöD8B¾÷M~«Íð[qM@l½ÿÞþ5ŸXü ïÀ ¯?šƒßz†~oð[·âÏyà|óHÿ ÅK{T^ëÛºïñÐù†úqŸLñ þÅñ@~ëÖïK~ëÝ_ú¶ø<Îø­÷|ÔüV{îúKIÅëðŸXü OÅË¥>~kí—à·ºü™=!oÙçüÖ#ÿVèó«ÚËxi[ï·¾m¼ßó„¾-¾´ƒß:Äopð[ï}«'äý¼åõ}»âËø­®øÃñ€O,~{€ßêò§ˆöVÙ+‚þ’ºOŠæ·vü¥f¼ˆEL²yñþòo äº/Œùÿ1dˆŸˆƒFëWGØá®ï›ßÜñ[-Þòñ²]ýëxiòQ©ã©ÿeÓûÍ'‘¿_€ßzçcôÁ´âÕá>*¿u*¾ _쮇p¨xtз¢ζdŽ6ôW|8ŒÏèƒsóAU~ñ[§î[b€O"~aßú¼õâÅ•/>É#\|Å[ ð[ø=1$ï[þ¿e©?%ï­óO€ßj²ïø­‡iÄ“ß3ˆÉo]ª¿ôm7×};ßþ$ø8(VåÃþà·Žäþä·Ê7&âÓÝñ~ëOà·nùcE+šµÿÜòú¿/F’)¬g| [ñmüV“ý£¦´¹…7âå-=/{ë^o{JÞ.~|€ßzçLÅ'6=wăÇzä·ê>6äÈßĆâÏNÕ—ˆ—š*Ÿòæü¿uË~à·šîÇ¡Øõ}ÿ‰õõÀzùX~ëbš¿Æñ=ßøÛíÝH•TϧÊg¼\öwá|s×;ð[§îk`è¯ñ¾Ô~æ§À~à·šøj±ŸXöè¿õˆÏ—ß*?/òQýþŸ‹Ñì'~ëÒýO,å§€þ†øtò'ð[âG…]>±Þ/yoùëø­Û¿°}åÛð[MúM€ßº”O"L|âÐóâ7\ÿú@>Ðz7⡽_|b“¿R¼ù@ô~Ë[çéhC»!{(pË[þ Š™ÒØÄo9#>ç•OÙ[¯=(Äd/ äÙ²¯Ä†ÿžôÅ@>¸=ùÅwð[·âáÅ›DïŸØ0d‹È·âèñÉù†| Kþ-Áø­þ¾_üV—ý2dÊß>Àoݲ'ø­[ñžù@îy%Àoõý¶¿ä}ãmø­&¾g€ß:Ž~Oä¹üÀ¿u‹OÌ’šð—ô¡õ üÖ›¿$d)~P\~kSßæþ| üOãÜü*oá~çå8²os¿=Ðÿn{‘$Ï)ŽâwM•·q¿7õýAšÎ©ïóéýÖÿüíOóBûíA<ñãÀ¾Í4Ñ‘‘ã¯ù­}ÞÐ÷ ÿ]Î'Ç}û]oúŸâñE_ô·?Ü!à÷Q¾È²åð—ô;?›ßÚi¹U_É{é>0þM²‡ßø]ŸX|v[ ]3Ü}Ÿñ o{:%£îÃù@¶ì‹~«ë¼ÿ½»Þ!HŽ·¿ÌOqTÀŸò¨~ÆoXê_‘¿7Òt>¦þ€ßêÊŸà·.Ùcù@Lñ\üÖ-ÿå¿5®þÉÿ_ÿ„@>_ ÈoÕy†¾¶÷éý’÷{^¿Õ?.ÀoxÛhßUûòe•Çx¹Sõ;î›oKÿ›ò‡ äqÅ3ŽËo]ê_Ù·Mñ©#`ßV~…HÝ·s?Nùïá|ô—T|¯¿u›æò,ñüÖ-~]€ßjâ³G"^ZJ_¿õ=o¤â7”ð—4ÅJð[]ü¦|do}ô~Ùÿ"ßúâ%¹Þ_oø}üÖ> bÎ{_—Ìbï÷öŸÐóxQ·}eÿÛƒö_Žíñ:ˆ•Níu¬ÿ[Ïñb†ž—}´FâDüÕ'{«¾ÏøŠ÷’ä·Ê¢T¯ƒx`>â<‘ñd¯Ì>‰Î ~ë–¿Sط埅Ď/¿%ÛðúßæŸä–gô§TyöÝ[ÿ†}÷¾¿á¿ùš|bñ¿s€O¬õ&Ûpµîy2‡øÄSí-{ë”~•ä·®·?‘_|à$¿ÕxÞJð[CþΉ| GçÍ¿5àÝoüÖ©ó6²µeOä¹ùÆüVЀô »ù·Õgà·aȉx¹ºïHð[¯¿U‚ß:ï!'ìÛÎý!Áoµû{‚ßzÎÛýÖçð§˜zÎxKí£ýï¶'Ÿ¯ûÅD>T¾†ìܪðRü.ìß¹”ŽýYÊ—{~Þ| œ/à·†é÷¿õÆïLæZšßÚû³ê_ˆlúÞczé}ÆË5áMÿ5Õ¿¿óO&ø­¹ßöÎ7½à¿?ÔG¼¤Ôóæ7(ßÏ|ÍOä9:/%òL—üÖùPIäYw<Üø­8/%ø­Kù—ù@üŽ/ƒ¾}×;ð[÷/&> Çù­ºMä ñù’ñ[u^Jð[ýþ^Ì¢ûÂ4ð‰•5 ñrímåÍþ’ߺ©?$òw“ñ[uŸšà·šîOù@®==ÁoÝâƒ&ø­×,á/¹t_à·^û~"H(Y‚ߺÄ_Í 2Å'ÊüËò7A¢£ö÷›ÂˆKùmä§P|Šl~«ùcæV>8®¿öVùÿ"ÑØë?‹D_IýÙˆÉñ³‘M\ñ…r#^†ò‡%ø­¡ø± Jôý´¾¯ûöœšà·ž­õgCß–ý%¿õyßÏóu–Gñ f_äØÔ}tÅo |øÛºOð[o>Š<Èw÷#ð[]ñCüV˜Áˆ/’ëø­!ÿû<ð'“ýŽhÍ7T{©ÿ-Õÿ ¿!Áo=Fûu‚ߺÇ[_çßS<ù¿5®¾| ò-ç¾}ÞöîwRòJøÌ‹Áo¦|\|b»ö}îoà·ºøùéÊOý:ñéÄGJð[oþEÞþ/üO෺♤ã|óÕ¾æ?où†ñö¨¼’÷”ÿZ¶!w!í ð™_÷Á‰ø­{h¼ßúÈŸ‰|ÖVþÆ¿ÕO-ÉoU< tă?$ÁoÝâgg;F¬%>V‚ßꊑà·nå›HäÉÃû”¿õ(`‚ßúêxâo%ø­©ûÒD>Ï>á/âÏ"QË›2‘Ä)Áou{Û³Áo¢¾| 7?B‚ßzä/‘Ì’Z_à/¹¯>~«Wmo]’?ø­×ÿ6ÁouÝw&òñm¨±ô-¶·ù­%Ïs1ï·ñßúò„îŸHæ/ŽÀ_6¿=ñÒt_à·Æ‘þJ~«âÍ&ý%eßJð[=ßò7ÆÛ£ölò»Mó©}‡ëÍ#Œø¥·üÖÿtß‹@Æ}žÓ÷Œ'°Õ¾àù^Ï¿+UŸþÜç¸ßíù»ð[5?#Pï…ÀÛ×_§1úßý+Ôð[ƒñá OÜïç>o|…õLù“¥ ÓãüVßÈKò`üÖ¯ï÷üµýñéï÷|êy1ì­SåQßÕ/>±Ê£¼·pÀžþ¨ý'T~b¿zžçõG^ÏR|bŽWä9ä5†ÿ®âÁüD.ì­ïr<-ðBëÅR¼ŒP} þ]#…aoâï| Îx ‰Û^¢öÑÏU~Ÿo¦Æ÷‚¾ÍûÔÂí¿ço}ùYLå1~Ãm/ã¥ñ÷YÐÿüm_ ^¨Ió¦«üD>Ð-ù%ì;åßúÜõÁ/w aøoîI<à¿ÌõÂä¿Çõù@|i¼›ô¿g/ŒÿP} ü~þþà·"L 1ìûûbú©~æ'»íßÈ÷~ûwàßqô¼ä­x@…þ=SÏ;~ÃÒü@>5ô{‘ßzÞþ•þ·Ló ù@|¼íc¼4î'öm—<á/¹M¿ø­qÇ'òÈ¿­q"ž³žOœBåOøo²=}h>ÜÆþwô}É{NÏ-ýoèûæ7„ö“ 2×|¿õá}@áó½1âsoµÏ±ÞúÅû=O/Ž¿þø/„ë?ø­>ô{ßšñ–ŸôßÁsð[å¿Ü˜þ+qçß;ÒÀoÍ»>ù“q½#¿õ¨}—ß:„×|í῾ô½á¾-T¿1^’êÛÈæz3úÓöVÓú~«â56æý–·“iüߺÈï+àw,½_÷ís½ò è›÷ý¤ýWíoýÏ$äQ¾æ…Òùzõ| ~×S×ù†õ7¿µóëû ~‡_ŒøLÜïñ»†æ?ò(~Qá²ÿ “þå7ÿ²êo~Chü5¿µùDú~#ÊíÏùÿI{›žërÛZpþþŠgíöÞú¢4éÄ@Ð :©2H2ðµ+ÝvW•W_ù÷ýˆ‹¤ÄèÂÔ¯œçisëc‰Z$Q{y{÷{Æw•˜h}ÿ{ÿKüóÍÿêã|õ@úðñ }ë²ó®bäK‹ç³üt¶~NäKkÞ Ôû™×°å°ù}+dFÀ–/£.Ç–¿'>_ê,þyÅyËöè[»Å»oÜʹTŒz¶Cß:_/ÓõÄâŸôg<Ž‘/·x{úÍé߬ÿÑ_A}¢â¿7q߸üï'οÕÛûçóeóßû¿, ì‡z C|}]È—V|Q¤Ÿ[®o˜þùÄ}Ëëý›VÐo ž…óøö }«ç{PÜŽÿJ1î·Äñ‹û½øþ+Ǿ±oÔÿ õ^ÿ~Åý®ø÷+žïû5}«å‡Ø¸!~øß7ø?Ä?ïåâ;/â%Åî«6ß!Žáßžþ¼ß4ü÷ç­Çû+ÈO=ý÷'êe„}&ü[âŸ/äK™þù‚žçÕW/þ5?çtÜ¡gŒÏq¿ƒñú¾îoí­>W1\p¿#þý‚û­á¿o÷í%0òóÛûx]ß0#~³UÇSדæíuä/ÃüzQDL_³ñÀù~xêaa=}_×?ÞÞÖÓÓ*†¾¹úól=1ÊžªÇŠçYÐ÷Uoo!?ÎS/ô­uúxD=añ犗êˬзz=fÅSõsöûзÆúþBßZ-öÆzÊù2»ÿ~C¾@ð»ñ’ÍâÍÛ}»ÿ~Ç~ûúól}kµ|tËÏú:ÞùͨÄúFì·/ô­uúø)°÷s~oëb={‹Û[çëW_þáã?¾üâ‡üõ/?~õÕ—=Kžû߯~õ÷_4—×~ùçýx>~÷åýøÛÏÿþð+Íß})EïÖÕ³V>¾û°-Ôð·_ý·¿ Âþ ”M9áøüN´ç/Ÿ¿€ôíü…ãø‹Ü³«§ñ¿üÚlñÛþŒ-~øí÷_~ñ7åãýøúß>TóÄ? Ë£ÞG5þÑwÕ?¿÷üìãë?|ùë¯õ×ÿâ×».&××ߟöý¥£ìú~Iß/Fæq¦ø´p³biÛ†ÿí/°üßÑÔïxþøþ Ñ›ÇóÀ×_hÐ;aøþ‹¦²óÀ÷_ ïç/γÜÖ:6úù1Ü»ôÒ\]tæþ³¦þ‹_F}FµõOÿ²¨—m¹þä/Û‘a¹ýô/WMcˆú“¿,šlfyðØò¹õ¹Ðha _·iŽ „ãïuaúx‡M Ý^2úÓ7ÿôñýš²õžù‚çy0iÕ%Ùà’ÝOõõï¿ûæã×ÿõÝ÷,ÿóûß}ó§ßþæÛ÷GÏBÔbÔL`x¹_ýæ»ÿö›oféÈ ¡w¦Þ!ÿú6‹¦Ã c½¯j¤^H¡Í,ÿKKº•OlîûX«¸¼„GÆû>ávn ¯Œ7+Lxf¼YaÂ#ãñî„©=¡þµ7©?›ÞxQ{+õU+n„WÆo%<3.…0µW_Â0µ×¨?ÚëÔŸ.joP„ž_¨=¡þLjoR=²7އwÂ+ã·ž—JX2®Ô^¥þ´‡0µ·YaÌ©ò¥Œ©½QS{Býz~¡çŸÔŸIÏ¿¨½•ú󒽡¼ñûn„WÆÙÞ/Ù*Ì„©½Fýi0µ×©?}f<¨½AýjO¨?“žR{“ú³èù³½¡ÂLxdü¾„;á•qi„gƕګԟFí5êOS{ú3*ajO¨?rï7ˆêKŸo/lú|e¼½‚ Ï× —%ã÷%Ü3.©?•ì æk%,·BxdÜ©½Nýé+ãÑÓó µ'ÔŸIÏ?©½õ¦ç_éùµjEÆ’ñ[Œ³½¡ÂL˜ÚK|djÕŠ„µ×¨?ý%Lí êÏ öõGèù…Ú›ÔŸIÏ¿¨½EýÉöîdoT­¸q¶·^×'\^Â=ãún„©½FýiÔ^§þ$þ‡¨¾Œ©?ƒž_¨=¡þLjoR=¶÷ÈüoŽÌÿÕ—pâˆêK8ñ¿92ÿ³¨¾„©?ueܨ½FýéÔ^§þ$þgQ}7êÐó µ7©?“Ú[ÔŸÌÿ„ì-Äÿ„øŸ½…øŸ½…ì-Äÿ„ì-Äÿ„øªVœõQˆÿ Ù[ÈÞBüOÈÞz}”~Oèù'=ÿ¤ç_ôüÙÞ“øß${« ój_åßÏŒK%,×—ðȸQ{­^wj¯SF!Lí õG¨½Iý™ôü“Ú[ÔŸ•ž_£ú2g{/â#êîI8Û*Ì×B˜ÚkÔŸFí5j¯7ÂÔÞ þ z~¡ö„ú“ùß"¾½ˆo/â۪„á•q©„©½ZS{úÓ:á‹oiùFxf|û·KÆ·¿UñÈøæVŽ'cêÏÍÿ¢ú.Üÿ³ò0 ¿/áNxe\á™q¥ö*õ§Q{ÙÞ=ñ¿†¨¾ŒWÆ£–Œ¥OjoR&µ·¨?+ÿ‘Î7Š%ã÷%Ü3.áF8½¡Qf KÆ­ù÷:µ×©?ÙÞƒøÈHüOËÓó =ÿ¤çŸÔÞ¢þ,j/ó!þ'do!þ'Äÿ„ì-Äÿ$ñí3â’ø¶bêOæBöâBö²·ÿ²·ÿâBöâBöždïIüo’½'ñ¿Iüo’½'ñ¿IöždïIüo’½'ñ¿Iüo’½'ñ¿Iüo’½'ñ¿IöžÄÿ&ñ¿Iö^Äÿñ¿Eö^ÄÿÙ{YÄÿÙ{ÿËúÖfQ} S:µ×©?™ÿ-²÷"þ·ˆÿ-²÷"þ·ÈÞ‹ìõ­Í¢úî„WÆÉÞoÖ·j9„B˜ÚKüÏ¢únܨ?‰ÿYTß;õ'ÙÛ¢ú¦þµ'Ô¡çŸÔÞ¤þ,zþlï¬omˆêK8ñ¿7ë[¢úNüïÍúÖfQ} Sµ×¨?‰o[T_ÂÔŸÄ·Õ—°P„Ú›ÔŸIÏ?©½EýI|Q}Œ³½ Ù;ë[¢ú2ž'¾¨¾„õ'Û»½³¾µ!ª/áAýôüBí õgÒóOjoRµ—øß[3ÿ{+Ù»fþ‡rš¯Œÿ{+Ù;ë[KÆÚkÔŸÄÿÞJö®™ÿ½•ì]3y³¾U1µ7©?“žR{‹ú“íõ­Š%ãlï¬oÝ8ñ¿·‘½³¾ÕÒ5dLí%þ÷6²wÖ·*î„©½AýôüBí õgR{“ú³èùµ—øßÛÉÞìõ­Vž2áÄÿÞ¬oULí%þ÷f}ëÆÚkÔŸNíuêOâo'{g}«¦×£çjoR&µ·¨?‹ž?Û;ë[ÏŒ³½³¾UÓ•¼„GƉÿmLíUêOâï {g}«bjoP{‰ÿ½ƒìõ­Šéù'µ7©?‹ž?Û[ˆÿ Ù[ˆÿ ñ?!{ ñ?!{ Ù[ˆÿ Ù[ˆÿ ñ?!{ ñ?!þ'do!þ'do!þ'Äÿ„ì-Äÿ„øß${Oâ“ì=‰Lâ“ì=‰ÿMâ“ì=‰ÿM²÷$>2‰ÿM²÷$þ7‰ÿM²÷$þ7ÉÞ“ì=‰ÿM²÷$þ·ˆÿ-²÷"þ·Èދ콈ÿ­¤'Þ8ùÿÞ¬oÝøÖ+î„WÆ·žXñÌxP{ƒú“ü­ïJzbMwMýIþÖw%=±¦¿¤þ$ky²¿µ<ÙßZž¤'VÜ ¯Œo=±â™q¥ö*õ'ù[Qž,áNýIþíòd{—'é‰S{BýzþIíMêϤç_ÔÞJýyÉÞ/ÙûÍþíò’½Ußšq#Lí%kyÉÞ/ÙU+nÜ©½Nýé+ãAí êÐó µ7©?“Ú[ÔŸEÏŸí]PEëÆ’q¶·ê[Îö.¨Zvã•q¥ö*õ'ñ¿’ã%5=ûK¸gœøHÉúVÅ3ãÄÿJÖ·n<©½IýYÔÞ¢þ$þWjæÛ%ë[7Nü¯ÔÌ·KÖ·*î„©½ÄÿJÍ|»d}«âôþ«W‰;xd<ÂðÊX*á™ñ,„©½EýYpj/ë[ÏŒßJX2./á‘q}S{•úÓ¨½Fýé…0µ7¨?£¦ö„ú#ÔÞ¤þLzþEí­ÔŸ¬oUܯŒ³½³¾uãRS{õ%Ü S{úÓ¨½NíuÉxP{ƒú“ø_é™o—¬oÝ8ñ¿’ã%7Nü¯ôÌ·KÖ·*î„WƉÿ•¬oÝ8ñí’õ­Wj¯Rß.#óí’õ­'¾]r¼äƃú3¨=¡þ=¿P{“ú3éùµ—øv²wÖ·nœøv²wÖ·j¹ÜJ˜ÚKþÖ"dï¬oUÜ S{ú“ü­EÈÞYßjåV3¦ö&=ÿ¤ö&õgÑóg{Ïìo-“ì=ÉÞ3û[7^'ÿ_ÉúÖ+µW©?ÙÞ“ìõ­Š©½NýIþÖ2ÉÞYߪ˜žR{“ú3©½EýIþÖ²ÈÞYߺqò·–EöÎúVÅðÊ8ù[Ë"{/â‹øß"{/â‹ì½ˆÿ-â‹ì½ˆÿ-â‹ì½ˆÿ-²wŽ—Üéâÿ«O¶w%}k%}k}²½+é[ë“í]s¼¤bêO£öõ'ñíúd{WÒ·VÒ·Ö/¹±P„Ú›ÔŸIÏ¿¨½EýI|»¾doÒ·¢œxÆ’qâÛõ%{“¾µ’¾µ¾doÒ·Ö—ìMúÖJúV”̘ú3èù…ÚêϤö&õgÑóg{“¾µ’¾é˜NþÖZÈÞ…ìMúÖZÈÞ¤o­¤o­…ìMúÖZÈÞ…ìMúÖZÈÞ¤o­¤o­…ìMúÖZÈÞ…ìMúÖZÉÞ¤o­¤o­•ìMúÖJúÖZÉÞ¤o­•ìMúÖJúÖZÉÞ¤o­¤o­•ìMúÖZÉÞ¤o­¤oE¹¼Œ©?‹ž?Û›ô­µ‘½IßZIßZÙ›ô­•ô­µ‘½IßZÙ›ô­µeþWÙ»eþW[浑½[浑½Ù»eþWÙ»eþ‡rîdïžù_ídïNöî™ÿÕNöî™ÿÕžù_ídïžù_%}kídoÒ·ÖNö&}k%}+²¤fLý™ôü“Ú›ÔŸEíe>BúÖ:ÈÞ¤o­¤o­ƒìMúÖ:ÈÞƒøÈÈü¯²7é[+é[ë {“¾µ²7é[+é[Qþ!áIý™ôü“Ú[ÔŸlo!{“¾µ Ù›ô­•ô­UÈÞ¤o­Bö²7é[«½IßZIßZ…ìMúÖJúÖ*doÒ·V!{“¾µ’¾µ Ù›ô­•ô­u’½'ñ¿Iö&}k%}kdoÒ·VÒ·ÖIö&}kdoÒ·VÒ·ÖIö&}k%}kdoÒ·ÖIö&}k%}kdoÒ·VÒ·ÖEö&}k]dïEö&}k]doÒ·VÒ·ÖEö&}k]dïEö&}k]doÒ·VÒ·ÖEö&}k%}kÍñ’­‘¾µ=ÙÞô­ô­íÉön¤om¤om/ÙHßÚžlïFúÖFúÖöd{7Ò·6Ò·¶'Û»‘¾µ=ÙÞô­ô­íÉön¤om¤om/Ù›ô­í%{“¾µ‘¾µ½doÒ·6Ò·¢ÜPÂúÓ¨½Fí%þ×^²7é[é[ÛKö&}k{ÉÞ/ÙHßÚ^²7é[é[[!{“¾µ‘¾µQ¼d#}k+doÒ·6Ò·¶Bö&}k#}k£xÉFúÖVÈÞ%ß·7Ò·¶Bö&}k#}k£xÉFúÖÓó“¾µ‘¾õg{“¾µ‘¾õg{“¾õWj¯RÿÛ˜ÚëÔŸÄÿZ%{“¾µÕÌ·ÅK6Ò·~âIíMêϤç_Ô^â­‘½)^²‘¾µ5²7é[é[7¦öÿk¤om/ÙHßú‰;µ×©?‰ÿ}âAí êÐó µ7©?“Ú[ÔŸEÏŸíMúÖFúÖÖÉÞ¤omìMúÖFúÖÖÉÞ¤om¤oݘÚëÔŸNí êOâS{BýzþIíMêÏ¢öµ—ø_doÒ·6Ò·n<2NüoãN˜ÚKüocj¯QÿÛ婽NýÉö¦xÉFúÖ6ÈÞ¤om¤oݘÚ[ÔŸEÏŸíMúÖgÆ™ÿ‘¾µ Ù›ô­ô­â%é[Q>+cêOæBö&}k#}ëÆÔžP„Ú›ÔŸIÏ¿¨½ÌÿHßÚ&Ù›ô­»¼t%,gþ7ÉÞ¤om¤omZäâ 3ëÚÌú†6³¾¡Í¬oh3ëZÎßÚPN2cjO¨?IOÒfÖ“´™ò¥)Níåü­Š;á•ñÛÏŒ“ž¤‘¾å+3¦þ$}k[doÒ·6Ò·¢|pƒú3¨=¡þ=¿P{“ú3éùµ—ô­ýÉöî¤oí¤oíO¶w'}k'}k²½;é[û“íÝŸlïNúÖžëlÜ©?IßÚŸlïNúÖþd{÷'Û»“¾µ?ÙÞô­ô­ý!{“¾µ“¾µ¿doÒ·ö—ìMúÖNúÖþ’½IßÚIßÚ_²7é[ûKö&}k'}kÉÞ¤oí¤oí/Ù›ô­ý%{“¾µ“¾µ²7é[;é[{!{“¾µ²7é[;é[{!{—œ¿¡—¬'î…ì]²ž¸²w!{—¬'î…ì­úÖ„'=ÿ¤öõgÑóg{׬'î•ì­úÖŒGÆÙÞ5ë‰{%{W²wÍzâ^ÉÞ¤oí¤oí•ìMúÖNúÖ^ÉÞ¤oí•ìMúÖNúÖ^ÉÞ¤oí¤oíìMúÖÞÈÞ¤oí-ó¿žëlœø_Ïõ@ÏŒÿë¹ÈƉÿõ–ù_Ïõ@Sÿ빈bêϤö&µ·èùßî=ó¿Þ3ÿë¹ÈƉÿõ\dãlïžù_ïdUñʸQ{ú“íMñ’½g¾Ý;Ù›ô­ô­½“½IßÚIßÚ)^²“¾µ²7é[;é[û {“¾µ“¾µS¼ä'N|{cj¯Q’¿µ²7é[;é[û {“¾µ²7é[;é[û {“¾µ“¾µ²7é[»½)^²“¾µ Ù›ô­ô­]ÈÞ¤oíBö¦xÉNúÖ.doÒ·vÒ·v!{“¾µ“¾µS¼d'}k²7é[;é[û${“¾õ'ëÆðÊ8Û›ô­ô­}’½IßÚIßÚ)^²“¾µO²7é[;é[û${“¾µ“¾µO²7é[û${“¾µ“¾µ/²7é[;é[û"{“¾åÅ®Ô^ò·öEö&}k'}k_doÒ·öEö^doÒ·öEö&}k'}k_doÒ·vÒ·Ž\D±dœì=Hß:Hß:r=Å+ãäo¹ÈÆúÓ¨½NýIþÖ‘ël<¨?ƒž_¨=¡þLjoR=ÿ¢ö’ÿo¾u¼doÒ·Ž—ìMúÖAúÖñ’½Iß:Hß:^²7é[ÇKö~ÉÞ¤o/Ù›ô­ƒô­ã%{“¾u¼dï—ìMúÖñ’½Iß:Hß: Ù›ô­ƒô­£½Iß: Ù›ô­ƒô­£½Iß:Hß:(^r¾u²7é[é[G!{“¾u¾uP¼ä }ë¨dïšý£æx²QóùfÔìÿ5Ç“šã÷FÍñdCë$œü£fë¨Ùß:jöÿ Ò·ŽJö&}ë¨doÒ·Ò·ŽJö&}ë }ëhdoÒ·Ž–ùßh™oÒ·Ž–ùö }ë }ëh™oÒ·Ž–ùßh™oÒ·Ž–ùö }ë }ëhdoÒ·Ò·ŽFö&}ëhdoÒ·Ò·ŽNö&}ë }ëèdoÒ·ŽNö&}ë }ëèdoÒ·Ò·ŽNö&}ëèdoÒ·Ò·ŽNö&}ë }ëèdoÒ·ŽNö&}ë }ëdoÒ·Ò·ŽAö&}ë'®Ô^¥öÿƒìMúÖAúÖ1ÈÞ¤oƒìMñ’ƒô­c½Iß:Hß:Ù›ô­ƒô­ƒâ%é[‡½Iß:Hß:„ìMúÖAúÖAñ’ƒô­CÈÞ¤o¤oBö&}ë }ë²7é[‡½Iß:Hß:„ìMúÖAúÖOœí=‰ÿM²7é[é[Ç${“¾u¾uL²7é[Ç${S¼ä }ë˜dï™ý­ƒô­c’½Iß:&Ù›â%é[Ç"{“¾u¾u,²7é[é[ÅKÒ·ŽEö&}ë }ëXdoÒ·Ò·Š—¤o‹ø6é[é[Ç"{“¾u¾uP=!}«P=!}«¾U¨ˆ¾UHß*TDHß*TDHß*¤oª"¤oÒ· ÕÒ· ÕŠ—Ò· ÕÒ· é[…êé[…êÅK é[…êé[…ô­Bõ@„ô­BúV¡xI!}«P=!}«¾U¨ˆ¾UHß*/)¤oª"¤oÒ· ÕÒ· é[…êé[…êé[…ô­Bõ@„ô­BúV¡z BúV¡z BúV!}«P=!}«¾U¨ˆ¾U¨ˆP¼¤¾U¨ˆ¾UHß*TDHß*TD(^RHß*TDHß*¤oª"¤oÒ· ÅK é[…êé[…ô­Bõ@„ô­BúV¡xI!}«P=!}«¾U¨ˆ¾UHß*/)¤o•Fö&}«¾UÙ›ô­BúVidoÒ·J#{“¾UHß*ìMúV!}«t²7é[…êÕ‘žïÛ…êHÏ÷íÒ³¾AzÖ7HÏ÷íÒ³¾AzÖ7é[…êé[…ô­Bõ@„ô­BúV¡xI!}«P=!}«¾U¨ˆ¾UHßú‰+µW©?ÚkÔŸÄÿ„êé[…ô­Bñ’BúV¡z BúV!}«P=!}«¾U¨ˆ¾U¨ˆ¾UHß*TDHß*¤oª"¤oª"/)¤oª"¤oÒ· ÕÒ· ÕŠ—Ò· ÕÒ· é[…êì‰X KÆÙÞ¤oª"¤oÕ·&ܨ½FýÉüâ%eÿ£z Bù[eÿ£z Bù[…êÅKÊ$þGõ@„ò·Ê"þGõ@„ò· Õª"‹øÕ‘E|dÿ£z ²ˆÿQ=¡z ²ˆÿQ=YYO,¤o••õÄBúV!}«¬¬'ž¤oOÖÏ'ß'LÒ·Î'ë‰'é['é[ç“õÄ“ô­“ô­óÉ÷ “ô­óÉzâIúÖIúÖùd=ñ$}ë$}ë|²½'é[ç“ìýÕ—øø/¿øáýË_}õe£>÷¿_ýêï¿hÿùåŸÿõãùøÝ—÷ão?ÿûÃTfù»/ujJå²4òö»ÛB ûñÕû‹Àš ÿ…•M9¿áøüÜ¿p|þÒ·óŽÏ_¤ž]=¿øå×f‹ßþðglñÃo¿ÿò‹¿)ïÇ×ÿö¡ëìÿ`Ùõ>–©E4¾þîã¯úç÷žŸ}|ý‡/ýµþú_úº&N_Ú÷‡&?½¾_Ò÷k"óŸïØÃ~Sü#-?×_ N÷üðý¢JºóÀ×_X­¢ø Ã÷_4Í&zþøþ ôýüÅy–ÛZÇF??†«ÃriHñ6×çÿûÏÙú/~»ê¾]~ò·‡E|»ýÔokqG±oŸüíª¡+øöüÉß½xÖAú¿óóö¹Ühy _ Ûÿù6Þ"áø{]ž>m¬"ÂÒ57Õ;æ…þôÍÇ?}|ÿ£&nÅS½gÖè?VajhbͶԿ¶ë_þêýùÿñëÿúîû?¾ÿÛG±ÿYþåg?~6ëÑ£ õì_üê7ßýû·ßüxK7Õ*ש)¢÷üêÛßü.¾¯–±êáÛZï«©·ß©6Ì.±²¿fŽñùÙ]Ù›æöz—Jì¾S(Ÿ¿¯€ßnø¹¼¾¢‚9Àññ6Õ*üä…/ä±€M_Ýçip}B+üœøû»mü|¦¥îÇ«ªäül‰,~Ç·k5`ÿìók|Då÷/®Rï«—*€»!Õx*œ»ÍöJ•:¼C+†(üoÕ`À¡ß}ô‰Tçp¬¡2‡wªwð³sšq* «ÚPÀÏnôÇú¬‡Ýç%?ê(UX·Ùu¢öÔî6lÑ[ …m?¯:=wCª©UØ÷óê àçó>êQU¸ ‹€vÀý¼/®ð³ïoif•5¼Uo;w7t )ü4ìÔ«* Ý Uz+\%ý°ÚUuãŸPóu½¯ÎNÀ~ý°ªΰÒd]ïP* ì: ~R½÷m6$UÉPuØ)Üv½Ú­ãzù*cx‹z¯?zŠõY“tq¤†w_[CÛ®E#ãŽ=œõ" pèHå4?׃*_¸»±íÚ4I¥ÂOrWžÇ†³jÎ(Sé™dª\8SA… g‚j^®=$¾ŸÏ;ÕÛøù¼K/K?»!š Aá6ìlf •,œa¥Š…=`—µ» ;U'©ð“«œÑ­r…3BU­°'wEtÃvæ½K5ž€óšú*UØccÙ/ÑÇŸ·acõÒ<\ïR©pîçUï;`SKvûå¹t!ô^­zMA•(¼ã±=N oÕ‹Àq½}Í¿µª­eªNx!ÜÃY}´ ?‡õýÕ²W«nO0Ô®H@øÙ 6BU—p&¤¦ÝÚï¤YCŸv»Šö"Ò~v£[ST’ð–½÷ëÕ„[g±V=‹k%…Û®a*U#ìN.‡Kw,»ìÝ?yFŠJ^Y6QT‰pVIM´µßgÀO»–çµåXeûðDªBx««Ü«•ÞÝ®kЩáÅMà6¬^ì)l嚪?Ø¿ü܆լ¡êƒwŠ- *>xeÚ ÕÜZ{ Në՘׀UåÁÛ—MnM¬uæœêö§Ýzµ [õ6_áÚ»¯&¿lׂ¤9µ^„}B•¼Ï²uB7Ç36”PŸ1©‹ø ·a‡fùìºGvûî§a—^á+Ú öqUì·Ýí«Û®µÚHÑ®ù³Þ®×‚€CéÄ´GØvõW“g— Ú‚óË*-x_œ×O©°àLÍ›õÚQtÃM®b)WUÁ™úš4ëLPÕ„™õ=žZàV>?UOp&¤í³«šà¬ä*&xÁ‰÷ì­6Öìꛯ* ö khs« n»M_(ºS‹5´Þk¬/ØÕ†oOšj°}­«‚`¿Þaps+y@6ºêbMéš+öÓ®ê`‹]Å öÔ®r+ˆQØ®iÓÕcñ> ¯¨ënKj×´XF¥Ž‹;w][b™èškï‰ËþX®ÙÛ•S–G`Ø®§×‚ºt€›Õ Œß®é°Â°]÷Æ žýiµ¶k.¬àKýiµ±Ñ_Vã]aÅPéº ÅŽÙuyŒ•½«J`î2 öôé&WsaGéJ²b*t¥oíÑî&W¢yÒåzü7ö¹Ò (…۰¾Šå¸+K~EÏO ÷i ^è Öj[uW]@Ì…®ï*æBWUÀÞ2uYì* X „·kÊ«½­ã T´¥« ØD×|WÁ{·²SVW5ÀÔ˜N ûi Ìj;d×Õñ<¼ Ê3Á•»ê6•ìÖ‹M­|ìª8CPE±wÕœñª€ØñWg~P+[$»ÞÿŸ!¨ëÙrzû¿Œ›ŠÃÀÒÖÕøû4× *gÕŠœ€è†ž_zgõ‘QÁYÝ8ÚÂy»zë¿7y±Ÿú4ì™rºÛí²¬ÝOî×&oeõITA­Œ=t½î?¦ÒlVÁ¥ºö5Xh¯ ¬'N,‡gÆéM¬ó]/úãÕ+(k Ëm»:kézˆÝÝÐcTo V¾Jèl§]SXÅ¡¹kû{^`¤èÿYõ~ÿþåm×¥QN •Z¹åôr?6Û®wûqð횺*øP×›ýà ]/öƒyt½×?o[¯õÙ5kÕûLìÛ]/õϤÒ;ý O]SVOéz£ÿ¢ àRzß njå´¥7pVß}4[Up©®—ùÁÑ»Þ埩©ªâ\Üõ&?,]/òƒòtÍSu½Æ?ïW³TW¦—øÁDºÞáok´¸¹UXCoðc§îœÕÍÞÁ­ÎëLÒ; Ûl ÕËû3}õî>Ž«]SSÅѯwpVŸ8ê=;/TøÍï±,êµ}AõM@9t©ë¥ý±¤ÞÙŸi5à¸òu^o새u½°? ÒPÒÝÐëú³Æ |ÑËú³lè]}y–½#MEu^™ÞÔï}mYCÛ°± +ŸƒzM,©·ôg W>éôŽ>Xj×TqPìäêµET/èÏ+ÓüSoŸ6aõzþ¬ôz;oqr…Á¯wóg—8®Üä*Ö:GÐû,ð:1°V;¯v½•K‡Ã3_`X#“]Àz<‘²VŸ’z!æ‘æ›:ÔK¯ãÏ@ÒÛøÃy4ÙÔy¿z_Ê '_׫øóËpS»©OÖw˜™É•^Çs±ë-ü™ ê©?O4aXssu½‚?ŒhÂ#èV/àOŸ5¿ÔýSm^\z“\l˜ir©3D'<‚ËÖ ÖêkŽÞ¼oB!7­éfÍ+uÿñ&WA'Ž%lµ®³Q×;÷pUõ…ã€ÿ±Þ¸ŸÁ°àô}aÁ%x>}çµæ,¸Z}\i2©=k¬—/®ëUû!¢zÓ¾©®íg i©‚òÖ {½¯Þ²’§I¤öPYöÝM¯‚ëû™e ôêü”\‡ù¾@ÌkÛõzý,×z»ÞŠ®É£Þ²05Æ— ÍýñÀ°ÖÉ¡™£Þg`jŒ´õÅ;z¯ŽÙ¡×ê1®ÆÃÚˆš4ê]«ÊÐ;õXú†^©Ç4ðÖÿÐ õpåŒ>l[ëÆÞjÃ{<à­æ­š,*.ãIüj<ðµÚ22w]uk×xëkÏ;sCê,pú¼ÕÖØ¡I¢Îkލ˜°CSD…Wsh†¨xƒCDÅàßñ»õPˆ¡é¡bk/|‚vØ/ø•-#ão=ínÆq43T,A㿲óû†óL«¡i¡ÞÕ±ÃÍ kÝФPq/|­çí@ þ˜ñÂue‹ÌЄPç-¼jX?ð M|ch6¨óš *v«¡¹ ‚Žg«fP¸ù•q†&‚ÚVOC—Àc+MUÞ·æ(ÉÙ: œØþDšê MuÚáEéöÝͯ|w'Ï>Áó€jØ,×F0 |‚>T4õSœ†f~:SR?…ogW; Mûô¢ú% œÛ”û7ÂМOçíWø}ähƧÓn¿ò—¢ùžâØ24ÝÓy"Íö4`Ãq.†æzúìEµÕ®nõ Ÿ ±¡yžÎÐÐ4OÁzF½²ƒÈ¨ð žf·]‡–r¼®††fx V;Ôµ§¡ùâ@;4½ÓéF½²ƒ×hð úlÊ[c]l W>3tÅçãh`æúæî†ngëЬNqøj†ò¾öNx«w‡žô‚ÝK‚"Þêk›æsºŸh¶Lþ‡fs:£L_äÝ«d؆ ×ÇæœžÇ\z1ˆÙ¬yœÞ·‚\§ :ÍâdsèA(HÁè0¬‘‚ÑA¯|ÎuÖ¨ ÈAìÆCó7é«äà BÍÞ·!£;oõ†úý~5uSG½2¯Ø†A¼ÕhÝè0ìih^7r£ƒ·7ºÔ¾+·†Š-ÎN®þ…8àÍ×´×r¥c€·š›~ ܸú ¤ÉšâÆu Ö …NÍ3€‡Ò+¿…*9 ê=t©=³l@"ðØ# ܸ:eÐóXк1`X;´ ¥àg:ë*vöÌÃÖ×µâÖåcÀ)èì½²{¥¡¹™ânè‘!Î[agqÞ:íßvÀ°NÍnl£ÀX.%†D†¦dz‘‰Há¦W±ëúŒ+½>ïHàmõq%0¬ÑÉ¡[éýS*pæ¢ `ñX·ö`öz•íf×âƒ! W¾ýŠÖok‡àÆÕNÒC—¢¸ìš‚é }î³|Mw·bjþ¥35ýRy:|NcB#0lœp ÚñwLø[™jê¥Ã'èÕéd[×2¢y—î>oUŸÓ˜à­=Ú×mɘ୾PLÐ+gÓWÙv²špéìóšo©<*€¡é–â³á½Ï/Ð+_¯4×Røç†ÖК Í´tFM´Nµ¡N³/,ðV§Þ ßø4ÉÒY‘x«³­îh×®\‡ýro×ÈQÏcÆ‚_ðtrÜgezµ@¯N7æ“:¹éU¬u †õ¡²à¾:¸.^#®v>~A›Gò€·Z'7ìgͨäKøí틊Ø5äÃuá-ÈÃÚ˜”î+ÛDs)Åj¶C]Ÿ3Úå_Сh"¥»£é,šF)WH0í–U t !P úR/·ÙÆ Ä”‚¾@)è® §ZuÑ@ t±‚TÜfû¥JÁ¸d(ýÚ\*$˜ç§¶_ðXEJAwnI…ÃÕ<è¢JÁØžDÎç¥T5ìÕ5®On³{ ¤‚1Ù!ŒáÝp›mNQ©`pi¸Í¶=eÃqNé »6ESmêòÜüʯSRÁ9šï(ÄTbRAs«¤‚Îcw0ê{½2H]×" ÄÕg ¤‚±^A*xgÖk›0©à1Î*× m8Ø•­˜TÐä¢)޶Ÿ{T@½v5g@*ètKT$P tj* ÆÂØÕ°15  ktÜgûÒ© ñRA?³KwmkÀ™žhó+ç±^LTÐ<¢) , †%C*øØóÎyí8 Æ …TÐï@d@&`?T0vâj0¬ÑVЯeÀ/hôR ô“µ@+è JÔetZ ô³¤ŒÄ¯6¼Ôq­` þ æùtÔëuC+èìKÄ­N†ó«Çš7ßÛ°ë±…RA?[È€¿õc]×T© ¼DàoµCŒèÕ{†÷>©`<@ƒy>­õ0DT0Þ§æ*:ƒRÁ˜ë º#{Ãv I÷Ù¢iŠÎ+2© ÿRA×§Šæ(:£RAw8 ¤‚Á/D {=àjé‰Ö=}! ³O§WØ57Ñ!&´£¤˜TÐ÷êé¼µú§ë¢„zl—1ˆ³¨@+ Ò„Ó<È­ SZÁ`†uŽ0“ûJ”dï+[±^mÃ^íÊuÿ'ºÄjfZÁÖØ~Á·Eš~ ÀÖmZAóI´‚î“•Ä­bZA_Ëõ¾æØ ZA¿Õhð: Îv´àtâfbA*:®ãÀ' úáX4÷Ðy|ˆã-@,øTÛQ®>ø! ® ±`¬^+‰[bÁØaü‚>Ú!Œ¥bA†\‡OMˆ}yž úAdGƒ–ÓÉ ± ÿòÔ\Cq› º¯kB,轚Or¸NˆNˆÝ!·¡–7!ô·?ømáß! —dB,è¤`j‚¡ÏÓÄ‚6épj Æ4lƒÊ×c ÍôÊV ¯‹Õ ±`XRysÆ&Ä‚NF&Ä‚>%çëWWbAÝ8ËCü„õÒqÍ×yë´Ÿªë8]&Ä‚¾iLˆý¬<_Üt*Ú /Ë„XÐ’SÝßá › úìÆ¨‹¨ ± ;?&Ä‚×ãÏë"jšXð<ïç‚d"¬Í'ìT±`LÉ©tö}:fÊ„Z0†7Ô‚1Tô¸rF,Ô‚a U Æ™uêö"Å ¹`Ì…ÃÚ4 ÜW§¡^/ã|j@.è‹ê„\Ð7‘ýêž³MÈðš0(˜ÚDLVÌȯOWIÖPzÕmLB.s¡BÞjëÕ„\Ð SÅþ;kòdOÈ}óšš%(Hý¬âòXCu¤_VÃÚÉcVÐ+ŸVÐ úÞ=“UŽGzÁ˜tšè¼#èý”6¡t6=+î³^MèýŒ>¡ôîDPÖÕU|aVømAžÐ ƈ5½ ?Qƒa}^ÐO‡zAgñAY1S ¼`½ˆÍ„^0VÑæ÷Ùx^Mt¬½ ßTLè}óÚp^ƒzA¿-œ †=ß•K4¡Œ«)€" q6w_yCsû„éZõžÐ º»nvŒ_Me9 œÐ ÆÔÔ?g½‚^06/èÃVš÷ç¬ü݉+Ɔfý9§»ÃuÙ/·Ë¯05åOPˆ ½ oåSõ‚Ûƒ®Ç²ÙaØÓî˜ç˜2»Ç¸øO™P Tâê˦¦ú‰’ ½ Ó¼ ½ ŸZfqõ%h¸_ÓzA?ˆÌÞ?~¯sÉ ø®azA;ZMè£WÄÕG;ô‚±@A/Ö@TV †¿ ïtÁC>S ôóî„^Ð]Ps@ˆéczAWöLèýDû ·acOQ½àãZ—×%OŸÃéÕë𠦙ÞêórAÖœ úuï†ã¸É&䂱i&Ÿ8XNeÅK0¹ [N`×Ó®¹_ûã&çÄ>5‡OÜhNȯnŒçâ&ÊrÏÈ„\0¦¯¦ï GÉ„\0Ö'“ ŸÞjæ)p :÷T¹`¨&&‚²b°C.èGØ9“¿uB.èÄ|B./e"xÈ<2Så‚q¦™* W×DT–;¦É1Mç­àb*,¥ÚR§rÁpÜÏ «ÝyÌé±Íz¥nAŸÜ•µ=}˾+×5óÔ4=q/5!Œýg&·àœ0l‹_V· ÏWÈcKYÐašozB.è½sÁ°¾0@.; ä‚~‚ŸšrbŸxºýñ-œ Æ#,Ö®1&ä‚. þV»M™ËrÇý„\08ïJ:Ì ¹`pOÈc-_8ø ¹àõé¼y²âuC.讂¹œ·ê¤[ ú/¯'é0—&â‰w´ ôK޹ ë¸²ž·ï‚\ð•ø®Öú¼ tZ·L.hƒ=à­æË[ :ÍYOÒa»Æ¹ Ç—¬a.Ƙ–ÉÍ8Ë䂯L×ÃÚ¼ ômaA.è»ñBX–ŸZÖãÄø©a.þø úë^ ú¹sÃvœ† rÁ*E-Èýýn(gA^ z,Æ#ýr»äÜËä‚F76\gA^or_-“ š+èŽrèózA¯l´B²ur!,Ë…> rAßœ7¼î³WȽ«ž-tC9'­¹ oÎKï>VÁrµ–å$~A-èçŸUšíOµ +vÔ‚¾ð¯‚ó€w9Ԃ˾{ëâ²â  ôû*‰¶.¨cVA-–+ˆ²ÍjA-è áRµà–uá}w·z7f?‹U?dgWÃÚ]—ÛhUÒÝiA-ojA_qâ².X.õúRWðòµ ³µ`Ì׊ó€mtKÕ‚q¿ tη*®³Í· ŒÙ\!Ã46¹L.x¾;®(µO(åø>䂱 A.XF<¾ê[K<Ѻ 6¼Â³Ü‡¸ ŒÙàoµãß‚\ÐYÀ2¹ é‹vè×sÝ÷~«$hÃu™Y¾Y­æôJ¬›¶Æµt½Ü‚%ºÑûµ-è š³ ŒuY×Ë¥öÅ%á1ä‚agÈý°ô ×uì\ ôÊ‚oä‚î&[*ó`…¹ ³žÕóîà rAgË䂯@hâT¶ ôÝê)~h!0+f ä‚~º:â‡|—€\0ä‚NT—ng½‚\0ÖÈAÀ‘~V͞܂KWµ÷]8Ò,ÈÝ­¿ tëêÐaú¹`ŒgÈc¨¨EÏì†\Йچ¢”_ãW—fù,ƒ\ЙøÖù>é»õÒÙ.ÈýTö [MŸ¶ëôû •^^mÿ¹àkŸª[зAÈ]"µ Œurà@௠rÁxeÁÙv»½˜å|yA.“] Ã´óÐ2¹ OÈ\ïÈHŠÉÙç!tÝô²À,s7/ȯ?®Wøî2¹ ï8 ^ iF!ó©-Èc†B.ïW˜ZÐ×6¨ƒª,Ï®öS½],`ÁÝêKŽª¡€ZÐÊ;žÿ½…©k<ï¼Ü( qY±z-x}û]0ìiw]9ÞrAŸìŠÇñ oü^Åý쌊×éËÆ›dù(V|m×zÖÅr\·K—¢xF¼Ø®®øC*¾ÈôƣϭâyÎ4K9tDñ8!ÙÏë¢]q? ÅëÜFm¬AÛv'ªøò&m)϶·¯[ŠånÿEà¶QgÅã~( ý¬¯øÒð)¾œhßÞXÅrn¿7ÞÄÖ£Ü~¿>Н%Mñ:»¿ª¬Û9(ž·ý¿å×9Š%ÿþ¼tŠÇ!±¯Ë墸óžâu\™{áÒ0y[ìË•hžµrÖ,Å#^Þ{üénþ÷e>·±ÆpØLñ<6·rŽUŠåx+6îïý~!4¼û3.e¥âvϧâ™sÄÛ—šÿ^ãb~Bnè _ 6¶oñ¿7î¿!mÕÓîñÑ¡ßë~9>Åé}T0àxÕ)°½Ÿ £I+·Û^ÐÞßê=ÿª0l½2ùáëã¿‚ Çû©~ÆXþùò­ø[l,-.ó^*t³Wû3½è}(î÷|†ñ6éùEí}¶c’yæRÅãœ6žÏ‰WUœ–?HÏûØûêߺ´{ ÞéŒnÏÀýd=ܸ<÷øÔÑ(ŠçM'!v™m¿JƒÏðÙørÞlüÞÓ4ç°ïO\ÞãqT|¥ùÛ¸>·ýšÛí Åd,Ÿ¸]©ïÏÜ^¿’j('´~ãÍþbûEÚ€³|o|¹”4Ы]Óë}‘Ô½/´“g8Bþóí¹‡SóüLÅ»×.ÅÔÆ½åî®CKŒœ¼–ÿzÚMþî§‘K ¡øJ×·ñ¼ÉÏÛ ¼¸º7×E^0ßuG5æžÙIŸKb«8­þ=ù±÷{´t÷d7ÿ\bÚ­ŽâyÜþ×r¯–Ý5®Ã?¿s )Næ65¦]n(nG+¤x;‰Ç•pGñÓ²±”{öA“yv[„¿…ïä…*óì.È•ÿýJ¯Â̳:#]þ.fžïC›é#Šû¹ ÙX}­a$Í÷«\ÅëÞ!ÐŒÃꋼùg¼™DÓG/4šgwùpóB¥‡w@ÿ«7"âÎî5@þb÷Aþü3ž!Õ<»=´š~¡¸ßãrMœ ·{÷Dhܱ›gµGý8ܼÐlúžâÛ·ý"•~_È6Ïn!wÎ÷ ·¹ÃõôB¸®›éôÏðtólîÐnžÍ õã¬òB½\ÿ5ùf,®’”'Wëkiõcs3 çò×%ž¾:^Ïýz‘ôñlþqžï#bî,r†¯àµôúa^H9ãªà…–ÓãL÷ÛüHþè÷튯´mŠÓpƒ ó oäÙ?öGȳœª¦3dšo{Ÿé UçY.‘lÿ wdÛ?›„‡ ò<ö†Ì3\½/ÒïÇUÕ»ˆü-²7‚êîöÇ{_ËÁïËÔžîK|!÷LŸÏ£0ÙøÎ ¥Xîñ‹à:uP|å¨2'ÖyÿªÏX dŸáš/HÇËwð3ƒÅòûrU/#µ¼½Mþ‚ì”'%áÔ<>Ïe¯ùçÓÏ﵋m”'•þ|ªlð«€¢92*—o© È/|{¥{Å¥Çûw—Ø ÑÓîùýi\½Á xíÿP †w¡˜Õ¯bJ.°ñ-BUÜîý2Ô ï:Ô³ßL· ”¨AÏ ¤¨á«*ú;ë‰Qãý·7ŽexÆø=™¹=S6Tÿ\}±¾Œ¤õUœøD©g~ \ÀyŸ¥†o®@—zÖgT ˆãQ25œME«æWE‚^—§Úþ޲¡Ì(–Í2öÓ§ŸC倳>@¡ÇËbµb=Dñ€ó~ R=û+Êœù™êáSЩžõA<ÀêõÏ5Â*ö+“ªÆú;“Xq¿|eNû3¥µR<ïñŒJg½€bõð¯éÕEm¿E1³ß˜hÕ½GÅÊ Äø@=Ã&ñíé|{úçŸÄÎkç(÷ö8SÅý¦ƒP¯zLáÆ³ÞtOõ«›ž½nΕ†?¬‡ž/OÈdÛÏò”ÖŸå7íö}¨XÛQ/x–èX=nQ±ÜÃo9þ÷uäÏnÙW f=¯jÖóºPfàÐoèYÏò£…®ã­^ fcË|ÕÝJ·ÝS j=Ë;T­áÊ/(7p¦t­gùFÁØN* [+„­1\êã®m<µT˜~P!l zU­ì€÷¯>©dæÆõÊë¦øÊ\¾±…f ÿ~ë×ö[CØŠá[§Û·ßç¥ü¨¶Æt¨OªIº±\™Õ‹ÎUÔ ˆñY!lå´ª°õCë“• ÂÖPZT[ƒ¾U„Æñ°BØË[}=§+èN…°5–Ó akl·õuç6æk}½”æøV’T«HàÛS5a«/G5 ›W!l oO…°5®–*ÊÄñµ¾ž'+ÚÓ|ñ>¬2χ akß*jÜío:ÂØú¦"EŠç%̬¶ž÷W<¾8~ï«Í akÐÛŠq^!lí£–”LãZ/gz5a«Ïß aëé/*„7°BØÇÑŠZg>"ü0Ž;ÂÖPJÔâá\ÓO½­7–k»ª¨XÇÙ akxG+jÄúW ÙÂÖÓ”-8íU¿j·þCØÇ÷Z¡$ {U@ªþyé÷ü±pÄrþÞèöò¿Wok÷ùmY5Ý™_!lã]­È´ït§’°µ¢ˆA¬çÕÂcM…­«Ùkеž§-)_°.“÷]cÓ‚ G7Û kõ _ŠÛEv[ñÒÿ¾æðÃyƒ®õ6׺Éfƒ®56«†Â áüjеžÙY³´¡¡6Ãy¾š£ÈZÍd»¡€<Žèó¹éc]_€Î§¢Glÿè|º4ôÈ?:ŸÚàó},žÏ17ãs›ªçsì´ñ¹m¼çs8Æâsó“Åçö¨þùõä·]5~L\4‰OÕ,šÛ®?/uÕ?ûZþÂ×§VÑ𯗟úus7ù÷ߟüý©êÿ> ›_tÃ^>QøF¿uSf謫Æ5(÷j¿ÛïÊ<þôÍÇ?}|ÿ£¦WÅÓ¼OäÀ Þ«j9÷ãüŸ¿ÿ¿ùö÷ÿÏÿø»¾ùÿùÍ÷¿ýæ‡;e‡¢íßúê7ßýû·ßühÓB/ ÁÖþú·ü¿ÿå¯þ¯?ýñüæüþÛßÿÿõ/?óŸÚ–ÙËy˜K#»¦.ùŸ;‚'VÜ×l2>?û±+î> ¼Hö¹ }Œ Õ µ“ N£{¶r’µÆ“`ŠÅÚ­N xéïé}tñX»ŠMJ1Ò$woÏvOàËA®GÄþè‰Rqלr;Úì^õþ 2mTï Qâë¿o±_Åo"¡ùïYìWüþBèûÀ÷­(qÄâ±v'DÅëîï‹Ø¯á¿ÿ¢îÓ8¿WûóNÇCVO7¼9Äêð(6ùw`œ‡ÿ½9H•Ó‹µ'Ì;({ñ¿ï ìÍŸg¼ê@þý‡e<Ÿ Ô´øóIËÏ#pXuÿ}u.p6ÅÐGÿý… éÇÛ_УTü>ô‘¨êd¸ßöGµ1„ÞLâù‹¾9ÛOÐGŽåã·xÁÍâ¿_qAjÏ[¼äæão¹úç–j!~ßb¿^ÿ{%m.” bíö‰ñÃ'äæoúßêýÄ>ÎáòƒMÿÓ OÄbŽÀˆçÙönÆùˇÅlŒX;PkÃ8CØz€"î -k‡ú¿†qdkþý‚ù¿ü÷ ôˆÿ^EèsÇп=þ}Ëü$Ý1B­«·¯éµÄǃé#²tŸˆ¶{§¿ÕG^Ÿ£Â[}ÿÕh»Õ}:A‰üE†jjæC°]> D¾/Ãk#†ÿœI_]µÂ,8`„Úõî\D7åñúV c@º4]R×ô…ÂH¿ÙRÜ¢†Â¥QžÍ¿½=uOÇEœ–ñºÙUy›aBõüøo+¿Í­ Uä»|•DQ„çqÖƒ;„jžúÖ¦ã1¯6j ŠD¬°&Xˆ] 1v¯8+wÔÅß×v ²{á9Ùx³¾»>‚ìúë³ ôö°@THèó<Ù-ÿÜJP½ñ9vY{âª_ Œ{ŠèŸÕ¥þü÷"Óûc…¨ŒE È®5·'ÎÎçyP,a<>+­Z‚øïA9ª¿} ²~¨"kõç›pŒÆ®Ž »ÞAY§O M¨Ã6‚ìª]›)FZ÷ß눱Þ~—üû*Ì'0ì4ÿþöÔõåöµâ ž¯bAvÇž&‹lð»+†ê_–áU²}-±HÙ–YäYÅ–Gü«B]/¾*/Ïöoí¡ŽÂýû1¦Í¿¾7 ³R q €,òœ’PLá°´å,»yÿz½w©å,ûñßðÿþ÷îŠ×OÂ=ÛCàŽßßö.ÓwmÈ"ÛãöE]yOÿžﯠ²B°" ²‹U¼@Y+îm7ý\=¹Å‚ìšy²7Þ¬ïþ\e¯±~ ²ëæèW|?¿ÙIÇE‚â~"˵í‡áÙ_÷þöy±À‚: £ØjmQv±Þ”Ç Tï¿€eLÿ|> -(¶ïÓ¢ìb|•ǯśA†UÐþëpÊ+EöéýEÉ”Í1Ü/SPtYâK½N‰åüªŽ­Ü}÷ö*î!1Ÿ d‘1Þ J/T‹2+eó· øÂz|ü Ê.ÖÛY$ 6–ÜžàTß¼?2.V[^gÙ·§öŽ÷" Á2=ÊÎYUy=ê ó£ Ãyÿˆ²˶ãY¤_ë+î×~æQvíü^i÷xÑ(»-Û(þ÷ó_»c¹æ»EÙI±ý½˜,²øó¯xeö*õŸß§^‹²‹ý±@Ù†òŠfðS¶EÙ+/EÊðùˆÚ cùûA”ÝxÍkP ‹<ã«8Ëîø~õ2foh8ã¡Fa±éø>õ]h¶|Qvå}|þ@¹,JaãZ/¯C©ž_Õ֣Рÿ˜¯eç§²RqOëj5„WÄ¢ìæ°õµ@^Ÿ‚r gþ ÊîŒl¯€EÙÍfûo,2¼nÅj6XÎbQvwÿ¬¸€'”m8ë¢ìPj ø… ¿øß¿aÙúYäzq¯¯ï§z‹² /Fi^d\¹ |ÃzŒX”]ð·Ò¼Î€øç*CÆOKs¯ßr<°ÞÜ4CÒòþk±xŸ(ã€L܆å:õâŠíxµ,ÊÉÇ=ÿêשߢì‚ß”î¶l?è^u§F‹²C(ÃrïêþRg_s|{Zejâ¸Ýã§{MÒèå³µùÝ=©Eñï[†­åŸ[ÐÿôþXºÙµ†ÉúŠEÙMK‚±±`üÀóò#Ê.t Š2K·Ïz/~hQv£øøõeë¢ìzóñ`²È°G”yˆÏ_¹¼Vexý×±ƒo?Ž+rÌ4oßk=xûÛÞg=‡,r ßPîá¬×ˆ²ký|ßd¨€ÿˆ·7®0£-ÃÖ Ü®óG,òþþ¬÷z(».¾^Ay÷×2lÙø—ýšý ‹œ~ž°(»ðÈ"à TPþá¬Gˆ²;ó²È3ÿQâŒ_q%Âã¸=÷xF”Ýœ¾¿@ùšngã~E=‹²[ý|”{}@%ˆð2[”]xaŠ ˆ¶W¾úóɺç‹É"«ï(^¬õ l~‹'´Åy°Lçö¹EÙ=¾¾OOh+þ÷–?ØÞ7¢ìÎx³²Ý÷3DÙæãez}¨øý:.¯¨EÙÕ×ßd‘q¾,(Q†Û Qv¥ùüGyˆ·8¿G}ˆþú~>†ü%"Æòù0»6}X¡‹Œõ»>^¬kúóûV£B·„xñ‡/y˜]3¾TQ?âîïì×ù¼B9L©¤øæÛfwþºHÆ)–Ë?fav±¿TÔˆ[ ³«Ãø}….²úy³¾QÍ¿¯I¶L§ªx^þêõ#ŽÈÂìKxóí÷±õÖÂìÎûz½žø{Eýˆ¸Å²0»þØú\¡‹lÎçêë|{ùßkB[¿ÆuÚñ7X˜]ÜÚVè"c«¨±,£f±0»á^ï a䪶ÞVÔˆó Âìôr¬.©?³[âÏ[¼dêë¿WÛµ¿Y˜]ìÏÂȾl¬¨ça„Ùmþûøç}\þЊúÁ_=ÌÎÏ“õ#Îx³0»zì¡aHÍüõ#ÂkavqÞ«PFÆ~T‹Gý?þ÷šÑÖo©+êGœñ‡0»8¯V(#å±ý§¢~Äó—Z˜]œçMþS}ÿ¯þm¿õ´0»8_à:äß³ ÿu­^î+Úë%÷§#Ìúõß–Ñ׿?úµ_[˜ÝYMé·:fþæjÊÈåóõ#â– av×ûe¤õõ#b?°0»³Þ¨2rßúÛú‚0»3ÞLéû}Eýˆð÷Y˜Ý×÷OV?Âý+³Ûþë¿*#˳ü}!Ì.ίUGEQQ?âÌßÖšc$´ÇVÐ`yûVd-ú#÷­nEýˆ8TH#ÏzÞàß^>Ÿ"ÌÎæww%ª­V?Âý#fwú‹úgý‰ú⸔Ë_;nÙc¿é®jxüïë¸ö÷ŠŸï³úçöåþöö¾QQ@¢[h±0;Œ•ÿÅxD˜]uÿgíöÿøçöµÎïËÍ·vX2 ÀóÞ_fwö£îil~¡€D¨(6—ÿ¦¢€Dœ7-Ì®-çª÷ÏVþnavgü¢€Dø=Ìîú}½ewÿIE‰¸ñ0;?¿ï°ºvÏw˜Õí0»û÷Æío°0»Pál<.mE‰ðßx˜Ÿ·6^×-vE‰Û~Z˜m:_³1ųš¨bÿø·£= ³ þ(Ȳå÷;$âüjavg>Y ç»$NÅÓZ4ooó¿³^!ÌîŒQþ÷+$Î~€0»8Oí°ºrñ㊵ùüB˜ÝÙoP@¢ûµ¶…Ù…Šn‡Õµ›Ï¡€Dø‹LÝzæãôúaÅ?ßK%`avÃý©$‚ÿ[˜]œ‡êÿ ><½~XóÏ«\þ•:áoõû›Šqcaváߪ( ÷gfûõD’«Š* HÄù×âìB&PgÔóçWþüJoõ¯õ"Éj;Ï»šª ÿûµîù‡§ÿËý­Æïü±?¡€DøÛ-Î.η$B‰ÑœëÂ|½_hâüÇ H¸ÿ|c¹×Ÿþ×íPC"ü mø}»õÏjHøù­¡†Äy•µjZo¯Ö{~¢†jÁ›ŠxøçmÜïk ~lìŸVCÂUÀíÔðþŽ[Õ݆ó¿áÏ+åòG¶á|;ìaþíâíÍ;ª§Aßzöái¶Œ¿Aßzö«!óQ\Obë‰xýX›/¨!qöCñŠV6¡o=ë—Ö8|¼‰5°ñ*÷¿·rÏô­¡š‡Ðsû«^o¿‹_7è[CÚPDâŒGè[Ïú}kœ_ŠHœýÇŠHxÔG³"1Å“ìܳ½ÖºÎÿMŸZ‘êu<¯ó{C‰³ß@ßçñ†"§зžñ}ëê¾þ£ˆDúüŽjhÓÓš½åÞÿTߺǯñ]+"á÷·m¢@^9ý=·? '²÷==Šlž÷ú…"‡ÿN¤Ùr=a›HkvõGÏ7ÁWTßZ^K温ÄÎ þV÷w6è[—빊H„?Žªk½Zˆ"+ÞŸ…û?ÿ5è[ãü×PDâÌ/Ó·Æø^žÖLüûæßþ÷]îõsy½ÞÇÛ·ž²Aßzø"ŠHÄýZ }kõߟõòŸ5‘h±þAßúfúVç«ýÉþí}kðŸþD}dÇo»ô ’g>v‘½`7}«û:ô­¯?oG‰âûq‡¾µùøí("zñ}kèqºU‘ðó~G‰8¿öÇ ö6ï︣ûÿ¶ß/c¡;zþ jÏõ0Q’áÏëªo=þÿþxZÛé¿·äÒûuè[Ïó ŠD÷(»}kðãŽ*Á:ªH„>§CßúœnU$ü¼‹‡Ãç»é[}½í¨"ó½¿H³UÍ¿‹ö‚BmÀ½^ç—}ëóouT‘8ãúÖà£Ýô­~~ë¨"ó£Cß|´[ ÷Ÿô×Óš‰?ïª×}`G‰ðguè[ÃÚMßêþèŽ*¡'êзÆzß¡o=ÏWü|Sý÷˼ôAHq±×S{Þâ|ûy‡¾5øL·*Οº:JöúX½}Õ_ßï÷}b?U$¼½qï7Ýô­Îïzñûöèï|.ÿ+ç~ Cßþ’^Ü¿]ßQ«U$â~´W/lãúÖÐõêúm{?ªo=þÛŽ*Á`(a‹"ƒ?¦£ŠDÜÿôêiÍ¢}«jÐ÷çâãúÖ³>Tð??tT‘˜–VTñ¼üÿ=ªH4ïÜü¶[ ÷ŸuT‘8ó úÖ»êoõý¹G [? ox”U$p^눒ŒóA‡¾õ´ß"ÏÖë8=󂽨ÏzóÉx^þínU$\ÿ՛뷻÷§ßQÄU$BÿÔ¡o=ö³*®ÏèVEÂýñÈÙrâYzó¨½éX£ö,­Ÿâ±³I<þxN¶|ºBÞú½·†ü«£ˆDÈŸ:ä­»ã:ä­Õé~G‰¸NGÆ›÷õëŽ"ůÿ;‚$kl?·–âËŠHT±ãN‡¼õôòÖûïû´Ø!o ù]ïQÔ@·ëz)pN8HG‰ûsu·zøI‡¼5ÜIE$"èºw¯!¶ü÷Ž›=>¿Ã :ä­H6hòÛ!o yK.o°íx 1[ oã|‡¼5äva’!í·žá<\NòúçmÞÓòֳݣˆD‹åòÖöárâå¿?îënòÖîãE$LxÖÛž·†Ü©£ˆDq:Ú!o 9\‡¼õLGñ‚½¶ýCÞÚ‹/("×±òÖKtÈ[Ã]ÚÅmÿ~½Ã‰:ä­g;OÚ`Ë@Þð¸ýÄímóEœnÛô‡¼5® »¸»uúï‘û'O~i÷ø¼õ,'("×ïá’åêÏ*×õ}G‰¸¾ï·žõòÖúø|B‰ât¾›¼5ìyk\ï÷é{Åÿ¾ÜòænE$\¾Ô!oãiŸ^Õ`zû­]IGúÌIútw«.)NÛ!oðÍŽ*‡žCÞzÆ‹U‘ˆù„*áîë·†»ªCÞzŽ'VEâ²×ºÃ:ªHÄõJ‡¼õ´yk:ªHx¦/Åë’göå‰Í ·ê¨"î˜yk\_w«"áá«}y8YõÏÛ-ïéVEÂݯòÖ³ž@ÞÇïŽ*q½Ó!o ÷`G‰ÿ¿²³éõ.7ªýüùg˜ ÛÛv•= $$ [º`€’†”t „øö÷¸VÕªò¹(JÏiUïýß/Þ~)—åÅpÒDºdŸÀ[sº‰tÇ·fýq‰ïM¨H0ü À[‰Ë›6hØ­n’#À[9‘'­¨_B¼uÓ^%¼ O„·ñ<¼•ÓkÞÊåñtɨòĦ J».o ðV∼•á: ,¹Éo­Ï¯RÂi‚tINOä ÷OâúGEâÞ>å‰ð_÷Ùuú#-6÷š´µÔ7q¼5ÂÒB´ ýŸ´p·±¼(ív·¥ÝËí¼•îš@E‚8˜ÞšËâ*,/¨H0<*-–Û{œ?kx[$n(-Üm¾Ÿ¾e<à­\^à­ ?T$ˆï ðVâ  ŽÇ‚tIŽïò†ªÁCûºðV¦#T$.BO¶Oq¼5¦Ã NWÄÓ%’—"bÃíQÃ;¼•íS "Áô<ŠD}Ûf5Âo¼•ÓSAº$§—¼•î9*BNGx+ñ^yCÕ`Çó]xƒޚ˗bx«onqlãrm×7ìUÛU$^ÚZ–ó¤Ç¦]þ¾P‘ ÿ!À[óýoe}Bº$ý[ÞÊp‚¸ŠDLŸÄñVÍûM)ý·@E‚ã­oÍþx+Ç_tœ9½à­ù½ "‘õ³Þ ñ~ÞŽtIŠñÞšýã¼Áï †»x+Ó *Ùxºd¹Þ[—7Qð‰ðVâ B ¯ÏP‘ÈþhÄ&iðßÅU$"\ H—$~+Ž·ÆòŽ@E‚þ‡8ÞZî¯ã¾Ÿbyë‰÷YWû7.¹|/é’âxkŒïâ*ì¯ oµ½ÈzØÛÂÑ-lß”ÎÛûÄ&iŸføÛþQÞÕðÖ\¾Ñ'¶oxãú†“hÞh™+d$X_xk}>©áv}B$9íºŒºŒDÌ·2Ä/x+ãê2Õ'¶ïêñ~Ž ×í‚xk¾Ÿã­1ßVÈH§AÇ”þ¼BF‚þ“"]²þÞ–ÛŸPÈHlWÅ3»n’ªÀ[_RÈHp¾¨À[Ù¾2ì?´oˆåmð·#¾¡ ›äN—cݨÔÇ[VÈH°ý)ðV.Ï)ðVâêé’1~)ðÖ,?èHПRÇ[ÃÖ÷NßSèHÐÿPà­Äïõݽgï5¾¯À[9ßÐ÷ö·x+ÇsÞÊñP!$ÁñU·f}}Ãß~â¸ÔåMÞZßW+Þ¤Ž·îª’àöl !‰üØ´•ã‹o¥¢’`|Hoù«BH‚þöؾñu¼•ßBœkÙÇ]´WhÏâ*ðV¦SkM‰5žw¬âŸ(ðÖ¬¯=p‰ßÛö áŸ+ðVâp ! Îx+ûwí¡"Öãz«—ñB{,·ó¸o—ñÆûïšN®À[‰‹(„$¸œ©À[³>oÍïtI¦« IÄ&œ:n¼A·r}B·r}H!$Áôu¼u—ã»Ì÷•J-îç*b;l©8‘:Þñu¼5ð@…’ý/Ŧ­ÙŸoe¼I‘.™ýÏœø¥­gSà­ù½·f{Ø.ã!ðÖ쟷fùÏØzÄõßuÛUµíUß´5æ ¼•ø„NªöÆóM¤wðù oxͱëüFo ü@'6%f{›áo{ ¼•ó¯OÛpbÉ÷wÙ¿_»ø×Ç‘«Ëû ¼5ÇGÿÇþJ'ñþ\nÿïØ³¤·*ðVâ: ¼U–ÏToðö ¼5ûC‰t²¶ãÄ×5à8Ê5}W·r¾£ÿïÍûûv;ŽKÅxkö'H—dº·oåüSåÞ.M·r}J·>ö*øoåü[·GUM‰Gœß°] ?Öñgú­jlß…ù‘jȈõ°/¼A·r½I5ÒÉx|\í͸ÕÒåÍþxkŽ'Ší»F¾,³g\Ok:‰:ÞÚ²9úŒ-O—ù>¾Þ.ñü«âûË·oå÷ÞÊøç‚ý•Õït²ÕoQŠ…tIò* x+Ç8Îéï-à­Y€·’ÇZ=D)Ð/à­ŸWív\oÌ2ž/à­ÙB„þÛÂö­Œ',à­œ_Aá0ýóåxkø×øÐ‰/ù|k–õ‹úË·oøòÞJ|uA„éËñV–¿‹€°HögÀ[9>-ˆ€Ðÿ]#ø‰ã¶ÞëÃËòdJ{q¼5Ò׈í¼¾C„|Ýr¼UÝYa|bA¤Þ_Ví Bþaoåø½€·æøƃøV®7,ˆ€pþ´.ÉíÆøÖ¬ï¡(ôuMÍõ [JúׂHŽoà[s|r¾5üŸ…tÉ<îr¾5¶[[a|z_)±À·’Ï[éõÑùV¶'ç[ƒ\3¶K›qÿãÿq{·ú>¾ÞþÆõ—xA„ó¡¾5Ç»Ûwùû"]’<-T3¾² Âôœ%¡#ëå ¾•þí‚ çç‹Û·zùIlßåå!ؾ!æÿd$ϳ$x’×›o™¿,A:YøÓ Z ܾkÉÿ[à[9¿\!»À·Öò1ž8ÖsÒ%É,‰ø6ËgÏ:¾ƒoÍñ|+Ó/—O¬aÿïåõ5d’ýû ]’óï¥÷öÄKƒ'‘8Þgá%°°ë÷ r ôç—ñ­çøŽç9þ6çsK£¼gœ/u}kA„ñžåÛ·?°À·2=p8šÛ‘,ð­ä–"}ß×Ò%s{8îÿ^Éú¸À7°üø†˜?¬uoß°À·r=qo%_·Vlßàý+øVnÿ¾ ’ã“ñ­™>±À·r>»Vl—ù&ÖR¿m Ìù˂׻øVÎ7ä@ÈÛ,ð­ù}V¬··xþÕËúÛZH'Ûù<¶}C¤7-—aû7¾5Óä@¸¾µvð$=lß¾Áû?ÈdûÞ±À×{µ¤ç/ÈpýeßšéþËä@L[+Îu{6€ž¯^.ÂùÆŽøß×÷퉽sƒoÍñr œolð­Ì?ØñVï˜/éí|kŽ·Éú ¾5ÛŸD|{Äõ}» ÞOg?o-×[u{¾ ¾5¿å@4žgkYÜà[9¿ÝÉñ |+ù® ¾5Ç'äKÖß;ߊùâÖ[žbƒoe|e;ßÊþIƒ'Ñ8>®ï¾•ñíÁo7Ú•oß.|ÁÆö­\OØù{OÜ_ëö´|k¶ç[C +eüßšãOìÏ ¾•¼Äv¾5ø¶½"ϯ¾•Ûánð­é¿­Ø.ÃëøVÎÿ6ä@¸ç¶|É3?öòßZYøíÛ·²¿X±}×盿ëE{Ýr r Ü^l¯ØžXâ÷*·½ž/v7lã[Mí5žÿl—‘þøÖWâ|ã[s;œmù’¦%,n·VDØ·%R^ÇßÿÝà[¹þ¼!’þ(øÖz¼ká]Ðñ˜Öz<߀\€†=áoxÿ¾•|óÞÁ7ðú‚í[°¶7ÖÛ#¾±7üíòþg{º·Å÷1¾ÕTäâ~k–ü¤½±].ýµ ÿ/¶ƒCÅa}ìñ­Ìo6ûðä óëc·":o¶äúì±Mηk1û<ÏÆ÷5{gý³Ëü·?-âÛÏ »¬·»½õ÷É÷ßíÓìÒÞÌ.û»ßÌ.ócžñ~³5çS>æ™-µ<Û•OfvÉ_3{gÿ~lË'cy‚oõæc¯²}‰Ù’ëkÇÞ¥?2{æxavÙž·?ηJ<ä@òy|ûÖõ|«ªÛoËñÞì’Opìþäx`vÙ.Ñìóýc²Þböªõ|kŒWfKÆ#Ž--ýÙŽ†Ãõ2³w­à[£¿7{åúÒ±ßvÊlÍõÜcï²]Ù’þEœo­öÈxšÙ;ý»c·~ŸßÀÓˆºý¾µ=÷ÈßÓø}oõû‚oõ<³wnWuì1jûß|ı'x ¥­µþö_Ö¶düõØ.OÁûU~Ûì«ÿë—<…Ù%_úØ»l_fvÙ.´?¾}«ÇOÍž¹>göNÿìØ­Ä:t8˜/|ì÷ÍõA³K>Ù±=¾½âx/|ó±Ç“ñ-³GíOÀ·tlóÿ$úOÈì…õ—c×íÒÌ–ä­Ž­…·ë pþföÎùȱ×HžØì²Þxló·w´_ð­1?ëä@Â7{Ööî|«Fÿ8CžÂŸ|kÄGý–íâÌVÛßçß÷7ya³%yÄc{¾äŠóGɧ6{ç~Çž£öà[#_ëØRòWÍ.ù-ÇÖ“š=3éØëI^Ðì²¾cv‰·{—õ=³¯ñÖùV—˜-Õÿ°|IÆÌžÉ3˜}Ý|kÄG;Eœ_»—ù­Ùšü˱GËø‡Ùe{âcÏ’OaöÈùÙ;óeŽ-½Ö/È„Ü˱õÍõo³å~¾õd<¥?ηzüÀìküßñ³Wú§ýQøÛOô‡ŠøŸû³Ç6ÿoaýÈìo;¶ï'àã9ä@B^ÇìUûç[9žB$û;ð­±^e¶Ôþ r Ùo}ÃÿÑðÿ4ŽK¿Ëªþ$ä@.[3¾|ìÕjýшoK\o—|³K¼ÑìUß|kާ‰üÃc··úηöhÏI|kÞ|kÖOäKFü¤cTæ‹{žÊì²ñç5Þ@$Ö¿Žíñ¿÷“o0{Õþa]r f¾çØ«l—h¶Ôö¼ÀÓ_ßšãÿºä€û9à»Ì¾êÿ¾Áë?øÖˆßûmÕ„H¶×ñ?ë÷QÇ×üö÷½Îö—òF¾d~ßõvί6âÛO´ò­›öÎùì±]¤Çq]u¼ØÈ'cÿ¶£¼Y^.OÆßïÂö¾u8onvá{Í.ûw»•|"³5ãyÇ~ëxÛÀ·F<íØ½Ž· |k¬˜½K}oOð$#Îw¹„v•§0[lþ­ñ{Á÷Øñ|Ræ÷ÇÖ’OcöH¾Ølì—¨9ßõ¡oåøÚ/Éù\ßšï 9|?ð­±l6¾ÿ »~ßläÓ¼aûþ ˜o4ÈDüûؽeüÚì™ëÇuþ‹s¾ÓZ”÷׫ñ?³kûo.Âú¾•ý_ƒýµÖBîzGùhÉ':öêÉ£™½Š?ÚÀ·Òm‰ý¿zßzÙ³¾/ò%#>|ì62þoö*󛾕ó»ö"Þêû1»·â5ð­ï<ö(û÷˜=2^l6æ3ηøöÊç™+ãOÇ–7×3Í–âO5ð­±_—Ù3ãfï䟽Êú†Ù+ç_ß}ûûÿüöç?ýÃ_ÿâã/¾ûv:ç£þýî/þî›±PÿýíÿùãùøÕ·öñ7Ÿÿþýzš¿ývr>y˜ôÛAaþæã»¯ÇÃD~ŽC1…ÇÝÌãØ†ÇÝÌã@ÞxÜM¿(ŸÇñ½¿ÿ/ú_Þÿ§_þøíÏÿêó‹||ÿ¯Æ2=ücæAs>«ds¿ÿíÇÏæçÏžŸ|ÿïßþò{»øüõ´þ#Ýþ´ŸoÛí4þ^?Ὃ­áÿöÃÍœ/»¯'Xo³oá<Áízö×Î3|¿ír¶hÈ3|ˆ<ß‹g”ç¬åoÿgY$´}~u »œ‚ø³w´ÿ½ÿÐïAúïŸõ'ÿÞÖ7/ úÄò‘ããO¾€•ÝË ¼_ë‚7ƒÏŽÀt#¼™†éj²¿á'ùbÇéÖmX¯ÄÛ‹×gËgÿýÿçãÇ?ªiu¼S{îê û¬Cœp~·,ªóRó»_ÿø_ÿñ»Ÿþë‡ßÿúw¿ÿ£ÊÀ<ÀFÇsïþå·ÿñ›þøÒUpÃÍp´sßüîßþég¿úáÇŸ~ý_ÿóO? bé:²¬Žpóöý 5Ê…ýmóâÏclÛu…¢Øçó[Ø% {ÊÝ\>„ª#’bUW”X>D(%0$+%ötM©(1âzK¤˜rª+J<îÂé $u‡-@òà²«Å†ßæ)))w†ÜÅó+5V\ÿ ©Ït—U®ž<a‡w„8<ånÍ|¿ D.n´‰ë#ån?î‚èæ– ÛíE-¸P˜ É=öûá}Ãv—õq»ãýyw‘yO¹›ñû1îã¶åV÷)‘ÜáB)%òûìPpãû¸‚o‹ß+Øçë(.žBQbÇ”ÊSîêqKI)„BQ+}nKyßDrw‰×[œaʃ”»|Þåˆd¼ÿz àõe"y~)û‚¢Ä~½¼=åî²å¶Íe›^=åŽå»€Hîí.âzb ž?µ¼ï‚¢Dý½ÈmÇ3l "|߃¤¶7¯·FiŸëAy—ßï÷>вx^‹u!äÕ²‹úµlïò³¤èåa)wåþ†Hf}_P”Èï”;Ö¿åŠáò{ÊÝžÞ>–!’ç}áâ.W”ˆþ)w¥¾‘Ìò‡¢v.ƒm[ GH}µHÓx>m÷ûjmÿ ŠY‘r·G¾¯mUŽGˆ4žgkµ_„ì¢ó”»|ÿ7¼>¸¢ßÏ%¢½an^Êóågaw‘IØZÚçz¹åBÜ\ïÿr €¸Þ¬ýß"YŸÏ‘T½Ÿ×·\}ãúVÞåü…”3^oͲ$á)wúxˆu‘Ô˜b/(Jèô%‰H¹ãù[®Æ’‚¢„4ŸÒzÊ]¶ßÎi\Ï`^ÿE ¦|«Ç– 3®ßÀ ¤·€HÖçX’q|bIRãþÓ·åql9°ã÷2îëû9—7ɹ=´ (1§‡ô=ånŒ|>K‹%^O¹«ÏgKä®Þ%òyG À^¿€Hf8€$Äøï)w+–XÖ’úzÜSî²ÿܪ…àö)ïî)"f#Lâz³Õò±¥°Äý¥ú? ŠÏ›ÏoþˆzHsÙ‹HL÷”»ñxÈi „HcIi (ø²ÿAÊÝŠï"9§/¯^Þ3B¤^_!)±¶×žr·bÉm‘l,,—”1>º¤Ä‹”†c÷§~?HJd{@Ênß$%êý‡ÞÇç[ü­I‰ùxÈÇSîtykÍØrËÛÇ E1ÚÚïçS„ˆ{Øë­õiÆ9ïo!;Ö§‰-…9‘¤ÿ² )‘χ”»¬/Rüm·¯öDò%šI‰Ù£~H ¼~G ¯®Úÿ‘Ìþ’ÓS>½²ïñ>H¢÷¿H¹ËþˆdöÏ”Èú”»ßHB©öû~±ä D¿ )‘χ”;iâ_ŽHòý!»z)0#®?{õ?”[.¨Û‚%‰ï'RÇéŽëéõý!)‘ý/Rîrü"™ã$%²þilqæís…‚¯_’ù{ ’Y>”è¾…E÷”»üÞ+–È%®÷ê}¼·Ú¿AR"ëûŠ-·Züþ,ÙŽ7Æ'HJŒXÂ÷”»>ã{‘-opy~‘ÛV„ˆbõ”»ú<ë©ßoÅ–«ç/ø3žÇ·¸}âú[ë÷¤ÄÔh/”Èúâ’1ÿ^þû[HJäx…”»lÏ;eW\Ï·ðòÞ¡˜L{`‹O, .HJd„”»ú¼sTÿÌ%%XH¦ÿã’v(¸y½#%iÅó/ÄIG<¿¥ÜÅüxAR"ý‡[œ5Ú«Ì6$%8ß”»˜ßîþvÜ?X")wg~ó„ýŽû÷®˜Œñc;"YÎïzŸoó›˜ÏlC$óý6$%è/{Êßw»¤D¹ŸÔþ‘¤¿²!)ÁñËSîX_6Ézܶ¸ÅF¼HÔ"Éù§Üq¾¹HÒ¿Ù”Èòm@X¾ þ_Ìo±–Zž)wõ÷ï¾Ïï½–Iú»Iˆö)wß6IÎov‹%råñêoìFßxßPLŽó½¼ÓÖú}rGÿ}‘¤¿°!)A=RîFÞÏSÀ܆¤D–RîèßlHJ°½zÊý¡ D2Ë›’+®ÿîÒ~7Iú›’õúã½?´ŒïžrÇþg¿±Æ× I ö§žr—åõÆ×Ó~_ß‘>ßñÿ8¿ñ”;Ž¿ˆäð”o³g<ån¾>Ø@$éÏoHJ°¿FÊÝùý¤­†h¾ñû·•þu÷ðÿ0¾ƒÈþÖSî8n ’òøøº!)1¦û7H¹+ïD²_Ü”è±d¹H¶˜¯lHJpþæ)wõþ–VÊC±ßÿ”7Çc°)g ‘'î÷YÞ;µȸÛì­MPb±ñ ßî‘rxDºü1?+ñb×hÙv‹-Õ\Â+$èíÐÚÍnÙÚÓb¯†D»'¢†ÛÀÈz­O§oGLiv›]¾Q‘kæÑ³X#äØ-ŽG&!QOþ,ÞÍÞÍ€ÈÅÆm G}Êϲ­ïÿÙç-¶<ˆG<=F$×½-j`ȶ¢& ¹Ž3Á ²©Ã®{Bï)î6}bì¹uÕÞý‹­v=°ZÛXÈò¼ÐŽb ÛŠ›Åk,dy>hGd_ƒÜºü\`!³ø‘[÷Û½…ÄpóøÕÙƒ µ®‰ÇÑÀø\wü¼ü\H­«¯sü¼ü\H­ËÖ ²Z³!ÑŸhH­{G´ õ÷ǯ~m÷Ôº·çó?ïÝQ}Zןh­@!ëñãWçý‘Z—­ (dŽKŽèË牞Z×ßx Ùú Áy¡§Öå¸éˆéR¦ÝSë8/Ü@!ëó?qO­Ëê éˆz¿SÞŒƒxjÝ©,ÒÙÛ µ®k>ÿ~JÜbC:¢–‡•·xœ9Þ§7õqÒy>¤#²¼ Ò’ÝSëêùÇÏ«ç?ïQ½‘Z×|ëi³—@Ï6¤#²ùB:¢Þ϶ÖboŽÔºü¾ÆÔ•ÑÒC£< ÑwtG@!ÛŠöéˆWóyNy×û?/¿ß©^¾Ïñó²~B:"êó@j»;³ËèwlÛÊÌýšÔ:ŽVÇ6?Ïý¦ÔºëzÇϻ쑣é@jÝe?/ê›Ùšíaxj]÷­ÉÌ–Í-OÖßá©uñ}ÌÞé×O­‹ÑÙìuÛ ©÷?åõùØ»Ý×÷­ÌX~{×ç‡tÄñüH­‹ï33@?×l­Ï‹Ôº¨/ù¡hßÇ>åý:ú=<µ.ê¯Ù;ë÷ðÔº.Í^Ö?ΰç›ÃÑðÔºw£?¶´Íž6|<-ìmý/¯üêzü”wŒÇ>q¾ÌÖ†§ÖEÿj¶dû¤#ÂïžZ—å² â@ÃSëzï 2úÇc›÷÷¢= O­‹ñåØ½Ì«Ìžµ½ µ.¼·c‘ó²á©u±ulóþÊù¶µªF}Cj]¶ õýô©õ©u±®bö¶çÛaŸòŽþÊìUë3¤#¢?žZ—õ±CÊJ£< ãÑðÔºì ‘í«‡·Íß¿ï}üÕú>H­ËöÕ±•-ŸÒYžH­‹u=³wÎc={ÆÍ‡§ÖÕûÉ›óÄá©uÕÖöÅ.qüá©u1¯Ø1îjöJ.ixj]x÷fkÎ뇧ÖeyÄU=µâØWõû!µnz*‘Ù»~Ÿ¨¯?¯KG”ãó|¯/.Ñ¢ýðGx~«O­‹yþ±-Õ«Ú«Öo¤Ö ßê×l­ý!Rëêùlj¸î±×Së;Sëòø®ã¤#BútxjÝ|¢ü ñº”¸Ù’ãë±?’ý¤#²?œ!ìýŸKéˆOZ—ý1¤#êõÇÕÞZ—ã9¤#²½"µ.ü!³w?!ÑŸø¾H­«ï«oõ ³ëÔº³ÎÚã~kæºôðÔºð¯}ü¿Ë.þßr–þ‚`kU~¹ü¿á©uõø[üßá©uY~ÿ¯Ø½ø[ÃSëÂ?<öxkùB:"Öe†§ÖeùJl­êå…Ôº/Äü‘ú~²êxŠÔºúüzµGHGäxƒÔºl.ÁöîÒ#úwAœýKG¼1žP:Ÿ_áÿÑ߃tDÞ©uù>ŽîÀì/÷ë×x鈈#O­‹u$³µŽ—ŽˆuÈá©uÙ?A:¢·­lÙ¿"µ.üñck¿Ï7é0þ_±µ*ûGÅÖ ;Æ'¤ÖEœÒl¤úñú©å~¤ÖEÜÖì•qÝá©uÙ_cÍòvéö÷H­«vêxŽ5¿¯KGp|Çšþͺ¸‘cÏ·öçŽHÿ©uù=RýY_!‘ý)Rë†oekv‰«O­«ï[×Õmþ6ý¤ÖEtj<àXóyÀ±æxÔº¬_ŽÈòÉÔºæö{GŽHÿ©u]3{ÖþÉ8Öë¸Å±éŸ€cÍò؈c³ÿÇëÊÇ–küß_Ê{Ãÿ«öåÿ µ®>ÿúòþwy#µ.¢›f×÷ÔºxþöÀÿ‹þ|^O­c}jRâû4HG°½yjÛgÇÊúî©ulí‰T¯ÇÇøb¯Ò?¶‡[«ÆóN-ý•§ÖÕãîÿ­8®OñGÚƒ­ž|ÝÇìȈԺ¨_ k-OKõ/ïS¹‘Ñ\:bÇõ‘ZÇþ¯5øÎQ˜]ýMO­cÿÔÀ±ò{@æ:ýˆÔºè8Öàh†§Öqüi R,¯Ñí7î?{rfyy“ÓžZÇúÜZl­Úâ|µ<[l­úÄû˜ÿWžo­Ò5p¬—­e>á©uùþàX95HGäûyj]ô¯ +ý5O­ËöŽµÚ½úÿžZ—õkÖ—7¸´oO­«Çgo=µ.Û#8Ö¬oàXóû½!Õáõ k~/p¬Á1 O­“•÷[»Ö_HG°?kol­ïõkö=¶2óúÐCÊÀë78Ö,?HG0žÒÀ±ÒiŽÈúŽ5Ö%ÍÖú½ ‘õkýý¼ú?HGÔ÷9þ_=.u~ßÀ±r<Åž]9oŽ ?ÝÀ±FüÕìYüçéއ­G¼õò4;âC k–8Ö¼þˆùMÚ5ÞÐÀ±æóB:‚ñìq]¾'¤#hŽ`<§c¥ÿÑ Aÿ¾cÍ÷ÇJ A:‚þyÿãûÕøö±ïò¾9Öc¯/÷»âmD|[âþ{Ü×»âmÞþvƒtçÃm^ëêfK­ßàXëñ÷êo!‘õk–·KGðy!‘õeƺºÄïg«ý9Ö'îoñV¶HGdÿ޵ÚzµHGdûÇšåïÒ’Ï¿[í¯!‘ã1¥#|¼ÇJ½IHøï!‘åŽ5¯éˆ,çXYþàXs|‚tDö'ƒû+àX³?…t„,p]ÇžoíO[kq<–ØÊ‚ׯƒÙû~ÛZ‹ý;8V·¤#êû¬êÿ6HGäøéˆüžàXó¸KGÐÇš×ÇšõIïùMÇší_/nd@¿Î7;â½Máo³?Çë#f¯¿hHHäüµce| éßnŽ`¼¤cÍöéˆìÿÁ±2¾ÜÀ±fýÓð·W<ŸÇ[}üÇšÏéˆ,Op¬Ùß-Ä·y?p¬Œ?5p¬oÃrî±nè´µúÇàX³?ƒtD¶p¬Ù~]:‚þáºãÍ9V¾ßBy¿ñ=c¥¿â+¿ÿŠ­lg<¯~yÝÉ={]þ=8Öú<û­ýãºãm‡ToÚW{ÇëqfnÜìk¼ÇÊù]Û IXßÁ±æx Ž5ûÃòæxŽ5¿¿s¬¬È‹Ìþ+ç£ ÒùþàX«}ü¿6¶2+ï·žûù×(ë+ y‘YÁ±æxéÆÛ ¡Èõ}³¥Ô×Ò_ãX³>½Ž¨¿?å]_×ÛÝß\o6[KòB:"òHÌ>ñÍÜî±ÿÇõÇk=ßø†bú±3Š™…&9¶á áîá@CTv¥IÌ®îß åvo/”#ž}±2|ý¶Ø¨Õám_ŠÊ G¿PŽh¯‡‡_`¬A›˜= yy|Õç7Œ5`3•€Ù1G+…†•k/d#êÃÛ}õ †•}É Ù¶• +×_0¬Y˜È‰ÌÂÃʵʲù±À°2Vþ¶Û÷{M6"Û †5Ð#³ëXó"'’k¥/Ö,\ÈFäÇÃʵÜ +cyï‹Ø6+V¶½ +ûî9‘Y¾`XÙv_ÈFdÛÃZŸïø~Y¾&±=ü˜zÕE ¬Õ^íþùg9nxÌSÚ‘‘fv]i~`Í»A3âñ„µº´ ¬YxÐŒàÂ÷kkœfÎZ‘‘™Oco|£™+!¹c·¯ž>4)±cu6ЫÏ5ß#º23éI37iÒc~–óžÑ„A®rEý5r5PT3åc9·}Ìmç¥ôùDêYifn¢§ã5n5pQ3×ć`lÕLýXì󔯃©fJyh(DuföHˆÐì]  Ù”m<Ñšÿ˜ÓÙG?‹WÄcŠØ—Sg>ÙçX¦ «™ûÁóó4m& QÍC®:õj¦Wâ-¶}eëŒ\Í*p5È;³?ïä¿™»4Ó„Øž/jæ*—žï8¥«q©ãÔeí²š zí{Œû¸C"üýq¢óëYå¢Ú =:I/Õì8¬fG=ˆË®‹ˆ/ô êï7U^èAdGæÈ*û «YЃH'Èjv¬NÝŒóß·,ê¾Ðƒ¨çŸò®Çû5ÊÊíD¿Ðƒ Óù‚Y¥“õJ8u¶–EÃÌ*Îz\txÁ¬rø³š“Dy?q½5ª“f•‹œ/’¹Èù‚Y¥“øB‚“Ìj–/˜UBF¯éAÄv|fVféud•ÕréCYÍqrYÁ¬¦ÏæÌê Ÿrõñf!¾`V³8 AŸý³Z_WÛ]Z×ì_2«|þ5êç³ÊØ f5ÇiýRÜ`V9gx!‘Õ¹Žùü`Vóz+b¨3Ž¿£:`V¹fýB"ßÌ*׌^0«õzcÖêf5}pÈAds³Ê9È f5h³µÌÉ_0«9G³ZßoÕ9Ô»b Ý¿÷º‘w}ñëÀ¬æñòŽ5†Ìj^Ìj>/rÓѳšÝä ÒÏrf•ÝÝ¿Ž×»b¨/˜Õ¬ÿ`V³ü7Ê›sgVëñ]ë˜Õ쾜Ye÷¶¿”7˜UÎq_0«Œ1¼~4»?0«Ù}C"Ûä èww0«—­åûu0«ŒugV£ûë‘ø~ݙը¯rõz×A³ÊW¢¼Ÿøý¨1MlΩ;ä êý¤2+ý ùÝï'«¬Au0«õý.F¤?‘ 6ã~Kîã»Æì:˜ÕË®ÌFG®#c~Ì*×4z»áf•ß¿ƒYÍò€cŒÌ*c:Ì*cž¹ŽŒát0«Yþƒ ÓÑÁ¬²=v0«\Sëƒ`Œ¤aV{‹˜5Ï׳ë`VÙ_uÈAÔë[.XùýCíƒà¼°¿±=-ê{³šß r\³ë`V£î/å×âøÛjýyï˜uC~ k°Ì*cbÝ™ÕX£è.kðÌ*cnrìÏ;r9^u0«Y>.Ql­köý*Ÿ_¯ïïÌjô_rt‡ºç:Ž|ž]™Å9ŽÌj¶G0«YŸ!Á5»f5ŸÌ*ǫãî`VÙ?wÈAÐÝê`VéîvgVùüƒÈúÑïj³šý rëï¥2’rdˆ;˜Õz}Ýe¼ëƒ`ÜÁ¬æ÷u9ö_ƒàxÛYå÷³îa·ÊPu2«^žƒÈï1bïoO`Vóý!A ƒYÍ÷WFžÙ³¶W0«ùþ#Ê{Çýç—ç‘·ö—ƒÈïïÌ*ËwDy·x_­k6Ì*Ç×9ˆl_`V9Ýê`V#gjt“ƒà¬³Y¥ûÔ¡A÷°#ò:¾Ëaw5ˆ!wGVc8†{Ý¡Aw°Y¥{ݬæãÏ{vÓ¬ÖûÍU«Õz¾¹ü¼Pƒ »Û¬æpd•³›ŽÈìÞ¬æð5ˆîf¤ˆùõ%RļºÉ—ò²šÕˑ՞ç{y{u²šÕ jÙ}Y¥»Ö¬f÷5ˆn¬r:Ó¬æ÷Dv§@V¹„Ü¡‘ÍÈj6_ «\¢êPƒ¨÷3d•õM®­·Ì®ˆL²šÃ#Ô ò~z/t «ùþŠòfùi¸Þ|€¬fw¤ˆxùYÍûë—òÖî@Vïz»ÛÈj¾?Õ¬Pƒ¨Ç f}²šåƒÈì4…7ÞgÕ%»d•³õdµ–•7Ý «Y^@V³|™îÖ dÁŸjÙ½­XB÷ödµþþÝuxZ{ù|AV;Ô Ò=qdµ<¯! u «Dz»#«üþPƒ¨÷—š"ÓYe{‚D¶W «\DÁ—ò²Ê%éîÈ*ÝõÅݲšîÕ|^¨Adÿ d5¿Ô r¸òHöG;a/ß}#"Ý‘UÍû~zÿÞÝ¿÷›‘ïûF„;ÕìÏ¡‘î<Õto] "ʾ¿”7Õt¬Öã6½‰ñd<·û7 Áò@VYUŽ'jü¾È*û'4ÄDžR é~ «õyL}7ÚÃx"ú÷Äù£ºÿ㹑ìd•îÓ²Z/5¼1žYPƒ`û@VYßUޝjüÞÈ*ݽd•ýÓh‘’—ö,K¢jœ>v/¡£#Éþl@ ‚õYeý@V9 ¨Ap|®Á÷‡DÖ¤@æ÷²šßjlo÷^ö=€¬rüPƒ¨Çµ"âjìR ó{µÛýPƒ`¸dY¥?6Yö:Þ@²ý}ßÛÿ@V9¤@fy½,Œ¸Þ«·Ýßûz½¦ ¨A0|4Þ;ü7€¬rÙv 2ëUŽ‡ã½¶º5»"›Èj¶g¨A0Ü4€¬Ö㫆›R «½û}¿}µ «ìUú§Ÿ¶…[Y?¬f}²šýG${Ñ®)ÉŸv/[+š­ÅŸ@V.<ö,þëð­WIެ®¼ÿ,[+Ûá@ꆱ=HÌïd•ãñè·²~ùÖ«åýWnŽòf{²J` Â1>Žq¯& «Ù?„·YŸYe{²šõo`ŒXf@V³¾Y%2™õÈ*ýëO{>µ>;ü7Yå÷@„ÙHYâq}ïß«Ü÷wdUâüUÃMø0¥?²ZËÓSò¼?²ÊÕ·d5ÇÇó/"«OØæor8€¬ÒŸ@Vé?ž†Ðïã}ÿaYÍï;­¼‰DŽ/Èê±çý|òÿ|8²Êö;QÞáO «œŽáí¶ûÛ#®…[?íýÜÇ÷(ö²šã© ¼Y_€¬r¾3€¬fÿ/؃ã%Õìþ6ß)ôÏÕoÄÊ;ëUúÿÈj=VDvYMÈjÖGOdÿ dµ×Ší «õù×[ë³Àß~òýw«ßç ²:™íÈj–¯"¼Mÿ Èj¶ «ù=ámöo@Vóý€¬¦ÿ„Èúû~õŠ”<–‡Æ;Οuþ3å½ò}nÿϑՖ¿¿ìdµ>ÏÞެFøsh¨Áz{U ÙŸެ²²šýý‚¿ÍþË‘U¾ÿúâo#’\IJšþ¤<Òß²zÙò`¼jY%k2 åñ¸Úî±gßCO‡«Ó¨'Ë7š4S é3 X%¶1ŒY¾­¥™û0-nýYÔj†%?L«n|f¦|¨ïH8†‘ª‰6Ã@Uéåè>'ûSm_aWšë0.X–ôrÌf~>†«9óóÿד»$´7¨æû›p¡ >•€à0>5 ÀÒ!žó³TßÔÒLá¾pÇütšKEF¥.×»b„¿¦C©П€RéaNëàÕ¦1©ds&T²JRôß&T"çR\žHqd{˜@RcG/³ËgÇ6$5p‡ $•þá„T—‹'˜T²kRÿ'R¹ü:I zcBªƒýé“[p 86ÙÞ&¤:²tI%Ù4¤æÏ‘áHJrI%¸768 4l:’0Ót$5ÂÏP,ÛàN³øÜén'2³¸@¥æçƒRGŸQ©Ë…1Žiœ=y¹ÏÒ&Ë7Ieì~I¥/:[l·À_¯YÐŒ ™Žú°ækT»Î%çÛ[ ÚšÞ´1—½Æ´!S»kÓÚ¸øêfŽ£“öòè>ˆ†ùYžâûq›©âÛåóÓ§#d7DeSž&Î[Kš9?ö¤9ØÃNËhd»Ÿ¡²·ž¦ËA qƒÊÎk‚J ‚‚åS:‚º²xö(ëD2#ö¸:¶1¨{Ä£˜&;Ýi5˜]ß4•ý4AŽ,k›m͈iM nd¥²,FñÍïÍ\å³Ù¦¶¢ùÛOLjLç´8ljæ<'c™FžÊ›Oõé»éޝhÙ‹±Qé1µsO3õŒfO=ài)ƒ÷²™›G¶OK§`äi^ËÒó«yšÕâ±ç¡Ùš#<6o#6‰ëq¼W e‚>劄ÏÓcš O9Þãöç€Ç3ì9$H>OÝ$ÎìšÔ2<¶ðØçˆM+ž¸¿®ûüõÞϳ¤Ì æ@„4 ±ç ‚DelN$uE„uB|ƒ3òi,jMÓÅ7ÜŸHZ¤‡7'<äˆÐMˆody€GeÏÊ$à ñ Îø&xTFˆ!,š› M$-2én‚GeÄyB|ƒçJ b‚G­ï¯ë>¾z‰ÐNð¨ôÀ§'-¶|ÿ]=ö)‘Ôåï•ÀÅʤÀ)72Á£†XDZ‡›Y›-eÓ‘ •3Ô ñ nZ0Á£ÆæÔfܬ{@hözžÙKDi‚GÍïñ F &xTF˜&Ä7êûkM²šàQ9ØåÍ߯º‰ÀZËgK­ßàQóù\|ƒõÍÅ7Êqxˆo({T©LâœR³þ¹øFD@&€T&ÙMߨ/HZ¼ìº‰ÄÔ{… 5ë#€Ôì ¾‘í@*#(@*g”I‹œO½7Q˜.¾Áú 5¿€Ô|_ˆo0‚0¤f{šý¥‹oÄ r:¼¹"© 3¼ •@äü¤¢ã½l‹ØEa:3ôéâQ˜¤ÆŒ~B|#ûG©õùDïó-BZÞOë¦u@jºœßÈñ@jŽOßÈþÊÔˆXMRy}ˆod •ž 5¿Ä7™R³ÿ„øFöHZÌñ@*WL§‹oð}¤f°ïÄ® ñëxÝDqîØDaÇýDï÷Õ!™ßÈñ @*“T'€ÔŸw×ï·¯ú¿oX´Èò©ì?ä "aÆù'bÇjJàIL|#û7y"BŠþGž;B*HZd#Rëù£nZ"Rëóͺ‰€@|ƒþ‚ø&ª±¢¥Æü‚¬E¶oÊIøë«HeÄL¤ÖòÛuEZž;B*RÙ¿ Ä7òyHú- 韥 ‰ú¡óô¥¡¼P©¬ß •õC ¾Áö-R¹B"íŽH éÏ €Ô|_ˆo°=K "Áë€Ôz?­+` •ý§@|£ž¿ŸâÏ €ÔË®D’¼÷ ¹¼÷¦µñ F(@*# µ^¯nÊ|ìþ”DEø#ÚòFÄnÄýF]‘ˆo0b*o$õÏ8Ö|#Aâ"ÇZŸGê¦E˜þ”òZË£Šo˜­eÓ7šõ©‹ôàÈ—ú ñ úS⛨Fÿ$RÙ?K¿ç7â@jŒG 5Ëâ\‘R9 hodñ;ÚòñFÝCC ½ÁîXÀ£Ò½ð¨~ÚYÝÁ£fsöÝéᎴ8îé_#ŠïÄyTv7àQ±‘…VOð¨ hÉPìVómdÄ ^œé¾HÍò‡&GÖWßCõ)ǯáš9Ró}vìÜx¼æ÷Š©t¯¡É‘þ€T®ØÈŽ=ky½YÃ-²ï|$šîÛ ï'H”@¤½j 5§ÐäÈö¿cÏZïO ¤6Ú5ßL¤²~é@ÎW©ü~ µž…·õ ÷ïãý)ï£O ¨ßúÄZ<îšo«,¨ë{Ö>qþ¬@–Heùë{hñúR@ô aÅùZÃíúÜ{–)€TÖwuMŽ˜ž+€Ô¼~‹=kñ}šì@*Ç;uM^¿Ýî¶HÍûA“ƒÓ!m¡Öâþ}ÞÏÓk¾¹¶Ð,àõFn¨ç7F}SRY>Ðä`{Q©l/ÚB!ì‰ë_þ¶:þ”H­Ï·j{S©ô/Õ59¢½+€T®Ðê{ûÛ MŽ,¯7ü?>×äˆV}oDHÝy¿Þêû½wþ—Heÿ¢ÐäÈö •㹺&G„»Ô59¢¿T©ô—š/@jÖ/©YŸÞ®ýûHÍòw 5æO MŽZ»î7 Ðäàò•z~#ËÃTÖÇþ¥¼}ÕO@*ûs…&G¶©Ù^¡É‘å‰üÆ,©šôW@*Çcu µØò–ñ\Hé·:ý³öo÷xžU—·š¡mvÿÕTÖhrd{q 5æ¿:bà'lËoŒåší×59"œ¦Ré_*€ÔìÆ½g™H¥ÿ¨®Éãµ"¿‘óšõû‹&‡Håò‚ŽÛßVhrÔóÿÇpªHÍï5¢¼ùükÞ×[5ܦ¤²þŒ€ýz3æ7þ¾ÜCu„íþŸ—'49²þHÍïMެHp$𢤖ã]ëxé{¨²ÿšíšô¯uÆ~ ;Þgîú½f,'Ìø½¬®UhrÔ÷Óºg©H­ï{%Ü)€Ô,_©µò÷¶¿ëƒï¡ÊùÔEÞ׫Ž/ØC5Çc×ä ¿MŽì_6ü¿r?}îçÓ:ßÖ=kYŸ¡É‘ó3ßC•ãÁŽí¶Fœö‘ ¾t9­î2IBZ˸Ó=¢]äxƒY[ä ³¾ŒV­?¾·‚[Ðã ¯¿ž{©}Vå\o!¹‘K1빓ÿ×{-Œ8>ëRÛ¬JßxAƒ0ÿ"¬úÄó꼯§umc=÷^[Ëô8âu¿ûö÷ÿùíÏú‡¿þÅÇ_|÷í àÏGýûÝ_üÝ7»ÃûÇþx>~õ­}üÍç¿ÿa”¿ýÖ—íh hÿ·>xÂüÍÇw_‡i\â9îŠ%ü½›y»·ð¸›y°»™Çëåóñø/¾÷÷ÿåOÿËûÿôË¿ýù_}~ïÿõúՇÌìjÁÆnÛè~ÿÛŸÍÏŸ=?ÿøþß¿ýå÷vñ?ôkÛn¹þºýi?Ûr4þ^?ïpÜÁ½ûñ Pøù6_Nëh`–ãhZ<î--{¤’'D䲜{æù õóÍþ,_·‹m¯3 Þ:/ùgú¿Ðúñ²›ýXþ䟉Èg›²_Ï?ýסí×ãÿû4¨•ŸÍÒd¼Õ„ùöø¾ŸýÕŽÓ­ô.¼÷éË?ÿóNÛyé÷?|üŸÿ¨šÞñBí¹kì¾l£™ ÿŸoô?ûÅïÿåÇ_þüóøÇÏþï¯ü·ÿøýÏ?>{åŸýî—?üôÓÏÿùãû¿ùãš> endobj 10 0 obj << /Length 2460 /Filter /FlateDecode >> stream xœí]M5½÷¯ðâø£üuMH‘‚v%QˆR”e‰¿O•Û=3De^-c†™Cf·×ób»\U~®²ÝÞ<3Þ¼1–惉պ`Bk6ã½³­_“¥bî~6?˜÷Ëãûï¿}bžÞ,Î:çÌáçÍÓïø¯%™?–—¯Œ3¯ožñ¿7‹—/˜çË“Ûåñ7žë»ýE>î ÙFüM·þâC°…L ÍV.~g¾|û•¹}ÃÅ·wË×·ÿux³­™è£õ„À«Í w͇À“­Üxl­Xí¾t¸kœDfÏèŠÈl<ÚMÌÑRà±ÙèLLÅfhàtµŸ5<²¶F£ÇLF çÆ—Òí=%¤v²‘ –-§äÓÃÙÞ7>:PçÕð$w6 ­/¶!}WÂÙχ€Ã}C<~QÖºä»Ò¶ˆÀàDm'Qv|ŽSÖ¾Îq!Û ,ÏQ_§ ¸„L‘$å\;+_€\¥³ÉõqoÈ «tz?ŸEmA÷œ;|˜{E7®ê{‘Û”ÑÚ[²ŽúôŒ˜+ÓÐ; aº‘ƒ™Jtæ,¤±t%z]òÈÕL¡R¡•„JÉbû%ÔpIÅC•v¢†«g–‰ç9½F8¯¡„ ;;r/îL´œ“ix&K wNBI"vÄQÔ&7DR,XLèa¸L’CÐç&÷s†+ó¾»ì O{œ3£¡X½M’GóŸ:ô9rUþTôuFµEÛòi#–“8d‰Y;l‹°WÏeõêINŸ/ïì(Ô‰+¸wºôë[P 3FLî€Aì;É­ˆ‚F®lnÁœ3×ÚÉ“œDzåiÆ@ùî°ž…ÁöŒëyÆ[鑽,àÌŽjsŸ¸öÊ`jÑ#›V‘9´§Ñད*ôè7ûTBÅ«®¡ã­B×Òý¹ro–k$tu0z³PìüѰPTæ*MU[¨«MuŠñrý¿Ò¾ÑS[cÏ8D›S÷Ȋ샕ÙzäÚ—dëÙOM`TúÍÐdz¦ØãúLž+bR_BSnÐUÜ:´²å:©Qß¹Å-/À€ï[ŽœË`t 8ºô=H%ÉãÑMbéT2t“ó`èhݪñ΢Âh’Iˆr¿Éñè,4‘гëwXÑÈ÷­å`¿‡ÌA=﹩Җػ¸wèhÐJvRk÷`trj ͺJ\Ql ÒT^ÐÔ@#oVØ{‡ è&æ!hä¬Í+‚R[íõ-Cæ GÖµ|èX·ÎŸëfêù6qãâ¡’Õ rÄÐT¥É”úË,NÜïTû Ì™Rw•÷( :#6ú ò5*«}c3°ÜæÖà89Ùü£Cd¢eMÅ1M±Ÿ¬X§3X[‚lDVèZFŒež¬kÛˆÁšJ ïžE©y¤åÃÆ`tÅûÍ-—¸$h¡ºõØf¡ zølÄØ·ô9ÔÙˆµ¼$œa?»Ñ}€WÌQ!è¦KVp9#€¢£¼xŒørA)+™œùb4ây ÛjßEÁ×0 Ýx‹ƒnRΩÇcA´$3cg¹ÈÚŸÑ’e4ÂÏ)¬VBÐ)нßÜ}D5sÁ1UFøÚùFç®è™Q0®øï¡_˜Ëãûï¿}bžÞ,<Ïr÷?ož~Çå‰ðåå+½^¼yÆÿÞ,²çÞ™çKJ’’­ ±{×_ÙêöüÖÜ|ü…í±Û¼”W/¸+ßw岑'²} Ûóþ©ó  »oˆŒz'ºÿ›NÞÿôžEVV;þ¾~ôGæ!‰L¨»÷ä= N¤¸ÿ'°¥Ÿ’<ÄúÏÆöüE9>4TÙ&}ÝW+»@‚‰¾‰ß™õ‘J‘WΊ´>.òÒéñxPNI8í®|}<(ç©”Ùú®|}<(—½µe_¾>îËe»0ëïV>ÊS÷à»òõñ |íЮ|ß¿CÙí%öh/Fy]¶ç‡mÁ?ŒÙ§ÀûTÝÑм;½}|µ¶ÙðïUôXÙr:öHÇ£±”·Œ,eÆ6t4}¤£›I/^–;'ðv{&ÙcÃJ¹ ù_wß¾77ª”•7›G®Ow?›Ì{­—àÊ+[œ8ÜuŽxýÅÛÿla”þJ¹Î%mèßÞÿºÁ_,c-A%endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R 9 0 R ] /Count 2 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 12 0 R /F2 13 0 R /F3 14 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óûendstream endobj 11 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 13 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 11 0 R >> endobj 14 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 11 0 R >> endobj xref 0 15 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000071166 00000 n 0000071255 00000 n 0000071390 00000 n 0000071423 00000 n 0000000212 00000 n 0000000292 00000 n 0000068552 00000 n 0000068633 00000 n 0000074118 00000 n 0000074376 00000 n 0000074460 00000 n 0000074558 00000 n trailer << /Size 15 /Info 1 0 R /Root 2 0 R >> startxref 74661 %%EOF stephaneguindon-phyml-76a39c8/doc/naturemag.bst000066400000000000000000001070471501136442400216550ustar00rootroot00000000000000%% %% This is file `naturemag.bst', %% generated with the docstrip utility. %% %% The original source files were: %% %% merlin.mbs (with options: `head,seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% physjour.mbs (with options: `seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% geojour.mbs (with options: `seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% photjour.mbs (with options: `seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% merlin.mbs (with options: `tail,seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% ---------------------------------------- %% *** Style for the journal Nature (created by Peter Czoschke) *** %% %% Copyright 1994-2002 Patrick W Daly % =============================================================== % IMPORTANT NOTICE: % This bibliographic style (bst) file has been generated from one or % more master bibliographic style (mbs) files, listed above. % % This generated file can be redistributed and/or modified under the terms % of the LaTeX Project Public License Distributed from CTAN % archives in directory macros/latex/base/lppl.txt; either % version 1 of the License, or any later version. % =============================================================== % Name and version information of the main mbs file: % \ProvidesFile{merlin.mbs}[2002/10/21 4.05 (PWD, AO, DPC)] % For use with BibTeX version 0.99a or later %------------------------------------------------------------------- % This bibliography style file is intended for texts in ENGLISH % This is a numerical citation style, and as such is standard LaTeX. % It requires no extra package to interface to the main text. % The form of the \bibitem entries is % \bibitem{key}... % Usage of \cite is as follows: % \cite{key} ==>> [#] % \cite[chap. 2]{key} ==>> [#, chap. 2] % where # is a number determined by the ordering in the reference list. % The order in the reference list is that by which the works were originally % cited in the text, or that in the database. %--------------------------------------------------------------------- ENTRY { address archive author booktitle chapter edition editor eprint howpublished institution journal key month note number organization pages publisher school series title type url volume year } {} { label } INTEGERS { output.state before.all mid.sentence after.sentence after.block } FUNCTION {init.state.consts} { #0 'before.all := #1 'mid.sentence := #2 'after.sentence := #3 'after.block := } STRINGS { s t} FUNCTION {output.nonnull} { 's := output.state mid.sentence = { ", " * write$ } { output.state after.block = { add.period$ write$ newline$ "\newblock " write$ } { output.state before.all = 'write$ { add.period$ " " * write$ } if$ } if$ mid.sentence 'output.state := } if$ s } FUNCTION {output} { duplicate$ empty$ 'pop$ 'output.nonnull if$ } FUNCTION {output.check} { 't := duplicate$ empty$ { pop$ "empty " t * " in " * cite$ * warning$ } 'output.nonnull if$ } FUNCTION {fin.entry} { add.period$ write$ newline$ } FUNCTION {new.block} { output.state before.all = 'skip$ { after.block 'output.state := } if$ } FUNCTION {new.sentence} { output.state after.block = 'skip$ { output.state before.all = 'skip$ { after.sentence 'output.state := } if$ } if$ } FUNCTION {add.blank} { " " * before.all 'output.state := } FUNCTION {date.block} { new.block } FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { 'skip$ { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } 'skip$ if$ } FUNCTION {new.block.checka} { empty$ 'skip$ 'new.block if$ } FUNCTION {new.block.checkb} { empty$ swap$ empty$ and 'skip$ 'new.block if$ } FUNCTION {new.sentence.checka} { empty$ 'skip$ 'new.sentence if$ } FUNCTION {new.sentence.checkb} { empty$ swap$ empty$ and 'skip$ 'new.sentence if$ } FUNCTION {field.or.null} { duplicate$ empty$ { pop$ "" } 'skip$ if$ } FUNCTION {emphasize} { duplicate$ empty$ { pop$ "" } { "\emph{" swap$ * "}" * } if$ } FUNCTION {bolden} { duplicate$ empty$ { pop$ "" } { "\textbf{" swap$ * "}" * } if$ } FUNCTION {tie.or.space.prefix} { duplicate$ text.length$ #3 < { "~" } { " " } if$ swap$ } FUNCTION {capitalize} { "u" change.case$ "t" change.case$ } FUNCTION {space.word} { " " swap$ * " " * } % Here are the language-specific definitions for explicit words. % Each function has a name bbl.xxx where xxx is the English word. % The language selected here is ENGLISH FUNCTION {bbl.and} { "and"} FUNCTION {bbl.etal} { "et~al." } FUNCTION {bbl.editors} { "eds." } FUNCTION {bbl.editor} { "ed." } FUNCTION {bbl.edby} { "edited by" } FUNCTION {bbl.edition} { "edn." } FUNCTION {bbl.volume} { "vol." } FUNCTION {bbl.of} { "of" } FUNCTION {bbl.number} { "no." } FUNCTION {bbl.nr} { "no." } FUNCTION {bbl.in} { "in" } FUNCTION {bbl.pages} { "" } FUNCTION {bbl.page} { "" } FUNCTION {bbl.chapter} { "chap." } FUNCTION {bbl.techrep} { "Tech. Rep." } FUNCTION {bbl.mthesis} { "Master's thesis" } FUNCTION {bbl.phdthesis} { "Ph.D. thesis" } MACRO {jan} {"Jan."} MACRO {feb} {"Feb."} MACRO {mar} {"Mar."} MACRO {apr} {"Apr."} MACRO {may} {"May"} MACRO {jun} {"Jun."} MACRO {jul} {"Jul."} MACRO {aug} {"Aug."} MACRO {sep} {"Sep."} MACRO {oct} {"Oct."} MACRO {nov} {"Nov."} MACRO {dec} {"Dec."} %------------------------------------------------------------------- % Begin module: % \ProvidesFile{physjour.mbs}[2002/01/14 2.2 (PWD)] MACRO {aa}{"Astron. \& Astrophys."} MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."} MACRO {aj} {"Astron. J."} MACRO {aph} {"Acta Phys."} MACRO {advp} {"Adv. Phys."} MACRO {ajp} {"Amer. J. Phys."} MACRO {ajm} {"Amer. J. Math."} MACRO {amsci} {"Amer. Sci."} MACRO {anofd} {"Ann. Fluid Dyn."} MACRO {am} {"Ann. Math."} MACRO {ap} {"Ann. Phys. (NY)"} MACRO {adp} {"Ann. Phys. (Leipzig)"} MACRO {ao} {"Appl. Opt."} MACRO {apl} {"Appl. Phys. Lett."} MACRO {app} {"Astroparticle Phys."} MACRO {apj} {"Astrophys. J."} MACRO {apjsup} {"Astrophys. J. Suppl."} MACRO {apss} {"Astrophys. Space Sci."} MACRO {araa} {"Ann. Rev. Astron. Astrophys."} MACRO {baas} {"Bull. Amer. Astron. Soc."} MACRO {baps} {"Bull. Amer. Phys. Soc."} MACRO {cmp} {"Comm. Math. Phys."} MACRO {cpam} {"Commun. Pure Appl. Math."} MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"} MACRO {cpc} {"Comp. Phys. Comm."} MACRO {cqg} {"Class. Quant. Grav."} MACRO {cra} {"C. R. Acad. Sci. A"} MACRO {fed} {"Fusion Eng. \& Design"} MACRO {ft} {"Fusion Tech."} MACRO {grg} {"Gen. Relativ. Gravit."} MACRO {ieeens} {"IEEE Trans. Nucl. Sci."} MACRO {ieeeps} {"IEEE Trans. Plasma Sci."} MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"} MACRO {ip} {"Infrared Phys."} MACRO {irp} {"Infrared Phys."} MACRO {jap} {"J. Appl. Phys."} MACRO {jasa} {"J. Acoust. Soc. America"} MACRO {jcp} {"J. Comp. Phys."} MACRO {jetp} {"Sov. Phys.--JETP"} MACRO {jfe} {"J. Fusion Energy"} MACRO {jfm} {"J. Fluid Mech."} MACRO {jmp} {"J. Math. Phys."} MACRO {jne} {"J. Nucl. Energy"} MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."} MACRO {jnm} {"J. Nucl. Mat."} MACRO {jpc} {"J. Phys. Chem."} MACRO {jpp} {"J. Plasma Phys."} MACRO {jpsj} {"J. Phys. Soc. Japan"} MACRO {jsi} {"J. Sci. Instrum."} MACRO {jvst} {"J. Vac. Sci. \& Tech."} MACRO {nat} {"Nature"} MACRO {nature} {"Nature"} MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"} MACRO {nf} {"Nucl. Fusion"} MACRO {nim} {"Nucl. Inst. \& Meth."} MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."} MACRO {np} {"Nucl. Phys."} MACRO {npb} {"Nucl. Phys. B"} MACRO {nt/f} {"Nucl. Tech./Fusion"} MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"} MACRO {inc} {"Nuovo Cimento"} MACRO {nc} {"Nuovo Cimento"} MACRO {pf} {"Phys. Fluids"} MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."} MACRO {pfb} {"Phys. Fluids B: Plasma Phys."} MACRO {pl} {"Phys. Lett."} MACRO {pla} {"Phys. Lett. A"} MACRO {plb} {"Phys. Lett. B"} MACRO {prep} {"Phys. Rep."} MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"} MACRO {pp} {"Phys. Plasmas"} MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"} MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"} MACRO {prl} {"Phys. Rev. Lett."} MACRO {pr} {"Phys. Rev."} MACRO {physrev} {"Phys. Rev."} MACRO {pra} {"Phys. Rev. A"} MACRO {prb} {"Phys. Rev. B"} MACRO {prc} {"Phys. Rev. C"} MACRO {prd} {"Phys. Rev. D"} MACRO {pre} {"Phys. Rev. E"} MACRO {ps} {"Phys. Scripta"} MACRO {procrsl} {"Proc. Roy. Soc. London"} MACRO {rmp} {"Rev. Mod. Phys."} MACRO {rsi} {"Rev. Sci. Inst."} MACRO {science} {"Science"} MACRO {sciam} {"Sci. Am."} MACRO {sam} {"Stud. Appl. Math."} MACRO {sjpp} {"Sov. J. Plasma Phys."} MACRO {spd} {"Sov. Phys.--Doklady"} MACRO {sptp} {"Sov. Phys.--Tech. Phys."} MACRO {spu} {"Sov. Phys.--Uspeki"} MACRO {st} {"Sky and Telesc."} % End module: physjour.mbs %------------------------------------------------------------------- % Begin module: % \ProvidesFile{geojour.mbs}[2002/07/10 2.0h (PWD)] MACRO {aisr} {"Adv. Space Res."} MACRO {ag} {"Ann. Geophys."} MACRO {anigeo} {"Ann. Geofis."} MACRO {angl} {"Ann. Glaciol."} MACRO {andmet} {"Ann. d. Meteor."} MACRO {andgeo} {"Ann. d. Geophys."} MACRO {andphy} {"Ann. Phys.-Paris"} MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."} MACRO {atph} {"Atm\'osphera"} MACRO {aao} {"Atmos. Ocean"} MACRO {ass}{"Astrophys. Space Sci."} MACRO {atenv} {"Atmos. Environ."} MACRO {aujag} {"Aust. J. Agr. Res."} MACRO {aumet} {"Aust. Meteorol. Mag."} MACRO {blmet} {"Bound.-Lay. Meteorol."} MACRO {bams} {"Bull. Amer. Meteorol. Soc."} MACRO {cch} {"Clim. Change"} MACRO {cdyn} {"Clim. Dynam."} MACRO {cbul} {"Climatol. Bull."} MACRO {cap} {"Contrib. Atmos. Phys."} MACRO {dsr} {"Deep-Sea Res."} MACRO {dhz} {"Dtsch. Hydrogr. Z."} MACRO {dao} {"Dynam. Atmos. Oceans"} MACRO {eco} {"Ecology"} MACRO {empl}{"Earth, Moon and Planets"} MACRO {envres} {"Environ. Res."} MACRO {envst} {"Environ. Sci. Technol."} MACRO {ecms} {"Estuarine Coastal Mar. Sci."} MACRO {expa}{"Exper. Astron."} MACRO {geoint} {"Geofis. Int."} MACRO {geopub} {"Geofys. Publ."} MACRO {geogeo} {"Geol. Geofiz."} MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."} MACRO {gfd} {"Geophys. Fluid Dyn."} MACRO {geomag} {"Geophys. Mag."} MACRO {georl} {"Geophys. Res. Lett."} MACRO {grl} {"Geophys. Res. Lett."} MACRO {ga} {"Geophysica"} MACRO {gs} {"Geophysics"} MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."} MACRO {ijawp} {"Int. J. Air Water Pollut."} MACRO {ijc} {"Int. J. Climatol."} MACRO {ijrs} {"Int. J. Remote Sens."} MACRO {jam} {"J. Appl. Meteorol."} MACRO {jaot} {"J. Atmos. Ocean. Technol."} MACRO {jatp} {"J. Atmos. Terr. Phys."} MACRO {jastp} {"J. Atmos. Solar-Terr. Phys."} MACRO {jce} {"J. Climate"} MACRO {jcam} {"J. Climate Appl. Meteor."} MACRO {jcm} {"J. Climate Meteor."} MACRO {jcy} {"J. Climatol."} MACRO {jgr} {"J. Geophys. Res."} MACRO {jga} {"J. Glaciol."} MACRO {jh} {"J. Hydrol."} MACRO {jmr} {"J. Mar. Res."} MACRO {jmrj} {"J. Meteor. Res. Japan"} MACRO {jm} {"J. Meteor."} MACRO {jpo} {"J. Phys. Oceanogr."} MACRO {jra} {"J. Rech. Atmos."} MACRO {jaes} {"J. Aeronaut. Sci."} MACRO {japca} {"J. Air Pollut. Control Assoc."} MACRO {jas} {"J. Atmos. Sci."} MACRO {jmts} {"J. Mar. Technol. Soc."} MACRO {jmsj} {"J. Meteorol. Soc. Japan"} MACRO {josj} {"J. Oceanogr. Soc. Japan"} MACRO {jwm} {"J. Wea. Mod."} MACRO {lao} {"Limnol. Oceanogr."} MACRO {mwl} {"Mar. Wea. Log"} MACRO {mau} {"Mausam"} MACRO {meteor} {"``Meteor'' Forschungsergeb."} MACRO {map} {"Meteorol. Atmos. Phys."} MACRO {metmag} {"Meteor. Mag."} MACRO {metmon} {"Meteor. Monogr."} MACRO {metrun} {"Meteor. Rundsch."} MACRO {metzeit} {"Meteor. Z."} MACRO {metgid} {"Meteor. Gidrol."} MACRO {mwr} {"Mon. Weather Rev."} MACRO {nwd} {"Natl. Weather Dig."} MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."} MACRO {npg} {"Nonlin. Proc. Geophys."} MACRO {om} {"Oceanogr. Meteorol."} MACRO {ocac} {"Oceanol. Acta"} MACRO {oceanus} {"Oceanus"} MACRO {paleoc} {"Paleoceanography"} MACRO {pce} {"Phys. Chem. Earth"} MACRO {pmg} {"Pap. Meteor. Geophys."} MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."} MACRO {physzeit} {"Phys. Z."} MACRO {pps} {"Planet. Space Sci."} MACRO {pss} {"Planet. Space Sci."} MACRO {pag} {"Pure Appl. Geophys."} MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."} MACRO {quatres} {"Quat. Res."} MACRO {rsci} {"Radio Sci."} MACRO {rse} {"Remote Sens. Environ."} MACRO {rgeo} {"Rev. Geophys."} MACRO {rgsp} {"Rev. Geophys. Space Phys."} MACRO {rdgeo} {"Rev. Geofis."} MACRO {revmeta} {"Rev. Meteorol."} MACRO {sgp}{"Surveys in Geophys."} MACRO {sp} {"Solar Phys."} MACRO {ssr} {"Space Sci. Rev."} MACRO {tellus} {"Tellus"} MACRO {tac} {"Theor. Appl. Climatol."} MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"} MACRO {wrr} {"Water Resour. Res."} MACRO {weather} {"Weather"} MACRO {wafc} {"Weather Forecast."} MACRO {ww} {"Weatherwise"} MACRO {wmob} {"WMO Bull."} MACRO {zeitmet} {"Z. Meteorol."} % End module: geojour.mbs %------------------------------------------------------------------- % Begin module: % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)] MACRO {appopt} {"Appl. Opt."} MACRO {bell} {"Bell Syst. Tech. J."} MACRO {ell} {"Electron. Lett."} MACRO {jasp} {"J. Appl. Spectr."} MACRO {jqe} {"IEEE J. Quantum Electron."} MACRO {jlwt} {"J. Lightwave Technol."} MACRO {jmo} {"J. Mod. Opt."} MACRO {josa} {"J. Opt. Soc. America"} MACRO {josaa} {"J. Opt. Soc. Amer.~A"} MACRO {josab} {"J. Opt. Soc. Amer.~B"} MACRO {jdp} {"J. Phys. (Paris)"} MACRO {oc} {"Opt. Commun."} MACRO {ol} {"Opt. Lett."} MACRO {phtl} {"IEEE Photon. Technol. Lett."} MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."} MACRO {sse} {"Solid-State Electron."} MACRO {sjot} {"Sov. J. Opt. Technol."} MACRO {sjqe} {"Sov. J. Quantum Electron."} MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."} MACRO {stph} {"Sov. Phys.--Techn. Phys."} MACRO {stphl} {"Sov. Techn. Phys. Lett."} MACRO {vr} {"Vision Res."} MACRO {zph} {"Z. f. Physik"} MACRO {zphb} {"Z. f. Physik~B"} MACRO {zphd} {"Z. f. Physik~D"} MACRO {CLEO} {"CLEO"} MACRO {ASSL} {"Adv. Sol.-State Lasers"} MACRO {OSA} {"OSA"} % End module: photjour.mbs %% Copyright 1994-2002 Patrick W Daly MACRO {acmcs} {"ACM Comput. Surv."} MACRO {acta} {"Acta Inf."} MACRO {cacm} {"Commun. ACM"} MACRO {ibmjrd} {"IBM J. Res. Dev."} MACRO {ibmsj} {"IBM Syst.~J."} MACRO {ieeese} {"IEEE Trans. Software Eng."} MACRO {ieeetc} {"IEEE Trans. Comput."} MACRO {ieeetcad} {"IEEE Trans. Comput. Aid. Des."} MACRO {ipl} {"Inf. Process. Lett."} MACRO {jacm} {"J.~ACM"} MACRO {jcss} {"J.~Comput. Syst. Sci."} MACRO {scp} {"Sci. Comput. Program."} MACRO {sicomp} {"SIAM J. Comput."} MACRO {tocs} {"ACM Trans. Comput. Syst."} MACRO {tods} {"ACM Trans. Database Syst."} MACRO {tog} {"ACM Trans. Graphic."} MACRO {toms} {"ACM Trans. Math. Software"} MACRO {toois} {"ACM Trans. Office Inf. Syst."} MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} MACRO {tcs} {"Theor. Comput. Sci."} FUNCTION {bibinfo.check} { swap$ duplicate$ missing$ { pop$ pop$ "" } { duplicate$ empty$ { swap$ pop$ } { swap$ "\bibinfo{" swap$ * "}{" * swap$ * "}" * } if$ } if$ } FUNCTION {bibinfo.warn} { swap$ duplicate$ missing$ { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } { duplicate$ empty$ { swap$ "empty " swap$ * " in " * cite$ * warning$ } { swap$ "\bibinfo{" swap$ * "}{" * swap$ * "}" * } if$ } if$ } FUNCTION {format.eprint} { eprint duplicate$ empty$ 'skip$ { "\eprint" archive empty$ 'skip$ { "[" * archive * "]" * } if$ "{" * swap$ * "}" * } if$ } FUNCTION {format.url} { url empty$ { "" } { "\urlprefix\url{" url * "}" * } if$ } STRINGS { bibinfo} INTEGERS { nameptr namesleft numnames } FUNCTION {format.names} { 'bibinfo := duplicate$ empty$ 'skip$ { 's := "" 't := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{vv~}{ll}{, f.}{, jj}" format.name$ bibinfo bibinfo.check 't := nameptr #1 > { nameptr #1 #1 + = numnames #5 > and { "others" 't := #1 'namesleft := } 'skip$ if$ namesleft #1 > { ", " * t * } { s nameptr "{ll}" format.name$ duplicate$ "others" = { 't := } { pop$ } if$ t "others" = { " " * bbl.etal emphasize * } { "\&" space.word * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } if$ } FUNCTION {format.names.ed} { format.names } FUNCTION {format.authors} { author "author" format.names } FUNCTION {get.bbl.editor} { editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } FUNCTION {format.editors} { editor "editor" format.names duplicate$ empty$ 'skip$ { " " * get.bbl.editor "(" swap$ * ")" * * } if$ } FUNCTION {format.note} { note empty$ { "" } { note #1 #1 substring$ duplicate$ "{" = 'skip$ { output.state mid.sentence = { "l" } { "u" } if$ change.case$ } if$ note #2 global.max$ substring$ * "note" bibinfo.check } if$ } FUNCTION {format.title} { title duplicate$ empty$ 'skip$ { "t" change.case$ } if$ "title" bibinfo.check } FUNCTION {output.bibitem} { newline$ "\bibitem{" write$ cite$ write$ "}" write$ newline$ "" before.all 'output.state := } FUNCTION {n.dashify} { 't := "" { t empty$ not } { t #1 #1 substring$ "-" = { t #1 #2 substring$ "--" = not { "--" * t #2 global.max$ substring$ 't := } { { t #1 #1 substring$ "-" = } { "-" * t #2 global.max$ substring$ 't := } while$ } if$ } { t #1 #1 substring$ * t #2 global.max$ substring$ 't := } if$ } while$ } FUNCTION {word.in} { bbl.in capitalize " " * } FUNCTION {format.date} { "" duplicate$ empty$ year "year" bibinfo.check duplicate$ empty$ { swap$ 'skip$ { "there's a month but no year in " cite$ * warning$ } if$ * } { swap$ 'skip$ { swap$ " " * swap$ } if$ * } if$ duplicate$ empty$ 'skip$ { before.all 'output.state := " (" swap$ * ")" * } if$ } FUNCTION {format.btitle} { title "title" bibinfo.check duplicate$ empty$ 'skip$ { emphasize } if$ } FUNCTION {either.or.check} { empty$ 'pop$ { "can't use both " swap$ * " fields in " * cite$ * warning$ } if$ } FUNCTION {format.bvolume} { volume empty$ { "" } { bbl.volume volume tie.or.space.prefix "volume" bibinfo.check * * series "series" bibinfo.check duplicate$ empty$ 'pop$ { swap$ bbl.of space.word * swap$ emphasize * } if$ "volume and number" number either.or.check } if$ } FUNCTION {format.number.series} { volume empty$ { number empty$ { series field.or.null } { series empty$ { number "number" bibinfo.check } { output.state mid.sentence = { bbl.number } { bbl.number capitalize } if$ number tie.or.space.prefix "number" bibinfo.check * * bbl.in space.word * series "series" bibinfo.check * } if$ } if$ } { "" } if$ } FUNCTION {format.edition} { edition duplicate$ empty$ 'skip$ { output.state mid.sentence = { "l" } { "t" } if$ change.case$ "edition" bibinfo.check " " * bbl.edition * } if$ } INTEGERS { multiresult } FUNCTION {multi.page.check} { 't := #0 'multiresult := { multiresult not t empty$ not and } { t #1 #1 substring$ duplicate$ "-" = swap$ duplicate$ "," = swap$ "+" = or or { #1 'multiresult := } { t #2 global.max$ substring$ 't := } if$ } while$ multiresult } FUNCTION {format.pages} { pages duplicate$ empty$ 'skip$ { duplicate$ multi.page.check { n.dashify } { } if$ "pages" bibinfo.check } if$ } FUNCTION {format.journal.pages} { pages duplicate$ empty$ 'pop$ { swap$ duplicate$ empty$ { pop$ pop$ format.pages } { ", " * swap$ n.dashify "pages" bibinfo.check * } if$ } if$ } FUNCTION {format.vol.num.pages} { volume field.or.null duplicate$ empty$ 'skip$ { "volume" bibinfo.check } if$ bolden format.journal.pages } FUNCTION {format.chapter.pages} { chapter empty$ 'format.pages { type empty$ { bbl.chapter } { type "l" change.case$ "type" bibinfo.check } if$ chapter tie.or.space.prefix "chapter" bibinfo.check * * pages empty$ 'skip$ { ", " * format.pages * } if$ } if$ } FUNCTION {format.booktitle} { booktitle "booktitle" bibinfo.check emphasize } FUNCTION {format.in.ed.booktitle} { format.booktitle duplicate$ empty$ 'skip$ { editor "editor" format.names.ed duplicate$ empty$ 'pop$ { " " * get.bbl.editor "(" swap$ * ") " * * swap$ * } if$ word.in swap$ * } if$ } FUNCTION {empty.misc.check} { author empty$ title empty$ howpublished empty$ month empty$ year empty$ note empty$ and and and and and { "all relevant fields are empty in " cite$ * warning$ } 'skip$ if$ } FUNCTION {format.thesis.type} { type duplicate$ empty$ 'pop$ { swap$ pop$ "t" change.case$ "type" bibinfo.check } if$ } FUNCTION {format.tr.number} { number "number" bibinfo.check type duplicate$ empty$ { pop$ bbl.techrep } 'skip$ if$ "type" bibinfo.check swap$ duplicate$ empty$ { pop$ "t" change.case$ } { tie.or.space.prefix * * } if$ } FUNCTION {format.article.crossref} { key duplicate$ empty$ { pop$ journal duplicate$ empty$ { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } { "journal" bibinfo.check emphasize word.in swap$ * } if$ } { word.in swap$ * " " *} if$ " \cite{" * crossref * "}" * } FUNCTION {format.crossref.editor} { editor #1 "{vv~}{ll}" format.name$ "editor" bibinfo.check editor num.names$ duplicate$ #2 > { pop$ "editor" bibinfo.check " " * bbl.etal emphasize * } { #2 < 'skip$ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = { "editor" bibinfo.check " " * bbl.etal emphasize * } { " \& " * editor #2 "{vv~}{ll}" format.name$ "editor" bibinfo.check * } if$ } if$ } if$ } FUNCTION {format.book.crossref} { volume duplicate$ empty$ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ pop$ word.in } { bbl.volume capitalize swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * } if$ editor empty$ editor field.or.null author field.or.null = or { key empty$ { series empty$ { "need editor, key, or series for " cite$ * " to crossref " * crossref * warning$ "" * } { series emphasize * } if$ } { key * } if$ } { format.crossref.editor * } if$ " \cite{" * crossref * "}" * } FUNCTION {format.incoll.inproc.crossref} { editor empty$ editor field.or.null author field.or.null = or { key empty$ { format.booktitle duplicate$ empty$ { "need editor, key, or booktitle for " cite$ * " to crossref " * crossref * warning$ } { word.in swap$ * } if$ } { word.in key * " " *} if$ } { word.in format.crossref.editor * " " *} if$ " \cite{" * crossref * "}" * } FUNCTION {format.org.or.pub} { 't := "" year empty$ { "empty year in " cite$ * warning$ } 'skip$ if$ address empty$ t empty$ and year empty$ and 'skip$ { add.blank "(" * t empty$ { address "address" bibinfo.check * } { t * address empty$ 'skip$ { ", " * address "address" bibinfo.check * } if$ } if$ year empty$ 'skip$ { t empty$ address empty$ and 'skip$ { ", " * } if$ year "year" bibinfo.check * } if$ ")" * } if$ } FUNCTION {format.publisher.address} { publisher "publisher" bibinfo.warn format.org.or.pub } FUNCTION {format.organization.address} { organization "organization" bibinfo.check format.org.or.pub } FUNCTION {article} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { journal "journal" bibinfo.check emphasize "journal" output.check add.blank format.vol.num.pages output format.date "year" output.check } { format.article.crossref output.nonnull format.pages output } if$ new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {book} { output.bibitem author empty$ { format.editors "author and editor" output.check add.blank } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ new.block format.btitle "title" output.check crossref missing$ { format.bvolume output new.block format.number.series output new.sentence format.publisher.address output } { new.block format.book.crossref output.nonnull format.date "year" output.check } if$ format.edition output new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {booklet} { output.bibitem format.authors output new.block format.title "title" output.check new.block howpublished "howpublished" bibinfo.check output address "address" bibinfo.check output format.date output new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {inbook} { output.bibitem author empty$ { format.editors "author and editor" output.check } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ new.block format.btitle "title" output.check crossref missing$ { format.bvolume output format.chapter.pages "chapter and pages" output.check new.block format.number.series output new.sentence format.publisher.address output } { format.chapter.pages "chapter and pages" output.check new.block format.book.crossref output.nonnull format.date "year" output.check } if$ format.edition output new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {incollection} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.chapter.pages output new.sentence format.publisher.address output format.edition output } { format.incoll.inproc.crossref output.nonnull format.chapter.pages output } if$ new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {inproceedings} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.pages output new.sentence publisher empty$ { format.organization.address output } { organization "organization" bibinfo.check output format.publisher.address output } if$ } { format.incoll.inproc.crossref output.nonnull format.pages output } if$ new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {conference} { inproceedings } FUNCTION {manual} { output.bibitem author empty$ { organization "organization" bibinfo.check duplicate$ empty$ 'pop$ { output address "address" bibinfo.check output } if$ } { format.authors output.nonnull } if$ new.block format.btitle "title" output.check author empty$ { organization empty$ { address new.block.checka address "address" bibinfo.check output } 'skip$ if$ } { organization address new.block.checkb organization "organization" bibinfo.check output address "address" bibinfo.check output } if$ format.edition output format.date output new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {mastersthesis} { output.bibitem format.authors "author" output.check new.block format.btitle "title" output.check new.block bbl.mthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output format.date "year" output.check new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {misc} { output.bibitem format.authors output title howpublished new.block.checkb format.title output howpublished new.block.checka howpublished "howpublished" bibinfo.check output format.date output new.block format.url output new.block format.note output format.eprint output fin.entry empty.misc.check } FUNCTION {phdthesis} { output.bibitem format.authors "author" output.check new.block format.btitle "title" output.check new.block bbl.phdthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output format.date "year" output.check new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {proceedings} { output.bibitem editor empty$ { organization "organization" bibinfo.check output } { format.editors output.nonnull } if$ new.block format.btitle "title" output.check format.bvolume output format.number.series output editor empty$ { publisher empty$ 'skip$ { new.sentence format.publisher.address output } if$ } { publisher empty$ { new.sentence format.organization.address output } { new.sentence organization "organization" bibinfo.check output format.publisher.address output } if$ } if$ new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {techreport} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block format.tr.number output.nonnull institution "institution" bibinfo.warn output address "address" bibinfo.check output format.date "year" output.check new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {unpublished} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check format.date output new.block format.url output new.block format.note "note" output.check format.eprint output fin.entry } FUNCTION {default.type} { misc } READ STRINGS { longest.label } INTEGERS { number.label longest.label.width } FUNCTION {initialize.longest.label} { "" 'longest.label := #1 'number.label := #0 'longest.label.width := } FUNCTION {longest.label.pass} { number.label int.to.str$ 'label := number.label #1 + 'number.label := label width$ longest.label.width > { label 'longest.label := label width$ 'longest.label.width := } 'skip$ if$ } EXECUTE {initialize.longest.label} ITERATE {longest.label.pass} FUNCTION {begin.bib} { preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ "\begin{thebibliography}{" longest.label * "}" * write$ newline$ "\expandafter\ifx\csname url\endcsname\relax" write$ newline$ " \def\url#1{\texttt{#1}}\fi" write$ newline$ "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi" write$ newline$ "\providecommand{\bibinfo}[2]{#2}" write$ newline$ "\providecommand{\eprint}[2][]{\url{#2}}" write$ newline$ } EXECUTE {begin.bib} EXECUTE {init.state.consts} ITERATE {call.type$} FUNCTION {end.bib} { newline$ "\end{thebibliography}" write$ newline$ } EXECUTE {end.bib} %% End of customized bst file %% %% End of file `nature.bst'. stephaneguindon-phyml-76a39c8/doc/phyml-manual.aux000066400000000000000000000420661501136442400223020ustar00rootroot00000000000000\relax \providecommand\hyper@newdestlabel[2]{} \providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} \HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined \global\let\oldcontentsline\contentsline \gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} \global\let\oldnewlabel\newlabel \gdef\newlabel#1#2{\newlabelxx{#1}#2} \gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} \AtEndDocument{\ifx\hyper@anchor\@undefined \let\contentsline\oldcontentsline \let\newlabel\oldnewlabel \fi} \fi} \global\let\hyper@last\relax \gdef\HyperFirstAtBeginDocument#1{#1} \providecommand\HyField@AuxAddToFields[1]{} \providecommand\HyField@AuxAddToCoFields[2]{} \@writefile{toc}{\contentsline {section}{\numberline {1}Availability}{5}{section.1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {2}Authors}{5}{section.2}\protected@file@percent } \citation{guindon03} \citation{raxml} \citation{garli} \@writefile{toc}{\contentsline {section}{\numberline {3}Overview}{6}{section.3}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {4}Bug report}{6}{section.4}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {5}Installing PhyML}{6}{section.5}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {5.1}Sources and compilation}{6}{subsection.5.1}\protected@file@percent } \newlabel{ddd}{{5.1}{7}{Sources and compilation}{subsection.5.1}{}} \newlabel{gprof}{{5.1}{7}{Sources and compilation}{subsection.5.1}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {5.2}Installing PhyML on UNIX-like systems (including Mac OS)}{7}{subsection.5.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {5.3}Installing PhyML on Microsoft Windows}{7}{subsection.5.3}\protected@file@percent } \newlabel{sec:install-windows}{{5.3}{7}{Installing PhyML on Microsoft Windows}{subsection.5.3}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {5.4}Installing the parallel version of PhyML}{7}{subsection.5.4}\protected@file@percent } \newlabel{sec:MPI}{{5.4}{7}{Installing the parallel version of PhyML}{subsection.5.4}{}} \citation{ayres12} \@writefile{toc}{\contentsline {subsection}{\numberline {5.5}Installing PhyML-BEAGLE}{8}{subsection.5.5}\protected@file@percent } \newlabel{sec:install-phyml-beagle}{{5.5}{8}{Installing PhyML-BEAGLE}{subsection.5.5}{}} \@writefile{toc}{\contentsline {section}{\numberline {6}Program usage.}{9}{section.6}\protected@file@percent } \newlabel{sec:phyml_new}{{6}{9}{Program usage}{section.6}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {6.1}PHYLIP-like interface}{9}{subsection.6.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {6.1.1}Input Data sub-menu}{9}{subsubsection.6.1.1}\protected@file@percent } \citation{jukes69} \citation{kimura80} \citation{felsenstein81a} \citation{phylip2} \citation{hasegawa85} \citation{tamura93} \citation{lanave84,tavare86} \citation{le08} \citation{whelan01b} \citation{dayhoff78} \citation{jones92} \citation{henikoff92} \citation{adachi96} \citation{dimmic02} \citation{adachi00} \citation{kosiol04} \citation{muller00} \citation{cao98} \@writefile{toc}{\contentsline {subsubsection}{\numberline {6.1.2}Substitution model sub-menu}{10}{subsubsection.6.1.2}\protected@file@percent } \newlabel{sec:submenus}{{6.1.2}{10}{Substitution model sub-menu}{subsubsection.6.1.2}{}} \citation{guindon03} \@writefile{toc}{\contentsline {subsubsection}{\numberline {6.1.3}Tree searching sub-menu}{13}{subsubsection.6.1.3}\protected@file@percent } \citation{gascuelNJ} \citation{anisimova11} \citation{anisimova06} \@writefile{toc}{\contentsline {subsubsection}{\numberline {6.1.4}Branch support sub-menu}{14}{subsubsection.6.1.4}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {6.2}Command-line interface}{15}{subsection.6.2}\protected@file@percent } \citation{posada01} \citation{posada01} \@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Nucleotide substitution model names (as defined in \cite {posada01}) and the corresponding custom model code used in PhyML.}}{17}{table.1}\protected@file@percent } \newlabel{tab:modelcode}{{1}{17}{Nucleotide substitution model names (as defined in \cite {posada01}) and the corresponding custom model code used in PhyML}{table.1}{}} \citation{soubrier12} \citation{guindon13} \@writefile{toc}{\contentsline {subsection}{\numberline {6.3}XML interface}{21}{subsection.6.3}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {6.4}Parallel bootstrap}{21}{subsection.6.4}\protected@file@percent } \newlabel{sec:parallel_bootstrap}{{6.4}{21}{Parallel bootstrap}{subsection.6.4}{}} \citation{maddison97} \@writefile{toc}{\contentsline {section}{\numberline {7}Inputs \& outputs for command-line and PHYLIP interface }{22}{section.7}\protected@file@percent } \newlabel{sec:input_output}{{7}{22}{Inputs \& outputs for command-line and PHYLIP interface}{section.7}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {7.1}Sequence formats}{22}{subsection.7.1}\protected@file@percent } \newlabel{fig:align_tree}{{7.1}{23}{Sequence formats}{subsection.7.1}{}} \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces \bf PHYLIP interleaved and sequential formats.}}{23}{figure.1}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces \bf NEXUS formats.}}{24}{figure.2}\protected@file@percent } \newlabel{fig:nexus}{{2}{24}{\bf NEXUS formats}{figure.2}{}} \@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces {\bf List of valid characters in DNA sequences and the corresponding nucleotides.}}}{25}{table.2}\protected@file@percent } \newlabel{tab:ambigu_nt}{{2}{25}{\bf List of valid characters in DNA sequences and the corresponding nucleotides}{table.2}{}} \@writefile{toc}{\contentsline {subsubsection}{\numberline {7.1.1}Gaps and ambiguous characters}{25}{subsubsection.7.1.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {7.1.2}Specifying outgroup sequences}{25}{subsubsection.7.1.2}\protected@file@percent } \newlabel{sec:outgroupspecify}{{7.1.2}{25}{Specifying outgroup sequences}{subsubsection.7.1.2}{}} \@writefile{lot}{\contentsline {table}{\numberline {3}{\ignorespaces {\bf List of valid characters in protein sequences and the corresponding amino acids.}}}{26}{table.3}\protected@file@percent } \newlabel{tab:ambigu_aa}{{3}{26}{\bf List of valid characters in protein sequences and the corresponding amino acids}{table.3}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {7.2}Tree format}{26}{subsection.7.2}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces {\bf Input trees}. The first tree (top) is rooted and has branch lengths. The second tree (bottom) is unrooted and does not have branch lengths.}}{26}{figure.3}\protected@file@percent } \newlabel{fig:trees}{{3}{26}{{\bf Input trees}. The first tree (top) is rooted and has branch lengths. The second tree (bottom) is unrooted and does not have branch lengths}{figure.3}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {7.3}Multiple alignments and trees}{27}{subsection.7.3}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {7.4}Custom amino-acid rate model}{27}{subsection.7.4}\protected@file@percent } \newlabel{sec:customaa}{{7.4}{27}{Custom amino-acid rate model}{subsection.7.4}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {7.5}Topological constraint file}{28}{subsection.7.5}\protected@file@percent } \newlabel{sec:topoconstraints}{{7.5}{28}{Topological constraint file}{subsection.7.5}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {7.6}Output files}{28}{subsection.7.6}\protected@file@percent } \citation{oliva19} \@writefile{lot}{\contentsline {table}{\numberline {4}{\ignorespaces {\bf Standard output files}}}{29}{table.4}\protected@file@percent } \newlabel{tab:output}{{4}{29}{\bf Standard output files}{table.4}{}} \citation{yang94b} \@writefile{toc}{\contentsline {subsection}{\numberline {7.7}Treatment of invariable sites with fixed branch lengths}{30}{subsection.7.7}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {8}Inputs \& outputs for the XML interface }{31}{section.8}\protected@file@percent } \newlabel{sec:xmlio}{{8}{31}{Inputs \& outputs for the XML interface}{section.8}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {8.1}Mixture models in PhyML}{31}{subsection.8.1}\protected@file@percent } \newlabel{sec:mixtures}{{8.1}{31}{Mixture models in PhyML}{subsection.8.1}{}} \newlabel{equ:mixtlk}{{1}{31}{Mixture models in PhyML}{}{}} \citation{yang98,yang00b,yang02,guindon04} \@writefile{toc}{\contentsline {subsection}{\numberline {8.2}Partitionned (i.e., multiple-gene) analyses}{32}{subsection.8.2}\protected@file@percent } \citation{degnan09} \citation{best} \citation{stem} \citation{startbeast} \@writefile{toc}{\contentsline {subsection}{\numberline {8.3}Combining mixture and partitions in PhyML: the theory}{34}{subsection.8.3}\protected@file@percent } \newlabel{equ:weights}{{1}{35}{Combining mixture and partitions in PhyML: the theory}{}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {8.4}The XML format and its use in PhyML}{35}{subsection.8.4}\protected@file@percent } \newlabel{sec:XML format}{{8.4}{35}{The XML format and its use in PhyML}{subsection.8.4}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {8.5}Setting up mixture and partition models in PhyML: the basics}{38}{subsection.8.5}\protected@file@percent } \citation{matsen07} \@writefile{toc}{\contentsline {subsection}{\numberline {8.6}XML options}{40}{subsection.8.6}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {8.6.1}{\tt phyml} component}{40}{subsubsection.8.6.1}\protected@file@percent } \citation{anisimova11} \citation{anisimova06} \citation{shimodaira99} \@writefile{toc}{\contentsline {subsubsection}{\numberline {8.6.2}{\tt topology} component}{41}{subsubsection.8.6.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {8.6.3}{\tt ratematrices} component}{42}{subsubsection.8.6.3}\protected@file@percent } \newlabel{sec:xmlratematrices}{{8.6.3}{42}{{\tt ratematrices} component}{subsubsection.8.6.3}{}} \@writefile{toc}{\contentsline {subsubsection}{\numberline {8.6.4}{\tt equfreqs} component}{43}{subsubsection.8.6.4}\protected@file@percent } \citation{soubrier12} \@writefile{toc}{\contentsline {subsubsection}{\numberline {8.6.5}{\tt branchlengths} component}{44}{subsubsection.8.6.5}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {8.6.6}{\tt siterates} component}{44}{subsubsection.8.6.6}\protected@file@percent } \citation{soubrier12} \@writefile{toc}{\contentsline {subsubsection}{\numberline {8.6.7}{\tt partitionelem} and {\tt mixtureelem} components}{46}{subsubsection.8.6.7}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {8.7}Example: GTR + $\Gamma $4 + I}{47}{subsection.8.7}\protected@file@percent } \citation{lg4x} \@writefile{toc}{\contentsline {subsection}{\numberline {8.8}Example: LG4X}{48}{subsection.8.8}\protected@file@percent } \citation{lartillot04} \@writefile{toc}{\contentsline {subsection}{\numberline {8.9}Example: CAT-like model}{51}{subsection.8.9}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {8.10}Example: multiple partition elements}{52}{subsection.8.10}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {8.11}Branch lengths with invariants and partionned data}{55}{subsection.8.11}\protected@file@percent } \citation{guindon13} \citation{guindon18} \@writefile{toc}{\contentsline {section}{\numberline {9}Citing PhyML}{56}{section.9}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {10}Other programs}{56}{section.10}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {10.1}PhyTime}{56}{subsection.10.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.1.1}Installing PhyTime}{57}{subsubsection.10.1.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.1.2}Running PhyTime}{57}{subsubsection.10.1.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.1.3}PhyTime input}{57}{subsubsection.10.1.3}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.1.4}Accounting for calibration uncertainty}{60}{subsubsection.10.1.4}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.1.5}MCMC settings}{61}{subsubsection.10.1.5}\protected@file@percent } \newlabel{sec:phytimesettings}{{10.1.5}{61}{MCMC settings}{subsubsection.10.1.5}{}} \citation{guindon18} \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.1.6}PhyTime output}{62}{subsubsection.10.1.6}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.1.7}An example of PhyTime input and output files}{63}{subsubsection.10.1.7}\protected@file@percent } \newlabel{sec:phytimeexample}{{10.1.7}{63}{An example of PhyTime input and output files}{subsubsection.10.1.7}{}} \citation{soubrier12} \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.1.8}Citing PhyTime}{65}{subsubsection.10.1.8}\protected@file@percent } \newlabel{sec:citephytime}{{10.1.8}{65}{Citing PhyTime}{subsubsection.10.1.8}{}} \@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces {\bf Traces from the statistics output file produced by PhyTime.}}}{66}{figure.4}\protected@file@percent } \newlabel{fig:phytimetrace}{{4}{66}{\bf Traces from the statistics output file produced by PhyTime}{figure.4}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {10.2}PhyloGeo}{67}{subsection.10.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.2.1}Installing PhyloGeo}{67}{subsubsection.10.2.1}\protected@file@percent } \citation{etheridge2008,berestycki2009,barton2010,barton2010b,veber2012,barton2013} \citation{felsenstein1975} \citation{lemey2009} \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.2.2}Running PhyloGeo}{68}{subsubsection.10.2.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.2.3}Citing PhyloGeo}{68}{subsubsection.10.2.3}\protected@file@percent } \newlabel{sec:citephylogeo}{{10.2.3}{68}{Citing PhyloGeo}{subsubsection.10.2.3}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {10.3}PhyREX}{68}{subsection.10.3}\protected@file@percent } \citation{lemey2010} \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.3.1}Installing PhyREX}{69}{subsubsection.10.3.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.3.2}Running PhyREX}{69}{subsubsection.10.3.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\numberline {10.3.3}Citing PhyREX}{74}{subsubsection.10.3.3}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {11}Recommendations on program usage}{75}{section.11}\protected@file@percent } \newlabel{sec:progusage}{{11}{75}{Recommendations on program usage}{section.11}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {11.1}PhyML}{75}{subsection.11.1}\protected@file@percent } \citation{posada98} \citation{abascal05} \citation{galtier04} \@writefile{toc}{\contentsline {subsection}{\numberline {11.2}PhyTime}{76}{subsection.11.2}\protected@file@percent } \newlabel{sec:recomphytime}{{11.2}{76}{PhyTime}{subsection.11.2}{}} \@writefile{toc}{\contentsline {section}{\numberline {12}Frequently asked questions}{77}{section.12}\protected@file@percent } \bibstyle{./naturemag} \bibdata{./ref.bib} \bibcite{guindon03}{1} \@writefile{toc}{\contentsline {section}{\numberline {13}Acknowledgements}{78}{section.13}\protected@file@percent } \bibcite{raxml}{2} \bibcite{garli}{3} \bibcite{ayres12}{4} \bibcite{jukes69}{5} \bibcite{kimura80}{6} \bibcite{felsenstein81a}{7} \bibcite{phylip2}{8} \bibcite{hasegawa85}{9} \bibcite{tamura93}{10} \bibcite{lanave84}{11} \bibcite{tavare86}{12} \bibcite{le08}{13} \bibcite{whelan01b}{14} \bibcite{dayhoff78}{15} \bibcite{jones92}{16} \bibcite{henikoff92}{17} \bibcite{adachi96}{18} \bibcite{dimmic02}{19} \bibcite{adachi00}{20} \bibcite{kosiol04}{21} \bibcite{muller00}{22} \bibcite{cao98}{23} \bibcite{gascuelNJ}{24} \bibcite{anisimova11}{25} \bibcite{anisimova06}{26} \bibcite{posada01}{27} \bibcite{soubrier12}{28} \bibcite{guindon13}{29} \bibcite{maddison97}{30} \bibcite{oliva19}{31} \bibcite{yang94b}{32} \bibcite{yang98}{33} \bibcite{yang00b}{34} \bibcite{yang02}{35} \bibcite{guindon04}{36} \bibcite{degnan09}{37} \bibcite{best}{38} \bibcite{stem}{39} \bibcite{startbeast}{40} \bibcite{matsen07}{41} \bibcite{shimodaira99}{42} \bibcite{lg4x}{43} \bibcite{lartillot04}{44} \bibcite{guindon18}{45} \bibcite{etheridge2008}{46} \bibcite{berestycki2009}{47} \bibcite{barton2010}{48} \bibcite{barton2010b}{49} \bibcite{veber2012}{50} \bibcite{barton2013}{51} \bibcite{felsenstein1975}{52} \bibcite{lemey2009}{53} \bibcite{lemey2010}{54} \bibcite{posada98}{55} \bibcite{abascal05}{56} \bibcite{galtier04}{57} \gdef \@abspage@last{85} stephaneguindon-phyml-76a39c8/doc/phyml-manual.bbl000066400000000000000000000476531501136442400222530ustar00rootroot00000000000000\begin{thebibliography}{10} \expandafter\ifx\csname url\endcsname\relax \def\url#1{\texttt{#1}}\fi \expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi \providecommand{\bibinfo}[2]{#2} \providecommand{\eprint}[2][]{\url{#2}} \bibitem{guindon03} \bibinfo{author}{Guindon, S.} \& \bibinfo{author}{Gascuel, O.} \newblock \bibinfo{title}{A simple, fast and accurate algorithm to estimate large phylogenies by maximum likelihood}. \newblock \emph{\bibinfo{journal}{Systematic Biology}} \textbf{\bibinfo{volume}{52}}, \bibinfo{pages}{696--704} (\bibinfo{year}{2003}). \bibitem{raxml} \bibinfo{author}{Stamatakis, A.} \newblock \bibinfo{title}{{RAxML-VI-HPC}: Maximum likelihood-based phylogenetic analyses with thousands of taxa and mixed models}. \newblock \emph{\bibinfo{journal}{Bioinformatics}} \textbf{\bibinfo{volume}{22}}, \bibinfo{pages}{2688--2690} (\bibinfo{year}{2006}). \bibitem{garli} \bibinfo{author}{Zwickl, D.} \newblock \emph{\bibinfo{title}{Genetic algorithm approaches for the phylogenetic analysis of large biological sequence datasets under the maximum likelihood criterion}}. \newblock Ph.D. thesis, \bibinfo{school}{The University of Texas at Austin} (\bibinfo{year}{2006}). \bibitem{ayres12} \bibinfo{author}{Ayres, D.~L.} \emph{et~al.} \newblock \bibinfo{title}{Beagle: an application programming interface and high-performance computing library for statistical phylogenetics}. \newblock \emph{\bibinfo{journal}{Systematic Biology}} \textbf{\bibinfo{volume}{61}}, \bibinfo{pages}{170--173} (\bibinfo{year}{2012}). \bibitem{jukes69} \bibinfo{author}{Jukes, T.} \& \bibinfo{author}{Cantor, C.} \newblock \bibinfo{title}{Evolution of protein molecules}. \newblock In \bibinfo{editor}{Munro, H.} (ed.) \emph{\bibinfo{booktitle}{Mammalian Protein Metabolism}}, vol. \bibinfo{volume}{III}, chap.~\bibinfo{chapter}{24}, \bibinfo{pages}{21--132} (\bibinfo{publisher}{Academic Press}, \bibinfo{address}{New York}, \bibinfo{year}{1969}). \bibitem{kimura80} \bibinfo{author}{Kimura, M.} \newblock \bibinfo{title}{A simple method for estimating evolutionary rates of base substitutions through comparative studies of nucleotide sequences}. \newblock \emph{\bibinfo{journal}{Journal of Molecular Evolution}} \textbf{\bibinfo{volume}{16}}, \bibinfo{pages}{111--120} (\bibinfo{year}{1980}). \bibitem{felsenstein81a} \bibinfo{author}{Felsenstein, J.} \newblock \bibinfo{title}{Evolutionary trees from {DNA} sequences: a maximum likelihood approach}. \newblock \emph{\bibinfo{journal}{Journal of Molecular Evolution}} \textbf{\bibinfo{volume}{17}}, \bibinfo{pages}{368--376} (\bibinfo{year}{1981}). \bibitem{phylip2} \bibinfo{author}{Felsenstein, J.} \newblock \emph{\bibinfo{title}{PHYLIP ({PHYL}ogeny {I}nference {P}ackage) version 3.6a2}} (\bibinfo{publisher}{Distributed by the author}, \bibinfo{address}{Department of Genetics, University of Washington, Seattle}, \bibinfo{year}{1993}). \bibitem{hasegawa85} \bibinfo{author}{Hasegawa, M.}, \bibinfo{author}{Kishino, H.} \& \bibinfo{author}{Yano, T.} \newblock \bibinfo{title}{Dating of the {H}uman-{A}pe splitting by a molecular clock of mitochondrial-{DNA}}. \newblock \emph{\bibinfo{journal}{Journal of Molecular Evolution}} \textbf{\bibinfo{volume}{22}}, \bibinfo{pages}{160--174} (\bibinfo{year}{1985}). \bibitem{tamura93} \bibinfo{author}{Tamura, K.} \& \bibinfo{author}{Nei, M.} \newblock \bibinfo{title}{Estimation of the number of nucleotide substitutions in the control region of mitochondrial {DNA} in humans and chimpanzees}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{10}}, \bibinfo{pages}{512--526} (\bibinfo{year}{1993}). \bibitem{lanave84} \bibinfo{author}{Lanave, C.}, \bibinfo{author}{Preparata, G.}, \bibinfo{author}{Saccone, C.} \& \bibinfo{author}{Serio, G.} \newblock \bibinfo{title}{A new method for calculating evolutionary substitution rates}. \newblock \emph{\bibinfo{journal}{Journal of Molecular Evolution}} \textbf{\bibinfo{volume}{20}}, \bibinfo{pages}{86--93} (\bibinfo{year}{1984}). \bibitem{tavare86} \bibinfo{author}{Tavar\'e, S.} \newblock \bibinfo{title}{Some probabilistic and statistical problems on the analysis of {DNA} sequences}. \newblock \emph{\bibinfo{journal}{Lectures on Mathematics in the Life Sciences}} \textbf{\bibinfo{volume}{17}}, \bibinfo{pages}{57--86} (\bibinfo{year}{1986}). \bibitem{le08} \bibinfo{author}{Le, S.} \& \bibinfo{author}{Gascuel, O.} \newblock \bibinfo{title}{An improved general amino-acid replacement matrix}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{25}}, \bibinfo{pages}{1307--1320} (\bibinfo{year}{2008}). \bibitem{whelan01b} \bibinfo{author}{Whelan, S.} \& \bibinfo{author}{Goldman, N.} \newblock \bibinfo{title}{A general empirical model of protein evolution derived from multiple protein families using a maximum-likelihood approach}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{18}}, \bibinfo{pages}{691--699} (\bibinfo{year}{2001}). \bibitem{dayhoff78} \bibinfo{author}{Dayhoff, M.}, \bibinfo{author}{Schwartz, R.} \& \bibinfo{author}{Orcutt, B.} \newblock \bibinfo{title}{A model of evolutionary change in proteins}. \newblock In \bibinfo{editor}{Dayhoff, M.} (ed.) \emph{\bibinfo{booktitle}{Atlas of Protein Sequence and Structure}}, vol.~\bibinfo{volume}{5}, \bibinfo{pages}{345--352} (\bibinfo{publisher}{National Biomedical Research Foundation}, \bibinfo{address}{Washington, D. C.}, \bibinfo{year}{1978}). \bibitem{jones92} \bibinfo{author}{Jones, D.}, \bibinfo{author}{Taylor, W.} \& \bibinfo{author}{Thornton, J.} \newblock \bibinfo{title}{The rapid generation of mutation data matrices from protein sequences}. \newblock \emph{\bibinfo{journal}{Computer Applications in the Biosciences (CABIOS)}} \textbf{\bibinfo{volume}{8}}, \bibinfo{pages}{275--282} (\bibinfo{year}{1992}). \bibitem{henikoff92} \bibinfo{author}{Henikoff, S.} \& \bibinfo{author}{Henikoff, J.} \newblock \bibinfo{title}{Amino acid substitution matrices from protein blocks.} \newblock \emph{\bibinfo{journal}{PNAS}} \textbf{\bibinfo{volume}{89}}, \bibinfo{pages}{10915--10919} (\bibinfo{year}{1992}). \bibitem{adachi96} \bibinfo{author}{Adachi, J.} \& \bibinfo{author}{Hasegawa, M.} \newblock \bibinfo{title}{{MOLPHY} version 2.3. programs for molecular phylogenetics based on maximum likelihood}. \newblock In \bibinfo{editor}{Ishiguro, M.} \emph{et~al.} (eds.) \emph{\bibinfo{booktitle}{Computer Science Monographs}}, \bibinfo{number}{28} (\bibinfo{publisher}{The Institute of Statistical Mathematics}, \bibinfo{address}{Tokyo}, \bibinfo{year}{1996}). \bibitem{dimmic02} \bibinfo{author}{Dimmic, M.}, \bibinfo{author}{Rest, J.}, \bibinfo{author}{Mindell, D.} \& \bibinfo{author}{Goldstein, D.} \newblock \bibinfo{title}{{rtREV}: an amino acid substitution matrix for inference of retrovirus and reverse transcriptase phylogeny}. \newblock \emph{\bibinfo{journal}{Journal of Molecular Evolution}} \textbf{\bibinfo{volume}{55}}, \bibinfo{pages}{65--73} (\bibinfo{year}{2002}). \bibitem{adachi00} \bibinfo{author}{Adachi, J.}, \bibinfo{author}{P., W.}, \bibinfo{author}{Martin, W.} \& \bibinfo{author}{Hasegawa, M.} \newblock \bibinfo{title}{Plastid genome phylogeny and a model of amino acid substitution for proteins encoded by chloroplast {DNA}}. \newblock \emph{\bibinfo{journal}{Journal of Molecular Evolution}} \textbf{\bibinfo{volume}{50}}, \bibinfo{pages}{348--358} (\bibinfo{year}{2000}). \bibitem{kosiol04} \bibinfo{author}{Kosiol, C.} \& \bibinfo{author}{Goldman, N.} \newblock \bibinfo{title}{Different versions of the {D}ayhoff rate matrix}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{22}}, \bibinfo{pages}{193--199} (\bibinfo{year}{2004}). \bibitem{muller00} \bibinfo{author}{Muller, T.} \& \bibinfo{author}{Vingron, M.} \newblock \bibinfo{title}{Modeling amino acid replacement.} \newblock \emph{\bibinfo{journal}{Journal of Computational Biology}} \textbf{\bibinfo{volume}{7}}, \bibinfo{pages}{761--776} (\bibinfo{year}{2000}). \bibitem{cao98} \bibinfo{author}{Cao, Y.} \emph{et~al.} \newblock \bibinfo{title}{Conflict among individual mitochondrial proteins in resolving the phylogeny of eutherian orders}. \newblock \emph{\bibinfo{journal}{Journal of Molecular Evolution}} \textbf{\bibinfo{volume}{47}}, \bibinfo{pages}{307--322} (\bibinfo{year}{1998}). \bibitem{gascuelNJ} \bibinfo{author}{Gascuel, O.} \newblock \bibinfo{title}{{B}io{NJ}: an improved version of the {NJ} algorithm based on a simple model of sequence data}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{14}}, \bibinfo{pages}{685--695} (\bibinfo{year}{1997}). \bibitem{anisimova11} \bibinfo{author}{Anisimova, M.}, \bibinfo{author}{Gil, M.}, \bibinfo{author}{Dufayard, J.}, \bibinfo{author}{Dessimoz, C.} \& \bibinfo{author}{Gascuel, O.} \newblock \bibinfo{title}{Survey of branch support methods demonstrates accuracy, power, and robustness of fast likelihood-based approximation schemes}. \newblock \emph{\bibinfo{journal}{Systematic Biology}} \textbf{\bibinfo{volume}{60}}, \bibinfo{pages}{685--699} (\bibinfo{year}{2011}). \bibitem{anisimova06} \bibinfo{author}{Anisimova, M.} \& \bibinfo{author}{Gascuel, O.} \newblock \bibinfo{title}{Approximate likelihood-ratio test for branches: a fast, accurate, and powerful alternative}. \newblock \emph{\bibinfo{journal}{Systematic Biology}} \textbf{\bibinfo{volume}{55}}, \bibinfo{pages}{539--552} (\bibinfo{year}{2006}). \bibitem{posada01} \bibinfo{author}{Posada, D.} \& \bibinfo{author}{Crandall, K.} \newblock \bibinfo{title}{Selecting models of nucleotide substitution: an application to human immunodeficiency virus 1 (hiv-1)}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{18}}, \bibinfo{pages}{897--906} (\bibinfo{year}{2001}). \bibitem{soubrier12} \bibinfo{author}{Soubrier, J.} \emph{et~al.} \newblock \bibinfo{title}{The influence of rate heterogeneity among sites on the time dependence of molecular rates}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} (\bibinfo{year}{2012}). \bibitem{guindon13} \bibinfo{author}{Guindon, S.} \newblock \bibinfo{title}{From trajectories to averages: an improved description of the heterogeneity of substitution rates along lineages.} \newblock \emph{\bibinfo{journal}{Systematic Biology}} \textbf{\bibinfo{volume}{62}}, \bibinfo{pages}{22--34} (\bibinfo{year}{2013}). \bibitem{maddison97} \bibinfo{author}{Maddison, D.}, \bibinfo{author}{Swofford, D.} \& \bibinfo{author}{Maddison, W.} \newblock \bibinfo{title}{{NEXUS}: an extensible file format for systematic information}. \newblock \emph{\bibinfo{journal}{Systematic Biology}} \textbf{\bibinfo{volume}{46}}, \bibinfo{pages}{590--621} (\bibinfo{year}{1997}). \bibitem{oliva19} \bibinfo{author}{Oliva, A.} \emph{et~al.} \newblock \bibinfo{title}{Accounting for ambiguity in ancestral sequencereconstruction}. \newblock \emph{\bibinfo{journal}{Bioinformatics}} \bibinfo{pages}{https://www.biorxiv.org/content/early/2018/09/05/409029} (\bibinfo{year}{2019}). \bibitem{yang94b} \bibinfo{author}{Yang, Z.} \newblock \bibinfo{title}{Maximum likelihood phylogenetic estimation from {DNA} sequences with variable rates over sites: approximate methods}. \newblock \emph{\bibinfo{journal}{Journal of Molecular Evolution}} \textbf{\bibinfo{volume}{39}}, \bibinfo{pages}{306--314} (\bibinfo{year}{1994}). \bibitem{yang98} \bibinfo{author}{Yang, Z.} \newblock \bibinfo{title}{Likelihood ratio tests for detecting positive selection and application to primate lysozyme evolution}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{15}}, \bibinfo{pages}{568--573} (\bibinfo{year}{1998}). \bibitem{yang00b} \bibinfo{author}{Yang, Z.} \& \bibinfo{author}{Nielsen, R.} \newblock \bibinfo{title}{Estimating synonymous and nonsynonymous substitution rates under realistic evolutionary models}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{17}}, \bibinfo{pages}{32--43} (\bibinfo{year}{2000}). \bibitem{yang02} \bibinfo{author}{Yang, Z.} \& \bibinfo{author}{Nielsen, R.} \newblock \bibinfo{title}{Codon-substitution models for detecting molecular adaptation at individual sites along specific lineages}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{19}}, \bibinfo{pages}{908--917} (\bibinfo{year}{2002}). \bibitem{guindon04} \bibinfo{author}{Guindon, S.}, \bibinfo{author}{Rodrigo, A.}, \bibinfo{author}{Dyer, K.} \& \bibinfo{author}{Huelsenbeck, J.} \newblock \bibinfo{title}{Modeling the site-specific variation of selection patterns along lineages}. \newblock \emph{\bibinfo{journal}{PNAS}} \textbf{\bibinfo{volume}{101}}, \bibinfo{pages}{12957--12962} (\bibinfo{year}{2004}). \bibitem{degnan09} \bibinfo{author}{Degnan, J.} \& \bibinfo{author}{Rosenberg, N.} \newblock \bibinfo{title}{Gene tree discordance, phylogenetic inference and the multispecies coalescent}. \newblock \emph{\bibinfo{journal}{Trends in Ecology \& Evolution}} \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{332--340} (\bibinfo{year}{2009}). \bibitem{best} \bibinfo{author}{Liu, L.} \newblock \bibinfo{title}{{BEST}: Bayesian estimation of species trees under the coalescent model}. \newblock \emph{\bibinfo{journal}{Bioinformatics}} \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{2542--2543} (\bibinfo{year}{2008}). \bibitem{stem} \bibinfo{author}{Kubatko, L.}, \bibinfo{author}{Carstens, B.} \& \bibinfo{author}{Knowles, L.} \newblock \bibinfo{title}{{STEM}: species tree estimation using maximum likelihood for gene trees under coalescence}. \newblock \emph{\bibinfo{journal}{Bioinformatics}} \textbf{\bibinfo{volume}{25}}, \bibinfo{pages}{971--973} (\bibinfo{year}{2009}). \bibitem{startbeast} \bibinfo{author}{Heled, J.} \& \bibinfo{author}{Drummond, A.} \newblock \bibinfo{title}{Bayesian inference of species trees from multilocus data}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{27}}, \bibinfo{pages}{570--580} (\bibinfo{year}{2010}). \bibitem{matsen07} \bibinfo{author}{Matsen, F.} \& \bibinfo{author}{Steel, M.} \newblock \bibinfo{title}{Phylogenetic mixtures on a single tree can mimic a tree of another topology}. \newblock \emph{\bibinfo{journal}{Systematic Biology}} \textbf{\bibinfo{volume}{56}}, \bibinfo{pages}{767--775} (\bibinfo{year}{2007}). \bibitem{shimodaira99} \bibinfo{author}{Shimodaira, H.} \& \bibinfo{author}{Hasegawa, M.} \newblock \bibinfo{title}{Multiple comparisons of log-likelihoods with applications to phylogenetic inference}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{16}}, \bibinfo{pages}{1114--1116} (\bibinfo{year}{1999}). \bibitem{lg4x} \bibinfo{author}{Le, S.~Q.}, \bibinfo{author}{Dang, C.~C.} \& \bibinfo{author}{Gascuel, O.} \newblock \bibinfo{title}{Modeling protein evolution with several amino acid replacement matrices depending on site rates}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{29}}, \bibinfo{pages}{2921--2936} (\bibinfo{year}{2012}). \bibitem{lartillot04} \bibinfo{author}{Lartillot, N.} \& \bibinfo{author}{Philippe, H.} \newblock \bibinfo{title}{A bayesian mixture model for across-site heterogeneities in the amino-acid replacement process}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{21}}, \bibinfo{pages}{1095--1109} (\bibinfo{year}{2004}). \bibitem{guindon18} \bibinfo{author}{Guindon, S.} \newblock \bibinfo{title}{Accounting for calibration uncertainty: Bayesian molecular dating as a ``doubly intractable'' problem}. \newblock \emph{\bibinfo{journal}{Systematic Biology}} \textbf{\bibinfo{volume}{67}}, \bibinfo{pages}{651--661} (\bibinfo{year}{2018}). \bibitem{etheridge2008} \bibinfo{author}{Etheridge, A.~M.} \newblock \bibinfo{title}{Drift, draft and structure: some mathematical models of evolution}. \newblock \emph{\bibinfo{journal}{Banach Center Publ.}} \textbf{\bibinfo{volume}{80}}, \bibinfo{pages}{121--144} (\bibinfo{year}{2008}). \bibitem{berestycki2009} \bibinfo{author}{Berestycki, N.}, \bibinfo{author}{Etheridge, A.} \& \bibinfo{author}{Hutzenthaler, M.} \newblock \bibinfo{title}{Survival, extinction and ergodicity in a spatially continuous population model}. \newblock In \emph{\bibinfo{booktitle}{Markov Proc. Rel. Fields}} (\bibinfo{year}{2009}). \bibitem{barton2010} \bibinfo{author}{Barton, N.}, \bibinfo{author}{Etheridge, A.} \& \bibinfo{author}{V{\'e}ber, A.} \newblock \bibinfo{title}{A new model for evolution in a spatial continuum}. \newblock \emph{\bibinfo{journal}{Electronic Journal of Probability}} \textbf{\bibinfo{volume}{15}} (\bibinfo{year}{2010}). \bibitem{barton2010b} \bibinfo{author}{Barton, N.~H.}, \bibinfo{author}{Kelleher, J.} \& \bibinfo{author}{Etheridge, A.~M.} \newblock \bibinfo{title}{A new model for extinction and recolonization in two dimensions: quantifying phylogeography}. \newblock \emph{\bibinfo{journal}{Evolution}} \textbf{\bibinfo{volume}{64}}, \bibinfo{pages}{2701--2715} (\bibinfo{year}{2010}). \bibitem{veber2012} \bibinfo{author}{V{\'e}ber, A.} \& \bibinfo{author}{Wakolbinger, A.} \newblock \bibinfo{title}{The spatial {L}ambda-{F}leming-{V}iot process: an event-based construction and a lookdown representation}. \newblock \emph{\bibinfo{journal}{Annales de l'Institut Henri Poincar\'e}} \bibinfo{pages}{in press} (\bibinfo{year}{2014}). \bibitem{barton2013} \bibinfo{author}{Barton, N.}, \bibinfo{author}{Etheridge, A.} \& \bibinfo{author}{V{\'e}ber, A.} \newblock \bibinfo{title}{Modelling evolution in a spatial continuum}. \newblock \emph{\bibinfo{journal}{Journal of Statistical Mechanics: Theory and Experiment}} \textbf{\bibinfo{volume}{2013}}, \bibinfo{pages}{P01002} (\bibinfo{year}{2013}). \bibitem{felsenstein1975} \bibinfo{author}{Felsenstein, J.} \newblock \bibinfo{title}{A pain in the torus: some difficulties with models of isolation by distance}. \newblock \emph{\bibinfo{journal}{American Naturalist}} \bibinfo{pages}{359--368} (\bibinfo{year}{1975}). \bibitem{lemey2009} \bibinfo{author}{Lemey, P.}, \bibinfo{author}{Rambaut, A.}, \bibinfo{author}{Drummond, A.~J.} \& \bibinfo{author}{Suchard, M.~A.} \newblock \bibinfo{title}{Bayesian phylogeography finds its roots}. \newblock \emph{\bibinfo{journal}{PLoS Comput Biol}} \textbf{\bibinfo{volume}{5}}, \bibinfo{pages}{e1000520} (\bibinfo{year}{2009}). \bibitem{lemey2010} \bibinfo{author}{Lemey, P.}, \bibinfo{author}{Rambaut, A.}, \bibinfo{author}{Welch, J.~J.} \& \bibinfo{author}{Suchard, M.~A.} \newblock \bibinfo{title}{Phylogeography takes a relaxed random walk in continuous space and time}. \newblock \emph{\bibinfo{journal}{Molecular Biology and Evolution}} \textbf{\bibinfo{volume}{27}}, \bibinfo{pages}{1877--1885} (\bibinfo{year}{2010}). \newblock \bibinfo{note}{Publisher: SMBE}. \bibitem{posada98} \bibinfo{author}{Posada, D.} \& \bibinfo{author}{Crandall, K.} \newblock \bibinfo{title}{Modeltest: testing the model of {DNA} substitution}. \newblock \emph{\bibinfo{journal}{Bioinformatics}} \textbf{\bibinfo{volume}{14}}, \bibinfo{pages}{817--918} (\bibinfo{year}{1998}). \bibitem{abascal05} \bibinfo{author}{Abascal, F.}, \bibinfo{author}{Zardoya, R.} \& \bibinfo{author}{Posada, D.} \newblock \bibinfo{title}{Prottest: selection of best-fit models of protein evolution}. \newblock \emph{\bibinfo{journal}{Bioinformatics}} \textbf{\bibinfo{volume}{21}}, \bibinfo{pages}{2104--2105} (\bibinfo{year}{2005}). \bibitem{galtier04} \bibinfo{author}{Galtier, N.} \& \bibinfo{author}{Jean-Marie, A.} \newblock \bibinfo{title}{Markov-modulated {M}arkov chains and the covarion process of molecular evolution}. \newblock \emph{\bibinfo{journal}{Journal of Computational Biology}} \textbf{\bibinfo{volume}{11}}, \bibinfo{pages}{727--733} (\bibinfo{year}{2004}). \end{thebibliography} stephaneguindon-phyml-76a39c8/doc/phyml-manual.blg000066400000000000000000000016551501136442400222500ustar00rootroot00000000000000This is BibTeX, Version 0.99d (TeX Live 2022/MacPorts 2022.62882_3) Capacity: max_strings=200000, hash_size=200000, hash_prime=170003 The top-level auxiliary file: phyml-manual.aux The style file: ./naturemag.bst Database file #1: ./ref.bib You've used 57 entries, 2348 wiz_defined-function locations, 1305 strings with 17635 characters, and the built_in function-call counts, 23998 in all, are: = -- 1789 > -- 520 < -- 3 + -- 257 - -- 130 * -- 2827 := -- 2574 add.period$ -- 171 call.type$ -- 57 change.case$ -- 64 chr.to.int$ -- 0 cite$ -- 57 duplicate$ -- 2165 empty$ -- 2217 format.name$ -- 174 if$ -- 4983 int.to.chr$ -- 0 int.to.str$ -- 57 missing$ -- 473 newline$ -- 293 num.names$ -- 63 pop$ -- 344 preamble$ -- 1 purify$ -- 0 quote$ -- 0 skip$ -- 527 stack$ -- 0 substring$ -- 1273 swap$ -- 2157 text.length$ -- 3 text.prefix$ -- 0 top$ -- 0 type$ -- 0 warning$ -- 0 while$ -- 127 width$ -- 59 write$ -- 633 stephaneguindon-phyml-76a39c8/doc/phyml-manual.fls000066400000000000000000001400111501136442400222560ustar00rootroot00000000000000PWD /Users/guindon/phyml/doc INPUT /opt/local/etc/texmf/texmf.cnf INPUT /opt/local/var/db/texmf/web2c/pdftex/pdflatex.fmt INPUT /Users/guindon/phyml/doc/phyml-manual.tex OUTPUT phyml-manual.log INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/article.cls INPUT /opt/local/share/texmf-texlive/tex/latex/base/size12.clo INPUT /opt/local/share/texmf-texlive/tex/latex/base/size12.clo INPUT /opt/local/share/texmf-texlive/tex/latex/base/size12.clo INPUT /opt/local/share/texmf-texlive/tex/latex/base/size12.clo INPUT /opt/local/share/texmf-texlive/fonts/map/fontname/texfonts.map INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmr12.tfm INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-cfg/graphics.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-cfg/graphics.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-cfg/graphics.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-cfg/graphics.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-def/pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-def/pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-def/pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-def/pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/tools/array.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-cfg/color.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-cfg/color.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-cfg/color.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/graphics-cfg/color.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/cite/cite.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/pd1enc.def INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/pd1enc.def INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/pd1enc.def INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/pd1enc.def INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/puenc.def INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/puenc.def INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/puenc.def INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/puenc.def INPUT /opt/local/share/texmf-texlive/tex/latex/url/url.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/atbegshi/atbegshi.sty INPUT /opt/local/share/texmf-texlive/tex/generic/atbegshi/atbegshi.sty INPUT /opt/local/share/texmf-texlive/tex/generic/atbegshi/atbegshi.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atbegshi-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/generic/atbegshi/atbegshi.sty INPUT /opt/local/share/texmf-texlive/tex/generic/atbegshi/atbegshi.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atbegshi-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/generic/atbegshi/atbegshi.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atbegshi-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atbegshi-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/generic/atbegshi/atbegshi.sty INPUT /opt/local/share/texmf-texlive/tex/generic/atbegshi/atbegshi.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atbegshi-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atbegshi-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/generic/atbegshi/atbegshi.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atbegshi-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hpdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hpdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hpdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/hpdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atveryend-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atveryend-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atveryend-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atveryend-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atveryend-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atveryend-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/atveryend-ltx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/latex/atveryend/atveryend.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty INPUT /opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty INPUT /opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty OUTPUT phyml-manual.idx INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT /opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def INPUT ./phyml-manual.aux INPUT phyml-manual.aux INPUT phyml-manual.aux OUTPUT phyml-manual.aux INPUT /opt/local/share/texmf-texlive/tex/context/base/mkii/supp-pdf.mkii INPUT /opt/local/share/texmf-texlive/tex/context/base/mkii/supp-pdf.mkii INPUT /opt/local/share/texmf-texlive/tex/context/base/mkii/supp-pdf.mkii INPUT /opt/local/share/texmf-texlive/tex/context/base/mkii/supp-pdf.mkii INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty INPUT /opt/local/share/texmf-texlive/tex/latex/latexconfig/epstopdf-sys.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/latexconfig/epstopdf-sys.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/latexconfig/epstopdf-sys.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/latexconfig/epstopdf-sys.cfg INPUT /opt/local/share/texmf-texlive/tex/latex/graphics/color.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT /opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty INPUT /opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty INPUT /opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty INPUT ./phyml-manual.out INPUT phyml-manual.out INPUT ./phyml-manual.out INPUT phyml-manual.out INPUT ./phyml-manual.out INPUT phyml-manual.out INPUT ./phyml-manual.out INPUT phyml-manual.out OUTPUT phyml-manual.pdf INPUT ./phyml-manual.out INPUT ./phyml-manual.out OUTPUT phyml-manual.out INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmr17.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmbx12.tfm INPUT /opt/local/var/db/texmf/fonts/map/pdftex/updmap/pdftex.map INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmr17.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmbx12.tfm INPUT ./phyml-manual.toc INPUT phyml-manual.toc INPUT phyml-manual.toc INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmbx12.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmr8.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmr6.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmmi12.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmmi8.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmmi6.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmsy10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmsy8.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmsy6.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmex10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/umsa.fd INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/umsa.fd INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/umsa.fd INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/umsa.fd INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msam10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msam10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msam7.tfm INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/umsb.fd INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/umsb.fd INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/umsb.fd INPUT /opt/local/share/texmf-texlive/tex/latex/amsfonts/umsb.fd INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msbm10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msbm10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msbm7.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmtt12.tfm OUTPUT phyml-manual.toc INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmr10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/jknappen/ec/tcrm1095.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/jknappen/ec/tcrm1200.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmr12.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmbx12.tfm INPUT /opt/local/share/texmf-texlive/tex/latex/base/ts1cmtt.fd INPUT /opt/local/share/texmf-texlive/tex/latex/base/ts1cmtt.fd INPUT /opt/local/share/texmf-texlive/tex/latex/base/ts1cmtt.fd INPUT /opt/local/share/texmf-texlive/tex/latex/base/ts1cmtt.fd INPUT /opt/local/share/texmf-texlive/fonts/tfm/jknappen/ec/tctt1200.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmti12.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmtt10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmmi10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmsy10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmex10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msam10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msbm10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msam5.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msbm5.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msam10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msam7.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msbm10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msbm7.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmmi12.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmsy10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmex10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msam10.tfm INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/amsfonts/symbols/msbm10.tfm INPUT ./fig/phytimetrace.pdf INPUT ./fig/phytimetrace.pdf INPUT ./fig/phytimetrace.pdf INPUT ./fig/phytimetrace.pdf INPUT /opt/local/share/texmf-texlive/fonts/tfm/public/cm/cmtt8.tfm INPUT ./phyml-manual.bbl INPUT phyml-manual.bbl INPUT ./phyml-manual.bbl INPUT phyml-manual.bbl INPUT ./phyml-manual.ind INPUT phyml-manual.ind INPUT ./phyml-manual.ind INPUT phyml-manual.ind INPUT phyml-manual.aux INPUT ./phyml-manual.out INPUT ./phyml-manual.out INPUT /opt/local/share/texmf-texlive/fonts/enc/dvips/cm-super/cm-super-ts1.enc INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmbx12.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmex10.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmmi12.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmmi6.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmmi8.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmr10.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmr12.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmr17.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmr6.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmr7.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmr8.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmsy10.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmsy8.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmti12.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmtt10.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmtt12.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmtt8.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/amsfonts/symbols/msbm10.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/cm-super/sfrm1095.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/cm-super/sfrm1200.pfb INPUT /opt/local/share/texmf-texlive/fonts/type1/public/cm-super/sftt1200.pfb stephaneguindon-phyml-76a39c8/doc/phyml-manual.idx000066400000000000000000000142711501136442400222660ustar00rootroot00000000000000\indexentry{RAxML|hyperpage}{6} \indexentry{GARLI|hyperpage}{6} \indexentry{bug|hyperpage}{6} \indexentry{compilation|hyperpage}{6} \indexentry{MPI|hyperpage}{7} \indexentry{bootstrap!parallel|hyperpage}{7} \indexentry{run ID|hyperpage}{10} \indexentry{$\kappa$|hyperpage}{11} \indexentry{ts/tv ratio|hyperpage}{11} \indexentry{PAML|hyperpage}{11} \indexentry{PHYLIP|hyperpage}{12} \indexentry{invariable sites|hyperpage}{12} \indexentry{proportion of invariants|hyperpage}{12} \indexentry{gamma distribution (discrete)!mean vs. median|hyperpage}{12} \indexentry{gamma distribution (discrete)!number of categories|hyperpage}{12} \indexentry{gamma distribution (discrete)!shape parameter|hyperpage}{12} \indexentry{BioNJ|hyperpage}{14} \indexentry{command-line options!\x{--input}|hyperpage}{15} \indexentry{command-line options!\x{--data\_type}|hyperpage}{15} \indexentry{sequence format!interleaved|hyperpage}{15} \indexentry{sequence format!sequential|hyperpage}{15} \indexentry{command-line options!\x{--sequential}|hyperpage}{15} \indexentry{multiple data sets|hyperpage}{15} \indexentry{command-line options!\x{--multiple}|hyperpage}{15} \indexentry{command-line options!\x{--pars}|hyperpage}{15} \indexentry{bootstrap|hyperpage}{15} \indexentry{command-line options!\x{--bootstrap}|hyperpage}{15} \indexentry{substitution models!DNA|hyperpage}{16} \indexentry{substitution models!amino acids|hyperpage}{16} \indexentry{command-line options!\x{--model}|hyperpage}{16} \indexentry{command-line options!\x{--aa\_rate\_file}|hyperpage}{16} \indexentry{frequencies!nucleotide|hyperpage}{16} \indexentry{frequencies!amino-acid|hyperpage}{16} \indexentry{stationary frequencies|hyperpage}{16} \indexentry{command-line options!\x{-f}|hyperpage}{16} \indexentry{custom models|hyperpage}{17} \indexentry{$\kappa$|hyperpage}{17} \indexentry{ts/tv ratio|hyperpage}{17} \indexentry{command-line options!\x{--ts/tv}|hyperpage}{17} \indexentry{proportion of invariants|hyperpage}{18} \indexentry{invariable sites|hyperpage}{18} \indexentry{command-line options!\x{--pinv}|hyperpage}{18} \indexentry{gamma distribution (discrete)!number of categories|hyperpage}{18} \indexentry{command-line options!\x{--nclasses}|hyperpage}{18} \indexentry{gamma distribution (discrete)!shape parameter|hyperpage}{18} \indexentry{command-line options!\x{--alpha}|hyperpage}{18} \indexentry{gamma distribution (discrete)!mean vs. median|hyperpage}{18} \indexentry{command-line options!\x{--use\_median}|hyperpage}{18} \indexentry{command-line options!\x{--free\_rates}|hyperpage}{18} \indexentry{command-line options!\x{--il}|hyperpage}{18} \indexentry{covarion|hyperpage}{18} \indexentry{command-line options!\x{--codpos}|hyperpage}{19} \indexentry{NNI|hyperpage}{19} \indexentry{SPR|hyperpage}{19} \indexentry{command-line options!\x{--search}|hyperpage}{19} \indexentry{input tree|hyperpage}{19} \indexentry{user tree|hyperpage}{19} \indexentry{command-line options!\x{--inputtree}|hyperpage}{19} \indexentry{optimisation!topology|hyperpage}{19} \indexentry{optimisation!substitution parameters|hyperpage}{19} \indexentry{command-line options!\x{-o}|hyperpage}{19} \indexentry{random tree|hyperpage}{19} \indexentry{command-line options!\x{--rand\_start}|hyperpage}{19} \indexentry{command-line options!\x{--n\_rand\_starts}|hyperpage}{19} \indexentry{random number|hyperpage}{19} \indexentry{command-line options!\x{--r\_seed}|hyperpage}{19} \indexentry{likelihood!print site likelihood|hyperpage}{20} \indexentry{command-line options!\x{--print\_site\_lk}|hyperpage}{20} \indexentry{command-line options!\x{--print\_trace}|hyperpage}{20} \indexentry{command-line options!\x{--json\_trace}|hyperpage}{20} \indexentry{run ID|hyperpage}{20} \indexentry{command-line options!\x{--run\_id}|hyperpage}{20} \indexentry{command-line options!\x{--no\_memory\_check}|hyperpage}{20} \indexentry{command-line options!\x{--no\_colalias}|hyperpage}{20} \indexentry{command-line options!\x{--constrained\_lens}|hyperpage}{20} \indexentry{command-line options!\x{--constraint\_file}|hyperpage}{21} \indexentry{command-line options!\x{--quiet}|hyperpage}{21} \indexentry{command-line options!\x{--ancestral}|hyperpage}{21} \indexentry{command-line options!\x{--leave\_duplicates}|hyperpage}{21} \indexentry{command-line options!\x{--xml}|hyperpage}{21} \indexentry{MPI|hyperpage}{21} \indexentry{bootstrap!parallel|hyperpage}{21} \indexentry{PHYLIP|hyperpage}{22} \indexentry{NEXUS|hyperpage}{22} \indexentry{sequential|hyperpage}{22} \indexentry{interleaved|hyperpage}{22} \indexentry{binary characters|hyperpage}{23} \indexentry{Newick format|hyperpage}{26} \indexentry{multiple data sets|hyperpage}{27} \indexentry{PAML|hyperpage}{27} \indexentry{MPEE|hyperpage}{29} \indexentry{ancestral reconstruction|hyperpage}{29} \indexentry{XML|hyperpage}{31} \indexentry{mixture models|hyperpage}{31} \indexentry{partitionned analysis|hyperpage}{32} \indexentry{data partitions|hyperpage}{32} \indexentry{multiple-gene analysis|hyperpage}{32} \indexentry{BEST|hyperpage}{33} \indexentry{STEM|hyperpage}{33} \indexentry{*BEAST|hyperpage}{33} \indexentry{mixture models|hyperpage}{38} \indexentry{partitionned analysis|hyperpage}{38} \indexentry{data partitions|hyperpage}{38} \indexentry{XML options!{\tt phyml} component|hyperpage}{40} \indexentry{XML options!{\tt topology} component|hyperpage}{41} \indexentry{XML options!{\tt ratematrices} component|hyperpage}{42} \indexentry{XML options!{\tt equfreqs} component|hyperpage}{43} \indexentry{XML options!{\tt branchlengths} component|hyperpage}{44} \indexentry{XML options!{\tt siterates} component|hyperpage}{44} \indexentry{FreeRate|hyperpage}{45} \indexentry{XML options!{\tt partitionelem} component|hyperpage}{46} \indexentry{XML options!{\tt mixtureelem} component|hyperpage}{46} \indexentry{lg4x|hyperpage}{48} \indexentry{CAT model|hyperpage}{51} \indexentry{PhyTime|hyperpage}{56} \indexentry{PhyTime!calibration|hyperpage}{57} \indexentry{PhyTime!lineagerates|hyperpage}{57} \indexentry{PhyTime!clade|hyperpage}{58} \indexentry{MRCA|hyperpage}{60} \indexentry{Tracer|hyperpage}{63} \indexentry{BEAST|hyperpage}{63} \indexentry{Icylog|hyperpage}{63} \indexentry{PhyloGeo|hyperpage}{67} \indexentry{PhyREX|hyperpage}{68} \indexentry{RRW (model)|hyperpage}{69} \indexentry{relaxed clock (model)|hyperpage}{71} stephaneguindon-phyml-76a39c8/doc/phyml-manual.ilg000066400000000000000000000005441501136442400222530ustar00rootroot00000000000000This is makeindex, version 2.16 [TeX Live 2022] (kpathsea + Thai support). Scanning input file phyml-manual.idx....done (126 entries accepted, 0 rejected). Sorting entries....done (934 comparisons). Generating output file phyml-manual.ind....done (175 lines written, 0 warnings). Output written in phyml-manual.ind. Transcript written in phyml-manual.ilg. stephaneguindon-phyml-76a39c8/doc/phyml-manual.ind000066400000000000000000000122231501136442400222470ustar00rootroot00000000000000\begin{theindex} \item $\kappa$, \hyperpage{11}, \hyperpage{17} \item *BEAST, \hyperpage{33} \indexspace \item ancestral reconstruction, \hyperpage{29} \indexspace \item BEAST, \hyperpage{63} \item BEST, \hyperpage{33} \item binary characters, \hyperpage{23} \item BioNJ, \hyperpage{14} \item bootstrap, \hyperpage{15} \subitem parallel, \hyperpage{7}, \hyperpage{21} \item bug, \hyperpage{6} \indexspace \item CAT model, \hyperpage{51} \item command-line options \subitem \x{--constraint\_file}, \hyperpage{21} \item command-line options \subitem \x{--aa\_rate\_file}, \hyperpage{16} \subitem \x{--alpha}, \hyperpage{18} \subitem \x{--ancestral}, \hyperpage{21} \subitem \x{--bootstrap}, \hyperpage{15} \subitem \x{--codpos}, \hyperpage{19} \subitem \x{--constrained\_lens}, \hyperpage{20} \subitem \x{--data\_type}, \hyperpage{15} \subitem \x{--free\_rates}, \hyperpage{18} \subitem \x{--il}, \hyperpage{18} \subitem \x{--inputtree}, \hyperpage{19} \subitem \x{--input}, \hyperpage{15} \subitem \x{--json\_trace}, \hyperpage{20} \subitem \x{--leave\_duplicates}, \hyperpage{21} \subitem \x{--model}, \hyperpage{16} \subitem \x{--multiple}, \hyperpage{15} \subitem \x{--n\_rand\_starts}, \hyperpage{19} \subitem \x{--nclasses}, \hyperpage{18} \subitem \x{--no\_colalias}, \hyperpage{20} \subitem \x{--no\_memory\_check}, \hyperpage{20} \subitem \x{--pars}, \hyperpage{15} \subitem \x{--pinv}, \hyperpage{18} \subitem \x{--print\_site\_lk}, \hyperpage{20} \subitem \x{--print\_trace}, \hyperpage{20} \subitem \x{--quiet}, \hyperpage{21} \subitem \x{--r\_seed}, \hyperpage{19} \subitem \x{--rand\_start}, \hyperpage{19} \subitem \x{--run\_id}, \hyperpage{20} \subitem \x{--search}, \hyperpage{19} \subitem \x{--sequential}, \hyperpage{15} \subitem \x{--ts/tv}, \hyperpage{17} \subitem \x{--use\_median}, \hyperpage{18} \subitem \x{--xml}, \hyperpage{21} \subitem \x{-f}, \hyperpage{16} \subitem \x{-o}, \hyperpage{19} \item compilation, \hyperpage{6} \item covarion, \hyperpage{18} \item custom models, \hyperpage{17} \indexspace \item data partitions, \hyperpage{32}, \hyperpage{38} \indexspace \item FreeRate, \hyperpage{45} \item frequencies \subitem amino-acid, \hyperpage{16} \subitem nucleotide, \hyperpage{16} \indexspace \item gamma distribution (discrete) \subitem mean vs. median, \hyperpage{12}, \hyperpage{18} \subitem number of categories, \hyperpage{12}, \hyperpage{18} \subitem shape parameter, \hyperpage{12}, \hyperpage{18} \item GARLI, \hyperpage{6} \indexspace \item Icylog, \hyperpage{63} \item input tree, \hyperpage{19} \item interleaved, \hyperpage{22} \item invariable sites, \hyperpage{12}, \hyperpage{18} \indexspace \item lg4x, \hyperpage{48} \item likelihood \subitem print site likelihood, \hyperpage{20} \indexspace \item mixture models, \hyperpage{38} \item mixture models, \hyperpage{31} \item MPEE, \hyperpage{29} \item MPI, \hyperpage{7}, \hyperpage{21} \item MRCA, \hyperpage{60} \item multiple data sets, \hyperpage{15}, \hyperpage{27} \item multiple-gene analysis, \hyperpage{32} \indexspace \item Newick format, \hyperpage{26} \item NEXUS, \hyperpage{22} \item NNI, \hyperpage{19} \indexspace \item optimisation \subitem substitution parameters, \hyperpage{19} \subitem topology, \hyperpage{19} \indexspace \item PAML, \hyperpage{11}, \hyperpage{27} \item partitionned analysis, \hyperpage{32}, \hyperpage{38} \item PHYLIP, \hyperpage{12}, \hyperpage{22} \item PhyloGeo, \hyperpage{67} \item PhyREX, \hyperpage{68} \item PhyTime, \hyperpage{56} \subitem calibration, \hyperpage{57} \subitem clade, \hyperpage{58} \subitem lineagerates, \hyperpage{57} \item proportion of invariants, \hyperpage{12}, \hyperpage{18} \indexspace \item random number, \hyperpage{19} \item random tree, \hyperpage{19} \item RAxML, \hyperpage{6} \item relaxed clock (model), \hyperpage{71} \item RRW (model), \hyperpage{69} \item run ID, \hyperpage{10}, \hyperpage{20} \indexspace \item sequence format \subitem interleaved, \hyperpage{15} \subitem sequential, \hyperpage{15} \item sequential, \hyperpage{22} \item SPR, \hyperpage{19} \item stationary frequencies, \hyperpage{16} \item STEM, \hyperpage{33} \item substitution models \subitem amino acids, \hyperpage{16} \subitem DNA, \hyperpage{16} \indexspace \item Tracer, \hyperpage{63} \item ts/tv ratio, \hyperpage{11}, \hyperpage{17} \indexspace \item user tree, \hyperpage{19} \indexspace \item XML, \hyperpage{31} \item XML options \subitem {\tt branchlengths} component, \hyperpage{44} \subitem {\tt equfreqs} component, \hyperpage{43} \subitem {\tt mixtureelem} component, \hyperpage{46} \subitem {\tt partitionelem} component, \hyperpage{46} \subitem {\tt phyml} component, \hyperpage{40} \subitem {\tt ratematrices} component, \hyperpage{42} \subitem {\tt siterates} component, \hyperpage{44} \subitem {\tt topology} component, \hyperpage{41} \end{theindex} stephaneguindon-phyml-76a39c8/doc/phyml-manual.log000066400000000000000000001336671501136442400222760ustar00rootroot00000000000000This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/MacPorts 2022.62882_3) (preloaded format=pdflatex 2023.5.22) 29 JAN 2025 14:39 entering extended mode restricted \write18 enabled. file:line:error style messages enabled. %&-line parsing enabled. **/Users/guindon/phyml/doc/phyml-manual.tex (/Users/guindon/phyml/doc/phyml-manual.tex LaTeX2e <2021-11-15> patch level 1 L3 programming layer <2022-02-24> (/opt/local/share/texmf-texlive/tex/latex/base/article.cls Document Class: article 2021/10/04 v1.4n Standard LaTeX document class (/opt/local/share/texmf-texlive/tex/latex/base/size12.clo File: size12.clo 2021/10/04 v1.4n Standard LaTeX file (size option) ) \c@part=\count185 \c@section=\count186 \c@subsection=\count187 \c@subsubsection=\count188 \c@paragraph=\count189 \c@subparagraph=\count190 \c@figure=\count191 \c@table=\count192 \abovecaptionskip=\skip47 \belowcaptionskip=\skip48 \bibindent=\dimen138 ) (/opt/local/share/texmf-texlive/tex/latex/fancyvrb/fancyvrb.sty Package: fancyvrb 2021/12/21 4.1b verbatim text (tvz,hv) (/opt/local/share/texmf-texlive/tex/latex/graphics/keyval.sty Package: keyval 2014/10/28 v1.15 key=value parser (DPC) \KV@toks@=\toks16 ) \FV@CodeLineNo=\count193 \FV@InFile=\read2 \FV@TabBox=\box50 \c@FancyVerbLine=\count194 \FV@StepNumber=\count195 \FV@OutFile=\write3 ) (/opt/local/share/texmf-texlive/tex/latex/amsfonts/amsfonts.sty Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support \@emptytoks=\toks17 \symAMSa=\mathgroup4 \symAMSb=\mathgroup5 LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' (Font) U/euf/m/n --> U/euf/b/n on input line 106. ) (/opt/local/share/texmf-texlive/tex/latex/graphics/graphicx.sty Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) (/opt/local/share/texmf-texlive/tex/latex/graphics/graphics.sty Package: graphics 2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR) (/opt/local/share/texmf-texlive/tex/latex/graphics/trig.sty Package: trig 2021/08/11 v1.11 sin cos tan (DPC) ) (/opt/local/share/texmf-texlive/tex/latex/graphics-cfg/graphics.cfg File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration ) Package graphics Info: Driver file: pdftex.def on input line 107. (/opt/local/share/texmf-texlive/tex/latex/graphics-def/pdftex.def File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex )) \Gin@req@height=\dimen139 \Gin@req@width=\dimen140 ) (/opt/local/share/texmf-texlive/tex/latex/tools/tabularx.sty Package: tabularx 2020/01/15 v2.11c `tabularx' package (DPC) (/opt/local/share/texmf-texlive/tex/latex/tools/array.sty Package: array 2021/10/04 v2.5f Tabular extension package (FMi) \col@sep=\dimen141 \ar@mcellbox=\box51 \extrarowheight=\dimen142 \NC@list=\toks18 \extratabsurround=\skip49 \backup@length=\skip50 \ar@cellbox=\box52 ) \TX@col@width=\dimen143 \TX@old@table=\dimen144 \TX@old@col=\dimen145 \TX@target=\dimen146 \TX@delta=\dimen147 \TX@cols=\count196 \TX@ftn=\toks19 ) (/opt/local/share/texmf-texlive/tex/latex/xcolor/xcolor.sty Package: xcolor 2021/10/31 v2.13 LaTeX color extensions (UK) (/opt/local/share/texmf-texlive/tex/latex/graphics-cfg/color.cfg File: color.cfg 2016/01/02 v1.6 sample color configuration ) Package xcolor Info: Driver file: pdftex.def on input line 227. Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1352. Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1356. Package xcolor Info: Model `RGB' extended on input line 1368. Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1370. Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1371. Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1372. Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1373. Package xcolor Info: Model `Gray' substituted by `gray' on input line 1374. Package xcolor Info: Model `wave' substituted by `hsb' on input line 1375. ) (/opt/local/share/texmf-texlive/tex/latex/psfrag/psfrag.sty Package: psfrag 1998/04/11 v3.04 PSfrag (MCG) \pfg@pcount=\count197 \pfg@scount=\count198 \pfg@temp=\write4 ) (/opt/local/share/texmf-texlive/tex/latex/url/url.sty \Urlmuskip=\muskip16 Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. ) (/opt/local/share/texmf-texlive/tex/latex/cite/cite.sty LaTeX Info: Redefining \cite on input line 302. LaTeX Info: Redefining \nocite on input line 332. Package: cite 2015/02/27 v 5.5 ) (/opt/local/share/texmf-texlive/tex/latex/caption/caption2.sty Package: caption2 2021/01/20 v2.2i Customising captions (AR) (/opt/local/share/texmf-texlive/tex/latex/caption/caption3.sty Package: caption3 2022/03/17 v2.3b caption3 kernel (AR) \caption@tempdima=\dimen148 \captionmargin=\dimen149 \caption@leftmargin=\dimen150 \caption@rightmargin=\dimen151 \caption@width=\dimen152 \caption@indent=\dimen153 \caption@parindent=\dimen154 \caption@hangindent=\dimen155 Package caption Info: Standard document class detected. ) Package caption2 Info: Running in caption2 v2.0 compatibility mode on input line 231. \captionlinewidth=\dimen156 \realcaptionwidth=\dimen157 Package caption2 Info: float package is not loaded on input line 335. Package caption2 Info: longtable package is not loaded on input line 352. Package caption2 Info: subfigure package is not loaded on input line 445. ) (/opt/local/share/texmf-texlive/tex/latex/hyperref/hyperref.sty Package: hyperref 2022-02-21 v7.00n Hypertext links for LaTeX (/opt/local/share/texmf-texlive/tex/generic/ltxcmds/ltxcmds.sty Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) ) (/opt/local/share/texmf-texlive/tex/generic/iftex/iftex.sty Package: iftex 2022/02/03 v1.0f TeX engine tests ) (/opt/local/share/texmf-texlive/tex/generic/pdftexcmds/pdftexcmds.sty Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO) (/opt/local/share/texmf-texlive/tex/generic/infwarerr/infwarerr.sty Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) ) Package pdftexcmds Info: \pdf@primitive is available. Package pdftexcmds Info: \pdf@ifprimitive is available. Package pdftexcmds Info: \pdfdraftmode found. ) (/opt/local/share/texmf-texlive/tex/generic/kvsetkeys/kvsetkeys.sty Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) ) (/opt/local/share/texmf-texlive/tex/generic/kvdefinekeys/kvdefinekeys.sty Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) ) (/opt/local/share/texmf-texlive/tex/generic/pdfescape/pdfescape.sty Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) ) (/opt/local/share/texmf-texlive/tex/latex/hycolor/hycolor.sty Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) ) (/opt/local/share/texmf-texlive/tex/latex/letltxmacro/letltxmacro.sty Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) ) (/opt/local/share/texmf-texlive/tex/latex/auxhook/auxhook.sty Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) ) (/opt/local/share/texmf-texlive/tex/latex/kvoptions/kvoptions.sty Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) ) \@linkdim=\dimen158 \Hy@linkcounter=\count199 \Hy@pagecounter=\count266 (/opt/local/share/texmf-texlive/tex/latex/hyperref/pd1enc.def File: pd1enc.def 2022-02-21 v7.00n Hyperref: PDFDocEncoding definition (HO) Now handling font encoding PD1 ... ... no UTF-8 mapping file for font encoding PD1 ) (/opt/local/share/texmf-texlive/tex/generic/intcalc/intcalc.sty Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) ) (/opt/local/share/texmf-texlive/tex/generic/etexcmds/etexcmds.sty Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) ) \Hy@SavedSpaceFactor=\count267 (/opt/local/share/texmf-texlive/tex/latex/hyperref/puenc.def File: puenc.def 2022-02-21 v7.00n Hyperref: PDF Unicode definition (HO) Now handling font encoding PU ... ... no UTF-8 mapping file for font encoding PU ) Package hyperref Info: Hyper figures OFF on input line 4137. Package hyperref Info: Link nesting OFF on input line 4142. Package hyperref Info: Hyper index ON on input line 4145. Package hyperref Info: Plain pages OFF on input line 4152. Package hyperref Info: Backreferencing OFF on input line 4157. Package hyperref Info: Implicit mode ON; LaTeX internals redefined. Package hyperref Info: Bookmarks ON on input line 4390. \c@Hy@tempcnt=\count268 LaTeX Info: Redefining \url on input line 4749. \XeTeXLinkMargin=\dimen159 (/opt/local/share/texmf-texlive/tex/generic/bitset/bitset.sty Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) (/opt/local/share/texmf-texlive/tex/generic/bigintcalc/bigintcalc.sty Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO) )) \Fld@menulength=\count269 \Field@Width=\dimen160 \Fld@charsize=\dimen161 Package hyperref Info: Hyper figures OFF on input line 6027. Package hyperref Info: Link nesting OFF on input line 6032. Package hyperref Info: Hyper index ON on input line 6035. Package hyperref Info: backreferencing OFF on input line 6042. Package hyperref Info: Link coloring OFF on input line 6047. Package hyperref Info: Link coloring with OCG OFF on input line 6052. Package hyperref Info: PDF/A mode OFF on input line 6057. LaTeX Info: Redefining \ref on input line 6097. LaTeX Info: Redefining \pageref on input line 6101. (/opt/local/share/texmf-texlive/tex/latex/base/atbegshi-ltx.sty Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi package with kernel methods ) \Hy@abspage=\count270 \c@Item=\count271 \c@Hfootnote=\count272 ) Package hyperref Info: Driver (autodetected): hpdftex. (/opt/local/share/texmf-texlive/tex/latex/hyperref/hpdftex.def File: hpdftex.def 2022-02-21 v7.00n Hyperref driver for pdfTeX (/opt/local/share/texmf-texlive/tex/latex/base/atveryend-ltx.sty Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend package with kernel methods ) \Fld@listcount=\count273 \c@bookmark@seq@number=\count274 (/opt/local/share/texmf-texlive/tex/latex/rerunfilecheck/rerunfilecheck.sty Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) (/opt/local/share/texmf-texlive/tex/generic/uniquecounter/uniquecounter.sty Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) ) Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 286. ) \Hy@SectionHShift=\skip51 ) (/opt/local/share/texmf-texlive/tex/latex/base/makeidx.sty Package: makeidx 2021/10/04 v1.0m Standard LaTeX package ) (/opt/local/share/texmf-texlive/tex/latex/amsmath/amsmath.sty Package: amsmath 2021/10/15 v2.17l AMS math features \@mathmargin=\skip52 For additional information on amsmath, use the `?' option. (/opt/local/share/texmf-texlive/tex/latex/amsmath/amstext.sty Package: amstext 2021/08/26 v2.01 AMS text (/opt/local/share/texmf-texlive/tex/latex/amsmath/amsgen.sty File: amsgen.sty 1999/11/30 v2.0 generic functions \@emptytoks=\toks20 \ex@=\dimen162 )) (/opt/local/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty Package: amsbsy 1999/11/29 v1.2d Bold Symbols \pmbraise@=\dimen163 ) (/opt/local/share/texmf-texlive/tex/latex/amsmath/amsopn.sty Package: amsopn 2021/08/26 v2.02 operator names ) \inf@bad=\count275 LaTeX Info: Redefining \frac on input line 234. \uproot@=\count276 \leftroot@=\count277 LaTeX Info: Redefining \overline on input line 399. \classnum@=\count278 \DOTSCASE@=\count279 LaTeX Info: Redefining \ldots on input line 496. LaTeX Info: Redefining \dots on input line 499. LaTeX Info: Redefining \cdots on input line 620. \Mathstrutbox@=\box53 \strutbox@=\box54 \big@size=\dimen164 LaTeX Font Info: Redeclaring font encoding OML on input line 743. LaTeX Font Info: Redeclaring font encoding OMS on input line 744. \macc@depth=\count280 \c@MaxMatrixCols=\count281 \dotsspace@=\muskip17 \c@parentequation=\count282 \dspbrk@lvl=\count283 \tag@help=\toks21 \row@=\count284 \column@=\count285 \maxfields@=\count286 \andhelp@=\toks22 \eqnshift@=\dimen165 \alignsep@=\dimen166 \tagshift@=\dimen167 \tagwidth@=\dimen168 \totwidth@=\dimen169 \lineht@=\dimen170 \@envbody=\toks23 \multlinegap=\skip53 \multlinetaggap=\skip54 \mathdisplay@stack=\toks24 LaTeX Info: Redefining \[ on input line 2938. LaTeX Info: Redefining \] on input line 2939. ) Package hyperref Info: Option `colorlinks' set `true' on input line 37. \@indexfile=\write5 \openout5 = `phyml-manual.idx'. Writing index file phyml-manual.idx (/opt/local/share/texmf-texlive/tex/latex/l3backend/l3backend-pdftex.def File: l3backend-pdftex.def 2022-02-07 L3 backend support: PDF output (pdfTeX) \l__color_backend_stack_int=\count287 \l__pdf_internal_box=\box55 ) (./phyml-manual.aux) \openout1 = `phyml-manual.aux'. LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 40. LaTeX Font Info: ... okay on input line 40. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 40. LaTeX Font Info: ... okay on input line 40. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 40. LaTeX Font Info: ... okay on input line 40. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 40. LaTeX Font Info: ... okay on input line 40. LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 40. LaTeX Font Info: ... okay on input line 40. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 40. LaTeX Font Info: ... okay on input line 40. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 40. LaTeX Font Info: ... okay on input line 40. LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 40. LaTeX Font Info: ... okay on input line 40. LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 40. LaTeX Font Info: ... okay on input line 40. (/opt/local/share/texmf-texlive/tex/context/base/mkii/supp-pdf.mkii [Loading MPS to PDF converter (version 2006.09.02).] \scratchcounter=\count288 \scratchdimen=\dimen171 \scratchbox=\box56 \nofMPsegments=\count289 \nofMParguments=\count290 \everyMPshowfont=\toks25 \MPscratchCnt=\count291 \MPscratchDim=\dimen172 \MPnumerator=\count292 \makeMPintoPDFobject=\count293 \everyMPtoPDFconversion=\toks26 ) (/opt/local/share/texmf-texlive/tex/latex/epstopdf-pkg/epstopdf-base.sty Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf (/opt/local/share/texmf-texlive/tex/latex/grfext/grfext.sty Package: grfext 2019/12/03 v1.3 Manage graphics extensions (HO) ) Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 485. Package grfext Info: Graphics extension search list: (grfext) [.pdf,.png,.jpg,.mps,.jpeg,.jbig2,.jb2,.PDF,.PNG,.JPG,.JPEG,.JBIG2,.JB2,.eps] (grfext) \AppendGraphicsExtensions on input line 504. (/opt/local/share/texmf-texlive/tex/latex/latexconfig/epstopdf-sys.cfg File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Live )) Package caption Info: Begin \AtBeginDocument code. Package caption Info: End \AtBeginDocument code. Package hyperref Info: Link coloring ON on input line 40. (/opt/local/share/texmf-texlive/tex/latex/hyperref/nameref.sty Package: nameref 2021-04-02 v2.47 Cross-referencing by name of section (/opt/local/share/texmf-texlive/tex/latex/refcount/refcount.sty Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) ) (/opt/local/share/texmf-texlive/tex/generic/gettitlestring/gettitlestring.sty Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) ) \c@section@level=\count294 ) LaTeX Info: Redefining \ref on input line 40. LaTeX Info: Redefining \pageref on input line 40. LaTeX Info: Redefining \nameref on input line 40. (./phyml-manual.out) (./phyml-manual.out) \@outlinefile=\write6 \openout6 = `phyml-manual.out'. [1 Non-PDF special ignored! header=psfrag.pro {/opt/local/var/db/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./phyml-manual.toc LaTeX Font Info: Trying to load font information for U+msa on input line 6. (/opt/local/share/texmf-texlive/tex/latex/amsfonts/umsa.fd File: umsa.fd 2013/01/14 v3.01 AMS symbols A ) LaTeX Font Info: Trying to load font information for U+msb on input line 6. (/opt/local/share/texmf-texlive/tex/latex/amsfonts/umsb.fd File: umsb.fd 2013/01/14 v3.01 AMS symbols B ) [2 ] [3]) \tf@toc=\write7 \openout7 = `phyml-manual.toc'. [4] [5 ] [6 ] LaTeX Font Info: Trying to load font information for TS1+cmtt on input line 177. (/opt/local/share/texmf-texlive/tex/latex/base/ts1cmtt.fd File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions ) Underfull \hbox (badness 1552) in paragraph at lines 194--202 []\OT1/cmr/m/n/12 This fea-ture of PhyML re-lies on the MPI (Mes-sage Pass-ing In- [] Underfull \hbox (badness 2582) in paragraph at lines 194--202 \OT1/cmr/m/n/12 on it. In case MPI is not in-stalled, you can dowload it from [] [7] Underfull \hbox (badness 10000) in paragraph at lines 224--236 [] [8] [9] [10] [11] [12] [13] [14] [15] Underfull \hbox (badness 10000) in paragraph at lines 513--523 []\OT1/cmr/m/it/12 Nucleotide-based mod-els\OT1/cmr/m/n/12 : \OT1/cmtt/m/n/12 HKY85 \OT1/cmr/m/n/12 (de-fault) \OT1/cmtt/m/n/12 | JC69 [] Underfull \hbox (badness 10000) in paragraph at lines 513--523 \OT1/cmtt/m/n/12 | K80 | F81 | F84 | TN93 | GTR | custom | [] Underfull \hbox (badness 10000) in paragraph at lines 524--530 \OT1/cmtt/m/n/12 | Dayhoff | DCMut | RtREV | CpREV | VT | Blosum62 | [] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] Overfull \hbox (18.15683pt too wide) in paragraph at lines 992--992 []\OT1/cmtt/m/n/10.95 ((seq1:0.03,seq2:0.01):0.04,(seq3:0.01,(seq4:0.2,seq5:0.05):0.2):0.01);[] [] Underfull \hbox (badness 10000) in paragraph at lines 988--996 [] [26] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1025--1025 []|\OT1/cmr/m/n/6 0.55| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1026--1026 []|\OT1/cmr/m/n/6 0.51| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1026--1026 []|\OT1/cmr/m/n/6 0.64| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1027--1027 []|\OT1/cmr/m/n/6 0.74| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1027--1027 []|\OT1/cmr/m/n/6 0.15| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1027--1027 []|\OT1/cmr/m/n/6 5.43| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1028--1028 []|\OT1/cmr/m/n/6 1.03| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1028--1028 []|\OT1/cmr/m/n/6 0.53| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1028--1028 []|\OT1/cmr/m/n/6 0.27| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1028--1028 []|\OT1/cmr/m/n/6 0.03| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1029--1029 []|\OT1/cmr/m/n/6 0.91| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1029--1029 []|\OT1/cmr/m/n/6 3.04| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1029--1029 []|\OT1/cmr/m/n/6 1.54| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1029--1029 []|\OT1/cmr/m/n/6 0.62| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1029--1029 []|\OT1/cmr/m/n/6 0.10| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1030--1030 []|\OT1/cmr/m/n/6 1.58| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1030--1030 []|\OT1/cmr/m/n/6 0.44| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1030--1030 []|\OT1/cmr/m/n/6 0.95| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1030--1030 []|\OT1/cmr/m/n/6 6.17| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1030--1030 []|\OT1/cmr/m/n/6 0.02| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1030--1030 []|\OT1/cmr/m/n/6 5.47| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1031--1031 []|\OT1/cmr/m/n/6 1.42| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1031--1031 []|\OT1/cmr/m/n/6 0.58| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1031--1031 []|\OT1/cmr/m/n/6 1.13| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1031--1031 []|\OT1/cmr/m/n/6 0.87| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1031--1031 []|\OT1/cmr/m/n/6 0.31| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1031--1031 []|\OT1/cmr/m/n/6 0.33| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1031--1031 []|\OT1/cmr/m/n/6 0.57| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1032--1032 []|\OT1/cmr/m/n/6 0.32| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1032--1032 []|\OT1/cmr/m/n/6 2.14| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1032--1032 []|\OT1/cmr/m/n/6 3.96| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1032--1032 []|\OT1/cmr/m/n/6 0.93| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1032--1032 []|\OT1/cmr/m/n/6 0.25| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1032--1032 []|\OT1/cmr/m/n/6 4.29| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1032--1032 []|\OT1/cmr/m/n/6 0.57| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1032--1032 []|\OT1/cmr/m/n/6 0.25| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1033--1033 []|\OT1/cmr/m/n/6 0.19| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1033--1033 []|\OT1/cmr/m/n/6 0.19| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1033--1033 []|\OT1/cmr/m/n/6 0.55| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1033--1033 []|\OT1/cmr/m/n/6 0.04| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1033--1033 []|\OT1/cmr/m/n/6 0.17| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1033--1033 []|\OT1/cmr/m/n/6 0.11| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1033--1033 []|\OT1/cmr/m/n/6 0.13| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1033--1033 []|\OT1/cmr/m/n/6 0.03| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1033--1033 []|\OT1/cmr/m/n/6 0.14| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 0.40| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 0.50| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 0.13| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 0.08| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 0.38| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 0.87| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 0.15| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 0.06| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 0.50| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1034--1034 []|\OT1/cmr/m/n/6 3.17| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 0.91| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 5.35| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 3.01| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 0.48| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 0.07| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 3.89| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 2.58| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 0.37| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 0.89| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 0.32| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1035--1035 []|\OT1/cmr/m/n/6 0.26| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 0.89| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 0.68| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 0.20| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 0.10| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 0.39| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 1.55| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 0.32| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 0.17| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 0.40| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 4.26| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 4.85| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1036--1036 []|\OT1/cmr/m/n/6 0.93| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.21| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.10| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.10| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.05| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.40| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.10| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.08| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.05| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.68| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 1.06| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 2.12| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 0.09| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1037--1037 []|\OT1/cmr/m/n/6 1.19| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 1.44| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.68| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.20| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.42| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.11| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.93| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.68| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.24| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.70| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.10| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.42| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.56| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.17| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1038--1038 []|\OT1/cmr/m/n/6 0.16| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 3.37| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 1.22| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 3.97| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 1.07| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 1.41| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 1.03| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 0.70| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 1.34| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 0.74| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 0.32| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 0.34| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 0.97| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 0.49| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 0.55| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1039--1039 []|\OT1/cmr/m/n/6 1.61| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 2.12| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.55| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 2.03| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.37| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.51| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.86| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.82| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.23| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.47| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 1.46| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.33| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 1.39| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 1.52| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.17| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 0.80| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1040--1040 []|\OT1/cmr/m/n/6 4.38| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.11| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 1.16| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.07| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.13| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.72| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.22| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.16| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.34| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.26| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.21| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.67| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.14| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.52| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 1.53| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.14| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.52| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1041--1041 []|\OT1/cmr/m/n/6 0.11| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.24| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.38| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 1.09| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.33| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.54| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.23| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.20| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.10| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 3.87| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.42| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.40| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.13| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.43| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 6.45| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.22| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.79| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 0.29| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1042--1042 []|\OT1/cmr/m/n/6 2.49| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 2.01| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.25| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.20| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.15| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 1.00| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.30| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.59| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.19| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.12| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 7.82| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 1.80| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.31| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 2.06| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.65| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.31| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.23| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 1.39| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.37| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1043--1043 []|\OT1/cmr/m/n/6 0.31| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 8.66| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 4.40| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 3.91| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 5.70| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 1.93| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 3.67| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 5.81| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 8.33| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 2.44| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 4.85| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 8.62| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 6.20| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 1.95| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 3.84| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 4.58| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 6.95| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 6.10| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 1.44| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1045 []|\OT1/cmr/m/n/6 3.53| [] Overfull \hbox (3.72147pt too wide) in paragraph at lines 1045--1046 []|\OT1/cmr/m/n/6 7.09| [] Overfull \hbox (37.789pt too wide) in paragraph at lines 1022--1048 [] [] [27] Underfull \hbox (badness 10000) in paragraph at lines 1089--1090 [] Overfull \hbox (76.94775pt too wide) in paragraph at lines 1091--1104 [] [] [28] [29] [30] [31] [32] Package hyperref Warning: Suppressing link with empty target on input line 1266. [33] Overfull \hbox (39.8485pt too wide) in alignment at lines 1313--1319 [][][] [] [] [34] Underfull \hbox (badness 1968) in paragraph at lines 1335--1339 \OT1/cmr/m/n/12 po-nents of a mix-ture are in-de-pen-dant. In other words, we have [] [35] [36] [37] Underfull \hbox (badness 2189) in paragraph at lines 1492--1492 []\OT1/cmr/bx/n/14.4 Setting up mix-ture and par-ti-tion mod-els in [] [38] [39] [40] Underfull \hbox (badness 1430) in paragraph at lines 1656--1658 []\OT1/cmtt/m/n/12 optimise.tree="yes"|"true"|"no"|"false"\OT1/cmr/m/n/12 . The start-ing tree [] [41] Overfull \hbox (9.87488pt too wide) in paragraph at lines 1675--1678 []\OT1/cmtt/m/n/12 model="JC69"|"K80"|"F81"|"F84"|"HKY85"|"TN93"|"GTR"|"custom" [] Overfull \hbox (65.4499pt too wide) in paragraph at lines 1675--1678 \OT1/cmtt/m/n/12 model="LG"|"WAG"|"JTT"|"MtREV"|"Dayhoff"|"DCMut"|"RtREV"|"CpREV"|"VT" [] Underfull \hbox (badness 10000) in paragraph at lines 1675--1678 \OT1/cmtt/m/n/12 |"Blosum62"|"MtMam"|"MtArt"|"HIVw"|"HIVb"|"customaa" \OT1/cmr/m/n/12 for [] Underfull \hbox (badness 1077) in paragraph at lines 1682--1686 []\OT1/cmtt/m/n/12 ratematrix.code="filename"\OT1/cmr/m/n/12 . When used in con-junc-tion with [] [42] Package hyperref Warning: Suppressing link with empty target on input line 1700. Underfull \hbox (badness 10000) in paragraph at lines 1698--1701 []\OT1/cmr/m/n/12 Also, the \OT1/cmtt/m/n/12 ratematrices \OT1/cmr/m/n/12 com-po-nent has the at-tribute [] Package hyperref Warning: Suppressing link with empty target on input line 1729. [43] [44] [45] Underfull \hbox (badness 1087) in paragraph at lines 1841--1846 []\OT1/cmtt/m/n/12 optimise.tree.scale="yes|true|no|false"\OT1/cmr/m/n/12 . The sum of edge [] Underfull \hbox (badness 2376) in paragraph at lines 1848--1850 []\OT1/cmtt/m/n/12 print.site.lk="yes|true|no|false"\OT1/cmr/m/n/12 . The like-li-hood at each [] Underfull \hbox (badness 2460) in paragraph at lines 1848--1850 \OT1/cmr/m/n/12 site (and other in-for-ma-tion) will be writ-ten in a file named [] [46] Package hyperref Warning: Token not allowed in a PDF string (Unicode): (hyperref) removing `math shift' on input line 1900. Package hyperref Warning: Token not allowed in a PDF string (Unicode): (hyperref) removing `\Gamma' on input line 1900. Package hyperref Warning: Token not allowed in a PDF string (Unicode): (hyperref) removing `math shift' on input line 1900. [47] [48] [49] Underfull \hbox (badness 7012) in paragraph at lines 2047--2051 []\OT1/cmr/m/n/12 In or-der to fit the LG4X model to the \OT1/cmtt/m/n/12 proteic \OT1/cmr/m/n/12 se-quence [] Underfull \hbox (badness 8056) in paragraph at lines 2047--2051 \OT1/cmr/m/n/12 file pro-vided in the \OT1/cmtt/m/n/12 examples/ \OT1/cmr/m/n/12 di-rec-tory, sim-ply type \OT1/cmtt/m/n/12 ./phyml [] [50] [51] [52] [53] [54] [55] [56] Underfull \hbox (badness 1127) in paragraph at lines 2333--2335 []\OT1/cmtt/m/n/12 model=strictclock \OT1/cmr/m/n/12 or \OT1/cmtt/m/n/12 model=clock \OT1/cmr/m/n/12 im-ple-ments the strict clock [] [57] [58] [59] [60] [61] [62] Underfull \hbox (badness 2913) in paragraph at lines 2583--2587 \OT1/cmr/m/n/12 used to run an anal-y-sis (us-ing the fol-low-ing com-mand: \OT1/cmtt/m/n/12 phytime [] [63] Underfull \hbox (badness 1406) in paragraph at lines 2628--2633 []\OT1/cmr/m/n/12 The script be-low can be copied and pasted into R in or-der to [] Underfull \hbox (badness 1371) in paragraph at lines 2628--2633 \OT1/cmr/m/n/12 pro-duce the plots in Fig-ure [][]4[][] (as-sum-ing R was launched from the [] [64] <./fig/phytimetrace.pdf, id=829, 505.89pt x 505.89pt> File: ./fig/phytimetrace.pdf Graphic file (type pdf) Package pdftex.def Info: ./fig/phytimetrace.pdf used on input line 2668. (pdftex.def) Requested size: 392.64812pt x 392.65506pt. Overfull \hbox (2.64812pt too wide) in paragraph at lines 2668--2669 [] [] [65] [66 <./fig/phytimetrace.pdf>] [67] [68] [69] [70] Underfull \hbox (badness 10000) in paragraph at lines 2968--2975 []\OT1/cmr/m/it/12 Variation of rates across lin-eages (a.k.a. re-laxed clock[]). [] [71] Underfull \hbox (badness 1515) in paragraph at lines 2975--2983 []\OT1/cmr/m/it/12 Tree gen-er-at-ing model. \OT1/cmtt/m/n/12 \OT1/cmr/m/n/12 com-po-nent. Us-ing [] Underfull \hbox (badness 1442) in paragraph at lines 2975--2983 \OT1/cmr/m/n/12 other op-tions are given, King-man's co-a-les-cent is used. Us-ing [] [72] [73] [74] [75] [76] Underfull \hbox (badness 10000) in paragraph at lines 3218--3219 [] [77] Underfull \hbox (badness 10000) in paragraph at lines 3225--3226 [] Underfull \hbox (badness 10000) in paragraph at lines 3230--3231 [] Underfull \hbox (badness 10000) in paragraph at lines 3235--3236 [] Underfull \hbox (badness 10000) in paragraph at lines 3240--3241 [] (./phyml-manual.bbl [78] [79] [80] Underfull \hbox (badness 10000) in paragraph at lines 256--262 []\OT1/cmr/m/n/12 Oliva, A. \OT1/cmr/m/it/12 et al. \OT1/cmr/m/n/12 Ac-count-ing for am-bi-gu-ity in [] Underfull \hbox (badness 10000) in paragraph at lines 256--262 \OT1/cmr/m/n/12 an-ces-tral se-quencere-con-struc-tion. \OT1/cmr/m/it/12 Bioin-for-mat-ics [] [81] [82]) (./phyml-manual.ind [83] [84 ] [85]) (./phyml-manual.aux) Package rerunfilecheck Info: File `phyml-manual.out' has not changed. (rerunfilecheck) Checksum: F2540FB3E16E7C45A582C8AD5E67DBF8;13088. ) Here is how much of TeX's memory you used: 11578 strings out of 479382 183325 string characters out of 5869398 542833 words of memory out of 5000000 29208 multiletter control sequences out of 15000+600000 482349 words of font info for 79 fonts, out of 8000000 for 9000 430 hyphenation exceptions out of 8191 60i,9n,63p,462b,553s stack positions out of 10000i,1000n,20000p,200000b,200000s {/opt/local/share/texmf-texlive/fonts/enc/dvips/cm-super/cm-super-ts1.enc} Output written on phyml-manual.pdf (85 pages, 545710 bytes). PDF statistics: 1241 PDF objects out of 1440 (max. 8388607) 1098 compressed objects within 11 object streams 243 named destinations out of 1000 (max. 500000) 582 words of extra memory for PDF output out of 10000 (max. 10000000) stephaneguindon-phyml-76a39c8/doc/phyml-manual.pdf000066400000000000000000020516561501136442400222650ustar00rootroot00000000000000%PDF-1.5 %ÐÔÅØ 2 0 obj << /Type /ObjStm /N 100 /First 829 /Length 1710 /Filter /FlateDecode >> stream xÚÍZmoÛ6þî_Á-¶´$Å7 E­-²ÍZ¬Öùâ8N,~il§Ë¿ßC>ù$R’§Û‡P4-Ý=wÏñî(G )¬(¤pBI%J¡ …™PÞc*´ÄÅmV„¸QX-´EÐ#­…ñß «”ÐN8ƒ‡Já|ˆBËÒ‰¢€<-ŒPº(E‰Ú<.”•Rè³…-”sF‹k‰«‹ ‚0ÀÅTYha!¯ô¸– FXàR× ´…r#Æá,®îÓiZâj­ðRhïKá8ÀF@Ò¡, ×¥¢²ú K§GAÃoE€» <`š•F˜d¥„i²Qx€† E §”WS©låf#­) çéjÅbí“N˜([AŽ1Ñø`,D(xÀ8ÀQ€j-Äó×âÉj:Y_-æÏÔSñòåèÉiáþü©”òç8ÜÆa‡«8\ÓÇ3¾VÍÖq¸{šU¢3J6ôð—8,âp‡U^VÑ–õžOIÂ-«Ö¾åš¶À_ÜeN¥‘$¸·äp×yé¶-ýmæ•™dÿ˜Z{uÞð\u‡“8¼KèÞœ‘úÁ ý†L˜m«]cr¾»Ôɰ϶ÔÕó_ÉAS¾G§®šñܽêË>]#ŽëÈÚÉ×5µ>Ø]’ ^d£_A=I8y1¹Â²$Y‚wAýG&7Bö’÷ufl§ùnòV=q¡÷«.ùèÑ“Èi'üšÛ%O3ŒökÎø<‘ý×Cãh0´Ï_&S:6<ß-Zm_´u,(Œy¸œ·Žðc¥]H 6Cù‚WÞkÞÍÖÇ q+÷Ox‹”Jû|Æâ©>…O{ »Ì‹”l®ÏéBµïÝ5)©ÌŸ‰jgÜò„tÅ_Y]§»»+ ,Ô¿ñ¾¤ð=|ުώÚ5·õ’+ëx þ?õ=s2~h›5¨‡T<áܬù›®é “Ç*ùþ'ñ*ưqnjœ–æé@co–žÕ'à8üزu@8âGéÝf̪t)¨ÓØ/¨«Ÿ½§‡3N@¦äφSž)`Ë}¨¸OtÄá§û¦±\ï·»_šL޼5»›Òÿ]¥sƆÇÃaw”íjÄל¼vÌ´ÁïE’„††Ù!]ñ–¤o˺Á'êº JsAH¿§[r«gÔŒwaóFc1@"i¯û¼»GÓH˜©ž¶±wo8ÅÓô‰îP‰¨qººà›êëãâI¤‰î+{4 ‰­•jRS„?(ŸÙ‚C³Ü”{t6 ‹ÈÃ]R›?$Ý%ÌCÈÆ\I‡eàc*Å¿ï.ÿ°ûÁd¿yÛ0<à;BYÁøÜ£±|¸ÆWô+ѧA¿®ì6ÇÉ@>çlÏ÷*÷ªÿ©XÞ3J•ºï¯{亮óð€cø~/”²žì=7~Ë¢ËÌé㪯uÚ¬nÿÉFfÞµ4z³›–ºETü Êèà endstream endobj 296 0 obj << /Length 291 /Filter /FlateDecode >> stream xÚ…AkÃ0 …ïù:Ú°(²j7öŽƒ­P6#ì2vÈÚ4 ´iHJÙŸŸ]wƒ–>Y~Ö³A ³„þá]‘d¬1·¹‚bJ’50u­ƒb oâY¦“܈uÄ1â)âQ¦¹!ñqn–mÄxÑÜÈ÷bî]é•ÙXHÙh$¶Ñ÷UæVTý¾Ù…IÄb‚^{™C«t¤=«çe+y*Ʋ?F5»›sAl»D¡ñ›÷5|—/3;P 1>¦²žzj‡Žu¿–œ‹aèö·YV7ƒ?Z1~àb·ÍöCխ˶ªÇ¦]îÚ¬;iÛÓª?aÿnÊø…9lîÓ¸òòV‡ÃË¡–J,Ò­Ï!\t2õ¨6›¦êqÕÿáwÍû"ù÷·}x endstream endobj 339 0 obj << /Length 1327 /Filter /FlateDecode >> stream xÚÝY[s£6~ϯà©#Ï „Dß6i6M'Ùdïìvvû kŠÁ‘lþ}؆øBnëöŘ9â|çöƒkÅ–k¹f=½ûàA Aì[ã©]äPê[Ä…ô©5¾µ¾‚“,yH®—bô×øw%ĵ •W’ªÍgFtBŒQ%˵l8ˆb-ŽìÐ Àû»Q€ ›ˆDÈJ⃨ßÊúj#Ÿª'ñ†sŒ`XR FFp)gY^ôd~°¿,O˺º«Þ‹çw‚ß÷bŠ öèkÇe<²=‚AÎjA–˾`ÒÝ‚¡Œµàó´,IDjä_ÏjD//zÒ! 7K÷…«¶S.qhÙÐw|?0':Ê„Ðu!¸ÉÊ<â…:€¥·zeó…2«Ê]:‡Ÿgdc×=”¥ó‚У°§‰’ÇL°2€¬YAA¡¬€Hm…úR¢V>}<ÿb'âë[ÅC!ùÜ@ùÍÅ®H£¤¼m%]²H?xu£þ…Ý÷|´A2Xo˜2—"ʳ"›J}û³Ho³êÁû¢ÿ’ð-Ì7\cƒÆrÆõfÁruŸ'Zã»Úny!²i¡Î{…ax˜šã]¶¶OßWÛ³‹Ó^0ÞA†/ÝB·>ÙM’[M«N«×yçl®sjY°˜÷ÎDˆ„Ÿ‘Pƒ6¡^ÿöçÅùµN çiu!y>eïžNÃi³_÷-ƒZ6ú§²@ˆü:5>¹à\­ A°(¥½_™d¦¢œØs^cUvO÷z® Ø d°¸)'…²”mšg#[-·:OmG„zÁ›ªKC ûu=£îx¤ðʹ‰‰‚³<ª›µ)k›¶88‹×xO€À7ç,ÕJÎP.µÅ+¹Ûâ.z¥PßOy ¿Ky{-à‚†^dó¹¢™*?¦û䯼ªÏöˆ† }i¨ØV< \xy¼ŒWCï®+”V˜\&:|ô¯,dÎ=øBïÀZ–Uw/À¶ó!Ó¿’¦ÍT•·êR0?é%+åòÞ4Ëõ&ZUuG÷‡j£IŽÞ 3QØ¿ ô bE–*ÿ§äid²†zË9“ýþäÕ#åµM,Ü¢Ô¬3¶(tqiÛyÅ~ÕåDÄeVšþT!I‘²\FH^ €ÇTš>É*…ªÊ§jå"1}­ŒM?WÊ8ÏÊEÃ5´ïôõ1~c±¾öc$š´5Tñ(Ôð(RG‚Ò›õ†PÄó-^€~¡`°·4Åö²L¤X$&ƒ°DÄ©aZ²;“ Þž³d0M=) ™Í›ì ÒÌf‘0ºçLò^7ÒÅÂÿ:x5š2Ó,3C¢(K+>QQ3 L³úÍ…~r`-üNpè¾à´å$0à\ÕÌ iVª÷kù_¦:Ø¡Èzzf²I.fØ:Õ¤Ýén„}Ed›4ù¨’›Â}/¤Êè³¥Ç}ç&6'kýcžÆrÖ³ ¥Á€‚ä¹/A/i‡^\ÓKµ,饺ÐôRmôdVmt¤6[™¤‚6ÄÀƒÏà’´å’—â»,sü2Ë­…¶Ï‚ñÏ¢†QHoh{E[faÚ+)ª‰TŦ´ßý9ÃáÎϲz<¡«©ó”×4L eÉCÑOè‰Ì| îh°îÞr2¡Yr*”â©á‘óUOiéÁ¢Áh“ÇüÒùú 6YÞû8„pŸ\äu‡.æ_H<‡ÐÀRÁã DšO¨«ÏžŽþ÷c§ endstream endobj 381 0 obj << /Length 1269 /Filter /FlateDecode >> stream xÚåšMsÛ6†ïþXì¾»Rè-½Ð»> w×ЯÒ7úÅíõÙûùÙùŽ=3†½ù½8D”O„€€FÞüÎûìGˆÎCðç+9 æþ§›ú…ðïË*ŸŸ4æ6)îÌiS›‘Mm?’æúÛj¦†ÔÎÙ­Îûà˜ûh°0|íËÁE1ø„=íÂQר‚Á[ÌBø]6MZ,5›µ¹æé·fSÉ ë¤jÒ&-­éy9 ÔÛw2³p:L~6÷MËùKR§‹ú`©;CbÀ>‰­!v¹_®õë.§^¾4ŽßhÏ^{˱OÃ>R˜£Ó.úƒçWêˆì"e±úìö±õê!ÏÌcOO¡ˆsÜ>¶(óõÖÊBzϛÕ҈¿1 ¡{6 e 0 ]–¸ŸeS®Ë¬\>¸p2‚Ä”pŽ ?zÆ!b‚w’~€UÒȘÊ1*ÿ@ióÕˆCî_¤¶ÔLéjY®Æ"ôYÂ]d÷§ÖNET’øUUù•™z]•Ë*ÉëîÌ!£Çgîto¬!ûgBd÷Ñ6æi.¿‡Àw)ãß®{àò >¦ü×ø4@®¶þCQ7I–íz?ÏU:z*=Š¡YtK ·›¢x ‚Ä;ãƒ`ßjûÖ›fÂÙ°?=ŒÂA Žw‹E¹1ñ~ç÷ee^,’,UÕáctS,dÕ$©­g4ÈîŠ^¹}ÀÃ1æ1cÞÍÅÍ…Yzm:¿]ÉáiL (·(øÇ/7ÃóU=xŒOëòÖ™¥†ƽQ4”´Ìi;ýšÓ¾ÚÁ³ÐLÖÝ6Ð!6‘16EƦÖy>®~:-ÎúËjwÒÇO4SV^˲ó\œÂ/!#ɉ‘j ÷¨%'JÂ`ÂÉ‘HŽø9¹ädÀc>eˆ†§ Üê%Gdq"ˆAL_*õ“8SÈ“˜r{Ùi@Ql y=|ÇèõO±)“ˆ‡‡ò\XqÀ,:\3 ÄñØâ:Y">™"èÐUl"b»L`é2ÝÊE™ç²¸KÌ<¶ý¦m-öØw27›:YvÔ€P2G°1¨v·à åè ñ,ð=³»Cÿxp Fÿ¯ <ÁÝÿƒAˆ¸0¬œjO ¡ËùÙ¿˜k# endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 886 /Length 2385 /Filter /FlateDecode >> stream xÚµZQoÜ8~Ÿ_¡ÇíÃÙ)RÒ!X Û^÷ ìEÛö®ÍCšNÓA“L.3AÛ¿=ŠS7Ɍӎ"ùÓ'ФHÚäÉyG^+.Éer¼ ĸG”pŽ4ã*ŽÅî³ãb÷ÅÅ„{"'!ÏÏ$B?©KZºgsÄ={—3î9¸’€ËÑo ,˜H11g³ü(˜7’ ‘ÒŒ"ãGJTSRL.¨Í#à©6‘’Y€œ=ȹX Ù —„µ*VèC˜‘vK´µµaRµÅ€Ù8JèNÁXZÑÍÖƒ±'Œ“B|”€®X™ì4Åe 'Ææ`d g“YAoÇ‹dOÝ~ž]öh‰ŽK¡’ pÂãx’1éŒ ¶@±/ŒùX»GÙE¾ŒeGB0‚dìjŒ¸I6ªÇø‹)Z¶.g›Ð;ñÄ3¨µ즡r`'Ñc«D°\†H²Ýê$wƒ“SoÈèU“!c‡” ô kÓÈ:c,@%Y9MÁ~°Ólƒ):-& —Û¿ÔtÈz’K‘ìGvIÔ~—’ÇJ¡O)G?c(T*ÙzÈå@öƒ¡Ábò‹.³Iۙݡ…jÒˆÁån ý4µál Ê&Uu…b˜1Ô¯°ÑÀú‹`•£+X~ˆÃœ<²”h=PHïm3 íÒÄ:"ÔÍw¦¥^°R65õªyvpàÚW®ý}ùzéÚ§î—ÕÕ»Õüx½Xž7Á7á‘ûõ×Ù/o9)þÒ[ïý k>ZóÕš×Ö,¬9³fþèNÄ!è]°Ï­9·feÍÚš#kNûfÑ9±æ­~_„è6¡—Ö\õSžOÌ€,éoÜ»èi¯GÍoÏûØšã¾Y±Þ"ˆýøËo»‡›Ù=ü®u4D]öÐ×ßÌ}Ü/ür¨$‹!½¯£–.·—þ§5O†¿®i¬úÉ×÷Éa5j^ý©­¾ÙŽõìwºg¿ï&üÒK÷¬Ÿèôn:` ;ÕöÛGý€÷ãdpKCÚãv(ßÒ“l½oOp33íÔŒÓ~ù¿÷kZŽXMêsœÕ^ïÓà=møÜL¿Ûõw"ù—5XOº×å²×~èäûÚ×íó^ÏîYê|x–ž á{»÷$\Ýr~w}ÑŸˆË~!—Cï=8KWýÿNF¸¥0" ìNË?váÐ>¢Ék¸;Àžõ ïûÿ~ÁóaxpÚÏ78g:±|êÇNœï°V÷îÔƼ-ÔúÔCt`Ÿ‡ÇÖû›ÍºCyÖwÏüÆò9ï^ºöÙb}hsÌÚ×_/æ®}qt2ŸµO–çëùùzå,KÂÈYûr¾Z^]Ï­K6]Îß/Ž~[~qo<:¤HcéhŽ8&Ëá H—€°r3üñùùˆoº$Òf·Ò®‡³ƒnܬýmyù~~ÙAûÃößíóö n™ãµ{2މlwn¼"¡ Ôx$i!áã^]½[³ýcqþ©}|pÐÍÐ>îÄÞ¾jÿóò¹ýýòq½¾Xý³mOëWïšãåY»ZÏ/>ÏO®çï1øâã׳ÓGàùƒTKj,Ÿ l”‘páÞ{+hC”FL?þÜ­OŽÿq†º˜Ÿž.æ—͇Ë[4¿Ýë¿þû?+i49G$«¾)ÝùÕééáýƒi38àà@²=ü ;Ó«gl¹©úÄ–äûzC–߇îOµ/.—ǯæ´ìé3×¾žY¿ùß©Ÿ•¾S?ˈJý¬n`”¬±¹J½j½¦zÍõºYœ•!6×P¯T¯/T¼PñBÅ /T¼Pñ¨âQÅ£ŠG*U<ªxTñ¨âQÅãŠÇ+W<®x,[Ì®ê¡ëñnÕÝM¯ÚJe«š4b±\àÑœæØ5 xìîu|ßÛ/‹˜š„ Zó3j¾Á—­4ha([ůÜ2º%oeÁûg!…o2k£Ðrüáª[iÄ h¨6Å*–$ð#Vž+HÜJCöH#”&ÆäD¨‰VâMˆ=áçDÎ=›ržÈ^Õôš ãÑð–—Ø7!l¾g7— "¬P,x`ÖøH;N8¼wsIû÷½ÁÎE;¸í%Å}¶Äi«ëÍHD¬D†ì§µ"—U³éö“§ÈÚ\°ŒÔBMDp lñ¼=— üJ@´iˆCÚ—h_$5EFpø•§î}¥3º>øÝàZ„½XýuL}p%Án•SùÉ’ ×ÒZ¬%³XKf±–Ìb-ÁÅëqµk .֜ԜԜT<©xRñ¤âIÅ“Š'O*žV<­xZñ´âiÅÓŠ§O+žV<­x©â¥Š—*^ªx©â¥Š—*^J{-VVD2™6§u ‘LŒº[‡'8ÎÍT+"ÏÁ>ùÁc‚ÃHáߺbY°*Œ€r¢Ý\tÿ"v ö1eBlo5]¤ûƤØyšœ_áä’}ñ‰L-C·ŠÏ3’Ð)¶"Œ }m÷`,Ê] m$¡ ’l… u!x\sH<’OÜ?±¤?m&ûV’o« É„ì¥á&Ç1 eIg¤1[q&Ú‹A89Žä“¦(’à ÚwÔ)w5+’—ݱp¾áò7âVh: endstream endobj 388 0 obj << /Length 197 /Filter /FlateDecode >> stream xÚeO‚0 Åï|Š·sݶ5f7âÁÈ$Åã·—‰!AOí{Mû{åP‡M§Ê¡"6»M²òÉ"—ˆÌi-ÀŸ¹`Ö*0* ¾„‚  ©TŠäÔ)Ò†û#4T"é/¯Á7šº:êPŽr˜wýùÖttï·Š³L bÌ×ÿ3ÔTd c’VŽØå1^¯›•‚> stream xÚÍXÝoÛ6ï_!ìI*…Ô—¥¾¥KšµH·"õÖíh‰¶ÙH¢AJIóßïŽG9vêmѬ{±wGêîw<‰ë€O˜ÿ¾xrò"ÏÎâŠUð4^ªì/Dܪa£ÇGsÜ7 c„·‘B‰^Ñ?I<óZõM<‹æU¾ì‰Õkç #²Šœðîï<ç<´ѶDèbÊáðÌ1–¸ÚÐÿFY’ÊnÛ:¯îÜa†¸ËY„+¯+Û†ØFÚ­“èÞªeëå+íw¡s,X4¢k¯ûÆvˆŽ9¡ú5êäáÊèŽ(oyŽÖ…É$dv¾7ÄÀU>Ei ‡ÖíØìŽ^޽èÀVuj?U?xîÊŒv0bPºŸ$b8f¼Ã B¥evbJUXÈO”4Jöµ$¦êé´dôL ¶¢Æí׳<7H€¼bá©‹¦›ÁéÀØßjõh¦Gˆ¾!¢Ñîùõ¥qøaò(?Õr‹ÐäEx»‘XȆDTµ œ@"&~£¨’Õ7.s@‰¬ÞÅïg Á—­ªi "‚Bf¼•rß8_žÔ†í³““ÛÛÛX{,{ò4ÖfM…N™D#¡ZSJyÀçq¡mA‚£Ó*®Ò”Îæ'<ÉÃÓ›YxqªKÕªa–rœ°k~ÐÌò€ó¸ÊóÄ5³yœ<ˆ’_55>ÎlJªƒM<ž³lê€ÏU/ 'ì3·‡,ÎAdÖÁD^]< ÞGYš‡® Ý£ †uu`¯ve6 (sè~­’&^™“-5­®=°æK®DÞ¬(IâŠgßåË[ŽotÅr»½\^Λx Æe¬ô½ä0–xßjÑØ“ÿÌ­3eëÑZªŽ¤À,»osrmô¸µñZ»éu+ãZwÄv–ÎAwòË“7Jª8)ò ÊñÎõå‘L)ì;ûW¥,²ø÷…y@Ç>°$e\¬.| + ¢Ã ®÷< ÿhÕr U )±±<¬5”¾ºÁó\ï`SÃBÃPÅÑÒêþ®ŸÚ‹Ä×°h× =lè†ÿŠdàq^?Ôy`’óÂ=­wΕäfƒs.)¦‰b¡:Ïè$ÄÎeGóÓœH²|Š \œIÁÂ3á¾›áUÖÖÈÜ +£ £ìR |·´ºýGaÒyed9 PÑ k«/¤þnxXÌæÙqµO‰ýNሃÙoÚ4Õ5é8Hæeµ—÷¸s—÷Õgˆ 9‚ÁÛ7WÑRXJ ¨#}¶Y)Œ6´ÞÕáñ3è5\ZâQÍÃÓ^YÕÑ$<Ë!#ˆíPÈÁ× ÈÝ¡T¥C'µ½Ô¨| X\^a¾-ˆ½—$ÆË~ŒÅÐɲ%ÌÕS‚"bvÜÒͨÍðóÚÜí¥NZòðº6™zM—࢒µÓ`á+)úÔ¸SÓnÒ¥³qåK7é6Ä¥9ˆ¿T´–jISr)=O+˜øeçÅSžíÞx¾²ü±;꽩ådê|2µE=èO¸Wç“CÐaç}üt˜b˜ìÅCÿŽE1nm¤®K~?Í/i¬ó9Ý s=Möà¯ßùyý Gað3Hk§+ ΃o"Æ_Gã}ÇÑþ6sÏ—þ­d‡ñôþ›ëz4¢¾{øôâ³Â™pöñ‘‡:ØKù‚ù”Çì(Ê/æ\qP¦ øÆU¼ÝÔ^|6ÂÌö‰hjô Ûkôx€°Ç+º? ò°ûߣ5¥8vÅý‚ü k÷}B.§«ÀÐaæñq}Ùáw g³ëM¢–>–´Â{à Çh¯Dý LÉÂ}!êùù)J..ÏÿW½æÖèÁƒÿÌÔþ[´kB‡&¼HbVQVÄYé㞨œ/žü ÕÝ‚ endstream endobj 409 0 obj << /Length 2182 /Filter /FlateDecode >> stream xÚ•Xm“Û¶þî_¡4JÍXß_ü%u¦µ{7í8×IgâÌ'AÆ$¡äÏ¿¾Ïî‚:ê†v’/"°X,—‹gŸ](ZWÑêí‹È?¿¿}±}“Æ«¸ “8ÏV·‡U%aUe«2ŠÃ8«V·ûÕÏAºÞÄq’ÿº_§q û{£Ö¿Üþcû&©WqÖyžÐæhµIŠ0©rÙöïÓ:)ƒÇ¾[o²2~¦-xw ½ž Áû·/ û%q ‚_hK'O%g™|X'U z-Ò³Ú‘ðã:Ï G/8^8yµÞ´ª_å>Šx8©áúeƒ•§vv š|£O‹³0Ë ù´V}2-[(YИä”nÌ Û1¢ß2ØËêY"ÑØ#üÓÑôª"½… •‰j yßµº#íÁÉ^{' Ç]£í`öÚ¯õòT­éìfÉQµ3äCTNÿoÔÝN»p½)Ê:¸D~†°|£ôƨähcáA^ƒQ¯º£²7бçÁØÎ‰ÐÇö)Í'%X4ÇN{×ð°1Åy“¦psPÝ^õ{šÕ³À!(Ý€#åÕ©æÑñÇdeÜžüöV™N4ÜÐëî8œDN~“”0Y &iÚÐQ,xEF²8!»€Õ¨žCYçÏ¿w|ȺŽ Üxè #EH$­Gƒnœ¨îìxn80ô+Ïû5~ToìèDðdÑš;êsÌiÕ_Pž¤Þa Ò‚‡Þ/ˆæÁ”HòŽ^û-ƒ=³›ˆËKH³*8ZÓEpmet/çüèåÊ ò*œÝR8õ‡(.vơϋ ÕÃɇʼn„â@O×XŸå[’Ý~ùÞ«¦yôV,Fj·{ÍÎÀ5Cœ%9øëÆÛP[Ä¢iq(³ôK)ìd‚]±"xîwîýÎ}ÏÔŒÄBâHÜ!y¦Jgå~z#–ŽÞkرÛû!òÂK;Õ,æN¯Z-¾õDgy|ˆòȃ¶ :ÛmΊ”†ž;Ÿ ë9j@’¨³,ÐÑñà²cHÖ? ²‰®¼]y!ºÿp†b“àlÁ¦ð-Y'Ïëk$ϪEš×rådòD$4ãx3½œæõ.y6áIÙ'0[Sƒ’‘Óc#Í‚›Nô@à hWqð’½Ý\¹;kc®¨:É0&ÑM’¥Áx–'½V²—Q‰èÂò’ÐÊÓª@g¶t¿+¥ìã%ÕÉ€¹ï³Þ‡K1çï¨r& QÍè£fIåÓžÖµ8i©ЛR´â y«[ {¸oz> hptùmWGQ ˜ñð±Æ±^Ì9Ò¯K²pÉ ±çíÚƒÒëÉ»á *‹M ¢É¥ñ˜N$wŒ½‹ã74\AãüwÚMY§\0 b0êËf_(µ/èÑ$æã%¹íˆÜhä÷ɺ|xÅ!–ÊQÏk·—p)^pEŸGèaÂ$ žjªŸ8œ×`DBø~^!'ÔÑà‚hüVezfš^;Dé dJ˜4rh:Ë]DM¡«:Ý£R·‚Lü‰S‹[ë|³ñÔ*pÃÑѽx(oD{gÛóˆTâj–x¬“ú‡8Ͱx@ –âõÙvúO¤ÛKžÌ ÓY%"µFº:ŒTOÙÆ$NÓ8Š69å7M(^Üî&í†S†FU'¦ca„¿®øÛâ‚Q*£,x³®i INXôcIÃ,.9 ão$vÛdéÔ³‰^¯°Ú^¦£“Ú¡Eä¼±çmøbåÆKÕý3‘cúþõ'D_¹$ ×ÚÂ+o_¿wó›VÒß°rKÁBóƒÞ$ëöÌX¥Êa(ÌÅê4»Œ‚a8¿ÚnÂaf"Üëç/½½ç7-Ä+­Ã:Í$^™¿c}?Rf•D´@4®[ _ºkùí?L£âók¦†¡®GÚ@J‰±wL]ÔžŒÇÍÁw€5ü7ä1à”å(+.LU‡e™xaì­ü"’Î&Äy ¨b›FMÁYâ½$Œ‹R¬ñÅ¿(#º5‰1šP€ŠÂÓ .¡ 7(riÃï/Ƙۙªîñ¢aÛ?·4/òJçYúJ~Z¹:øíÖ úŒf@{X†Gt?ã]h,%$ýcäsroºÆª½Û~=1Ë8ŒŸÞ¨Vô-ßtèÿ“ô*è,¸ Óo½ÊÈÿüpóßÍtô7<ÂçÖÉĸé¼Áôÿ›`êרYñ·ñ¹6.y»Þøžwï׺gkü*˜x_ ˆ¾ïæ‡o_¿{·„ž, £'ºü³Ø¤êÝ<+ܸó¥Œ{D#,sÿâJéo·/þ”Ì›2 endstream endobj 419 0 obj << /Length 2114 /Filter /FlateDecode >> stream xÚ­ɲã¶ñþ¾‚åÊªŠ bá6)b—Ç~®™øÅ~ÙÊñ"!‰ŠTHjä—¯O/€¶áLM–F£ÑûÂ$ÚFIôíCâ¿_=?¬^«2’R”iª¢çM$%ŠÂDy"…4Eô\G?ÇÓÎN‹¥*“¸ê÷nÄ¥ŒOÍ´cà´s ûãP¹Q,–Féø±ãcˇpuo»zÙ6ãƒSÓÕýBåñé·(âíBÆ=cOýíº\5õÃËâ—çïû¥4˜ìšA­2x¥CŠ“mº‘!DAÌsÇPàÄ#úËÉc÷ ‰ŸÕ¾«× ›+ÁãÊe ?.Vðè¦Ù÷»3s `—|¾·ï€ƒT¦qÕ‚€Îvg´R”™ºÇú󗀕ÎÖÉE dW‘d9_üêxOÓ¸v í„ÚÌÊøiG¢½}Ã秦mqeâ5 Ë`0Ë¡i]ÍGÞ¨ïS³oþe§¦ïøìï‰Líväãé8táRߡťŒ'lؼ6Qƒó,FMq?ŽÍºu "[Ãwë:7؉ 9¹ ߣn™ ô>÷âÈ$!@¼›Ne; GkÚ ýq»ãåÃÚ­ÛmÓmg]Š˜Š{Й1„O“ñX-€÷CìȺõ\ ¢'L¤®ëY3¤Y@ÒI&q?xÒ¼= =èÜ´È!ÁoxJ.<åŸæI¦¹ÐIÞÛÝÍ[:ù…÷À¸è¬'ãg^0¬‹Mß¶ÅA“Àc)²Bz…¦ÞºqŽúÓøùq;Y~g(&^.]gÁ‹–dÈÿ&öô'cOËÐ& Üh#²ÀM*¨DªòÜ8ÙÖ[)KÑ1µâ¸Ã-ú­ÉLü§?<þ’ß»…–{x4¾Œ“Û|ŽÖlºª=ÖKbQg"‡—1˜J­ƒá §ñ[[ñ⇟ÈN3Ö\J ’Å×ý£†rßU†ÀíºéìðÂÉ’Ï1¼é©XÇõ%Ê ê¼A!1h1+è,~½(¹öM6î}Ê…€g©àõqé%Íuê2ƒ,e‡ã–¤¢$B; >¿ìR£) LGˆp%n÷Èøqœf^=ÃUƒºÁ܇(¨›ðÐLÙ¶ýÚ¶hª2àÙ¡!¶çRG)ŒR!üž~ÿüÝœY¡òd—XHZR©Å'ú¡vƒP%²œlj”(?¨Bƒa.–Ë_#ðúÎbª»Ü¹"rÚ-÷ÊäÀ˜Œ¹_ýàËN¥È´ºÕ Ê÷å«(Ê” ¾y~øçƒ„ëIa—K¡Jˆe£Ó¨Ú?üüKÕp*º,¢¡î#-²¯µÑOäŽæ.ûåF”EJ´”ö¯ì´[½òr7I0ƒŒ#ƒ¿™5ƒ/¯íôÅl6… ¡Îh¬=üäž$ §Eq¶êÚŽ»¡š£ ZNU)ªþ#ªêÚ$ZÈÿ]›$Ýwº†rÓ—ÿ”4WÑ[_<'/ï; ,éE~ö\ ØAsÊ««¨Æ-¦ÖÙ¨´(͹Ïû¢J!æY¤Ëü¨üŸô“(@×H+//®8è…Hô™7jŸŠÜ÷ð8`³GÍBû»Ód¡3‚ƒ›þ˜›µBŠDÞéx¶2`¥ŸUõLiÄj…¥Qz²9—FªfM5ôc¿™xûš ñ4Î)&ñ%-û ¤e>ák*§XÀæ{4‹Kv/ûV¸_g4-E.Ï„CÃ\êÓBÉ;zk;}”޹ŢÂzÍôh÷~u1 ähÈò©)âg*¤|ÞÚcç;?n¹ §”åǬˆ¹^–Ð5tçZ5aõØ×ä$n*)œó†ÁùŠ×w5QûY€=ÔÅW?­ðŽìº~­ã¯cç‡#×¼a÷L.67Ònúa6È3(>éçYBî\€O”^†wxJ{oÞ­OÊ·Á©›½ëpJñø4¦à½€à§Ýû=Íc°êú‰è³~y @jX–¦wÖýîooŸ–¡Û:÷jÞnØØÊ}^°š+«;ܵ¼{O ¬È(Š7—àÆ¾'…7Ÿ Ü0¸zN0Xp5LgÛ—“îhŒÃq¸èý—û´vjÔ¤ª W7Žý@ÿ ò2þƆñˆp°VPªôh×r®¸oàzüY¡uî{A¾Ì,/¤f±D”ÚNvt>A´îÜà6è´ƒÃø3Á™uAC÷q ãB`ØöuÎÕ"u ð ½2¸øÞÛ4¿Óìu·üãìЩ®›‹8×€ÍàŒ •‰ÿ•äT{зêæ}ìaI8ÏyÒ,&ç;îÑË׬ßö“À÷ÎJ|Ýâ-莡£oZìŽÉo#pRSÜZã™úö\›xãìDƒ nziäªj!xpmã<>:¢«xûôÈ lÞ;vëOž};Žxì–ÿ¯áC§å,M`úYöœ·%´DçÄ¥0LŽñüO“c9ä>f`0»†ó»Ë<‚»×*–©‘™)iºÆ ­çx±,@Bß”EÁÿæRYdWD‰FþRV"@ ü–ª¼L LÀSòòÚÞÖá1þn†ž|*yxØFaùã·÷¼’ §éðjµ:Nb_…Ÿ®kÅ–z¿‚úäìÀá½"¿‚ñêP4ÇÕþÀåd§V7?|ÁôúCWùŸ$·*Jßa݈;£J”Ê`9ùÛ9te›qKƒ(|¯Ê3ÃiUþ9\ÔÖ<{úw–ËÌ»6žJqáCÈãS&b0@ý{.¤{ÿïå"ª,%¤|(ªEáSn~ƒmî¿• endstream endobj 429 0 obj << /Length 2132 /Filter /FlateDecode >> stream xÚµM³Û6îž_áÓVž‰hRõ‘žÒNúöí¤7×C'íA–hK­>¼’œÔÿ¾Ê–£7M»³Añ)¹9näæá•äñ›çW»ï‚l£”È´6χ’HÓh“H%T”nžËÍoªÌÖåú¦é·Aâ}ª»­òŽ„­»qÎÅT÷Ý›í¯ÏÿÙ}¼ny†¡TGZní©ÜúZiï_D¼ ”"‰©ØúQz?ô PÑéø1·AꙦ*Ÿœ44¶ýȘ"Íøáàz•ïŸñø¯âPdI@$¢(¦ƒËÜ´=0  wm„”—7ƒÉË Mö8x†h†s×ÕÝ‘VÜÆ ŠÙŸÂŽføhåhuì O’ßКÄGtSÿn÷5|pÙ¾ë'{¹½3ôÊØ›z­ºúa¸Ð4'ÉûóÄdU=¢¢A›?oÓÀJ€ø"ïaè·óÈ›ŽÌ»¾Ò¬=}$"Öó{žªKÛìÖž=’B'ެ¬SL½ø©%óßø¡JEÄwÏuݤ¡S)@¼ÜuÊÁFÝšY·ÑL¨@; Æ¡X3ˆD,SGõzS,’H9 óGÞž3®2Ó©HtäHó®\Õ` ‚hV`Ù¿ W"²lfnZša½)º4ò¶€!uX¼*cö‰(N—Z-ú¶…#:Lììýß:úHÜx/<˜fqDjvç¼Ç¡>žƒ ò|ßtù¾1¾5 ¿=Õ_Ï&-KÆ#ÿÝPÈ(;&ïf²Ldqx¥úzM9*XùA,Ä ñ[¸D–}ÝåÖÌÂÌLE!|—·fõ9”ŒE¸0g”zõu3Fó“TùÈœ{ [ŸøxÒ©u/˜^&ë½ NÍÈ— 6J!@«¿4ØTè4Z8–ÏŽfÁÝ“³Ó©€Lz¤‘C‚6°Àx Ÿê©"ª@(´FZ4— ¼Ú©.ò†–0öÚE¶0Xõ›º3´ú ¦U]à¾j>g\ uYæ·O?YMHVÀk µÝÿfº¡ˆœmjñl´ÙbDƒØY3À; %XœÏc{ )ᅩÝÓ¨¤\{*ÉÊG>5&·ú…  î醣±y–¯ 7j3 üüøðjóÁ’Ç"ZÜ‘Ñýx`À'¾”J¼âÜr` ô¡hûÁ°f;@¶9ž-HøP ‚‰ÇNø0Z±ðZè­¯  zPäMc“c˜hï©Ú†Ê»|ÿÞÿæÝ[Þ¿cûþLPqB ±xêËbïsUõ„]z_M„9ôg4Zmš·@Ý2Ôá¥nÖ"oØjé™34͘¦§‘"B#Q™;þvWŸ’1 åS}ªàÊ@öú¸ŒÒîö„èvá' !B :Ô¨µeçM½·Aø‡‹£ Æ"FÞ‹#Ö –keÆz‚³&Ÿ­žp7¸( ͬ£;ÝôÝ”L†Jű>ÐxéÏ_•B¹bÖwõþ<ñZeHâ%OHEšNw6† þâHR]GŠÂb¬’c•”’pỆIë'X?ñî=Äû•X ^mJÀýÖË'ÜcuE¾Cß’È žÎSî/4ÌÉ\œB 9u¬½Ó`CÓǺDÔqL˜ô3ÖǮƅ÷‡¥‰Ñ'Î!¥>‡dŠ­“ötÇÆÐúòÊËsQ:bTñuÙ0¡Ci՞Ξ:‹ò é\#ö|"$>;Εä9¸àH¨C>ÚÚâ+Çåú¾+â¡T±„Ú›w#„íhý”G”G¥%#HLJ!?U””pú4p04ãh£"êêiëÍB/µñ‰úQ‹’¸šë QðBø*·o»eÝÆêàZC/ÒÎ眈祑óRB†¾µ)R¬Ð”oøãçåu€I6wRÕ4Æ7;èK#Ž}1^@2Ýv¬]&_¿79ÐùXv¡ˆ»EF¿ÁÚ¥dñ_I{Ï•ëlq¿°åÛ_]GB¹~øËŸNÄ."‰ƒ¿j€é.ÿ¤û þN÷^»_%©û–šÎ 0ÀØÃÊ =°*K–]0]`M€æ”²£=Ý¡ÌnZ_X¡ŸJÙ‹­/Ài}Aë L>ÿ§ŽÂ>FBÓ] ül½ïÚý+9ä£ÀÑVäI3'Ù«#RΆoã¨0½=–ÎĨÆ)2| ñéß?¿Ä$öäoÕ\‘º¿™ªÒàÞËonB…О]xÍ*Øè•†ÊKn×q#Y÷õÚIÎ%¢XVÓ*SÐjŒŠ"M¹…K4ïž_ý w'´ü endstream endobj 441 0 obj << /Length 2198 /Filter /FlateDecode >> stream xÚ¥XY“Û6~Ÿ_¡·P &À;o“š$;[ñ®7žªlÊëª`HhÄ E*<2ž¿}Çœ8®èA °»ÑÇ× 7›póÃU(Ïoï®^éΔÑI¼¹ÛothTžÇ›,ÔJÇùæ®Ú¼ÒíNk“oûî¡·Çí.Ê’`ìƒSÛwÿ|ý½)6Z«"I žnv&U&Ox÷ÛÃÖdÁÓ›·»ÔÄÁÁ<½s8L‚ªƺ-G^˜×ïêw®ßÛÒ $ˆLÜóü/Ôq?Œ¼½ìúÞ §ívtmåÏïxÕ¢Œ(”ŽU§"Ô?~ùñöí®©Ã׈£û('.Þ.‹+‹GË›¿ %R]íwtûg Ýi¬»V¶ ®ÙïÖDsOmíØõOÛÜ zª3Ö<Ê3Pöx´m¢·BAaó³°DøùH‚6Ín˜êÑULÜw=Øb®;5²uÄ‘íÝšl{{¬›ÚÂþ,üX]Ü1NgEi"Ü{$A?µíVƒØ<Ç͹ßL¶'þ{;–¸p`ò±#i+ð¹]d4ÈŠ„ÿ¥câðò áeh¢üªÏ¡i Œn°L¼O½äFi¹§IBmo§fä ZŸh$h6!xöOâV)é‰p…ìÝH½'gãñPOŒG¢ŸÈ”øº_YpøBð(+D ÁO‡§c³¦`ª,)<ÛWt™‰2…^º:lTäÞeQ`€‚´—1 ÄǺ­:ôæGžS¯ ŽË¦¦òûP:9™Ì…ƒ‹8Ãi]2G^“„ƒ®w®D7@‘!ׇ½é1áãà§®ž»d¢"áäª$8MC(€ç×à%Á~K¾§GàjþNXÌH.µU— ¹æåjÝž¦‘iƒû}rm) ˜Ì÷ 'YhM=/Ÿ“Ãt¿;ò˧a-ô®9a †™j˜R  mp£ÐN &x%¦# ß M ܹ÷‹½UNPeXwt8\ÛwSÏ‹ç F¯Q×$œÅÿfiq Ó0£²™ «V ðâ…wÂŽ"ɽwÞŠeó0¸Áœ²âÎIªbH²á›í. !x¤”õ}0?=80KϾ9ø›K ¹+—Ø-bkL÷H„ Ñv;[ÖÏ;9ŒŠÔÄfÙ‰4 ã”ëÆº"Žg¡”ú3—¦"öÁ_:QAååèY¨üñeTÄŸ‹Š÷Ä”­…îOØKªUÇã"!)Ú¶>¦/R<¸/’Ã@’Ô=º©‘JpÏ÷À RJª¥Ð+ñÎ!µ)cb~µù7y7݃—ŽT#ðRÂàM·¥œ½š‹D…ßÏ.Sä6bGœëÄÞØžR9™äçUk¹i¸çeu¨B“,µ¾DÛ»-Ô±õsüG¿£‰%zyÀ¶¢y«Ìè/Ô|$8K£N°hÓ=<‰ªÎöŒ=ò¡›nº@Ôñ¹öy¡Ò¬X*‰òß’‚¶-=™´€«?ÒõãªÂ¹J‹K…£B_*l¢œÆ'×nÈÔGHx³9D>"~xBú­dWÇÏ£³ÁœÜ÷ ![…Ò‚ˆ±®%'kö£b6S(“&‹t¹^ê•IæBÿõšÞ€‚Î_¡.h´ŠëgŠØoÙýÕCÞ< ò 2@®ƒ ¼aN ÓÈR9BT!ÁE@÷ˆYÔöÂ:‹zo9,—˜à*ß .K(S°ÌŠUãLR\Øþß”]M,E—±Œs€ºª,ÎE˜¥Šä6×ò´rXB¿BÏÔÏ@[²nu“%—úË_2;† П¬"=縧ϟËõÏkì$Îëo$B?Œ5à*m–P«´M95–š#Åm ç£É¶l„‚a=>‡N}WEìÖƒ`˜´Ýȃ¹Žÿ=]EÝM²‡<«È<("†ìJIÔóÑq˜pë‡É‹º? H÷<'F¥í\ë “¢š Iç¶åõa’ çd|2Á+é"ÅWhmì»öáUô°ôK@ }<+X§Ì·³³å܉ÀDlGFƒë©MG‡‘Ê*'°Zó”.d^ÏfH„ǬêáRî=È?W”"ÍCfÌ—ÈDÐa¤žQ£øï2ë繊ÏmŠAÔ±z Æ*·âÇp¹aà#/O¤Ùfp–9 p[-ûó÷7òƒ]üÀ§ÔË?%4…€[Ƨ“Ããé›]¿¾¾¦4ˆÂ|wwõû•­¯ B¶†d]¯Þ7,ùt¦›Gb> stream xÚ½]oÛÈñÝ¿‚BÑv?¹Ë+ú8w>çâ"u„+‚\€0mII%çþúÎì,eI¡D; ê‡h9;;;ßdxtñèâŒø}9;ûû/FFB°ÔÀïì&Ò²ÔÚÈrÁ„vÑl}ˆ?\~œL01ÿ‰ˆÙd*¸âñeu·îpKÇmþç:¯æyK˜EÕå `®òìK¾ ØÜðº¡u {þDWd+Ø“³×g?ÏÎþ<À°¢™I#+$K”‹æåÙ‡ñÀuÓþ4™j!ñ„t1X̸ÙGsâ)4%’%ËãÚ²§hx›ç„ð.ŸwE]y “:šÛ —ë‹3ø Í´6$ˆ xä¢@ï‡ÓÊÄ3¼åþïˆsÄÛw_2T'tIûºcÜè¥(™€+àS@9+ëê–6ºeÛ:Cé¸e;Üö¿ûlM•f<ÑT;î¢êj?ª¾ùÃ0“iü¢ÊV÷ÿÍ »\¯ºân•SØ-². •wíÁ J$g6IN "®˜Œ“‚è½,ã$žDÆ ælHt—7àgV‘ÙqQP‚Óö!ÁÑ„Œ^…õ¼&ïÏŠª%HY7yO)«hUWD&#’]û­Çã·KŒ´û«7dæÃe ñ—¡#´H'‘qžÍñÌ’žêúÖK\ îÉè§-À©1!Óc³®¶Š 3îšú¶ÉJp>§ÅxÈA00a’>¤®£N°ÄnÞCÜgÕ­' 1¢,s2Ù•TÔãŒ3)ÂÌ2©ú0»þH¡Âžðï•„g/_ …–`°·Ù£þL:5[‚Y¡"õÖ$r$. ¨Q žBc#Ì8}aŽ—¶Ž) 1[XˆR¨w¾Lçq¶ZÕ>·†½{*Aôàó3"ݬ´‘¼íôjÂ]ú’«bÑ—#ŒR¬~ˆëý·çë¦ Àس>ö¶C.”#ˆðï| ¼jÆbú§Ä|—ù´€OÄ„2åp^û‘õwzÄš~7M§Ã¢ÍÊœÈ, d}¾À†@¯è–áH¨Kp×PÂ(}…ùªõR¤ñû‰“/çÓLsE O]vûl‡ç“]Ó†»´å÷|ÙæÉ=ˆQmÄÀ$3Hò(ÏTi¿.‹UN•ySŽÛ’î‚ÖÄì¢{ùZÝÞæa3pµ}6p+ÏÕ!²l0JiPO¶\˜VÐ"Ûà&™„¬!¤‰ß­?·]Ñ­ƒ“[ãi)D‚çvýyZ‚ƶ~\b3Œ§*šB‚IÇû‡À®j'b¡°ø[æz¾Êëâ$´Û j!TªànqZ ¡¬eÚ%ß—æB q ^–qû²°¯þ}(.ŽQvi®ãÆS›*w\µÃ>ÍÁ=îs^òC÷¿:¿Â±tì¼8tÿï3<|TrÈÇñBïãj£Ö«W㌨#´lÒGR&4Ú k"İĪÈhl=¿‡R9÷ "ìt˦^ß.û‡]¾yU!u+Bñ¡ ò{›‹vŠï»‰_BŒo%~|³®;¡qR˜Ÿ…QL¹£ã3زÇ`Dôe-®öe‘}"ò‹ÒK‚:*µá¹Ä×^yëEÁ…ò­äÞKMÅŸÈ*ÏðIïtÇS-,Lw9áõÆC¬~ÐCø]ãç¼/˜åÒõGʺí辉Ìÿ*€«Ï«œ@4;ùTD€®¦Sm˜ 烵¸AtÞkàâ=lË’Ä –x‡ëÅ“<ˆ'¶§|ö3­ÃÞGšÊ¿…ÇÏ=ðÎÂ]Ðï/ˆ8̬H, šßs0tS™@‡Qü… ¸Ur[tÞëEØŒE~“­W]@ïÇaX{¾à÷Ó ÏY͜ݼ³áþoÈóTÂR±q½gÏ©œÀD6Ge.éŠ2Ϫp[“0SmÉT¾Êº‚^!“»I¸É:·+{“u~d7:LzËr …°&°/ƒn‹F4»#%tГ÷Ü¿ Íw{vhÕ7Ñ÷·A2†9µ¡r>¤¦”I¥zŒçCD,3I2Ή}'‡8Ñ£œ˜ËÉlˆ–}¼NÎ9iF˜ÿN~0'ƒ:ÍZ±ñ¶PýöéL Q‰S»aqqÀRNŒZʨô)–‚CÅ~¼óóÇït™Ïƒ|gTSÓM®ÁõpŽ‘ŠY»É\p.“cˆdQ-ŠyȪ¹‡Ìt=”'†$Vœ¥I:æâʤãŠsG œB¦ßeÍC>Æùh.²2ó±Äl<5k¼S2".û` èŠjÞø¦²=˜Fµÿh5¢OcžÀùùunÉÿÏA*Ò¬ù‘¬R¢LÄ8+éXÒàÜ>—‹SÔ²Oå»xQ£™"yhDé³3b׿é]¿Ö»ý>Ïë¦ÉCëVW‹€å¿ Áïæ]ðŸCwãÿ€Ò(^Œà¢¸ ü×+½ÕåaG½‚oš|°Môßô J3&D‹ÒøU‚ ôʇ‰šv8“Æü@Úӎɇ¦Óž<œöÄNÚ3!4ášAÚ &…d‹4”5óhÒ{Чkº0QÑK–žƒamšµÔFS ¤ˆäÞë–Ÿggÿ¥§K endstream endobj 384 0 obj << /Type /ObjStm /N 100 /First 889 /Length 2711 /Filter /FlateDecode >> stream xÚÍZ[o»~ׯ`Ñ—“‡p9Ãá­0N›s‚´h I¶Ad{m+‘%C’㤿¾ßPk;¾jm­Š$&µKr?Î}†ô3>xC¢­ÎÚ#¬m4!Údb‰h³ÉžÑS’7>:CD2ÄQF>2V"LX2`¾b(9LŠÁP–„N4TŠNO†Ét²áúáX cVr†C¬D†å‘ÇÎàõÃÎáOãI0=ã¹àOÂLa}’4Ìu l!ÕqxŸñ*{üIX«Ä4ò»%]0lÛãqŽèd<)bÄL/Έà½/d$ê:…d¯É9¼B&4¥Œ<6H0ßekˆs&¾,ŽLI;lB"glEœ˜èðG€9–L¬È\41ˆŒ„ØÄÄ:Æ-¬c f†@¦b’]Ù£Í !™D ‹€W‰1M(šäÁJes D#ÆÊ/2):å9ZÁ÷ /¢îš17•Œ6YtgLvY‰&3Ö/¥žw&‡àA´uR29 ¶ 9Ë Ò! ].ø’’»ÐN6…ÀC6Å“>A Pš¢T} G‚ÏcÇú$˜¼Î‰èdP–L‰¬ ¤â#œ’ }‚eÈ)aÀJô$J6çAR f‡¿#ÁäJ ä@(ô Ï.'í)Á]Tü1O€‘ˆ•KP"%‘@Vñ2j߀ W& ööF͇ïg­i^ÍfóÕ¨y¾¿ª¿ÿ>™}5¿Ì‡í⣃vºOÍßšßš_?Rý1jÞµ+ó‘¨XÝQðÙpš=Û”! Â÷Êìí™æ½iþ:ÿ07ÍkóÓò|‰É“ùÌf›_˜Ÿá߀XX¬@°9³• ¹÷ɺ7c);ÀB΂±0΂7À¦ôÙ …ÜðX¤ª™ “ ‘-;é†ãÈf0E"@A¤ÙE› ¤f¹àïÓ!);€!Þ2ô•)€&ªkÁÂ< c'¼a¨‚W—¢¸ÈË&Þ@º†äD«®®  w¢z#è+b¹ g€|)Vm=¼3¨¥È|_D¼D9XGA¸a«V5I}ù Jb 6¬zA„º/"Ù¢m„Óç˜,kŒ•w¥7× [Š5–³êâjÚ”ûŠ;ÕJjv8Ú‚XNÝ„÷ÒQÚ"‚AÔ8fjHÔPöE´wÎP­ #´NÃj‚´Šïaw ÷j}- ӈи(ãzê=ïÂ6‚Y¶xMK¼%À ÿˆ¾ú"ÚàCá·jÒ§*Jˆdû"ò;!xSÍP Œµ:¶ÓJ Úf¨z(Rù…}¹îiýNΔrp*–4"Cøœbî‹hDVYiuÈÓY?ÄÜ‘>L$ˆrÐ iL’'û³¿DBË1…¤Š„Ï#fFÚKP}¤àåxؘìŒh&S®"V‚Öó#ÎôÌ ‰ym>ú¬Ÿ{gšýû?fMqäöÁÙ‚´uv>~ºüf>[ÕÅߨp´žö¦F=¾ûáÕ(—ú³š·‹ùÁû¸MóöõÓ|h¿­Ì§›¤x;>nGͯX¼­–X+ëtÝðr~¾8h—µSý£=œŒ™3•DÈαçhKÛ¬öäíx%×Ã+‘—ø¸Öy’–y´ý4¬|FhLæTu8­³h —P^O"ô$"j`ïá«M„žp‘Çaø;âž,?0ý†lÄ& _&§ç‹qv¬Л»»!¸%Ÿl¬Å> stream xÚ¥Ùrã6òÝ_Á·¡ªFðÊÛìîx²¹7«ÔÖÖdªB‰„„‡†¤Æöß§/P¢LÛ©Ø/j4ÍFß ûÎÞñ7¾üþc}³º s'¼<ŽCg½s?ô²L9©xÊœué|t?¬^,£$vëv± S·ÔUˆÄít$”ÞæË"Ì\]=,²ÀõKà讚O–foû¡3Ížáá ;½k;K¥õÕhá¾ïÚÓ±ç­vÇ¿®ŠåâÓú¸Á2PžR IßA@ø~ÚôƒNƒiÆtÅ {K…>‹f¡k3˜¢:S0tg†ƒ‘sºØ"߯H$9Û˧ôÀÀÐòFàùoÊ}÷î`äðŒÀÛ¶Õ×6%ÞÓωIägîm0ð«ûßü3ÉyÛì;b±)zͨ]§?Ÿt³5¤>@о¨€O@×ÏÝ_zÝYšªo™èP ùD‡sú¥/F‘ÛEæn8úðÀî„,;PX3ò šŽ Z$¾k?ê¬{¤ù²ˆˆubc Æêõ™ªg/Çì›9yÛã`jÓë¯ô»Awwøý¢c]G¤Z$CÁõoÈgu ‘p±òü4öÄöG¦™FMâÅÔ43l;û¡@Ý[IØÂЏ¤Xµ$ ƒø¬0 ÇìlOýÐÖtßeø^‚<º6¹|¤ÜmA@ìn8Fyq"à>9,`L}¬t j„/ Œ*ªŠ«@‚S“$€$áx‹ŒB§lVààÌü´ŸØ)w5>&¡õ‚¨ØT䆬|'p:ÌXüüáÆùHdls.$G»ï‹ýKÇÓ¹ó{É"=³8Qø×Á a&¢Z r/­›«³¿õCÑ”àvoæü´)j´­RœâT$‘¦.5Í诽æ{ŽïÅÀ nfA¸Û#ç Áy뙇a8~µZÕíµ÷uËßÛS×@ ðÚn¿Ú‚7¶Í ›ad«d%NÆ&"gy àUE·×ÞïÇýD‘×±‘gžŠF86²A/LCÑS:ú6Á—W§=»Æ€RÉà“Cá£CœÜÒ÷\3–"Íä:¦(©$c×Ú4¼è9¯r0&Êý÷Àx#§  v§Šá;ÌFµœÿöŠ‚ƒKNp¢¤“ r¨¨MÓ.‹­)ç\庨¥ÓÃZB ®N©Û´„È0¿C‰+—¤É Ž”B(¬~:P&ÿþ;×R#S·¨k 5{ËËcÑÉ'À_Ÿ¬AnS:”Ûº€ã÷oq¸(FÏxŽÌ4H_vdj7•ÙtæT ÅY;D‰¸Iѳü;ùê^’f.ëm}H3üƒ ºÒ Ÿ‹6-%>}.øøks„e!hÓOƒÉ~h«tˆþ´ïŠš²yj³yˆþVÎØïˆP3:&Š0#öÛÎlÈ XLH/lRÜæÏ¢×Üä6OæD¤K=u•¡‘»Dœƒ|šgÂØóóÈYªÔ Ëøñöô€AìzøŸ÷.þKh4s÷G©ÑL8±w¨IGƒR¼_ß|ÆÄGRcbŠsG¥©—ø¡³­o>~òö@]^”gÎQÖN¤b/ T9ÿ½ùÏ4&XI“ô9&@žzQ?â¡’Ü‹ÃðU<ì]^fq}®¥¿®©—C£"E¹­ó~Æ:h•Èwß“7š"ž6—h¬Eº>È Eµ‚DÖQjÒL w¯4S˜yq–¼ÎL¯àaïò2‹¿c¦æ†8rL`i|C¬ôw˜ÃYð:JhKLCÍ%Y§n©@à^©w¦ÑåS¶‚XJGA®0~î~Q>•ÏÚ*õ²$v¢<ñr?þ›¶J(×½†‡½Ë_àq}™gÆâ(½ŒDÖ¹Å>•:°Bƒ%á´­t;˜R3nl°4‰Ixú…ýsÂ[ÕŒ›Nq€¨uÑÈÕ¡Ùºpž°a”¡YQ! N@(ßX¡¢ó (®˜hè. Ñ §©Œ([F¨‹{ScM¥‚ ˆÊüÁ%ܸ‘v„wwPñôì¬N…¿íþ@·#÷Ü4ÅöSضáI ëä·S[,mXŒmZ¥· <*;ñr˜nˤ tñ}o6•|Ž2˜¹liº±½H1çEÁ?˜—vîý=r uΣ¼, ¾†lN¶:³=p%ùŒ[cUœ‘êb†^äi¾ß¿8»Ê#A³Ü->ãp?¬.ûá+·Ž¬Ñpc(P¢£÷€˜û5ß¶lÑe‘6É:Ö7uA6½Ÿ6øFd?ÔÚ†ùRÕ°ÜŒ¯£8ÉE»L“ #kÛþJÃÞ>æÍa€F˜c¿mOdØa9ßWîù‰‰¤@ ‘€#2+v¼Á‰¿¥«DºçoDž[Ý^¨7àaìœ%Ž@9…çäKe1`¼Òü×h0’qrÆq0¯p&‚N‘^Ši¯Ý(ƒ„Œnt;çFÕKY’ñU…šTy à7. 'ý)¤ß£}¥ šÝ ÞN„l³¹¤?vhd²-xf¯Ë¿Ö¸.“Ø ÓdÚ¹®?qeõfþ¤s]÷«á —ÔþÜí̽.Wc*}¶+ ¡ò¨ì•ÍkBmò³ªdì%©z²+z {——Y\ßå™Bä X.Aukîyäb›…ŠWãÀ8tP* zÞŠ@—®gWä‘MIôLKqK];m>YÜf‚‰JÝEUKS|³ÃÒ£”?FƒRË8ÌGÕïxŒ+·©èÙ‹Ðü’€¤ÿúá£ÆÄËxªÛ`@à¾g,š¢zàÇÐ$qOMI9Ào3|¬ŽÒÄýúÛÿg1#[Ù\ÿG ÓfOOûÊ>í©ØHÄã»ýÅ€œHqÅ_TÈŒlØ’P?·½Ùd«Òüü(Á[¤¼TŒ†ˆž†sD²õ6eï¾ÿî¬ÛŸŒ²ÿBþÝðã5µ|òóƒëìK2&ê8—Ɇ4ßRF¡S²sð  I&¿~…ËÔ˜?ñIf&ƒ†F–æê½Qhùc,v<ú3‚óï,¶Pëûñ5º”×=•x)¦¿ËÖHL+–’Š¿ç8³žH*+ÓoÑ|!ÄP¸d{³=å‰ÿ_ı2yž2ÈŸAî@aÝå,~0}†¼û'\èИ endstream endobj 505 0 obj << /Length 2362 /Filter /FlateDecode >> stream xÚ¥ÙnÜÈñ]_Aäe)`§E²ynžìEÖÞÀÞu%@ HÙ£!Ìc–‡%åëS©áˆ²¼– ˆ}TW×ÕuçÜ8žóæÌ“ï뫳‹_‚Ìñ}•EQà\íß Tš†NâùÊSçªp®Ý±)‡óMEn»ÃoèemÕù&ô÷êÜw÷eÏû•é²°=?„ƒeÛð™ fØ[AÖXÞ{[ðRÙð÷ÃÛÿ¼ûõƒ’Éy¸¯Þ¿ûAÔ¦9Rw4Õù§«¿'?Ta3±7å—ó q-ë€ÛÎâ(v Ô¦¬xj¶€-qÛq`@"‹àÊ~(›œ Ç´¢½%ܶYœÁ¼×òÂ1û=ãýèE|æ;žŠ€ìîÆ™†—o@ #Mè(QIªa“ØÚÃá'âw3í,ؾ¸0[“½º±Uc^)“«ñóEßî†[2ðÝ‹ƒ©+µj’Ûl§&D©Ò©?] dûjqàáà’âM =ø³ SÆb<×ÿþt¾‰üÈUø Ý]{h;–..£IázÙ|1]i¶•åõ¾’T#ÎPx»òδS›ÁHÑõ·«³?P¨ðßwü Qq;±ŽT¤N^Ÿ]òœ6ÁT”ÎRç–@kGëTeIãÊùçÙ?N¤qäÄ~¢²P €'JëèŽ0ŽI;/Á13ó<ŽSf¾ò¶£,†£¬+²à8t °ó ØwE=:fõà>¼L°î/çð\g5áz_‚Ž~„q0Ê*^{wàç“øÈ害Œ¶Éï‚oˆ/ {3¬½í¢E\‘Û´,½õ¶â'ÿ#2¹¹ixwK Yžà{¼#?“¶“ó“1‘3KY¸QØ+¹…‰–Þ1ù“çµ¹žòð> íõ=¯mÙÜàÚ¢}Ý û9x‘²°ÏH<4²&G¨=ÏP‚Ö87kb¯ áM¸q FâÐw{^%jp·­ N»bJ%9jÙ-ÆŽ™„q9ô 8)0"ãY*kìcµ[îøHÓ šįm‡ÜôkÔš¼k{DŸy3Û4ž;Œ2Έ Õ=¶ÛÞv|oÁ+Ä|EØpÅ z‹è_-WµÑªoy$ögÈ>Vˆ<˜ÎÔv B%Ë€/G¶{žðc«FËSÒ)ÂîeášÂÉÅ/:Y¼ò®I¢É}ÿÄ0KO UXÅ©4šcÏ_×p€{ à ÂÇ7Ðñ‰ÙêLs#¶"žé™Š P¾~¤­ODR˜ÁÌÒ¢`é§à:áÖ…ô>ˆ!•¸+ÙðëMU~&ýWå¾å‡L †Ü¡¾8ÂwŸ¿-‘ò2Óa¢‚Éß^_NÑÿ5ŸïiÏý½±s`ô¦íî—áqñòh§»$kžâã½í/šö©°ª(sÂD« Ê×I)_û«Q1„¼D±Šâû¢b¦¢ xމ—çQœòâ­%ÀK¥aÈÍ’Ä !—I²P´öó#­Ñ€5÷ÛXoQݱÆ"Ñ&1K¥-Õ\²[×V(h/Ô|³èeÊú~'Ïbxªt–)ß×¢ªWªBý™ûÆÔµa¡cnß•Û#…#¦Ê`ÒߟH5™7ßS±¾LK:_g/RÓKp/߀â{¥}åA(Ðq¢Bˆ¢Þ¬¼©ÿ¾/‹¢²?,}d9ûGÏJÍ£Ú ¶¦¹¨mQšæëuN Oa½¨.Ð1ˆ)LŸ‘t¤â$|².x Ž™™çqü‰º@‡˜jÉU/ eã!ÄYT~¹Ú´5XB¶‰$†-ì ì0ÓÂðŒÎKóüN©TšAÊ]Ê={|ƒ-Ö¯å É).S‚…©Ã×Ò©Zbµ­*+{ì9Û„eÃ+ðøóÎúoØ+ÈÆì01ב{En|Ü“@Å霼\®¥7༇ ˆr<¸­¿-‡ÑïyÎ%ÒÙæÊÒç@% Œ›$ö ¤¼( ´Ûb* 'p˜JÜœdÐm¯>¼ãu¾ŸO‚€ØÎ Gî’ Z»Îö’á7Åš:XÍÑQ®>Ñ/Ÿkg¡¦F ½Wï&›‹Äæ¸ÀK'›CN=_8…͆37„Ûè–§,­?ÊÊÅè—üê8£Ò¿½x@Z„oÈŸíTEÁXjFìs@ ûë°ÄõáÊf¥ ·eo—˜oÚ 5±TµÜ[b˜'ʉYÉ, 4äÄsߙ Ê…‚¢ç¹¡Ö ðÍuR ÁôÐÙ%‚ãm‹"æÖë¬ÃR-ô%‘†#y[FÌu Ên½3·»½Ees;”;×]´Óó÷¤ž”´L58~©R‡÷¬óõ*á{l8Gû›:Po¡ÈÀ÷ýºxáÅîÑÞ37åÏgŠZ¬¾t!JÜ 2#U–ù4ÝsOã²–ÑN 7ÓÖL£\ V¨mºÄâ'9¢–›y›ÐÓîo-¾rÜæ áùJÕBøà¥1$åðÀ½Xj,ÔÙ½éÊéö²wkz¹Åôw|›c'‰Å¡SO˜ÀæTɽ]o¾ Ç'—…î[,õ©‰ Å2“ì Äpš'K]â¼ß·cU0ÌZÈ_Á: óiøè±âšáÏG_‡H&Øð¶²áŪ°{„÷ScÁn‰ÏÕ‡ÆÔ:Þ`:-2Neέ As£ '›°/¦]ñq¬8.bh] оŽ(Á“ˆ÷óZPŒ•ÿPó+)Ò!ûô‚“`Ç­IT5å„8–f!¬QãKB¨ž"{ù?&YŸTËx3Gܓ̑†Fv'=36ÌCê²±…P—¨(:é LÙ…—MÍÏÅ”—¨o1oÁ€3SÊ-¼ù÷ éó½ï^îúL?[xøÒ Þ½|u÷þ¯½]¹Q­iömûðc9Y6¯ÄŸ~}I…$'òÓL²p^>ÙžŸ~^r¯¡à£âñ6N8yªÒó)p3”‘Èd=³,%H8/ bj~ÂÁ¼™ÓoI±td!Èn ÿt„mäF¾cǃ#g)}l\í§F€ƒjC½Ö¶« æ6ƒý¢ÙãøiªBÌ!È öW°€Âãÿ+ä×k endstream endobj 511 0 obj << /Length 2268 /Filter /FlateDecode >> stream xÚ­YKsã6¾ûWðHUøÈžvj“줲žìØ[98s %Hb-Z’ÿ}úE‰Rhwµ>ˆÍØht£¿n´£`DÁO7‘<ßßß|÷£É­Uîœ î7ŽŒÊ2¤‘VÚfÁý:xýס+Vƒ_/–&qá¦kk¦î™ ;ïß½W‹¥Õ.ü›ï÷åày|Ø•ý; Ó Há­ý¦8T¿´û¡l¦Kyþº[˜4|þÇ/ÂîEVËÏCïŸï† ,µUÖ&¬#Éã(¬}Ñ0…c“‡m·ö³PM*þ‹xž0Y«’«r‡k¦!ÿ®{^µõ¾èŠÇÊOd‚”a×öÂj7ò­º9m÷¼bÕn}ã‡r¶3:ìÛͰ0Yø„ƒE‡&Mu~l<×È?ô¿= ¦p£4^6k¦†]1àº7VŽ‚n0ñé§›àf¼²IkL¸*0gu¨ tûÌžÊa›ÔN,¯íhy`û}×¢ø¯e r v2tž‰¦ø«uÙùÕP=3û̸0JÆ=-âXïì¨wvÒ{FÉUqܸ(Û•ÍÉ‚bžéÚ¯KR¦LUg½ÑŒcÄ€LE éT9—Ÿ¯vO:º4ìwÅž´’w:.‘Mc[ÔuÁäºì‡®|<ˆ‰`ÖÚ¾Wúžg¿êŠf{!±+á|Y8 Ö-—¤ÞòL?ÇúnpYX¬º¶ï™î!\{8jì]]T³Y`uðÁqÚÓ‘Ý—`TòÌ)Eœ¨˜….ÿÝq:“D E $=¾ç9çÀ+„ÌÐsRœÊÜQÆ_æd8e¬}»Œoë}æm‘åÅ «¶ëã8fŽ 8‡±Êòô’耞úͤùÑKÅcY•lP„PÄN…¿àÄn:ÍÏB.—%&­“k Ïçá8„‹Óa~ây;à1Ê|J©ž®°Ô’pd<¥µå•¥U¼Xjmp#¹Å¼ ¢RkÝjëpÇ膬Ãã²ö 2g6>/wnœŠò²Q:Ë>|„ãïsþ\ªÙ?Ð)‚ô÷6T—˜ñ“´s„àûòÜ3©ñÃýÍ$'Á–U€QÎä*ŒZÕ7Ÿ£` càdçYðD3놕Žñ»*¸»ùç…Œ4!Ú¨H¿&#BÌŽc÷'6É•3æãN¾)ár#¯T`6x„<ñþk3­â±¢2bkbµdpäò)¦ó†îY »6¸•Ë#þžG)¦È—g ½T3¨¹¸ü»~ð…¢²Cua†UÃgQõ­@ Kíû’ ćV&¡ ’Ó–4W2ï´uLQ,°¨ÄDŠ4´m\UJÏ9¤Ä!"mÓO;ß0ÅÑms©ÒH‡A¾ e—ˆ‡AæIr|¹®¹~"ŠÃ¨mÉæ“õ Y«l`‰3õ%Íÿ¹¨÷AŒÔ˜ ®„!ýV,ÌÊ!°ç>þoPXÔ-\‚½(5OF;Ã^½ ª–† –6Uy>BÕÝkP%u/˜äN˜DEø¹ã‘v/祯,èeéuxç±Ja?×Ö52d/oñ_@Vœ•¤†]2¹TÙ(ƒÐ i¹p€{^3"Ìþ䜰.¡Fˆ}ç9¢˜ uÅnr1‰pd,øm8Š9êk(|°Ž™ •žæ1WþÅ Wß1‡°3X„çˆ^*Žj(ßdÚííÅ£ RÇ .Ð%Ü…ða7{¯m»r[6ˆgÆÆdÔLîÆðZT[v5¿>Hüh¾ò1AW>®†§×˜ÏŠíI~ÜûוvbŠŒLœP‹JQ i?øÅáQR5á¾;4X~Ìl¡@±q þ÷Û®Ø R¥hBª»_? *Áé ? <‚%j'÷ š¨- çH]9pÅ £•H;ŸçÓ•O’À‹Ïh Þ‹$6„»Üy@ç'¤úrÛà1µ+Á}TªI¶ë`3™åCG‚è®Yvk~›÷f%Hpáó2üþ‡»ûws ¡ÛÓzÖO?jh-§äOû Rd#[î½H²õZ¼¼ã—c€e`À!oáÌ·®éùe¼.ŸD€ s!Õ·Õx—ÅÛôˆÿçî1P:J0e¯—æ.WQªÇds÷ö|Ä-·÷¯&&†#œÀþiË•kZÒÖª(†ªÝ&*MRILŸÞPCK~ú×X<Ãus-6JNCÑqÄËê—“q‘J¾.1™8Vq–\•˜®‘1îåÛ".÷Íu7/‘š!Me*2’¨nßP;ÜêGĪ6ìš“›Ü™›,¹éåÂh0“6Wú r®NÓëüt…Œq/$"û?:ƒÒ*—®óoTr›$/ :„dÁœ¶c†ŒD„š2ĵ$S»¹\”ú5u£­ÜŠ¢ãs¬KäâA‹¶ü䤲ÄÝs½gr7uX xÜ-œa‡­¤Þ—ííÏL’æ•ùøŠ]åÚS‚£»~âPÏ,£bY§ãE½¡ÔK×èÃf\®”Ù¯_m,ÞIÙ)áXOÌÆÃ7;$à)¥#Æ~š…a­N-4ª×@:£0öÑ0ÝcÞKsÊë_¤Oj¡!qìÏ /I`ùQàå·÷,5ì92í8²!Jw‘ŸJìsÚ$9µ©ðåØrÂîâ1…à å0ì¹.HÆb(Ô¡ú$qÞi¹>(¨5ŸH h²\?•5ã¨M{àªÉSUšÿÅÜÓö±u›‰ª8Òp3 e±Ž膙&GÜ¢F…ùܹKݤsܱ·Hu—PÉØÁ;«)u–)«óªYfÉ:>›pøР endstream endobj 520 0 obj << /Length 2353 /Filter /FlateDecode >> stream xÚ¥YKsã6¾ûWðHUE4ñàë°‡¸j“lj×µ»ãT` ’XC‘’Šã¿ýõÚÞ)û Æ£î¯?Ài´Òèç›T¾w7·?é*R*©²LG›H¥:)K©J”-£‡uô9ºˆ_u»]<>üzû¨žu1ebŠ$Ý{V¹5OD#Y,m‘ÇŸü8âˆP)âqçYÚâTÇ=þ>-–ðë{nè6¬Ù»vÝíY6Œ®cäñØ{?Èp¯Âç«Ðy™äiùæJUžU•½wí £ï܈¢¥ÑUb³,Z*›X›Ë¡¦v­k^†zÀZ?×MÃòÑ}A£<ËÿH³thêín¡Ëxl^XºïzfkAGÍš¡u’çêm3²D™,¨ŒõÞa`YÊXÔû¯Çº÷k–oº^ akµ)’¢Ê/­…o×®‡.Våg&[UÄÏ;V`C×¢e(ì*n=—Ñö»º»ÿ• $ųƒ£xçpÑЧ‘œ cËMý…ö­©Á¸%”:2a=p3:](uÃì*ëvã{ö͆¡U½…$(h¼”§CE…Ö ;”ਅï5¤è,I+Aà%ÚT<õçßËLÙ8‘¿ÅR¥&?áÈa¦Leâ>¨9yÚíÁõC½ïÚ—[p¥þ¤bìæï7_o0¦ÒHEJÛ$«¢¬2‰Ê«hµ¿ùü˜Fkhƒ ILUFϤ¹ŒÅ@Ã~Môéæ?Wc% RdIiì[ƒ€z‘×ë1l^%™Ö#Øòþ×¶¼‘²Ì&ºT|0¿ï<¸É¬„èLf‰äc]Óm_¸]z_Ž;HB™;û–ü ÛÛ0vTüoÂË—ý“凞xå=øð¹»f¼´'J\€!yÎ÷Gª,â ˆÐÝñ[·‡ãÈÅ‘|tYæ:¾“Žk¿qÇf„%d)ÚH tÞ« ˆ…Bi<ƒ¬r¤Ì¹'‚\–ÐÀè·þûó hi{6 y$8ÔñÃN Ò5£ï[²:Ä?a0î-Z}ލfÈ€¬,pü 6NâDfû}QªX:lºc»žG^Ûôt®PØüªf´BL¾9ÂÚ®>³#AI0›°ªë·ž‹kGPUTC¿zÜqéþþ\Øw'æéóJ8¯‘¿[ßú^pªwkÑ;Ñ€”1’b{ÍÙ\´8GRìÃHJ%DR*vO£«É§±ÆÆbiÂÉ™enzÌ Ææ°ðÁ"%$S•a7@!ÖV¸êÙ ô¯x.17¨ø– êœôÚÓ 4… ‚ùúL¬AÂ<6°Ö†Ôˆ• fcá½®W8ü®ÓØSRµŒÔƒ—ŸüŠü†]ã€Â Ô£¸Ž„r\,ìhXì²à:DF^×pY\Z»v6á=ã‚…¹›5²‹é`kŽàÒ§`_uYÔ†¿Ž?[ŒWÈʲM‚¸8öë“&Ø_Š6 kIÔŠÀBaÒ–¯£ âgø™pŠ~`b/§5Ãí!kÙÄ훥ši’fv¢šLŒ¼&Bš¨è TaNG…>·!þ«Î'\–Êðp¸¡â|pÁH,¥³ø¨ÔjaTŒ›Wdñp<€…PïT±äi¹‡ýÙñÿç#ȰBP¹{dÁdDM¼D¨‰®â{t½ŒQÕíý؃ÿ1yêºq{wàæ‰¢¾ÆDL•'en>ÆDLl¢üùÈÁ–÷‡ø&b²"© qoBA]åräèNÄ£«‚b[Ơ‰KtãÁ‚wìµ\«9è1©6,y"Ç:ið˜Åi̇D#¸ƒ9[ŒQwBFšpXÎ&Ðéò Ôı¡ØvíòÜ“Pöt/âS‚À‹‘¾ Æ‰¾è Ê'h„r 9l¡ŸMí Áñµ ØñÊ£@®ˆÁ *ÜÍG·Ø p61¦PÈhté©lØ\3g)k„è ë 8¢F-cŽœs¡ÌqÅH 6€rö*ó¢WIäO‹ýÍÃ4ÐÃ|g×ÇÄóÐÀm¤d Q,œ h#ñš!0ωXοŠt¤‡‚™|è_£ÓáME)¿YT.ÃÄòm–œoàªë‰ù™òtí.èÚ]Òµ{i¨óF¡| ;­ürÒ¹koØìUÒfÃçHS¡˜6çägUü‹oWž–cƒÕáK-\ˆˆkfs49Ÿ{_1@Š~û}e”.Œ™u¼·œ\€ë«.ш»v-> stream xÚÅYÝã¶ß¿BoÑ#~SR whr-òæ6Åå€ãÊ\[ˆ,ù$9ÛEþùÎðöle¯wk¤/65"g†3¿Ge¶ÎÊìû›2þ¿º»ùú;Ve”’JJ–Ý=d´dÄ‘é’*Lv·ÊÞåu¿uãmÁ¤Ê›.üoo™Î÷íÔìZ(¿”TÚ[fòßðU¿Fr[Êò»Mœ±r–DF‘áè"aêÿ}e‘Á²rã_€¨)h0 ·žwðlò¾[5Ýz¾n1ïïþ +¨ B¨ »Ýí†þ§ÙÚ 5Q4å}B²ß¶nÚ '¯À@Û±š{Or«0Éïþß¡$0#iÚ?}ò˜Œï‚‰òÞÛG;ÀêE•ÚæW¯NÛD5N”¡ù`‹¥ÍM ÌâŠçÀ…æ°šOH`à YÚ~º5`Ó0í9½Õ…Þ`{¶»i¶QÛ ö÷7vtkï£Gü±A F󻣸·oŠDL°|œìÔŒSSA#;,z Yp¦òFQ—¹mZ{ߦ;°B`6_Çi|¸PÍÀ• ¢"SEXˆ2™¿î·[Û­Š¶é‹–èYÆsí]`5 `Å¡J^ëPT \Ë:Ø–¾ ôÉ;FÅáÇ7ÿþá?ÞÍ&Í©°¥¨ãÙÚz®®R' aY²àÏ£€sM;…Ѫÿ] ChûIñUruóð”V»¸8…/>ìì`!d2jÛ…Ak÷][Ü—/¨° «ùc3mÂÈ ÃÁ‡à°ý‰*I47À*°Ø+|‘ÝR 1"g¸i¼, (“žW©Y,eã0\g´¬•šˆ 8q<$äË0 ¶¢`W䥘škunWŽ©€ž`zÉMª‘î»Åô ®„s+ÍøÁiXÊÜ«'À‡¼âñØåe¸* k‡%é’¦^µö3ÄŸŠ]:K'RVsׄ ÿ—¨_5‡=¯5!YLm?]t¤¸]”ÀÅœàõÆvk7ÒJ(‰Z«¼Ç¬B® ù%LDMgÎD¢¿ÁÄ .õž,þÌÜ]ÑÌÛÔü¸NrêîR“, øŠKçYf‚ ©àläpªVL<›uñ¥¯#Ö0Ws±£›Æ:Øày»d*$¡ ‰c}¤õ˲¡@ 3ÏKhólÖÒ¹¹ŽXeâ\j2ÄE]õV5«+¦Ã-1±¶N­¸-…‹ SÇÖIȵ¾Q«û!ÞÂ*¿kOñšÌâÔv¶}Ý'‚Ò€[M JõeA¹»bPîì°hQÕ¥—YOÃpììfû³¿”*-¡dGF³¦ôtÒlû.\=iœì0yàÓ480§„ œ¿Ð1\¾Ë&4ëp8Ù_÷\%’sûÅNf]÷ûèü‚S™®«0 >‡Á‡bIª|9Eâ£GL°÷£;åá/ègÌ@ý8êc»µí×OthaŹؓ¬íá–©Ò-3öÀ‘:öû2ÿýAvß÷Ó8 v¸JCª Ÿ•ú›PAl›˜'¨ š¤je¿?¿{¨iµ9|õ,Í0Â-‹¿.Z.ÉÇ^RùÍ¢u\Gô…¬³”6“•RZLU:Þ‡.R•Ž©*Á&6Æ£õý„ÁíÚ wY¦Ñ`[Ìš*"ÒIôEF¼Ø˜<úû[ìÖ4T!4Í;×Äö5/ºþHLíàØõ7Ç®?¾lhðÃ68…Q×G†G›˜ü‘¾O:Í¢2ôŽÚ½›¦oíö“[}Â|ÑW7=„oñKÍ ú Þ{õ‡H©Ï|(‘4™ ‡Ád¸dpÓ~èâ#š§ï"á)|‘H÷€ ÏÙG–zü?Y¢æ8 Á®.¢‹›@ÁÛ?¶¾M€Âò; ‰GëàãëMÊ{;ºÕMÜïí´{ºÿCSÇðlwè³b=±ßí‚ôa:³äi àÉ*(Äb)Dç_Í  û/Uûé endstream endobj 537 0 obj << /Length 2343 /Filter /FlateDecode >> stream xÚµYÝoÛ8Ï_!ÜËÊ@ÌŠ¤HIî!Í5ée›Þ^ktqh8Y–caeÉÕGÓàö¿%KŠœÜn÷ò ‡ä3œiϹs<çúÌ›|_­Î^\IîpÎ"¥„³Ú:ÜWL ß <θ:«óÉýÏâ—ÕM?ëÅ NL!t™±YÑàèW"‚IÕúëb)…v—þËÅÒ—Êýðf™g¿.Dà¦Ø¸ë*.ÜMµ#VÝ‹%eÕÔ4?ÎË"e“ÍõYJŸER;K2?ú룬>Ÿ=åmÒmÜæ œˆ‡ª\ˆÐý–íãÆ*ú*F΃Q½îuÕ‹“ºOVj¤°ŠXÈAa!™X…? î=­3g§:u–û9•¹fÂÓÝT±¬hÜDVÈÂ~Ør¹/7i>'Ï—ÌÓr ÏIƒcS~7¨—uözuöåŒßs¸#”Ç„t4¨.î$û³O¿xÎúnI8ö{3rïH¦#œ•;ÎþIþ?^N(É"!Œ,Z¶ˆ÷)® ^$ÀPÂg¾¯ŸÜ×°š8Úê»¶ÅuÀ¤ ¬@èñ¶ùfÈïLf=²n×u“5m“•9ë¾ Ý øìÞ¸ |&œÀÒ ÒyWt"œ¢Óáô®Mòt¡<·l²Mº\#׆³Y,¹V7†­4¯g½PL€U{õf|ÆÇàì½ùÍÿ Õœ(Å™æbèÐØ‘«ë]ñ·ÅRqåÞ\‚ýtDÞ!" ý±wØ?†~×¾ ù¤íÚ«w‘1®WïGí¤­›rOôof}Ï.¬há 5ŠTæœè»ÝédÀO|Ðìn`‹±ñ¼±–7—‘w®JÔÔP>êÈË ÔÎòH/_ 7.6DÍØ¤E‰‰éfg‰Ï\úuƒãjó—‘žvé±kû2ì]\Öî®vélª’,£Þ™¬Içr•`üèQå¡[+r“¬‰^›R£­Ó m§)‰³I?{Ü/ºT æô‘.1Œ <·Hï‘àSÝ Ëè nhZ¸į›*+îhV¹µ¼ì›ì.â‰vfÇ ¤ÉpC©íhÈFSóŽä2ôÜ«E( -–ÚqN’ÂñÂs=óG]IYUim W±©‰‹ÖÀ¯ $l%1ôÍ¥¥É&Lå ܯ°y4jØù› U_w&­méktÄ|cr ñ¶Uú¥M‹$3Z#³ß¶È¶eµGwgsÑäq!}ºè¡b!(ÖDÝ„F7ü¢Gs—QcµËl7ø °Í>±™ÄÉ[I)5Èo°‹VAì×ñŒyb£ê¹ÙñÀ¨Ýìâ†(£+|cúiÝFî}Öì2ëÆ°{FÔ‡4íˆÄØ—=V·êΖ¹÷×gÎ'3H3ÎĨØŒô™]¯Ðâužž«åò‰H—ÙP'ó*j&Þýcõúål Ãú<ê†'Â5Æq†œC\A5lÒª¦6:~û)ÇdZy@—88P]ÃLœ[ªÏØÀd²ÏÌ¡c³.é×ôml{lDï©í<³$:äœg;ZÑ® g¨9䇼.ÏçÌŸW(ÅWà×j]gx$À"Æ.Äi’mˆc’7˜A¾u¤ò2–2HÚ LÄâ¿2³ƒ­®1š™€1rO$ž¯ åÄo)Rµ kÝE¾ž&GàT€«íhãÌ™AU&Ôãø€öº‹ 1¨?‰15ð w’ÖLÖ•:4–øº @Æ¶Ý N1‡¨ƒNÓLjÜ'|~ëhR‚0t/Ëý>¶KŕݦÉ#äQÄà®22®ÙQºuŠŽnn#Ð"£ Ó…œ:ª4‡C;r‚^;è4¾€Da…®ó¸øÕÊ?ĉQïÊ6·#»˜sK*M•=¥61‘€u—VÏ¡S‹5é²ü~tz±ÊÝgE¹ŒòYåN ªRúY„ §©Ä“•KD=–|{=+îQüð*?æ6 ¾¸ÁÆ›ÕjÔ¾mÞ¿þhá+º˜ gáëßâÈ.ÜÝn;ÄIìËÛ¶É{oä 9—‡)çãx ¯ò²n÷Zţ¸mnãý`e8U3â¼ùûÇû)c=bœÆwÓÊ4§péÑÿÐ"ÜîŽСE†&׊Ðç¶Í‰w¿KmoY¤–…i„ŠzSË@ ø¶uJ"b;)>ú«9E¸uFJ> ‘C>I‚¼ !·€0hi6c2ÎrS®Mÿ1mþ!Ç´ì?í̈۷³xjeRYüau¶ÊlXwêÀ|œ¦ió°°Æ0ç”É9KqO…0§Q× €ž/0¯Íòl]eí~H ‚¡û.âýEkʯØugÓ¡½sdöÓhnGÞï²î1›æÚNsj;§¦ >‹’ ”à½Á‘&•€`|@Åà5n l„²x H;š9¸RÝæ&ž‚#¬€Ñ”—7¶¯ oý4ú›l8`þ,b;ýdWz ”X©?ödµŒã™'’A¢!ÊÿÎ'H¯¡6²<ÕݱÑ%/j¦¤øs–<&„/»Í Bƒc pfÞÄ|Í$¤¥?cø¾æ‰ñN=>-9 nñiB5~æáök_¡<º~á7)÷ØÑX­ˆEyQz6ãü¡& à Åîšb4µ¢Úb“V³ÁMYàß”¸°©dˆÒ½ÀÔÙ:µ #^[@MH ]?|tN ®?G$aNèÑ¡H¨ûj:"2©åwŠ;KíYd=÷$(Ž›ë‘æÛãÍš²¥µÒ ÙšLÛA %§·O‹ÐàúäJôxRöõ›ŽK2ÇïO (·o©Õg, gŸ½z⌙œÓŸÔé¼cRˆÿGžÊ{è¶´xhÞê>à…Þêçsn0>xÞžnu|Í}^F9 %!~CæŸí}§ÝûïÅùöò|{}¾]ÍF¹Ž˜/&PñÝà­Å.d5¨«OCzð7¨gÞ›Ÿøù&}Þö…œJ*ì-Á@ßÁ­(Û¿Ý.løpd´ª¬š|%»{JllË<7¿÷Ü[ÆË±‹rÐIú>ÃíϺ×£A=þ Âϯ endstream endobj 541 0 obj << /Length 1607 /Filter /FlateDecode >> stream xÚ½XÛrÛ6}×Wð‘ê˜0î óæº‰Û$ö´‰&3™$´DÚœŠdBRIÓþ|R„L'’¢öÅqY,ÎÙ= w®fø;¿Ÿf~q@" ¡(Á,X–³wp°‚ÁçF,‰ƒ/fjP‘ Bh¯ƒ×³?f?/fçÏà›”AƒEÅI 0«Ðµ Þ…7i™Í#âáe]ÎIX¦Õ*Zô2ªÂúcWÔÕüÃâùìébÂ5™Ä‹äD®ÉX!ÅcëÚóK™èÏŸÁ¤Ñdæ sfVTÎ#ADˆ1ïõ_óå®Qq¦ôïðÇšõ}ˆœÝˆpĹ´ÖŸÅäö5ÿ"Ƙ'Æ<9í }ñ6Ç8ñÝ „]¹˜Ç4ln²üàMèiOê9È í=„ÏÂ…PÆ´yrÒS‚ ›ü'ö†ñ·ëC¸$ŒRØ€Ÿè”bpâö>ã›ÃΈ©óÓÆë›ëc\Ø×üë·×… óBžô„W‹WǸðh1â‰@œüp1‚úÇ<àŠ#“‘x¤·k]ã8$hI‡7›%ø´Îê®X¹¡vsÛvE·1uzTXÖóJé*[Ûï jnk›ï±Àik®²÷˜ð*[١­~gΫ‰ƒæ.°WW3pŠ*7f/Ðó »긵ÛÝgzLñÀ_ÖM“µkuµ*ª;]ñe¸Ü´ÜLõ÷<×cý·Þ´ÆY0ÎÂïï÷sèÿzýyžõ¿À´C-¢˜Pö‰õë'o%¬ðÉ!HÁ ?0"pèðç" [Óñi“UKݤ'‘`‰{;O€ME OËES,SM«DÇ`hÙ§M±.na´)6¥í»M[7š7Yd°Žú <ÈS…áM £Ô.vE™vKè¿5Ú¡e½©æ8´ô@ñD7,Ë妣™]ZçãIб*òÈ#ßégžÁ*½OgyÓGhÇT*g:ÒuqW•n:ÚeÇã3rôDN³Ã ½˜S–EUGé²<¦{J™ª¤ôíÙLˆc3¡=›ŽJIÍÞŽBgңкŠ¢¹v|B0´¶ÏR 1¥‰ÚR C–RÕSšôHÃÐJu_>•¼9«Dƒí°™¶–Ë>=÷ã”SûJÉ1RÄÉá?»œzÏ¡†ä*§ž |DgbëÞRûuŸ6é²ËÛµ…ÛÉb­!È`œ¸×¢ÔMÈëõºÖÉóÅu<ùfìb÷{JúãJÄb±¯ $9!!1 au O³pÐ`§í’÷"ÀG¬Ÿn¶ÏÊ“ GZ¦ lƒ*ÙÍ<-è!•=¤öÕW÷ˆnÚ¡:”é_E©ÙÙ”¶c]ü©?³uqouîþÏBÁåÞBÕÝÃ[ªdÀ[;o±æ<î¥?~€5ç áº9xádÃnà嫽T¹è¥Ê)X±b¡{Úz–Ù[7vÖo/ °Ò-ë5¦_7¡;WMç\ÿ±Ô‰€ô4`(õP p^_4sFÆtšäsµ[¤ÅV9=t9´ÕìCvhw|L¥ÓlŽ3AÙLˆw2!~˜ ;È:œŽF6¿8Ë/Ïò«³|1…1\¥"#™pß[ëj$døyŸP Vö37¨A—i¤5eeG¶!Ó¢©Û;…²™p²uo’yŠØ6™Ï¦ìÀ•~°qy¼ ¼õäjòaÂ(A”’2_­&ÏFlö''^I?ÇFƧDÔ©+úðm®u@·ЬiíHwŸv¶µsEwÃu?ÍYöµ!Iú+Ô Ä÷vqfcùòÌí•SþÊÅøÂvÛfË®ølþ«~}GÖ™B\@0Sbí.ôï©ýoÑãñ¬•}@5ê&Q•ðR´B'=DêCE±Т®=ï>Oä ’ Nþç&†ã “[þë“Â{•²€ÀÙù­·'C2!þËs'¼¤Ü8µ)åk fj§O©JíT–Gœ"vã ’„!Aø¹¥Ÿ×ŒÅÆ[¾_»À2¬}‰:\gº&­ÚB—sÓ´Õ´¦éâe¬!=9 ¹¹°­ë¾äÑ2!qŠÃË´ò_¿ ƒ{ $ ²ûÿ… ý Ñ’ô endstream endobj 548 0 obj << /Length 2675 /Filter /FlateDecode >> stream xÚ½ZKsÛ8¾ûWð(WEÄs¶æ°ÉÔLe;ñž’`‰–X¡( I%ö¿ßn4ø’)[Ž]{1AìnôãCwËi²IÒä·«4>ÿqsõÓ{áΙSJ$7w ÏãÒ%&åð´ÉÍ:ù´¸½^ ³È¯—Òè…§Çç”Ëû|/jq€ v±oжøv £¸õÛµ’ _sÚõ9UiÎ6ìÝõRñl!Y 3œ¶îkz¶×Àéá~¹ùã§÷ ØH@‘– òÑâž“Cpfe·£ÝåMÞ’í6Š·ó÷ÅùwH%Y é˜à:YrɤÔô}Y|Å=yYl÷A,ú 'Ï„^äM[ì|›3¤Ð+„Vc–06©D,5†<=ýJœ?ŠçX~›=ªf"íµMΨ[fûmË塨fÉeš9ÎGäø1Ë$œ/n:ÔûC8Ư7W]á·iƒ™œÐ‰Ö‚Y¡’ÕîêÓ—4YÃâIÊ2g“ïaë.ɘvøY™|¼úùä‰É%gšÛ@K­Ààk2O“ÚE³©§ÄâÊ0éT¢¥/r¯‹kP*ÒâöDªGŠMÙà´?ƒÿ N"ªÛb_ÁÐÁøŸ(¡×A©…¯ [æ41–7 ¨Å?}E“}€â‹'B}€âÜ(q­ˆßa(*ÇŒ3SÇÿ”¾ã_ÈËk_mrš¨8õl :ìQOÇiÊR5 T¤Y…@Å™q †‰7ŠIÇt–½.(Wo”ÕªôM“7s$Á×w—f/[u;–*e"K4DŒUæuQ©2ˆphiÕ×o›v†­UL‚øoÂ×:Æ£&|W¾X Á´˜zòœ&¸TŒ'åP4þ:$°VZh=¥ n¸}¶—OÙFM6{ÀG¼óô˜IÂp+^$€ôù&¯ŸD'á¨úuxèß}yØÎÒ“Kuö"0ÜøÝÎDX͔ͦÑ/?wokNÒZ ™Ù˜W Ãfë}ò ï_û]Þ¢)–ƺÁqáv¼+~<¤Øø%ÝsM±¤S`“¸"5Ó<¦AJ| ÷6<ÃkJ—-¼Òe ºlaezÙÂÊ—-Òë/Û¥%Ülϰ¿ b§Sµ·Û¢¡õƒˆº¡ZI{‘¦.á£A^ p‘ÈwÀöæß¯C>ó•fo1Læ¤\#†•íKR|ýcѳ<6ù iÀi(^X*^›´Bù€&dí._à‡3Þ¿Ìu­›ªã¦÷”b½.ム¸ƒ_¡·ôÖÝ mº0p’. ü(ä;4|dÖuѬjpNÞùsŒ*ÜkËYwª‹Ûx3! Â<Ò xXÑ«obÛ§—áücét°m—û ½ã¬;øÅä—f_àêG¼C ÞqWç³îÉ»K¤‹¯L)Lõ‚ ²¨Àí5›“f’AIÖ‰wÒáNIÍôg .ˆË§6ý;*߀ժø,!*Ž1ÀÌ@3]уè@áM÷Þ »yùÓ ð½–ö‘UµMª®1u£Y×Û‘SØpÏõ ¸5;p¥î7ñT!lLxëⶆ¸:¥Š@WÜ·ÇzDs8U§¯5- ¦b™w"ój_×yO[­‹jƒúЀù_ǼZAGë¢ÎWmùÐ-ïw4"¡pƒo=Ä–?Eüj¢gÉ%ä:e 4#Éûk+ ÙÌÿÅ Q ¶ÝR˜J S‡ˆÌ†Ë3®´[ŠPÙ…²Þ:£Ãp_E"4sl޳–!PÞPŸ‡¼Xç Ã†&==šbSxA¯|È¢Ûî£x‘·áà ÜÔÒ0´¢ð¹%XÃq§:ëó8÷)¢†j½IhðçoW °Ä€™/ôÍÝ>òµÆN Þ÷L`xjž¤ÝûŠ»Ãº‰;áÎ*B_Še Ùh="\ÎvÀË— ¢ùAT,Ê93ÒìL&jEßßjZ8V ´m^ǘ šÄ)jÁ@æ\Çô#†ßm Jà ŠØ!˼ڴ[̃À–1 &à,žƒÑOÖ±l%¹N¬•æIo1ÜœCHÓÞ;ŒWûx¤{ôHI6ÅݾÌWÇÒ×4 N h€a‹pˆa`C4´;$­° à‡k€ "Jkßq¯§ûqîŠF ÅöÖîPbTíú³Ø‚ »_»_ÁÜ™:%lãÿ­Ö!it=Ø‹Só²­£)ÿÐU}‚^2bŒiOÇAbœö„·õ&îE'Àç‰Íî˜p†±ÛŠf”à úšc±Žy@3$ǨxPDîCÌx¹£!Â!‡ºÌî63ux½`>XŸÛ¸1¿§Š®dy…jóò¡§€Ûç+€q?!ŒŠ×oøÌè¡î‰@cPÖ}ªëåã ¡++”!p—|Èc$3“Þ‘VL ­ëæLÊCRäÅF(¤T1=ö›MV¸bFAö5ÚX­g™f,“æ9žzÂóö OHÚ!{oìQT ¨qÓÓ.X×í™X&“Üðìm¹™f}W‹6Ÿ;¶ÁëÏ7+·iúù€&J3G;ý¦owú3Ícž DÏè^0«úNÁíl3ÌГÁ8Êô9jPssñRçiÏ2ƒ”ýç™àRçiÏ!›øë»è,JCYyÚKùÜ|<ÃBðxžF°Œ.ƒKç\Æf,ºÙí¼Y„0ãþ$êñ¾öõš¨ÝÐÄÖ‡{êzøEâ„-D…u—F¿|:úÁm”MF™gJ³rlçkql[ j%žÃ©^È÷ Ìqúù“Bm9ürx)ÇgUQé\_a>:*6EÞĨé à‹Ž*†ö#Ï ™å ¥©½ÄºÀ:M'Z~ʲöÿnÙ=îíYüãÙ˜shbUl6ÀPvÙß½ùU½E±UÝo ô›=€²3z®E7âï(‹˜VÇ¡"$J¡ì¯šS¥Ù£[&x«|AY5ÆßsÚ–B]¬mwámÓú‚TŽUªbøËO+!SóÇM!ß²—\tÀ:Þß HØçÎk˜P|¢ì°K¦þ¤w=Ç2íV/=å ňq"b¡†ayôsHK˜Ì²óÙ3þg»øÁaüßzëâÇ!~â4Öõ8©XøÑNSøà$†OØu€"°/qp¦hè׿fZé³uÉ6qßa£r¡f Ê—m±òeœ?Ä6Ë}Ñu&p« úÁT½â¸/ UWâì8´Ã—[߾élq¬ºº¥3}°SºÓHìH­i"ÝjßÒ|Q­Ž5 ©ô@/«ýîplÙ|IS‘QÈ¢¶±<£¾¦VÀPÈsåWøƒ‚cÖÆæŸ¶~½¹úõO'Ø endstream endobj 555 0 obj << /Length 1789 /Filter /FlateDecode >> stream xÚ½XKoÜ6¾ûWìQ DŒøHè¡)’"E´Í=$9È»\¯P­äJT £¾3J^)rìx\$ŠÎóãÌÉêj•¬~¹HÂûÕæâ呯8gyšŠÕf¿âR0®ò•N8¼Íj³[}ˆ\³Ž¥–‘;X¨ÈµÅ®tk•M]T4w"¡£­:¶ŽSE?ѪºqÅeeécW~L¸´­­·×Méö2º®Š²¦áçuª¢¢.«ªXÚü jÇ\1¥2ÒlÛ¬A&¥QÑ‚2¨B~¢ ¾ ¬ßÑ/gÞþ¶Lyðünða?¯…‰lK„eGîP8šéúËΕ®wA¬‰ÚÂÙŽ~à›Ö.i ÞËD½#áÛ¦mmkwøCGEÕÔWDCÁõUº­š+[ûM÷õ´’¯áoR/h¶Øx«mh'AàѺ¡wDNDz[l# ºLŽŒë™Ñÿ}ÝbØgz ¶Üýèªv1¹pȶ'¸f€j^©…L}N[Ì?àf3W·(‹ñô´²rèáö˶¨=>$€w…;< ò¢ͬ%‘̢à & M¡$鬼cý›E±#Ü«[­Æ˜³ÛGêæÏ(m8T„ØÝ×áóD3“£Æ9SBŸ%-Ó”Éì4q(ˆHÈxjëˆØí¬:‡Èú¶¿}dÝ-…B˜CHÎ5ty#|i¨ÑSý¡¹¼Ó>ÈJÀ/ l‡YîSãx@Å:@>.‡Õ8Hž6< >x¶Kî=d³Ð?sD!iäêlõÛG«?½A@‡½­Çau Û;”}oƒêGT7 åEG§kQïYe…¶$Óê¼Ê·¸#¾ly 'ÓyÝgîÏ#gµ> stream xÚÝY_sã¶÷§à[éö H€}k¦½ÎÝ$é%çLr™)-ÁkRÔ‘”u÷í»@™”éÚ‰5éL_l`w± »¿Ý…d´Ždô÷ yòÿ›ë‹«·i)%ò4ÕÑõm¤´Ƥ‘•J(ã¢ëUôsüI+yùËõûãBX¥'«”°Ò‹Ä‹][n{Zñ·ë‹Ï 82R‘²),Q¤<16ZÖ?ÿ"£0ßGR$¹‹$ZG‰Èr\VE/~š´¹ÈŒžn´+{ÿج–FäÎŬ–Nd6Ÿš­¶Z½z«ó±ìÂf"M¢…2p¤‹~€“¹Ô6î/Úæq¿ñ0p2®Ê;$ûªÜ4ÈŠù·MËò¾X¢Ø†Éô¹D¥Dù$•©‚Ê?>>‰$Éàsu”¹LäRý÷“H•žžÄôë’$†tY©ùóvÜÞ׺š±mµ069mt$wb»ºý—^\.Œ–ñÛK§c:5:)ùœÆ”?½ã1Ð`³ÑB›D¸$Þéi½ÿ±À£NŒ‹ëp3¾êÞ%Õp‰eǼæRÅ»¾l¶&XÛw~dš¹–+ÏÎ_Þâ÷é,¾-º~ÁÃb‹kÛU ~ëaá雚ê¾Ü®Y¦õkØOÇrt6: ‹ªr½­ƒ q X˜[b¥xéÂÈ_sé‹a.S¹P`÷0—)´pŽ}[,ý,â+Lþ4ä˜Á•èšq¶jÖxnýÎÀ™/»ªiñ6Qhµoé pL§Mˆ u¾h':[‘¥GßCuOÈ ð4ã3`¥GY%Í¥ÐYò*ÀPF ­2Ò%3ó,X)k„uéyl['tn§¶é ^)fñ5H&‚¤yÎA‡DŒ3‡q†Tˆ³Û}Å J 8¨›mÙ7|Q8Ç‹"\3eªÉqí[ÏÐs$eán‘Pl‹êkW6™ÀÁ=zˆo¿ò¬*Úu_}Á*` €Dß ªV<ØxÚ0åbÙ¡ÇýK¹˜óšá "¤˜ÿaC¸ö–œl[À*žÏ¸8’eUñÊ*dÜ»0 ©ø%b~ ‚Œ ¥wpÓ½/Ë…Íó(…t?ç}ÏH@ªìÄùæñ+$õ†P²I«ÏƒÒ gõËñã¶üÛ~Âqò\¤ç±ªeh¥¦V¨‘’Hº–$Qñûÿøž)\30õ“Le繇 Lœí:†?ÎDGjEª“!<6}¿ûóÕÕápø¹¢i×W'ÑurRöœäÃzØ€Œ ŒŒ5SŸaÈMœ=Bnâ\¨s€øPÚu€\d0: †ÝIŒB 4BX \¹¡t„}* ;vç”·Æ.¼_™P‡Œº8ê<­vn‘4…[f1g·Œ¬ÈddE6nÿ3²â(4)y@Öj.þ~ÈZY÷2Ê´ü7–ií~c:¡4Cg¯ÃØÌŠ$q¤Kéc± ÉZ¥ñ»¿ÎÅ©ƒV#;‹q-5ïzrÉÙ¦ô[7u·¿ì¸)ñä=IðS¸Aç¾DƒU“èÈèT@‹ý*Äþ+7†TeNM>„ì“?&nØÜh»ä³É¨M¢Ù‡ yâwßò´Ù÷»}Ï 8‘`¯(SÆ‚ …®“Ÿ´€8,²ŠÐœ™P“QtáäPŸ6>ȃëm9õIl×k\½¯¨«ê˜È¹•*«¡ÓAòާï¾<×ÏEcUž’t ŽôC¡ˆ“Ð@ßðÿõÅÐä< ûéË]åƒ"®œBñB.T° ]QcÿÇ“Pø!Ù÷<8”XýÍvª÷—©‰ èz÷ º8ÂIPI Jz8‚î÷hÞ¶ÍL\¦Ø?¥Q’:¡óJPPB¹ tY‘'!Ðj_7€äOÂ9 €01¼ÜøåÝóx.êL6®×ßào`–AF€[#ÏFiŽŠ4ŽP b 1ú˜£Ìà 8‚» zŽ¾Í Î¤³‡ š0?®Â¸»›ó¦Ð­ôò–GäåøVÑàr ò¶fJÏ}Èt5¬<àF JXܯ¤A…!ôTAÜ}xáÀ#(ûÍ 3¨ñ_ürO 1³M c¤›š+$¯|·£g†/£4ÂVÙŒ`&IÆ'Šü]‹™lŒdïQ©q“«Ôôa‘—Þ Í.ªÙSÖbÙ*`ãv °#¨é‹`6)HQ!øß»¯©>Ð2­h= ò3*@V¹,*ôEeãŸ:?h)ÃÊcÝ‚Zæ¢[Ïõá [~Àéé\Æ7ûž9•L¨bøl)@,,é)Qðxô”2u¹Þ„S$AJ'´¸¸^†P¬iÃò¾¬õ³OÊ˦†Ú¥ÿ]úH PŽåŠªÇ…°ÒÂešlùÊ ®2hã éR2\Qå·óàð›NjÖòÁº”Ù¾çSñ‹C~yÁÑs™Ãw|h1‹íñ`‚Áu¿éÂòŽå¨utñ=øàê —¦Áw@è¡N9«ÏxõX”*( nØ4cÌGuiI¹]Ý ¹t®˜ˆ)\'Šžþ ¹¥ð·QÙÃ*üeöåqô³ ðÍø€°¥=ý4QB“£„²‚â{ìe€—ø³€‰ é±,é©+‚ký¥7~ endstream endobj 568 0 obj << /Length 2292 /Filter /FlateDecode >> stream xÚ½XYÜÆ~ß_Aä%@¤»›w€¼È ²‘VH­ô’=3mñóÐjóëSG“sˆ»²½‚fú®®®úê¢ðvžð~¼íË›«ï~HOʰHåÝl=©Dlj— Ê8÷n*¤Øü|óÓrN©³S2ÌD K´=Ê®Æ^Ûv¤c¯n®~½’°,<é)‘†™”tCg^Ù\}øYx,þä‰0*rïž¶6^¦«½wWÿrÜžÝ |…±PçÜnmm6A¤Rî}É@‡*ɾ iqqÎ@«ºÖ d”„941È4=áî žd’…q‘xiž†…ÏâI¦ÀKž­ „sÆÓw?¨âìy¨R5k®¶Ã8€ìDê{¢Hü±;l•ù]Ýíl©k^^4¼Q¹?Ÿ™ÚÊôܽßo¤oË Ü_ìqS é€åRPEq.°n÷° b%ýÁè~&ˆc;`«•j*GS…› S¿ÙóŠô»Ãh»ÖÞwS]ñ‰;ºÕðÂ4˜Êl‚¿Lm9ZxGÎÄ9O÷vܳ4/á¦éѦ'a(@¯)¨<ÉC!ŠçÁPÄ¡H@å À\~Eãq˜ŠlædG‰ÿŽTBygàÑ%‰ YíwŽç·?^yh_&g¦á©]ÏonºÞQ´-L6šHJ¸ïœyŸ@ À£“.cñGÝϯ“5ãÚÛ/Ôøvj)*Nüë=ëáÍ?ppš Q·é4•A‰‰PfxáÐw»^7<¸·uÍ$ÚÎÛÓÃÂzw÷„L‘¡ð¥ýÔº ¤€3ºÕõÃ@€‡ió¹4¦xI%é›—<¯ÛŠç˜?œ"þpª›ÆÃ4É®0CO4Ã@Æ„Úí¶¬[¶i˜ßÔö# ÑÔvϲrãC ˆøØLf9>ŒÀ¡îÝVæèkHa?(º- º±ú7€å"äu]Nµ͹¿äë~gÛÙO‚èîô­íhç$õÜ×½gæÜ(fttõ¸¦³PP‰ð;6=Ý3í [°sr..|à Üð3º}È#¶ŒTè €GÒrdj»k÷¡AHá¿—#-÷÷Ãϼ‰+£ømmƒt¦†'¯‘¯n€GXt&±ˆýWŸ1Nä¾)Gà‘"ñ_õ}×ÿ…ûeoé@ËØ^ô=¦ç®S5ʼ^cj~àà<â¿7¹ò»þ£ƒìâØ8vtãžçISY›n´•óx$dÜ«Ûv.­WzÔ¬k£?­%YG¤çPÒèyIFV„i¬ˆV !n®¦C )ÂÈj¿´§ Æ'zÔªâ,·~$ú‰<ÉÀ“ Y.šâáp;ÍVO5"2Ï3ÿýàNŒœ@oÉ Þx?ŒÜ@¡ê¸%g‰û é—pÏ3§n!gOM'íP²CËÉM6Ü»‰0ü¸v^ë¦Ýžû 7z¼mwËÁÁ<‰V–myìÞÉ£ÖÞrï€ÇƒK·;àJ†¬²`CZœ²ÊTéaâ$ ©K,Ò0w!Uâÿ‡^¡m"týV—æI€KH€P T(ÓìâûsSÿ~+Ï!}€ #Deñ¼Ô^Ðy#-UäOeïJbÞª¾Éµ °"ί=VðÀ<ŠÏÁ°.Š« “>³¢H’PÀ­Q ·'êÉB&Úù·¹5‡¤6“ç·>QÇH™ÎAsWEäÂWó1š¢È3IæUÂ1.Þ ×nª2s¨qÈéÐÞQ9MjY/$”?šÃEÇ$h9‡‹raf6C¬_²ÈC©3.Tn¯·ËEÊÕ;5$Dè°5°ˆ¯Äv~öíj0ÞÙ£;Z<Éâ#ÐÛ~µHýü¢ð7‰7¹FÙO]›šÝ ¼¦:þ1Q;<’¨º“—.ûäR^,s®%¸oîín_?pÿவÿÓw$.Ø6êá#jDþk¨kMõæc9'§w0‘ÞœF¿K9kV*°Äœ® ×¢ðG^Ùöæ@&Èn³†È³7=!Cø¯–¤ ×Ö‰Nab¥>®==ºYŒZè Šf4 (H‡¨ôA€ºœ²oyWÙ5°›~àa·)Td³Çh΋\âÚ¸×î<=;ß_¿¹· íXè@‹ŽÁ¼ûZ<ÇM 勈Î5B…ÿOú€ûFüÊëúw¶ÕýÃ|£K;ÜíkßJ#!C!%öÍêg˜H„Yz4ÌD2Ù½ܽ,Oã±(‚b!+Î=Íδ}0ÆðH¦˜ƒqRÉ­›;r(—¶ŠëË'6¡&•A»Òç¥Ü93m“iC«°IÀrAdïÉc½X³ŠiÇ ½…È£aœsâÇ/9MÚ¶]]S}ïÖÈTü0!ý ¶­ùÛ¹~±pŠAH;.5Sòläùÿ]§˜3 endstream endobj 576 0 obj << /Length 2096 /Filter /FlateDecode >> stream xڵˎÜ6òî¯hì!a–,JÔ+9M6vÖA21ÖìN€Õtsº…Ñ£-Jž¿ßz±¥nËÁ^rR±X¬*Ö›Š6‡M´ùáEô…ïww/^½IãÖa™Â÷îa££8, ³É#jSlîö›ª=í·AªSõÕ·Û?î~„³6¡1™ß®‡©C £‚îĤ1ÂW§ãs»Õª €Œq|ýucÏ_E$çÕ›¸\êbãV%‹½;¹$‰Õï‘6prÛ@«qZíú¶­º=/šjêvÛ8WGëøÈÈgµ"¥³¯lÛwŒ|:’N„Îîzæ{~Å%¿ËT]Õ<»Ú…ÛÀ䱺íGâV}524ëVwD^f¹Ð©Tµ{'‡{¦s–û¾“S}×<{hgEôݺ‚ý4ž&Ð$NR2cƒŠ“LUƒe¬«Ûº©Æ¢dD’†€P9p°ªÑîycrt:ä‰Ý©†ýKX¦Fu}€×NÕP5m^þ™á>FÎâ5u¢ÞÛÝXƒuàt´Ñ›£þðbóNä²Íñ …F“€GÅ:öÞ¦ÇûA{ßpúÃPµLRwŒ¼¯Fö/Ûž¼±·/qª:´á7Òý÷:å®Âú/È&föÕÿ‘SOuÓ`ìäxçûêž#)S·¿Ü1ú ¯ÜhÃ,So»ïùÛõ#]„O|ú8/r‰Þ\Ñ%¨˜H2‘$ƒ)sµ³Î1¦ÊÙäkUˆOíáú¦HÕ3æ§AÏRGêýt8X‡ñâpÛð=le†¡Ý4®辰QHF!€ìZ ìå(ç9M-îIB|¶XSóž´d]ûÑC.NR={jêdã5qœÜÈ+>fyQ-)š±>5²"éË‘›Æ³r¹ç0,)cõ÷w¿:/ÿãT˜¿¸ª»5å™oœƒ4A?õ‘XmCްDotÆ:5aI©°È¡Hë8Uo;(< :‹ ˆLúp1ÜC?0 •t”(çØŠ‚"-.Jõýí xQÜ€<-¦6"ˆ•C±ü¸y~\ð‰âìé™e©n_ÿû×÷d¬À«·4Ù©Ç®OÍj*‰®;Å`̈bt¡ºjG®‚oÍx;4$}¢šƒÍÈt”#/±w½©Ó`ÝŸ´,`Š®¸T…Ðô_>¡Õ¥¦To¶E|Öúœ"ƒ’«ÁÕúNžŸ=#sÁ…‡¥“K‡Ïy#¯Á‚! yÀ‚.SiÀP²C±®êÎ1Fe«µlm¤‘èNL´«}Eåy0õ0«µ)<n70¡ìÀË”Ê)G n> VÊ,§‰l;‹#Íè+é=•¦»oªîqMéK9èµ´P¿ÐD—ÊÑ©*Q,A«Áj‰$O« ïÍÞ-D-9c«Æ]Ÿ}»¢WEª±Ýa<¢Vhõ/ŽqÃËBØË2PÞ˜1ý?k'X`³ÅÚÇKœˆ‚‰„æˆ79WT¼{QFê;ôŸ[T)íK‰-Üó"T{¶}©~׉ÁR€Éùò›¿á,¡yØÆ]žŸòÒ¬éÑ<¦kôÅ^V.tDò ÑRœÃJ²cWMÎÎJ­(}kŸj²Ä#œ€p) òÞD¸­I ÇË9¯°Æ)rŠò<£”õ¨k+àܨ3uƒ7Õð~˜…Dx¡F^û_-NroûH6Éö&žÃ`z:˜Äø€—OTÈ^t\Î]WóóŠ(ç¤6ÒýפZºr'¡ÛKG˜Ô€mhN@~¹!•Â](uðÍZG»ÁÁxND„¥¶ò›õã„AÏöÄyRº¶òZÁÔ†žÑûÚšåVÛrlØ1TñßxžMFŸw^I\G“¸)2õº:¿šŒŒ¡ÆøˆA”ŒXÁ!ÇÛ‹YVó,lä9f] psø¢"ÎùÔ ûi‡OŒúE÷jR_3IY.b‹×Y\,b„÷¤ðÃ)ªR€³íi4UVh‘TVSõnñê¡(î³0?á#ælæ+UÙV&×~ާU$E«í\Eð‘û-ÂÿáÑîê'ÉÃ,ËAñþymüËB €P|ÍÌúÓXë¾ãeÝyy2}§ CwéY¼å°5E¢¾—;~&2g­Ütˆo&¾k?°<¬G‰0j‡I™®½a’/\Ã&7^FЭN¾q˜Dfqwü„½hþçËôƒrÐ*ü'Vç_RÖŽ¼ý¿¬õ‰¹<øÿT””Ý£ÿûÔKÓßÊíÓ0Ï‹ËËÓ?3l¶×‘Oì!ÈÀ›¯<5èJ€EÔ“µ÷ËŽ®¯ðˆlàªD åþ,ˆêòJ§çÆ7È3I~.IGŒü_¢“<¥ú.Àükí8@WãçÓY“ýäyAÚÓ !‡åa·zç‚O[˜f!ëA?vYDcóÅ`­‹"4º¤ÇcQȳ3¾œ¾_ß½øÆÜ•| endstream endobj 583 0 obj << /Length 2535 /Filter /FlateDecode >> stream xÚ­Xm7þ¾¿Â¸/±2z›—ÅÁg$nÓ·\ë=$ªµe{.c;#'Ù¤¨™µ½³Þó® $âPҤHjãÁj¦7ñÉø÷ ‡1ðË25H¹`y,óÍ͇?ãÁ&ß b&ólðÅ/Ý ¸LXžç@—ƒßnþ}ó¯ÙÍë· ‰agγå@(ÍÎAg ¤ÍƒÑûïþóã÷ï‡#-tTl­Kk>ÛÅðÏÙ»›7³]¤VL‰ì9º’,Îä s–r}NH<€s²ü•s&P狸׿?/"aiªÏhñl­I®˜P⼈Œ%yþ¸kyœ0‘r…£"×jòj?tf«þÅg÷¨ŸiÆõÈ*ú´úYÊ4˜Ê«ßØ¿ùpÄcG“Éx6™MÆ“ét†ÿ€ÃãÉä‡éd¿ét2žNÇãñ WÀ0žá<ðfgÀ_ªyø4aqrìiÆT¦:ì¢ûx:bŸbŸ vøÁ²3Ø/T¼z—<ɯƒ=Éa£ì°Ë€ýWÂ>™L'‡Ø'„} Øÿyòk±Ÿõû¥š÷€×)ËÒìJàac,:ðê|ëÖ<˜cÖïxXý€¿Tóð*ci–^¼µ &µàõ øîÆÛ¨ |gÁ_ªyxÁb._R3^ ¢ÓBJ&¹ºNÍšI• ÀêRê{^ªF¡ )Ñ×A"–¨´ÉôI$—ªÑƒ„k–óä:Hx mEL¦»3H.U£IœÂ¥¼hÓ„Ê;ŸÌ.ðÉ¥j»G} *uÎZëÚ=ùè‹êçð{äEuç¥Jöà„ –ú:M´VÜ2ñèë©Å‰¹ºçõtç¥JöጙH®Ó/k) vøS/¥Ùt|úRúçp^¨dNÁO¯óÖB²ä©'Ñl:Ÿ<‰žBy©Š=(9tJ®˜Žóg¼~¾âï ÎK•ìÁóàE{¾„{“B¼¨¨=_D×*ÀÈÏ‹8í7Ú?åzß‹|À9˵Þ÷ ¶ =P‰†.&øþm±Ú×v8’"‰8C¿¾~ ¦;ØÞÉñq‹!Sü«íPòˆþr‹Ôç¡‘]ФÙ‚¿›Ï[VõƸƟ÷à¯Ð§zbäH*èVBü_3Š4úôi[,A}%ãè#°A’G·ÃLVô¿k\mv4Qí\Qmi}ÑÏ”µ5‹»ÀÜÎËýAàT±¥ñýGk<ïî§á0”gÏÖ$#nå€0‚Ë¥Úw-®Y §4R<Ú7v¹/‰‹à¸AáûÒ»Òge·–Ö7n¿€ó Û¼F®"ûWÛ°µXÒ²1WÎÛ±Ý:j̦¥à’G{uÛ¸ÂíhL»!»-lIaáPo`˜20Æ¢ëšÜobo+GùÁÒ’f_8s[Zïõ¼31lõ¾µ15æÆ›? ¶CÖ®&åæ¶iˆcÊbµÝ€1€ëÜ–F?¿ùã÷߈\ltàº4I£qéÖÕ~µ¦YT•õiåq«L’IU¦‚·â¢Jpöç‚¢¦o‡"CS í(D`Å— ¯ªi_A|ÊFèIÂy¨;@ñîWq}ï‚àp€°ž»œÓ4Å-¢‰ò×A$¯1ó}㪠Mšr‡&3øY·ã H¢ÚîJÈX¨å*ˆY‡í«˜zA_jß.E殈»Ï¦p¤ ì• \$ô‰Kb/±)¶ÕÈÌ‹EØaÒ†+È€åÝ0‘7[½ùj6¡ÂêjÄР×±5‘ô¦>Ð7°((E´*îS[p;Ž¡HQ±ÀY¯B¥üuz3øà׈£Zg2º1o¨P¬IR0.’”r› ÂÚ¶:Ì«º3Cå‹0]ի­t-ŠUáˆDË㸩jÈt£Ì— p¼_™cÆ ë–4zš°§S ¿ºä‰††²hNöÏ!Ùù¾u×>MoŠp¦E*ɲö^Éeƒ®‰Ì¢·èmÄ€ÓŃsŽÙ@ñ¶¤Ÿ´@ê#‡‹ï§yÄÃ2¾Õ?‚”†Ž ª CÃç¡ÖxÛ{¬O÷{W ´®DÒ§éNáÜ7ehJb’ÖHÝÛ¿:;ûvgjãs1~’Ždoí×°Ñ»Ÿ$PÂGÚ9;3·¬/¥|gÉ¢XOï.ò¾nM³47õ*”Ï-²?ÀekÚ€‘àëkˆ$äQ~>®ÀIdMS”¡F/,Öˆ­o×üºûò½o0@zàpÑü¯- PÎG½TyÈ3§ÊÁ6e  ą8ÆpíèÛ÷0òœø>‘!ÃÐ ÂzßÊ8ŸÑmXphÊУAÿýT5®·/Ût…×På LÜ Ûªl¾ýë/°8¼#þÍ7´í¸9Ï5SYÚîjÛk<‡jj²×ÖwX’KxÓdǨ°£lûjCsvÒ@{K†AÊ—©¨ŒYøn9à_~)°uCîý‡Ã&’¶‰ó~:èÔòïöŸZ׋¬-¢Ð‹MBøx¸0qß>{4<ú†¹®qôK)³z­j³!±è3ËV Lž}ìPJ}ZzCº™—Pú>[ØÚâa)V´ÿeµº#VcM=Ç,³¦oS®ª®ê]XuؾAeØ%]5šÚ{ÈþÐ{W>;§hOãÂñ¦÷*’rxDT­ÓñÆÒßðnÒ|-6Á žÑo˜ð&qm°„ÂîS§#f@aôE ßÛÁ(DX° ëE+¼¿hZNŒz ÀÑ¡€]4užÀógø®º¤ŠïºŒP$ÉÃÖS‡ÖSC%[)”¦ˆ‚̰®ÊíîJÐmDúWÁ]Èí÷­‡÷µâ¹_ë$„G‹ÞÌnþÃçýç endstream endobj 589 0 obj << /Length 1690 /Filter /FlateDecode >> stream xÚ­›ÛnI†ïó#ö.(ºª«ú „ÉiA‹ÙMf%â‘ÀF" … åñ·ÆãC6Ó;vy:±ÜÄqªÿÏÕî®ú»æSãšÓwgüûut 6èRâ&ê˜uüp}ðök.ô—/>§æŸÅS¯ôRðúïÏÍùÁÏÚƒG'Aƒ8È.cÓ~lˆpì¢!°Fk/š·÷ç—?|ðPHîùñáóå×›«‹ËïÞµ/ŽÛ[R¼ HØKÊm.ù&ä 1‡± ®éæÉƒœˆÒ”:އ£Œ¨Ø;ÄZEòÀèÇCd.ýfÑ ˆK€Yú̾í³ÚþuµÌïj|ß¾^__~¹éx7ÌøšÑ*°À"òxˆšÓ£¾žzÆ_æÇ¯ÿ<Ñn¸ =p(u´‡Žc¯ýÙñéóyÿêÍÚÙã «„…DðêPHÏ©§8zþòx~þüÕü¼G™·³×OÐ-8üuvö„Ü›UXM÷µ€±›ƒÀ¹g;yuörÖnRÔ¾ùýøÉÑ|4UV-Ý>3¦:8Œ—û¢œ=="Ý:oIº†Â\Gº÷@‚½ö›÷?ñÁC¢Ü:kOgmÛ¶íìTo‡§§cPFE("ªÃD ¢±VL´d:œZ˜Œ‚ Hè!m;¶veB$~Íä×y21Y œÖ‚rPx Å+¨Û_Û¡¬Š†P’0ÕY}’µþYCÉ^«Ï¬¨•"Dòu ’ÖÖPa?(«¢TÌZ r%('q 7ËÏeUT‚ÒçSâG"—´†J¥÷Ôòk ʨ¨Õ©…$xÐzh •oeªO•Þ¶gʪ¨%ÚìP"H„!oÞR]5çQÜÝL- Fj!³¤ó"T*ÖqIu{õÛù“{KbìêoŒÜ*»@. ‡Jäz Ä´›Sbž¸¤ÝrrµÎ˜‡N‰óä¼÷ˆÞ;ÒA ¹NµÆìÓÀ)ÑrÀÂdT`òZ1pK‹µŠ ‡V‰ ʪ¨E¬ýe& ’Æ’íLFA$í.ë¸?Œ|ò£Ä¸ø¬Š P*(Ô‚rúÄÄ£ÄeU4„ò9B®d¨úœµÈ•’Qb€2+*@¥ $¾”ÊJa¢QbVT‚r R§lò‰@R,%Ëõ§·í™²**@E„$u6?í6´9M[’ÕH1dÖTÀ PêC>ˆ¶°y«Ä£·sÚßï˜Q³Ê¨ƒ˜êÔy˜µ¡ÆíÂÜÝxפÇP: ¨‰t¬SÔaÒfã.–yÚ‚ò(ºÇOé¨÷°Ñ@à·]œ9n.L±òjº8~5å]Ãgõ1¡E6)7ÝE‹‹Š?êÎß}²G£{=VW¥\}úñíRW.…û]^èKwëϤ»Fš4hoò,šå‡^ßÑ¿~»~ó}ñGƒ)­Æ»"°»¾y¨U®|#âÿDÐeõ/h™u endstream endobj 595 0 obj << /Length 2415 /Filter /FlateDecode >> stream xÚÍY[“Û¶~ß_¡é‹©NÄA‚Ží8;ŽÇµ•6;3¡%®–ŠTx±½ÿ¾ßÁ)Q¦´Þ©:íË׃ƒïÜ>hƒÙfÌ®¯‚{¾^ |ƒ™˜ ¡üXèY,¤Ÿj¶Ú^½û-˜­1ùbø*1³Ovév¦¢È7F¢]ÌÞ^ýãêÉòêÛïe~¢µœ-oÐLü(‘³8¾Æw¹ž½óžÞ¦uºj³z¾"I¼WݪȪ6_góß–/®ž-Ô‘:ö…IfQb|©Í9u°<ôÃ0:­Œ”¯"}RcŒ>«MièäÁà¨x œÈÄ~Vç1z¬xl`‹²xÉ:+«&/ÏÁe”Šð¡põëáé÷ë|! ‰½§SŠ c|ˆtŠV5¯9ºvè«ýe–´d¶Paef §“ºž„"öM8ì¾îÒ{¡ˆ^d.EŒoà<çG@¡Œ’ÓŠ^ŠI°a–PÊ~÷Ó;øìy$tèkl¸ ÚøF;õž Éè„SDÂDü(¦U¾P—Bt9é\‘„bØ};—±w·½Ö0ðƒ8¾¬! >ÿ;BU'z:'ü¡ªyêç©"éGf@õçšñ\(øËû@›:Qk?÷…óû¡V@Œ8c aJ\È@2A:q×ý-_ÌBOÿë~ÿÓ|9¡q€L'ÖøîØ$Œ¾îBûZ$|è? ÷8>/¿vs?ìúÁñE°Ãß5Æý p—"¸î×§q×IäÇ*y(îa0‰{'ŽUgAp*ˆ‡¨ÿjR Õ§!þË)1úÐþ6Õü}¾ˆ@7½®ü£¬(±*§äƒ’b{<6Þ¿(huÊxj?<>OÏH_&ê?#ºD>­ ,ò#„BŸ$§s-¬íñš¾#Rxü¿Èd—,YS%$>.!_øƒÒ@?Öc‡x ‡P"†# L¼ç¸Ÿ«c\Fk\¦s]{G|Ý|Dó¡—ֹ͂y#ïF¥Ìgr ŒÂc84¡ŸÄg ,B;c£ŽO“aΛXYqÜ“„Ç¿LœŠ‡” ÕeNÑVáøÔÇ/_ÿðøÉ³ÉXÅÓ%ЇÒ`áÓ÷ øïS ‚DÁ°¿kó"osXøv’°"Z⡜=òç ƒ²¼Í\}×ÒPîFÞ´««Mn¹Ö|Ê‹‚Z¬¡€_ÙÎmJuçã\/sÓoø0_ çᵫj‹m»¼ÈÖ“E¾r;ßC¦ðq"©½ët×°7Û°-ùõ‡|ÓU›CˆÉƒ›GHé‹ÈŹ)Ž+ ¨ZÙ#0h/BßÛŒ“V Ïbo†Å$ø¾Ðãö kî¶„£T0ˆ5äŽçÓ:ë6m¶MÛ|•…›lë,m3§gê.Ñ•.3P´É¡Þ;<÷ a!µXÖxC>¢±÷B…•›·—–:ñ6uÕ•ë¦M[n}š³qiɺ"xÔr¯?È­墨bÍÝÁ=hN«3Ïoì%‚£ÄVm³ö–“Z(Ýé!ôZOþÂ]"/|n?7ÂËŠ&+b^~C£Ú{ýýäã½|þšúÂÛ¦}´WYÀ•WDn³’Ži}UR-…Ì•¡š#‹ü«U‘ßVlTû—®+Ï¢€/nÚdÜlò–2=5sû^Óm·™ÛQQL}ä‹:N7vVÛªir[­¬TèÛ‹%$r?óqmRÈBؾL]‚˜¥Œ‘Ë·yY¹æ*_7–JØ®sŠ7gL»¦íØ;©·7-:Õ‡&«ùýâ¶—ÄP ¹KkøwW¤îøþ^9AÏ5ëXÓWUKæ‡yo¿Ñ^4Áª*Cu³è¶%lÚpŸ ¯Èx…zSöïÞ:ov…Íswn{iSN!4æí£ðHÝÃðKÂ/Ã/ 9âe¢áÛŃ8{•Ök‹¦´«´³Ð%Å;ž³¾‹‘²jÝ!i]»¹´têÓøŽ*ª±¦.Ql²2ƒ1p› AUº¡à®·6xŒ¼ŠO¥ç)¼¾Á]\‚Â([ÃV šú üòÒ&,L~è¡ÄÔ Ml]ÈdEn2ñ^³¶?½œ‚5-šŠÝ¢4äøV*çVT(Ï"ø2çÑXÓñ¨Û×LñZ<±À‰†—õ›S¯‰d¨¯7'2ŠpÞ÷* õý¯’À˜óÏ é'B<‚]WÃ.ùõ”ð Dªßù뉷J°'.'ŒGg$¾âG_( úwÏéÇÿó?Ÿ¡&ftgë9uÎ?w6½S‰`OñLJ‰ ÖG ß\_ÍÞ¡IOŽè²tÈÞ¥¦vmòž%QÏÕW‰²Ñ´Ü¢¤D_G¶ó5wÇ^û­å \>‘!‹Æñ7Ð¥ãÇs%01ÎrrDs¸œbÁqa°ƒý ®Ð~[ ¾–¼IGÞÞò›$[å7wë¤êZ";îíß=÷“¶}:ÀV “RVŠ‘¢²¶«K¬]fŠ„ð%{-4Aj-cÍ×ý$tA–ÔÁêôsÊ-Nnh`5׆œh9ïÞM N;‘Bp ã3zòÀH{ÏIW̨0¶d)Gž±tí¾ME”E%G’Êtk¾Laï:ç’ƾ`a*嵿ÿõ7zŸš,Uî?‡cÒÀæá][2R ­P§R9Ÿ³¤t¿¯¨ÊÍànmµH°«9oàB,©}yÙ3ž¶rî[T›;G”nY‘HØüÆ™ŸÈü‡D+@EÂ-‹»#:ÕVGµš~ Pº±®ù 9ºÑPmdê=¡;ǵêC^õÇhËã3—‘ž—> stream xÚ­X[“ÛD~Ÿ_¡Ú䪸Q_Õ‚‡­À’6Ù dŠ]–Pµ[ckcIF—„ù÷|§»%i Å<̨¯§¿sûú´“h%Ñó«ä¾¿^q|“ˆGœ[&e”rÁ²DF›êêç_’h‹¹ï¢„ÉÌFÜÊ*’:eFÓ¾Côæêû«¯®¯>&2H`™Ö"º¾¸PL&6JÁt†¡môsüõ>oóM_´«5·©ŸVe½âq³~º)·«_®¿»úæú a4S@d2Ë„¶!ÂrÅ”2Ë€DÊ™á‹xRnUü¸â ˆÊz S0AJtöÉF’霑ŒMYª¬õ”½DŸif’²ü’C^—uñ€Å¬dŠ«OµØ9º`±3p/çÀq1Áåˆîe1lºK‘k™¦¹ŽÖáp·á‡Y9 ¬'Û]ù*Ë2cGåTÂ/!Hþ9«2N•ÂL*ßu‹#Œ°çÿkV¦bZ¨QdÓΉã>`š¯æÄ¨ŒqvÞpÝ1¾{ØtšNc:m™ÕAÍWój&̪)Z^ý¾lê%ó kWó9¹Æ°L¤gz÷åfµ†›âüa~¢$MG…uÜcx6«¾0ÌdSä¼ÞõJ¤ñÝ!?%õÇV@@fÙD:°×lÚ$,³“ô¯ïº¾xØ÷Ì"ùãè.2¤`@÷z>m8³|Šñ×msXf Ä17çŽÿ~V¨d<•"o¦àøïœM”9®x~ú¼zØrØË­~Ëq ZÌüÙoæ-—BË)óßí2áàÌ ¾ùf6a@LöRã?•0:3,•Ù㨞€èá>âzž0 “frÞõ¾-à‹L2c²sõŸÏfй6Ïw›Ý­­`þ(:k W¹“ÿ=Ó)ËNWêõÊŠ¸½;öÍqŸ× D©q _å·s²mÆ8/ˆþ¶ìúrû°êˆ=«çjÕ©@Ö‚üi¾šPŒ'æ¤:±cÛ,_° •\pã‹YÅ5ƒ]GÁ/ºæpªT4'RHçfÔ¨Sóã|Ž£8’SFþHNÏ— ¼gñÌá/ŠÇÔØ™òlAi‰J Wø'*­’9¥•DÖøƒß&I²ÀßâSªžÿ,O:½'ÆÑØßQØk­ã¡~W7H擇#'ˆbÎl9_ø!Úì‰5O…ß‚-Qákþ×^.RA®U-PZ)5S'PSóf… !.¨“ƹ¯'ãkN”Ž]|ñMCX%çõᇖµ e(Š*›Ýã¯üæˆ"3±dÁ ü¬p5,¹÷Š/¸JâæÖ߯ŒË‡­ïnVRÄã®óceí¿Ç¶¡ºÇwºâס¨7EX“×A@¿/‚¤¦m‹5AŠÖÄY tG¬Ã3µMîÐLõdWj®ShzS_Ú$A¶*&’@Nî`‘‰øèüjëQû!R–¾Óš¶ñ‹zß­ÊÝžüº“ç©“W4sSî†f¢µ*~ävÃf%l¼½²r:ô õ3T¡.f^½ ‡·%¬EöHÎiµ'¥Ë­¯ZûòöÎxcÊ,®ç7 µÅ¡x¿ÒÊE¤{?¡3-tÆTaïëLã7´ýη7MÝáôÖ{k?ìQ³`ñÞw‹í®8C|ˆˆ Uï±·#á&X8MGlêv½˜‚GNÓ½£BRaÚf8úŽ +j4ÊÇý½™>ÿ-÷-JÚ’Œ¬n Ió¾£íí,ì¾½óš"ñ±£Êß9¾ç†éf¥Þ[.UÞ… b•ÇGïäCžE8£aÍè–®D–þxâ^Ž‚”¹ÉÆ„·qÊÄj͹ÐÈðLÁã…ωۦ­ò~Ž?!@ 0éøü9žâ±c4j´E¾õ­¦.B£õßAEvkóƒõjvP§¨½z4Ñ9[‰ø¶% T¾3RÖÇ¡÷Í· W‡‚r&1¨0Ë.œy\Ϧ]®bZˆ‹$~q¶óãý®ØíÇN¸ÁõE¡ƒŠòTÖ®`·v¥8ÖýsáüÆur7¾ÙS(ÌØ4%úžˆ³nü±Uáònð=w%0®ñ¿€I\<¹Þgëaþ‹Ûx:î3/-owC8°÷L H,¹(Äáø@ ä,ßÞ4UåYC‰‰š\¡Ñ—s‘Ûá½)éhÃÎÜ88Üùñ¡+‚úø–5x†…¦«ü·ÒQäPÍåÚ¡|çëPîÿ¸ÿ¨¤"~(ÓAIí’‘†'¦A˜— ð MäÛÿÓ(ã[?pîhá<â.œ "o=_»ìw"ë9л¦-û}sYŠ\÷NpvR1éÔ8¡¤ÐÂúÉ“ÚÓ:`hÂÄ@?̺Y;Ϊ̓M{3ÀÿC»qdŽ\à1ø¨ J8x¼%Äœ‡Ê€Ri×yå±ópB׃+••áM3´]á‘ûiÎbÜ…î¹Ì.oZ7s@‚óÛüòûù3ƒª)aY’ñ‘Ò8ÓBž*3úÃ)ü Ô@ò Z‚Zœh•êIX ÝðØSè Z­iX‡ÕbÜå¶9–L«ì£#ýi´’'ÑN, OBæ˜f Ìg(#(ÍPÉ.ÔkØäÄc¦&:dêÜ/(†³éåIlËqsìÃ)ÄÁ­»…¹à‡u‚w¯+]Ý€#g|Ïb—üŒÆ>KnÚ¼#„ú‡¢¦K¢ß{ÊðýG¨ëñJí ”ÛpÏúË®Vº G÷MåÑDîÒ¡>ƒæŠï:4¶>¥“¡[»}îÊ“ÕXÇ›3ìÔ'ì#ðb2âÖ2ÅA·V°T‡_ë…9[Œ¢ÿwû.A› endstream endobj 489 0 obj << /Type /ObjStm /N 100 /First 881 /Length 2321 /Filter /FlateDecode >> stream xÚÅZYoÉ~ç¯èÇÝ—ž®®®>aïJ6HÃv€$ =PÔX¦M‘Øù÷ùjHCŠâ1“ `yfš=Ýu×WÕ"gBô†8áÊÆ'Á5˜@Œ«Â5š˜‹ )˜ìÆLŽúH¦¦–lÈy„˜ Q³FØeÜC!G†"c­ä e¯#¸)»—d¼sØÊÜ䈑h¼§ˆüÄ% ÄaD’ÇHŒ”ŒÃ vlã³wñÆ)ÿØa-qz0@¸¡À¸ †}Ò1 JXB6`¥è/Ùpd¬ F91¶!œ£Þ@DÍÂ4R~lí!,Ï`ñ u!Ÿ± «|u™†y•(«È”_ÝŬ§o:X‚²î…Y_Àïo¿7øo Œy0¢Qðº.‘²Þ`âñ˜ŽN÷ ÐATxÃDÏzƒVz„q“t 2ºˆ@ Œ˜tU¨'&% œÆœôõb’ƒÈ6’(è˜ä³¾…Ÿ‚÷Æ/À”2˜OåAG¢n‰•R†ÐDç–æ'o²SΡ܈ó2ÃR1Y­[äE­v0ŒwÖ#Ù™œ dr0+ʹù‰L.*Dè¢8¨G ¯B*z,\H ÏÉï1R‚)ìÊ@ ,;¨ ‹7¥±;V’* ‹–$º!®EŒNͪ7®`s#/FØ*9‡E¥À q\\ ªÿ¹¯Mõf:-Õ‡Õõ²yþËxúuPý<›ßÔóß¼Ò]Uª~­~ÁœôjP½¯GKó9±0cŸ¢ÅŽDÙf0㋳9%Ìzc..LõÁTœ}œ™ê­ùa4^Övx3}—ø£ùé§þõ@HrV`l”ä`=|æ %7ã»»ñÈùþ(ñœmãýkJ¼x뉎•‰sýQ‚˜g#âņöÞ2BÍAJ¾ÎãÙÄ…)‘hSz” CY¯Rr·šLêyŸ2 B¶$~ IÅÆc( g%?'ã-ÖGμ7Õ?þù/õ(›áñðF[ަ ýjÿdßL$¶ Š´&_ΦˆˆKÄFHh^»ôš?hóÀJryx@à÷›Õ/áü‘M°^õn>}¨Á¸©Þ½½4ÕÇúûÒ\µeùnx[ª_°m=].š…Ub‹Ùj>ªMVl†þZߌ‡?Ͼ›FÆRÄBm.Þ»áKhöYOo´´Àæ•$ÍÅëëšxÙp¤‰X¯Wçj™š‡§hP,i!Âx"'ë‘t`‡ô¢š—ÃëIm©‹©µ‰@‚³ Pˆð! DùNDì3pzÚÕ t¡é#Z‡TŠ·ªèŠ-’6Œ4|To..šª7£åx6­>Tÿ«þýðy¹¼ÿCUÝ]×vöýöýc˜' ;›ßV£µµT”«X!·Á>íd8¿­í—ûÛϦ~íEY3¥Õ,çÆ,j, ÈâÿJý-k&'0!ŠÕ]ÌyåEý/V׋ºáÅ&¶ãMÉGÆ›§ÒŠ­x옺 q²(w Pú:0¤WÂaC RšÀ³·I¡òƒÀ-b<݆×ÃÑjaoëimW£‰Žìêkµ˜}Z~+Õýðnb?/ï&ÝM?Æ Y¡ˆúʧò{P Ó²§?{–™Îµ1¢]+§Ø˜Ð¶i‘Ö)Ùl¾à¬VŒÌÅ&Y!Y o„ùÀû!Åíj<½™Mo¹¹“GÊ­ÉkX!ÀœZa£¯xh+ï cœ«<ïv”G¹£òhm Z4÷¨D ð2M<žl€2 ±ºd­}±Û¿¢Åáb´ª'ûsÀ‰­o:l£¶@“ )YÔµ/'އ¬±cLåc*/aTDRTå]œ¿cÚÍ6ž»Ó&ÛPêÓ˜˜Œ)=&âSczJ>ûjÀéx1¾›ý{HÔciœ Ìç1¯(¤JšgóÊ!b\Ü6*N0ªöäµQE@£´¿ðÙ_ë´! ¢ìKUйÆiÇÂX:Z˜ß:ì6WÚ\CŸOÐðM@Ó4A¡k-õÅ9+Ì{¡æÚŒ–¬ï/„à–KÚcdÛô_ ª…aUIN¿OF‚ß­q·“`ÄdÅá1ÀøèDÞQAฃ²³ÚÇ ¡@T0ÁÆ|z- ½ÝSqÚ~Gjñç^ÕC•vwEpÌ}Æëà£ÕÞ¶ºM&í•#~ƒìA¼ÒºŸ-†7CGÛÊ § ¸ÖdíuäŒúWΨêö(¯— òŽ&Cì¨É°sAúÖ(£å 6†ÔhÔ9¯§**×ýc×óq=§;ŠÕÚµ¿õ°\®#=gB¤L+Ú©Bê³°'‹â!ë)OoE‘]'§!8Ygèg¢®õjËaz®¢ßa8ºs~æ0’;5FÐBÇ!fÍÈH@zZE¨ZYNn3|ûöÍ~Y Gi_m«—édÝìWÇ3­­ŽÝøcWulð]Üı(}â:_è´q (“õ¼˜ žc²äÊaÜ }ö³Ãºe@dpÌ©‡ñŒðæåõ²4÷H†MÉhP%€hœ|sždéIDv‘TL'$ëöäM…ì ¨°ŽšÌ˜\\êdÿÿÛóIqÇMRèè&›ó=b__ýæÊ½º‹+6ë÷!={ãÓ‘‰ß¼e¿Ô8éåPœaCúËé8£ì¯dû»áÍÍ‘´¤[IŒÚŸè‘Ö¶V¤×hi…«1Ö#˜ê#)JÉþ5R>oWóº]—ª_mìû8mOÞ4H’]ŽÇM.ÛR¸ã!m…Tæ¿ÌÔÑ/³ë7]!%ýò)[§©Â9˪srvOßkŸŽó gëíÉEíLK¨u[~Ú€Ã$Ëaµ=i÷lµ•]µ¥Ž¨7çS¤ól²OÞFý@FºKç\”Ý2 œV”¼mÇe“WŠïÕž5ôà Ÿ=B8xÖáP¢ÛÂå•6V½4ÝÜë·‡D¨ð0;uc9¥oÛš A°~³¨g[‰L~œxIÕwÔd/ Q§ÓϬžžÞ}7º.:wŽ©>q¯„öä ¡Ÿº`µ1ý8ù¿‰½Ž× endstream endobj 608 0 obj << /Length 2326 /Filter /FlateDecode >> stream xÚ­ËŽãFî>_ᣠL+ª§¤²@'›Ç,f€blÉÔ¶º­¬,w${'ý÷KY»«'éÅ\,ªÄ"Y|³\­VÕê‡7?¿Ù¼ùê{%VB—J[¹ÚܯD%˦ѫº¥ÐÍj³[ýRÔ¥Zß!Mñá<ž†Ç±_ߨÚÝ8/ýŽp†‰žÛ£ãp·°Ô†#¯N{¦KRø(/(HkKò¢ŒJË+qe˜Ï'ÝáËõndñó4D«{ÆœÖ Ý™e~EÏD÷ô¤"Dtäùyœ˜Ê¯•©HÁªN¬¤.…j@p'ðÄ8ͪ.[°+¢Ø²m8WY·Š°þ‘3€JÀJDûXWºÀ[hpT¾€–Ì¥¶àȳW°üäŸ<ä?yÍ §9‚^:žÐmYYõºãm²Ç«J)Õ³ã):Þ[Cã &mï…ô+ËpxôÇ"C¨[Òó9- kKYëK-Ý;§2 {ì×Þpµ?ÐMÝø´ èbF¶äbUIˆb öE<Ájy­*ˆ{áÚåжTJÿ_¦º2zUkRþÏŠ©À5¬ççLhmÑw[ ¸=‰ê Õvtf‘m]Ê+ßEÛjѲ=ZÎÛm¿,Ã1r{´7®:ë!ଇ€7½aPÇϲBãBæqöÅW—Fa3)Ð=Qk¡‹{úéÃû°{ºÈG†óÑùçÁ$Øhb!ÅŠKœÓÒûáaß/'Z‡ÿÐi†ýÑå"úÝaö’¢xwŸu,Õ–VüUÃê Ǻ2¬(«ŠKΰ[À>Þ°$ú N§D©Û?Mõ…lÙüЖ­´©h_£jçW²•^¡ºXºû‘ ˜æÊ|vÓ!qhN&$ ÍI@k_&tâFøFµÁ@UƒÄ²E›íéƒ/óƒ+:M±!¦;@_Nôâê^SÜ…¢‡‹Ã’SâUÕ{Uêxfáæ¯®”:±/ÆíKöU¥6æË$•˜¾R6̹Fï&’«‚í§³Óë[î€ö}–«¬K-BRr,UÙ¶¡ÂÝ`;Vä=ÀjÌÃùØÖ¯•ЮˆÀ*Y[¯ºl„º´.;¡„ÍG|Öìz=/¾pèi^{ È |Øc•)~ÄöîmžT‘öË1Ó\Ôû< úÓÚŠ/Óa˜Ê¦©mt Šàît-n7Ò:vM%³½èϱ¡Ùjl· ´Kß knпÒäÔŠ†éxÓmîÈçîÄû­ mt?~®Agç TbE±õ´muI¾¸jô#½»dÏå|çò„FÆÂ”º‰€x~ú& î¼V°©ê}Y¤¥.ד§Ü%îßw'‚06ñ9yaßÍ»›­Çß1ÖDÏPrKzßìýþkÑŒøŽá˜‡þfî©G˜—án$S^ ÍÅ]q·¦˜Ó<üA°Ó!wlYš–œáS&8"däŒ ËeB òq £Ö­³.ßB<Áý݆4ÉÌáùÀMog ŽGt€OCžaLöOˆE»2j‹a‚¤ C„nI,ˆvãÅ… Që°  F² @«S å1j0„aДZeÈAǤ²‰ ¬¬[+•£õb@›ìùANÔaŸ•QŠ*ËÚ4CG‘[Ã$l)ê°ZÉx:KMG~°€á5ÔDj*êP%篳'Už0$2ÝÚ@¸Môæõ­KÙ¦„„‘Иh…Ħ‘šˆçQˆ*žYä=DW‘GuE‚ØEÓ¨& ޏQ˜B)?ë6¦T&z$tdWÕ¡iƒ ¯QÑK›¨5AÚ¬ ²ÔdÕ•¢ÚèÜ&ÇCD!‚Z5rö`·µùX’" •KÌIè*‡›Ø«ŠNccT6:q”½Š‡·ËF•þU%a—xc鶘êì1Ò¶9 ‹œA;‚;‡”1Dý>] N$¢R¢”AýQ”Rç,®’d#B·1 L fEFà d™®Š„“„ßD¥4‰—Çm:9§}žãÄ…;˨ÖÈ­‰> ‘ŸK"*PØ«`%j‰Z)G±WºtÛd\MÂ&9'ê=È.Òªõ Á»e6èôó'8"ÈIeÐWÊN¢à2VUš$wÖU.Skj69MÕ1Sɘu›uªJ<¯C—i-úe•d¸¤\—!Úæå©£×‰è(I9•i1°&WoeÆ/2¹ æ‚a¹õÿ40¡ÇԱ̴¾r˜4„CúQÑ ̪ 6l[Ø&c†K2u»Í,bofŽÛBE²Œà@·i¶o­ÑÕ^,ŒM8¨Étl²à&×µÃ/½iù…¡ºeõÚ™èÍGd󉘼0×Zq³~r½ºëâû‰¾ÐXê.Ȇݒ¿¹”àÃö³ ®!ÜÃôÿÒ€í+T‰·‚‡2<ÖØÑð¨Šq˜xÆP¯Ÿø‡.n,xßÕÍ¢bÜ@Õú©©ñS`íõÖò¿t€™\GÀrÇáeé»ÙOvHÃÍþŽ (˜‘üÀØzÈÜPßñsxó@ù€§Æ›4˜Ú(Rðã¼ëçazÀ7Uùíê>ƒÿküŽãã¾ã¿ü`˜Dóx×4ÅPöª‹Û±ãµÛùámn¨¼]ÜÍ]czdèÛ§…¡Fúj:‹ðò„“'#ý8xôwcÏÐûþ̸ï±ý‰¡{÷q>2ôS?3´ÙÏYQ7ÈsvB‚n7îÖbö7w<ÿkÝ "Ê‹Yv%šº©vuS·Pþ9QËúé»Í›ÿ%pùU endstream endobj 616 0 obj << /Length 2514 /Filter /FlateDecode >> stream xÚ­Ùrã¸ñÝ_Á§„ª’¸ÀÜTÆ{3›dr¬Sû0»U¡EÊb EjyÄÖß§/P¢MoR;ó`h4¾ ½G/ô¾» å{}õÍQžŠ%Ú»ßy*Ôµ‘—†*P‘õî ñj£”ŽýûUùíqµ1Úoëö±Úæ+å×0OcÛ6ýÐåU³2ÊöS¨¢º\ý|ÿý7w:ó” ²8¦“Bo£u ’”Ïøû~¥Sÿô׿ íÔßæ ¬gÁ´ìvmwà¥#cÂéeSÕ–¡CW–¼£ì‡êUÛðÊØeÇK#0ÛÃUüݦGâ°a[!›e!”Z>³Ý ÛÈ'È'Šæ“/ 7ÖIrqcÜ׫M¤bÿCëmGãphù[Ð7õûvgX¿mJ^é÷íX<{{ˆìBtÚÆAb °F,m6¢_ÝÞ_ýr¥`9ô”%&PÚzI©‰¼íáêÓÏ¡WÀ"\.0™õžõà™ Ép[íýpõ¶ŽùÁQ’VeD+61¿«XÁÞÆÀQ€gsËs®€£@/‰Ã@[ûEL)c­ˆVh3>µÉ‹VÇZ•:ÉmÛÃ!oŠM]¡L F}ÃñÓ¾ì寢$ˆ³ØQY¾¡1:HÒì«\ј$0éo¹a]õCÏ×Acâ3ðÉ– 6Ä–§š¹_Øyb3ÿ‡q»÷Ù£Õ«—¾ÀÀHZz$ÏÀ•ŸpcÞ¼ˆÞߢD?lJ¡·² Ž×* ž7Ûü&2ÚyÆKïܵuÝâ!OUóˆîüÊG¿]R(P1 ÚTbÑOaâß»õ5|Ôúf³÷ëÛõÎñïo…4`& UMâPê.¹Ï1&•†ü9çÑû5¯ÝòL‘çw<àØW·tË‚" ¤Jôh´´­ó‚*ÿÝšW¯yIÈjÿFæuß. ovœŽ G­(âãÀÇሎã!‘Ÿ¡ ¤ü×^`÷<Þ— E:}Ëþ)ÂRÓ< mþgE9 ÎÁŒq‰@ÿâ¯mŠ?Q%NÔù§vŠŸ%ÛR‡¼…˜ÉJRÄ9¢°iùû8æ]Î&Il“)ï%.k%³ )Ÿ˜˜îX› y…ð–³v—,¯e·¡Bû£' …Ø ¥ò'^(åc­üÅÑ¡˜N%§€ <äî!Ù÷ÕC]¾˜ ¤¯0ÄøÞƒœ®a(ìRÇðŠËyÃa9…™4%1Æ>¿t~„p̤æ£P/ÌP.)‡Eý€“ʼ@ÿ‡ZL²dèJ€4[̈!y4ÍDõs ¦Gm@;÷<‡7Øú2¼-d}W.-% ¤ˆá 4R¡ç/y¨Ô†jjÕ”ò´z³é2QAiçš®q©T tÍÚá`ŰD š§XŸ»·ª9ޱ²@1I¡‹PsÉ æ*cüwµ£M Óè¥é=–è³¥³TìÔýð„[ *ÕE®eÏj?;¤ÏbXT¶;B³ª{±À6ÊÑÿ’v‘Ãùã™,PgŒå¶Ëµ»Û.è0¿F»‹´BÍû®7ÚÝ_oÆUšª1qB»ñE}¯U‚®iÅ© åUWIh¿T¸: ï×`ŠûÀÚdÎþ›MíŒ}°ú¢×‡ š#rd¤úF€ Æ+EæjRî2Mʯ+ˆ–Ë>ò?IÕ`\á»QI$j®â:凪ɻçã¥t–M‰8ׯX”BìÙ t‡ýΘSaQPà½Ñì?Œ‹©FªçL^ß0—A¦Ç„nÏ =å„n2ì;]¡ {¦›aŸ(aN…ÿPË\U*™Á¼ ٠㌃‹pÆÛ-§<ÔI´N$Z'N3ò¾‡ª Ø:æ–Ø¾ƒ€žä¹2‘çÊ¿˜^"ûÿã)ò Í\òø[~÷(.ðÏ﮼OP’D~$Ëü–J@ „*öÜdYãª㺠Q±K„˜L¹Õ7Î:,ö×î›×§¾¢×—ª†¼Çt‰e1Õð&AæRÒ.ˆºYDaè^eaOÆ.GP~sФ„•X#N¤ðhy6ìÙ]`xÌ;PÏ@«È`ù÷ûò|Z×âÀ§Û†R à /_\åÅ`2h#ã³ê`} VXð˜Oâb¢éJ=Õ½T'­+F8Fà¸|ʦ§@Dù÷B~ÑiBœÓa¤úËÒ‹ ƒÔfD !xÙãþt¨—²š´MÛ©sc ¢e©ú{¾.Sf ³héBQŸŽ/wÓ6H1NQ»%|!˜-§­“á4EÆ$îB¥ VÜeøu>6lÎŽœK‚Ò5-Õ‡\!a¥jÖb·:§†'øCB\÷<=!@üô[°ky”g<¶þè|-sEå^ppà"ª(kžóE;ïÀžú¥ÂØsäŽRÍž„P×!<=äÏWáP}†OxÕ^ 7>W§hx¤,€Pr9>nô‹³åSE‚ÿ¼üÄŠÏ8Øõ„TàöD4Vþ]õ8v¿3Ǽˆ™Š*ZLP¡•kÖ¥Àð°2–MÏë,œ5÷cÔàÆTÙ˜_·½ãmBJ/Ÿƒú7ßà4Y©%‘jŠÚo‰WBzžb`×ó]H1~?>Ò0òï tÆÅõp~¾=¶LÈYNÊÚ ‚BÂd`)Dµ!A¼ø/$#á endstream endobj 622 0 obj << /Length 2416 /Filter /FlateDecode >> stream xÚµZÝoÛÈ÷_¡·Ò@´á~rÙ·¶ðpèµicàrn-­-6©Tl£ÿ|gv–iÓ‚‚°/áìçÌÎço䤫‡Uºúù*}ñýëíÕûŸD¾âœåZ‹ÕíýЧ‚Y«VYª˜Mùêv»ú”|ô_¾Úøëµ&ù=åª t–Tîš'û8øóõZIüqýùö—÷?Á}ã{¹`Ü `nliÏ”·a\;ü×?ážW2ßÜ^}½â@¦+>HkŒb™æ«ÍþêÓçtµ…Å_V)“¹]=†­û•2š‰T]®>^ýkþí–Y#VF+¦dNrüóØŽÝ™—gFÊäouu “‡Mº ù¼¤*gyj¾[ÒÚì%•9Ó¹Ž:õ_gø ËRmÂÎ,WçøJfr~–«ä,SÙ”ëa÷¼/gøÉ„ÒËð5†åÒLùv÷¬{êæ‰‹”å&ë]é׿“ùðÈœo®y–³Tq ÀðÊ\¢N¡™Tù2ê„»¸Ê/Sç|{uŽù¶ëÚïÔç¾¾^ƒ·o}IãƒkÜÞw¾i/ÐòENË/DÂ"Z†» ©]¦å%øöZó½«ë¹Ü & 7.Â6×,Ïä”-:þ›ÆÍ”s¡ÒR¢û/ÍÜ­³¤¦»¶kÜÖ(‹ë|»PléÜ0¥³E¬Žw m/²ú"|£Õ'|Ï[}¶Ñê¶gCzÖêg:ŒG®`_»‚ù?¸‚,å|W°œY..s…%øö®0æÛ¸j{Æ–`ۻ˜í `çXvÅ¡Œ@Sï‰gkºÅÌn2¦^Æìp—4æ2³/Á·7û˜¯ðŒq2Ã[ Ú‹ð°LÊ)oÐô[–7œñ¡ªŸd$ƒFÌ¿˜MµdàŽ‹˜T –_È pí :âz‰=œó`Îçs°wbÎ è qüXt;š«(woãB‰­ %u_ÆTïâ·¨hÏÞ1é‹Þlz´²LÚì{šž3-ªZi¸•[@¥âÜ^[‘¸»¾;SŒ$ùø¤‚J <£†>v¿\³…™Nê¾ÏšÞÓÎöŸ/¥Ys­Yjìj-¼ ÂÚ²ø‚éÒ—Å®'ä%ERßÓ·Ûy"öî© üŠéTòùó–Îspz\|.ë_ù®ØÄKz«–ïpB&Xkˆ0jˆ,öº¯YãóàI“•„>õ‚ñïëfﺢ®hbSƒÍ›ª¨hL¢õ]³-ÂûÆË®rås[ÄåßSzöÀPLË>†ÄòÓ ¶®sï&rFýV[o%mØŠßÀ ‰öx×vEw$©qf¢eb± '!B‚N|·a gÐÖûÛÇkR=nsÛmwbÆÇnV…Á‹Dn/ ×x"6€´¥AqOß»‘D… íñÐÛ«‹7™|ÿv­uâÊ#^ b+¡“ÛoýŒ -¿|ž“y¾pîBEm"1ñLœžiç<3œ#Ø€dð¾É]SË„ÛËÐxÚA¾”P±'åÉ\&÷M¹H¼Û ˆ;šŸïT`a€§ '#Uòñ8>6uv¸uãªñ…žǶçßÕç„„=J$­•S¸( VkêrmKC×ÔÇ¢jò z !TŸ/pýuPãÀæ$ûmç1 R|Bx¢{§RkÎÖ‡>0‹aN› ßÖá‚ ƒFD©p2úŠ ¾‚£,ûëQÛ°=1lçâ{lj®{S5ÒŒ 4H‰¹„'}lK~‚±°"‰CSÄëâí¡Æá:ÓzTwÇúÉõ¨Ê½Ô,&´ÖÇbXº¶‹qÊx¤A°!,C¡ï@ÎX1©T6±fþûç«Õ'ªa“úCl8Y–VÔùTˆäX÷Užli8ªß*çT¿Ñ†Ú€õOÓæ+7ÇÒÅ™S"'8©}2Õ,ãº/¨{×\ë4y(*F/K¥N“™~7*Í‘ñ!×K{&ï©ûÌN«¾ö-ilƲthdþSÕ,J|f8IÁéöCSß¹»¢­]TΣáð‹êœ'ˆWÙ„@Eɰåö´ê:šò“3ý>ìcõ]sLr5}y(1Fæcœ†C”ĨXVqÓ€i€$ÉËLõU ì‹Oƒú…æÆ© H<ßBŒV4,âwàqòú—ð4½ýCG›Ù•È3˜üÇ€¸o39Ü€î:‹ÿuƄɖákR í”ï¹¢3\ºo!R–i=å}¦£S2°ŽÎ ® ³€NA!;–_ˆ"€…•€@™<ýmè~ÎÅMWù¸ ÈÉàØ›•$õ4‹cÌ0 ÀV›ºi|cºÚ"J(†1«Ž>mñƒ ‰À ¡˜¨›â¡À”…Ñ®,ª}ÿš ˜£¿X€e,â -¼fÈQ±)dôx¸¦FeȦI_Oš Î ‘‹&ȳhXØ h Jp¶EX]÷UKƒ`‹Qîâò`›áÚï™­G§xy ±Þ+ú„„v £ILœ’’£ä0ArˆËã­Ø:¶¾¡}ñ¡à“ý«[Ø<ø@@¬i´§é‰0Àá3 r\q«+Ûš(jõñâ'ˆf"ɳ8Ù•e€@Ü&¿~¸¹yGäã®è݇-6–XVyž¦ŒÛ‹ê¤qâCè-ZP{Ñï¹yŠ]Цë¹Ü dÄv„sp¢¢GïAÞ5ÄÝ`1d¯LÄf0ŒŠâf&Š\÷œ‹{âO4p´Ø‚YÊ84|Ü”¾îŠ­ïöEU¯Ý¦ØÒrxqs€nSS6ˆúXêƒ9ׯ÷±ë×*OÄ›\ß GºØÛ¶ñè}¤¤ lpì¹Vw’0Ú¦)‚9*Zøfè€Ïø,‘ü%8ûü62û x+tŽÈ‚2,~0ëuTÏ4‡e¥xÎÛû<âbø™C¾Ä ¶1ñ÷ñØÈ 4Uôµiêƒ}¯ò0å﹑—Ê&7+#T‚«˜¨qš\ Ëu0uà Ñþ -Gˆ2ž¸Ú.ì †Î çT8¾gñThãéäŒ9ÿáIÊ/kêãÞO~zýŸ$³éP.gŒšY Ǥe`Á«æøìL†»R}þ/¾"〜ø2|3ÈILùžA0R¦Ì»o)Uð¬ ïs¿bªœ nNfgë\0•A§ 32â!‘O6ÁSþ79ŒL endstream endobj 629 0 obj << /Length 2541 /Filter /FlateDecode >> stream xÚ­ËŽãÆñ>_!äDKN?ɦ½8ÈÚlĉðaãG¢$&©ÔÎŽ¿>õè¦H ­c÷"vW?ªºÞU«ýJ¬¾»þûíÃÝý-WÒ$Ú¤jõ°[I¡çÌ*2‘Æ­¶«Q–dëXJe£‡un¢®,†cÙ¬µŒ†uœJµ;üš¨"à§uª£¢«ŠÇºäõ¾Êž·ƒo:­c¸¢­Ûýs¸Æ¯ñ~¢€×™Ä˜tþ:ØêÂG—‡ñp(ypê–n¨Ú†(ü‚`åÓÚš‹îEÀŽÅçêXõ傺ú/ñ!^$´:´Œ~‘8m€P+Ú‘Cò¹Lä“å ¨™à b8hAþÝ’$•IR‘…­p«LÖqf]ôp(‰N­AéïÓšI@䌸çɆäƒG¢¯ôÐv-£¦¯¶eWz’‹p m€Í¶Ú U³§ÇRè$—Ùüá}Õlà6môT”4…§Š¶%JÇE% ("ÜEüEÀ â* ¯H³¡.§£ïK ánÌ¢ ®Šf?“ejñ-±²^ª8xˆUÙl+°¬çmÕñTWenDýÁ‘çC†|Àùȼ²è<â‘Ð M^ƒ’%û©ÅƒZØh×vG0ÛçµS>Z À0°Úèlª6¹¯•µ©—4+KLXß–M;x,0í8NY+øsy&R!ò¨JÊÄ4ž/?3wËÍ€† ââùˆ¿^» _*Q@ïìÝdÁœåù±ªá<ê´Ná4oSìà±ÉQ,°CZð›à½ý{OKü€¡ÈF–LŒÅó„ð¾ð4ÚŽt¢Ê¸%EÍRýºv2\w(x#!X 6–iž¥®üÌÑ.q°îi~׫”\äÍFÌ| 0!S_"Ä"¯T’¦ö&«lâ²tê“–î1 æhä i7è$³°Këœ÷ˆEÿ—d¹]Å“mOð\‹x5øÖì‹CŒ73¼E ¢‚¾Vp\Ü]œ8™™.“7áà02Jà"'ŠMZDŸBø"‹Ñ<²¶×cÚUbä(1TI°Ô_¥•EÏñ-ÖÖ‡P#Çê÷E.K`sžÝV)@OÆw<ž}­Ë‚}+Æ„¥»­Jl®n:/Òe|nFZnQ=Œ¤dÇ…dÇE[v°—ˆïÙ¨´ƒøªæ¡b×Rj1ô7¸qÌ)5„xC\6Âk†Læ{>Æ&Ñ_‹z">×ŰøÊ4,›¸›zjÐqN¶½_”—NÜä…aÛü¶¸¡'–½ìHà²TÊ78+^w$væHb 5¥{8 U¹å*SÀ‘e_‰V˜g:…Ä`ºÒµçý¡E=Fâ8ÒåœnÅ>å:Q¹››%ØP¥&¸'·Îë’Ç«uéCEÇH¡ž€8ñ¸>û)8˜%—(%_³ÒËNeQH…{¾ßãUc.|ö‚S±ÆD?.ç#Ò\zEÈLPT&"½ÒË:* ¤™ kÌ_ˆAUï]$&â*Šrx¶Ý†7l½(Œ_–Ÿ¨m"¥û3qçèaõ,ö¼G»‘Ý‚p¯$ _“Á›H4I¦ÕŒÄ[i€þâhœ&ižÍð±€tçÔU>;§)›'ÎIcÂE*ލH] ff˜×dgò· /Õöš3¢jú¡,<Å˶jÁTÓÛ);±jV ²¢+pîÙÜLŠ}ÏŒ®Üq!¡0à÷ç#™¶ åË„e.ôpø„8$³þ@ËÛ©Òwø“³JP¹i“‚ºÖ^eùDzèÏ\ƒZÉÎBFé°NGñL¡z V|©{Bo%Ôœõ3£ qP½² pSZ} ¯*eþ2´—‰ å¼X·eþúB pˆj >±X}òø,ðqÆO>5Û´Åù¥¡“ªáï¸;4u`ÈÍA¦4шüYÌ¥è[ÁK4e¸8+ûS5”Wׂ"-•´”§!—öƒ…> Ø„uöM ·cùÆä­qèVÔõ0öúYéØ:þÓê›A4"QÀ¨Y ö+F~¦ØõãŽI<´‘ã =Õù<©ìÛ3y,›EeEM‹x?0Ñië"f eîJ Œ¯*~hüRè’ËÎ_ž L¼ íª}xëŠÐSë ´£–Ä¡”™/Î/í Å­ÅVd<îËóØì%}C •Œ²_/“à‘Ìk3V¹?—Èr2‹| z¢”&=AXÁŸm¹+ÎõÀkcfÂSØr¨ÊUv“0š‘îË"²ÊÓЗ¨é_ÈÿB„ÅÄ\5ÐQ ¯?uhй[o:~ðAƒ´Vywnè=LZ†ÿç ïîù*(£c µ–0Jø¢lÊ\k9 “áãEÃÐŒäàÛG×ÚÜ ‰)”yÿhðç ìÞïËÞ÷]6éãô”Ý;lH‘c¥íß‚q1ôûâw “οÓùèóPÄÂ%•¿ƒ<;5õpÆou³®à­F·NsxöÐîKÿ`œsÞŸ_¸c|ɱà„7™y>ãL‰±xúMQ3i0Ù›¡ (NØÊÜ.õL© áÅñÁlXò±QˆcŠ+¡ ÈBòðgŒn7Ç•ÕS{‹ãMÛ€«&òîowÿ»ÃŠ,yeÀï»\¯Tf(EÜï>þ&V[X„ç$j±'Úz7”æx¬^ýr÷Oþ¯gŽØhHV¡»Lžâéÿ°1ï®ó©3ØéSQèÒØ4ÑÂ͹Zì9!ÕiH½tÔ`}[Ÿ½¦jÔT0»öòg€à=ó%µ3Æñ«{æ 8ÆÕ5ÏŽmïQ„¤€“Ö…wKŠé›ºÊA¢"µ ½¨Ì‹²ÕC§>ŒUp±‘Bĸ]”B—iÜÇoDªÐ“.¬¥ïèÔÀ€눚@³Ž|šOBl}^jl¢¯ߨÖÒ9I3þ%ÖðB…ÿ¢„=~3ªüšþ $0û/ä2eôs ©œßµ+Ëš¯Ü±:àÞ–!=ÿUsÏgò3玡wÖ/ ®+÷E·ecÏeP­œþg¼ùÈ“Gjùï ÈÿGC‡K@<:û“!@#L0ÒtûUþë»»—ö éû¥|†Ó7÷÷û®=Ÿúdß¶ûºô…LØ9{ͦ=òæûÓáùXÇè`<5ÓâüE® ¸”c¹t©æ-fiøß6Ñ¥¯øÅl¸šÿ„j endstream endobj 638 0 obj << /Length 2798 /Filter /FlateDecode >> stream xÚÍZ[Ûº~ß_aô¡˜/©ç¡MOÒS4h›.Ð$yÐÚ\[.{$9{ößw†CÉ’BgoY´/9ñòÍpnr¼Ú¯âÕÛ‹Ø?ÿtyñ»7’¯¸f‚'juy½â±`ƨ•Ž9ãʬ.w«‘Yo8IôS}sì»õFê$ú-=šc¢]7-5úƒ¥ÆÏïþF¢^Kõ¶½Î·výéò¯´°bR¥ŽW‘1­…_’q¿è»â×þØúùªž<ÚÙ²çuÏpþ;XÎÍ-²ç,K’qnÁxªinàÚñndST7¥­l½&r'ÉÒ(§¡Ûbg©ÕæõÞ7›kzVãÆ2ÚLŠcëMªxtyðC»¢Û¶¶÷½}^U9nwçW*¥]fXo—ÑdQq`lQ^ØxÿöX¥ðc$F |ÂwDTtônÞîùUyG=' ®š®'Ò[«¹9–yK<òsg‰49lä¹!ËfokÛ[8rà@iëì×¶¯ÃIhi†k5íÝ(n ž@ªãùòHÈݼW7=QZÛõm±ííŽú}3NL„ì‹›¾hü’pÌéVڪ㩎¾¬ë9½$ŸÝñªë‹þxióÞvØ4Q¾m›®óŒ"•Doðpx+p ¨»>¯·öž+‹ ?1,Þúåsj˜hOg÷„ÐmmÞ55"˸ss]9~[84üè!ï}kÍ£ƒ§¶¶„SNùZ¥#aÏ©9<ççViö(S¯­‰×ݡ㶴M7§ íÛ# ª)2À­lê=6½ÌÖÙ_Ž`"r^ûÚÝN@ªC=‰UTôÄZåŸÝúñv¶îükˆrBN Î8(ötáùöòý·/¥“hG¯˜¡îàx(Uû}ó,ÚæoÝz‰BsŠ^G$/¤þt;àtdõÔj m˜â¶ä¶òÇeƒ&˜«%¯wÁ‰8S:˜^Ÿ™Ç€ð,tèíöØÒŽQ}ðy(ö‡ÒF îA/T2G#'Læ.¸0 ʦò”Öî=ƃn‘32áYÜXéÍM3.±g¼Md±‘ì,H¨õl·E ö„¾3q´-ó®³NÁÀLØ|‹cìq£æ!GÿR Öb¿èý@ãnCMÔ&× ýâüU–êW?=-|,wÄå5‚:ݱèó+8BiYÈV] •ÅggUËâp²&r°i’Bë@½#"š&"“Ì ýµŒó&8<^žÍUŸµõK\3Ã2ØöV>ß;x†éè»­ëÅÖáš!–jX pvX@ÃÉÅ8¹@`Vz€Y™ ̉$á;r0Þå•%]=Ôh:1ÒöÞÖA•AMéT7 ç̤ЃßD’ÛÃÖz¯ÁU’dó©¦O}‚çõfŽÈ9=ÐÉÂ|Ô¹ná·ˆAÓ~&Ò`Þá…Ò_oÂÁøµ~.ò)X²1Wµ¥Ü– ]èÐ.ÑJvdpé‡çÂepÎ2°'é:#Ùpt~ö–žyUÔÍ&ß;z A± ëÏU[+¯-: ´ÊÛÂ9ÞÌô3E.°"Åǧ×=‰9P}&Aö ÿÞÇcQöCÛh5*\êªD­\Øœ‚žtF8¬^QTèy —Ö>c"«Í„ŸÄëæ´5ºÉÛÞIú5F‰œÀï‘'M2‚erá $f•ŽqКâ¾$SדWRñtŸF3•ÈÁ+]‡|[(èã½ç˜‚cXÆa/LgrÍrÅ´”« × û€€,4#œ “¥éœâÜœâ1s&³9e‘¯æÜ½yÌxœ ¨œ¼‹"Et¶§>]‡¯¢<•Ptû*´ Ø)lÀÜ+—‘ã]èĹˆäa’ ¡œ3eIš…$ó|si*D@)ˆla0É©Š1J#ˆ½1>[à+– þp<ßÎöž ghJ.˜â{Á™AªŸMÐD@œ o_ÙMv§›, Ì ÏFA þ÷Úz ”€ä¸˜ËfKá–0éÏL½¡§S‰m×SÇû xh3ÆÑw¸ÎÄw`?ïB` £Xš%‹h|†{ æY…D9Ô°8™Ù¬‚Ê%˜éÃuëy6ô7õ%Ô•ŸSWy¯ºÎ‹Ë1 >ñW_'î¾Îô«³ÛÆ9Q!ÆpCð3J 3¦$¿O’ÐÕ{Axœñ£guÀ<Ý7?WătÀLt²^) Š”ÖËŠÖSF±‹3bçàR”“»ü?“»ü.rÏž?½¼«šÉ½‹TÑOAøÀ&c3·±¡ó•¿ÂñUhÕ”eJ=å².•HêÙbçêG‚%1Š’Ü³Þ¶i!ÃôµhJ}-SMŸËúIJ²;J:0Ox¯1ùDG@n:ILÓwæ[k–ºø}Vv™^6M±3M3ílC v6” qM»È¨Ô §)}‰(K‡2±ãoèyÊ%—g.¤(Z¤c×Ô9D¡<ØEïZE˜JÍ23 M$$ –K«!ËÒ©ZbÜwо¨·ýðzS“¯/ ­9Ò2Hg <ƒ´TLi>;õæ8¹q_7OSÿñ‰ç*E4Š»pϡȅWÄ1XK§ iµ”™‹½ZÿÙó˜‰ZgLÏmJl7SµvŸRb1b).Úë9B‹zÖœ ŠOïÞ„XQ¥ “ æsµ£öcœÄ¡qÍâ4{þ`Q®¦‚9Ân73»ü"e†'˜Â¢Ušå®rf+á\ÃaXb<?öˆíÕF$| ¡{`QÉÒt4Ñ?m)lHİÉôð!ó%°[:˜vÿyœ+åÉý‚Ðà ’€—_l}æå·a‡Ë-’&zÒ)‹,ðåj¨˜o*g ^æÁñ.¦Ì,fY,Ü2©¿Sþƒ ÖqÏcY¥É¾$J<)+U<Á`FNÅz¤Ž5K,P»lÙ7å¹)1ø2½i›«ü œI?¾¢qúxgë®p_ýîN«Mêßdì D™^º×Ö¢AOðùÕàðOÕnÀ fx#eÌPUv^ ;·†›ß©¾¨’túß8/Q™È'3rO.®¾·A`Ÿêt5a äà21ó[„‹ÏMÊÕƒhõ¨Àü)sÞ˜«%åê¡I¹×ÁXÖîqÞºKð¿ú)`ž‹ÎÕÒ-òûi­ëcÃo€&>}»}¨kº¯–zßþÅÿxÿ÷Ô.½}F—üßh\[Ñ*®ú¦#ñ ͱòCÞÎ;¦ÜWr~ûJ—åœÅ¿=â1™ýúo’M ¼ÀC­¡1/Wß,w¬ôW¬ÕÎ’E´Ðòñ` ¤ö9öÚûª¼nú~6lÙì{Ï—¿\pÿ½høGO%HU¬¶ÕŇOñjƒ°Øj³ºu¬•+ì+޵Érõ¯‹ÒÿÃx†ù¦Æ/E¨i)Lbü'€l&¬DB\“¥àÇ)BS"] 3ù«ãrüÈ娋\°#ªÿ#…Ãë<êîªÊ"èyI#§Y8ÆþôíyöF³æÒ}¶úG.•¥¯ƒø§®ÓÐ .÷†ôÍÇèÞ ç¥R9ýf†÷¹ïlÜà?8±Fìc É—²ú/jf²è endstream endobj 649 0 obj << /Length 2573 /Filter /FlateDecode >> stream xÚ•YKä¶¾ï¯øb àé•H©Õ:ä° ¼käñ>ØÌ‘83Dôèè±ãFþ|¾zPýX­\ZÅb‘¬*֓޽ܥwŸÞ¥úýëã»÷Mu—e»ª(ÌÝãó]fÒ]žÛ»2ÍvY~¸{lî~Iþ1Ìþþ!7Y2¿ºù;€ù>Y¦Ð¿D,O›drÝ}–ÄÁò4Ía^æ0ôB7ºÙOº|¡›•´sój? ™ëA¾7‡Ä×ó0Þÿöø÷»‡¬ÜE…o÷ÂÛðLûÙÄÿg mxÃÒ â™NÖ÷uSK“„Y&Ã$ßãýƒ)“ašÂSë5ò­‡~šÇ¥Ö뉛“Œˆ<êDøc^FϦ׼uoßøvÚÑùyòñþ`ˆó`m•àúÚƒ7›Ñ"áãŽ2X÷ñ[˜_‰>½èšàÖ/~š…„…°ì‰{=tEÔuë°*À”¾Áy iŒ-â2¨G+kâ &N:]…Æl„pm+ eì$8Rx ½#›˜„‚˜RÊÉGpôë2²(º¦C2ôžE›¡Í ž&ݲÖÒä膥mdH\dÐ ^<éÉT‰“ÏYÝFU„¯¥ÞÌÓ+ç(÷;c8˜ü5MÝøÀr¥2[;v…µÿï>ÐMþB“dFøÄUN›7‰Vãè'5ê¾áë`ù•מdÒîÌÊkЦæÖ+E÷p}w„emákécÙ¿£aGiI\ÁÙÁiÄN€Î~¦­ÙÏoö}WÞ‰†lv–m¾g Ál¾Ûï3à°Ã†YfŠäÇ{‹82"ü€ÙžLÖ–]¤açwßɰ#¢¥Ã±õ/¾÷˜ÏdÊõä!í‰]„ÜlÚº oÌ.Û—7xØã¨,Ù!1= 8êÊK­DÓÐ)4û±›dÙñe¥ÈŠÚ=-ðð“Ò" ôêˆF¢¤`úA§žØc|4{`ް /Œ@þ£®þ<ŒÑê³ù€ U”ÉñJ‘yqH7;&Ïù Ja[Ó ¸Ñ?{Ø¡ÒΊu“|×Ýt]PüyC ‡ &×Õª(ßúN…¢[›RÉMÀ¿>½³ÖêœTâÀü÷kÄ7®j÷·+SÿÌ`Ïì; úÚc¦Æ+‡¾¯aŠqáÜ ùÚÇi]]¼ÓÔQÓ²¸îéŽÇ6xp1:úõ´-o)ÓÎ캩zÕ,t7“¯qV¼2ÂOaö_о¥ñ ”t.ø§x³G(~|Õõ=î f楘á;g)«ê+©EܨLod'̵즤ÖEfÖE±f-oØ$âXO…Xö‚ˆL¥Yââáj7¨C¹®9}…Ûu:kÆØØÙDR‘.l¸ï*¥²×%#'{®‰Ž®®‡E\„ãP „†K„ˆäÇÚûYêÉ…m0ù…C–T½‘]S¼›²$Gù'JY óÄ>AšM9]rN²DˆMÞ_:' ØðK)ÍæYjÂR_ïjâàuK’ŒÂc©í†\‹Ý%6± ²”õì!ù¼PôæüLϵ”ë<õt¹áA›¹Iw½,€ÞXƒÒÏÑÇFïÜ¿£ŠÓR𭥦[| ê?ÉÚ ˆŒ:Ž®†½è6H¤\ˆ|§e¬N2jCDƒ¸.ÚŠŒ¥F@¡÷Ê óš$¶5ûÒSÈSn¸iœtâßFfb«™§æ*sÐ[ùþ>O~â{"ì†ãšÌgбS¡\Ë98OÕœ¿rØÉš©òR«„²<ÏO“?¯¼ƒä:y1Ñ›èÒ Áä:DÅF¦F¤é¡#/ ‘¤%"¢¶Ôç:­¤~Íl®Uß½ÂÈþùŽ ½<²þ Wf‰”4?ÍÝØLG;.×Ïë‚ë䀩«¹Áè¸ô½„C“C%C%à ѹ)}J„*#C•[¼¬ØÛjkÊK‡›½>ß8d î «BK²ÈK…‘–v—&ÌÑQÙÙOÕŽºÕOܦq §®ðìÀ„â Ë윎7µ‘`; Fdk­¦Qw¯',íš ²‹·&¢(Ó ýŸ@¹-åñ…1K1—Zqü«¹³8|•{5 ¦âkahPÕKÁN¨ [Š­ÄŽ‹§¸Œ¢¹) í^NTÉ™ãTyТšo†'p¾¤æ=4M’•+CÏ a_iB "í±ø4Z|62`WvUð×ü^åÔÅ=sƒ”S=Jo«O‘(øþ)Ï‚D}è1æ¼K+`h+8’ækå™Û˜dra†7¶|![nÅ/¨¶Ê¹±éí5hcô¥§NBÜ.oƒ&tuÐ9©~+íóª|íó*ò~²™(àâvðü|¹ÁYC…‹…M¯ kYD3$PÔàæ ˜ËD^È›1µöPï‘IøTkàJ»3©ã}ÈuWv ~B¤lF>õ­ÿf+ÊSÅR©+¥ \Ó=Q`aï’X…›X4Z©ðÄ É\Øu²!VÔ£ŸuûO®ëâ„'»çBUÛæK§ª}]AÎЖ_êÜœ]Ÿ@!AÝØ×ëQõúÀ{YCÑHÕH <Ò–k)·èq%dV_}qè«ÿÄ­Ì^ÊOjÅÕ“Z^íò*>yªZE§ïo{³³6ÔRJí£Åp˜¬òÙ×<L Ä&ç¸Õº¨ Ï×­ev8ìò LÚtwÈöŸæŠèûÇwÿUÖ endstream endobj 659 0 obj << /Length 2690 /Filter /FlateDecode >> stream xÚµ]“Û6î=¿ÂsOÚ›˜%J”ÚéC2·iæ¦ë´ûrÓô¶¹¶ZYrE9›ý÷Å©¯œÍÞ\^$IŒWûU¼úáUìÿoï^}ó.)WRŠ2Ë’ÕÝýJƉ( µÒ±R«»Ýê·èÞv¶¹ItÔ߬ÓXF®ê-¶’èdúÞvã^»q¶ûˆˆvǘ÷mÇC–ÁÝ#Ã÷¶±âf­öˆ3ŽÙ›ªym=Ü$Eäá[ÓxçÎGËúƒéo~¿û7,d-•P*gYM]BšÂ$ ÐFvŽ›î`ÞÙ€äÎGôs³³]ýX5{쫨ïlÀoO7kº­Ûý#~ˆ³xÛmS?2RgQa;?·]”’¤‰ÿ8ú S嘶ÝV6 ㉺RYôÀïxèd:s´ |ÚÞO)&et: ÆAPX|_myøØ­QÑ)Øò¼EUxäZvÓ™f‹ÔK©¨¶Í¾? c•z´j\x «2:VûRîytÃkãm³íZç¸MvµEô¾EŽìÞyˆríΞ̲nI‰›úüKµ­zÒ+Ž ²ð? "cn1¯¶>÷UÛ0èÔ±Ò¶Ö9ë@ˆ¤âíÑÏUêÑ'–Á~ca©Kr⼬5ƒ³ûãìzÔM’iÖ-‚­ úG°—àÎ"·Þ‚ëI„š“it‡mO6 Ï9ŸPpø5ÃÐ þ‰ ©]5w…Œ…&Íå´È¾B5$+@v@Îô†;ýë\u¤nèú3û©ÚÔ–û£Æ<ÂCÕº¤<Ü£¤j]D¤äPfÀæÇájÃ6ZPm°ïh ²Z>8Ç#W .fȈ9­˜TÁ òÈÖöˆ§ x´cˆi<¥–·%ÍC- ö_ͺ¾:²pšäSRŸwŠ2XÁ9Á í¿Ý5˜£À‚K-²¬œs¿CtèEuõ'-¸®l üÂÖâQ¤®”Ž wwdW8Û3èhv–A-0õèýÁök›-¬«1¬A¼G¹¾y—êé“‚|1¸WÌ6Œsq+%P8—…ƒ†V‰g(ÓËK Ú7AaŽ5Õ´=ïÃKJ)@<ñy”l¥E · _Š ¡Z)‘¦%cá¡/ñ`^”VŠT‚â'ø¯—k!3õr¾ÉÈwNoïw°[r}‹¿œ:ü¾càã4°á.{ÄbŠ(’R]˜nF)&Ä‘E…i‘£'ì*7¸wÃþÝnzˆ¶1.l—ºæ{Â}Ëî ÁWtœµ\”¹`~î&òÏu¦Eœ—ÏuQ¦ù¢ñ¯aÀ÷FX$ž‰¤(.‰'/'þ?[xÆø«Y8º”3¹ s]¤iôý×Bä™\Áž.aLy«tJw‘ùÖ©È Íxÿ]  Ãp¹ YzrÕÂR0ôMÃR¾_ÞÛÀ©,ñW¤úk9×3 ¢=+û Í@G§BIP’ee~tÉ4‰ƒç/3Mþe¦É^hš!™ ­õ*)`q^®=Z NZj³»jºE"çì.¤G2(—Èõ9é/|ì×è–6›(eþ¬_Ű@øiõÿ:´ù•þòíý¿šYç"Ã#W‹¢Lfj¸L.ɋ֟Upàö¯³SésÀJXá‹ %R< 9×ÑÏ£ã€O.xxH:w˜—¦“Ú ŽnkƒY¦—çþj‚›*È£ªOý¹óÉð4 ÅA*PËœN5—8g& 9á’õãXäùk/iºy:ì>ÿŸù-2zÆo%˜+ËÕ³~«¦~[ÆÑ{;–PlV¸”ŠË\ç¶2&°dñ³©êª÷¦B ¥Q…öU£"äSE>[M¡/²?„Pˆ ˆ®_dÓµR¹ÂÏÙqdÚ0ž¦ù,˜6”vç-O²„*^NØt´›cMËlj(ÔÁ€·’œæ•*žÛLÒ*± Æ¢¢Æ!ý~ãx(š†5ŠÅ²ÖÆ‹6øë'\ åÂ0‰‘§tøÃ*kL©’˜ûÝ7%âÌÑ·¦¦€ÙóŒÆM³{½¤s²¬ŠK_‘RqÁé{LûãPi<¬€YZl⃿œ<‘G&r8FÀ³Þнð”9é8/…øb½t±â5¯žBljžµŒg)%z´1 |{b9‡Óî=ïí¹¿†=Õ꼎⸮z­Rò3—Æ~ú–”œÇÓ\WGà÷PQ)>Þd`§®²áˆA #Ó3½BwRƒ}V€l\›ÉpÔaÎÚgµ ú*S(û²÷KÖ(@¶mãú.ä̈Òòßû%w½³ø=‡2º+ÔSMBwîaÆòÚÑÆEt%Ë 7ລ– €$cÝû?ÂŽ†WDI@pÛ8Oïîï0¬ÑÑí‹€]…5i:¶I§êìziÛ×¾&WÀÌ'ƒ†A©äTmAte$tŽ9Û­/êõ0†…2XLÇÑ» „[¿ã¡mÝ:®òøü0°KˆàÇ<ÄȜֵtÊr}–" /h©3á•Ná"›·'8þÀ„x ­kWÔŒ¢c,SÒA°”9d†HÁ&×÷9nîÁŒ‡þÕ … ÇÇD—UJíï,„‚ôm7úEýbአpºʉ`HŽ÷°%tú€ˆ×ØŽèøô"TÍzID¼ˆjK±95ì³÷ׂ󓾬ØÎÚ†ÂAèÓû6P;XÌåøÞ¶³'ÓxsdqÈz\÷IoýÔ+›†+ýi–Ðöqܤº3Á~¬ÐÕ›€›Üb)¶ 3ýC´ðw¡ó²~¯$°ïði¿üð HµãC€üÎs8 @iø×Ù•}ðoU™Lø8Ñ==.ª|ú:¥áhïûáÕÇÐû‚ßÞþzÇ­ÏIZ<‘”öQýzwûÓóÓË¥…j<åaGì¸ýÏ··o¾@_£E¡‹ÆcWmMñ0”C“Ú~Þ †[Œ‹ÿÙ‚qÛï>V<éx¾ï`‹ÌÉï=3â´‘Îu_­É ŒÇÏtï’‚Š£[vnêâÌõ(Ðôàåm.O…"W$´íÚðÚãýãൠû£{8UÃUX£´¢ò'AaqªäÃøóƒn˜À¾§DCا‚.±®ÞÝÓ¿˜{ôRU&یΡOu„B…S9]xêEèì]ú|L“§Xb]£™¿Ê¢ ëÌi"dìË_i:Cº½{õ7„"9B endstream endobj 668 0 obj << /Length 2657 /Filter /FlateDecode >> stream xÚí]sÛÆñ=¿‚àŒy¹ïìñCíÆi{&ãÑLÓiú‘ˆe´£ßÝÛ€G‰ž*~ˆý"ö{{û½KñÅí‚/~üŽ‡ç««ï¾#³…,3F.®n‚K–¦zá¸`B§‹«Íâ_I»Í›b³\iž%ùºÙ·-¬Oîò¦+»¥HÊ}M¢*vE½”iÒœ}CßmWîò®'Óð1¼V÷„v³2M ’¯—Ò%[ÂÜßгÛmÁ–ÿ¾ú x_ Í´¶ÄÞ?¶päJiäu^Ý·e}K¯Ý¶) \šÀªçwz>ðù i~ÿF¹±¤°,U)åø áLe•2çL¥â˜–²Çx£!³Bõ(y½‰2#Yæ\ôú 5ðrƒBÇk–uÛåõºx†¯YòËo|ÿî­—âJ¦H×L…¹Î½*EòºÃ¥Lr‚ìöË|¿)*ÚMA[ Z€ÖàrAHmÑÑŽ×#®à-dKïUQßvÛ–ò»»ª,ZÚéö1a(-˜qúAÍ T3ý˜Tè/{P;+å2Ƶ›ŠèÓ¶¬Š(k‚q™>¦'“ (Û®ª¬IÊ.,ö¨¡O5½Œ|_ƒ¤ØreŒH®Pänó]XÝ’‚Š@‹ÌÝ€z¸’ÝÁ;‚·­™•vz¿£žŸƒ"TЮ)ª /?^½§ÅíLdɧ²ÛÒV¹ ^VÂwë¼"(ºþ®èІ^?.IòêP´ø½äÉÑ qóš®D/Þ&Q‘(·a?:Æ9cÑücÑiö˜jS;qå•J]òÓk›ÑŠô‹Þ-ñ-%Cðñªðrh‹Íñ³G\3q¼ZÔ~3¦³!n€ÝX!Ù Ðm‹5ÚA;9¼" ¬_KälˆÌmùqØTtßø•õw9øÅ†àe lƒíRÄ=U°%@¸ Ÿbh b½!µ´‘ãIde•_WáS’-ìo·J07 ”´ÉáŸ.0€õ¾iŠöι¯7”5þ+ÄG¹Þ×hp·‡¦¿ì"¤ò/p¤Ç,wwÀ=²öá$t´'À—ÒÖk¸Tðfq™2SH“¼Þï–àr×eM Ù,Ù•¿w/fx¡»ÃbÈhÞÛÁÕj‚C‡ï!È?§w¼/ÊEYæàì•p,S2øÌ¶Ø7÷ñÈÐ!÷ë=„—@r¯k{ÛÙ–Ä›sìfZ=KRëEV„Oév”«<˜²Âá7n¸€?" |>RNE…Õ!õ#Äç!x¶‡²#“Â7¬E(Ø¡Êò®)×>iû CY•×MyØþMS|8õúž>úˆ üiß´´ÂÈœ¯¦¨@t½i®üÁø סÒÑÓ(í!^鈗–þÒN×D„¶[“èÆ"ñ5Õˆž¯œh¹ÞïzƒïË"ÜF5¥ƒk0ÎuSœæÏF`…§L&Õ7´&™œðM^žB};5eÖø#ÙÏÖj’ÖWß º4Øä?#ä8s°½’ÀkÈ•‘«à¨`¸ëK!]´ƒÎU¦pExoZ†vçœ%™8\ &…™7ãÉ _ÌHý÷ïˆÜó¾ Œ©ÌÞι?)é9ÜNgOädDör#zTò#ëYY~·X9–fr"†“Ø‚§IØ)ÁÅ*ãÌ¢%h°ˆ~7f{ûyöç¾Ùß©ý͹7Ö"÷i_ôüáÞ1¡Å܃¢-ð=fÿר©L͸_G¹·6}Ä{4“üÏç=š?ì=ÿ97°j˜2¼ŒŠ@B·=4ôëœfL“‡O\c±NÙ“8_ÔÏ-8$IõôœEèhfÌpÒ‹xßiÀð,Õ#¹~âV4ñ‰8J§·=ÂÊ∪šXÄô\Ç ·\Œ±üš'(+id¡_cAÝ*i,_3`„J“pË0ï×jJ‹ùø¤”ag¶;çô8?^ïè'i9Å„ïc гeŠ?2'äù>t¥3óUôî’>À}k¾¢6@>]`ÿLmØ\j|ùè á[yš‘`’Âxæ&ä]„yô,w ÷`•ùHÑ~f=áã.eâØ»7î¬+_Þ8þSË#ÌYê2¹¡þñî¯2óÉ&%ç,òJLŽE^›^Àšåv*·æLj¡"ÿêæ+ÑAäbÖ8Mo‡}“zªÛéÇnç| ßnw¦Z”ÂoŠÅ7±+`¢åŠ/ `ËÅ û­‰œ\À@dÅ_°&ü¿óîS”ÏF*ˆþ š=VW'*x»°Æ³?ÒGÜÃ5yàílo( Âè‡+ƒ“lýâYÏÑ_,.8ê&¿ÏQŸá9ê †f xÎIÅ8óœ#Áiǹï0Qùû™Ic6拟dvA^7Ë•‘½ðD†ut¢©±=s ÿ YWA¿ïd¨TCZ%g°~¸úî’Ǥ endstream endobj 674 0 obj << /Length 3551 /Filter /FlateDecode >> stream xÚÝ[ëoä¶ÿî¿b¿Eδø¦rI€´h®is@šI€È»²­Þ¾"iϹþõáZiÍ}øìøÒ~Ù%)jH΋¿Rùäf’O^åáÿ/oÎ.¿Å„sVh-&o®'<Ì95±9g\¹É›Ùä§ìî¶jªó_Þüãò+•{KÉL®–ïöšºH7±¬žžbRÛÉg¶PÔ­¦nãq%“ŽO½^¤Æ3¬€¹…á¾J ç˜.äñÑ,Ëíh´r9K'Óªˆ~—Z_θ2"pôBæEÖÝú‚Ë–çÂf›þ^_ÀoÕЃÕ5õlÊ.¼³8çYÙ5õ´j_@ —Ù»sá²jÚ­êAï@Óo›z^_55†iÁD¹dV!SÊÐd®èW-§uÕÂk*÷üð…¦š—]ý'U…œÏ|G³/¡ÒQ¥\Cy=O»ý¯Ë¦«»zµ¤j5¯•_køiGŠÀƒEž'™éX®]ìÑTíšØ5…8‘±ù ) “ ŠÑúÿ™lï$Xy`.,€{g„ rÅBR®øe$lžMçeÛVáµz¹óú¢þ½Û4Ul-;z©\#³ç^bXGnc·±zŒÛF1+ÝAnKV½OZQÆÛ#’Gì[[À%ž܃Ѱ¤¨¸:ðuÞš`>VgÕïåb=¯¨õ&l»KzV‡Îm5^'`Ò ìÄÂw¯Î&?ùNŽñÐ é>äÇ”e¿ðëo4ðÀí:t0A;xZ¤68˜Ð+/E˜ÄµÑOBShÊK¦Ò¼Iɹ`ÂöîÅ»¶¡Ûª£Â" ´ÍU ^n%7a7fìɶIAI1ôgÇåô:ÅÜñÔH‡÷Jj´õ®&i‚Ñ›±]ˆ}\m/I®ì·½Ù‚/,qS±CC@ìвpÚ÷„\çl l÷òÎîF@úà®}DÉǬK‘ê„xfÖ‘KÁ€¦í>:ØXù~†9°ºÑDÆ öG ù *êÐÝzXÞR­ß]|^†n«®œSg†ÿIcV2± Îs‘\<°Òô›J’‹SÜžDGnéø‰ÝáJ\Ãûv‰þ2=o¡ú<-n·C÷ÒP¡±?b…˜BÚaÀšÙ@t\=ƒÌÓ.î ñh¹qD¯ò|ìÇië½Oc”x F‰'`”|bFJu˜»ñŠã–ì൬¨pw[c6Bº<ëç݆2ÀÚÐÁ§Ê¨ØçÔÚð‚Ïòz²>÷‡¥AZ«Û´°ï“Á/Ruºjú# ôBt@ z³ÃVx¬ ³më«yhò cÛ'Œ[zƒbsx}‘¶Ô(FÂ÷cÏ10‡ˆiôn go¾0a#DÛTç!¥h·v‰‰E@øôô?U³¢‡Ô§ |‰ÈZ›¬í€È Ë:ž†`’ý¯‹xÕ˜]ŠéUJžûv€]›Eh‘à°™=4Íj€ô²jðM—uÔ¸~F3 x=J* ´-h+rÿKúëñ¿o‹Ð’*œ=-g%½» ·°­`ÊÌ"ÅÃ"±¿™!µ}Œ‚Ïvw›]}ÛìË@šrSL§¦­Qón2s˜9Yì¼áѰܵÖ"–)<­%í(A¼3mQ<´0!ìq€œ°§­@=Á \.'ˆ« Š“°ÎSRzâ3I€‰K Ù~s3’À–ànJBnƒ™Ë$-Këùÿ²î,ïž²îcêŽ;!{£µ~(·R†ûgþŒÌr¹HØÅ=^ጭ]bUq«Ôi¬:˜Í(X‚yF T'Z ÙU+—¿ h\7%`¢¸˜»Ê³¯êíé#¦éñ¦Má÷¸Â­›ÕUyUÏë{¾§{?­aÇmS>ŸîmÓÛHˆ‰æ´Ä}lƒyäF"žKƒÄœ¦Æfò O¬WW]Yûãxм^Íç+TÍ»öÓ€ÐÄè…ƒÀ2ž»'ÚOäD±BšçTZWðãJ+°á!JûgÔZP†Õö¹„Ðëm/„Cz;ÂÎáûD*¦a¸‚i%þ‡¡9 ÚŒŒE¹±B2ÃÕ1dòTˆW}(bO µ‹L´ÒG"‹í’“‰ÓÁ–Ç݃OpFì2àìooÎ~;ãá∋´ jé€ëj2]œýôK>™Á3ˆ˜™²nrç{.&‚K¦2|>ùþì_t×y÷ÎS$¦|~õ!÷ŠÊ—W/§IÎ;V89¼\t"h=¸žÇŒ¨Ë¶–Ïí2ÔÇÛæ®G3q›{:§Q<ÛZïg¦G2'x ñ4^£Ÿ|œÃ•ÿ7Ùô³Öm™c•3 Ã&ά~þÏ[>ˆ‡è¦»‡¬3…4'nèÎd…Ñ`Vý΂%èÓvô™„Û·¥Í%‹&øDöA)«ÂŸßž´¿?‡~HòÎìr9oW¤ðÓr>¯~¥ÓÍúæ–ÝŸ„ÞÓ2ÞôSŽY£vîQ~›¢8¼/ó;ž„ó>q\Õvõ‚û>¬kV‹x€Ž feWÆ2¸ÿ*H¿m6þ eÇX=DÑhuöãëo¨p½jtTï ámSU ›6ô¯—ôÿíí¹äÙ{x;Á?VÆã]g?˜p.»®î¨°.›ò¦)×·-ÕB¸Jmþ 󲹩üÕs¨ÔËv]7þæ9ô¼ÀRÇø¡~[‡cƒY]ÆánªØ­ìR'³ª6u˜ž€ˆ˜ ‚‚ç"°õÑCon&±øÝ+€CÀŠQ×ãèô¶ëÖŸ^^VKv‡óÅ©²Uss‰µË_ƒ|3º¹{OC 3¼ë2[Vå~²ÁYk@f|ƒ³®~ìªe8S¹Í^—Í[¼4†åoÊå͸U­Ï1àI‹AçyèLµp`”Ûþó€ñ›þ"Â]à 4›¹ß5tø\ ÕrºòçxtЇM3º6Ý,¶GJØîõRÓ}""AÚlòÁWTP©Cÿ«p—î–ªt_qQ./šªœ•ž7ž*ß?ћ⠷õ²Š/àIˆ@‘}¹¤[-d[fwÒŽæRÐ\ðqý®žE篔pe+2-=¼p€“·W!ƒ8R€¶O®‡·oRÔÀ­š~žžë<[-A;º$*Àœoïo…ÃäÄ/w·5ñ L2$Hµo]>™ÕàÛ@‰êöÖŸ[úç±o¸Iåz=Ç#ãz…Ûµùk„ðßÖtY_h߇CMLêR“×+–â«jY5þ¥þ:Z®³¶k`>蕊þ{0(MWKqõ¨¢¦hX®j:‡ÄrXß¿¨uºTIä«ěSÏñ­_ƒtĘáÛºŒÏÒÈqÝ‹ä“" §ÎSi÷ ‰ù„!ý%çÑ›VýÆûž9ôžè“ðµÌ÷‘‘þSškr»pÏȦû˜7ÕáÁ÷rÕÑ³ÈæÑS‡spŸÞeã—¶\ƒÒÂìvbYYlcYìj¤Dz&GPäa D} Ö¬ˆÉ[·ºŸ"–=›±0 vä+ñƒŽ{Ó”@ŒñÓ®U²0×öuˆHŽù8WÜ#¡ Ä:î1$úY(ˆû!¬>HP¬z/¿yŽ@ ‘Œe¼(â3âó÷¹ØÏþ¡C'f/ ³¹8LÂùÏ÷Ïm£‘ \©âŕޯî™üCGNL^œ@‚ç'ð¡ïg—Çÿ S—Ìrù(Íýp½¯šT~´Wr‡DäÀ·þà™„ «X–zꀗÿØ« endstream endobj 678 0 obj << /Length 3007 /Filter /FlateDecode >> stream xÚ­ZÝoã6Ï_aø¥ºæòC”¨")°í]‹®À]›‡ÚÇØL¬«,ù$y³{ýÍp(YJ%ëÝ—„_š‡3áùâ~Á?^ððÿ»›‹·?È|!˵–‹›»…œ%‰Zd\0‘˜ÅÍvñÛêÝåZs±ÚÛæÏãÛrµ©«¶kޛަºíhâör-³•»/ª–¦ŠnGSÿ¾üãæooF#†Ú*MAÏêŠÖL…J™€FXñ³Õ¥Xm©íªmK­‡â…™á—',W»o_Ë®ÚllYº-~µX++S½X‹0Ki½ L§¨ ¦åÀ´³÷1¶B3 ȇEìrm²|usiÄÊÞ÷$Kõ½Ã–^t»Æ9jþÎ…¶—þ{üS7í7—ëL Áá /ÛÎ6ݺhâ´c÷o¢›“q¦²Óæ´nÓuEMkØGÓ/E~o2!pwÖ0-™j I¢”ê%aQQt¤HIÞΉ’Ü"‹B lµÅÌþÐ!H×®t{Wa»£©WŠ#Ò„¥Ù°[WeQ¹õmã쟨t²zÌ€ÁÈl,ls¢8a«Yù`Z=Âks©ùªÞü¿ÊU]t3r¦ó-GÐ5À)åÓó‰pbüÅŽ¥ƒô£b…Ða›Îšÿpò•ÎÁ?tDrWT÷Ãâ°õA Ç;`%l•þ£S)Ú® £Uù1´îð¿À3ïûÏlNM€Tp857;Èz¡lc7kñƒ'ó€AIù#wþt™ ¶s²#DýÐ`¼¥g«âކ­—è㥑«0c›@&ÐËW½ä0ôUKC ¾×$ ÷ŸöÌö–¨ú¬]OäÕ=¦è´Ê‚·F"&w±)[¿/8W“=h•®Fz5r²ˆ]A¨Ñz/>6‚û£6J¹+ÊÐb1(ò»—:Ñ«»º,k¿$ ¹v(’rÞ¯œ!Šñ|8ðÅ>ê_%xþlX´³mÕð&PÇab˜<YÛuMq{ì\ãdÀAôkã~«„h›Í³’® B ¼CÎRóÈ;Ø2ê„a‰üø7ÏHÆåÉ¡!ˆ`ÚË(V×˽ÝÖUeÙ÷Kš^×Ë겸¯jòz?Óš74û‘F±‡uå2î•N™ò÷(Tˆ†¹˜*÷® †›dà[@*²êÓKï§òþ€G5…=M…9EµÎHÒ긿uÍõR-¿ýq>½MÞÑtWS÷;ñ>Šê³îÉOD¹AP%ƒý+®²û0„n2vê‘©Ñ& ¸äw¡’¨RX¦t¯iÅ;eù î%Q¥ÈˆçkDz aÉ–GãµpÎÀK÷”Õ‹©Õ²ßkXñÔ[H­VtÛš z™šÕí|Ž÷RKŒ=¸l_|莈0Žík¿ù[WÒdhYšþ×ϧ>dLI¾Ð½µ·ÔS`=äjqæ;ß¡|&è¥Óà*&Þ·q¥í Ÿ9 ^2I p4¶¸÷4º»ºñfjL^1ösCqJ‚óCqš¶ë?C£ÄaÄGÐú°¿u¸°ra´ÿz[À°ÂSÑ Ç7˜+ ˜,{Žygo‚â’í?ö6¥m[jö è“I@; ŽŠ(¾úÃ÷ϧµîê†A¦ÑÙjãúÏñ¦@­0„êt†Os´yØ(Ê2&ðî”ë"yæ·77«í~š[È&ü!‚L‘F iÁèF»úØPËëéZêÊch2‡¦†E¹JO,óà|Q‘(xbpg ;i¿ótÕØÎ·†=êx«9m_žÁ5`c zc‡þÆVÊÐê}Ÿï´´ûnƒö‘ ÊÈñØÒ SžÆãˆäþà  ØÔ^Ú­ó‘äâ¯7ÿ½ÀƒÏÜ€dÆ$‹’ý’×Íþâ·?øb “@©Ü,üÒ=Üxr–ø¸].~½ø'ÝGµÂP”spþ SÄb¼›éóf΃Jùx±Lžrò¯o-µ‡¹}*§Rà–¤9Gα²y@ N’Ü{"|!Ynò'$’\@†a>„G ®²’¸£áõ"ýS ”°ŒKBAÄv¨4Ïæ¦,ËôŒÌŸFáy‘!*q®Hd9#²R>Åšåá7Ÿ€ôÈJx <Å”çU[ÀåÀ[Š7šb{½ü†~Á!±üö©Hg‰A¦ð™…Ïg@¯à(ø »2ùˆáÕƒƒ0…—/_À_È}. ’;»/Ê×Ë{ô¯_Õû0nKHï®—L„~Ÿ<×§ Å TP ,Tþe 3a’œƒÉYF1œT¦ÁÓ‰™TR%`UJ|&!/›0½z;$fsŸÅ>®±̓ÆrNcñú³²çÏ 1H¡2–¤æsîŸA¢¿ê! ™Îœ2†iÿº5Ú€øÓ#–ƒàÊ7T”èkÐp}É;–.ºu(_"RRøå± düY.N…¿‰i=–'` CAíi…dÀñÒu¾Üƒ}ªÎàƒ ^%¼”T/’Ré|ôZ8)vª((—öãmÛ](\à  p.Ô {š´,;Ô¾T]Ô«õE¹ºÙaô‘†4Ȩî©ýƒmâO ÅæXZ,ꤜS@¡èÆo*ƒ›s,4‘b*±ÐjFбmKJo@_ôrXÛÂÉ¢£>¾½=Wg”‰`Ê UÄÓ-íå§À%QÇZlx D)N^µPàS`Ý9T–¬j¬Ë|쪶¶«¯9b-a­ŒæLgÉëíNÈdÎî¿ß5i lö›YGŠ}ƒl.Ô- ‡TíQyz(=* ½Ü”xq#r¼ŒÓY;ôå=œó?™”:é+ÈM@ì‘ÓGÚÿCމ Uåòp6zälp9âšP-Á!‹õùÆûìöþ'“9>àˆ·i\çèÓP¢Å&[Ÿâ„**1œ©U£&`7Çm[x¢a ÊÞx#ªi|™Ý;zöÅ~KeV·Á߉Üá[ª lOp¢X}ƒÏ:€Ó÷Al$´³‡Ó ÓcWIÏ)¦Ð1KÈa§CýgýÞ=­{ÍÉ9›t¤ª'àcùÚ McZXØ’:¤ˆ-õý«-Òo] ŽTÒPVyÒ[V¥›Æµ½n‡£GPê{mÇôýDžœ~i==pŸ–ù齓** J1÷(Áûë³GG¥™Wýj„‘}¼+Ûßž TLÞ‚t¨½ët(òPì›cľ}ð߆~ú{ûøÃDyúK•èUYüILÅ®ùÏ!hÖÛT¢ûå D·º _Hú²¾w•ÃG5?:ÉA’™mÂwÍS‹Ôµ¢/Ï®+üØn2 €ÖpeÈB;¬€{Öÿ Ù€ endstream endobj 683 0 obj << /Length 2579 /Filter /FlateDecode >> stream xÚ­ZKsÛ8¾ûW¨|¢«Æ0ñ¦ì=lmœÌNej×ãËT2Z¢-VQ¤CRq²¿~»P$eв$Ÿ6À~¡|Ý`<{šÅ³gqxþóþìê–Ù¥ÄJÉf÷33bŒ˜é˜*Ìì~1û­‹ìÛ:½¸dFEM‰O¥Éü‚™héßæyR×äâR0ýQ6©§6ˤñ_•Eø¼|l»!+²&Krÿò5–q•æI“}¿` Þ©ï©’–)޹øûþßW· qOsÎ4‰™ÃœÎÈ—|OrÐÛ šyÙŽ¾¤‚¡ü7IÓTÙú r…ÒQVãÓDuÚøÚÿK« 6ÒF÷h öÍ˪JëgÐSƒÅ‹¬xòc½ònúÉÑŽ¦ý²YfÕÂ7³Â÷©FÕÁ ’édõœ9SÑK–çØÂO.h”þeK?µ÷#SOiðúýBÊ(©²Ä½5¾«Îš4°ýŸÊêç…aq:QM¤´CÅ>%Ž•·šê(ÈNçÙטŠtá©Þdh<'Uã[î%†Öϼ|J‹´É枺*¿Eš·Ã“À`‘Ös˜8/®î˜¡¦—cª‚½ÂÙۀò=¦|lr%ÝtÕ¾™Ì«²môGý ´µˆ^\xzú<)|£(‘úâ_V¥wl7® ÃÜÀóaå‹@Z†10cMýØuDAç \u\ú ôó¾£Ð÷—]®l|WðP¾Ñfy‘âìÎ` ß…1¢`ýP7Y³n¼›€âD]ÿŠª}¸?ûvFAÃxF7ˆŠ-,0=›¯Î¾üÏÐ FnÍìÅ ]ͨ¤„S í|öçÙýv¤€ILll)®S&-±°tU ³Üœíwn9INN`ÁÎÓúµ\Ä„Òc´è›ÂIl80‘Äp;Å$ž1b}ÅBXJ3‡³p¾àj&‰ÕZ¡+Œ& Z 6æØOÐ1ÿ{¥¥Ë•˜–¨ˆÖr§Ò³Ø©´´Ì}æ”fSJ{%§%¢¬Ý24V “e^ãšÞD‹‹lqsŽ‘ô9PÏÿñZ¯ÎÇè5ê ȶ^)>áótbáPØö4ʻΊºIŠyÚ9à3=+©„õ|sþé÷¿Œ ¤¦n¾ßœ ‡÷ò¹ÉVYßQ”çWS.;Ü‚QéN1á/ý^þÒÓþbC}¼¿ÛöNUÝœÿ„pštŽ~ç¨NY9á-õ´4KTlÞ°ªz"¯¯ú«jÊÜC±AÂü(sÊ|‹öPCRMnãÜ"j[›ÅpƒM ú}€{Û°pªºEµ×¯<¾Ív* !Œ0Ð"Àtƒí¬D8‹¾Q¹¤Ä?ò¬‡@`ݲ>ꀱ8Ä&È@¸n?€bã(A Š X3Ð06Z¦•ƒ±€`,àŠOðê;’§$+iƒ(„Ï#9Œi Ó<]ÃjOqðx8øì(΢õ æÁ™{.Ó±Ù°0šnf£Ý FgB)'h;¼xùz60gÒ<Ž>`6¥1›Báݾƒo+ìYã¬àBü¤-½ÿ• a†É Žgmî6b‹Œhó¥Å˜ °+r)Û1›üȳ~,+lðVT•&5†’8ªOO°õàpc ^ ÊŸ1”ëÚêeY5yÈ3.5Ö:•&baÒëSÁR€<¦õ–M|Öãr¬ò´Çu1Ç@n‡T5RˆÅ&7rÏ?S÷‰Ûßü~P=…áîãÙì‹c§?áaˆÏ®AÁÝÉ’ƒë ’Ž"ý92 ý¯” °¥JYˆŽs?õÀåºòÌô ?bJò#ålÆ”ySVu`ôd»ÈšçiÙd‹‰té±J!†Šy–ºŸÚvZ¶CÊàÛmVð~:¾QAÈ%¦6*fâ~Êb0eAÚVbY{ê saÚ†R _·k ß¾_¸DgLd/‚ Â÷ä Œeèdö‚¼åÀFéùáä}ÙC•­W9ô¼;’Ç(C4Ìà ½>D£„ž–ÈÌb'xÌ‘¸+M'2³Ø­4ä¡ê ‰Œ€|i±ñ`œì…\™›5ÕaR¨[ Lå/Ç©3昱N™‰`QJ†9&Èå·tl§Ê¨ñ€íâýÉ7ŠÄÒ¼í=‘c¦³iÓÒdÔtmˆ0lo®Áõ$N&b!꯯GÉc=n)ÖƒÂP–*K˜Ån¥5(õ°Æô$¾åÌ.™îÈþÛªëc–§¤HVéÍ9¹*0Ëæ¤ùÑ„îEÒ$¤ùù ÝE3…`Ôaª§ÿ¸cŠ’øÀÝ@æuظ:añææüŽþâ_ïXÛàmC´ 9 …ŽÓyÔK¶Æý(Á ï„û"wùès룑Û4¦}t”Ê£>öãýp‘ JŒ|õEîrÒmë’ÛÖ%#”=N:FåQqá’²}@«F¾ÃîÔ—w}õúDßaïÁâGešÐ8dûzÂX&I¬OÊöO`ÑiÁà©N:{g±3 ôIbb9Yij²ð˜¿iÀ‡ã>ì»Î“ªGòP_{Õ}Ò^4hÈñèÒþÃAŸPòÇVøG´Š­¿B@r½Õ±÷„­À ±µ”¼cS{Þд|jÏ“üŒ¼Ýc½{/.­OøvX é%B“=š0CLw§õ~#t1mÂ_V ç·ù§_vü—©Ú÷ù‹,l-Ûk7>!™uÜÁk»Í-†×@p8Y·›{p­cà(ü?ü6Æ endstream endobj 689 0 obj << /Length 2739 /Filter /FlateDecode >> stream xÚÝ]Û6ò}…‘'W3ü–”Û¸—¶‡è¥ûp@ÛÅæ®ØÖV’óñïo†CÉ’C+¶³=÷b“Ôh¾g8‘Ïf|öà ÿßÝÝ<%ó™,7FÎîîg‚K–ez–rÁ„Îfw«Ù¯É»ùB¦‰»¯jÇæ‹ÔˆäÕ<“IUÏZɤÜ5m±[ºo`j²¤];\Éo\èºiç¿ßýëù+@?$cLLxü·Ûòc»¯Û¸í·>æ*3L(Ó×îÞÕ Ñnç"©ÂèJO÷ý\fI˜/7EÓ¸ðBuf ©3Æ¥™-„fZ[ÂŒ("ÜJÁTn{n›²uuѺ&Êk ’ñ^´eµ}ôÚ«vn7‡ÿ5¨MrGÜrÐâÊu¹{ ÷ôOòÈ_›&o"…eÆæ×ã|à YCÊαF§â|ˆi•Ò{ð71<)S¢8ÏŒò”Óó̘=±åÿÒŒêz3ÊSf”OdÆ/ÚQøQ_iÇ/‡cz‘Õ%:ÿ+†ãyvÌž8õ_,«ê?!åŸ`Fy}V](¨íŒ=*Ί®ö£”PúZy™MMܦܨslª¥yb›šÿ›Žò äÄ ¬´%« ¡Xžex`a×4cXÒ$¿¸¶õÔœódÿHÿ}…†ô?x,ê¶lËj€ rS+·†¨nž)ë]g!@hèý¼žè§7¯_À;©¡Z\6qw xÀA™„çMǘ´ÃÒ±¡…¢{â9]î7EgZ\3­{?7¤ •>®âÙÉÿ¯Ã‹Å®Ø|jÊ€‹aNñì¾2ÅÅUÑ,v¾ýi·rnE¯²YÒT[”ÔòäÞÈzC3DÿÎ×®Õf¸ÊŽV½ 8xp;·h¨Ïà–Ø-ÐKzò7ܱÖÑÙ¿k€Á=™|#ƨAPŒÂ.Á²®°øÇ1Rk±`X±ÛäÍPÁJc _´º,vÝû˪3D§\¼Çšýå[Ó,P.‹¶ÄæÎy×°È÷G ;cÀÙklqųdU!L mwê €`w}°;®â!˜€Ë†FpÅÞEë>b›/?ú3Ç´ FhUHƒõæ3Î|h ¯h)½ýAèà¸@Þ ƒf Cô*‘÷æÀõ I»,i:°¸[xcÑK umÄrliŠm ïUÛrStíÈ}2‘ì›}±ÁèQ‡ÓÖðü…+M¹-!¼ö‡ïé¿WbhW2y–ü£!¢‡lÜûÐÚQ¹îÅ?Û‚¢Ð糤Š:ÄîÐRÖ†X²‡¬å'#W…Cå(HËõ¸šŸ4q>[R N9¦^0'F¸¢÷h˜Rb„ÍQcAI›|X—GCïCÈŽÒ#>XaÎl š4®¥Z¶X”Ô-ƒÍ ´Š: 1N‡ò Ëd8J ÁÔ5aW~S€×Ûÿi“Aòäj4+6åÃn`X¼ºqM´Cœ ¦lßxÛí—W.k?¶Ñq¥p_œñƸNÎl¦ÆÙ" –'Q+¨Ôa³_XÐÝO]ºnC†Íd‚=œùž ïÇgûíÜ{’w±šøÝÝC@†@óó” Ãzkhê[‡<¶£Oãt=0§wÅ‘ÂZë3JF΢ž@ö&½ß-ƒLÞoþywóÇ ž6 \ê?j((ÕËíͯ¿óÙ B82•g³t;S ëC>ÛÌ~¹ù7} ±€‚³œçT™i(¥\Ú^˜»öÁ ºpC#j‘AéR»åšÆ·{h×uµs4yDEûÁ!>qJþÜbŠü\,m Dv¹XCÍ(ÆÁÅ”ÊÕ |&¡BÌ?C¡Áõ¥Ì.Gá•«,U§Ö׿)“0‚-^3ƒé±9Óä¶jš"”‡©9Íô¥(N2-sÖÜjõ8Ó2Gx9M1gèm§}¸–©Ó¼%OùX¹zùì;¿üÚíšgßF|((â:¶¢ŠÈL© E¼…”ùŠ–gŠ€= •G4o»ï‘¼ÏžO +qá9— º'„OñÄkžHø͘ðrZø«X‰ ŸrÖ}26²Û3 ~†ûèÝ>¹ÿ”¼—“ kìááÔm§¤²™øš$u1ŠÓLÅR2k:Á´9ƒâY&¼í77ÜÖú3,‹g4¿‡Ú—a‘ñò{>,£Âsžn?=Âó];™Ð.!ª1= ›Ð˜̦êizHsø%/TeÓ¾|öV|CÓ·²¨n »™Žü«xŽjIiØB÷%ŸÐ’’ŒÛ'J{Cš§´ôºÓÒä`ZKWñ<Ö’bê_)¡þ…ò‡ê>¡&yɳÂoHñöù(þ¦D¾œ~T^°”’¡D…œ†Á)ækRä…N󌟯…Iìˆþ‰ò:ž£jÊ2&jš¨ EfOŸ¦,=™";íL¦ÕtÏQ5A1ªóPÓ‰‰"R¤g<'þFÏO‘WÐË+˜ê>ˆ‰2RØ‚õ«räW 8pañîWt ®ÇÐ5qƒ“(ø½ñ×Óê?ºç*áì B¨0Gß°Ó0ɨ!•†–&vœ¨½iõpëmôfÀ[búèkùøs¡bÒôX^ЧBÿg“Q”P4cs–2a×¢ßaÅáöš¿h;î»Q·~ãœë¿ýºq•ïÃc7oh)ßRïnhѵ0i˜¶G=ÀÇÚ½/›jOŸßRßkœ£É/nÙµÌoÈê‡à o¸™ýê vÝh¤Ý—)aýÛèåãœéƒöo??9«¶öMÕÿ¼yM,~~¹—Ö×éF¼- ghƒßX9³:½ÊF@üÿô9¿ endstream endobj 694 0 obj << /Length 2060 /Filter /FlateDecode >> stream xÚ½YKsã6¾ûW¨|¢kco€©™’Êdgk6ÉN\µ[5™-Ñk)R+Róø÷éFƒ4iQ’%Oí‰@ê¯[|ö0ã³_.xüþx{qóF¦3!XjŒœÝÞÏ—Ì{=s\0¡ýìv1ûdW×Ò»dU|i·›œ&y™¯òêJº¤%B»ÌÂÈ'ËlA¤ªŽkwðŸÀþ°¡€ßù¤ÝÔ¼ØÎó-Ä}÷õ&gW×ZÊämä°ÈÿäBWyäü çó¶Þ4D¨ï¯>Þþ¬ºšimIñ»MVÍqëvYŸ”yõÐ.šD…a”­×å×H¬»E´Ó¦IÞ´Å*kƒ` ¯—¨úײ~ ã¿^y‘ ®Â$·Ÿ‘UÓ‚ð< ý»f;GË)mGF)É“ ƒÞúïñw7oà¬Fg¦Xª[àòNО'çj™Pýž¬ZL1’’ÙTôŒä$#Éï¡åJ%ÿ^âÑ¢¦ù—lUTEõ€SAnDz‹¶uþAÂ:Û´E[ÔÝïé ¾¹Æ0nÓ±‹þä†Oi®™1ªSêUϹþ0eEj—¾ûÁ¼^­CäÁ/H#¾Í„MŠ¿ƒ„¢3 Ç#ÐÔyhÇ´rG„›ÞE…4 ]ŠyA1‡r>írJNª˜ýqýFOJºVÆ1çÕØ“Ÿ—E™OqUœyíeÚ»‘ò†O(ĽÊÃé =T~RhãL:7Ãmò÷.±ÝÇ+äõWœ„—%bf¡Éã¦HsŠ îÇþirˆ"؃‰AI›@NÂ湼ɉÖµ§ vã ¶£ fA–p¨]L’ôkÝ?ÍMÌH8ÊèóPPN¨h:`ÓQ FÂ<‹+u…jãh™á:qéÖ&]¦‚qÞ{:¸uÙ9s2ª¸gÆ>ñZ—õÀ~®&ˆ˜añ[´!Å»ä ¦Ðà].{xº<¦aÜye]ÆIp‹nÁ)ž-Ì®DRÖt"$ ¡ox…pðéÊÀ + Ê¢?ß^üﯟ‰þÝ3ÎÃWÎæ«‹ùl‹§™Jýìsغ‚ëmXÉröÇÅ¿èµÀƒ³”CöD_Í$—ÀÌ1Ì‚kÞVŸP6D°4ýSº£‡ærÇéz mQŒÃ}7Î@>ׇxð™d©OwXhˆ òdÁÊÎ K³è ‘qà}!¦ *m=Kåa–9göë|"‡ý*[Á”Ö¤²< ²9.PÁ-ÈcyãGŒ¢¦X¼¾ iþ’æ÷ÂY•­ò×—ì¦ÚÎ˼˜ Ö~iãú"k3Ö~]ÃzÕ^þ°kAﲓ-˜ô—è¯øK§L‰#âRf!%ï÷dR'ŸÈ|¯Õ£ÇÊ¢i__¾Ç·§ïe7PÝ@wsysÈCgé<é%-˜S1_ê^R)s\}/ eîóÒ»ÎKÙ{é,'½¤$2Ö怗ä3$>ëò ¾ºÙ…{,>]þ¤¹R³Ô ’n™ Éâ—¤ÇóYôZˆ”½ð]9›CÿP§Å!ÊBÑjüR?­f8€zÁéwiä-¢(€–5  äm ÜíSz¿p`¶ÞÓwXpâ¼G£Ú*ç Xò®X,ò —:ù­ÊiÇ&Ï@w• b¼º„jåÔ„#ÀÁÉð즘G`„›nc€”0© ó 2|óÅP#ñQ_˜4õ W+çM·Œ¥½æi@qH©êêzTËFP[,"2-°rÍîºÉ´ˆ5^6DÀŠ®`9û§~w=Ô0ɲTQÍ[¢7yw„ÒÖ‡•΋}Ø4ÆÁHAh9Q„7ðœRK¡,þ¶—Å’”ŠªamH;>„‹ŠQÉg›‡ Þÿr‰]Ä5ê´åcìhü¸-UÝ´eèÛ5–¡(ð.ÖÏ;-—`(vS†] T´7&]½õÔ®ž“æšÎ18 ‘Æå-R‚ý>‰?Éè³€ ÚB ôÍ0öÀ>k]òS]5púÚC ?ì+ƒ Ýb—/F!|ì ØA@@ípë!a‰oƒÚUŠ9ùÐ~º»¹UAal¼zIr=™ÅÞgI¥Ø 8ŠÙ1ÑzxÓ_ð*Ìb¿Î8*yµ+÷ ‰ÏA#ÿWØ~† “sàveSömPûHâ)¨ý úŠÐ•Iá.# eGè=?⑳4œô‰‘Œ {+ý ‰ÏºUCÏÇãgÈŸ4WkæÍQ8®4¼?½(ñϢת./ý‹žŒóYôo0°°‡ëŠ9ÔÚŒ+_alàÍ*XžGJ׸oš"`L\FXlsêþJ7>´ˆà Pm‡Ÿ4hËð×H4Û;À›í6¶sÐÛÎÿØö\GÀ…zÃAy V¯«‡®­Œøy +ã©‚}f4ÿ#NÔÐú.ç+¬,è÷=fûXÒ(îº~ªöSݸŸê’ì.ÂÝ1‡¿BÄ㯠$+n¾s®ÿö–ÈÁdŸ,°j(‰ÔÁ{ľé.­VÙ~Ÿ6ËlÝ·î½Ä8ü´Ex‰SrÒ7uŒ„M<0 "ÌÅoQ‘)¡+²®eŽKæ«õº, ã$„~—Qîøÿ+Föíø L;îý_[­(ŒSC‘Úäiè)È…-Û¦#ŒþbÂc„ûÝŸÚqí„ÄÜ¡b#–„©S»Sú˜®ºÜAßÿùç;ÌãÑæßëWZ‹ph–)a³JG» wþíO= endstream endobj 699 0 obj << /Length 2234 /Filter /FlateDecode >> stream xÚµZMoë6ÝçW^Éè„á÷Ç é¢˜vТE;¯Y Ðt¡g+‰YöØÊKóï{)’¶”GÓ¶¢ÙX”,òÜ{È{y®$œ=e8û÷öÇÿ]8âŒdS¤5Ï&ˆq•-VWü‰³%üùS†3:{ín]e„h„4ëì÷«ÿ\}wuóƒ„102Øìþ1£T"ÉI&A\°ì~™ý‘ß¿®çׂŠ|YíÚªY´ó?ïºùþîõT:p»ëò€1æß¸ûÞ!`¤„ ÷ýè^­—e½³·_}ßó)¨¾õùak.iD„I3ŠŒ6_ Á A”êˇèf2È(%­ûZ! -iâD9È׎ŒÇar“ˆ)%F_8Äq£5GŠhg4M­)’Z¤5‚5v|!,“ 1owU[n‹¶Ü¹eS-ïf¿Ã¥Oö™}ûµI{F™%A D°q± ê D’EBRôàíkY==·à?Áwü ‚r[}&3ÇÉc±ªê·»ÙS±ZßTͽ¨7ÏÅÝ …ûã ¾.·>J–”‡Ùã ²$CœX£YfNóÕÇ\oÚjUíJäÝ+wÞÿ Ps7Èûóýî{cj=28J‘è™+‰3ÏZO}ÀÛ¿ R¾^Žu”÷peÂQÎ ƒÊSÔJ¬Ïðµy[5»¶hå!y| ÑP5U‹¾õKy7#ÏnR|Œ20J “° 8ëT‚ÆSzFz1BèBFÙ%ä‡ÆÔ™§ŒPØÔ4„ô!cŒˆ#ø#cì‹Vˆ½Î:“ „À&!é4Œô1cŒ°1kd”CJ’\Å ?'p‚,|Nú 1NøNFãD—|ž# =) ôåâcœxi6½½Ùk³„ÇãàãÈØ($!F…6ˆ€µPÐqÜj¡ûÐ",e5(E'‘ÐФ„¦)É3Τ( .µ œ…ByŽæ ×ÐtR =Âú([ 55ž­„BÒzd=ý‰èqG9}ŽâRˆ3 ÏZQ}ÄsTô䨧¼ïiB4 N #±Iv¿hl÷“³Llã,Œ’”˜ð4%¡£ BÄ4¤ôAc¤¨Q¤Œ²0J hPع<) í((ìbš‚k#EÇH9%§ÇY%…p¨Ý|ýCâQ Ješšk#ÅŒZ)£,Œ’:”)¯¥hJ=‘M#¨˜ÑÊPÔ£ ŒQÂA¨*é5MÈKnRŒN"¨ ç êqðQµFÆ.M(S®%2BDO_<Äq£•MÕï4¡$¹:2¹ï‡9ê#ÞnŠm[µÕº)ëruX¼¿Áåýóت.QS¬`õ¢›æeQ—Õ‚ ö¯Öÿ¿,Úµoø¿iSji„ QÊdŸ²„œäRA,™I¢}z»ªþj_¶å³ä· ù¸ÓO44XhðÐÉøgs”&a`†P”\€‹œLCSôM?š’4M£lŽÓ„A®øÂŠ&ä(çg@ž€}ÄÛ›A¦\¾?ê/‡MwŸ&uÊ_0]ª¥ÉK‡8n5³¯QƒêIHAÎ΀ð©}§ö‰±Í ÂFÞ6Ïo«:6ˆò=½‹õjc¶k¬™Ã1:%×0ÝŒ™¡!¿:“ÿÙ¥Óð %ñ¯:g!?Pÿ’´×i˜4 óàý—{ë—vóÒ"«Çîfö׊²YÌL¾±ƒošB²üÞ ¬Ä|UTk¹!]Ûæ€Ú¾|êþxtÇßžÝ"y7Ap¥hŠúmWí|t{¤ÁZx­êÚ­„Ï]L[X8Xs£á¡ÜÃomðìë݉Bq¤¡À °?Ø7Œ©ŒŒ¤!©|L%Ajv;¯àökå.¤,&Â5°çq5ÄmA$Åæ‘¶‚Íé@Izš=Ö½¦“xa刔ì,ölÁA`éO‚Ë$Ò‚qwmÑîbôA½¡ä!Rá iIuý‘ý¼^·»v[l Ú–›ºZØ­8¡¤¸½…]$ÿôÒÄfÔ„ìw¤ÃÐÑ]æû5Ó»’›Ì×[×èvNÛh «“üÚ…3å°:™A8ÃV ªÝV‹~PÛ}6â:Û÷µ¹m€ë.ÔC’8Aº§ÏqnFq¾}i­X«¥}OÜ<ÅÙÆöÝG?rÊCn³‰î³–mòpy ®»àd4FlŽˆHîç(X3F@¼ÒýuÒF.‹¾hbÔ†Òw¢)$k˜—¬‡ôfDDðÉäÉðmçMÍ¿µªzA endstream endobj 706 0 obj << /Length 2206 /Filter /FlateDecode >> stream xÚµXKsã6¾ûW¨|¢ª" ñ"Á­šÃNvòØLR›±«²U“9Àd1C‘ Æq•üv£AJ”içáÙ‹4€F£ñõ× ¥‹ÛEºøú"=û¾¹¾xõ•Ö ÎY¡µX\o\¤L)½ÈSθ2‹ëÍâCò³àéòãõ¿Ç…°JLVq–§ †ÂôC[ÖžýÒ55ó­]»×—÷®{ðmïêæa»ä‰­:w‰_}%ŠSEBp¦òA[®4ÉvK‘'÷ß¿[®¤É]YUÔÂpÈS×ï5\·Bå‹UT·â •‘R_î­wœ™&¾u®ûÛzXž&ë¦m]wX®@uSoÊú–äUs[•Ÿ–Â$®*w Œ›¤ ³6Ͱ5êUEòÛR«Ä¶eÓÇ‘}œè*êÐ de:µ¯µ{ç]‹ë Јg+x²Çsö•/•£‘ÎÛ[×Ñh³%®Ãc¾ljZ2aíº›ñ×»2nÓŽA6cVß¹mÆ‹Ì$Û¦¥Æ¾©Kß´ÁC"Ëi€ÍnÁ‡õÐ<üŽÃ¶¶Õ}WÆá»«Çe£Q©I*ÛÂAnÝœUë-X-²¤sŽuÒ ´W¥+ Ò—@{ÕOBš)Ëù ¤ÏO!-r!­Hc—<– ºPÄ B7`;êbá d–üœê4À;~KµçÐòÝùˆî|D7(ã4 ñˆß=†ÁˆG” xÄv¸ð°oÔcD¦3±€'Loß U"„. AÌGb›d)2IC’ ÐÞ6°¬¥ö£fp)mG1,”ˆàƒ#bQLˆÅÖ#Äâd@ì­£ñ¿Pýwª|Ý´¶^¼¾´o,bÔ¾{ýpõ ÀôÏ4W&ùÒVë¾´Á=Hp(r ž#0•LiËŽúa¬‡I‡ñb럆iƒˆ’n`k‰ÀŽd@„ˆˆc`ÍÑhm‹îÀÆû¯/@§Ð/äãÈ@ÃïÞ/áÞ¯Içs*²G*hM ;ø^}ó‡:”˜Ó™n$ :-Õ®‹Ç>ñã !¦| ‘¿L Ñ×Õ1 €C[ÛAÖ Qߌ²€wÔó;[Çñ]ÝœDy¬v 1€:òC‹7l^oæCo«êžN‰áë~+7¸ƒÚž ÉÜKÈh`G6tLc(u7ö¦¬J_Ò ¤‡@~œ¯§L£ÉʘMÒÄmˆ¥ ½¬=¢€¹[‚ "‘v.Îüg]våžÎ¸„šÁF¥>j¬¿ËD¤œ“(æJ¬†í­›eÃ5ènjäZ,|r“¼ƒd® jØZ ¶|ا2å–¾uCßé}vt£´b¤/\¿ä2ׂ{·Á2Èd"͈ì#4"7ʶÇÚ äý@ˆ§4ŠQnŽQdD ¤6‚ó_áÈâoqä¯}é<¥ï'(ÑdŒ‹Ó2Tyò¾ÇHj’½±[Öô z©9–{Ô ù"ìsf—1LÉ©]`ÖœIZ3™›DB,+EÁ ¡¦˜ ÎîÑËz¨š‚Å“è`ûÎQ3I 50LÚ;Àë= [–µt­D.8£íëÉ=É‘òŸ¹sX-‹Begß¿Á&qKÅJZÁLkzè= )æ‹@Q·˜ã!í*)Au\°=› ¥Íê¬r§(1É,¥u@.¢;TÅ"NêœzcÛr2îÿŸ×é>ØzçÖŸž….$ðb’Îó<0‰Rid¡®ÆÂåÊ¥8’ŽÅj&,Çj†ÒzÜfê7çÃ[*›>ÙÒñÉ–Ž˜K÷‰ùàS|” 1˜ÚFQ3<Í€¹j÷ÃÌð>‚V·s¯hTÓxÑ–ÊèÙê.äG#QNõTr÷ޤw¥ÇœjÄP*JÀ²[÷Cñ)` Žãâô=â $£Ò»3ÑØ´û¦p …þSå'ønæQ BwDŒþ\'WÎ{¼¬9bÑ)ПE$‹Ü“²tŸÊCG›zz$Êø ^õ´ý·±Â*cgoì¡N¦¬ Q·.ñ’C™€Á4ÔêÓZ¥khD‰‘caÎõCՃݑgIòIàH¡ÞzäŒç‘ ˘˜ó™â,-²Á¾94À÷szµdY1újÝì1ËÂ=ÕpÉéJÏý»*Ë $ÁxýôÖƒgDnYÇTIOz4ÏÝpj˜8権¹g©CB63SsC©äÆOàƒuì5$ón×ôÕ†L ²b°«n0Æèm¨$ ¶‹äq&§A7è¶©ªPAÝõ½ìºPól0ƒìçÿ•J%Ö9áT. Œ¿ò¶ ¸ÒF…·÷0ò/¢Y(»¹û[ J'N fÍ™ á• x6Ý(ÁTö²tS3ôëð„ÝëËÿΧšT1mäiMOýúð8‰˜ião 2ÁÏû1‘F÷…ÿºˆ*F÷…¨ˆ\¢ÿ0ÉB\ó¢coËʱÚî øV¾½¾øõ™ŸyBè½\@—f±Þ_|ø˜.60$Îdawaê~˪ÅÕÅñ¯V1ý¯Ó0£MÐÅ¥™ÿñ¦ÀLÅçÙRi¦aÊdKôü̦yÊ ™žmsÅ2qvRôõ埀:¼˜!×`æ•*YÛn– á\¢Ègâ<Ä÷l¾ÃÊ{LøW–1×áFÖÇ¿%ÀªÈòieíÛò¦^@ñ»ÇºÐc²†´Ïf9ÚÙx´'–ÚJ1Sˆú]0Ô‚º²B>ƒ0£™Øù,›š‚鼘n:1 >-Äç9«äØùÙYc³„Ž©d¼üá-}¼ûÝS KÍ*Þr¨aЖuüóê¸ ¨”ЧÅP,]~xûÓ·_~G¤†/n{öl ðÐdÆŒ ÅŠOæ€ûþø¼‡u endstream endobj 713 0 obj << /Length 2118 /Filter /FlateDecode >> stream xÚµÛnÛFöÝ_Aèe% snN/¦NÚ´ ºŽî")°”DYÜ¥H•—$üñ=gfHŠ2EÇvú¹Ÿ9÷ËÐ÷®=ß{uæµ?,ÎÎ_JéQJ´”Ì[l<Ê|"„ô”O ¡·X{¦õg,^·áë¢Dù–Ìö|_%»¤ŒIUÄñÅä&.'·“ª¨ch²|2£ÓÛÉ&JËx‚@Ï_2}‹qM4 `d6§ÓÅ6žÍãÓ²ŠŠ*É®qĦxBñæÍ¹9@A`OWù~6gjš§ùõÍl.„?JÛ®ã>Y¼¶Ãå ¶ÝX„Žˆc‚Š5%YR‘æÚcäŸ,l·º«ª¼¹q‰í á’»ÿ£/ý¼°ý,¯`Hí Ì[¼ 4”„S9›sLwÑGjZmc;&ÿGââ4Ùæ–æ»¶«›:[UIž‘c ÷ôbnD,Íp¯¯¢²aGGÅj{1ɲ4¡ÜF²a5 ’¥Ã5ŠN³M‘÷s®Ø±tqÊÜÔnqLp~•gëzU!·qº.玛îËOÙˆøÚòæíÛŸ-/Q:›¨4bùή½ûíÊvp-²Û–IeçÊ4G$>¾vnY»Å]^8E«U]D`UlŽ“¹ÛŸ5R5 >P¥•ÒåâìÏ3 ¼ñ=êQŸ‘0 {”Ü[íÎ>üá{kX{íù„qŸÍΧ5QŠC7õÞýËš |¢}Mñù!á–O$c–—_¢Ý>”%“Ó|cÛÿó ßÿaÇ«|·YfÕ]¹Ä@Œà!œø!÷¤ALl †ï1¢C}„,ØæƒA6ñÀ“D+ —BEô¤ݱ,¢CbiPªƒpü¾è–#(?Äi”Áyø>µH³¤CF¤Rã7j‚ZsR—¨À´ç³Fmþy÷ò–ÜG]>H®:¸š«¾âF:b7”*¢ØÑ…Ï’ ‚U¶r–“¬/& :qƒ&Š\L–à|ÿç¦B§ švå#åb„e'`_Áúb„_ÁSùÅ8’÷/lâF†ó1ý¾ ±òàn9B¬|*±!^øìük,A~J…"!wÁ-¡THúìI®êñ :, žQþ$ÿxM4Ec x)Žâ)§½,¦sLX„$ |(Ñ|Z›øQHVqiw÷A+ˆÔ~»Ã/¤ tŠ1xm5”TA§!}cÆ1B¼.£6c‚t£sZ8Âpo2•!„58=5‚pÿr….RöÆtÆtÕ^¸ºlÇδyì&O]ZÕ&hè/ó¬üþžÜU*¢uÉkø¨äu—¯ãôbòúE !mý%ôáû2¤æ+&·ÃM~úå?¡„‰Å[Í¡yµ¸‚ïª.«|7˜âúý,~Ó&~Hc½Jã¼JÖŽöuTE .m%„2YÇ›¨Nß’r°vQô¯­]ŠCÈ0¾@téö0P°qTb9Æüú ˆýý9~_/ð}S]]¾·Œù1ºÙæ› LþøâM]A{e'/ö¶}¿0H³ävòCš—õ.`à›hgÚçÂøég€ýþ³é½_¶¬Ž¢Aú88&ÖY2ÛÍ|ïÞh—dù²ï¹©cal3œ7TwàHïlÙ8{Gvù÷¿2´aè‹ÓìM’ÆY´;õÌ I§ªøØ$©šþ¾…˜4@>µy Á^âfV­»';ñ9©¶ƒîÒÁò–£® TNœ¾‚B¯óeŽÀ!XR)uÿAÊ= aÇ3=TüÞjzjú³œ½NÜCD·Û^@ï†E‰ª! xl{bf–FwÀ(ákßKb·Òya$2­Ämp"Mí(r«€KRØî¦h¶;X i%ìIÒdY$5X/—(l›X@÷74Çço~µ#$Äö¬fÙ¾5|™tžgv2nKp`²'h˺ͰdËÙ÷`^« Þì ûænÝde6Àì·ö’Nwé¹»«<ÿ7%“¿Û¶Úò´(î¾ëÞNL,<ù®Ë ;05Á9Fz"Š@€ã\}Eñ‰íCa”­an-R³a!h1´±fÞ¤ àȘ» Ä”>ðí¥È³ô‚Ž ´eœ]06†#kP¡Ó´>8;ÞGkò¡áÓä\•Õ§G¾à:U%Øh¾ §­¤!·ôÔà;ŸwÂ+]® iù·c2æÁZŠ3(ÿhx”9žT?Ù=fc0È8(éDp7!B¯@y«Oàm:}ˆ)þ ‰²2Am:7]ë«‹Ò†pØàœ)0°ß£Iè¼ÐOÒ$«@Ÿ¢´ÖÅIØå€è´s JðªÈQ+óütŸŒA1µOïs-ܼêÜ/[%ô°l!Â6²UMP¹h _ì±:OÄ WÁ‘':%r,ŸÝo÷‹Âpˆž.ž|šIˆ  ¾*˜¼ˆJáÍE$¸— Áz›.g¨Ôi endstream endobj 717 0 obj << /Length 2323 /Filter /FlateDecode >> stream xÚ­ZKoãȾûWº„¬v¿Àx °‡ì ØÃΡ(Ú&"‰6IÅ3ÁüøT?(‘r‹KžƒH6›UÕ_WUW}œ<&8ùrÃõﳋëÏÔ$„ #Mf ¡qÎ… "\'³EòGz·¾œrBÓrÝ´Ù:/üSõ`¯,Í.ÿœýóú3|ß“càV ÐâÔY[¬²¶.ó¢ñ³‡Z•F îÂì¼Z=_N©J«u±¾„kë¾>uÐyÕ_f¿[êÞ8MóMÓV+«)™­Un8¬Lz«Ê)XK¸ãÖb¯ÍfÞ´e»iËjÝØ!Îá¢Ó¢½„ßWkMF¹ÉζM¾,ª¶\azÙø—›¦Xø»< óŸ2ûÁ­ ÂD¡cD"Åô»:†H+5‚˜[;cI"†kϚƯ>/a[ÀH¦yÚVþZ¶öÊ`«ýsU/Šº?…¥WUäåWLxþ=¼}*üM],³¶ìVéF@MÄ=øk‡ó%IÔvô+¸) g;]|ËVÏK+J·%`À²²K}…¯rß…„0Ãï–Muu9%F`gcpÍûÞwÌW CTˆ1_%’ Øì&Ü9dàN¦Y bç›6j…5 ¹ç¨Õs[®Ê¦@¯EùøÔ6·ß‹æz]E]‚sdÈvÌEñm–­õ`i=3¢Vp$é>: ™"†yO0à=唦ÿxˆ‰¤a¹µ#¶‚¸†0ÛZre#ĹÕ:ø²0“ág¯Óés]ͳy¹,ÛÒûšrTµíô»-jìü¤nB‘åöÕ“rûÿÍÏð‘ wªš¢õ7Þ™ýlpdç0n`QØÈXClEÙtÁl,‚ïJ:¸’¶®d_uQᾸÙd6bü± ¹òÓ^Ëårþ¡€8[…8‡Ñ‡òbÐf,²6sñsq?»x¹ `0NHB0EZóD@r¦D'ùêâ?q²€—°&ÄŒN^ÝÔU–›°–ÉoÿòÇŠlˆÛ\#‘ýJ!B<÷]H ‹¥½þ»~ñc6Æ,&í[#9fˆ`s‚‘ý…‚ãi28à˜œPd´y#ÃiG©~·“‰@FÁ eS‘rg•PQN_Û›`²Ô.j„ÓD‰Ã6¿WÄa£%AÖæŒ¦#FC yD#Ä:xÎa‚T¯èžÎ›Aêv®S.n'¿þB&ÁÉöSÑrÑäo·êÀ9ÉÔ(8¢g(‡8Ãä1ëp(X­‡*ovµ[‡Ë–UuÐíÄMý1”Ãïí»“ë1 N2; ‡#A‡ÁG€b®ÏŠc$™꼂ËAp÷év« €Ü}±O¢{šÝNàP OŸfý™ŸÂÌQ¼N²>Š”xL1o»Á‹þ„F‚{U__Ì«èЫ Dß¾ºö7 ÐûÍ¢C{ÖÊ1t@6ÿ¨£GðaC|~¿ûrˆ,‹BUœ’ܦF €5)FÏâKÏ}7×ýü<¶ä“,ˆ®ÃPÈ€zdÉp5BuŒž.bg(ÍYÈé"¶åˆPã" ÄE‚³a½ÇÈ ˜Ò¸4ði(Ö5’ˆÇH¿ØÈ®ò/^6uñš„¡\ÁúÝŠo¾ñ3\ÛXc15Ðß SˆL"U(>wõ>”À»0µO®®‡—qb<[°u¨l…8k­2×'Zmí´E¨Ò«ehn¡û 飵 zå¿:Gî8°O ÛHÆc – M5äWJðþgƒeÁ­ÂÛ®vžAšv »dWó«üj1‰÷lºßêy‚&Fi@gºc4²é"& ú?®v“ÕCñËâǬi›bC¯¨"2ý%ûkñ:ÎG:YƒÆ«ÙÔ^PgmwW4a°'Ód~:‡†ï6!«».ŠÛNûŽÙõ[ÈÓl½ðcëÊ_›ç,â½»eõ4ÖfyëXêºt·Ùà’E Ñ‘ÝöûvÎf‡}.VÏ%dælùÃL?6 ÿ¸œílWåÿЏPð6¥¶Üì†f:ý kâ’  uûÓ}5Áí¸æÐ>×–?‚Ý\ØšVû*¯6>xÊõ£qm¬äýdeC\ûާ´WOzåàžÃì½sí¿¶éÀ>e«r]بÒÚ$¹£¸ ìŽÈ–åãzµ#,¥ç³bá`©£Õ¡ ˆ‡æPͳ> ?7&} `­½ÒŽ_°÷Á8±åÛ¦ˆ[8¬K ¬ãéÊrމpü($“ƒ+‘ ŒÚ[‡sŸèÔtJì-1aÉÒzºcMœ‡Tj¨­÷}×~×Ȧ¬Ç)YmÕzùÝ넬iV.;lŒF†ê!Ï”Í-Q! ‡Ô\Ûö&/Ù—‹Ìš™§—ì€ŸÌû,ŒývÓ8ÿµoVÙ·r\×½[–>“-Ë'ï±ªŽ¹ã!ŒÀUv„fÀȗ߇â8â^(äR(@5'!Å„bjgRa ÛÏGG.Øèá(x8Eˆ2;2J¡0ZîΙwp§°8…07oáÝQ¨ ¢PáÀê ³C*ÔRŸF¡ê>…ʧPùEJÍ>[jßul©½uäý-õ±Ê´TÃØp*–½jŸ|NÊ[ÿÖ|nÖËôÎëÒú»x€½XzÎw%|í9W,·bü߬øðI?{`¹;¡q`Y#Ñs¨$ë®*½ûvœ«êq®rsÕQÎU¾å\Õ1Εb¨2Ù(b œ lŒs¥X#æ„I$©#]»H=N¸2è4$äß÷[ø¶á¡6çëñÇžw‹8Ø*0Wcy”r%®àçôŠï1b4A«£”«ý¨ÔìC(×ΛmŽß÷ŸO¦[O33 Œî9B·õ‚è‹°>[LúFT\ F© Œb£z¶Ž0¬p} 6ê6cø¦C~ ²gÜ}JÄ!€Áöƒ' rŒ0=ÁÀ(¢gßaJø¹xt餯ðæºË'c+å³RMØq:”Ø¿ `}V¾?]ÄÖ M 9‹> stream xÚµ]oÛ8ò=¿BðË*èš%)R$í·@[tqÀáv³¸‡¶À1 %¯$· 3$eKŽâ4ÉÝ‹E ‡Ãùþir“ÐäÃÏ_¯.^¿ÏXÂ1Ròäj0ʉÖ"Q”&trU$ŸRMr"/¿\ýöú=`°#Ôä@Ë£]·¶^m*Wßô›. O‰kA„ÔúªÙî.—K›ÚÕ—ðìÃnÆg–ŒK"¥H–œ–«pöŸ»¾lêî'Ï‘  'F›{„a„sýd !†óec`”)Âê ”Oc³9ã ,ƒØ€öÆP䞟HâA¦%™Q˜æ3-áæ\?¢&CÐuv(ÈŠŸÜùfšÄ¼ï”ÅÛůÿ`‹¿ÍøNÔÀóø™Õ€q“Ñ€þÙ¹xâ†0=½ïMYw=ÈƒÜ1¼îçÂ×ç4òtþfÕ¡Fì‰3êPœP¥3@ñ¨FÔ#áç'³²ç‚HÊ#òŒìùÜø#®0¾oNðlÞB<«“§s8«9b0?£ùR… ©a|á›×“ÜpN\ù¿W(’e2ܮΈ+$É(I‰#œdL¼¤ö½€ÄÐj vž4aDŠlÚkÌwÁ|BvÁùã]pWö®µ½›í€¥!Z²§vÀP^PÓøšH¡EêƒzG¯(ÜgÊD \øW«Êv’ùn A­«l_~EZñ(2?Åéö×]_ö{칡¿4T¥û°µ±ñ†NìVilS£Û®›ªjø·²¾‰ÍêS{wñ¬Þý«­öîí³½k®H®–øZnLn\ëfML ;b?H4„35 a·Íµñªñ‹©®2ÖlÄñÚÇÕ»úãyCÓX¸iãTÀÀÓ©4Su·®úM]î­Nâ,aÏåt(úûì ¾&ÕN=•Zj¢äÔ§=àÓðìQˆ,½q5P¨*á6@ÊzUí ×…7;ËÔ èûÚß\y³égy¹"¢«Üvr{¿{m|ñ*Ò©Cu–&A,PŠ2ÔÉ å')ÅÓ]Û\Ûë²*ûr…,-Ê®o‘Èu4 1hýpnjuDi1TA™KÐlÄYMáô8_/¥LmYÙë*¢Ç€ 8èã8‹\vû! Å'ò#À¶îÿ=+¯í¶¬nß.nìvkïü﫲þz·nºHüÀÉa cùt޼ïPù€â‰ÏÆŸ"b+ï´K)At€°rÑàyeïd²öV=˜T0ò cÁ¤8Iš°‚Ão–ñé‡l¬ €k‘„ ¸lÕº>Rùà ®^κìñÚÛKÍçUÅsûò‰ªÐ³ m(g3êÊdÕ•3OЉ'ÃVÈV¸·m¼t…«Â{ÉØ€¸-¿÷û6â‚>½ú5-? ·¨n ê@ \Yc`@!kK{lÀÁÄÔ¬ÏTÒ~ã“.l”“§ÿ°õIÖŸ)¥¯>„#ã@€áçèpߣzÁqGùfÊš—N)/:^©cºÁ—"lºx¤núphß¹°݆ímíÖ…U­÷õjÈ/þ“M ëÀsʃOù­“<ëÐÐQ†•Eå àIJ™±P±‹ðO1% Û´7IXüþáçu=Iù2¨4ÏÒ?ëµF°’©íg|Ñ‘ ;ò1#Êf2z‡ÜS€o¬šö^ýCÈ@í]½*‡£>žÃÉn8‹5ò@ºuaQ”­[õÕí+ ÷ØÁOpP›×m³ « TX¶· |ù÷ß›²ŠÐQ¦†7»ƒ²bǯī ØyO¯ndÛ´‘øòlrØí{‹ …:‹gr ^²µC+¯Ôõ°ra±0¬$õ_#ôÕG4_x?z8K™´ìÃF³î]$ ’øV± žpgC-êʛڗÝUŒdÏ+l\‡²Üûâ¿h"Þñ[¥á~øº©¢ŠÏ¶e¬RK½}^i³Õnc}+¹wwÃð[Ì3À0rÔWJªÏô•æ >iYgë$JÊÆ}¥P¡„øþÂV¸bit}ȉÇÚ^Ëû-þÆtÑÝ LJé©™þìÜÐÒû›´Œa¡M€…ò;¿¸‰Õ 77vw¨v°³ZuLãp´ƒŽe…±4ã6!ïƒffË]& ÏN¿×³ÕFÜ\¾Æ‹|VH>#ñ5$(3‰rÇ(ÏÌpФ…Oõ6¼ŒR¥ž»&èÙP"ž–Ú}ïÇQH•?îÊâeÿhDŸ¾uÝþ¡qW7wk‹ÝùCfœviK%3ÿ? ’Ã?bË‹‹‰ù³Ø@eÙ¨ñŠÔæJ¿ÿ×bZ²xJP> stream xÚÍZÑnã¶}÷Wð±}¸‡rÈ"(°m±·Z ØÝ ô6Ø'Ñf&V`;½Ý¿ïÙ ,ËN,[îCV”LQ‡gÎ gÈ-Ñ8“ޏ8SôNŒ÷×b‚¦à"Î †I{%à ÝÐŽIp%“ŠLy“}ƽ˜’´¿àÏECè@.êŒFÁOHžCÁi£âPðžDÑa³¡äý$yŒ•ú`p¼„qв" l¼K §õ[¬?‘ñŠ>FÂÈ!Ï™<æÇˆQÇñÉxñú^Ï“_ŠˆÙ; .c@ö&4ú$4DŸd°$8ñ$1~Š .aÚA0á£A²öA#{ý oå9‚X§#ÌྣáÀú¸fÁL›AÒ$EA#aPÏí€x“sN ’ ü£dqQz%˜H˜S‚ý¢OÚ ÙiÖ‹ Œ5#…I†ÎìǬ”bb cÅ¢FÉ^e¡ e Ü$EOƇÙéÄ’€)ÁV“¤ ¾NjàL¸Ë:f™J0âœ*ˆŒ(Ç ¤‹OúÄiµQ²†6Eÿ¢óª4X&2%¢#hDí)˜›ˆhg X@¦à…츠L&ý”™a0ÐíÃ&3¾.*âH2Ì$«­p3FD}t@î\¢vÆëEÑQ2…HÙ¯‚ LY HØx¼7…ƒ›\\LªÌe>gÞ™ê·ÿþ¯ð6ƒI`±!3¼»û8ùöÛýc°ú1ï¢uÖéü¶™¯ÌÅ…©Þzîæµ·`†`}5³Ä§_H…¾¹jOïDèXÖ7Ð_Ìëwð¥ê×Esý¾^™KSýúÃ[S}¨ÿZ™g¾<Ôøaz[Oªï¨ž¯–ÐMÖ×'Õ»zÙ<.®ëeJÚG¿Ô7³éwÍ_æÒáA,ÑzH.3Ù\>âkÓ†ÀóõÛ¼È6‰Ô’‰ØEöI”>ãB Ó…ã:Gf ÍŒw¨.j¶1¨@(^·ó+ÒÛ×Ù :g.½-/>U`kåvæÝ¹ •1æ)Úˆ©ØA '°A×âk»òOI ñ¾ÂYMHÄj¾á=¢#õ)d‘ìq=[Õ¶¹›ý9¥²+4O„¶ÝÙG±ö!ÈQëD'æZNÖQéëHÎÔ‘_ûŠf‚‡utÈfôl3Duëáeä­&o5ð>Y¤CŸUЊ zsqÑ~ zs½š5óê}õŸw?éßWŸW«‡oªêvÑ<>,ímÓÜB[×ÍýúIõðùËýÝ¿>5‹Çû¯Èíu¬k )ÙzËüI ‚÷þa°­ÈòEæ¡o_ç'–#ûrëìʹ çDÔ—+x?ž÷„~ú¥O‰CÏ{ÒÆ{âyQ¸‰×R@UfE4af›R{]s}:¿Lç·…¯F\íëŒÀ¾X¬ü¨íà"ZA!ó(%ìEò㧦Yásµ¥ÝH†d›aH¶¹¯3 $ŒL¯töÎfTÜ„NË«3SS­;ÃÞ2a;iÕÊ”Ÿn´ägß@‘¼Ò'ëœû«Ë™:çÍ*ÁiL³ÀP¨š9d䳸ædU\é-¿¢ò<^¾ñ´`Á²Ji„Ú›ƒØX^rû8›ß4sÇ»:ç!ñ÷ÄÖ„¬:£ú=&å8ª=UL±/¦x®˜â&u¼¹nÄGWàbuó‰ V?ð¨m«~A ‡­zSßΧsWFLhÁIÀ LRl€í|ÔßBó"‡¡\ÕËÕx0‚‹k}o`*íþ*Œåª¾CãNÒ3 †»©Ž€1]¬®êi—u¡x¬¿³»Ó‰á‡Ã¶nÅ¥óœ+õ3’tRF²EE²Ä¦}{4™|Ž'ð¶z†“x8û;•^á½âÏŒ]²F®ÛÀc–ÝpA¨M¨|+‘/IËmä—l9Ľ.±|¼ZÖmEbs7ÓXy¨ÆGTÂ8EÚ¼¾ÄvCßÇÁåP=·ÿ›ý1{PŠm³¸­ô®úí—ŸwŠ ”Úí¼Ùì%°„Êdø"ÙÙ@ì qv4ÜYX·+˜ÎžïÛ¼Ò rnT9/@žðVÂÚ™ý(;³9ô¨È4ˆŠ5šmÎnLÏÕ±=v8dÄ)´žË(”„é çn;oêïf?¢½F·J?'Ìr®UÒ¨ñEžjqçtóV¢¨gul] ×ãi/£ÏC2ú¼o&’e’áÖëF®NH:¸úŽmñÒ_I‹?Óâ…FÝ2)J/Ö.¶ÙûöhÔ õT"½°e|?]-빓]{—ð쀥ï€å$Üžð—=Žãqu_IƒÜ*;„uV˜-övHî&¦ÕÅßææDÆÅõŽõÄû, X=^__Øá±…H&,D‚šSĺh"kÎôB‘5Ï–³ûæÏ)ш•§Æc¿'0![h—FD#¡¥â L.¯ƒY~”›él1-»gLú¿&ŽvŸÎ€p" .[>R÷§Jz9—+õ5$!7î*Ï6n+ýúT™}»Ï“_8©¤1·Ç‘* Œ=!(¨˜ ƒ Š ?@>ÝÎOg<PÓ™ò9´P#,é +–¬Ïº;T¤!¼¥}ç]ÁæSÎv¢j”µÇ÷ÒÓ)¼m9¤ßrÄ¿¹¸Æ endstream endobj 729 0 obj << /Length 2406 /Filter /FlateDecode >> stream xÚ½Z[oã¸~ϯPóRX3¼ŠÒ6S Ew[t{™I3Tc3‰P[òHr2æÇï9<”#yÙqŒ>‰âå\>‘<ŸÈ£ÛˆG?Ÿñ矯Ï.ß Á2cdt} É™Ö&²\0¡Óèz}ˆ?JÁ/>]ÿu;FÉÁ(Á,×Ð仯‹òþÍù}¾Ü¸oÕº-VEãç(àò­Ìã”aJ«nà3%lüpçjG݇j45Y×Û+“ª43ÂvÝŠ¥ê¸(éùÓewÆH-»1k ÇÖGñ‰]Ì´ñ¿GrÛ;ÒdbðùBÄEUÒk[¡´h& gО '$§q-ôÒ †;*¬ëj}1“6®ê–d@euƒOï„Lãû £ã¼.rx³qÛ ÕŽ¤Æ-ݼu z£AƒVÚ”Ù,éÜÛNÛ(0iIÚuýpH2¯Õ»©J‘è¡›ë¼ÎW®u5Ø"š0Ý5 &°ÈJ¨¹©«õ!7 °ÈÛœ?rêóeSQ©t_[ê€fW%tl7^Q>ó S!ÑÖE¹Ù…ˆQ¸?ºæ[[CÄ—Õ·° œr£1/¹b\l Â(Õiü ÁÔä;¾ ¬„` € ’iÂÝÇL¶ñòy隦h]Cx!ŒU˜‰²jÿÏpÝÔÎÕ93À àò°=ƒ™RÌÚ>fI&û˜ {„œÊnð> H…ñƒ˜„h@¤2þ맇]*¿½HE v¾;©f±_ÞÂ-a‘’FÅs,Ã0×hÁ2o‹{œƒ®2÷Àc1/"²Ëóª®]f¹\å­·™§Pû²qå¼p ÍÕO×g_Ît㑈—,M5|™Â{óÕÙ‡OŽT–e6™’Á#ɲ4ûN„Γ2}¹ªJ`ÇÈ,ŒLSË$”ŒV b1l!cóØ šúI „´™0ú…"ž7÷S¥Éh9a´’Ìp9­1eI–MÄž°ÌÊWÛ0£È)oÎ߿牜Îû£lõÖ¼L†%CMx/áÌô´Fü Ò ïeÆD:TyU”M›—s÷ä;¸^Ê¢eþô澃óË)D޲oû¿»€ž@D@°§ÉIé«CDƒÈQö" ³a¡4€À3±ö$€ô4Žá¡ŽÁã(óÆðÐYÂ`K"ó’çÑ™f<ÉNÈ@å"úD޳o‘4a ̳ˆ¤h|?}}W®¸½Ã4AÀ†ìáøK·„Üä«bùøæÜoÌ¡n{TË—ë»ÜÓBËG¡ô\/7~+k™æa“L'°²°LÚtßì 0{áê«Ü9Ø—ÕÔFsœ£n'=² ·“4"}}W—!F¦\}¹â¡Ÿ°¼H°ßôô†bÜQÌ3_¹Z†ãÄ@çÕåö<1åí µÙ/á+_sò|…ˆ.%@bZ„JSf< Ór‡¨ñ´ø$ 3!%yïÚ³•™LT¼YÓ3/ñ)á™/Ìó}k³íHÉ Ç’½ jVÅ×vSw/•ψ G wŸ£Á³Ýå â3cŸçÁt“ Ó¼|^W f¾*Ý&ÁPürWÄ«¾¨ðîç3<㦃¼j>ᘌò»/›¢&!Yœ“¬ÏEK…U…æcéáÂ'íÿC–ÈòøOa€'¡ ™È (<¥GøÒ#Õùÿà ì’×^ª*GRÕ9x¯Ý²  TÇH!`Ò¹@O>r¡ËmÓ|™7dÄÚgp5&ÒOY­OÙH0~Bè 7ñ/%ÕmíÚ:6b|ç¦7=[†Êò9jº£Þ.*Þå¡@ð 7˜æûª.A~D<7w(9H@—=—Uyëɨ'a )oÜXîýP@¾^Š!/ <‘ðø—[¥W‚½ 7˜¿ o¥›»¦ÉëÇÐXÑÓgüiìæÅM×âI( \X´ä1ò5Øæã —jÏüu7c(»'U²…ŠžL„'}JJÙ–ç…ÿüú7*`Œ,â™À34»Ž À—Ï~ݲBmTW,—›¦ 9VÜõ[AM3CïáÀæuÇRÐ[˜Ýо®óy[ÌÝÏS#J Ð3¹êÔ/ºS[§IXª²H‰Œ¥6{%5òvûÙîãC68ƒï÷$H¢˜4ú5{Ò‹E<{â“™4݈(žÁ²nNB, t^ýn6#ðßR²7Ãù¼ßn4ƒê+Ñí3Xû g³‰CÆqžbéÃ<ÛKÒ(ÎYj’Ó`Ù×yIsœ-cÞË Sù½DÅ:=E¾Ù×x(EÙ˜L73o'V¼åð:<ÂbÛWxßy„â1GEÖwtât*àHi¥9 á9PzáùbõcÀ‰N½ê_û+Dt™>Š0ÓÔí!Œg'-IXbÂÁö麗Z!i”·])Ü;ò¿h¨rQUVaÄ]NWtèŽ6yRZšÍ* U‰Ü‹5"þ§—ùˆ¼ 6Ô®™çKׄñwn5ƧjæÆÓ’Ú‚‚6¯‰´Å7bœlŸ­ÕÖ“."Þ€WD}½Ã4ª ãzþ¦ä/ 딵u^6 {…t VÐݤpnÇÔíM'¤å`?ÅŠÏùçbY´±Œ"% ëá5›l¯ÙXO/­·¼G£º:oôÀ-BW¢+zk6Ç$<~ŽzEöi8Û'Õ›Ü:¿uOW®ú6‰Š-„ë_Šû²É—á\¸áaˆ°›í:rærxw+ÛZdÑ –½4 K€6ƒN°üŠØÊœ endstream endobj 733 0 obj << /Length 2480 /Filter /FlateDecode >> stream xÚ½ZKÛF¾Ï¯æ kµûI6{ì]6q沈ƒ]Z¢F„)R&)'ðߪ®&EjZœ‡½ ûYUýUu=ZÃg×3>ûÇ÷ߟ®.ž¿Vb&KŒ‘³«ÍLpɬճ˜ &´]­g¿Ï-‹X¼øãêçç¯aÕ`µŒ'ÐrËöiÝæm^•Y‘íhù˜¸ÕLÛ-OËuˆ¦4,‰L·h—iuvŽb,™0ýâUµÛ/–JÌA„rß¶¡M2nZJ©Xkl0Å´ù_{½ùwôpfOÌLäöÉDѾ÷RðÓ=£A3潌›¼ÈX™î²——y¹?´ØÇîeHRa‹“±g‹¥ŽÄüf›ÕYPŠÙXt«GäCÔ­Ó÷ÚË ®ô¼ÝfÔpÛ\«Úàv8¶ãPf¶ HÑ>·^Ɉøa3ž7Ù§CV®bžÑÀ{.tá×½ç†ç%ÿòÏ¿}ó oªz—¶0+¨ßV´æÃb ýæ´L‹Û&[³I5-=æKPtÌŸ¦¨uÚ¦¬½Ýƒ¢Êökš†Ä53Vu{Øb[9ÿmO"¯òÍ- ¨¥ iç·8oçnH ºnʃ–5~eEßþøØÙוëÂ*´ÒÉ0Ò ‚\.`åaUdU›¯=~ÈÌá¸ËËj™®ò5õ)*K̽ ¨†Ç`¬Ÿ„q^¶Y]déçlýòò6k¾¶õ!ûZV_7iÑœ¹ gGÀ-@øÆ•haë3þ|ÜuA(B·%NX¤dG©ãâ©&EQÈBu$çUMšlIªP"a<©ÂÐzDÔ‰—§ÅÐÒ·!$™Ž;–"g…3cá<º?ýí Ì[@‘_—;/Ú}ªÖ–©ä›T]{ÝåMÆZðæ¬Y¥E6T9XÞ”Ö¥JX"Í@íÂH1¿Â£EÖΛɳoÈÖ×™wZ~ëèz€S¼n·èÝb§§Ieç(6ùŸ™×4Œ“sŒý)þDÿ³Œ# ÐŒu3UI«º±ÂÖç…1àµÊ4zgÝf%uÖù†l‡f.¾Û¤à¤è°%Q–&02ú•_à`÷Gr¦À‘s9[í.~ÿƒÏÖ0n;»q+w3¨«ÜUÌ~»ø•êË“êND!i ¥™•Â+p{»+l!ëàæû°…l6Öj̶øŒ8’)®G7Á\+¿WÍßa˜0{¤¨ŒOJ1Lá{72pž>¶n«C±¦v^®ŠÃÚ¼ìKºj‹[êlªC’EX =[RŸTÇJr(#O‚åПƒ?0–‡âÂÒ(îÉüC– ×÷aÆí†+ùéù‡:ÇÌ §75¥§yÖ1ÇÌÞÌD'°Ïwþ‚fÍà ƒkPZ‡KÚÊ \T×· ¨ÕðÖ ð®îÖãZÍó¯i=ºZÍ=³›mÞŸ)¢à}ÿõºq|ÄÐ* |ôª1¸Zß¡qîrÛ’ºk:næ—•UK p"P =ër£êp½¥‰ìË*£WOx¿Ûqîe‰í*-¹¯^¡ñžsŽÉJ4ÿ›‰GyžbF÷Fÿ&x»Ç<~¨0¢ox“yfÞãbqCé2‘SU€»P‚Aìék¦ûˆ%¶_±tpÝ7@mw](Î!)íéyÓã ˜ýkWÛÖ9$W¾*QàPx !ÕJQD±a¿¢ÁÿùÀ« JµG}¬3—3»÷àÒ†QŒ@AêÑ ½U‘6Ž´ì⟒É a¯îú½ÞQ¥M¼)GB.V1aO|Зt·w¯Hp_¯}ªSRwl,hû‘ç³xðºi©ãUÆ¿†ÀP¿ÐJܯڥk?r²Šl¬[ ÏõLf<¼Ð?†tj$‹wâJœJêøzÏ`J÷)äkql»ŸÊ»0•ˆ©è¾W\É’ã«ÄÛI—¢«P5xÿ 0Œy*éUÍܽRTâ_'ïÜQQL<Týµãü&P£€:6”f¶ˆqÍÚ»›tu?@ Î’h2ë¢X:ŒÒ®hÀFÌÜcfêÉ!2þáèUw¤…ßÿŽR¤hßóñ)¿½+¦æ†%±z‚˜Ã£‚¶@ƒÇ,Žõ >èmr‡„N“Z=šýôÍðqäüdQQ¢$A%Búé„ÓÜ"ÈLüˆíg…‰bZz½ÊóŠänbʈ`+O˜½§ÔÎ\òõËË~X\Òàà÷ö¼Ù¥EñŸ½`å—ÆÏ¿JÌËÃôHÁƒAn¯”/ÔFVà‘§Ù% A9TÑÚ¨1ÏÑþÔ§ï—ŸÀàI‚¡ˆbé (btbâ>Ž·SP$˜@ŒX¾æKLÝ^^^‰gÔ 5.ŸOaó$IƒØ@eŠY€ÔL`I(vÕwÁfÈò6¯;$Bilž$icx4šÀÆàWl†,Ïaó®Câìªkèilž$im˜Ûé'°‚CÃúïÍå9lÞvØ„ÓØ> stream xÚ­ÙrÛFò]_ÁÒK ²8ž  %§*[k;Nín²²ÞâT"G"jA€@ËÚýùíž$GÔa¿pNôô5} ùìvÆgïO¸oÿvuòúÌfB°,Žåìêf&$gZ«YÂ:]-gDª³¹ÊLtk+ÛäåùÙ\ u+‹ÓIT7KÛÕ-mªo¨Åå?¯~}ýO0ŠI#á|z]|í¶µ¥]Óî]tÉ´ýfÜe«3™D]K‡,ë³9 mK˜TuGóë¼ëlÃäl.c8RÉÙ\h Í¬_j„s‡?öË™L#Û]ʈène‘Þ¸§0Ž£õ™ˆð¤4ZÚ’ÖVyKÂ!ôå ¶åM‘_—–æÛ¢³­ÙíƒÔÑ¢nÛnкøKâ €Y”9Œ<þ |õvUoË%ìU"º&úið‰ Ý´ ŠŠZ::eÑ/9A µ­ã 6ãÈ—biØ0¾ QjÃd?Qˆ&a&$Î@{t½;K‘¦ÇµíæjaÏIfJ(ø>Ù%Ü‘$' éþš¯7Žá0›/ˆ '×sZ(nö>kòÎQ5þë¥EîUŽvØ’ûõ›º,ISÚ³“·W'ŸOP#ùLÌ—,Mǫ̃„%ñl±>ùãO>[©,ݹëYfXÆ3è–³'ÿ¦›gÇiáxÊcü2Ê0£%ü¶§/–±“¶¡f9~ ‰E½ÞÔ•­ºCU¦Y,Òç#8¥Q1ž* àâÁg’eivBg‚I™>„c“2³˜eIbKiÂ$ôŒÌXê™$Brñ8K ;MhX¬yçç‚8‚3˜T)iyi‘Aûȉ)3Yö°2 X˽3/Å!½)–oN?^ŠÓŸq¨.AêÁ ÄB&êõ‚HLv „JS,Ú ôÃ)v,Àù[']†Ê´ àºÏ.E(¿Rõ¤ß3&– UK—Ç@Xc+ûHŒi«†R¯>s…=(OÚäDšüF/oƒ(BŒ™ xŸ¤íFS!Œ³”i5¤õZøT]§HT¶›öý܆ Ldñ#œ‰™àfÀ H‘Ji²T±Ë)qòr…‰™ÉS« ØDOÈâ­µ¾,*Kš˜žëæ‡\g!× ‘ I'=mò¦+ ót~á3W´t~‡·eǘL›$6£<0uNÒè÷–FîÿùÜ›FwEYÒW›†¨£…zÛyhMد›²X ^ù¶i\¶{Ö¶mó[Kóyµ¤Ùë¼(`,T÷øÍ±Ð¸ª |HÕ 7ÚmŽ ŽˆºXú¥•;ôÚUÝt‹pZ»R Îõk=€¾ ÔsÈÌU,Ÿ® é ©ðÅ`Ƈ-—X‹8º”€aßW}9lFÙÄøk ':œÍ—ŒvÂJR¿uŽi¹ôÙ4X8ˆp„(¾øð# ÂyôþêU"Ž^‡Ž „ã:*>ç¡ót2\%ÝCs͇ úŠ+GÉl.%Æ[Ê+¼0zzapàë`¾VCs“ŠVK39ª¯VÔVDÇDý¼-,üàŒYêÊïGµÀ•¢ó è#¤Q¿(h¼¦B$–šë¬¯Vø16-èŸ3¶8U·U_Õ¤)WžƒÖÍm¥­» „î µ€/ -Äå-mÜVKÛP—ì;tH^ÐYO —èíöz¬.vE·EaRGÛÖ]-‰t˜ùøû%[›7 ÄqE 7xÁqÁ!3^*hkÝ|cýBW{UÖ·÷X dgóDfN¸›¢d.f0ö›Õýº iŒŠYªâÑ®çþú@T QÄÎíé=äÀz ¦§µ•^q@d@§Ê×®—xÇ54xyyßý'uØC*&’ÁC¶ê-ëõ7@G ¾MWAÚ¼"Y8³–wž6ž1YýŽm>FH4¨4ÐØGUv—F(oÎqvY´›²·¨8Af79'³Ø–yC+mGµ~ø†ö,Ðî®ò&_@4Ø‚,M¦£ŸË¶Æ§‚ѹ\ Ò¼U•¿~Tî ÐÂE;^¾þš£$ü´G~¼û·èRñ´»¢[…«ÖìÜàŸ7‚yÆ$ƒß7é¤f>šžñQ‘½ªÉ t0Û{l@%± H›x,ÜãnH±†¨ ™`à†×4·Ôv~¼Î¿º|ÊÏ®|§,þã0ÊbU{_în<#ÖN÷ï^¾ ˜\l|VÉËÛº¦®q˜‚IpUrè­lã߀ЖfÀ8œS/÷3Eµ,Dnô nÉ¿ ¥þõBFÒ®££¾ kw –¿Èc¬K/(šGyJz½ua¬Ê\$V0Ë΃^Bl-çåh_½9m7M0tMÀ’HµºÎ5¸°ßªòžŽ«+KhP8µèè™#ó¦—G×M^Ñ•¡qi«ÛnÕzâœI½§@>ðRzúà÷’€i/ ¼A¾&-ü¨öXitÜ…&;úGµÔ¹Ÿábœ…Þ‡àuàT$:΢_ìðd³·xþË £¢“ lj•§ÿ§`ªi¯4“~`·ÁøõdBÞåÜ”}HÜ©nöPâ Ñ?ƽj€ÇoÁ=d§ÅŽÁþzÍÖ’¼zX-£?ÏX=h@¤`I<Äx»¨Àÿ’LSA‡€s´2s¡ý x4×.Ÿj:ðWLõ¯EÆÅ²í#†A”NÝ39Æo.º½qñTë³Ýÿ,ýz=죫ºšÿiSÓDc˼ó…ÚÛ?Škí‰ý#ê`šPzý–©Ól&Oè8¼v¥ƒÝE»h,ºe½Çjù°@`"åRÒÁ5°nõœ Ã:ô`ž 0Ð6ò¬÷«»ÿ)ÀG«òBG€‡µ»Œ‰l§r…¬ÿ>ÐÒÐ3Þ 4íÿ3] 3n ÙÜ]òýÉûˆ8üï ¦1øßàclÄC)• §£2SÕ:Ht¬˜éQlÒ©]Q.AÊýz>“¹ŒùÕšÚqx}] ëÇý?“ VgR( §YšúÌ_';{Þ^ü¬„ endstream endobj 743 0 obj << /Length 2492 /Filter /FlateDecode >> stream xÚ­[]oÛ¸}ϯ0òäàÖ4?EjáìÃb› °7ÍÃmq¡ÚL¬…d;’Ò6ÿ~‡"åP)ÍØ²_’"gΜ’C™Â£Ç]Ÿa÷ÿû³éMG„ T:ºL‘R|$1A„«ÑýbôyüíbBåX›¿rüÞ4zajÉx©+.&œ¤ãû¥¶mõ2Ûø#6Y••ºÑ•}¼~°ÍÍÒ=¿ÎÊ 2.3[[äuSåßž›|½²²Õâ͈ ô¯Ö“‹¯÷ÿC&„#΋Õj^Wnx"­¾DóÕUã*Ï kÛçG^¶ôj+ Ñu“·Ð¬½ÐòP­KÛÑ‚Â"k²–ÑR˜¦W@¦G*MDP[ˆ3 ¤É @]èòw;¢ï†I7¤gÛcþÝ€Ö4KÁ ‡uج¥3 ~ýÜØº…=kýô¬WsíºùãªÔ-®ç,°í •ùºªtíˆ\-òÕ£•b<_¸>+ðè‡ÿV MA2 y †­'à‘a̶XךÞK×ǂҵumµ†Jb˜Æt'Ó\ *Õ–é2ÿÙ·FÛëÊöã;ò*'HRÒ‰41 †’dëú›  BÃÛy ^Kf×9ƒµž¯Müš²sǬeÅ45]¿m˜Jîz‹6^Ü`03Dä[jP#]ùjKÅHIÚwöuÝÂæqB¸Ïˆõ{mþK3éš%2Ï>ÞŸ=Fñˆl÷!S$@Õ¼<ûüð ±T~´]KP–‚ cB1útö?»ã$ £§¤µ’*Ä—ðŸ¹çS^nÌR#¨ÿµ|¹½±Å¿»‚þ™µ~ÁÆ$A N‡`ó d+BĄРÁ#ŠR•þ"‚§e‡‹hbÉH Tʤ]£$,iÐ`,#α$ä:ËÁ;Q ’Rì}¨ˆÝ °H šÆ@cÄSט"2;‰`Ø2%éëœm–/eaƒ¦z^å‹Ëóº-äBèÜ>ƒ=sóÜ ‡¼Ð—ç‚lýü÷_!¿’4r$!Äf’ƒÝJåÙCEìÍ%Âf1 y4ç(¡ò8Ï ú³f½YëÇ—˜)šË<Õ"b.ÛC#‰,‡„¦ÔÓ7ËWu“µù›‰UÄ÷Än¾ÊÔ@Šsyþ ÁºxÞ4y™×Ú=zѵ{ð…0!ìpøA¶¨‡>‰°EOÄ–¯¯ÖY5_Â<ßTçÓXpÐÓØJ<Ý2b+9ÖÖnø gÓ}¦9¥6LåR0±K¤;j:TD4d•Û6ÓÝ yªLèiÖ)_çì[SwYèÕc³¬_gð7$¶½ ÃÓg2\ÊZ‰[4G(P{¨Üc6öÖ®òv‘rj»HÅ&ì|A>”ÏG$“âòX>\<ô4Φ½€ˆÙ+Oc¯ä»å‚И¹p2Pò˜i{°ˆÝ u9‰$EgA ZO}ë#)' ‰ô4“Öט´`{tŽB4žØgº€¥Zx•{í«¾ÆÙ´s|ÌÚÃUMK”p:¥T *zÔ˘ƒEìDÍRˆè^ÆD–2D¨8ÉžÚS:«óF›…Ô›œŸî¢“s– ùJ ÁSg~$b0Y§˜œ=Éy×í¨ß³âÎéÏÑÙ: Z MÜ-4’`1ÉŒU'aÃ×bƒÈÆ hA6’öZ·’ÐH²ÅŽØI¸ð5†¸`r1X k u‡|Iµ˜à0ëèI¸ðu†¸àr1Z .Ù¾¿Ž$aæW*üÞ+ó=Ùðu†Ø}6ð{l ‚dÒDÝO44’Ü1¶‡Ê=Þ$ôÎ~èüqi~±'Xà–Š?»åó!+óâåòü1+Ëì?ùêûÛ7 Y±Yfû¿`@0óÛÖ6|"ù £0öØß?g¾Î­ýàÄš‹”A(‚†ßðH.ÈÈ*÷‰_álêB%fëኃ†bO/‹d‚ Ãz¯ÄIN¦=¥³é6©Š™;H}Øb‚î6.É"i ò9&÷=XÄNÔ4¥3·Å°HòGÕ*÷9œô4ö¯ü¼®åÛæÿ›öíj–™6—ñUjÖ 7Êç&’ Ry*n|çhº!¨ÖOÎúö>Uó²­mÕlå‚/tö]/Þ]Å  ²"}VxŒØñI¡žNÿò’e¡ÈëÆüô÷ÁV£…hJ0 r¥„"N»õ/’.ÒÄÈ?I‚ÔÓ¹‹¥ÛŽŠh!ÎÒ ÈA–EЏc ‹¤‘T`$Ur–|»Xºê¨ˆâ, ‚d‰3Ô½}g‘ì’rÒÞ‹:IžÊ]ÝuDØÛT¦Àºï "ÎÑ ÄAŽüï~Ía‘Œ’2‚ÄIÞaôTî"é¦#)Zˆ“4q#Ê µs/îY$ù¤ô}{mg¾ÂÙô×ë½; >X}ÐZ’ E݉G2PJ8’©8*;TÄnÔX‚D:–Dâ=4F}än…ù ÁEæVXÌ5‡« [ û¬p¹2d$UÓ£rå#D¼¢€S/£ÇÜwÚÛ¿ÁÊ„ñøæšÿº ‹GJI\®ÑÞüeœm¯ŸB…w_ ¸‹Ï¶C½´µÚV—þ³fmǵwº]ÓÒɺ¹¾ cÀÒVükÞ¦×ç6~ UxT=ŽláîúÌÄsÏì‡ÐòÕÊ°ÊØ8³Õö eîÖ·Õö²}ð3Šòõú=wŸlÀÿ¬ÌWëI6ÏÍEt._¿+ ãÚ¶˜ ÜwÍDr$ˆènß %ÑJÿD-_BôK+ëzooÿ+ë¯V_^;d¶j>Ø^¹7õW {üLLT@r4-.eÝ:¤z`¢þ ÇN`& endstream endobj 748 0 obj << /Length 830 /Filter /FlateDecode >> stream xÚmUKÛ6¾ûW9Q@E‰iIAÛCì"A’¢àJ´ET]’^ïæ×gÈ‘¼k×'qä<¾ùFE²KŠä~UÌß¿6«ü®lÆh+D™l¶ +JÚ4<© Fo’MŸ|''í‡4«ÊŠlÍцSIºQ:§M3^qòNviY“Ù+ÚÐmuÚÏOš­ô ÕrêçËÆZåinfêõ´C×­UÿÕÔiåÒ¿7 €ŒqÊùsüQˆb3<ÇNü‚ݬ1[TÌNîÒ†«ÔטCÐìMŒÚ«]¢¨FLù·4%'N½ ‰äwйW,Û‚Vëò‹yýî´W¡L÷'z_ö»®(_óŹ3û,—UëŠ6»¬qiŠšBBJfÐÿVÔä=ôSi½îŽ£´(«'¹?Œ³q§Ãj¾4(«Bqœ¿ÜG`DÁÈc*‘ãÚ-¨`@²[HœQŠ=”vn—S~é*Ä~¾`²a˜ZÆÈfP hP†Ü+hàüÚIãùæ„>¥†,(¼Þ럪¿•Ù¹â-ù2DáÓGEÇçšÃºl|ðu§(ÔŽ þñæY¹7·e¼¦kˆ\œç3€% di"Y òB8ÊÑÌi*¤ h^hBD'ÎI Ëš_Ö¹—Þê'hHÝ"\¼)BÞycÑù_`•õƒÕÇ=:¾"Z˜ a½Ð;8LÀFæg½Ág^Pá`cºº¿B\ÑÎ#[µ,ŽªŸŸõ~þìêfe,± C œP=3…Þ„6Ÿ¦ÑÈGÔm­Ù_ÅÝšqDÏ›ãPÌÁG=  û¶”{n¬XRP÷ì.YŽ_ïW×£Ô¬éyïoóüt:Qéw]mƒšÌäjµ²0`yo0õ¼—^{\ŽÇw.ñ6°²\>îøSþñžû‡¢þÉÇÜ–]ÿÿñd”·bI(ìñº Ôh2U‹ÔœËê XÐ4д`;«Kb…8ìÿ¦‚¹»¹1³%—‹¢æ…UÝ"X²>ïÙ^Û8ÜÏiSØvQ>üØ8¼L ÌšÖÅügãí…×»ÍêêÍÝ× endstream endobj 754 0 obj << /Length 2551 /Filter /FlateDecode >> stream xÚ­›]o㸆ïó+\_%@Mó›bá袛E“všÉÅ;‹B+‰,gâß#‰r¨„>–dÝÄŒ,ó=çuøRtô4¢£ß.¨ûüqÁà“ŽØˆQN¢HŽ eDH3zX^üñ'ÍáËO#J„F?Ë]—#f ¡š‹Ñ׋ÿ^ür1½ÑÐ%–Z6ºñHèh¤­%tv?ýqùù7ùûÕŸ÷Ÿ.~½÷t“DÓC×] ‹S냎8±‘ýÐ…´Œpuï¢Ì^è‘"Ö]$¡¥¡Giy•;û˜ø!èȪ#\v²Gy3ªA“55g›çýrq5Q\]f»Iç×ãÅ“|W›Ö»|³ËÉcºH®Ç· ¢Î“m¾uß~ÏâÕÃs¹éz¼Zÿþ1²^ ‘E0¸®Âç2N¸¸¢&ƨãǹkǃ6ŠhîÆ¸@‚6‚pÊÏ;ÎÌÃßiÎþ2™Tí>K’ª•¯7ëÅúiÿ·êßmgyÕü™æÏUë—týïOU3^ÍÝïž“UÕúúån[µ&ìà÷Ê*ÈQk¢„;øá¨%aŒ ÃÑלÕаt{‰ÓUž´BÒU’(*N)j!érKXÔ”œ¥+«7`ŠâpÏÜÉŸ®Òœä0˜®Ç»m’¹­E¥ «xé¶þ¯Øä¯¹ûú×+ 8©‰…Ë,4N¶Pdô45_o›ÄÙÃóõx»©©¬7yºL·‰ã¥rŠŸîA/&ƒ0ç2¨O_p6ms¦ˆa2…ƒ`4«„#$S^jÏšºv]8Wž-4Vò¼ ;vZÀ\Á€ã‘;ÄŒ"Q3˜:•Â%#ޯŸòEß&²›õ.sÆ%Î]…ZÆy–>$Û¿º/’ØÍYÙzùV¡ZMZ½2B£Š¨4ÌåÁ§Rzh¾è¬ T³y«åw· õl½Â P6ÕϦ¬ VFCÌc¾d`»­§±åzž,®Ç»m¾^ÆñømD•¼^÷ýø-Ûý‚âŠ4¦^ vQ^X‚Ë— ñâyñÓ¼úÄe viép!®PIŒàƒðò5C¼DG^â4¯^ÑiëWçñâ+•V„ña˜¯&;“§õŠ>L¢d]À?©T]¦Îæ*xCt6õK8–t¯ÂIS°Â%H’ÉÎq(»8µä„šºDXÔ”PÉ™l¢žC·ïy“b`»õÀcõùgiœ§ëUssñ7MÇÙzëÚÛ4oå\úe„)Ì ÊÁDLªÅ…91 L_tV$íñ(JÅ×;Ô¶ô‹%˜>PäEçˆÛUœAiVƒÔI_3P'ïëï—x±ƒbH ³†j—Ã^A¹€!/®V\C«ÀC3®áâk†¸ð £(7 çÒ+È  ËYåÖ¡ó¹”C‘Æçúš!."À…Ár&c‹sédˆ‹´œ±›I8âg¥…51KC2„E°€]Ð œ0Š¥WŒA*`¹ù b[%ü bö¼‹™‹¯9û™¤OÏ9TVF-±ü³®.ñ2]ì¯Çn Û¾¿’uøâz¼‡o1`½Â3Eônšåˆo•¦…$zI ¦P µ²¡ønÅ›Í"MÀ¥zEùPw$ç2bø@êdŠö¡ ÞTê¡ èvPø{(BèHF8= åCA¼«TCAQí ˆ÷PXD™à85 éCA¬±”CA‘í È÷P¨¦JàÓS ƒP„±¸Rœ Å•`_p6u5KT “(÷tbf%—„36ȶ!:›Ì<–n/ù`ÆÌ©eˆM•­æœlç.¨‹e· ñ’F°ÌуÜâô5ß–¯ÿX¦«õ$~HÝ5ôäÇ.]¤ß³tW_JÏ’[âNçÌ×OéK}{øûþpÃØ[·YÂöK.ˆ“2¢M=ï)¬=}½¿-O_tÜJRoîó×tÛ/”PöÂúÙ#SD-$[T·†`Àwß fAäz\Ž´Î÷ˆ,H"òI ÞQ˜HD'HðÎ$Ì0$ŒO1ŒBDœ !:“ÐÃÐ> Ä% 5 }‚„ìLB CBù$k(ä¹$\‰l(ΦuÄR•äZ<]ÁÜXX,UNNÝÎÃMA׎Ç,šp·$âÝ„(ž©Ôgݵ‹ãQà§Âb‰ø/.Q³a¦Þ†è›—ùÏÊf/ÉC¾Îš×Û«ç«ö"Y=åÏm̬Ñ’m ²/(ȇô×½‘»ä…–åîñ…xpëó@ì·çòp£¢¡8›6†’oýp¾œ˜È=… –/,XäYOruîâxÔ‘&”ºå“D ‡X£ÎŠºkÇ£6†Z-Äüp#ˇþ‡(: Ñ·ê|›¾æ»ìã}Òx»M–ßñSÒ¢÷‹3ˆFûh7Äu ÉV§¯8ÛÄYž·…“E²|+F‡Íìãöå³ù«ä•|yÞ·zÖ¶GèAT*"œÕcqSà܈±b˜Qä‹Îã<&ù~O‹¤«<ÉIü’ÌOÞžèX…ôÂRˆKãRÃä3Èíâ†ælYGoÃf‘¯fÜ3÷> stream xÚ…WKoã6¾çWøH±"ê­ÞÚb´h€"ðe±»F¢mbeÉ%©Æù÷áŒlk+´k8$‡¿yÑñê°ŠWÏ1Ù=¯áŒa¤³Ň{V £ušd×™Ãq”Âw mTâUZ}¿¡ Â×XfÝ"òŒ‹¨*à›EYV´(zÒu:wÚ=u‡ì~¢Ë©[º•Ì«(É’éZªÊÒ2#BMKàΓB9þ’Úk8@yMJ?‘òz4¼ã“p¯Vw×Å0óÑ3ðªàÞV&…h•Çã`³Ó>"ø©\Áú4+üxµI³¨Àz½‘2ÉÅ'bà§õ&cñëÏë:»Mg¾¯S)ê<ƒ[`L'I$‹’LïÐ)Ùª±£Áìn0þ‚– X1š,F, ¯Ï` ËxŽ4ß`/„Mà ö*6i.~´zÙþ;p£ß0V>H¡UƒAs¤‘3è4zR¨æEÇ0ø·±]ãùÐgÞûà‘˜]‘Óõ…L«þ Õ›éŒŸÎ­+aÉ÷u 'yk.$SøÀ4… BcL\i9íÛ[ýרûÆhùSd•ø­§Åp¤o´æ`zÕÍÀs`g€k›¡„l)2N›´=¢OøûÖaXeiA šN9§ B€/o/n~@mÈLåhFun µ¢ÏYYuÒ~²ÏþZÆ×Jk¡7@(îíp")Æ>ð’•©ø3”Š—?hf ˜QRôÁ¬»L¦oÁð½Þ¦w^«6Z¼ œ¹€JâÐ Ê­>X­IF“øuÃÖzÓ(ôéöªÁ;²‘p3L€ˆ>Öölµ¿Û4¼ºävæÃ&K’ê"l¥*ÉJÅ®D£.àC(UEa& _BQ@ž:sL˜p•à´£UT ΖçÆF·dŽóqê½çÀ‘cßo”¥¨Ãr"¹4q~Âô¼fÂ)‚éHCu96[|:ç­ ¥~?X ZË“T£Sá8iüRÎ#!xÑ<ïÆQJmÐÍØeiÒoÀ§™tМ•ñšb¬£Côˆî,ï­ú£òdÕàÓabè±¢Ôh‹K|ú@'ãA‹%•–¤¬gÜ#yfõaœ«¾Ñ´”#X{¬ëžfΣH“eû¿Ë Î1'ÓâNz tYF9¼fø±ÂeÙÔÚ³Dp£ž´È Jû¡ë¨2ãM²2žvÈ…xA;÷ñ‚« Z=iÊ´ð å10ÔkjÁ ©²'Õ]¥@*÷¬(šÜVÕSìYÑg‹ýjÄëÕÐ ]HÙJË:taœÄì²Î³‰ží:Ý =çWÀÁꣲz12B>Õp7($=ï^Qˆï:” ‘ù"ÑK4æŽ%ùfSÇŠ¹cI®§M§oZ¶|׺h1ZÝÞYűÓÿ´¨ÄN%TtzïO2‘@þЧÞÑ6§°‡6Oàªñ:°Aº&¿GóBò“¥À¦‚ AÁã†=¼Haj¡ P‡Ã'D:uD1HD1WŠA'LŒé<f'Ô‡ñ;§“-lï,¼ ¿r%|E9ë©E #WоUýõµsÜoƒI&¥ÛÀ^^‰->;`ó#VÎ+û¥€xô$ýàÄÛ›bh¸®œJ?·— &¢A|IéK˜@ئˆ@–wDЂiÇ¿îŠá3І±8…ËÊüvòôÆ1¤ûÚàÑfòûðö€›»-š?meUE™„º’Ô1ü=á4xó~Õ§ÝÃ?ÉR¬à endstream endobj 764 0 obj << /Length 2267 /Filter /FlateDecode >> stream xÚ­[]£8}¯_Áæ)%%Ž¿mF©‘fv»Gu?lM´Zif¨UÅ,ùè@uOýû½€I›nç†$$Bî9÷`_ƒ¡ÑsD£_n¨Ûºa°§‹åÄZʈ&Zon~ÿ“Fðã¯%"¶Ñ—úÔMÄLLb%àsývóW7‹÷‚PÓ˜E«§ˆ[K”V‘Žcb!Úê1ú}úÏŸV·®~½y·òpcDšA¸>yA¨g S1„FœÄ6þ.„ŒáÜ^¢Î^èH‘Ø]%o áðIÇ”( UçξÏüHÚö@dˆØŒbø7€ËýËÛ&¿+®¦‡×möx7ý'ÍÝk¹-ÉS–§w“ôïd³ÏS÷ÓÃ!Ù®_H™åÝd»sGÿ`B~ŸÁQ³Ë3 f¡)ļáÏÁ Pmq88Ô9¯™¹?dÛ’üU춤<$ëÔ ù©ÈÊ”äÿ»›¼¥ÅäGDA ƒšIð¬ù LNx,pDMŒQ§[þ¥!N“ÖŠhîz½DHkA8åã\HsYîö»|÷ü†]£AàÁt•­tUÄ^Ý\fÛ¢„>›6 µêè+æZm¶ÍJhÊ)´ä‡l·ý 3ªèt·/³MV¤î·ª5÷êç—'ÔKzô5¢—K/°H“ÃúånRì“Ö>ä8É Û ÉŠ±’õ—‹>=AŒ“)·DºJe‘D¹&’Û«*Õ¥!Nsf11š5¤c„4ˆ+„§Rù˜Ëf¼ÍÓísùR|íÂ?`è3ˆOWÍ2£F hH´ò˜0Û ¯mñ:)§hŠÚ_/çÒCžˆmSñµz¸öÐA\.: Éw~8_NT¬\¾ËÜ¥æ×ôÛ‹Cœf {»bÃ_¤ÀßY}ÆÔXó”Ê]þc>oÚé/«{g³“ÒµãMR²uêúó|Ž]ÆAƒšEXì ?Cl—2‚0-ÇÑÄ]V ts¯zôýG´– £T< ²Ö)€81¥{@ö¨eÀ@-ûØÖ²Íî1Íï&ÐT¾-n‡ÃùÒ6€nPå˃/¥F’G‘‡#GY±<ˆUSr$y|À诲÷†øwïñ!~•Pö2ö³GŒ_}²G‘îŠôûï¦+µ4çËò‚AA¬/âú¤I{F>T;Ž Æ1ÒŒ$ˆ9#ˆ*ˆGí ‚Ø>©¯ÄU‹ârÑ– ,U=NªÊÔ™4©"N‚3¥Š]3ð]a £Î&sÄYIië»V×°¾4ÄiÖ’ƒj›b¤¨ºÉ8ãPÔ°“C–8ÒØÝ∷“à&­±×Í\Yö Uù¾óŒäs’¿¦wF(^‘Ñ ROêž; ÄÅIÐfA|È"|ˆ"Cè|u쬸ÀŒxI­ù(Šø˜!EÄEñ I"ÀzRÛ>ûE¬ˆa¾§ä’t0C’È’ ã”̧4mḚœH©F‘ÄÇ I¢†H2ˆ_P°ŸÖÝ€ˆ»†+F©$>dH=DAô‚‚hExû±tÁ3ÁEû¨N"†SpCĹ›ãø”êâkûö:qŒ5­o‹_Åú§Yƒ¯Œ¹ó•qnõRÏxœu{ЯÁŸŠ"Ý<äÉsÚcv7ŒOPêK€95Ú²Ï-–ârŸʬÌvÛ4O7_Gžãáã”å)Ù&É¢H?Õß÷/oý†›Ë¹‡´âà0­h9bá8¸FIÇYsÓ}LÊ„”oûj}gy´*Pžò4ùœ>z«>;ëäH±NòfM(Ò¨†± e}¡gÇÁKš8ÃÙu0—›ìïò2?6ª<«V¯Ø¬»¡Æn»  |ww÷$bìxµ¢ f£âcžäžÍîùì^Ìîåì^ÍÀÿ¢‚ b¤ZóÊÜÚ‰87®E½2| A|ÌS‚|d³jãõ&`ÃÄ.(ØÊêad#âè8˜ÈØŒ2=ì`žä=›U¯7.È vAAÀqŠØÝ/UˆóãR‚‰evØÁ<%È6ën¸ ƒØWjÚÛ‚ 1†\ô€ì3Rw—‹ÎP¥|9~0_¸&š»[\ ±”\¬Š¯ZÀpq„5Ìl]Q#M‰eæ:Ò†8M,)—Î’)ÄrÖmZTS«"4­ê¬I]„àM ±üª·«®Ѿ V…ÐxQ½}&¿yA \ ƒ.%5o$l¢1îD»›{–0z;g ªÔ»æ¥¨ fQ:ÝÜ 6}ÍË ÝÎ…QÓc7n¾V9ÝVg•Euï!L/b¥j8Í¡I3íf¤«—j~ÂØÔ½{Õ|y¸s¡v·°ûÒ{¾eÓìsu ~nGÊö¿ë]õ×Ò}ûïÇ͇?(“mÄrWíé´ØCh;M×ÙÓ[»³’m’¿YM¼b 2Év!õ M çC ¯>j?õê—:0,‹Ò˜)ÄÆlº¯³Úm³í³‹µk•pÊ‹ ZðVØTçÍ÷­É«&y|}1bp¥%‹£¹„ËÈãN™kO‚¾ðzH‡p endstream endobj 768 0 obj << /Length 1460 /Filter /FlateDecode >> stream xÚ­XKsÛ6¾ëWðÐ5-¼zh:Mâ´ãI[]2I°DÛœ¡D‡¤šøßw J¢ÍØíDX.v‹oÏn2ž½^ð4¾\-^¼22‚•ÆÕu&¸dÞëÌqÁ„öÙj“}Èûmhšå§ÕÛÅo«Åç…€Í<™Pš)/#¯Ò.[o>ñlßfœ©Òg_"ë6SÌ–¸­Éþ^ü9«WyÆšê½3J 0s¥F3Ïí¥m/X_}FÕ/^Éòtƒ.™DFΟˆe*Ó3Ëˑ㎓Z3’Ïq©Kwð¤ß¤åÌ[uV3cô#¿Éoù ü,ÁÈä•°ÛÌyN*VJûŒë”Qö,§PÎÁ\<ï:UrV–çq*5³þ±ëÔs]½[Zj¥Ë‡ª+pOV(m¶Bh¦µ%æ¦ ÈõþT›e†æïÞ¼ÿãâÎËüºí¶a`Ë‘_, ‘o—"¿[Òçm7Ðáó¡¹_zX/´°ùp[ÑÞ¨¿EŽ«¸¡êH^.q„mÕ­½&q_íÖ@F£ùÔZ<šrT€U_«®JÓô¦¾Ùm+:|Od8Â͸¥eõ5¬£Í2g³(–Aâzf†3‘ndÚ˜ï»r¼Bî¢,iì8³ΣÓdµx ó‰Ìf@¤q˜%ß~äBCÄŽù—î†à&sBO/0bC–*óû{ohºmatù¦jhHÀ±ß_õC=쇺Ýå#7<*ˆ«$ î¿ »¾F¶qJ`îúþ.ÀGš^E]U1®@°ç€¬¡Èà™pyݵ[šE•8Ù„!€5 o„Ï×Àb¯êݸghi 4|äœkšž×x\ÁÈ$üŸ¥ÑyèêO>chXwmî×Îäpð*MîÁÙêl~1¶Û@«þ6Ü‘ˆí.t„†&.“Ȱ>u,“+’øSÓ ™6:f6®4Œ}.¬dïNjA,@óûŠ·ƒR«\”¥¡søvÇP PVžGiiØ#O>wl0¬´å'a…«'Kp‚a½ï‡x0Ÿ† R&ƒõ1&4’Ë™˜4\Šw=Pªd*äÄTW2eË/Ä¢ù´_‚$q¸ãæ¤ϼR#Ëë9Ÿ@uÌ¿?Ï )™àfäøuÖHâBþKVs–x¦ý!çA,Á¡«ÑcTáÖM!Öõ&’%D 1 íÖ5'ÒB—öôÕ@¸S2 UVB±GuÂ_K‘%sª$µs€åŠyf¼gæQ·¡Ý®:yò®…A Jê5ôœ#/4%Ø•&PßV]qº$h%{>aÖÂbLQ°ÜµM ô[tÞZ>1P0¦Mü0¦¼xŸ$ŒI·cœM9ÌÁÀ?óT1Z8ðÙ9ž*(K(óüSå,JÓSeªô©¾Q1áõ¤ «IA‡Õ¾µ§†×«¿h‚àÉu# RHl÷¨"/ïds,„?^$ÇDE鉈j;½­Ø™ê£2âA}Œ¤ ȘÀ…™ç—-mÂ&1 ÄKý) H릾êjèQã—C8§XFÅòn¶a èVÆ`›Œ“±ù”}‡¥‰Ôï]{MT“¯›@&ÛtF3î¶ù¶þ:ì»$*Œ“˜:¢––Wc%G"Øš$§­ Ã\•>©êÊŽU]Y °di×D…a¨“³á[ÕTcMß±ñ¨YÅf»øøTÇ7Û+1›\$Sü€Dl H^£I 5Õ;°#ž>ÞÝ¢ ÷M{SEÔÝФ)¡è?híÐÑ:4¸q4ÚÛ°úºC‘_âëæ-}¤óã}Ï@o $µéùŠï‰4Š~‡õñ^¼›8{ª7åòòb]}º5žñ"Á¦æ¦í ”oc¢;üAE j”(³BCøh—j†Q.H:ÿ„$N> endstream endobj 772 0 obj << /Length 1931 /Filter /FlateDecode >> stream xÚµ[ÉnG½ë+<9@Òì}¨ŒØHd8†A˔Ā›IÊŽþ>5äŒÜ-‹=ÍñE$´ô[¦ºêõŒÈ«›ŠW¯ÎxóúùLÀ+¯D%¸dÞëÊqÁ”vÕÕüìÝ{^}‚þVq¦‚¯¾î~u^ aY0ÞϪ·gž=¿<¾´°gQ]^WRf¬…Õ8“ÊW—ŸªwÏ^ü7ž¯f“~2Ò<[^ï_ÿ¸½ózÿö¯öÍõ~ëýåog/.#†Êi¦*aËTŒ{UÙà™0Z„W’ž,¡ƒ`RúîKì|R¶2,8gk›¼cÞÙ ˜nï’xªüiP׈D´Ì9Cî¸ÄaÒ^3'šK+ Ò^2X]8ËIp ˜"Å­nïç³}ŬïÓOçƒÅbº™Œ×W·ƒ¦Èî¶«»-«ëé|°™g³+ñaÿÝÁÏO9?¸TÄuÉ9fŒØ3V„K6Œ']Ú®K&m=óFîIk‚´µLòI—V8æä#ÌÑv¹ZΖ7÷Ô5*GåšÚrM¢ º¢Aõ&x£éb³/®š¶XWñ¥hÊwº˜nÙv=âý8].þm«zµÎ¡Ð›ÝO6ÍþJ†u§º¥#ö–pK[æå±Ëc¹?îWŒ¸ßß»­>RåQêUI­÷èŽÐ«Ž’ÅÑn„o4ÌÙ ‘q’q× !OéäŒksR§êºÄaÒR1åšÒ’ïA/*Æ}\Ãæ½M7ÛÛÍ·=üüµ LŸÔÅ€IeEÄFp‘™Ó½b@¤{½Û˜³Ù·)rÃvç‡úÁc?¨0µ‹‘¶—ÅX"iåEL0ñ‚d»…‘É ;åûÐCbÒ)½Œ*¢¡°ÍDÒ2>2§Q'ˆ£aÒ(ÉÝñQ½Ž8Á6z‰fàØ¬:¥_w^â0kHy2´Jd-8<2itÏl*­ÇÛÉ|¼]O¯&Q¿¾xCöë2:¨þ, ÷ùɘ ÈŒ~";ôMÛ¯çËO“Ùùà×ßÿöæIÒÜl¿oá”Q‹tl¹ dêdFÞÎ<"»•˜SSÞC¬×ÒªWFz‰Øg¤ƒ ÙÏœ‹ ±úPi}¼º¼ (b†z!Ó®C’€Ú¡Ö§yÑvÔs4Œ[*¥¹„.YB«mo= J2gÖžtVé¼ÄaÖ@*„¦ÅH*A„‘ÛËa%M>ß]¯'Ÿ£¹÷â%=÷Ѝ`êuˆÕù¬†¶—¦ž`"›´S{´Œ *¢¢ Í]@I„5í3 3tˆ)oÇÙÇ1tî]Mœ8“æÇô íOw²¨9.6‡È„Ðq˜2½tóó‡>¶”1AÅ[Íœo»7µÍ€Ì9¶$ˆ£aÛ(µÝ¡Q©Æ1+š‹$b6†™Óst^â0k†¡}6#‰l¥ëŽÞôrbI@G›évRبm¿½ ÛvT>$=ÅÛ¶MD-­öwäúØœ1&²9/ÚË—ñ쮎܌ӻµˆêt¼}šCd- ñÎÚ~ZUŒ‰¹!;ºQD wƒÃäo:‰"b˜žñ~J#†ÄÌPÍ(a†z\aè6^áNsÏ´éå¹H‚‰™¡;šQD uƒsæ]Óêö`íã9y'}Lon·Ð.7|gÅ/m˸ϧ³ûóÁÍx>?¾Ë1ž­nÇùÔ Ècf©ú(4ë½YD8Tú¢§ ö~%˜úWÓÅ—óÁbI–2¨në&rŸrE’ކM•PZ»£B],”ÈxÊB«7ª—#z:>dJn<ªØÆE;'¥XÂßúS¢^ç%³6–)ÑÎ3"ê)£!P„^¢^ŠG=IîÇ".¨|Ž·#ŒˆzJkfèc„%˜ØóÝFX5Ô <4ûGQO© Èœîb#L~Ö0D”“*2#Ô$€XîUß!÷GÍ‚$éÚÇH†€²þŸQëú¾ f·à[Æ.báD$”"2§JbÀœè[Œ å±P* «3¡—움æeß2xL±€@ÊÛgO†ˆ‘"XN{LwÂßXÔÏøÍ)ä:a‰öSsõ.ÃHyÏŒVŸIk?‚·»2ÀÅgÁÔŸr¸†P,˜âªª?&]R{í_ÁùÊš endstream endobj 776 0 obj << /Length 2396 /Filter /FlateDecode >> stream xÚ½ZmÛ¸þ¾¿ÂØO2sù*Q@R W\®½KŠ4] -.‡@±µ±PÙr,ùv÷ßw†¤liâÚZ¡_Ö£Åyøp8|¨}›ÑÙOWÔý~¿bðKglÆ('ZËYB2™-7W¿þFg+¸ùóŒ‘êÙ½iº™¥1Ii f9ûçÕ?®~¸½ºyCÝlv{7ãTÅgqš’ú¼]Í~~|È6»2Ÿ/WQug?®?¼·æ¿[ã®h[}¦Š.›í ~Ùü·ÛŸ¯~¼í ©$Šéˆ»£„jH5a* õAgœ¤:ýC2e„s}y†7ÏI“$FÚtB8Xq*ˆd‰¥Í3ðh8ÐŒ“$QÐv1 Z ¢©¶ y´>#" äc Iø“€¯wÙ¾)š¢Úæe¾±ÙS¬Þ\Ý_ÐÏ®OF¶Ù&ó™ ùG¬Gv.Çê¥&é j’©¨é¼&7õ&+Ë/;öeWÕŒÔùwÇÃ*k2Ò<îò7×ÛÆùŠm“ïË<û=úóúúÏ~’iø‰;pe€Ÿ˜|2.%1t5LO ÔŒ^È×›â¡9ìóSê”Eݼ¹¾e¯ì¥Ï¸¾ 3 ©—% ·0U€Å ‹õ$Ìœñò¡eÁg„y…ÓË‹„âŸ: q€ɉš&eº‡¨y×á3ÂÔŒêeFHØdܦ›˜°Á&=5ÝCÔ|j‰øÄ[C´† S3 ©—®ˆ@Õn¸I!'á¦rˆ›÷-7>#ÌÍ(¤^n˜"IìJbà†ñ¬]ªðõMoøòøýá ¤Í€`…9‘Eã¥1,ÌôE*ëÒ.Q+™i*ê€6Té!Ï™¥^Äód¿PfÀêåFw¹ HP¥§â¦ñ‰Îâ꬀½%]‚BT%p^ŠÙå¯sXhkÜ88^â«r ¤¦Š"”˜„nÌAIÅà Œ‚ãe@Á‘“£àxÊI»õ$¢š(>ɱ¢sP=ÃÀ(8^Tm% A÷|ȳ¶ŠnÄóÅΈøÞñ‚JL´¡, ®êE¯”.îb5“„%í+¥€DSìŒgÍR7âybG\*v.Çêå†v¹ A:7݈OÄŽ˜RìÐI’i— €”)'LNRæ{1G½U:ïõÒ8È^–´$ÊíÌ< ¥æD‰d’:!åPûf h„9…ØËQ"A~º?< eÂIÊÓIHêÆ~£BÛ(ìør…ß®°ãë~¿2·—ªXNu/‚x@]Êñ|’F/æ ¶j¹ðg¾ ÙË’RFËZ– T*ضÙ$§^ÌAýÕr4Â,‚ìeIÆ wÛÚP©Ržòœ®ñ|6"¾w¼ nÓÄ)dФRÀqXè—h´‹»F é%b§ky@YJŽ!_òÒ…Æ„?½ˆ0KëÇMšËãúÇ [nê´ ¡qâQïE ú]Q@J³D½äÿÙ/è¢ý–@2à>üo0¡á€#Eÿc]H"$n€wÇÞì茹ga6_0é‡}¶]΋ÖP¡b•ùö[³®ñBD÷EãÜÅÛü>g¶/2sÕÔö^¶]Yìùj»ÍW8ð´‰|¶*RáRõ-Þ¼y[&ˆùT)sÑ6ÆL‰]y»\V›M5_ð,¶ßÀqtWíÑH¢ö^^ÖöŽŒ·0×XIø+~-ê¢ÉkÛ$ÛÍY´+]¿IÔT®Mµq­±xåÐSb‹mª;36 Ã’jžEšÍ‚ÅÑ©è­ÐaPg¯ÐÔ:»ÎëÜ^õC`/õ#&¼hÖ®]mrw?o¬ ¿AG¾úæµ³×…èæ| “¶‰†6?[Ù 2þ,ª¶5leùvYä5™/´N£¿ o•ïm3üLÞºÄÉ­;³ÎÞðÑafÛ´@ÌÞ))$2p*ëhyŒˆ%4z[×C¶_gMkY.;hÛ ÇN`X]~¡ò{ìÅŽ]´ »ð¬¦-×’¦-׈MóèmYW0Ó`.O”A3 TRýtûéO³Îl·+ ÌCÓ¢j[ºž?S&÷uc/ŒÌ:ìÜãÛ•Û_ù²-:Ýæ[åLŒ:+œâDE¯±{”(ŒžÚ s;ÈzåËÆN) ŒÃÿ~5‹Ï¦†0Éhº>|­! ˜µåîôcf=¢Å]n17)hœx`¬»N¬Ãì6?¦Ÿ½,jÛoþý•®iÕv çd[†$í–!Á¸ù75µP?SJm36fÐ*†uEÛy š"j÷±Å|ýÀYNƒ•¾n@ã˜ôâÑý:‡ôõõ&W"ˆjÛ@ë~i0Lñ6=ÀÈa7™s¸Üí+;iÕÞÑËÝ|ÃoaæäXhÝ ÁÄâmÙ¦êS¬\2"Á»6™ÐŒ›ì¡ØØd\”ÅÑÊËbmw·/˜ô[pE ‡±ö×±"&mêrO³¿]ÝÖiSû¸”ÁS»$^˜£K{K.©NCs( ¶V¶ëŸ2«Î5î¥38üåÆ>+ä)¹1 bzº‘?´Xì|Ë®Q,|O–)Ü3cßþ2µ!z aabÙ±…kÒ®%0a-yæUhŠäÙœ–é)©Í ­©Úü>ƒQš¢ û­µo¢‰8¥Thí&ɳkWM»v!/Ê¢­ñóL_o1ÈùÌrÀs’kav0dÃ($ÇŒ-oª­ˆª¿©¢£¿™Ô¦¢€ŒÊš%:Ö¨:Ìt°˜’DhO. Οff‹Þ1Š~M‹íîÐXó$ÖPµKïdËÆ¤ÚNË€eV J¥Ú^¯*÷‹Qæ…}v_ÕõàÒqòDZÄIw£±~ª4”J£ežÕîq·~lÛì¨0¬†VêCës‘%ôÛu×fÓ’üDŸÕÍþ°Ä÷ ®¬âç¾m…°…بpsóãÝÞ¿êEiÃdë½/ÊÒº«mùh}ûBl[¯‹e‹wyÈ}4ânc& Ôõº°yâ.Mÿ‚w)·«Âí•5W-SšÀžüì²E3þÿ/[<ª¶ß{Ã-Œõ×|2m¿+T½&pªý ¸ endstream endobj 783 0 obj << /Length 1604 /Filter /FlateDecode >> stream xÚ­WK“Û6 ¾ï¯ðäDÏÄŠH‰’•[¶ÍnÛIšLãiI´DÛldÉ•¨lüï‹åGª<&Ó‹I‚ŽgÛY<»¿‰Ãz»ºyr—È™Ì#%u:[mf2VÑr™ÎòXF2]ÎVÕì­(æ )•?9ïší|‘äZ¼ÞÍ)Ž/_Ì߯~{r§Š™”Q¡µB-ñl¡²H-5˯v„T&ÞÉ$­ìÆ µGB.JççRïÚæS6mǼð8âèèú§ø¥“íOî´¾ü$¼Ag¾›Fi\ðwß)&tm'ló8…+fë~·óE*aêmÛ9¿Û÷áÜT¼Ù[¿kç °­ W¾åÕöÞí·Ï|r{|°_Ôîîlí‚hPÀœ~éME×IxBš±Mu»µ³ðø…–੾·}ÏAÈ´ðäØ,з¶ïíÑ¡Mi™£Ý0Ã¥7œDñ£T¦…¸\Sµ ÓßD1¼©øy¸6'DrcH þ˜ŽÌ/ÄoÑJ¥i*^X0B›ªXüÉÄDtí¶3PŸ¾]€/@¦r ÃUоÝx¼xà|¶|{0%ÆíÃ\§ÂlÑïŒg!ø,¥²«(¤x¢S_a ŠêQq×®k»\-¿$(o¦Åå.]ŽYBð床·¡®ŽøÃzÇâצ÷¦®ƒÒkhoYàò!x¦< M];YËS1†Ô­Œ7œÜ½õý˜Î¼ÚO‡Ú¸ÆVÌ0’ýX26m]“[Nêz[b[³O I£$ÍÆø&i”A%ðˆdHèË+··_†Š$Ô®K`7|5–Iax ã;Æ’‡Þ¾Û±!@÷éi˜Ú¨+á%RxK8Ø5îŸa”CWãêš áÔO„ø‰Øtížwä@UPS{°ëá B–“¹œÄ[ˆZÍr4ì,*Ï+;0Ô¶Ùú]Ð…I{mZj´•2rgÝ–Þà{LrÎRJ+Ü:€ AŽ®áµ4ðµÊ„œöØ #¡Š°¶‡ã󤄼Ⱥé 3^5aô˜2tÍÌøÍ%; ×~XC¾ùPÇ$V2Ö×\Ñ_¾ˆÎç3|€PšÀééfòáƒ|Øü%N¸V4†ë¶¡©bðqN¹Iö™îÜINT€^ÃnÇHfyèÄp»7d9ì qm`„OküÐáT¶û„©â…¡Ò–ëäò\'§&£±¡ïÛÚ–CMÅZdàq¡„±ôw4øcO=ç+ oµ(8c˜q턺 ¾ åËx³ -úÄÝó–b‹›ÔºÀaê‡[‹?;>­;C)ñ§Â‰i\¬!ùÿÛŠZ¡Ï®?¼#9š‡4|®W8aÒÙ`> stream xÚ¥X[oä¶~÷¯ä%2à¡ER× òÝ"E¶M ZC{ˆÕeVÒ¬=ÿ¾ç&ÍÈÑv·é“ÈÃÛá¹|ç£âÍã&Þüý*–ï_î®n_[½ÑZ•ij6wUÉ&µÒI±¹Ûm~t¬ w½Õڤѷí0ººíãõÖæiôýþÚêètýÛÝ?n_›òrÃx³5±Šã’·úk×/6…ÁÅ&—Å °Qx`{it|èú'l¸~ǃ]Ë“jÃó¶ï®MÉúÆU8uZ­£…oã4Ê«è–:‚ãqÎñ™G]»CÅQSm@oÍš¾qÕ¿~„+–Y4œ†Ñ7l£Õõ6KèÒp¦èmËœôÆ©m7r£÷nêwž÷á:M#jw_{ÃÅxõÏ¡Ýu¸ã“lsqáB9Sä¬Üý‰ã¨"{º1MÊ2öݱÞñà=ˆr´ v¼NÜš¦Ž{Ò$|An­êউÉÀÝ"ÞË>¿ØgMý%o³ ½¯Æ®?]:ºYh+ñó´÷=®Ö©l£³è÷¡¯n¿ä¶Wµ;‘ïøüypÚ>À$?° "°ÝÝ`ߢáFßóÐ|ÀC êºCeŸ8ZA öj`íð õœaúÞ¾† }¼ZeÊ÷P·U×>„Ç#Þ&ÕI´Ýúݹ=ìO#ÄÂWóícØCn߸w4=ªïàÚyZ©ÊÌžg}µ–@:WiZ‚"‰ŠÓ„'ß±çò<<B^DÝ ¦ ²ôÑ·¾w£—ÙŽ¥÷hËÖõ'î¾uB!‰Ë!µýŽõXÚÂäZåI j“ rã5Ð8ϧ‰OûÀ±<ÐÒí·Öf€4l•¨$ Ÿ#>Ýq è D39Ø\D ^Ä ‰+µ6°¶Óɤ´Žmû¿à™Q:“Düž€ihyZ¤QwÀ\¸ƒÐ @ºI+³²%~ sWœp¿îØsoçFÇ-ò36ÂÀ ÞÃèe,4a;GZ3cåj‡ûØŒr¿ýtÑÔ¦ö¾ùŽÇŽrhº–gü2\ïO9†ÝаɱsƒŠ‘`,6LGVµ k€¦±Aµ¸ñÄ·GüÂ.F!;vjwl+´ÚÞÓ°4ÆA lí>¨À!3¨¤\ÔQ¦Ô‡ìKl¶ r¡É¡¹FZ笆®†[°xžIñ‰ €eb }W³@N_ƒ1ÀSkg•?æE›æªÈ’M%?±öÿò¢Í4@xF{›ü97(®PŠ—Ü;I,„Ce»4è±´¥ol¬/I™ªºŽªcß{6" .l]¬àÄr(>²¸q„É4 naJ[Q©9C@ií½L>ãÎ (8†ûlÉ Qàz) þùPÃÉ^&ÊA’õ˺žH_ÖÒLK-•ÂûÖèøÅ¢ê^œL®ø©%ÂILââ|››EÿKlCsJà‚ïÿÁ¢ ùÂ}´‡‰ʤºI æ)JžÂ¸çM±Œà{ê ~NßÑúÈQ‘–AI„¨|`‡Ri*"7ù1e?¦¡ "N JJË=æPDqÞA£÷µg6;E 3‰/±>Ø÷«ŠÂÊ$rõÀî òÝù¡êƒ8SJþҵ꿺v+nBßšòO¹ö!'T”B¾Ìí1§Ã]¨Žc@GÎ1yñàÀnCÏz èGömÓºú4ÙýD¯˜q•¼€U•ÉÒ c…Â\²¢1\£?M`¾Áã“)õHêCÛqá¥ÉŠu¼H’¼°Ìä½µl #Âh»–¿×8g® äý fP  2ÄZhóN¾ûnðk‘„ÀozO`œ0Ææ¿zóâþ7-ÏÔe!½5AøX ™3"Ö¹_L”xJX€z÷ÃÈÓÐë,Fê- Z a˜,a..Ní4>¸M7ÅïÇê1”ÿÒÌõxŠ7HÃfÍÅ…U…ž™ú}-/*¼ä»)üò;€ü«DÇ/† Uè¥EoìýòÂ-bàÞ"ÑIãü©“ËææâY¡å¥››3\*øg7zÙKJaHPð€Ð•\KµB‘{dIë½Õ6Y­÷e¢r¨ÖŸÁe¬Šá5&¿àm{Ŧ’G8Bdzyå ô/µç®z«3ÿü#^©w3ò@mvLX/(æ „ M‰å¥ñ[r'°Â‚œT ¥±h÷^ölý“ð(÷(»à£Œ390ä4X”¿#À#U¦_P Ì”WëV9G` ÕÚ=ÊCtÅ9Ä«IÎdgeÃ\é³1«ÚíV]h•esžÈ?èfÀâó$)ÅT‡?ÉÛÂèB%¦XÚân=w±ïöIK@|3ñÆü>“2U×#ã­&àÝ-ÑR ÷Ð{i4 ;_sŸþÀU™+zf[`M-áú/ZÕwò˜LO× È [Fߎ"ïZüó…-7ŽôçæþˆÇ $ «W–ª°sš6*ºæáL™µ_ ¸3E16FÌ”™¤eØX>Ù™°¥Ž‹%f G9úá3åòßÌ éxqU$éâ¦_`¥j¬ê®z·úHÀ9fL×LXÀ1YîûÑóšÓÜ€5qŠ4p!ÔyQ—6bÕXX-J‰Ø/ÎUR¾xÌ£ ™þ¶6T Y1s;G÷ô»úƒüÍE¿€ßÊÛ[C³ÆðL莲F´œ:­wôð´Æ!¤þ…9ÍL&¿š˜Ñ.YçF§% QBŒ¬˜þƦùb<$ÿ"­õã endstream endobj 792 0 obj << /Length 2914 /Filter /FlateDecode >> stream xÚ­ZYoäÆ~ׯä‰Ví¾»™À1`/b b+H¯¨™–D˜CÊ$gŸª®æ5ê‘vm¿húîªê:¾*Šïv|÷öŠŸý~s{õÕwÆì„`¥1rw{¿’3­ÍÎqÁ„ö»ÛÃîçâüú—Ûïç°Knv 渆©¸üØBóuÓ=´]¬ÜùÕw²\o( “¥Ÿ6t=­9;T1-Ͻ|¢SÌK5­f×7Zˆâö1\ßH# ¦êëññHÝîU1NóÕµtÅ{üúê! öÕðªÝð’ÊÐ KwTM×>\ß(/ŠPíqï#õîúª…¾Ÿúõ@¿‡zûúî4† Ti¢¢ŸÄÜvmݵÀŒ)Kb玡j#]üŒ Ïu%0bLüFaü#1ÐZ_@#U¦E©1TÇØòÅ=<-jj$&é0DUñÏ®9ºžú°¯‡Ð|ºö²xCÛ›0Ò+*·~Eë™pvzÅÓ¿s¬Äž•Žg®T´è.§ žP†Íª|\¸ÜúÄ -ñÙýæÙq6>{œî®EqOÍát7Œõ8‰ –MÏÍpx9n¤–L{9±“¥Tgn¥¶ÆŠâ?(¨¤zJ)Æ­ßJôq¥¯Ù‹“Æýq1:æÁJW«¾ÎÝ&$ó —ÿÍÜV2'Lî:Í7¯ÏJ»¾íç"«%LÌ:òŽK›'ëÙ Ò]|x }V^Z0ãÌkGBSŠùÌhHz²h¼JßU 20.M݆¿¤Inx´!]® ,JЧQÝ'D#x, ’3R%³@ÇF#&¥Udêð{®±*ú‡ìó¬œþ]ïwnuÚŠõFYô³ÈÕiî%Rr3<‘îëw\è}Š[ñ+ϼž_©¿6¼M5ÖïCÖ°àµÌ¬•ùaIÔvIŒ†–­…Æèœ"·«UYL –FŽí LØ=-ÐñÕ³ö F-lù™"×/º!IäzR^#r¶%8ܨWHÇöCîTiÁo‰e±ÉÛ!œ©ùü –­Cëq¬Çyµ:S¼A \Q³ÀR5ƒ‡æÕ™×[ñ2ñr â0Г6aÑH|ul¡&âbбŠâè&"ãÀ8žZ1ÈÆ-È~|i/}9îJ {sã @ß¹81vô+§™yË0B³êSïÞ×U2Xè†ßNÀ8!§GÞãr+Ç•½eFù%Æœ!¹ þ#ÉËÝyù%øÏl¡ÚC莤»¿ë»mMå™Rhð=ËÎ @Ð@°:;ý¥CKÁ¬r_~&Pœ;΀Ÿ°+ñÝxE`lv#^o½ÈJQ•ÕÉ#ëÉïégÎZ?sÖºQ»†Ôy Áj¿ï@WRôФY8C?ßô1ˆÌ¢9WÕcG7HË–‘RïÃ0ÐH‚4Ø$£ÂFBDÓ ß¥­3¢\¥SËŽµ™B7šéúÄVŸÑ ?sž„CÕH¿t®AûÁƼéC»þ|†Üh~‚|^>ä6àûæèò¿´Âl¸‚0h˜µ)‹Æî)ãèo$³ Yé_ RBTLÍX äîS¬Qc’Œ/©ÖYJ9XúgPÊá¤òuJ…Ám¡49{”kôà ÔÙG#‡ËJ%·ú°qÎښ䜱µIpr¯®SK{Ÿ¥R²%_ükØ )ËçÞõYdUrئXyŽG·Ïm/„ of§4fž@3)Ýë@lAjÖjÃyÀQ„—H0ð¯Óà_§@ª?Ç‚xq´a¢Àð}ÕŒ º•Nƈ°Q…±ÆDT{‡€ïiˆ ä¯âø%û¤%Ý™¿™â3žK0@{ƒq‚~ÐËÇcª¯]¸ì4ØF9[Õ/øbð/$M¨b°61‡kÎyæf( j ¡ÚÑÂ(ò«oo¯~»B[cwÜ…,LCE‹Ü¯~þ…ï0 ›içwâÒ#êBÇÚì~ºúÕ’6÷ÍGy ˆBЕ2«sL«¨³ò{µŒ{öLC—^ã±J"ÔåÍ`Ç¢6{óIŒßæí³tkÀ›M™1ê5Oê£'u¯{ROžÔ}©'–µž2ñ-¿  ‹²ÿ!6åëuØ¿¢Ã)b<×á3>=ãÆ£‹…OÌ¿ »úw{ÀtXË °1cKìª-ê‰ &œCí„Ý›7)æÝY´!pfôœû¹&dfÄf˜ƒ_ÌË·@Gc‹‡4¨šq'æïí¡;bmßíã´fbwuSxÔ§õ!€¨ª_#øË"¹º½¦´xtžhmúâ‡nú8©ÀJn·%¨…@úä'!˜®¨:V oàxÛ¥¥óG2=vm÷ôˆ8èSÆzï-Ñçĵ÷Õ~Äœr¤:mŸî™ÏÛw(½ÅJ J'-NÉIg¼‚ÒTV^ÎT¸DE*®:~§ž¼°ÓK¬‹ÝÃuàR#˜¾™ÂÄ€˜CZtL~¼«Ù·Âø6òºy3ïvF0ü(óÄÍŸ€$Jhwú”}4u ¾¥ONŸbnz¢Î=ØZ¬Õo?þ@Þíø# +>‘küf„èÿ Ýøß endstream endobj 797 0 obj << /Length 2061 /Filter /FlateDecode >> stream xÚ­›Ûr㸆ïýŒ®v+1„#TѹØÊ8©É8•x\©líî-Ó6·DJ#RÞñÛ§)dCmž®DÐ? ŠFOþ~AÝã· 4b£œ##MRG‹ââ—ßhôo~Ž(ÖDì>ZDŒ1¹†ëeôõâ??Ý]̯ch„K-‹î#Î,1Â@k”px¼{ˆ~ùáÓ÷´X/³/W?¬÷ÿ~~½Ë ÷âÿn¾ì/søÜowŸ/>Ýy…Ö†(ôÓ„ÅÖ¦,Ö8±Æ¾kBÚ¦qÓ¿‰'GŠX­ã“Ñ„ÃUl)Q jG‰½Ïû ÚtˆÈnaLÍßLÖϯõ¡ 6Û’äW³ÏÛ2ã”™™ë®m½Þ֤闫MQòƒ‹ô5Øü£)Þ»”7ÞÄ7/Õ{»Råu7¯2(³ LjÈî•LÌäQè)¦éMš¤=M‘ûz‹—÷AZBéK E7vó–#VMZM˜PãŠÕ¾ÂŸÄ Tø[áï1_Òåv’`êÑâ=L_‰±–`‡ñmvŸŠëIø1CHx û`=¦/ˆD[b•s$q…Rk(Ív$~Ì@Â?B2H_ ´¨Ü&Gœ¡skøÈƒÓ‰3ù#ËŸžk(Œ*ºCò·ÉcZäË׫٣«ÎÕ[txã£s×aêƒÀbb$¥ê5’’’JÁIÄ7#(]¯—yVÕ+¯Ü*ø ê/0Dù@Ÿ(åT@T7 ¼/9 éA<¤S‘Ý€°¾@Ä4@„'O öTò±@\ñ&sWa°Dù4‰r?QÄÑJf!î$;¦“˜Éü`°l‡DæË$˜iç€ÇòåàsÕ˜}Gï&Ϋ¦ >æLŠÀ¼"< %'9= zÜwük»Xf«:p³´oÛ¬\ä¶Ã†˜“Ø´=‰˜Ea%áñ4LN‚&x“½·{øtî†I foüì_(L‡ ÔIÀ€)¼f§ómïr°‚=@_‡öy ¦Pè±<Ú¡àGLæíXÀRÕӤÎ…;{.;'bM`{3¦„õnQÍaãì~ÓSM‰frœêžMœW­$¡íáš@Œ‘ƒ×|a’"ã=Þÿf‹zµ9=ÌÉžÜ\fåSýÜ¥“¤#%l]ŸJÄ% ɉÑñƒ&÷(CÏ'É7Õè§/m9Â@ R!|ˆ‹¢CÈ.ÕØ¨Æ_ÞUc@Ô¡÷—ÄÁ}ˆÉ|,ŽvPø“ùɨÀòåÓäÛ¨pFI"îL0pTÊŒ*m}›8/šî‡ö^5æŸ(,t±žfòúAƒ¿±§U•÷Ë.·6 bÁ­ÏqSÜvÙeÀžDLÖé¦Î›£úl™ÇY|xùpº”/3R¦ì„ɼʾ‘ú{·›\ès¢Žâ°xsø©ãIÆË!àCZ§¤~]Cæe}8~„ã2K_²‡Ó†i "0-Äyñæ°óã{&»Æâ%Eþ½Þn²ãYæUÝÜöw{àñ-òÃÄYèækí¬ˆ§ã±!"ž‡ò’›–„w#¢/H¤qžÆý¬)¿È•:Î'AâÇ<‡äº%á]àH 2¿ÉÚŸÜ⹄|¤œ„‰ó“ÛÅ-o/ðÃÅaƒL$#ªý!N!†‘ »»Ýq &~ÌsL¾´L¼ œÉ A&‚‘öF2…˜FÎ;Dì´{“ùÉŒ%Ü+|H~L”ÔcþÔ3¢‰öTMB¢‹€0¢ˆÃÿ“Ú¿cíˆr Ár7Ǹ°L3"¨ˆ¬ ²½o]í«_û-`ùÓâÁK endstream endobj 801 0 obj << /Length 2473 /Filter /FlateDecode >> stream xÚ­Z[oã6~ϯæÉ…wQ‹t€dÐtÐÝmh‹…"+¶PYòJò¤Ù_¿ç”MÍ(ÅñCÌ‹¨sùxøÃØ$ZG$útA\ûß -‰hD ‹µQBhÌEåÛ‹ßÿ$Ñ ~ŽHÌS=™¥ÛˆR3–@¿Š~»øçÅÝýÅõGBHœ’”F÷£i¬¹i$fÐÞ¯¢ß?þmwU±¼’L.šGÛþºy¾/·nòß¿ül;%¬ûóþóÅ÷ž\ƒ´S,ôÝä1ÑbM¦çÁ`¤ðÍL}‚U“(h…@Õ&á…TŸ‡«GJ¿ÏÕ§©žôÊ<&„ó6P É¸‚²·°õ«E¬&±ÒY(«¤Ò±¤<¬RÇ*Mg쑯ô&Ϫò¡ÍúrˆY$m˜ ^-N3gòÄ!¨ª¤Ôà‰x[”ºãê뼩š§¢}/È͵í¼>É„I¯¡´ãl8›2JŠ*ç0”¯ðf¿.~¯ÀeÛ ¸üzý“þ ßß@-%ù™üõÞd»]U]ߨ7¬{—h;½k›‡ì¡¬€ xGb&i~`¸L ^“ìLÀðùÀ°i`Xv`˜L –“ˆ?=Söò•Bö:RcÈá“ ˜ô™ŠXJ—à ùÌbÉÞ–Ã^+âe«‰Œµté„…ª-h5;S󕾘Â׎ÓÌ™B@@ùÇ„Ë',Pi‰T@á Ï‘ÃF:]“3rØi&Lz ¥ܵ׊Kè*gP×H¡ËaŒÌHb'0é0”}ÃbM$2¦ìwk糯ó»y,„ÁI6M |›P3TÎÙw_áÍõ„·¯W=éªô] ”iBJ¨‡åY’ÐHéÜ$tšÓ>`}î|”jJÃDз$¡W‹xÙj¨÷¨’P Ž|†Ê`P Þ„Ž5Þ\ï6Ï}¹ Ýu_§yÊr'’½åë°7ˆ¾{DR³&×p9|üÝ#4N%h7 :iDÄ49ü·*¦±X^Q Üv›ç;^rºèËz½¼â‰\<6­íŒò=Nìë¼hû¬„آǷžq#®?B1ç©%Ñc°k.mþÔ/aÌegÛºqYõ´dÉ"Ãg÷°yX2½øR6{7,Œíªè‹v[Ö…>•ýÆö÷Ue{»¶ÈËÎXkÄ×+×Éó}›åÏîÍMÑ:!à˜öBI(„²öö|¬’¶p½Ì6ëò ZWÔvøØt]YÙ>àTçèȦèìŒ~ýQް¡ èAjÐit¡à”€åeÓ–SXB4C, Ëãå• |ñq©éwÉêézÐ]\Â0ÖT²øƒPÑv½]²mÚݦ©šu [j\¾bDCâcÏ‹¬ß#8œ óµ4¶YíÚ%]€š®oA†™ùƒHb1(ÿW¬`Dí|·CS°ˆÎlËõÁéíðÁ>w«7Y[¬†ïóKRnÝ¢}?Ú6G&¬8#‹;lÀVÆ0þpi'ž6øUº™ÊìLWä  N}‡o/¬;Ú ÏVe·«lÌâGáÞ°3¦k_ËÙÎ"4ÜŒÑÔ‰ÀûÛË4Ê®ÛoÍqdZØãˆÓ]¹…”œ—½Ó„sý·¥…ë´ûCÏ„0ˆé‹'†{ÙHhqñïöò7ñòƒùd‚|ðNÁ„݇Xã\û1¤ƒ€„¬·›¨­‘ØÙ6Ã+plAÃðV³]bÐÖv˜™¨3» #4ô—áê·CÈi¬Ú†HbŸ0ôæJ-~ªWE±Â°H„8à´§FyVÛ‚þ1``¶Xs]¸•° õÐskjÀ~ÙwEõ8”gû®púËÇi2V ±°éVtòÌ éq‹¸€Ø™$üy` ‹Î×Tœ­Äaѧ½ÙW+;ôƒlИcÌÔ1„¡C}(×û5[à! Ýo¿’Öõ¥© Rå.†e¢ÈòÊöm4ÀêK Ç”Ù&5l²bŽbíª6=ó;.|Š*5Fö—¥„ZÙçCeUt°çZíFØÆÉÚem_æ{ò8.†_Œ‰¡IðÌO˜Y޶–!D4ÂÖâév &òª@5Ø…â‘´ ìÙÆ£B'šë‡gg'Ýѽ {Ø|%Æàš¼€kÞ´pú]ŽªW¶eÊ*ÎÜîàÄñPáÈ?ŒÝÐ¥\µ¸»´ó¶PÇ×[k„-÷¾÷·36ÂEQŽhàWS¸ßéq"°¶l¶Î/—äÈPB9Ð8,œ A|p(`9l¬uœ˜B§Žÿj#Û â Ǫ¾­7سdb2Mºè Ífmù A]ó¾Šd(éy2Ê pñtÈ @|*ƒP™ «,¤ ÿ«{DêŽ×dâxàóc$Á’ÞYôU%±€ËÅÈÙcT°Äþ¤Ûq ‰3fÆ ÄçÊöïì{]€Ž»Z$ò`Ì$µž 2Ê¿ëJ2 #\ú‰üŒ°—ì€õ¡3´–¨ ȘwW?ñj<üª5ºÒ @ºp½%,EF‹àý¹Žü endstream endobj 805 0 obj << /Length 2547 /Filter /FlateDecode >> stream xÚ­Z_oã¸ϧ0öÉ. ÿ‹Ds ì-z‹;Üm/ö…b+‰ZYr%ysùö!)[òÊ´âøIIÍüf8œŠCg3:ûtEÃ󧻫›Ÿ¹1F¬R|v÷0c”cä,¡Œ0ifw«Ù—yû”-®×óôÑ5’yõà;v#Ÿÿ¹€îü›Næ~ðï?ù×´\ù÷dñõî×KˆRvvÍ$‘R{^¿´0EÓyÞà“ÍÒ¼.^|_ÓÖiþø„œÚ‡ª^°ù3¶ÓzåÇÛÊÓdÈvãŸiéÒ2…Š—¦£Þ>¥¿rYÕ0…«Ó6k|÷¦®î¯Øë1´é}^äM›/a¶2ó´ëü~ÛæUÙø®ªôÏeZä÷@øïó0øw'ÓË]¾ÎÈâZ :¿sŠ…¡&["µ@ìÁ?Ûnô_Ÿsàè֔ɧ5¿w2eE…,ž±OÏóo næNHxMýÌ&_oº¯²?ÓýËóSVg÷¢ïðüáËN*Fþ`B"¢›ŸÁžzv%(ÀK4uá;æ§ ÍK¢iÒÍzçi¦›M‘wXaÝjn 5b(÷²HW€LJvHB˜0‡O/ë²E"4±Œõ8¢TÑœdÌZjëÕ€ýÍ:-Ьiý[.0>w3Û:ëZÎô¤¤h5›"uêm¦?TÛÚË›HBåõÅÖYŒ¶\åå#ZlŽôÏ 2ÿöŒ&×>ù´gg´m·œÐI‰Á†)TþDÁæ1…rMØ@£ü¨FymÜÀÜo6–°_^ÕÛm;à` ”p‚K!çЦBg#ÌÀ&Gð‚W# Û[â(Znˆæª›uh‚îyL#Ê‚©«3L ‰…@«¿T¦“˜úƒ×OIäÐ žŸÀz€7Þ‡r«ª…Ýœ/”ëÀý째ÇFë\Ð6|±ª¼×hü`Yµ¡‘e+?•€=Á½øÎ`‹Ù2G”Ò¸ <‹0 ½–ëñ~ʃ«¿Þ]ýï µAgl†”‘àtÙl¹¾úò•ÎV0ÎŽkfÏnê¦"´€v1ûýê>¨i B‰¥–¹µd iXeèJx]}ìÌwâ*h[Ûr™Õmš—íË÷Сú,h}ù„3oe˜›!BgœXc¿#!-#œ›×“p z¦@'à‘A?°ƒ9´øm¯6¶(tÂaþ ŽàAùG—„A4MøÏÛànp òÕïüÖy÷þ{(;áÏ‚2*¼îááõŽ,bŒ 3C~·à±1‚¢àßÒb›Ùÿý¡N·Ë´ÎÓw71-¼Ó¨ T’ˆ¨@]HjŠ >å嫸üê2òË‘_^H~9Eþ_·e¾ÉêmW¼Œ D’Ѝ@\HbŠ ~_æéªÚäíË %ˆË(÷@éˆ8'"Á 磩™àû®W »Œbh_1±LŽr¢è…bWŸ)Ä®½kŒ |€1™…*D0ÉÜ„Uï"Ø«IG é Xy$Õ¢S~™Öçy4‚Eç¡•R?©Â‘G²,‘$4\$‚ x†¦&D°ó ŒJ ižé~óH¶%ô–×€aˆ`œNag˜ÂæìŽdjB"€ï›ÎÕÌ=ž'£XLgaUƒê«!’¯ 9å”uï3¼½Ù)!&íëYŠ*û¢F’4!ðÎì"hÀsj:‹ÿ¨ÄB@W(kàILbF¬|[z-‰ã¨!×ÝÕD$…|ǨERMx oo6O/m¾Žq_Çx83Īä-×`o Ñ]6"‰DEw•0†(ypÙxPAé»däŒépû[Õâ5zbºŠ“$$XE€ô ux•mñÚÞO]ºhìn[݇ ¼ÉõíeÚ|ÇÀO®€þص½Ähu² \”ØÝ‚—«QR‚ÃN]¨_ {O¨ƒðv/‹ki}Í´¡¦;štZ]EŒb Æøµ>%Zò×Þºc™Y\ƒñÎ)_˜­MZ·ùr[¤µçÝäíÖ¹*X%i‡TÏÓå®F‹„ªRà£W„ûÒ¬sè*f Ì뙲úÛB©y7ÓÛ|Q•M†•N0*çðÙ·Eg,”kÀ¬UV‡Æ<ÔÕÚùRèrõ?~R]¤?ê Š_pÒ¯# ÿNZ_3„V„eIÃÚ ×ŽÁ·åh|7®WU†9û‚ã V@.wû.l¨ë+.Ù/j´jhWÓƒ‹cC 2… ôhG™\ 8ÑQð!Ãâšc…!fÁ~­|É–I¯N W 7ÂÿªïË¡œµ~ï^9$5\kØ`‚¨$êÛ PX6tKšÔÌùG¤%º¸ûm?&¨RDèžVG¤iÍ !„J ˆ±‹!@X¬¡xA\îtÈ4ôIüö~üA©ùEðƒ=à©nwm0î4a*)†Nóˆæ /?!ƒå`RÎ8CÏÎÞ$ƒìÝ€Gç{Ÿ ³×;?¥M¨+-CècÖÕ•º ­‡´(?ê«–°Ó…Î}ùi2ÿÒÈZú #fo¡…D8¨#ÌÐôëŽÃΛß-H φ«C!O•ƒUê~rSˆZ\3g˜Ï?D«°(kFÕnÿ¶érõÊAÁUjtëàg}Q*סüÿ©N?-8Ö¦u#¯j?«_•ê{Ðí÷Á—žcQ=feæÊYqxí«ÀVY1Vd Ñ4ðÂå±j¾m|¢ ëiwÒ[ŒU·Okp–Z p–ys0â_ë,Ú™*i0'Bâ#!*¬Ï¿‘T9Ñð ¢aF$©Å¡š»H Ù‡ásD•ˆàÂaÊ*{H·Eë¿/±þn»Æé!ÿªý@Ç+te½ØŸ»EÞ•Yƒw@‡x^?ìÍ“`“þk$}÷ endstream endobj 816 0 obj << /Length 2818 /Filter /FlateDecode >> stream xÚ­ZëÛ¸ÿ¾…‘/Õ¢YžHêÅ¢9´\94@ÚÛrʵi›YrôÈÆýë;J¶leÛlö“†ÃÇÃáÌoÆŽ›E¼øå*ߟn¯~x¥ÌBJaÒT-n× +QÉ"¥I±¸]-ÞG¿Ç2ùâV×7I–D]_ÉŸÿç̲ՊyŸ¯Sh•½k¹£¾–њɽmìÎu® ]¶q<§q˺Y «»Ïתˆ\sà& ÑLz˜{sýáöWØúLD’d¼;Ûùº‚1:ê5»­câÍË7/™²å¦n|·Ý‰ë›<“Ñí0ä®oªØ_ߨÄûšˆÕs”­¢UßøjÃCî·~y }Û ª¯°kf_“'o.ÉÃæ€6” Cìê¾í‰Íó¨´mzÖuÃj$á…P#xxPrÕâ±L†ÇjÝÜnºmãPnžN7í¥­˜¸ãÓscTàñöézh°L·®ëX+9jvfN¬ ·’·„íºÆßõ €þð LïÄÏ6¾[î–b¹µ¾¥«xÂÔf‹LH•Ã<ÿ|nM#d¦‡´bkwûÒ ÷mmfQ)c9ÌAŸYW%Bgf²0Ú“ŸÝg®…,†±dq`‡¬ Þ½ù1\›ù†·hôTáæ®o´.è]–Ži»Äg÷Q®  Ô´Œ^!]‡á¾j;[-X—N‚d­ -·×´·K_…EñæðÛm}{)rY÷åŠÉ’¥þÈ+Øvb‚)ï}]—0†Ý·Áþ«Ÿo¯>]¡Šã…=Oj ‘%j±Ü]½ÿ/VÐ + mŠÅ= Ý-d*…–xãåâ·«²Ë`‘X¼3¼˜ÔêOM.R­yüàR5Ún{¹ ÄBÊÇìâô(ZÄ…†ER‘¤ú¡EâÜqa.–HŒJß¾éBg‹T˜<ÏèyäB•…È‹œ5!çô6 ÏIgÿC¢¡·ñUíË8™r*ó¯ûí¡ó;w)z<ì£DÏ67"3áͨ›ãxõ4‡=•Ùô•ð«ÏÜò3ÏØìê¾Û÷XûÒ½xÖîlY†Ž©“{ñ ¼|þìE=jÛóŠŠE‡ªPTV€ó’O¤¨™ÎǧjÙCì톾tÒž–fÀœPØ·nN©F}×c~ü£wÌãODãK=õŽgÁMÅà–áLàìtn‚‘¤µ³ â$úñRˆ÷Ȧ`@hÏ–‡ƒ;¶î}Y2U!éçÙ¦dD`Ĩ˜cÜ&£°âJü.kšóùš€Ø†ÁÌ7žš3Hƒ3´ÆwL¯|Ë ƒÀ!r~ÓØ '0üp»ÃKœ¯ÙÖ%­³%Õ4‹^Cpjßr aìnç&\`˜ºò]ÍR§qäìaî–[¬PаÐ ÒemW<)1‡ó§q›¾´M˜dÇù¼s Øw ¿lÃ|r>sÛ‚ºÒ*Ú7÷õK}Èv„ôÛ-nüp‹~œ„ý‘ð|Õ®iú}Ç,Ú ²%Ü45À³1v¡Ý²ó|#ÌdÇ0&Zÿ2AÅÀZ£½‘%ãàb{k7Íœ†n@<ž*މ™34~²©1à¦ÇmÂí£r:Z™ß’¡!£q¥§Í]‡A;2¦²óû2Œª‡däæëOÀ‚UáBÆ€"mÇTÏW¶Ã•LÁ^»Æ¯F•„Ù†Ì&š"Œå»³±Ü¤ƒÍ¬;cZìèü˜¢$*fm*À¥÷”êù ©dâeâ·£D†Yƒ"è´°[eâ(¼deÅëÆ}ê]µ<„õá~’§9[X; Á,t.¥Üïá†0 SEÎgp˜¯*Hʆ[”—!Á›È‹“׌l:α;öåè± —dy^ë–k—à¹øÌA j½§‡!^4›ÿúå öœ¤¡s{à|sç5îÜûµ_÷Ü€_}DRŠîÊ­-˜$óO³:lS£ª:Œh{ßÙ»2°Y3À>àqë>´8¨x éŠC€Œü@ Ú³4åì|.»v^ºÂ´˜’Z•¤ä¸‘3¾õ‚|&Õü9IQˆÛ…yÛ0lÝWK 3iž„ž)5änä.3iDãµÁ|4{0DP”Ó=¨•¦®þô˽L7 5¤–‰ÉŸF4`KYSÑÉτŸ”$§9-ª2è4ËŒF‰A2Iœ—s ’굺ŒüÊd€T>Á b€çÛÔÉ"ƒ¿­6d¼8´>›2±nC1e.ÝÇÍäòtÛ7?îêÏs9ÌD!á ˜R|×€ÓiœÐR €Xv¬è8»÷ïÞ½û0§·,?ÝèóPP(RóÌCo]3{Ef:Ö+@Ь áe£`ÅG… ž(UBEE c—¢Ú :ö"8v,`ÁŒ¿—f*K0º°šAü×àIxþn,‰M5rÞ1:- ƒN¦‡n¨Qà§ÇS©ívÖ€‘.ô(Rö¸ >÷¢Æ*—é ŠMï«U]ý­ôÍn'ÖÍÄ9ŸkÑÀõx[5y> ›ÑWÓN›búªíÚÞ‘*ã…ö€…°t#b Ÿhâ5jKj¾:©¢«à>ÊòÀìÜÙ·nÝ—ÜCu`øìÝs1W· \Ù5ÊÆSéxÀèÎv.H"‹öPhŸ~‰sÒËZª2yx¿y=HÕwź•ŒVÌX7õŽ)ËÆ’ÍùD¿©êÆ…u[Ž[!8uÌfK«x ‰Š~²ŽIe­'‹JÔQ.Ýê 5‹ì.ø®–;lËl_íéÅâiì aiK “w!y 3 Ôîì1I™Ùâoý€HÖ1á€ÖÖ•û üSoÂúõ!ä*ÚÖȺ‡qUë‡ÇÉ,¶Ç± Äò0ŸúÏMG¸v¶”?ÚÂ.ºãb€NE~j?ج+w‚ϸ‰MJ‘س<$—uYbngÂ6g-D*>Z?dLs{LaljTH rs¬fÏ"ð¢cá™MMŒ+ÍÖ±è{t»ðâV,†@wÎð|FP¦D¢FI'¥¶s <¯c]»³^þ,ÙÐ W˜¦i¬ïBÖBi2ä MÒ—öh`rÔ*!~­Žùâ.3C£ô˜ýyÐ:$V¼Â²nàQÓ©B ÝT%–âLéÔfð.è+¸öÓ"5úÑþei% ¡â /e¡ªJK°ÇhX,±IÂÛDÿ@ĺ»-¤Èî‘vŒ$~ßn9¼„ÇòzÄv/+^J¦"†ˆö¯o^â«…JB?H>P¾V1ÂÖäI •™cùš.`¨ïÒÝÌVwݧÀ>õ”)¿yósçǾïÒ¿ÄøZà›ëì›Ë”‚f~Œ–¹:SáîcˆòDIïàZ˱´’§'E®s¿nA)!³ü¤¦“J|]õÀ7B©ü/‰> stream xÚ½YYÜ6~Ÿ_ÑØ«7‡¤DöÁ ’`1ûa;X«Õìn!:Æ:f<ÿ>u©­Iœ8Ø—V±xëøªÈ–›óFn~¸‘îûÍþæö{m”™1z³?m”Ô"M£M"•PQºÙ7ï‚÷ÒÈÎVùPÞouXh«í.JdЇ~(‡q(Û9*èòÁöÜéYöxö¬>¯ï*{dþq«‚±+›37‡‹åA–¬ó§%ïºv·ýeÿoy§"E1‹UؾÛ]š¦Á¿šyÕ·H%ÁÙÉÚsÓ-žÌ%Hƒû­10gäQipj;ÕÂxGÞå]^ÛÁvýËíÎ(g.på wçn*n°"c>  /ÚŽUˆ§22 Ú~#¯0d¡ž§í˜õ¡Á½Æ¨rÜ?‚›#Ϥ3á \b¹¨¥Ã·Õ8€ŽÝ–‘[U—³MãàCQÁ4”; à¬iðë 69væuÛœû¤'4B–„ÁþRÒALÐŽÃÝ膼—*ª,ó‹¼aætbÝŠM^=ööÈcÊá²&!6ŒSt‡3ˆËý6EŸ+PtlŸºÖõLã¿ùîõÛ=’Ø’³5QŸ]?j7¼Q) lÛ7žüùˆˆŒY„è(2Ê “ĺ ÃÝ«ÛÛƒÍûAÊVØ£È A'Øù±‹ƒŒ¿Þ¾ÉËæ?¡¸¯ÇëXLB‘êÐoä‚.ÊrÒœ¾x¬Ú3óþä!âX(s}†á|ŸçKÞˆ3Ø`<ˆ²½-qp†óíe&TÏeÅÈ”š#„× •„QFÀÂ*1.J8l5Xˆœ®íûò€Nƒ¬Áwu.’ ìJ01:öy'CîØ— JÌ­Ÿy¸©‰’( ÞÚ‚¢Ï#AM ÐÔæMSRÀ T,Ží:1ÊH2Þ8G'Újlµ¥(FMdjL™ê¶³ÜQ6€?ðAWÎaÒŽn&ƒtôŒ”,zîðñ†}¬ ÉPAHºµ{».[‹`fé¤A¤ñTø-òŠ é8ûÚ²Pè0òVg)NeÅnýÝþæ#º#iV›T„I¼1©Iº)ê›w¿ÈÍú@$lhd½ Eœá¬jóöæ?œ¢®0ÖBÆ -eRÅ{ß]!i¬lJ#Ò8û;6ÁÉM¼Üwè¬íWv”&ý[v"‘DÙrÛnlÊ£> l•e0#×¼U^€+ÄFR ÎËøDUö® üša+KÀ®áU†`oò¹£3yɦ_-z4¶Š¨˜f]¶uè¶æ<Ûc{æ/™U +ˆ4`gÜqÏ®úsS’L€ïS¢Ç†K Æ%M$<Ò@Ö+á0@5p´M_´ 3°ïÄ$X`ºd‡ M‘4%8:%8Újv$h "z.ƒÒÌ9Ô4}{(ð'ï—žµ¯›¦ ɱ0r( ƒ ˆx5‚ª4õ«f>ò(*dž²!21‘ôÖþ‰\"—XþLBœ²üG‰O+ð`•^e¾0„äoÛ©< ]v€ïÙ6–ë lmƒfcÖù´[s¡öÞäÁ1W~¡N¼_ÆAÃ6;ZÇ/kÜ5œÏ¢3Pü…êJ!!TωS¥’d»S ü÷5úGbû‰Ü“h$üþtÙf?îȈQ6ëHRÕGƒÖ#ͮׯ¡5ää„… D`@€cÙAD¶Ýãž'©HôT¦ÖÕ­“´¿u{»¶›‚B'I¦L€jº/TÚ¶9zûq$›0³*ÏÍ”ÙL:PÈ.Íä‹›kq#„ô¶üø F!$ŒhéN±Ö¬S&ð«‚ÿ¾ù‘NñHúðÆþçQ&RNŠ;œA8¯dMeÄŠH@ ¯K × -e`)Ú×™J|ª«55ĉˆõ¹½‘*¼"Ž.tBðà8L® ±5uõY £!'1#o˜Áu=Âdª¹Bu0G³Ð!qÔ ryËÃÔW ªÕ5˜çÕš¶ñèQ:óRŸù±º¤® ív >g•$t¨HÅ"MôWÙD¥ö (\+N¿hH0‘’±ÚhvJmÔä‰ÈD­"KIˆfâöe]‚ꪼã6Ý=ñ L226 &‹®t гèˈLGWwWW~R(o}:‹ñPVSpeÃkjÏ-ÈLL̲` ÈÓ#%@jžÆ/˜N!Åï/n” cݸ… ‚²Ã^ gµïZ=ëÑQ?ÝûÍcÉÓ?§ûX £²Ei¯ûlBØdÅgOýŸk˜‹ZŸF0D7ó†Ç‘î, Ý[Ÿ8r°®{€ê¡¡KÝBõ‡Š—Á o5†sÎ<èî At»w…xq×þ¿Å½á±5båÿPéÜ‘büF¶ëO>·2ÖÀá> stream xÚÕYKsÛ6¾ëWðHÍD ™[›i’i'‡&¾t’( ’8åCáÃqþ}wð%Ó‘l¹Óôb `±øöÃb¦ÞÞ£ÞÛ=ùýõfñò”c$–’{7;qJ„^Ha"òn¶Þ'ÿ3gtùåæ÷~"Ìâ“YŒ„T@—¾N«æ€ã_¾áñxX@I¨ºQ¯–« ¿Nòc¦·Ë•PÊ¿]Jé'Y«kû]îìosжaUCSúǤJrÝèŠ,W‘þ»´nÊ=Èl÷hj­Ñoe—_1;TÖXPô òÀ?Vå’‡þmºÕVöW×Mš'‘ «¤Ö.häIµO‹$³ÝÇå ””5—–•±óªtÝ6iéTî  í¢S“šC Æ\wxþÄe+‡þŠƒ?Ée[\æ2H7xj"~†fKFn€Á†qØj4c]%Å1>¤ÅÞ)ÐW<ò7zÉ|Ø;ü9³cÁ‰PÝŽŸFÒMVnþ¾tǹF ­•áî9€’º]7ãØßìª,›9«A¥•S³“½ó‚µ5Üb‡=4V^ØÏ­~a»S¢‰Uáf„þûKpÑë_¦›O²Ì9<¹KlWZœPÀžð3ЊŒ_Åá¦nn/‚FÂm€†uŠ>{‰ÍŽx·¸I]Õæ!C§%6©ÿ™Jj7ò±×­$ï0Ììð¶Æ¨†=]¹äL™œ÷î´¿ûã¯ÁÄIjéMc´ OŠÁ‡f—'X! tÛ4“ÜåÙ"2&\ÅÝÐÏ”‰LÃîØq‘#èü-Ú9ƒ'Á0Ʊ·;jÀ²¶q¢¬* Yâp<.’`4Eì¯`XUÑYë#"d2^Ìy'†ËT jØó¨áÏ¡æxÕ¦ÂAÍÛ’QÃÏ«ÁÔr¿Òȃ[¼Lð–±£ŒPÔ]ÿttN6ææaRlmÃ%8RAh>I Ûjw™[{_ÅÔßUúk«‹MªážZ).ý +OïšVªºïqPˆ­Yøë¸Å.©ÒŽÑ±‹ãÌ@ºHýú˜Õ€ îÒh~æp&-¡MZl÷ÜÅ©aAZcæ Û†&‡òÛA»„Ç YÙs<³N÷µü^²I{c’ã1KµKð´ À¨@hÒM›%.ëîÓ¸sÜAÂ*We[—’"‘Ú=yPWÀ‚{äá?yøäQÿ=yžF–çˆ4üd$TÉèyȺ )øÿGšëÉ2KÉŠÅž›-„DŠ]Yšƒ¯¦áå!—1*ˆŒ‚±Ï¨p ¬&ÛL·öõÎBy‹ó¾”PÙW“ö ç~-F¤d烽1DƾÃ4À˜ýcÿ*€8äç‚Á*@ŸphÖË µ¢Ýü†" (_NÄzo˜4µ²áuhF¹Äãú$´ÎU|€b×=ŒÝç"‡ÕqÑ<‘l/:Ç Ÿ¢X8r4(ê?tŒÏ!‚cÙuYäúõcNŽar\ôCZhüÌ© H(~XJ¢Æ`0L°‹ŸÊ¦µäÉK¤üïÒÛ½E¼9t÷În b8ƒ}Äá¬Èër0ÎNèqaÃ#e=à¼;Áj^ÄUWæq}r{$ÜoÁYnŸ˜8ØÔõ\tž¤…yà"ŠWìýÏÀIÒB]î*zŸ¬mÁ×6v€½ °c³ÑÇ&AmœÈðn¦5)Ôó¶(†º±­­ ´Õ¤†‰eådæ±0êò¼ýþµÙ¨ ¢¾oö'·…ks(5VsF¹§·WxLƆ`«0"ÚÙ±JLAþ÷U{¥ endstream endobj 832 0 obj << /Length 2748 /Filter /FlateDecode >> stream xÚ­ZmoÛ8þž_!ûA>Ø,_õ²‹°-®Å{À^à>d‹B±•XWYòJò¦þ÷7álÉQd'õ›"©áð™‡3CŠÜ{ð¸÷ኻÿ·7WoÞËØ‚ÅÆHïæÞ’3­•rÁ„޼›¥wë߬Òé<”¯U¶i¨|7ËÐOór*#ÿ‘êIÑktµå&K—TN [àþ&©›¶2+¦Ð»)ééuÈœ¨²Z¦¡Ç—›Þ\„̘þ5莛ª´c.· V€<«µˆüM^65ÕY¡ðÿ>{ØV)J0¸'¼ Á§WÞ­}M»fÂÊV†þŸÜ𤮷ë¬x QŸè笠aòd[,°be§5÷U¹&mP-üæ=ÞžMgµ[çoÒïÉz“§õxl²µ{ñÈb*bXŒÓ‹Ë¬JMYí@SÁ¦s-5ÙOÆÊoÈV XI,& þK‚Ív.7TÈÓûÆõAëa§EZÌ-Üð=í´˜’±ÿý=%"à“m U²pÅòþ¨­pvtÉÃsÿý góî×}óª2L‡{p>ìÖE)†PÔfaÚ~«´ ±‹$ÏÉÊbHþ\qÅ”ˆúÓ‡—‘Ó*lI6›C½lSðjé^+sj‡÷þž ¾¢Á¶õI"VLÇQ?h/Jˆ0æìJ”“µ ¬¨³fKÙ}„t©r-¸ß‰ü²Y ®˜  Ï ±*§Ü¾Ç×M±ä³¢º®x·ŸÑ€L «(8½Jm®±×·Š0çãcGŽÄújë?ðŸ6¡êø×<„7¼gEqXD–6 ”¬ƒ%Ú–[»{A-JRâ>ÉsªÁ}aG?íßjçp _ï…p óÚ_†´¥vØIü‹“ŒÛ·v,à ÄaÇJ—>)¦5GYñs1Yi&et£‚§9›ÒÏ𢴠ÅY{¥˜ïéœA•&KôÔÊ&ž¸:T›ŠÁ`P¡ˆ VÚÂ@É%ÛøÎ*é)X˜Ð¦9=PÈl¸;ËŠîžPqÿÖ š-ˆX(ÔI«éžÕܘZ[°ÕŒ† AîFÄš›Ê³»1°V`Îãq'A$0dìö†±s2n÷»›¥a… ¿rº¬’ @p„°};~Xiù¥Pgzyð O¯^G‘ö4H”°§ ¿"ŒÝ?vâo2oàíñä2À \屋¿Ÿ¦sÁ²=œÂ2B†ÿ›ª¤![‰§5•é<ÆÖ®\ó«Ý]¤VX޾n²EÛ þdn:ÄÔ8xÅܺøÀT"œ¤§b4=ážd1dÇ"4äè^,Â" úCš‚£¥Ý „’ÖÊZ|ÅQÒúŒŘA9p:½ìk{@ˆ‰ß¤Ü6_ÝØW´Kýò•Tr±æ{3™Õéæz2Á¼á—µØ¼\ÓA`TGO9 ä¾¢åèp1 xt6Ý1—×x[Ö$w¹E±š­ *­®oNað*¥a ˆï²&5ƒƒJyñ;«Ó¿TV ìG)¤/ƒêb3’+u)lÔ ååôGUÞ%wYž5öCø0§~Ͼ¥y¶*Ë¥Ûô¥mÓöˆ§¸¤.ƒW7§#Y´ºTÝqŒK›6_UVV¯e”¼ BݤVŒ¤ÑêRitoÄ£–iQ²éc™îøaß)"‰ËÀÔÍtÅHn­.•[+~&‘pÓ^¿–Dü"èÈnž+F2ky©Ìº7âËHôPY¬ì÷lw~îè”?z™â"¦¥ü‘£§Ñ¢ öû>]Œ½ëÔµ¹è4pÒ0lÆa›Ï0Á¢é\Àô]ÖÐ}Ïü¦Jøtî7p¸É½¹”L½Ë 2ðÿJ/Óûd›7îšE†çÀöÛЄj²úçÞý±7ïé鉽Èí éÓ—t‰×ᥣ»^‚…‡“÷Û¬XÚ».0«Ïö~ ßpb jV%À'ãÿÏ^ £k6î”ßIð8˜nTÉC šÏ%ýĉÎÖ ï×í{-©a™Ò™k{Ãâèõw®Õ•‚W,Ò"¸@ÎnŸÆþ×Û»ºÉš-}a³×u’¦½›“ä% ‹yV¤¨ædð#¤âš™hrýy®x –Y´ŸY¨¹÷ÝïmVæ%~ÿ|Ø žqÃ.Bv>±ZH¡?‚?À”ÓyÖ@# &çJ»o;:b1ÞŒéû7œ5’òésZ‚Ÿ¬°v[[Žbq¶Mžmrר¹”VÓ{0hIèÑÞkŠü´ G»Ñµµ ÁY§Iºú¬q÷ß zwd:÷ežÓVZ70ù¤@ó´OqO 1‚ÌD(ÝQ†éuöÅ©2‰ endstream endobj 725 0 obj << /Type /ObjStm /N 100 /First 886 /Length 1950 /Filter /FlateDecode >> stream xÚÍZÛŽ7}×Wð1~›Å⥸ëÄp  Û d×ÍŒ, ‘%Cꉿϩ–Æ#©¥¬º[N ØÉæ¥êÔ©b‘œìq&û`(8C‰ IÄo6žµŒÏ¿b¸èo2‘²Éø–¢ Ž²cԽϣÌÁñ™LÉÏdÈr2D#X ùˆ¥0-y“Q`,žƒ‡Ag/†b*hX˜D-Y‡L˜ VD?*NG9ãÊŠI½gýTŒX0‡„‚>±ñÍ9FãSÔBI£ -|.: y““3ìð„Q('fÃôZ° Ñ0«¢‚O¬š&o8¨¦€Ž£+£ 8ÖJ LŸ ë9cÁ#¹† .s6ÁAAB%ÐÊ9 Y²xhd ‚j*΄˜!˜ O†ð@ƒÊK}ÄAK‡O¢¨ˆ E;c‰"GЉN€˜•yä1ì‹‚¡ME Ð)Cž}Œ¢ƒjÔ"Æ£€>©éƒyTï 1¢P0 E)q¤¢Ä0=—œ‚ “ƒ, “6‹K&_ôA 'ýÄ&%@6EeÖK)iÃÅÑHÀÇTÀ ’¦éta°FP€(" Êe,(˜´Ð5 è)jr•WHU¿Äk«K#ÏÍÂZkæJø¤ÿ¡7Èn¤ ‹JŒZÀ ŠNšŠÎýuV©¤u) /Å®®FÕ«?ÞOLõx±XÖ£êåÝuÝÔš-~Uß.W·“ÕkuM÷KõCõcõ*„ʨz1¹©ÍköÉÖöœ ‹x£/ÙúˆnÍÕ•©^šêûå«¥©ž˜¯nfõÄ®—w׫ÙdEþ‘ùæ›þ©,OÌë dœyaªŸÿû?õY+à|Ê–Ìân>ÿåtg¿éLl ¢œÕ9úh=ȸ×ùérQ7b?†j®fØS Ëàÿ¦âáUŽî¿4^³­$¥ZÜV€t"×T0yõ|µ¼y9n¦zþä©©^M>ÖæÓºS<O'£ê;È0YÔkå‹WÀÚêf²nÂ]Óôlr;»ühÅ]rRBX)Àþùx…)Èv†ÆÈk,®ñSE:X¹/ (ðÄà²%Ò À7‚'ëRîÅ9“¶Ú3Âi[1¢Î=.n+æ–­˜úØj îâ|®C ãøç1·AŒCAL]@LmgüÆS îCµ â)tö€ï Uhó-ÐÀØÀå’±%[ìéH­Øjâìuw§mþ«Ð0Ÿ†‡A!tñ„pÄ(g[\øÒŒ(m#¦NFŒthİ‘O“ÑÓÆ|ø`ÇõôæëwÐþýd>Gð·oVÕíòÃb¾ßV·ãz¼žÔëêÝòv2_WJƒê§ïÃÏ¿†g¶þX?z`DWUˆ惶hÆ"TB~X‚•\þQU¾æÎ;Þ)¾ö%b -"F߇ˆ;jEî¬Öig»¸ÂíÔ*æž/›Z² šâgCÐcX‹3ÒV.=Ç«z6Ÿ/kƒh”At¿ó&ˆ¦mDÚ9ˆ^ T¦6CÓP†&îÈ~çí®RœÍP¹3÷2¯Üz£ÓÞHRŠN÷°tfî-*äO¸Dx˜3gßÒ>»Úgú<Ñ«·Ž©­cè¤c––ޱÿ÷;oScç¬Cs1þrã5}q“vž,Ô·@Ÿ7’ëå×~Päõº rÁ™+¤`“^"kq|:âOïf‹Ûå‚x7Þ=Öëñ] ‰³Þ57Ÿš³#ÞK1ÿYäpï‘. ¼t¹Û9Ö9:$¯îÌ™Áð!žuH>}.FBx˜‹K;ˆKèâ’»àž»à~¤s Þ¦@çuÆ)Âö‚}w“Ù±A_ØK{÷(n ì…þ–K,½ÿ>9w踷Ţ›^އaˆµ¯iJŠXú¢ö[qÔÖ± ÓQŸ"ÎvƃÎ÷¡J°%ÄKî·ûD9‘¥õ1‚¨ï)@—[ †. †cI{±ž.{´ç”ƒ;B­dO_”zàö´è³•Ф¯V—LZ²·Þë…¿³úÊ$"‰¥0uLºÞëÀQ_ž¼–êX[Ÿ:½ÑŸ¯³æßóÙêÝ;ûfµ?£/ç3ŽŽ¤ÉPÿ/êòQ¼k“L’l+ŸlAß87¿÷ut)©–.ŠËú})Ù²Ïoò®'ãum¯gK;¹µã{÷[õl<[üªP ¿oL>@Znîž³>1³ ¾)½Z32B§ï×=…¬§¿ï¦oÇ ;Õoï®ílYÍnþ˜/§Õ£þÇj*ŸÌãGÁ©W¯Ä(jÐIÕC¶8°6ë»ký7iÄF&kÉæ!1çþ.K*›™Š%ý£ÖWÏeÚ&°”.Q¨IJBòÀƒnï.‘p‹o¥ú§ Ãç‹>]5Öä?ú¢Û OYyo¸Ç«¶øô7ú„[' a7Ô a˜Aö=ß§Ò\D$ñ6Ã!Õ ¤œNá¨EÞ̦w«‰=¼¦Ž´ßyãH>Šå°ãHŠRY« endstream endobj 838 0 obj << /Length 247 /Filter /FlateDecode >> stream xÚ…P±nƒ0Ýý7Â`ã3‡µj©Ú©•¼µR R)˜¡_Ç6Jª •%ûÝÝ{wÏ'á™üçEwK@@©DU(Ò"/ Ù7e©±ô„+èK›,&²§á~b¯îl%¾µä—žw†eªQÔE¡Àì/ƒQ‰\U`:xKšá°Î}ÊIRB"ý0ÏY“㵬 Q#¹AžoÒš’y×ö‹ÓhJöó4d}‹ÝÙa±C)ÓjO« ø]"}EÞižRžcÒ­mß…Ôgê⟀_Ž>àgOÀ£ Ž$ˆtô2Œ½·|³ë›¯W• ¬Ï›rú"êµþ#~0ì] g* endstream endobj 829 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./fig/phytimetrace.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 840 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 841 0 R/F2 842 0 R/F3 843 0 R>> /ExtGState << >>/ColorSpace << /sRGB 844 0 R >>>> /Length 68187 /Filter /FlateDecode >> stream xœœ½MËnMo%6~Å=Ly¼«JU’¦6‰ÁРݯ¡MÛ¿Nlšüû\ÒZ«öuŒ1vÎ9¬³÷®]õ¡R-Iãç/~ÆÏßþüÃoÿéç~VüþÌŸ™ùûž?c<¿güŒØ¿›ÿüãßüü—Ÿ¿ÿíOþé?ÿùŸþüÙ~¿?Ïóó|ýý‡?û¿=¿ûþù¿ý×ÿöóüüõoãç/>þö·Q/üü‡ßlþ>ÖÏšöûœ?lè?k=¿óówçøYç“ðü¬¿;Ÿ®çóíó» BûÀñûtÂüYÃÐ>ó{<„Ñp³¨O÷Ö“·¢Ï׷ƢΧcUW÷çe¿ßžOEϧäèö+Œþv±ÞXÝÈÁ§á]‘z”CÒü4cîßg×»JfõôüT4ú—Ì–F8` ¶Úœ„ÑÜ|ú©¡ºÿ<„Õßç÷s×ø~ú;Æï‡ß¶`?ÿð©•Ø×ï„Õ_«îÕOŸAè€|Z‚ý´ya5cÿžì ?ÝŒ`#%{äø}%lI’O#ž˜³»ð°‘‰ŠP²UëêG±M¸û„Ù³ C´å]/cQõ짃ɧ6{2¶Ê0ânT¤z÷îm1ør ö.2ŸùôiƵµFï°Î¢GmvN+–üùïµØ[°i¨Íùô´ØæìG^ëtoÇýô³º`<ãÛhÁÖ=€ã{}ŽÚÿß5'Z°Ó85¢Š|ço´`?ÉYòÂ6á|º‚eÉ%ا…è pcãlU ö³æl6ã`?Z‚X( «h5`Ì[”/¼ÌV•`¿Š ü¾ª(0q6;X‚›¿QÔ ¨nö(±¬®([°ŸÁa´`!É„`Ëu¶~U{7Ÿ–~U‰O'úû,ÀÒ¯>Ðør v»¬ö£„~µoQ%Øñ6£ô«O½XFúÕsŸ–`Ÿ|áÆB!˜]ïbÉŽv°¿EN=¢`7Ÿ¶~õÔÐ0¡È EÁöʰ['­þö˱ñmA ¤îþîGü¶[]˜€s¾²*øµÿ~` ¶ªA¸»¢ž)±ÿ¶ªöT\ŸRqM¤âê,j£¿‹O[¿šH¡¸–\úÕäd/h]²Š¢`'»ÐúU`Âî‚5(cXjÀ4 þ‚ºh¿< ¸.–\ú ²¿ ØŠ«A7+¸!g¶Ùó]Ü>‚Ý|ÚúÕÀÝ‚ÝЂ b£ï¹°'×…#OALœ•€¥_mêu?ý=›ìÁ¸Vb²`éWÆ%¨à§¿~ |~à‚ÕJ~ÁO3êP1K°¦‘3[¿ò í«à§¿nìïlÁæÁì.øiFämdéWqøÍ¬?·ÞÒ¯lÝF–`¡g4,5 6Ö[úUí»,ªk\‚>0ÑßàÓÒ¯l°‘}^Y'¡·ï>¯TŒOK°1 n¬mq±¨ÕúU >ÂìÒd_­_•¾ÎoK¿Ú‹Ã¬Uësè>ü¶ô«O½˜G ‚ØS ~*Š…}ð[¿rœb ¢" †ÕúUmǬ¨ô«µn3úD@¥·àÁÀŠúfÉ}"˜WýÈØÁĉ~°äÄùëF+έ] ~ø>°ô«ZÌpc²OÂìÅÍøòÄy?øtbâ`U±Ö¯j1„þŒõÊZ°µ|±¥_Õ€¥_Í}¿ÝPä’m¬Ï­]àÁ wóÛÃó>Ÿ:æïâ·­¸.(TXúÕgî·òYp¿‡ô‚ùÒ?°×}¿mÁ¶"õúÕ†ÖWÐßý6¾>=íÖ;úHK8Ñ_ˆ}CqP¨ö†âJ¥è[q•èv«¥o$`+®Ú6Nƒ‚ÝЯ6§ó†~¥EuC°Æi·~56÷… Á&»¿!ØÅ™²¡¸ŽÛ…À˜¬¨ô«R/Ù£Ä~„Ѿ¡¸.œC âà‰ù´`Ÿƒ#@A6K¿*[AB°›pBŸ„$ô+% òD¸Ð üÜ­ÑtQl†aâ,eþõ –ÇáÝf­w/;P\yz*hP&!ö£`›[¿¢YiÖ¸ÔŸÖ¯‡¶YŠz°dÚ¯_N(6ê/OÞÞú•Ìw±Ñ?„<´ih;×äÜwÖ8ÌjÏ)ÛeÄžâì¡è\†ÁIhX¯œ/N¸9Å5¸;×EmÄ¥$ë•aßTì‚Óòbþn> ü¾ª(p> –\‚ÍÁ•Ð[°I#[íðÏÝå+Z°©­-jjÖSl‹Q+„=“‹[”`mñôôŸ9aCãªÕ=[Ρ%X«Ã_þ (ûŒº‡õ–`3o«>ú•É"·ûÑ…nTüö3(ªäÍ’?‚µ2gñéG°V“ßz5ãP¿jX}{Øf¯þ.Ør?0Ð_üTôŽº¨Eݦ¶˜hýê³¥b0d+®• #'[¿úh#÷i¶’ÐÖ€,ýjk³NèW›ýí­µ-ƒ†A´9¡¸Îûm+®› TBq1€ÖßneПOiq|ºqâ;,ІÁÁzÛâ:ùû&N‹„„aPºw¶â*SØN¨ûv¿-®¦°lÅõá,ËÖ¯æÆÚ~žÖ¯dS-¸±2lÀƒIÑ‚\(‚0ÞsÙNœŒEMXäº §¹¾8„Û"‹jÁN˜hÎÃ``xÄ~tتl QV´ã½2øÀƒ…q ¢¿ÆoµŠ'‚ÁfÐ0ØÐy`4üFçÁ‰€ç…ÓVÛ6¢²-XšwÎhýêórØ‚Øú÷ý@ ¶ÏƒÑŒ^¾ &4~Û‚¬w@¿ÚÐÌ?pÍwQ=úÕÄ1ü Áa½† ·§Ü8ˆ©›1E‹«³GÔ¯~KÁö0û@‡}r²"*®‡Í(Á.îÝ÷«‹̶æ%aŸÖí`éWFeìLúUAïãƒ`Á‰÷²œ0¥ ôçÍ—ç×Fð‹Ï$„… œP\y–<Š+oÄ>p?_?èlýJÓùLèW´¹}à"g|zxc€Ò¯Ø*‡ÅFÒÞ ði vnŽØ ýj`Ý(ˆñì|9¡¨÷Ú~WMýjr.˜² *ÄY0 ¬“gÉ08ø´ô«iPÔ &lŒ¸ Ø¨ä…f<|jó]EÏ’âê|º¡¨cî¯ì ýù,èWZÜô«ƒm¢`¼Æ®³`ÜБNÛί]ôƒ¹‡ëUëW˜0t–œ4”%!ô+<55Ú ú•°A¿¢± -rHà ~PkÁŽäð6د Ç®a/Ó0Ø'‚Ó&üZT_67¯Óÿöí!Ÿnô7Ùȃ…Â1 vó勺±UìÃ’vŠëâ·-ØàÂhP\l1q0 W­9Š+MCgËâ:ùtà ¦§¥¸ÖLIÀ‰Ô†²³qñJ;p)Üè'!®’!Ø Åõá ÝWqeQ4 B*®Æ¢x£„¼xm± ú»XMÙzÙq|êXŸ“0hf÷©¸ªGÉŠXTbþbm?²¸¢‘‚]œVG7Úèѹ‚äA{Nœ†àé1 âÈ~…Ñ~Z¿zxû_}ÎG‡E毳U{}-æG7Új$©{tÎk:ø@û\vÎ/7Ú±ÿ>,9`Ýìo´'™¸T(XèÃàäë°¸:n‡`y³üÍ8‚Pä°ò{ öÉû2õ+#\X(°‰8n´ŒNÈmÕÛ‚ n^ýJ˦C°“sßaqõÛ…ƒ‹*g«¨¸b\yëWÏÁÙªàþÒûÒGiBêW‹² ,ŒÁoŒÃ’uñÚ Y\±|….^Ѫhýêþ¾½æÕ·žBQLj èWR]'šîO@¿Ú]@°¼ ûÀV÷ßhýªV¤CX7žÎͺ5‹µ&—¯CjXT W×€¸ñ¬×qˆ4`¿’p×Äa¹ õÝbêi‚ÌâJ¿ZZ ŠëÃ%7¡_Mê“Ù‚ÝÚ»³Õ®9M‘(è|¹-®¼·ªY~ö7[¿ªùâJ°gsmƒÊÚÎ%·éeÅ\H–öº“R\ÕÈÀõôë ö†ýÁfÄ’Íp¬Ï‹/;~ßÉ—+ 4CŒüÒ®ö«àÏ0 ,AþÀâJõ² Ö«$8˜ô\ð×D3>pâ|Ô‹¹?²¸vE1{âxß‹®M:‡÷ÍgëÏ Xú•‘¡Q†²žìþ@q}îÓ½ßÕÌ ¶Kx¾nxý~E£NçÍ¡„þšïê&ÏàËÁO>Íç½ö‚å ר¼{òý*ØßÅuCsóý* ·{ßç\5χWãË¿/º? XZ|@¿¢]¥ öß^|ÜmA÷2ïÓê5)ûÀ‰``LúâÚkNA´¿¥){³‘¼x5~ëHjU`˜-¾XŸ{j|`>ïõ·y«UýíùëS'§ÍK÷ºÿ6‚^ ŒA-ŒÆàà‘§àÆž’€ †îÍ’ û*yÅ«™;ƒ‚MŽ:07cPJàžç=†;ƒÃØ_0uÄó Å•–Ÿ2 èïæÓ@Os¼\µ‚û=;;ƒÕÆà“P‰ â÷}øòÀ~´iQwÀÉý7 aQO¾L‹+?ƒ" 9ƒ¥ŠO@CEG1ü ‚Í[{°ä3^½Ý».têÏ‹Šœ³dç ¥_†ß‚8ˆ=ü–¦ìÃoŠ – kÁ–Ý{Ò^§§`”AVÅuáÐM7ÚWÅub×pƒ`“ë3ƒÃÙ“`EÚ˜V` ŠÞàÅ5°;;ƒOÜ6oü¾yh¡b½‡ :åTÔBº'[Õú•ß6ÇzMÆàX\7À|’ …IqEQ/c0¿ ¾e¿‚$Á¼ÛӖ⊒Á­ÑÁ|®o–&Gcð9P]ê¦ûo°"Ãï‹9¸EÅ\¬w¯—Fâ` >‡sŒÁG£nC°ÚÉÌû­c¡X¬(ÐßÅFÚ‹$UàáÓä~Äo©_ax Ýcp<ÜÚKN¯v¿OysÀɃ6‹šXŸ16ÀkžX\É“q0u>òÁò®ÜûTÑ¢Û€Û^uÚ›2Ðê4ë¥ý*YÔ!‡E96ú6ƒ;ƒcqQcP$O?, °ÆààÁÓËÃ…ƒ18 '/wY\1ËšiÕÃÌK¿zÈuóB,úvB‘ÃðvîÙÝu£=XòÂFïü–TLÕk8˜@t~WAjŒ‚ø}+“Í8¸ˆÄ‚ìR\ëuZ¨i¿ 6#¸0²äÀUãdÉ *µ*JÌßVòŒÁÁã’_Æ –ÍÀ¶±d0u w0Çអbšž~÷?†Aä ï42$ù”T=Ý`,@ùcp$Wþ`“õûúA‚¥MÆCTLt¬Þ„Š~˜¿ú6qÐN¶Š×Íî“1ˆîƒ1øð0UTÄ”~…oS×E8qƒ"¥_aÍIX\ ƒOÜzi,Ê`±Á¨»ŒÁÅo7毱ä }ÃÙæóÅX(Èñ,ˆþBt` §ÎŸP\ªd ’bä)ÁnÂä¶Èzëô«¼7ÚÕÈ cL¶cPöØxt£í‚Päz\}࿼LÆ`ïìAÆà‚‘-p\Iö2Éí 2ç­ˆWãÓ FJß§Äs-®xP‘³GuÓÓ|7‘ c00‚ŒÁÕ,6𓃧U< b’}WŠ\߉ƒcBÅ•‡åòÈ„ýüv|qòcèâµ·ãR\7áâFÁìZãÒc°TS¾lñ*1 ¸ÎÛÈMû»p o ~{P‘úëØœm¦Åu rZ±¨€þ|!©Å|YTLVDÅ¿ï„`l1Æ N^1¡¸n,A1å‘Ñ'¦,®Î—'®Þ– —~»¸ñ%!&Î 42Bù­A‘kÍ-ÀÔ1-ÀÎM ãŒA±vŒÁaX?WuÐqÐ~( §Ï¥!‹ë&Œw_ø@“Lm2Æ ¨‚,DÆà”`,®¤rœ³ÆÀ‚KŠkðe7_nÆ Ú Æ =ØébéD ’K¿Z<>ƒ“*q,ù Õ¯dVGSÊ»a± ÍäJ1xîË%ص8éÀ4’‡ŒÁÅ£tÀ9Ëh“ 0MËÈjÁnRPŒA]­ƒFÝ, W‰Ý®GFfË ¿>œ³–70©kÑjubûl` /"ŒAã}YÁÝäRUú•ñV+À<ús8®ô" 0óáì6X\çm†ÓËþ–~•t‘‹¾Ðhã-Ÿ–~uÈe 0#oQ%ØÃ±cÐx‡‚¥m3àœuèŒ` :I5«"ÿ£ƒ6¨nƒá0³DŸƒí1ÐíŒÁ¤ßbô_//>mŽ+5ócp“u½ÔÈÙ‚»ÍÑjdéWûp5Û-ØÅ}?Àœ‰ÃT€1¸‚«7œ³ŠºÍ§¥_Ý( îþõaéWÇïÓ„Eý° %ØÅo€18éö` ÏG笭_ŒA0ç–âzŽKÆ`Y¶7aÂü΢ *ª ƒšÝG>D­Œœ³}iŒÁÇ)œÃàä6AÆ )ÆàœÜËKÓP€1xwÉ£íÁfãÚúU€1XæYv7Ú›õ&–McÉ Ã–z¿>D‹úzÆ ¬Óá8P‘ 0Ÿ¤Úã°¸N6ƒÎY¤ …ˇ˵Ë08ø²‘±À— Šz«µX‚ÝtÐ0EhÿÀl,*TpÎ2R£ƒöðæ"úÔXß:;Xú•Ó›2À´ÍqÕ*L±þŸ6c$ühÆ Íç¶¹´™ƒG:R´`ƒ®ÄÆ <›¢ƒÅ‚C#›ÃUf¨=ͬ…âðåÒ¯VR5¥s鲯 i݈+ØIXËIbÆ X%ÑÄXó¸/“1ø°Þb .R‹£³Ìè|` Zrùjb-žCŒA£KB€18h3ÿÀ`m:¬Ñ~“µ6TLR£›cZÆ`òá\!0€›1hNmœ(ØghóÝyáGcÐH 0–¾^ó–“ð` ºÔélÅuÓ¡;àœeöBïåKm.ÅÕ4®À#RWìe©ARt%6~0aUsV)r¬ˆ®Äɧy^Š`‚18xO—` >aV0_T‚1øðî)ɤ­ áœ57ŽyƒNÈí„ýªí“ ÆàWET\ÕŒoÅ5ÉÜXÜÎYâ¹%ƒâÕçó‹ó{^Æàf›©¸ª ¤ ,~PÔ+j‹+Iç¬y+¢âÚ?w–Gž$cÎ,yƒ½ôå€aƒ?Á\ÍŒÁ'1TrÈG;ùtÍ÷R àyÃ9d¿J¶Êp>üÖHmb«6ˆ@Áf18ùòÁ h±¨ãïé8,®ÔúÎYƒô³cpÒ¯­ *2~ù5Àü ÂÖ®s€*@?‚cp,þ Wš…ÎY:'ƒCcrB°Žõ*Áœ’3ƒ·‘W^&æe .>5 ¤^7ÎY“tècP—§y„fjä¡kŸ­. Æà“·¿ŽƒØàËþ{0t·µ ¨\Á¢†”Ão“>€-ö‹«~P0ŬN0¯ ÎYƒ÷G ÆàXló‚apãÄ—Kö+•¼Ö{é“ Îïç”$cpaéK2×-Š>Ú‹m0R‚]ؼ$<˜¿[ðË•)—œß“Ípøx>,9ès!ˆþ&‹¢~µ(ÄX/È ç¬I7Õ$cPklëïMª9€d B’&ÃàæÓ‰ßwðÛIFwrâ$à‡ª·Ô$cZÁÒ0¨oí[ì` ^T¥‰*°éê¢V{¯ûÎYºšIÓÅk²^)®lU̯Ÿ ŒÁ¹8Ì ‚¥}2M7ÚNÒ"×ÍØW°I‹:†è†q ÆàÃsJ‚1¨À¹å£Ýv³Ür%^,™TLã· Ô5Lg0Çí:·,®ƒ/ïùÚùŒÁÇÁ±É mº›%ƒÃo½‡14Ø*R0bÉÔ"³EÅTQŒ³ùrbÿ}تÜ_¿Ñ‘+160Å(+EãŒAùáæÅUÛ1œ³d“É£‹× \ ‚`Qcp8tïcp’ÂG‚m#L]¼nBÝh ’Èñâu³ ¼ÑNÖëXFŒ=’»ïPlZ÷N0åPðËg9霵9ÌȤ=6†AžSò2MO¿Ç³Ãù4Î|ƒ HÆ  sòåEÆï&$Cƒõ¶~uø+¸,®›E eX]7Ú&HŸt–|`a¬—†AÕë°0ÖKŒ>ï§_‹«’ã*iÄ—Ozº\]œ%ËG»aˆŠ‰ù,m#IÆ ™ºÑ~ø-©*¡‹W¬H` ê0‚¥e,ÉÔ0 ÎÛ*ÃEäá·FWS>Ýèïâ6í“„T\'_&óaåêÂz}ý !*¦ê ûšÝÁÒ¶™¡8ƒ/'Ö+,#)",¹)Wbèu Åõ¹/܈¡Í` Š9P.këKaN¹>e œÅoµiñ©ñ¼ÀŠŒëÕ$äÕ9[EýÊXÔ&uœE0œ¿ep¡Í’Iõ*¸_ŒçÉŠ¨¸Bt` Šðœ‰í犎¯-ñ‰õ™ÚÇ!ÈUŸÛ«6fDáÀ¹~ª¼€Eì>ORœôœ×§-]y.áýÒÆ'´V=Xÿ]Ïy‘Îù±EQ`ûAUÔÕraz‡ßï0j'1u»£ú ×ËÏÅÐߦާ'3÷Û-*èV{ [¦Ø%Ly›Úë8“ºäCGñTùýÝõ}€È7…i œê/ i/ä.œ¶c¼qÿ{q<ê/é‹ö¸ŠÍýâ‰ã8ûs@ ­GµGõ­¯ð0…·ùªÏhÜÑû䇽¿qAvËß$^?ć­öWu8gݘ_aó˜zÏ÷ú~²“ò‡ë˜xGº|µ—òæúèŠ.I} œF²b¯õø¹û?õ ÐŸÐøq¹èŸ)ïA­ðš¯Å£1ÛóÓéyª}†õóìÆ©ñìò˹ýÙ$&-âƒñozŸ®9¡ç<„ê'Ç‘óÓEËMÕt¿R¨m§êÏ/Oú»Hëèo\}{ ÿ¢ß‘ë8¿0äF”OBß6íàBê”ܘóM˜nÝÕ1¿Æ¸ò¦¾ê¿sþ«ýõè–'jê$Nž·ô=M¥X?¡èßÀéGæÂù=žäþIꋃ>k‹úH°×èÙç¥ò6|«¼…ýúߘ’÷Ðû?\ècð-j’Ê/yÆ|j\Œ¬©ñ‡x÷±Þö8ãrüTyœûÑ@Èû’7h•©óé¯2ȯ`EÚZo} ¦Cª=%ïÜ\Ÿp06‘¡&ž)cóÇÆ£õôJŸ*üÊ|Ôÿöe«pRìO+š¦vÁûL”ÿP÷ÅÃáøÉò<ú=ßµÐ,}ë÷jž¥í©ñÑŠ–íGýo¦eÅà2Õ÷‘w½ýæþb Üòý*¯"^™öçÑtK³¥õ¬ù–ÅKïwÐ+º`5þ´Ç¶ÖÃ&°ÛÝ8—N–áÒÿ­˜pŒ¿h—!}÷å%Ÿ­ò;¸(ÉÞMÅÜ*ÿ#o“ŸâÀͶ=d7Þ=>(„Æ·­ùDú% -†…ß9ˆKßv²­{Ó®†Þ/ýOñ=oPU“0í•Wpü_œð„Vûr½ääzŸòΪħVÐ/q«XóúÑ SçM0àÚ^ÏKÿÛt ¸]Xû®ˆ–¿¦ú Fæ¼ë(™6Þú›E¬óü )só|ÃCµ'ô}Ó2ïü/Ó§Æ7¢æ'É…}"$ž75ó®_û†qRùMÎÜ´oÁpUÏSÏK±­ñ´ʉú¢çÛ­ M1Ú ¾"±ý@ߎk½h’fÍOœ×F‡Ð·s×£¦iÆy†“"ÐmÕ¿ìÙ .ý/µ·ó­¿äí[ëÈš{ò|3Jßõžq±5ÿÀ×ô©ñhúÁë»Æ¶Ø".ýï Éõ-5ŽØ°Sò*y;C“ â¯ùÄߣy›&/ƒÆÞ:–×ÌM3Óú݆µšï¡ç%ï)û ݵ~±ýÍÞ,׿ö”3g¦ÆŸöœ+¿¾31“}»ç¥ÑÎ"¦ÊÛ»×Wþ>Mâ´=ÞþëçSåä]dKWùŧö×÷Îýï!.ý/—ö{R9ã­¿ää{Ã?†Ú›Ùñ)ŸVljÿâz>çNwDÛ÷”>F§-­'¡ Eß!²¬«¼§Š¥ò˜yg__ç pËÞû‚Á¨û:ïÀ ¦ï?ôýÆUÞÒsžo8¿öÖóöþôúïë[ éÛ¦ò附óËq’Sý—o’ʧ}›ëoÊÞJy&ô¿»¾2ÿÏ©\<ü}…ßÕŸ7™òÕó‘ýp¤âm-•¿H~Âùu_¶Àk¯à{Ž;ÿSAão{7ƒ5¨} kú¨i2Fò<6ÉÕz?¥_öÈùˆ©àÓù^å1PÿP{HVHõ4Û­÷é€*×ê°×LB ­1ï7‡nÖãbØ[¡OÎ!7±G˜t[ìÿ÷Ü÷ I<×—= )ºšÃ¤ç öÓ÷tÆ=')ÄUt=÷y~×Aš½ÎW,´Ëîp²lûÆÅtPùLã3Õ'™m “½§úëÎKsÈqŒ¿ÇPÈÎÛŸ$cåÝ0þ˜ßóREÙŸ©°Rì/üòFP¿`‹Î¡ú¦ì­XŸ&#LNõoÊE?/>_ëédÉÍóÜœ"‹<÷ùW<€Âd5¸Ú»±þ=Âg}ŸçKUý²·^ÌöH´oµ‡öí£þîwBÏé°ëKØ?Ù^H•¥j Ù ƒ3&)¤ÆëRœÔûýÀ}êÐ÷d‘N}?qß‚õ{ÂeOÞaaÞûß¹D!I='•ô¶‡üö‰ß°ô>Ù¤ü½ë_ú¨ÞmÔ÷{s¨|RIBý£¯9Çó¿ÁïsÜïãþÎ¥}¥þ0Â'Ç7ƒþË~4M÷íoûÿʇÔRÙ»çå–r}Däÿ'´ƒ]zí7“ôRí/“ÁÿŸ÷{LCÏé}a^Š©«½â7<Âß÷©Óä×ÿ¨þóå/4æM0ô¾û×~8o€­úõó~Ÿà2=ú>¡oØ}ÎùˆþlPÊ‹±ßr>‚p:îzŠtXæ€I9M½?aß§|@ôÎ1·ìܶýq? Še냓ߣïiß^j/9½·¼ÃèBG˜ò~„qß~ûG~ÃÑs&˜zNêTý{#÷Ç­û×sÆYê?q|ÙÿöÅ´7:1=Ó¸¾ñî÷´os<ÀëOÎZ…]‰û92(ÌBã/ÿð´o‡¾7ê[ªã~ã•éÄ'˜ôþ3­Gü†yŸƒ­¿„Ý^fZcì73¶ýR÷m8ÿÌ#>‰_Œûþþ®hKÜ/\™™ØƳ”ýt‚ž:Å÷™H°®<@Pù–7á :…ìGß—þKë)2¸ì_,Õ%ûëMuÉ~5]|’­ö–þ·¦ô%0U§ÎsÓo8ÖAìøý)d˜_íuòM‚˜ü†u1î7øû2Ä¥øAÓ#€¿WÀ¾}õKrVCúG(~(åJâ:ôýà}Ó&¦Ã×û¸Wú^ADõ>íÛÔÁ]}ümSŽ>÷y|¯w¡ÜMób¬ÿSõ1þV}ëß-OAL˜ç Ƀ|’Û?žo–ž+‡“¾OÞoI~ ÍÄù•×k Cßb.—•ëU*`ë¸ÏqÞpá }‹ã‰Éd?Ÿ)ýú+­ïy*ýŠúßå´>*Ï0ÿ¹ÿ¤Î7®ömœ7•Cå1¹£«ÿ>¾÷ãTx±%Œ¶¦ò©ÿmµ'pŸ~åIzkª?‰ú°~­G|Kè/ üÖ{ß½`ˆ¿².¿uëý‘¿–G}ëÑ"¿Uúób&—j|¾î{ø­W^ëÍC ú7|/Žž3E©«ü šxó¾}ª>òLõñ|cꯓÁ­çŒ>ºÔŸør–n ·°©ö%ù´[˜ýfRº(5fp›$&ŸØô|ÀùàÑóÉèsGü¾¡÷(‹íºoߪŸq°ç¯¡è¹¦òÓiéýõëÅ"¿Uö¥5äwÛs0þ§¾?_ Óëè}‡¾áª?hÿy„É!×ûI~¯ÞOèÐ'׿úÄbMÆKmüͧ]SçÌÇuù­S|âTy¿Oð[qÌV.S•¿âKX—ßzÔf-À~¼¦bì‹¿×ÛÅÄwûø­Š^Ù˜ç Õ¿1ÿ‡ê'¿•ë+$š«üãßú˜Kß~.†½a«¿ÌG5ÕŸà~£ò˜˜rëûÄþwû“è?çk\ûŸ s,<¨ßéùàø_˜o°/ð[ï}Ù"¿uj¼„Î7œŒè)ÿ°WßÖsêÛSõoÚ?TÞÆ}íþM0íÛKïSÞ®ö:D×ÅÜÿô}¿.y0Oõ¯P¼ÿ[_Ú—}}…ìÛ_)}›ç‘TÌ®·)}›ýKÙ·)”½5/¶¶ô}gTšà·šîor*ØÝÏS±ÿ·ê+ýo™~_¤UXòÿXà·ÚÒþÊÄ ºOYð“4ñëVÊÞºT>#©úÅüýÕþÀzÃý%¥ö¦½õ¶/íû|Iùi{” í7äXÒ푽ú€ßúœ÷ýù|Ý/Ø#ÿû>íÛèŸ=:ßàÇL1[]í)yoÆÚll„ˆã‹üÖGó™L÷SH&_ûgêýŽÜê&þöT{KÿSðÒÆòSy%ï%ÿ¿ÕÄ÷4dtHÆ¡øÃoÿéç~û“úÏþ§?ö‡ßJ‹y~¾ÿþßýÇßš²ò?~û¯ÿíçùùë߯Ï_|þüíoPyþÃo»©Ž3ûóÇî Ä÷ó‡þ‚ ,ÈŸçÈuqŸ ÞçˆßrŸ Þçä¼½-~ßø¥M_m¼oüé_RõOÿ‚þé¯þþ·?ù?æÏøùËÿó§W–çþ…üÍmuœÑä‹¿üãÏÿ²?Ÿ=ÿëÏ_þíoÿû_váÿÚ×ÑkÈ××ãßõyßÙ­ïïç/ßS…Ÿ=þøXÁk|úþÏŸsÅÁˆyŸŸ¶ôÜç€ïó¢Ï÷{¯çÖL©ûðë9tŸ¿íûîÿÛëÿíżaxúþEÙýkßîVkëÛøw›4¤·ùGûW>."éGÑìç¿ûcorPlÿìçÖXÿŒývíÐ|¶`:JÿWxßîõuîV-Ɖ/ôóó_~þþß4}ú3ž_‡00Ì‚–}mVúËÿëóóçÿßÿþÿ?ÿïßÿõßüãÏ_ý÷¿ÿÖ)á­õÏÓ›a÷‡ÿþÇÿçïþæß,ßéõ³ˆ«5ú¸2Ÿó%¦v⊟Í Hîš:þ'ÖÔ‰óª! ýáæÑÇò ·:;³í²hÒm6(ÜÙÞ'Ôô $3Òb'îlò3¡—ÛIoA_z¿Ô²Í¨É“nuNšåDPú_ñîkò­ò¶ÁGå9ÜN†Ê«0®Ï|ÛÓ™ßë¾q¹Ь7q¿Z‹Hèýv;rõI‚´ñI·ºœ’_Û—Ûmi—Zvž/íF2TÞ„›Gèy-‚A7‹‰Ì[åz¿Ô2§›â¤[]Æû~© ÁÈÊnuåÕ×Lü³Š~ô~©e9¡6M¸Õµ[Ê/5!ÄmÂ>SøQù”÷vál7¡©÷KÞJy×8^µh"Å:¤ùNºÕ9s/Lø3–[Z›é&¢`•Ãñ·ºiú=Hƒ$ `ÂÞV4¶4H#­d¼Üh|—›×C³Ò_¥_µ§ÜŽVgâþÆÖÖ|h¤)„þÜ!ˆSn>·Œ9¾Ú­®â?ª¿Ô²C3\ãÝnCõ•ZvFf¿Ô&ͺüójï}Þn^<&NØ£í1õ) öÐüYŠŸ^na¨¥>…óuë*\ò>Œõ<áVWn"[ï/º¨¾Vƒ×û~‡yŠ/ 7'7a¨¥KõmK[ÂÑf§ç3³é¼Ø{ýáz„F·ªÆP:nÿâéñ1õ~©ÁI3ýŸ·æï–|rõ|2=/3h,µŸ™ h–™t«;tK˜•j¢5L佺 'Ýê2Ôÿ¦AvŒë%}laàV·xìhìí63U^É;ý-¿ÜŽÞñ×?l­¦ú>ò.·ÅÔû;ÛÇõü,”¯úË­§]`‡ÛáÐó’÷ä5Ú„[}Ë'vï_¦úA¼¹Þ5 ÒN¼í)·£Ák­ ·ºr›ÌövÛz^ò>©úۭΔÁ³p¹i{ü^Ó5êDz4[CëSÇó²‡fž ·:[¤yO¤U©ùÎùºáæÚŸ6äíÚßšy#œO¸ÕÕþÍùÙ4H[®ß§ý+Œ¹©?euÒd'îºz£ÝÔ–Ú_ò¶ÔþÓ4È*ï¶'Ñÿ¤ßñ ·ºó¨}Mƒ4ÑÞ&âe´›y—¼7c6NÕ_'5>šo{ÍP“nuÎk™ ¶jߣò7ÆÿÖóÒGö~8z†Ö;¸ÕÙÖ~ äžÚÿ;kŠGëÜêâÑü ¹ù§Ê+y‡¿í)ý/–Ö¦NxT>ÜêÎ#ý4ÈCZõ„bUë-ωóÍ#ù€™©ùß j<•_úvšÚ×|ó^õýÚ­¯n=/ýo¹öó¶×Öþä*¯ôíýh?Nèf݉¨µ×Ì8éV—wýîT &7À ·:S^Ü >†‰Æ3‘U°æû.ygj¿kdí·÷ûÒÿ–i½‚[]h¿ŸH©€¸ÏÄí®ÊúÞjÿo{ n¾p«³M·± s¿á¯ö'Èþ­/q…U˜ «7áVgr{/\úÈÌ÷ýÀï÷y´Û­©ÿ¥ÿÃMðŸÌèö;áVWúÆ\§ۋõIíLý­¨”[ôsŸ'²–O¸ùÞç­ÿMõ¿7–*ª¼…þã¼4›YúåÛþ¶¥‚ŸVëÑìûÞZ¿ŽúSò6º¥Ldg¨ñýtöD­ñ³T~É{=ï÷¥ÿ †Ùšˆ·Uãñ¶7ÆÃT ;ΕW§· ýþ A·qŸÝaŽðéó$å ¤®ü^笇t«;û-¯®Á]ë+Ýê’fþ ç¬³1Ôy‹¿wÛVožÆXÿÊߘÿ[õ·¼ä×4HSÌ ·:ƒÚCŒk‰#Ünþ [5éVWþ AºÖ¯‰œ ›´îI·:c(ò‰xgKa &Ýêvª½ A:óæ4ÆyûèyÉÛR¿hÛÔþ¥ÜW¡÷'ªìûnзqŸvþLø;ÔøYª¿Ã*õ§Ò?ù{ƒ¤ÁOøtvž!œ(OÏÃla\;ßòJÞÇ©/N$jð|û«“z°mặÔümþGµ÷¶¯“6îàƒÔµ¿‡[ÝY<߀ÏYöθՅÎ'ˆÖ)Þô\al/Înß.ýÏŽÖ3¤m8:?Ó­ÎîúÄ ¶4àVwd_Á}ÞŠ¡õ¹ÎÖx‚[ßõ 4ÈÍ0>±Ò—¸>íÎCû h¡ó$ÝêBúøldéß\¯ÃÁe?£[ÚÏz¸Æô‰4žZ?áV—®þn…U`ûáV·ïú ¤…öSär—<àVç¡ö™KóéÒµ_µéØ x£=œÈèpLëá¾Wª¿ô¿kß¡[Ý9¯ Až%ù#­ÃÖynu¦0»½×'îÙÁ”¼o­®Î—Ü_:·ƒ)!á„[)ìNãìçÞ¡õ-Œó-÷ã¦A–þæ*¯ôíÅkû ·º²?l}_úŸRKN¸ÕÕþ»T_é[úÝìƒ)lÌ„[]µ—óë ÌS¾ÏËÞzBëI7ÜLöÀÙþÀµ.õ·²”ÙkgO¼Ò‡nÿËÞº¤O­®÷[õ7±ÿ»¾/}{1ËÌ„[]ë Sx÷sœÿ èõyÒˆKÿÛëý¾ô¿Wpœo¶ÖwÐ “4¦Â¥ÿ­­ýÄ¡ooíoŽ0OW~p«‹£õ°iu~N•_úßs´À­.I;-\ö¿Lí{ëÝ_úàhÏ£õ4Èt­=pаô~`=õ·õ¿¯þÔùÆ]ëŸÃÞšÒ7aµ¦ö¸ÕEh<‚iwÿD2¿ûÜê|ª¿ÚìÙp«ëýBå/´‡ã!ÎÖï ·:Z/AƒÜ¡õI!ΑüàV·]úL(¬‚ëûûΣòÛÞúh½ „1;ZáVç¦ñ°·2lAcëßc«¾¢컞#=Äép«Ë£ý9eÿcýÈá[õÁ­)ˆ7ôÍG8[*¯ÓÇÞóhI·Ü ·º÷ü7Iƒ´·¾Òÿ–Οt«ó%ùy†æ'‹èßSßw3Ë; Á¼ëíVý ó4ô¼ô?»úm+&}¿¡úçÍ­þ•¾½¶æo+&6d?˜ {ëæú ·:S–²ÆŸö8i®…Û¾Ít´nuÕ^è3 4È`˜°ÆÖú9îèV—‹ëÁ 2Ÿ÷û’÷Ö~B·º#ûãBÚˆk¯‚[Ý¥5Þ½?Þú˜]Ö…ô[œWh•Kd;~ÿuñéý1Uë¤NºÕ¹ô£¤Òn6F»[éÛ9Õ?Ð ìkk ¬–ìët«;²O/¤8¤]OºÕÕýÈÞ=¿Må—þtsšt«[ #Ð8šV„ýs …1ÃúG·ºÃ°J…KÿK†í˜t«S˜ÃÂ}cΰÈíË>·:ƒY¸ô¿¤[YcØ›—êoyožWhIÚû¤[]ÌW>‰þ‡êK„±Äü¢[Ë~¼@ƒ —|6Â]ãnu¡ýa¡öÁ­îèü·@ƒÌ­ñ´ùh>Á­Îž·<ƒþûè¹aýµ¯Â˜!Ú11ï7'qÉ{ë|L·º”=t!m„OO¸Õãþ¹@ƒt†™+Üúv¼ò „ñ|„ËÞºÄXHá 0éV·Mói#vj¾´âÞ÷'‹¸ì­›aä;ö§I\ò^©õ¤£Ôz‡øk&šó¤[ë~m!mÄaؾI·ºm¿ A†Öë…´¡ûf¸Õu;=ïLª[ãi#|¿õ·}›a”'.>ª=·>ç}ºÞ„U¼ï·};%¸Õyj~‘Ië\Hqt_N·ºú½@ƒ|¤OÑ­.õ“¤ÒÔ.{«‘¶:éVw=±›YUÏÛ¾½ßò˜´6UžÙ×}7Ýê\çí¤3Ì]cïñqË/}{šæhïþ´gj¼™ø ¡ö”½5¶æ'ÒF„ìà 4Èmúý‘6"t ·ºÚ87ÂØÞõ i#îù—nuq´^!mD˜Ö{¤8ÒÏèV·¤ï­ ý4ïI·ºmú=7ø ²7¬ };ôûÀ­.¦ÆãF[†y)\òέõnuïúƒ´ûŽ?¸ÕÝ2 ;ì ®ò¨ÿq?ݲo_°ÿõ·ù$:/ЭîÚgÖ†¾’_»Õ½ç°·ã<´ú¢Êž»_µ[]É//ίû”…´±´´aÛÖV‘6bË^B·º˜o}¥ÄÕ:m„¥ù×þu÷¨½|+Óó²·žù–_úöy¤¯èö–ï c¹…ÆŸúWúßÑ}Üêl=o{Zÿû’Gâ¼éj_É[nçs9ô?†Åk|ÀØÄö®÷û6ÓÐL¸ÕÕýwª¼‰ýëý²ooñ àVW÷ù8 ¾q·‡ê7œ·ŽÞ7ÜïÜú;¬êÔï·º8Z¯ö¿ÐøGÚˆ¼û%Üêœnš…;Œ­ë÷CÚˆˆ÷yÛ·CòCÚˆu÷;¸ÕÅÃóçr„U ýÞ.û6ç9³tûkìmÿåúŽ´÷¾šnu.>ËBÚˆ4­‡p«K'Vè¾Ýô¼ì­S|1¸ÕÙú}:~‰Í»ž"mľúÜêR|…´qÞöl„1Þ­lo¤Èù~ïäÓ©|Þ·»Þ/ýoïWÆVüŸ…´G÷ t«{õï€þ'~×BÚˆ­ûºÕ-ÙÛVOìâÅÅXï—¼ýÑ~´~x°6â輺÷í²Ç®¾Ø,ûÐÅÆûô) {óRýÍoÍG¸Õ…ì! i#ÖvÂÐSëå·:xŸSÿãz·:—=p%ô¿¯ö4¿a¿òHØw•Ÿû ÞûôgºÕ¹qÿ7¤¸ú&Ýê¶ø¨ö€ßÀ°¾…KÿK†•™t«»üë‹æ_]lÐ?a蘿~«Â:LºÕÝûP#¿Õßönœ·MõŒÿ­÷Ëþ‡h+Äà7¤ÊoyËþeH²oÀ­ÎÝ¿ƒÈZúÁÒû¥ÿ]{)ÝêBû³ßzLío~kÝWaþЭîòQ üÖM·âI·ºdX‹Âúë¿õ®Wt«sºá5Þ-ï¡ú[ÿ“ýnu[ãß6ÂuŸjH&yß*~„!mD8õKºÕ¥ø ~«Ë~`Ci ŽúWò†w pß·k?°ûö£ñ ·º [rcœ7ùû­îò!mÂíhk¼€ßtCšt«Ûú~둽Â6bow¸Õ™ô,tÆûâöª|ƒþ?ô¼Ã˜ w¸Õy¼ío·#Ù¯ üÖÅ0nu¦´&Oÿ>ÚßòfÞÆ8o¿Ïqþ»õÖÛ£ò÷­ú›¸ßÙú>qŸÂñ~ëy4¿áVwù~kN§ý/´>À­n‹ß`K|bè+~«ÂvLºÕÍ;þÀo:ßЭni³¥4Vì/ø­ghüí.]¿/ø­—?`ä·ÒMqÒ­ÎdŸ7ð[/¿q}ªòJqÙ§üÖÐï·º”>h}pêó©ÊKØ(ºÕ¥Ú~k,Éi#ÞùŠ´'¿žcüÃþ·ºj?åep;¿Ñ úö£öÀ­.îz~ëŸÀ6"V~Ò­.Ï{†´ùÐþC·ºxÞö¬Çà·NÝïÓ­.÷[¿õaØ“Â0î®ïƒûÊîjË[üFk"cŸÏQÒF˜ôCÚˆw½kâBÎO¤X:ÏÒFl×zƒ´G|lkÅ«Î÷8_Zó[û°oëþÒÀo=ù>7Ø›=ßàwÜú6×[µ§ø$ »5qÑ]ëîß즸åQßN}Oý/ô~@ß õ¿ì&>“!mD2lCcüþyŸcýçúI~ëCû‡5‘°õyáÒÿÎÖþÝ­ýI&ñÄú¿.Þ_| ëxjµ~„êk~ƒÎ»~kè¾Ã:mDéëê3ò›…Éo}¿qþYúž|â©ö´¼§Æ/ø­¾5ßÀo †õjì°—¨üN!ÿ CÚˆËgEG®Ûnãû(ɯä}RãüV×ý‘ߪûN éÛ,üÖ<¿Há©öµ!óµïø­©ûV(õû­û<{ýZúÞÆ„ã1`ßÖ}·5¿µï›/>_þ2âÃ>jÍo-ûDª?'¿üÓìò[9¿Ào}× ¤HÛÔU^â~cª½ÅoxLò¿Õïùi#üêg½ÐôýƒÞ¸oJ½?üëú>áOµõ~û“I_Ýð M7ø­G|‹´G|žýà¾aIcÿÇøßHáLëÜØ;L°«¾Åû†)Œó}ª¼ÖÿÄÿÚHa ãÖëñÐóÍû-Õ×öm—ÝüÖÚ¯¶úG}ãù“꾿ïFڈðaoYz?°ÞÞòKÿ; 3V¸åmŸ¸ˆ¯ïq>ÝHáL‹Ü˜|ÂC­˜–=åÑó’·3 Jcø7áü·'üÉÄoÙMœ®4SCÏKÿ› S5÷‚¼å?½îä¶›ßZ|öçbþþú¾Ó†=¼ŸÚÍo­öaÿÙ òýþà·ºümÄ®È^ào?ZoÀoÝ÷÷Z’w\ ~ÇCó[‹çÂÍ'fØÉÆÔÿU>ý÷–ÚÓò–þ²›ßÚXïÇ/¿ó[Íä?¸ÁoU˜ÅÆà“@ŸÚ¦´aÐ'p‘Uò_zÞòïû¥oOÙÓ¶ÁOöÍmðobؔƘÿ”W_ä½þw &¿|ê ~ë‘¿ÕFÚßÚÀoâÃl¤8S㵉7µß¦¾?ö½_˜ôí©ö;î›^ ýgëýÀ}ÚPùóÖNøÓl}ŸØÿýbØÛ í-}›ãy‹ß0ô|ÀÞâÃ_–ëø­—?€x3íÏ}1ì›”/ø­Á0Uá¿7ôܰþq}¿õ‘ñnÇ´N«©çuß¾ì-ÿà~ÿÑóæ“„öÿÞlÞùÐi#¾Öëæ·öýžúWöÖ£óáîø6÷ÛþD@Tû’ö]Ξ”ø­[÷»ÓFÔüä~~ëïû÷{°·î¾8i¤†?ÝÐ÷ þy1ü7Øð[·küÈ[þY Jµ¿k·¾-ÿ¶ÝŽrµ~má²ÿ™âElò[Ňßí/iKþÓüV“?ˆVµþºÚÛüÖÔz ~ëÑýýîø™¦Iíïûvù+lò[—ÆO§è4‚S÷”_ÇÓ®òLß¿ÁLë ø­×^²ñ2t_¶ÁoÝw¼€ßjñ–·àOjOó‰ïzâ·î?¶CÞÖ“æ·V¶êk~ÃxŸ¿u‰/ÇÈÒ§8žû¢¶ùµ÷y~݇l—½5.ö¶=j_Ù[÷Ñ~€´[ü– ~ë#¾Ò&¿UþŽi#à Üñ¶ô3ð[×ݯoÚî‡HqŽô¤Hñùvˆß°ô}ó[íqi#Rþ_;¤oo½_úößtÃ_Òt¾£ò{¿²‘6bOžq1Ò|DÕçû{½GÚgš¸Âeÿ[ò7Ùà·ñ›wûK¾ö³ ~kÏKi#öÕÀoÝw¼€ßê²oÁѹôù­ïÛþÇ0Ï…'ø¤®ï'ýWõ~§Mõi#Rüœ°·*^Ä&¿õÊ i#R÷á;‘6Vö&½ÚÞ{ˆî·î÷÷›Så7Ÿäž_6Ÿ7ŸXñ6ÒF˜øT;ao•ÿÊFÚˆó%DZ`ÈŽÅ-?>_öꃴÎ0’q¿‰õ DÔ¶Wª<ú“¹¾oû¶ø¶0\õýÅöæWMÕO{+ìi#L|lü5^°?|âÁùpØÿ´ŸœGic—Úsà¿5TžÓÞ®ö“ߺտ€¿ø­¿ì­‡aÉã¼}ô<ùû«¼²o»ôñƒ´!~ÙðoÒù Ž~íÏ3„1ß¶žOÜoá¼"ló+ïsè?&¼ðûßòî7ØÞø â×ð[Ó©ßž>1Ój6¿×Ô¾æ“<œgÈŸ ÷i#B÷9g€O"þñ¿5eÿ;}ÑQû;Ö‡ƒ´©ûÂ~ë–}à m„ÒJ7†¼ao9à·æ£þMÉ›ò¿5æfXÁ žð_ <.¿ÕUÞD¼ŽøKºø®P”;m±Ê3øo¤ê3ÿº/1³ã©¾x9!Ü|â;ÞÉo·þA¬¿§ û¯ǙзSóüÖ-þõ¿5äß„x“îbøï‡êKøR>ð— ­ŸÑö¾‡¸ùÄÒοaëûö';*i#–î‡Ï‚?™Î7¸l{nGóLõõ}»ìõi#î}ä¿õ<ïóæ7œ·¼ƒõ/Õ>Ý·aüþ&\ç×~‹^¯TíÛž—þwψØþ›ã~ö¯Ómûߤ0Î\ß6âl­/ä·2LwcŒþ>ð— Å£9à·¦Îi#rê÷ ¿Uç›~ëYúý6âèüvLñÒ†ÊÛð§[jÛ·u>8à·>ºÿ:HqBë1ø­©óé¿õÈ¿ Ž–Aí_Ö¤ÈñÖŸãËŸá mDÈþv6âúÓ@pÍ>ÂÙó‹û)ÒFœÔ|¿5îx¿5\ò¥¿¤ô­Ó†›KëÙ–¼Mí1ò;C÷MÚg8ß^¼ñû›ÚÇø ·¾ƒøl©ç¥ÿ¹üÒFùð[S|˜~kˆv6"ï~O~k¾òLüþ·}Í'Qü~ëX±øTp<¯ýœú ÒFøz1õ?ê­8v¼á~ÿQïÛô=ù Kõ‘ßpË ì··­oßýüV“?ÇAÚˆ%¾þ¿ÕåŸr3VüÖƒ´&¾ê¿5ïx#¿UñšÒFä’¾ ~«õi#`v^ðoŒ‹½ã¹°á~óÑ÷ÆøMÂ¥ooñÒFlñŸ@Üïó«Ê;°·=jïA<¡¡þ;ü‰Bý%ŸøÖ8ÿQ_ ¿UñNˆO²T>ãwµ'/’ßÃ_ò‘=ò¤ô?ê—Hqé€ßzBû7ù­²×¤Èç}¢=”/ÒFø|Ëo>Iê¼~k,­¯HqùGüÖ%þÄ¿5Å7=H±åOvÀo=.ù‚ßê÷üÉ¥ûò~k~½œoz°õ7¡oÜþ§}ño@tj†.ÏÉoÕøt¤ˆC}ÇÁo]j¿#m„‰Ïîˆßúˆ?ïà·žõ…1ß0~üÖô¡ÿlaúo>±â#8ÒFÅÇCàš¾OÕû­oŸ·¾ƒóßçÙëäåà·ÞóŠ?—O¢úóúº#m„ëþÝÁoMùÃ;ø­[ñ `Ø®x’”â·šâÃ9ø­®øk>ŸN|¿5BíAÚˆXïûúýÖó{Û¹úfêý…x±˜ïÞüÖ:OÞòÍ¿ôG°ÿ)ž‡ñIRï—¼—ìé~ëÑ} ˆ½ßé{·/}Ž8_U˜ñ2¶Úà·Üö&ùôzž¼O†¼&ôm¦¡il¸ÿ½ú¯ ÄçÅþéHá²Ïb#¨û¬_pt{ùMNIãzçH‘ò‡r¤HÝ·9â·>Šï†ÀB­¯ª¼ "øK8ù­â[:ÒF¸ü_¡ø5Wå9ö?SûþË·~ß&ÕßÖ·Åp¤í¯>/ ú›ƒßz¤:ÒF¼ó}I߆~åH‘W¾ˆßû ƒß;õþD}/†þÃñ ~«ËÿÏ×õß;ÄöÍ7ðy‹Ÿäð—œòŸqð[×ý½‘6"u?Œ@_ë ø­. GÚW¼U8R÷~«òšO¢øS8H¿ñ&}Aß^ZÏì­LÃÕ÷í¿}[û!^>'ˆNÍ÷ÔóÖÿ˜f²1ø´ÞŸˆßÄõ i#Lñ£üÖ_ÃÁo½öCGÚˆÿÅ ÷í²/9ø­7¾‘Ã_òÆOôËo}Ô¾ƒõÏUù [ï;ü‰ù{ø Šê&>q¨¾€?¥«ü@|Fè«n²·É«õí©ýüÖÐý¢÷@ëßëo¿5îü¿õˆïíèÞi5B8z|˜Ê[ô_¹ñ{–°!^òVûÚÞªûp¿Õî|¿5™æ³1Ï·jÏŸ±ü%ý(žçþ}×ò[—Æø­qõ‹ƒø Š?âà·æÐø¿5e?wøKîùÖgˆ_*|bèN~ë]ôm?½ó­¥ø·~ëÂÉoýzîð'à~~ëO…½Ïgª¯ì.¾ “ߪxå~/òvéëbïõû‡ƒO¼5ÞÈo•=£‘=ðÑó ýç\L>Êëø òÏtð[Mþù~ëÖ}ôyL¸õ?ùÆï„ì_8O¸#^®ü5ÝÁ'¹¿Oó[+þ ×g‡½õhj"dÝoºÞïûöxåÕüñ¯þ’!~‡·¡¡ËÃû{+Óú6†½•úø­©xv…aoã~~ëÑý¹ä}çsà>AñºüÖ->_a¦© bCŽ¿ŸXöD8B¾÷M~«Íð[qM@l½ÿÞþ5ŸXü ïÀ ¯?šƒßz†~oð[·âÏyà|óHÿ ÅK{T^ëÛºïñÐù†úqŸLñ þÅñ@~ëÖïK~ëÝ_ú¶ø<Îø­÷|ÔüV{îúKIÅëðŸXü OÅË¥>~kí—à·ºü™=!oÙçüÖ#ÿVèó«ÚËxi[ï·¾m¼ßó„¾-¾´ƒß:Äopð[ï}«'äý¼åõ}»âËø­®øÃñ€O,~{€ßêò§ˆöVÙ+‚þ’ºOŠæ·vü¥f¼ˆEL²yñþòo äº/Œùÿ1dˆŸˆƒFëWGØá®ï›ßÜñ[-Þòñ²]ýëxiòQ©ã©ÿeÓûÍ'‘¿_€ßzçcôÁ´âÕá>*¿u*¾ _쮇p¨xtз¢ζdŽ6ôW|8ŒÏèƒsóAU~ñ[§î[b€O"~aßú¼õâÅ•/>É#\|Å[ ð[ø=1$ï[þ¿e©?%ï­óO€ßj²ïø­‡iÄ“ß3ˆÉo]ª¿ôm7×};ßþ$ø8(VåÃþà·Žäþä·Ê7&âÓÝñ~ëOà·nùcE+šµÿÜòú¿/F’)¬g| [ñmüV“ý£¦´¹…7âå-=/{ë^o{JÞ.~|€ßzçLÅ'6=wăÇzä·ê>6äÈßĆâÏNÕ—ˆ—š*Ÿòæü¿uË~à·šîÇ¡Øõ}ÿ‰õõÀzùX~ëbš¿Æñ=ßøÛíÝH•TϧÊg¼\öwá|s×;ð[§îk`è¯ñ¾Ô~æ§À~à·šøj±ŸXöè¿õˆÏ—ß*?/òQýþŸ‹Ñì'~ëÒýO,å§€þ†øtò'ð[âG…]>±Þ/yoùëø­Û¿°}åÛð[MúM€ßº”O"L|âÐóâ7\ÿú@>Ðz7⡽_|b“¿R¼ù@ô~Ë[çéhC»!{(pË[þ Š™ÒØÄo9#>ç•OÙ[¯=(Äd/ äÙ²¯Ä†ÿžôÅ@>¸=ùÅwð[·âáÅ›DïŸØ0d‹È·âèñÉù†| Kþ-Áø­þ¾_üV—ý2dÊß>Àoݲ'ø­[ñžù@îy%Àoõý¶¿ä}ãmø­&¾g€ß:Ž~Oä¹üÀ¿u‹OÌ’šð—ô¡õ üÖ›¿$d)~P\~kSßæþ| üOãÜü*oá~çå8²os¿=Ðÿn{‘$Ï)ŽâwM•·q¿7õýAšÎ©ïóéýÖÿüíOóBûíA<ñãÀ¾Í4Ñ‘‘ã¯ù­}ÞÐ÷ ÿ]Î'Ç}û]oúŸâñE_ô·?Ü!à÷Q¾È²åð—ô;?›ßÚi¹U_É{é>0þM²‡ßø]ŸX|v[ ]3Ü}Ÿñ o{:%£îÃù@¶ì‹~«ë¼ÿ½»Þ!HŽ·¿ÌOqTÀŸò¨~ÆoXê_‘¿7Òt>¦þ€ßêÊŸà·.Ùcù@Lñ\üÖ-ÿå¿5®þÉÿ_ÿ„@>_ ÈoÕy†¾¶÷éý’÷{^¿Õ?.ÀoxÛhßUûòe•Çx¹Sõ;î›oKÿ›ò‡ äqÅ3ŽËo]ê_Ù·Mñ©#`ßV~…HÝ·s?Nùïá|ô—T|¯¿u›æò,ñüÖ-~]€ßjâ³G"^ZJ_¿õ=o¤â7”ð—4ÅJð[]ü¦|do}ô~Ùÿ"ßúâ%¹Þ_oø}üÖ> bÎ{_—Ìbï÷öŸÐóxQ·}eÿÛƒö_Žíñ:ˆ•Níu¬ÿ[Ïñb†ž—}´FâDüÕ'{«¾ÏøŠ÷’ä·Ê¢T¯ƒx`>â<‘ñd¯Ì>‰Î ~ë–¿Sط埅Ď/¿%ÛðúßæŸä–gô§TyöÝ[ÿ†}÷¾¿á¿ùš|bñ¿s€O¬õ&Ûpµîy2‡øÄSí-{ë”~•ä·®·?‘_|à$¿ÕxÞJð[CþΉ| GçÍ¿5àÝoüÖ©ó6²µeOä¹ùÆüVЀô »ù·Õgà·aȉx¹ºïHð[¯¿U‚ß:ï!'ìÛÎý!Áoµû{‚ßzÎÛýÖçð§˜zÎxKí£ýï¶'Ÿ¯ûÅD>T¾†ìܪðRü.ìß¹”ŽýYÊ—{~Þ| œ/à·†é÷¿õÆïLæZšßÚû³ê_ˆlúÞczé}ÆË5áMÿ5Õ¿¿óO&ø­¹ßöÎ7½à¿?ÔG¼¤Ôóæ7(ßÏ|ÍOä9:/%òL—üÖùPIäYw<Üø­8/%ø­Kù—ù@üŽ/ƒ¾}×;ð[÷/&> Çù­ºMä ñù’ñ[u^Jð[ýþ^Ì¢ûÂ4ð‰•5 ñrímåÍþ’ߺ©?$òw“ñ[uŸšà·šîOù@®==ÁoÝâƒ&ø­×,á/¹t_à·^û~"H(Y‚ߺÄ_Í 2Å'ÊüËò7A¢£ö÷›ÂˆKùmä§P|Šl~«ùcæV>8®¿öVùÿ"ÑØë?‹D_IýÙˆÉñ³‘M\ñ…r#^†ò‡%ø­¡ø± Jôý´¾¯ûöœšà·ž­õgCß–ý%¿õyßÏóu–Gñ f_äØÔ}tÅo |øÛºOð[o>Š<Èw÷#ð[]ñCüV˜Áˆ/’ëø­!ÿû<ð'“ýŽhÍ7T{©ÿ-Õÿ ¿!Áo=Fûu‚ߺÇ[_çßS<ù¿5®¾| ò-ç¾}ÞöîwRòJøÌ‹Áo¦|\|b»ö}îoà·ºøùéÊOý:ñéÄGJð[oþEÞþ/üO෺♤ã|óÕ¾æ?où†ñö¨¼’÷”ÿZ¶!w!í ð™_÷Á‰ø­{h¼ßúÈŸ‰|ÖVþÆ¿ÕO-ÉoU< tă?$ÁoÝâgg;F¬%>V‚ßꊑà·nå›HäÉÃû”¿õ(`‚ßúêxâo%ø­©ûÒD>Ï>á/âÏ"QË›2‘Ä)Áou{Û³Áo¢¾| 7?B‚ßzä/‘Ì’Z_à/¹¯>~«Wmo]’?ø­×ÿ6ÁouÝw&òñm¨±ô-¶·ù­%Ïs1ï·ñßúò„îŸHæ/ŽÀ_6¿=ñÒt_à·Æ‘þJ~«âÍ&ý%eßJð[=ßò7ÆÛ£ölò»Mó©}‡ëÍ#Œø¥·üÖÿtß‹@Æ}žÓ÷Œ'°Õ¾àù^Ï¿+UŸþÜç¸ßíù»ð[5?#Pï…ÀÛ×_§1úßý+Ôð[ƒñá OÜïç>o|…õLù“¥ ÓãüVßÈKò`üÖ¯ï÷üµýñéï÷|êy1ì­SåQßÕ/>±Ê£¼·pÀžþ¨ý'T~b¿zžçõG^ÏR|bŽWä9ä5†ÿ®âÁüD.ì­ïr<-ðBëÅR¼ŒP} þ]#…aoâï| Îx ‰Û^¢öÑÏU~Ÿo¦Æ÷‚¾ÍûÔÂí¿ço}ùYLå1~Ãm/ã¥ñ÷YÐÿüm_ ^¨Ió¦«üD>Ð-ù%ì;åßúÜõÁ/w aøoîI<à¿ÌõÂä¿Çõù@|i¼›ô¿g/ŒÿP} ü~þþà·"L 1ìûûbú©~æ'»íßÈ÷~ûwàßqô¼ä­x@…þ=SÏ;~ÃÒü@>5ô{‘ßzÞþ•þ·Ló ù@|¼íc¼4î'öm—<á/¹M¿ø­qÇ'òÈ¿­q"ž³žOœBåOøo²=}h>ÜÆþwô}É{NÏ-ýoèûæ7„ö“ 2×|¿õá}@áó½1âsoµÏ±ÞúÅû=O/Ž¿þø/„ë?ø­>ô{ßšñ–ŸôßÁsð[å¿Ü˜þ+qçß;ÒÀoÍ»>ù“q½#¿õ¨}—ß:„×|í῾ô½á¾-T¿1^’êÛÈæz3úÓöVÓú~«â56æý–·“iüߺÈï+àw,½_÷ís½ò è›÷ý¤ýWíoýÏ$äQ¾æ…Òùzõ| ~×S×ù†õ7¿µóëû ~‡_ŒøLÜïñ»†æ?ò(~Qá²ÿ “þå7ÿ²êo~Chü5¿µùDú~#ÊíÏùÿI{›žërÛZpþþŠgíöÞú¢4éÄ@Ð :©2H2ðµ+ÝvW•W_ù÷ýˆ‹¤ÄèÂÔ¯œçisëc‰Z$Q{y{÷{Æw•˜h}ÿ{ÿKüóÍÿêã|õ@úðñ }ë²ó®bäK‹ç³üt¶~NäKkÞ Ôû™×°å°ù}+dFÀ–/£.Ç–¿'>_ê,þyÅyËöè[»Å»oÜʹTŒz¶Cß:_/ÓõÄâŸôg<Ž‘/·x{úÍé߬ÿÑ_A}¢â¿7q߸üï'οÕÛûçóeóßû¿, ì‡z C|}]È—V|Q¤Ÿ[®o˜þùÄ}Ëëý›VÐo ž…óøö }«ç{PÜŽÿJ1î·Äñ‹û½øþ+Ǿ±oÔÿ õ^ÿ~Åý®ø÷+žïû5}«å‡Ø¸!~øß7ø?Ä?ïåâ;/â%Åî«6ß!Žáßžþ¼ß4ü÷ç­Çû+ÈO=ý÷'êe„}&ü[âŸ/äK™þù‚žçÕW/þ5?çtÜ¡gŒÏq¿ƒñú¾îoí­>W1\p¿#þý‚û­á¿o÷í%0òóÛûx]ß0#~³UÇSדæíuä/ÃüzQDL_³ñÀù~xêaa=}_×?ÞÞÖÓÓ*†¾¹úól=1ÊžªÇŠçYÐ÷Uoo!?ÎS/ô­uúxD=añ犗êˬзz=fÅSõsöûзÆúþBßZ-öÆzÊù2»ÿ~C¾@ð»ñ’ÍâÍÛ}»ÿ~Ç~ûúól}kµ|tËÏú:ÞùͨÄúFì·/ô­uúø)°÷s~oëb={‹Û[çëW_þáã?¾üâ‡üõ/?~õÕ—=Kžû߯~õ÷_4—×~ùçýx>~÷åýøÛÏÿþð+Íß})EïÖÕ³V>¾û°-Ôð·_ý·¿ Âþ ”M9áøüN´ç/Ÿ¿€ôíü…ãø‹Ü³«§ñ¿üÚlñÛþŒ-~øí÷_~ñ7åãýøúß>TóÄ? Ë£ÞG5þÑwÕ?¿÷üìãë?|ùë¯õ×ÿâ×».&××ߟöý¥£ìú~Iß/Fæq¦ø´p³biÛ†ÿí/°üßÑÔïxþøþ Ñ›ÇóÀ×_hÐ;aøþ‹¦²óÀ÷_ ïç/γÜÖ:6úù1Ü»ôÒ\]tæþ³¦þ‹_F}FµõOÿ²¨—m¹þä/Û‘a¹ýô/WMcˆú“¿,šlfyðØò¹õ¹Ðha _·iŽ „ãïuaúx‡M Ý^2úÓ7ÿôñýš²õžù‚çy0iÕ%Ùà’ÝOõõï¿ûæã×ÿõÝ÷,ÿóûß}ó§ßþæÛ÷GÏBÔbÔL`x¹_ýæ»ÿö›oféÈ ¡w¦Þ!ÿú6‹¦Ã c½¯j¤^H¡Í,ÿKKº•OlîûX«¸¼„GÆû>ávn ¯Œ7+Lxf¼YaÂ#ãñî„©=¡þµ7©?›ÞxQ{+õU+n„WÆo%<3.…0µW_Â0µ×¨?ÚëÔŸ.joP„ž_¨=¡þLjoR=²7އwÂ+ã·ž—JX2®Ô^¥þ´‡0µ·YaÌ©ò¥Œ©½QS{Býz~¡çŸÔŸIÏ¿¨½•ú󒽡¼ñûn„WÆÙÞ/Ù*Ì„©½Fýi0µ×©?}f<¨½AýjO¨?“žR{“ú³èù³½¡ÂLxdü¾„;á•qi„gƕګԟFí5êOS{ú3*ajO¨?rï7ˆêKŸo/lú|e¼½‚ Ï× —%ã÷%Ü3.©?•ì æk%,·BxdÜ©½Nýé+ãÑÓó µ'ÔŸIÏ?©½õ¦ç_éùµjEÆ’ñ[Œ³½¡ÂL˜ÚK|djÕŠ„µ×¨?ý%Lí êÏ öõGèù…Ú›ÔŸIÏ¿¨½EýÉöîdoT­¸q¶·^×'\^Â=ãún„©½FýiÔ^§þ$þ‡¨¾Œ©?ƒž_¨=¡þLjoR=¶÷ÈüoŽÌÿÕ—pâˆêK8ñ¿92ÿ³¨¾„©?ueܨ½FýéÔ^§þ$þgQ}7êÐó µ7©?“Ú[ÔŸÌÿ„ì-Äÿ„øŸ½…øŸ½…ì-Äÿ„ì-Äÿ„øªVœõQˆÿ Ù[ÈÞBüOÈÞz}”~Oèù'=ÿ¤ç_ôüÙÞ“øß${« ój_åßÏŒK%,×—ðȸQ{­^wj¯SF!Lí õG¨½Iý™ôü“Ú[ÔŸ•ž_£ú2g{/â#êîI8Û*Ì×B˜ÚkÔŸFí5j¯7ÂÔÞ þ z~¡ö„ú“ùß"¾½ˆo/â۪„á•q©„©½ZS{úÓ:á‹oiùFxf|û·KÆ·¿UñÈøæVŽ'cêÏÍÿ¢ú.Üÿ³ò0 ¿/áNxe\á™q¥ö*õ§Q{ÙÞ=ñ¿†¨¾ŒWÆ£–Œ¥OjoR&µ·¨?+ÿ‘Î7Š%ã÷%Ü3.áF8½¡Qf KÆ­ù÷:µ×©?ÙÞƒøÈHüOËÓó =ÿ¤çŸÔÞ¢þ,j/ó!þ'do!þ'Äÿ„ì-Äÿ$ñí3â’ø¶bêOæBöâBö²·ÿ²·ÿâBöâBöždïIüo’½'ñ¿Iüo’½'ñ¿IöždïIüo’½'ñ¿Iüo’½'ñ¿Iüo’½'ñ¿IöžÄÿ&ñ¿Iö^Äÿñ¿Eö^ÄÿÙ{YÄÿÙ{ÿËúÖfQ} S:µ×©?™ÿ-²÷"þ·ˆÿ-²÷"þ·ÈÞ‹ìõ­Í¢úî„WÆÉÞoÖ·j9„B˜ÚKüÏ¢únܨ?‰ÿYTß;õ'ÙÛ¢ú¦þµ'Ô¡çŸÔÞ¤þ,zþlï¬omˆêK8ñ¿7ë[¢úNüïÍúÖfQ} Sµ×¨?‰o[T_ÂÔŸÄ·Õ—°P„Ú›ÔŸIÏ?©½EýI|Q}Œ³½ Ù;ë[¢ú2ž'¾¨¾„õ'Û»½³¾µ!ª/áAýôüBí õgÒóOjoRµ—øß[3ÿ{+Ù»fþ‡rš¯Œÿ{+Ù;ë[KÆÚkÔŸÄÿÞJö®™ÿ½•ì]3y³¾U1µ7©?“žR{‹ú“íõ­Š%ãlï¬oÝ8ñ¿·‘½³¾ÕÒ5dLí%þ÷6²wÖ·*î„©½AýôüBí õgR{“ú³èùµ—øßÛÉÞìõ­Vž2áÄÿÞ¬oULí%þ÷f}ëÆÚkÔŸNíuêOâo'{g}«¦×£çjoR&µ·¨?‹ž?Û;ë[ÏŒ³½³¾UÓ•¼„GƉÿmLíUêOâï {g}«bjoP{‰ÿ½ƒìõ­Šéù'µ7©?‹ž?Û[ˆÿ Ù[ˆÿ ñ?!{ ñ?!{ Ù[ˆÿ Ù[ˆÿ ñ?!{ ñ?!þ'do!þ'do!þ'Äÿ„ì-Äÿ„øß${Oâ“ì=‰Lâ“ì=‰ÿMâ“ì=‰ÿM²÷$>2‰ÿM²÷$þ7‰ÿM²÷$þ7ÉÞ“ì=‰ÿM²÷$þ·ˆÿ-²÷"þ·Èދ콈ÿ­¤'Þ8ùÿÞ¬oÝøÖ+î„WÆ·žXñÌxP{ƒú“ü­ïJzbMwMýIþÖw%=±¦¿¤þ$ky²¿µ<ÙßZž¤'VÜ ¯Œo=±â™q¥ö*õ'ù[Qž,áNýIþíòd{—'é‰S{BýzþIíMêϤç_ÔÞJýyÉÞ/ÙûÍþíò’½Ußšq#Lí%kyÉÞ/ÙU+nÜ©½Nýé+ãAí êÐó µ7©?“Ú[ÔŸEÏŸí]PEëÆ’q¶·ê[Îö.¨Zvã•q¥ö*õ'ñ¿’ã%5=ûK¸gœøHÉúVÅ3ãÄÿJÖ·n<©½IýYÔÞ¢þ$þWjæÛ%ë[7Nü¯ÔÌ·KÖ·*î„©½ÄÿJÍ|»d}«âôþ«W‰;xd<ÂðÊX*á™ñ,„©½EýYpj/ë[ÏŒßJX2./á‘q}S{•úÓ¨½Fýé…0µ7¨?£¦ö„ú#ÔÞ¤þLzþEí­ÔŸ¬oUܯŒ³½³¾uãRS{õ%Ü S{úÓ¨½NíuÉxP{ƒú“ø_é™o—¬oÝ8ñ¿’ã%7Nü¯ôÌ·KÖ·*î„WƉÿ•¬oÝ8ñí’õ­Wj¯Rß.#óí’õ­'¾]r¼äƃú3¨=¡þ=¿P{“ú3éùµ—øv²wÖ·nœøv²wÖ·j¹ÜJ˜ÚKþÖ"dï¬oUÜ S{ú“ü­EÈÞYßjåV3¦ö&=ÿ¤ö&õgÑóg{Ïìo-“ì=ÉÞ3û[7^'ÿ_ÉúÖ+µW©?ÙÞ“ìõ­Š©½NýIþÖ2ÉÞYߪ˜žR{“ú3©½EýIþÖ²ÈÞYߺqò·–EöÎúVÅðÊ8ù[Ë"{/â‹øß"{/â‹ì½ˆÿ-â‹ì½ˆÿ-â‹ì½ˆÿ-²wŽ—Üéâÿ«O¶w%}k%}k}²½+é[ë“í]s¼¤bêO£öõ'ñíúd{WÒ·VÒ·Ö/¹±P„Ú›ÔŸIÏ¿¨½EýI|»¾doÒ·¢œxÆ’qâÛõ%{“¾µ’¾µ¾doÒ·Ö—ìMúÖJúV”̘ú3èù…ÚêϤö&õgÑóg{“¾µ’¾é˜NþÖZÈÞ…ìMúÖZÈÞ¤o­¤o­…ìMúÖZÈÞ…ìMúÖZÈÞ¤o­¤o­…ìMúÖZÈÞ…ìMúÖZÉÞ¤o­¤o­•ìMúÖJúÖZÉÞ¤o­•ìMúÖJúÖZÉÞ¤o­¤o­•ìMúÖZÉÞ¤o­¤oE¹¼Œ©?‹ž?Û›ô­µ‘½IßZIßZÙ›ô­•ô­µ‘½IßZÙ›ô­µeþWÙ»eþW[浑½[浑½Ù»eþWÙ»eþ‡rîdïžù_ídïNöî™ÿÕNöî™ÿÕžù_ídïžù_%}kídoÒ·ÖNö&}k%}+²¤fLý™ôü“Ú›ÔŸEíe>BúÖ:ÈÞ¤o­¤o­ƒìMúÖ:ÈÞƒøÈÈü¯²7é[+é[ë {“¾µ²7é[+é[Qþ!áIý™ôü“Ú[ÔŸlo!{“¾µ Ù›ô­•ô­UÈÞ¤o­Bö²7é[«½IßZIßZ…ìMúÖJúÖ*doÒ·V!{“¾µ’¾µ Ù›ô­•ô­u’½'ñ¿Iö&}k%}kdoÒ·VÒ·ÖIö&}kdoÒ·VÒ·ÖIö&}k%}kdoÒ·ÖIö&}k%}kdoÒ·VÒ·ÖEö&}k]dïEö&}k]doÒ·VÒ·ÖEö&}k]dïEö&}k]doÒ·VÒ·ÖEö&}k%}kÍñ’­‘¾µ=ÙÞô­ô­íÉön¤om¤om/ÙHßÚžlïFúÖFúÖöd{7Ò·6Ò·¶'Û»‘¾µ=ÙÞô­ô­íÉön¤om¤om/Ù›ô­í%{“¾µ‘¾µ½doÒ·6Ò·¢ÜPÂúÓ¨½Fí%þ×^²7é[é[ÛKö&}k{ÉÞ/ÙHßÚ^²7é[é[[!{“¾µ‘¾µQ¼d#}k+doÒ·6Ò·¶Bö&}k#}k£xÉFúÖVÈÞ%ß·7Ò·¶Bö&}k#}k£xÉFúÖÓó“¾µ‘¾õg{“¾µ‘¾õg{“¾õWj¯RÿÛ˜ÚëÔŸÄÿZ%{“¾µÕÌ·ÅK6Ò·~âIíMêϤç_Ô^â­‘½)^²‘¾µ5²7é[é[7¦öÿk¤om/ÙHßú‰;µ×©?‰ÿ}âAí êÐó µ7©?“Ú[ÔŸEÏŸíMúÖFúÖÖÉÞ¤omìMúÖFúÖÖÉÞ¤om¤oݘÚëÔŸNí êOâS{BýzþIíMêÏ¢öµ—ø_doÒ·6Ò·n<2NüoãN˜ÚKüocj¯QÿÛ婽NýÉö¦xÉFúÖ6ÈÞ¤om¤oݘÚ[ÔŸEÏŸíMúÖgÆ™ÿ‘¾µ Ù›ô­ô­â%é[Q>+cêOæBö&}k#}ëÆÔžP„Ú›ÔŸIÏ¿¨½ÌÿHßÚ&Ù›ô­»¼t%,gþ7ÉÞ¤om¤omZäâ 3ëÚÌú†6³¾¡Í¬oh3ëZÎßÚPN2cjO¨?IOÒfÖ“´™ò¥)Níåü­Š;á•ñÛÏŒ“ž¤‘¾å+3¦þ$}k[doÒ·6Ò·¢|pƒú3¨=¡þ=¿P{“ú3éùµ—ô­ýÉöî¤oí¤oíO¶w'}k'}k²½;é[û“íÝŸlïNúÖžëlÜ©?IßÚŸlïNúÖþd{÷'Û»“¾µ?ÙÞô­ô­ý!{“¾µ“¾µ¿doÒ·ö—ìMúÖNúÖþ’½IßÚIßÚ_²7é[ûKö&}k'}kÉÞ¤oí¤oí/Ù›ô­ý%{“¾µ“¾µ²7é[;é[{!{“¾µ²7é[;é[{!{—œ¿¡—¬'î…ì]²ž¸²w!{—¬'î…ì­úÖ„'=ÿ¤öõgÑóg{׬'î•ì­úÖŒGÆÙÞ5ë‰{%{W²wÍzâ^ÉÞ¤oí¤oí•ìMúÖNúÖ^ÉÞ¤oí•ìMúÖNúÖ^ÉÞ¤oí¤oíìMúÖÞÈÞ¤oí-ó¿žëlœø_Ïõ@ÏŒÿë¹ÈƉÿõ–ù_Ïõ@Sÿ빈bêϤö&µ·èùßî=ó¿Þ3ÿë¹ÈƉÿõ\dãlïžù_ïdUñʸQ{ú“íMñ’½g¾Ý;Ù›ô­ô­½“½IßÚIßÚ)^²“¾µ²7é[;é[û {“¾µ“¾µS¼ä'N|{cj¯Q’¿µ²7é[;é[û {“¾µ²7é[;é[û {“¾µ“¾µ²7é[»½)^²“¾µ Ù›ô­ô­]ÈÞ¤oíBö¦xÉNúÖ.doÒ·vÒ·v!{“¾µ“¾µS¼d'}k²7é[;é[û${“¾õ'ëÆðÊ8Û›ô­ô­}’½IßÚIßÚ)^²“¾µO²7é[;é[û${“¾µ“¾µO²7é[û${“¾µ“¾µ/²7é[;é[û"{“¾åÅ®Ô^ò·öEö&}k'}k_doÒ·öEö^doÒ·öEö&}k'}k_doÒ·vÒ·Ž\D±dœì=Hß:Hß:r=Å+ãäo¹ÈÆúÓ¨½NýIþÖ‘ël<¨?ƒž_¨=¡þLjoR=ÿ¢ö’ÿo¾u¼doÒ·Ž—ìMúÖAúÖñ’½Iß:Hß:^²7é[ÇKö~ÉÞ¤o/Ù›ô­ƒô­ã%{“¾u¼dï—ìMúÖñ’½Iß:Hß: Ù›ô­ƒô­£½Iß: Ù›ô­ƒô­£½Iß:Hß:(^r¾u²7é[é[G!{“¾u¾uP¼ä }ë¨dïšý£æx²QóùfÔìÿ5Ç“šã÷FÍñdCë$œü£fë¨Ùß:jöÿ Ò·ŽJö&}ë¨doÒ·Ò·ŽJö&}ë }ëhdoÒ·Ž–ùßh™oÒ·Ž–ùö }ë }ëh™oÒ·Ž–ùßh™oÒ·Ž–ùö }ë }ëhdoÒ·Ò·ŽFö&}ëhdoÒ·Ò·ŽNö&}ë }ëèdoÒ·ŽNö&}ë }ëèdoÒ·Ò·ŽNö&}ëèdoÒ·Ò·ŽNö&}ë }ëèdoÒ·ŽNö&}ë }ëdoÒ·Ò·ŽAö&}ë'®Ô^¥öÿƒìMúÖAúÖ1ÈÞ¤oƒìMñ’ƒô­c½Iß:Hß:Ù›ô­ƒô­ƒâ%é[‡½Iß:Hß:„ìMúÖAúÖAñ’ƒô­CÈÞ¤o¤oBö&}ë }ë²7é[‡½Iß:Hß:„ìMúÖAúÖOœí=‰ÿM²7é[é[Ç${“¾u¾uL²7é[Ç${S¼ä }ë˜dï™ý­ƒô­c’½Iß:&Ù›â%é[Ç"{“¾u¾u,²7é[é[ÅKÒ·ŽEö&}ë }ëXdoÒ·Ò·Š—¤o‹ø6é[é[Ç"{“¾u¾uP=!}«P=!}«¾U¨ˆ¾UHß*TDHß*TDHß*¤oª"¤oÒ· ÕÒ· ÕŠ—Ò· ÕÒ· é[…êé[…êÅK é[…êé[…ô­Bõ@„ô­BúV¡xI!}«P=!}«¾U¨ˆ¾UHß*/)¤oª"¤oÒ· ÕÒ· é[…êé[…êé[…ô­Bõ@„ô­BúV¡z BúV¡z BúV!}«P=!}«¾U¨ˆ¾U¨ˆP¼¤¾U¨ˆ¾UHß*TDHß*TD(^RHß*TDHß*¤oª"¤oÒ· ÅK é[…êé[…ô­Bõ@„ô­BúV¡xI!}«P=!}«¾U¨ˆ¾UHß*/)¤o•Fö&}«¾UÙ›ô­BúVidoÒ·J#{“¾UHß*ìMúV!}«t²7é[…êÕ‘žïÛ…êHÏ÷íÒ³¾AzÖ7HÏ÷íÒ³¾AzÖ7é[…êé[…ô­Bõ@„ô­BúV¡xI!}«P=!}«¾U¨ˆ¾UHßú‰+µW©?ÚkÔŸÄÿ„êé[…ô­Bñ’BúV¡z BúV!}«P=!}«¾U¨ˆ¾U¨ˆ¾UHß*TDHß*¤oª"¤oª"/)¤oª"¤oÒ· ÕÒ· ÕŠ—Ò· ÕÒ· é[…êì‰X KÆÙÞ¤oª"¤oÕ·&ܨ½FýÉüâ%eÿ£z Bù[eÿ£z Bù[…êÅKÊ$þGõ@„ò·Ê"þGõ@„ò· Õª"‹øÕ‘E|dÿ£z ²ˆÿQ=¡z ²ˆÿQ=YYO,¤o••õÄBúV!}«¬¬'ž¤oOÖÏ'ß'LÒ·Î'ë‰'é['é[ç“õÄ“ô­“ô­óÉ÷ “ô­óÉzâIúÖIúÖùd=ñ$}ë$}ë|²½'é[ç“ìýÕ—øø/¿øáýË_}õe£>÷¿_ýêï¿hÿùåŸÿõãùøÝ—÷ão?ÿûÃTfù»/ujJå²4òö»ÛB ûñÕû‹Àš ÿ…•M9¿áøüÜ¿p|þÒ·óŽÏ_¤ž]=¿øå×f‹ßþðglñÃo¿ÿò‹¿)ïÇ×ÿö¡ëìÿ`Ùõ>–©E4¾þîã¯úç÷žŸ}|ý‡/ýµþú_úº&N_Ú÷‡&?½¾_Ò÷k"óŸïØÃ~Sü#-?×_ N÷üðý¢JºóÀ×_X­¢ø Ã÷_4Í&zþøþ ôýüÅy–ÛZÇF??†«ÃriHñ6×çÿûÏÙú/~»ê¾]~ò·‡E|»ýÔokqG±oŸüíª¡+øöüÉß½xÖAú¿óóö¹Ühy _ Ûÿù6Þ"áø{]ž>m¬"ÂÒ57Õ;æ…þôÍÇ?}|ÿ£&nÅS½gÖè?VajhbͶԿ¶ë_þêýùÿñëÿúîû?¾ÿÛG±ÿYþåg?~6ëÑ£ õì_üê7ßýû·ßüxK7Õ*ש)¢÷üêÛßü.¾¯–±êáÛZï«©·ß©6Ì.±²¿fŽñùÙ]Ù›æöz—Jì¾S(Ÿ¿¯€ßnø¹¼¾¢‚9Àññ6Õ*üä…/ä±€M_Ýçip}B+üœøû»mü|¦¥îÇ«ªäül‰,~Ç·k5`ÿìók|Då÷/®Rï«—*€»!Õx*œ»ÍöJ•:¼C+†(üoÕ`À¡ß}ô‰Tçp¬¡2‡wªwð³sšq* «ÚPÀÏnôÇú¬‡Ýç%?ê(UX·Ùu¢öÔî6lÑ[ …m?¯:=wCª©UØ÷óê àçó>êQU¸ ‹€vÀý¼/®ð³ïoif•5¼Uo;w7t )ü4ìÔ«* Ý Uz+\%ý°ÚUuãŸPóu½¯ÎNÀ~ý°ªΰÒd]ïP* ì: ~R½÷m6$UÉPuØ)Üv½Ú­ãzù*cx‹z¯?zŠõY“tq¤†w_[CÛ®E#ãŽ=œõ" pèHå4?׃*_¸»±íÚ4I¥ÂOrWžÇ†³jÎ(Sé™dª\8SA… g‚j^®=$¾ŸÏ;ÕÛøù¼K/K?»!š Aá6ìlf •,œa¥Š…=`—µ» ;U'©ð“«œÑ­r…3BU­°'wEtÃvæ½K5ž€óšú*UØccÙ/ÑÇŸ·acõÒ<\ïR©pîçUï;`SKvûå¹t!ô^­zMA•(¼ã±=N oÕ‹Àq½}Í¿µª­eªNx!ÜÃY}´ ?‡õýÕ²W«nO0Ô®H@øÙ 6BU—p&¤¦ÝÚï¤YCŸv»Šö"Ò~v£[ST’ð–½÷ëÕ„[g±V=‹k%…Û®a*U#ìN.‡Kw,»ìÝ?yFŠJ^Y6QT‰pVIM´µßgÀO»–çµåXeûðDªBx««Ü«•ÞÝ®kЩáÅMà6¬^ì)l嚪?Ø¿ü܆լ¡êƒwŠ- *>xeÚ ÕÜZ{ Në՘׀UåÁÛ—MnM¬uæœêö§Ýzµ [õ6_áÚ»¯&¿lׂ¤9µ^„}B•¼Ï²uB7Ç36”PŸ1©‹ø ·a‡fùìºGvûî§a—^á+Ú öqUì·Ýí«Û®µÚHÑ®ù³Þ®×‚€CéÄ´GØvõW“g— Ú‚óË*-x_œ×O©°àLÍ›õÚQtÃM®b)WUÁ™úš4ëLPÕ„™õ=žZàV>?UOp&¤í³«šà¬ä*&xÁ‰÷ì­6Öìꛯ* ö khs« n»M_(ºS‹5´Þk¬/ØÕ†oOšj°}­«‚`¿Þaps+y@6ºêbMéš+öÓ®ê`‹]Å öÔ®r+ˆQØ®iÓÕcñ> ¯¨ënKj×´XF¥Ž‹;w][b™èškï‰ËþX®ÙÛ•S–G`Ø®§×‚ºt€›Õ Œß®é°Â°]÷Æ žýiµ¶k.¬àKýiµ±Ñ_Vã]aÅPéº ÅŽÙuyŒ•½«J`î2 öôé&WsaGéJ²b*t¥oíÑî&W¢yÒåzü7ö¹Ò (…۰¾Šå¸+K~EÏO ÷i ^è Öj[uW]@Ì…®ï*æBWUÀÞ2uYì* X „·kÊ«½­ã T´¥« ØD×|WÁ{·²SVW5ÀÔ˜N ûi Ìj;d×Õñ<¼ Ê3Á•»ê6•ìÖ‹M­|ìª8CPE±wÕœñª€ØñWg~P+[$»ÞÿŸ!¨ëÙrzû¿Œ›ŠÃÀÒÖÕøû4× *gÕŠœ€è†ž_zgõ‘QÁYÝ8ÚÂy»zë¿7y±Ÿú4ì™rºÛí²¬ÝOî×&oeõITA­Œ=t½î?¦ÒlVÁ¥ºö5Xh¯ ¬'N,‡gÆéM¬ó]/úãÕ+(k Ëm»:kézˆÝÝÐcTo V¾Jèl§]SXÅ¡¹kû{^`¤èÿYõ~ÿþåm×¥QN •Z¹åôr?6Û®wûqð횺*øP×›ýà ]/öƒyt½×?o[¯õÙ5kÕûLìÛ]/õϤÒ;ý O]SVOéz£ÿ¢ àRzß njå´¥7pVß}4[Up©®—ùÁÑ»Þ埩©ªâ\Üõ&?,]/òƒòtÍSu½Æ?ïW³TW¦—øÁDºÞáok´¸¹UXCoðc§îœÕÍÞÁ­ÎëLÒ; Ûl ÕËû3}õî>Ž«]SSÅѯwpVŸ8ê=;/TøÍï±,êµ}AõM@9t©ë¥ý±¤ÞÙŸi5à¸òu^o새u½°? ÒPÒÝÐëú³Æ |ÑËú³lè]}y–½#MEu^™ÞÔï}mYCÛ°± +ŸƒzM,©·ôg W>éôŽ>Xj×TqPìäêµET/èÏ+ÓüSoŸ6aõzþ¬ôz;oqr…Á¯wóg—8®Üä*Ö:GÐû,ð:1°V;¯v½•K‡Ã3_`X#“]Àz<‘²VŸ’z!æ‘æ›:ÔK¯ãÏ@ÒÛøÃy4ÙÔy¿z_Ê '_׫øóËpS»©OÖw˜™É•^Çs±ë-ü™ ê©?O4aXssu½‚?ŒhÂ#èV/àOŸ5¿ÔýSm^\z“\l˜ir©3D'<‚ËÖ ÖêkŽÞ¼oB!7­éfÍ+uÿñ&WA'Ž%lµ®³Q×;÷pUõ…ã€ÿ±Þ¸ŸÁ°àô}aÁ%x>}çµæ,¸Z}\i2©=k¬—/®ëUû!¢zÓ¾©®íg i©‚òÖ {½¯Þ²’§I¤öPYöÝM¯‚ëû™e ôêü”\‡ù¾@ÌkÛõzý,×z»ÞŠ®É£Þ²05Æ— ÍýñÀ°ÖÉ¡™£Þg`jŒ´õÅ;z¯ŽÙ¡×ê1®ÆÃÚˆš4ê]«ÊÐ;õXú†^©Ç4ðÖÿÐ õpåŒ>l[ëÆÞjÃ{<à­æ­š,*.ãIüj<ðµÚ22w]uk×xëkÏ;sCê,pú¼ÕÖØ¡I¢Îkލ˜°CSD…Wsh†¨xƒCDÅàßñ»õPˆ¡é¡bk/|‚vØ/ø•-#ão=ínÆq43T,A㿲óû†óL«¡i¡ÞÕ±ÃÍ kÝФPq/|­çí@ þ˜ñÂue‹ÌЄPç-¼jX?ð M|ch6¨óš *v«¡¹ ‚Žg«fP¸ù•q†&‚ÚVOC—Àc+MUÞ·æ(ÉÙ: œØþDšê MuÚáEéöÝͯ|w'Ï>Áó€jØ,×F0 |‚>T4õSœ†f~:SR?…ogW; Mûô¢ú% œÛ”û7ÂМOçíWø}ähƧÓn¿ò—¢ùžâØ24ÝÓy"Íö4`Ãq.†æzúìEµÕ®nõ Ÿ ±¡yžÎÐÐ4OÁzF½²ƒÈ¨ð žf·]‡–r¼®††fx V;Ôµ§¡ùâ@;4½ÓéF½²ƒ×hð úlÊ[c]l W>3tÅçãh`æúæî†ngëЬNqøj†ò¾öNx«w‡žô‚ÝK‚"Þêk›æsºŸh¶Lþ‡fs:£L_äÝ«d؆ ×ÇæœžÇ\z1ˆÙ¬yœÞ·‚\§ :ÍâdsèA(HÁè0¬‘‚ÑA¯|ÎuÖ¨ ÈAìÆCó7é«äà BÍÞ·!£;oõ†úý~5uSG½2¯Ø†A¼ÕhÝè0ìih^7r£ƒ·7ºÔ¾+·†Š-ÎN®þ…8àÍ×´×r¥c€·š›~ ܸú ¤ÉšâÆu Ö …NÍ3€‡Ò+¿…*9 ê=t©=³l@"ðØ# ܸ:eÐóXк1`X;´ ¥àg:ë*vöÌÃÖ×µâÖåcÀ)èì½²{¥¡¹™ânè‘!Î[agqÞ:íßvÀ°NÍnl£ÀX.%†D†¦dz‘‰Há¦W±ëúŒ+½>ïHàmõq%0¬ÑÉ¡[éýS*pæ¢ `ñX·ö`öz•íf×âƒ! W¾ýŠÖok‡àÆÕNÒC—¢¸ìš‚é }î³|Mw·bjþ¥35ýRy:|NcB#0lœp ÚñwLø[™jê¥Ã'èÕéd[×2¢y—î>oUŸÓ˜à­=Ú×mɘ୾PLÐ+gÓWÙv²špéìóšo©<*€¡é–â³á½Ï/Ð+_¯4×Røç†ÖК Í´tFM´Nµ¡N³/,ðV§Þ ßø4ÉÒY‘x«³­îh×®\‡ýro×ÈQÏcÆ‚_ðtrÜgezµ@¯N7æ“:¹éU¬u †õ¡²à¾:¸.^#®v>~A›Gò€·Z'7ìgͨäKøí틊Ø5äÃuá-ÈÃÚ˜”î+ÛDs)Åj¶C]Ÿ3Úå_Сh"¥»£é,šF)WH0í–U t !P úR/·ÙÆ Ä”‚¾@)è® §ZuÑ@ t±‚TÜfû¥JÁ¸d(ýÚ\*$˜ç§¶_ðXEJAwnI…ÃÕ<è¢JÁØžDÎç¥T5ìÕ5®On³{ ¤‚1Ù!ŒáÝp›mNQ©`pi¸Í¶=eÃqNé »6ESmêòÜüʯSRÁ9šï(ÄTbRAs«¤‚Îcw0ê{½2H]×" ÄÕg ¤‚±^A*xgÖk›0©à1Î*× m8Ø•­˜TÐä¢)޶Ÿ{T@½v5g@*ètKT$P tj* ÆÂØÕ°15  ktÜgûÒ© ñRA?³KwmkÀ™žhó+ç±^LTÐ<¢) , †%C*øØóÎyí8 Æ …TÐï@d@&`?T0vâj0¬ÑVЯeÀ/hôR ô“µ@+è JÔetZ ô³¤ŒÄ¯6¼Ôq­` þ æùtÔëuC+èìKÄ­N†ó«Çš7ßÛ°ë±…RA?[È€¿õc]×T© ¼DàoµCŒèÕ{†÷>©`<@ƒy>­õ0DT0Þ§æ*:ƒRÁ˜ë º#{Ãv I÷Ù¢iŠÎ+2© ÿRA×§Šæ(:£RAw8 ¤‚Á/D {=àjé‰Ö=}! ³O§WØ57Ñ!&´£¤˜TÐ÷êé¼µú§ë¢„zl—1ˆ³¨@+ Ò„Ó<È­ SZÁ`†uŽ0“ûJ”dï+[±^mÃ^íÊuÿ'ºÄjfZÁÖØ~Á·Eš~ ÀÖmZAóI´‚î“•Ä­bZA_Ëõ¾æØ ZA¿Õhð: Îv´àtâfbA*:®ãÀ' úáX4÷Ðy|ˆã-@,øTÛQ®>ø! ® ±`¬^+‰[bÁØaü‚>Ú!Œ¥bA†\‡OMˆ}yž úAdGƒ–ÓÉ ± ÿòÔ\Cq› º¯kB,轚Or¸NˆNˆÝ!·¡–7!ô·?ømáß! —dB,è¤`j‚¡ÏÓÄ‚6épj Æ4lƒÊ×c ÍôÊV ¯‹Õ ±`XRysÆ&Ä‚NF&Ä‚>%çëWWbAÝ8ËCü„õÒqÍ×yë´Ÿªë8]&Ä‚¾iLˆý¬<_Üt*Ú /Ë„XÐ’SÝßá › úìÆ¨‹¨ ± ;?&Ä‚×ãÏë"jšXð<ïç‚d"¬Í'ìT±`LÉ©tö}:fÊ„Z0†7Ô‚1Tô¸rF,Ô‚a U Æ™uêö"Å ¹`Ì…ÃÚ4 ÜW§¡^/ã|j@.è‹ê„\Ð7‘ýêž³MÈðš0(˜ÚDLVÌȯOWIÖPzÕmLB.s¡BÞjëÕ„\Ð SÅþ;kòdOÈ}óšš%(Hý¬âòXCu¤_VÃÚÉcVÐ+ŸVÐ úÞ=“UŽGzÁ˜tšè¼#èý”6¡t6=+î³^MèýŒ>¡ôîDPÖÕU|aVømAžÐ ƈ5½ ?Qƒa}^ÐO‡zAgñAY1S ¼`½ˆÍ„^0VÑæ÷Ùx^Mt¬½ ßTLè}óÚp^ƒzA¿-œ †=ß•K4¡Œ«)€" q6w_yCsû„éZõžÐ º»nvŒ_Me9 œÐ ÆÔÔ?g½‚^06/èÃVš÷ç¬ü݉+Ɔfý9§»ÃuÙ/·Ë¯05åOPˆ ½ oåSõ‚Ûƒ®Ç²ÙaØÓî˜ç˜2»Ç¸øO™P Tâê˦¦ú‰’ ½ Ó¼ ½ ŸZfqõ%h¸_ÓzA?ˆÌÞ?~¯sÉ ø®azA;ZMè£WÄÕG;ô‚±@A/Ö@TV †¿ ïtÁC>S ôóî„^Ð]Ps@ˆéczAWöLèýDû ·acOQ½àãZ—×%OŸÃéÕë𠦙ÞêórAÖœ úuï†ã¸É&䂱i&Ÿ8XNeÅK0¹ [N`×Ó®¹_ûã&çÄ>5‡OÜhNȯnŒçâ&ÊrÏÈ„\0¦¯¦ï GÉ„\0Ö'“ ŸÞjæ)p :÷T¹`¨&&‚²b°C.èGØ9“¿uB.èÄ|B./e"xÈ<2Så‚q¦™* W×DT–;¦É1Mç­àb*,¥ÚR§rÁpÜÏ «ÝyÌé±Íz¥nAŸÜ•µ=}˾+×5óÔ4=q/5!Œýg&·àœ0l‹_V· ÏWÈcKYÐašozB.è½sÁ°¾0@.; ä‚~‚ŸšrbŸxºýñ-œ Æ#,Ö®1&ä‚. þV»M™ËrÇý„\08ïJ:Ì ¹`pOÈc-_8ø ¹àõé¼y²âuC.讂¹œ·ê¤[ ú/¯'é0—&â‰w´ ôK޹ ë¸²ž·ï‚\ð•ø®Öú¼ tZ·L.hƒ=à­æË[ :ÍYOÒa»Æ¹ Ç—¬a.Ƙ–ÉÍ8Ë䂯L×ÃÚ¼ ômaA.è»ñBX–ŸZÖãÄø©a.þø úë^ ú¹sÃvœ† rÁ*E-Èýýn(gA^ z,Æ#ýr»äÜËä‚F76\gA^or_-“ š+èŽrèózA¯l´B²ur!,Ë…> rAßœ7¼î³WȽ«ž-tC9'­¹ oÎKï>VÁrµ–å$~A-èçŸUšíOµ +vÔ‚¾ð¯‚ó€w9Ԃ˾{ëâ²â  ôû*‰¶.¨cVA-–+ˆ²ÍjA-è áRµà–uá}w·z7f?‹U?dgWÃÚ]—ÛhUÒÝiA-ojA_qâ².X.õúRWðòµ ³µ`Ì׊ó€mtKÕ‚q¿ tη*®³Í· ŒÙ\!Ã46¹L.x¾;®(µO(åø>䂱 A.XF<¾ê[K<Ѻ 6¼Â³Ü‡¸ ŒÙàoµãß‚\ÐYÀ2¹ é‹vè×sÝ÷~«$hÃu™Y¾Y­æôJ¬›¶Æµt½Ü‚%ºÑûµ-è š³ ŒuY×Ë¥öÅ%á1ä‚agÈý°ô ×uì\ ôÊ‚oä‚î&[*ó`…¹ ³žÕóîà rAgË䂯@hâT¶ ôÝê)~h!0+f ä‚~º:â‡|—€\0ä‚NT—ng½‚\0ÖÈAÀ‘~V͞܂KWµ÷]8Ò,ÈÝ­¿ tëêÐaú¹`ŒgÈc¨¨EÏì†\Йچ¢”_ãW—fù,ƒ\ЙøÖù>é»õÒÙ.ÈýTö [MŸ¶ëôû •^^mÿ¹àkŸª[зAÈ]"µ Œurà@௠rÁxeÁÙv»½˜å|yA.“] Ã´óÐ2¹ OÈ\ïÈHŠÉÙç!tÝô²À,s7/ȯ?®Wøî2¹ ï8 ^ iF!ó©-Èc†B.ïW˜ZÐ×6¨ƒª,Ï®öS½],`ÁÝêKŽª¡€ZÐÊ;žÿ½…©k<ï¼Ü( qY±z-x}û]0ìiw]9ÞrAŸìŠÇñ oü^Åý쌊×éËÆ›dù(V|m×zÖÅr\·K—¢xF¼Ø®®øC*¾ÈôƣϭâyÎ4K9tDñ8!ÙÏë¢]q? ÅëÜFm¬AÛv'ªøò&m)϶·¯[ŠånÿEà¶QgÅã~( ý¬¯øÒð)¾œhßÞXÅrn¿7ÞÄÖ£Ü~¿>Н%Mñ:»¿ª¬Û9(ž·ý¿å×9Š%ÿþ¼tŠÇ!±¯Ë墸óžâu\™{áÒ0y[ìË•hžµrÖ,Å#^Þ{üénþ÷e>·±ÆpØLñ<6·rŽUŠåx+6îïý~!4¼û3.e¥âvϧâ™sÄÛ—šÿ^ãb~Bnè _ 6¶oñ¿7î¿!mÕÓîñÑ¡ßë~9>Åé}T0àxÕ)°½Ÿ £I+·Û^ÐÞßê=ÿª0l½2ùáëã¿‚ Çû©~ÆXþùò­ø[l,-.ó^*t³Wû3½è}(î÷|†ñ6éùEí}¶c’yæRÅãœ6žÏ‰WUœ–?HÏûØûêߺ´{ ÞéŒnÏÀýd=ܸ<÷øÔÑ(ŠçM'!v™m¿JƒÏðÙørÞlüÞÓ4ç°ïO\ÞãqT|¥ùÛ¸>·ýšÛí Åd,Ÿ¸]©ïÏÜ^¿’j('´~ãÍþbûEÚ€³|o|¹”4Ы]Óë}‘Ô½/´“g8Bþóí¹‡SóüLÅ»×.ÅÔÆ½åî®CKŒœ¼–ÿzÚMþî§‘K ¡øJ×·ñ¼ÉÏÛ ¼¸º7×E^0ßuG5æžÙIŸKb«8­þ=ù±÷{´t÷d7ÿ\bÚ­ŽâyÜþ×r¯–Ý5®Ã?¿s )Næ65¦]n(nG+¤x;‰Ç•pGñÓ²±”{öA“yv[„¿…ïä…*óì.È•ÿýJ¯Â̳:#]þ.fžïC›é#Šû¹ ÙX}­a$Í÷«\ÅëÞ!ÐŒÃꋼùg¼™DÓG/4šgwùpóB¥‡w@ÿ«7"âÎî5@þb÷Aþü3ž!Õ<»=´š~¡¸ßãrMœ ·{÷Dhܱ›gµGý8ܼÐlúžâÛ·ý"•~_È6Ïn!wÎ÷ ·¹ÃõôB¸®›éôÏðtólîÐnžÍ õã¬òB½\ÿ5ùf,®’”'Wëkiõcs3 çò×%ž¾:^Ïýz‘ôñlþqžï#bî,r†¯àµôúa^H9ãªà…–ÓãL÷ÛüHþè÷튯´mŠÓpƒ ó oäÙ?öGȳœª¦3dšo{Ÿé UçY.‘lÿ wdÛ?›„‡ ò<ö†Ì3\½/ÒïÇUÕ»ˆü-²7‚êîöÇ{_ËÁïËÔžîK|!÷LŸÏ£0ÙøÎ ¥Xîñ‹à:uP|å¨2'ÖyÿªÏX dŸáš/HÇËwð3ƒÅòûrU/#µ¼½Mþ‚ì”'%áÔ<>Ïe¯ùçÓÏ﵋m”'•þ|ªlð«€¢92*—o© È/|{¥{Å¥Çûw—Ø ÑÓîùýi\½Á xíÿP †w¡˜Õ¯bJ.°ñ-BUÜîý2Ô ï:Ô³ßL· ”¨AÏ ¤¨á«*ú;ë‰Qãý·7ŽexÆø=™¹=S6Tÿ\}±¾Œ¤õUœøD©g~ \ÀyŸ¥†o®@—zÖgT ˆãQ25œME«æWE‚^—§Úþ޲¡Ì(–Í2öÓ§ŸC倳>@¡ÇËbµb=Dñ€ó~ R=û+Êœù™êáSЩžõA<ÀêõÏ5Â*ö+“ªÆú;“Xq¿|eNû3¥µR<ïñŒJg½€bõð¯éÕEm¿E1³ß˜hÕ½GÅÊ Äø@=Ã&ñíé|{úçŸÄÎkç(÷ö8SÅý¦ƒP¯zLáÆ³ÞtOõ«›ž½nΕ†?¬‡ž/OÈdÛÏò”ÖŸå7íö}¨XÛQ/x–èX=nQ±ÜÃo9þ÷uäÏnÙW f=¯jÖóºPfàÐoèYÏò£…®ã­^ fcË|ÕÝJ·ÝS j=Ë;T­áÊ/(7p¦t­gùFÁØN* [+„­1\êã®m<µT˜~P!l zU­ì€÷¯>©dæÆõÊë¦øÊ\¾±…f ÿ~ë×ö[CØŠá[§Û·ßç¥ü¨¶Æt¨OªIº±\™Õ‹ÎUÔ ˆñY!lå´ª°õCë“• ÂÖPZT[ƒ¾U„Æñ°BØË[}=§+èN…°5–Ó akl·õuç6æk}½”æøV’T«HàÛS5a«/G5 ›W!l oO…°5®–*ÊÄñµ¾ž'+ÚÓ|ñ>¬2χ akß*jÜío:ÂØú¦"EŠç%̬¶ž÷W<¾8~ï«Í akÐÛŠq^!lí£–”LãZ/gz5a«Ïß aëé/*„7°BØÇÑŠZg>"ü0Ž;ÂÖPJÔâá\ÓO½­7–k»ª¨XÇÙ akxG+jÄúW ÙÂÖÓ”-8íU¿j·þCØÇ÷Z¡$ {U@ªþyé÷ü±pÄrþÞèöò¿Wok÷ùmY5Ý™_!lã]­È´ït§’°µ¢ˆA¬çÕÂcM…­«Ùkеž§-)_°.“÷]cÓ‚ G7Û kõ _ŠÛEv[ñÒÿ¾æðÃyƒ®õ6׺Éfƒ®56«†Â áüjеžÙY³´¡¡6Ãy¾š£ÈZÍd»¡€<Žèó¹éc]_€Î§¢Glÿè|º4ôÈ?:ŸÚàó},žÏ17ãs›ªçsì´ñ¹m¼çs8Æâsó“Åçö¨þùõä·]5~L\4‰OÕ,šÛ®?/uÕ?ûZþÂ×§VÑ𯗟úus7ù÷ߟüý©êÿ> ›_tÃ^>QøF¿uSf謫Æ5(÷j¿ÛïÊ<þôÍÇ?}|ÿ£¦WÅÓ¼OäÀ Þ«j9÷ãüŸ¿ÿ¿ùö÷ÿÏÿø»¾ùÿùÍ÷¿ýæ‡;e‡¢íßúê7ßýû·ßühÓB/ ÁÖþú·ü¿ÿå¯þ¯?ýñüæüþÛßÿÿõ/?óŸÚ–ÙËy˜K#»¦.ùŸ;‚'VÜ×l2>?û±+î> ¼Hö¹ }Œ Õ µ“ N£{¶r’µÆ“`ŠÅÚ­N xéïé}tñX»ŠMJ1Ò$woÏvOàËA®GÄþè‰Rqלr;Úì^õþ 2mTï Qâë¿o±_Åo"¡ùïYìWüþBèûÀ÷­(qÄâ±v'DÅëîï‹Ø¯á¿ÿ¢îÓ8¿WûóNÇCVO7¼9Äêð(6ùw`œ‡ÿ½9H•Ó‹µ'Ì;({ñ¿ï ìÍŸg¼ê@þý‡e<Ÿ Ô´øóIËÏ#pXuÿ}u.p6ÅÐGÿý… éÇÛ_УTü>ô‘¨êd¸ßöGµ1„ÞLâù‹¾9ÛOÐGŽåã·xÁÍâ¿_qAjÏ[¼äæão¹úç–j!~ßb¿^ÿ{%m.” bíö‰ñÃ'äæoúßêýÄ>ÎáòƒMÿÓ OÄbŽÀˆçÙönÆùˇÅlŒX;PkÃ8CØz€"î -k‡ú¿†qdkþý‚ù¿ü÷ ôˆÿ^EèsÇп=þ}Ëü$Ý1B­«·¯éµÄǃé#²tŸˆ¶{§¿ÕG^Ÿ£Â[}ÿÕh»Õ}:A‰üE†jjæC°]> D¾/Ãk#†ÿœI_]µÂ,8`„Úõî\D7åñúV c@º4]R×ô…ÂH¿ÙRÜ¢†Â¥QžÍ¿½=uOÇEœ–ñºÙUy›aBõüøo+¿Í­ Uä»|•DQ„çqÖƒ;„jžúÖ¦ã1¯6j ŠD¬°&Xˆ] 1v¯8+wÔÅß×v ²{á9Ùx³¾»>‚ìúë³ ôö°@THèó<Ù-ÿÜJP½ñ9vY{âª_ Œ{ŠèŸÕ¥þü÷"Óûc…¨ŒE È®5·'ÎÎçyP,a<>+­Z‚øïA9ª¿} ²~¨"kõç›pŒÆ®Ž »ÞAY§O M¨Ã6‚ìª]›)FZ÷ß눱Þ~—üû*Ì'0ì4ÿþöÔõåöµâ ž¯bAvÇž&‹lð»+†ê_–áU²}-±HÙ–YäYÅ–Gü«B]/¾*/Ïöoí¡ŽÂýû1¦Í¿¾7 ³R q €,òœ’PLá°´å,»yÿz½w©å,ûñßðÿþ÷îŠ×OÂ=ÛCàŽßßö.ÓwmÈ"ÛãöE]yOÿžﯠ²B°" ²‹U¼@Y+îm7ý\=¹Å‚ìšy²7Þ¬ïþ\e¯±~ ²ëæèW|?¿ÙIÇE‚â~"˵í‡áÙ_÷þöy±À‚: £ØjmQv±Þ”Ç Tï¿€eLÿ|> -(¶ïÓ¢ìb|•ǯśA†UÐþëpÊ+EöéýEÉ”Í1Ü/SPtYâK½N‰åüªŽ­Ü}÷ö*î!1Ÿ d‘1Þ J/T‹2+eó· øÂz|ü Ê.ÖÛY$ 6–ÜžàTß¼?2.V[^gÙ·§öŽ÷" Á2=ÊÎYUy=ê ó£ Ãyÿˆ²˶ãY¤_ë+î×~æQvíü^i÷xÑ(»-Û(þ÷ó_»c¹æ»EÙI±ý½˜,²øó¯xeö*õŸß§^‹²‹ý±@Ù†òŠfðS¶EÙ+/EÊðùˆÚ cùûA”ÝxÍkP ‹<ã«8Ëîø~õ2foh8ã¡Fa±éø>õ]h¶|Qvå}|þ@¹,JaãZ/¯C©ž_Õ֣Рÿ˜¯eç§²RqOëj5„WÄ¢ìæ°õµ@^Ÿ‚r gþ ÊîŒl¯€EÙÍfûo,2¼nÅj6XÎbQvwÿ¬¸€'”m8ë¢ìPj ø… ¿øß¿aÙúYäzq¯¯ï§z‹² /Fi^d\¹ |ÃzŒX”]ð·Ò¼Î€øç*CÆOKs¯ßr<°ÞÜ4CÒòþk±xŸ(ã€L܆å:õâŠíxµ,ÊÉÇ=ÿêשߢì‚ß”î¶l?è^u§F‹²C(ÃrïêþRg_s|{Zejâ¸Ýã§{MÒèå³µùÝ=©Eñï[†­åŸ[ÐÿôþXºÙµ†ÉúŠEÙMK‚±±`üÀóò#Ê.t Š2K·Ïz/~hQv£øøõeë¢ìzóñ`²È°G”yˆÏ_¹¼Vexý×±ƒo?Ž+rÌ4oßk=xûÛÞg=‡,r ßPîá¬×ˆ²ký|ßd¨€ÿˆ·7®0£-ÃÖ Ü®óG,òþþ¬÷z(».¾^Ay÷×2lÙø—ýšý ‹œ~ž°(»ðÈ"à TPþá¬Gˆ²;ó²È3ÿQâŒ_q%Âã¸=÷xF”Ýœ¾¿@ùšngã~E=‹²[ý|”{}@%ˆð2[”]xaŠ ˆ¶W¾úóɺç‹É"«ï(^¬õ l~‹'´Åy°Lçö¹EÙ=¾¾OOh+þ÷–?ØÞ7¢ìÎx³²Ý÷3DÙæãez}¨øý:.¯¨EÙÕ×ßd‘q¾,(Q†Û Qv¥ùüGyˆ·8¿G}ˆþú~>†ü%"Æòù0»6}X¡‹Œõ»>^¬kúóûV£B·„xñ‡/y˜]3¾TQ?âîïì×ù¼B9L©¤øæÛfwþºHÆ)–Ë?fav±¿TÔˆ[ ³«Ãø}….²úy³¾QÍ¿¯I¶L§ªx^þêõ#ŽÈÂìKxóí÷±õÖÂìÎûz½žø{Eýˆ¸Å²0»þØú\¡‹lÎçêë|{ùßkB[¿ÆuÚñ7X˜]ÜÚVè"c«¨±,£f±0»á^ï a䪶ÞVÔˆó Âìôr¬.©?³[âÏ[¼dêë¿WÛµ¿Y˜]ìÏÂȾl¬¨ça„Ùmþûøç}\þЊúÁ_=ÌÎÏ“õ#Îx³0»zì¡aHÍüõ#ÂkavqÞ«PFÆ~T‹Gý?þ÷šÑÖo©+êGœñ‡0»8¯V(#å±ý§¢~Äó—Z˜]œçMþS}ÿ¯þm¿õ´0»8_à:äß³ ÿu­^î+Úë%÷§#Ìúõß–Ñ׿?úµ_[˜ÝYMé·:fþæjÊÈåóõ#â– av×ûe¤õõ#b?°0»³Þ¨2rßúÛú‚0»3ÞLéû}Eýˆð÷Y˜Ý×÷OV?Âý+³Ûþë¿*#˳ü}!Ì.ίUGEQQ?âÌßÖšc$´ÇVÐ`yûVd-ú#÷­nEýˆ8TH#ÏzÞàß^>Ÿ"ÌÎæww%ª­V?Âý#fwú‹úgý‰ú⸔Ë_;nÙc¿é®jxüïë¸ö÷ŠŸï³úçöåþöö¾QQ@¢[h±0;Œ•ÿÅxD˜]uÿgíöÿøçöµÎïËÍ·vX2 ÀóÞ_fwö£îil~¡€D¨(6—ÿ¦¢€Dœ7-Ì®-çª÷ÏVþnavgü¢€Dø=Ìîú}½ewÿIE‰¸ñ0;?¿ï°ºvÏw˜Õí0»û÷Æío°0»Pál<.mE‰ðßx˜Ÿ·6^×-vE‰Û~Z˜m:_³1ųš¨bÿø·£= ³ þ(Ȳå÷;$âüjavg>Y ç»$NÅÓZ4ooó¿³^!ÌîŒQþ÷+$Î~€0»8Oí°ºrñ㊵ùüB˜ÝÙoP@¢ûµ¶…Ù…Šn‡Õµ›Ï¡€Dø‹LÝzæãôúaÅ?ßK%`avÃý©$‚ÿ[˜]œ‡êÿ ><½~XóÏ«\þ•:áoõû›Šqcaváߪ( ÷gfûõD’«Š* HÄù×âìB&PgÔóçWþüJoõ¯õ"Éj;Ï»šª ÿûµîù‡§ÿËý­Æïü±?¡€DøÛ-Î.η$B‰ÑœëÂ|½_hâüÇ H¸ÿ|c¹×Ÿþ×íPC"ü mø}»õÏjHøù­¡†Äy•µjZo¯Ö{~¢†jÁ›ŠxøçmÜïk ~lìŸVCÂUÀíÔðþŽ[Õ݆ó¿áÏ+åòG¶á|;ìaþíâíÍ;ª§Aßzöái¶Œ¿Aßzö«!óQ\Obë‰xýX›/¨!qöCñŠV6¡o=ë—Ö8|¼‰5°ñ*÷¿·rÏô­¡š‡Ðsû«^o¿‹_7è[CÚPDâŒGè[Ïú}kœ_ŠHœýÇŠHxÔG³"1Å“ìܳ½ÖºÎÿMŸZ‘êu<¯ó{C‰³ß@ßçñ†"§зžñ}ëê¾þ£ˆDúüŽjhÓÓš½åÞÿTߺǯñ]+"á÷·m¢@^9ý=·? '²÷==Šlž÷ú…"‡ÿN¤Ùr=a›HkvõGÏ7ÁWTßZ^K温ÄÎ þV÷w6è[—빊H„?Žªk½Zˆ"+ÞŸ…û?ÿ5è[ãü×PDâÌ/Ó·Æø^žÖLüûæßþ÷]îõsy½ÞÇÛ·ž²Aßzø"ŠHÄýZ }kõߟõòŸ5‘h±þAßúfúVç«ýÉþí}kðŸþD}dÇo»ô ’g>v‘½`7}«û:ô­¯?oG‰âûq‡¾µùøí("zñ}kèqºU‘ðó~G‰8¿öÇ ö6ï︣ûÿ¶ß/c¡;zþ jÏõ0Q’áÏëªo=þÿþxZÛé¿·äÒûuè[Ïó ŠD÷(»}kðãŽ*Á:ªH„>§CßúœnU$ü¼‹‡Ãç»é[}½í¨"ó½¿H³UÍ¿‹ö‚BmÀ½^ç—}ëóouT‘8ãúÖà£Ýô­~~ë¨"ó£Cß|´[ ÷Ÿô×Óš‰?ïª×}`G‰ðguè[ÃÚMßêþèŽ*¡'êзÆzß¡o=ÏWü|Sý÷˼ôAHq±×S{Þâ|ûy‡¾5øL·*Οº:JöúX½}Õ_ßï÷}b?U$¼½qï7Ýô­Îïzñûöèï|.ÿ+ç~ Cßþ’^Ü¿]ßQ«U$â~´W/lãúÖÐõêúm{?ªo=þÛŽ*Á`(a‹"ƒ?¦£ŠDÜÿôêiÍ¢}«jÐ÷çâãúÖ³>Tð??tT‘˜–VTñ¼üÿ=ªH4ïÜü¶[ ÷ŸuT‘8ó úÖ»êoõý¹G [? ox”U$p^눒ŒóA‡¾õ´ß"ÏÖë8=󂽨ÏzóÉx^þínU$\ÿ՛뷻÷§ßQÄU$BÿÔ¡o=ö³*®ÏèVEÂýñÈÙrâYzó¨½éX£ö,­Ÿâ±³I<þxN¶|ºBÞú½·†ü«£ˆDÈŸ:ä­»ã:ä­Õé~G‰¸NGÆ›÷õëŽ"ůÿ;‚$kl?·–âËŠHT±ãN‡¼õôòÖûïû´Ø!o ù]ïQÔ@·ëz)pN8HG‰ûsu·zøI‡¼5ÜIE$"èºw¯!¶ü÷Ž›=>¿Ã :ä­H6hòÛ!o yK.o°íx 1[ oã|‡¼5äva’!í·žá<\NòúçmÞÓòֳݣˆD‹åòÖöárâå¿?îënòÖîãE$LxÖÛž·†Ü©£ˆDq:Ú!o 9\‡¼õLGñ‚½¶ýCÞÚ‹/("×±òÖKtÈ[Ã]ÚÅmÿ~½Ã‰:ä­g;OÚ`Ë@Þð¸ýÄímóEœnÛô‡¼5® »¸»uúï‘û'O~i÷ø¼õ,'("×ïá’åêÏ*×õ}G‰¸¾ï·žõòÖúø|B‰ât¾›¼5ìyk\ï÷é{Åÿ¾ÜòænE$\¾Ô!oãiŸ^Õ`zû­]IGúÌIútw«.)NÛ!oðÍŽ*‡žCÞzÆ‹U‘ˆù„*áîë·†»ªCÞzŽ'VEâ²×ºÃ:ªHÄõJ‡¼õ´yk:ªHx¦/Åë’göå‰Í ·ê¨"î˜yk\_w«"áá«}y8YõÏÛ-ïéVEÂݯòÖ³ž@ÞÇïŽ*q½Ó!o ÷`G‰ÿ¿²³éõ.7ªýüùg˜ ÛÛv•= $$ [º`€’†”t „øö÷¸VÕªò¹(JÏiUïýß/Þ~)—åÅpÒDºdŸÀ[sº‰tÇ·fýq‰ïM¨H0ü À[‰Ë›6hØ­n’#À[9‘'­¨_B¼uÓ^%¼ O„·ñ<¼•ÓkÞÊåñtɨòĦ J».o ðV∼•á: ,¹Éo­Ï¯RÂi‚tINOä ÷OâúGEâÞ>å‰ð_÷Ùuú#-6÷š´µÔ7q¼5ÂÒB´ ýŸ´p·±¼(ív·¥ÝËí¼•îš@E‚8˜ÞšËâ*,/¨H0<*-–Û{œ?kx[$n(-Üm¾Ÿ¾e<à­\^à­ ?T$ˆï ðVâ  ŽÇ‚tIŽïò†ªÁCûºðV¦#T$.BO¶Oq¼5¦Ã NWÄÓ%’—"bÃíQÃ;¼•íS "Áô<ŠD}Ûf5Âo¼•ÓSAº$§—¼•î9*BNGx+ñ^yCÕ`Çó]xƒޚ˗bx«onqlãrm×7ìUÛU$^ÚZ–ó¤Ç¦]þ¾P‘ ÿ!À[óýoe}Bº$ý[ÞÊp‚¸ŠDLŸÄñVÍûM)ý·@E‚ã­oÍþx+Ç_tœ9½à­ù½ "‘õ³Þ ñ~ÞŽtIŠñÞšýã¼Áï †»x+Ó *Ùxºd¹Þ[—7Qð‰ðVâ B ¯ÏP‘ÈþhÄ&iðßÅU$"\ H—$~+Ž·ÆòŽ@E‚þ‡8ÞZî¯ã¾Ÿbyë‰÷YWû7.¹|/é’âxkŒïâ*ì¯ oµ½ÈzØÛÂÑ-lß”ÎÛûÄ&iŸføÛþQÞÕðÖ\¾Ñ'¶oxãú†“hÞh™+d$X_xk}>©áv}B$9íºŒºŒDÌ·2Ä/x+ãê2Õ'¶ïêñ~Ž ×í‚xk¾Ÿã­1ßVÈH§AÇ”þ¼BF‚þ“"]²þÞ–ÛŸPÈHlWÅ3»n’ªÀ[_RÈHp¾¨À[Ù¾2ì?´oˆåmð·#¾¡ ›äN—cݨÔÇ[VÈH°ý)ðV.Ï)ðVâêé’1~)ðÖ,?èHПRÇ[ÃÖ÷NßSèHÐÿPà­Äïõݽgï5¾¯À[9ßÐ÷ö·x+ÇsÞÊñP!$ÁñU·f}}Ãß~â¸ÔåMÞZßW+Þ¤Ž·îª’àöl !‰üØ´•ã‹o¥¢’`|Hoù«BH‚þöؾñu¼•ßBœkÙÇ]´WhÏâ*ðV¦SkM‰5žw¬âŸ(ðÖ¬¯=p‰ßÛö áŸ+ðVâp ! Îx+ûwí¡"Öãz«—ñB{,·ó¸o—ñÆûïšN®À[‰‹(„$¸œ©À[³>oÍïtI¦« IÄ&œ:n¼A·r}B·r}H!$Áôu¼u—ã»Ì÷•J-îç*b;l©8‘:Þñu¼5ð@…’ý/Ŧ­ÙŸoe¼I‘.™ýÏœø¥­gSà­ù½·f{Ø.ã!ðÖ쟷fùÏØzÄõßuÛUµíUß´5æ ¼•ø„NªöÆóM¤wðù oxͱëüFo ü@'6%f{›áo{ ¼•ó¯OÛpbÉ÷wÙ¿_»ø×Ç‘«Ëû ¼5ÇGÿÇþJ'ñþ\nÿïØ³¤·*ðVâ: ¼U–ÏToðö ¼5ûC‰t²¶ãÄ×5à8Ê5}W·r¾£ÿïÍûûv;ŽKÅxkö'H—dº·oåüSåÞ.M·r}J·>ö*øoåü[·GUM‰Gœß°] ?Öñgú­jlß…ù‘jȈõ°/¼A·r½I5ÒÉx|\í͸ÕÒåÍþxkŽ'Ší»F¾,³g\Ok:‰:ÞÚ²9úŒ-O—ù>¾Þ.ñü«âûË·oå÷ÞÊøç‚ý•Õït²ÕoQŠ…tIò* x+Ç8Îéï-à­Y€·’ÇZ=D)Ð/à­ŸWív\oÌ2ž/à­ÙB„þÛÂö­Œ',à­œ_Aá0ýóåxkø×øÐ‰/ù|k–õ‹úË·oøòÞJ|uA„éËñV–¿‹€°HögÀ[9>-ˆ€Ðÿ]#ø‰ã¶ÞëÃËòdJ{q¼5Ò׈í¼¾C„|Ýr¼UÝYa|bA¤Þ_Ví Bþaoåø½€·æøƃøV®7,ˆ€pþ´.ÉíÆøÖ¬ï¡(ôuMÍõ [JúׂHŽoà[s|r¾5üŸ…tÉ<îr¾5¶[[a|z_)±À·’Ï[éõÑùV¶'ç[ƒ\3¶K›qÿãÿq{·ú>¾ÞþÆõ—xA„ó¡¾5Ç»Ûwùû"]’<-T3¾² Âôœ%¡#ëå ¾•þí‚ çç‹Û·zùIlßåå!ؾ!æÿd$ϳ$x’×›o™¿,A:YøÓ Z ܾkÉÿ[à[9¿\!»À·Öò1ž8ÖsÒ%É,‰ø6ËgÏ:¾ƒoÍñ|+Ó/—O¬aÿïåõ5d’ýû ]’óï¥÷öÄKƒ'‘8Þgá%°°ë÷ r ôç—ñ­çøŽç9þ6çsK£¼gœ/u}kA„ñžåÛ·?°À·2=p8šÛ‘,ð­ä–"}ß×Ò%s{8îÿ^Éú¸À7°üø†˜?¬uoß°À·r=qo%_·Vlßàý+øVnÿ¾ ’ã“ñ­™>±À·r>»Vl—ù&ÖR¿m Ìù˂׻øVÎ7ä@ÈÛ,ð­ù}V¬··xþÕËúÛZH'Ûù<¶}C¤7-—aû7¾5Óä@¸¾µvð$=lß¾Áû?ÈdûÞ±À×{µ¤ç/ÈpýeßšéþËä@L[+Îu{6€ž¯^.ÂùÆŽøß×÷퉽sƒoÍñr œolð­Ì?ØñVï˜/éí|kŽ·Éú ¾5ÛŸD|{Äõ}» ÞOg?o-×[u{¾ ¾5¿å@4žgkYÜà[9¿ÝÉñ |+ù® ¾5Ç'äKÖß;ߊùâÖ[žbƒoe|e;ßÊþIƒ'Ñ8>®ï¾•ñíÁo7Ú•oß.|ÁÆö­\OØù{OÜ_ëö´|k¶ç[C +eüßšãOìÏ ¾•¼Äv¾5ø¶½"ϯ¾•Ûánð­é¿­Ø.ÃëøVÎÿ6ä@¸ç¶|É3?öòßZYøíÛ·²¿X±}×盿ëE{Ýr r Ü^l¯ØžXâ÷*·½ž/v7lã[Mí5žÿl—‘þøÖWâ|ã[s;œmù’¦%,n·VDØ·%R^ÇßÿÝà[¹þ¼!’þ(øÖz¼ká]Ðñ˜Öz<߀\€†=áoxÿ¾•|óÞÁ7ðú‚í[°¶7ÖÛ#¾±7üíòþg{º·Å÷1¾ÕTäâ~k–ü¤½±].ýµ ÿ/¶ƒCÅa}ìñ­Ìo6ûðä óëc·":o¶äúì±Mηk1û<ÏÆ÷5{gý³Ëü·?-âÛÏ »¬·»½õ÷É÷ßíÓìÒÞÌ.û»ßÌ.ócžñ~³5çS>æ™-µ<Û•OfvÉ_3{gÿ~lË'cy‚oõæc¯²}‰Ù’ëkÇÞ¥?2{æxavÙž·?ηJ<ä@òy|ûÖõ|«ªÛoËñÞì’Opìþäx`vÙ.Ñìóýc²Þböªõ|kŒWfKÆ#Ž--ýÙŽ†Ãõ2³w­à[£¿7{åúÒ±ßvÊlÍõÜcï²]Ù’þEœo­öÈxšÙ;ý»c·~ŸßÀÓˆºý¾µ=÷ÈßÓø}oõû‚oõ<³wnWuì1jûß|ı'x ¥­µþö_Ö¶düõØ.OÁûU~Ûì«ÿë—<…Ù%_úØ»l_fvÙ.´?¾}«ÇOÍž¹>göNÿìØ­Ä:t8˜/|ì÷ÍõA³K>Ù±=¾½âx/|ó±Ç“ñ-³GíOÀ·tlóÿ$úOÈì…õ—c×íÒÌ–ä­Ž­…·ë pþföÎùȱ×HžØì²Þxló·w´_ð­1?ëä@Â7{Ööî|«Fÿ8CžÂŸ|kÄGý–íâÌVÛßçß÷7ya³%yÄc{¾äŠóGɧ6{ç~Çž£öà[#_ëØRòWÍ.ù-ÇÖ“š=3éØëI^Ðì²¾cv‰·{—õ=³¯ñÖùV—˜-Õÿ°|IÆÌžÉ3˜}Ý|kÄG;Eœ_»—ù­Ùšü˱GËø‡Ùe{âcÏ’OaöÈùÙ;óeŽ-½Ö/È„Ü˱õÍõo³å~¾õd<¥?ηzüÀìküßñ³Wú§ýQøÛOô‡ŠøŸû³Ç6ÿoaýÈìo;¶ï'àã9ä@B^ÇìUûç[9žB$û;ð­±^e¶Ôþ r Ùo}ÃÿÑðÿ4ŽK¿Ëªþ$ä@.[3¾|ìÕjýшoK\o—|³K¼ÑìUß|kާ‰üÃc··úηöhÏI|kÞ|kÖOäKFü¤cTæ‹{žÊì²ñç5Þ@$Ö¿Žíñ¿÷“o0{Õþa]r f¾çØ«l—h¶Ôö¼ÀÓ_ßšãÿºä€û9à»Ì¾êÿ¾Áë?øÖˆßûmÕ„H¶×ñ?ë÷QÇ×üö÷½Îö—òF¾d~ßõvί6âÛO´ò­›öÎùì±]¤Çq]u¼ØÈ'cÿ¶£¼Y^.OÆßïÂö¾u8onvá{Í.ûw»•|"³5ãyÇ~ëxÛÀ·F<íØ½Ž· |k¬˜½K}oOð$#Îw¹„v•§0[lþ­ñ{Á÷Øñ|Ræ÷ÇÖ’OcöH¾Ølì—¨9ßõ¡oåøÚ/Éù\ßšï 9|?ð­±l6¾ÿ »~ßläÓ¼aûþ ˜o4ÈDüûؽeüÚì™ëÇuþ‹s¾ÓZ”÷׫ñ?³kûo.Âú¾•ý_ƒýµÖBîzGùhÉ':öêÉ£™½Š?ÚÀ·Òm‰ý¿zßzÙ³¾/ò%#>|ì62þoö*󛾕ó»ö"Þêû1»·â5ð­ï<ö(û÷˜=2^l6æ3ηøöÊç™+ãOÇ–7×3Í–âO5ð­±_—Ù3ãfï䟽Êú†Ù+ç_ß}ûûÿüöç?ýÃ_ÿâã/¾ûv:ç£þýî/þî›±PÿýíÿùãùøÕ·öñ7Ÿÿþýzš¿ývr>y˜ôÛAaþæã»¯ÇÃD~ŽC1…ÇÝÌãØ†ÇÝÌã@ÞxÜM¿(ŸÇñ½¿ÿ/ú_Þÿ§_þøíÏÿêó‹||ÿ¯Æ2=ücæAs>«ds¿ÿíÇÏæçÏžŸ|ÿïßþò{»øüõ´þ#Ýþ´ŸoÛí4þ^?Ὃ­áÿöÃÍœ/»¯'Xo³oá<Áízö×Î3|¿ír¶hÈ3|ˆ<ß‹g”ç¬åoÿgY$´}~u »œ‚ø³w´ÿ½ÿÐïAúïŸõ'ÿÞÖ7/ úÄò‘ããO¾€•ÝË ¼_ë‚7ƒÏŽÀt#¼™†éj²¿á'ùbÇéÖmX¯ÄÛ‹×gËgÿýÿçãÇ?ªiu¼S{îê û¬Cœp~·,ªóRó»_ÿø_ÿñ»Ÿþë‡ßÿúw¿ÿ£ÊÀ<ÀFÇsïþå·ÿñ›þøÒUpÃÍp´sßüîßþég¿úáÇŸ~ý_ÿóO? bé:²¬Žpóöý 5Ê…ýmóâÏclÛu…¢Øçó[Ø% {ÊÝ\>„ª#’bUW”X>D(%0$+%ötM©(1âzK¤˜rª+J<îÂé $u‡-@òà²«Å†ßæ)))w†ÜÅó+5V\ÿ ©Ït—U®ž<a‡w„8<ånÍ|¿ D.n´‰ë#ån?î‚èæ– ÛíE-¸P˜ É=öûá}Ãv—õq»ãýyw‘yO¹›ñû1îã¶åV÷)‘ÜáB)%òûìPpãû¸‚o‹ß+Øçë(.žBQbÇ”ÊSîêqKI)„BQ+}nKyßDrw‰×[œaʃ”»|Þåˆd¼ÿz àõe"y~)û‚¢Ä~½¼=åî²å¶Íe›^=åŽå»€Hîí.âzb ž?µ¼ï‚¢Dý½ÈmÇ3l "|߃¤¶7¯·FiŸëAy—ßï÷>вx^‹u!äÕ²‹úµlïò³¤èåa)wåþ†Hf}_P”Èï”;Ö¿åŠáò{ÊÝžÞ>–!’ç}áâ.W”ˆþ)w¥¾‘Ìò‡¢v.ƒm[ GH}µHÓx>m÷ûjmÿ ŠY‘r·G¾¯mUŽGˆ4žgkµ_„ì¢ó”»|ÿ7¼>¸¢ßÏ%¢½an^Êóågaw‘IØZÚçz¹åBÜ\ïÿr €¸Þ¬ýß"YŸÏ‘T½Ÿ×·\}ãúVÞåü…”3^oͲ$á)wúxˆu‘Ô˜b/(Jèô%‰H¹ãù[®Æ’‚¢„4ŸÒzÊ]¶ßÎi\Ï`^ÿE ¦|«Ç– 3®ßÀ ¤·€HÖçX’q|bIRãþÓ·åql9°ã÷2îëû9—7ɹ=´ (1§‡ô=ånŒ|>K‹%^O¹«ÏgKä®Þ%òyG À^¿€Hf8€$Äøï)w+–XÖ’úzÜSî²ÿܪ…àö)ïî)"f#Lâz³Õò±¥°Äý¥ú? ŠÏ›ÏoþˆzHsÙ‹HL÷”»ñxÈi „HcIi (ø²ÿAÊÝŠï"9§/¯^Þ3B¤^_!)±¶×žr·bÉm‘l,,—”1>º¤Ä‹”†c÷§~?HJd{@Ênß$%êý‡ÞÇç[ü­I‰ùxÈÇSîtykÍØrËÛÇ E1ÚÚïçS„ˆ{Øë­õiÆ9ïo!;Ö§‰-…9‘¤ÿ² )‘χ”»¬/Rüm·¯öDò%šI‰Ù£~H ¼~G ¯®Úÿ‘Ìþ’ÓS>½²ïñ>H¢÷¿H¹ËþˆdöÏ”Èú”»ßHB©öû~±ä D¿ )‘χ”;iâ_ŽHòý!»z)0#®?{õ?”[.¨Û‚%‰ï'RÇéŽëéõý!)‘ý/Rîrü"™ã$%²þilqæís…‚¯_’ù{ ’Y>”è¾…E÷”»üÞ+–È%®÷ê}¼·Ú¿AR"ëûŠ-·Züþ,ÙŽ7Æ'HJŒXÂ÷”»>ã{‘-opy~‘ÛV„ˆbõ”»ú<ë©ßoÅ–«ç/ø3žÇ·¸}âú[ë÷¤ÄÔh/”Èúâ’1ÿ^þû[HJäx…”»lÏ;eW\Ï·ðòÞ¡˜L{`‹O, .HJd„”»ú¼sTÿÌ%%XH¦ÿã’v(¸y½#%iÅó/ÄIG<¿¥ÜÅüxAR"ý‡[œ5Ú«Ì6$%8ß”»˜ßîþvÜ?X")wg~ó„ýŽû÷®˜Œñc;"YÎïzŸoó›˜ÏlC$óý6$%è/{Êßw»¤D¹ŸÔþ‘¤¿²!)ÁñËSîX_6Ézܶ¸ÅF¼HÔ"Éù§Üq¾¹HÒ¿Ù”Èòm@X¾ þ_Ìo±–Zž)wõ÷ï¾Ïï½–Iú»Iˆö)wß6IÎov‹%råñêoìFßxßPLŽó½¼ÓÖú}rGÿ}‘¤¿°!)A=RîFÞÏSÀ܆¤D–RîèßlHJ°½zÊý¡ D2Ë›’+®ÿîÒ~7Iú›’õúã½?´ŒïžrÇþg¿±Æ× I ö§žr—åõÆ×Ó~_ß‘>ßñÿ8¿ñ”;Ž¿ˆäð”o³g<ån¾>Ø@$éÏoHJ°¿FÊÝùý¤­†h¾ñû·•þu÷ðÿ0¾ƒÈþÖSî8n ’òøøº!)1¦û7H¹+ïD²_Ü”è±d¹H¶˜¯lHJpþæ)wõþ–VÊC±ßÿ”7Çc°)g ‘'î÷YÞ;µȸÛì­MPb±ñ ßî‘rxDºü1?+ñb×hÙv‹-Õ\Â+$èíÐÚÍnÙÚÓb¯†D»'¢†ÛÀÈz­O§oGLiv›]¾Q‘kæÑ³X#äØ-ŽG&!QOþ,ÞÍÞÍ€ÈÅÆm G}Êϲ­ïÿÙç-¶<ˆG<=F$×½-j`ȶ¢& ¹Ž3Á ²©Ã®{Bï)î6}bì¹uÕÞý‹­v=°ZÛXÈò¼ÐŽb ÛŠ›Åk,dy>hGd_ƒÜºü\`!³ø‘[÷Û½…ÄpóøÕÙƒ µ®‰ÇÑÀø\wü¼ü\H­«¯sü¼ü\H­ËÖ ²Z³!ÑŸhH­{G´ õ÷ǯ~m÷Ôº·çó?ïÝQ}Zןh­@!ëñãWçý‘Z—­ (dŽKŽèË牞Z×ßx Ùú Áy¡§Öå¸éˆéR¦ÝSë8/Ü@!ëó?qO­Ëê éˆz¿SÞŒƒxjÝ©,ÒÙÛ µ®k>ÿ~JÜbC:¢–‡•·xœ9Þ§7õqÒy>¤#²¼ Ò’ÝSëêùÇÏ«ç?ïQ½‘Z×|ëi³—@Ï6¤#²ùB:¢Þ϶ÖboŽÔºü¾ÆÔ•ÑÒC£< ÑwtG@!ÛŠöéˆWóyNy×û?/¿ß©^¾Ïñó²~B:"êó@j»;³ËèwlÛÊÌýšÔ:ŽVÇ6?Ïý¦ÔºëzÇϻ쑣é@jÝe?/ê›Ùšíaxj]÷­ÉÌ–Í-OÖßá©uñ}ÌÞé×O­‹ÑÙìuÛ ©÷?åõùØ»Ý×÷­ÌX~{×ç‡tÄñüH­‹ï33@?×l­Ï‹Ôº¨/ù¡hßÇ>åý:ú=<µ.ê¯Ù;ë÷ðÔº.Í^Ö?ΰç›ÃÑðÔºw£?¶´Íž6|<-ìmý/¯üêzü”wŒÇ>q¾ÌÖ†§ÖEÿj¶dû¤#ÂïžZ—å² â@ÃSëzï 2úÇc›÷÷¢= O­‹ñåØ½Ì«Ìžµ½ µ.¼·c‘ó²á©u±ulóþÊù¶µªF}Cj]¶ õýô©õ©u±®bö¶çÛaŸòŽþÊìUë3¤#¢?žZ—õ±CÊJ£< ãÑðÔºì ‘í«‡·Íß¿ï}üÕú>H­ËöÕ±•-ŸÒYžH­‹u=³wÎc={ÆÍ‡§ÖÕûÉ›óÄá©uÕÖöÅ.qüá©u1¯Ø1îjöJ.ixj]x÷fkÎ뇧ÖeyÄU=µâØWõû!µnz*‘Ù»~Ÿ¨¯?¯KG”ãó|¯/.Ñ¢ýðGx~«O­‹yþ±-Õ«Ú«Öo¤Ö ßê×l­ý!Rëêùlj¸î±×Së;Sëòø®ã¤#BútxjÝ|¢ü ñº”¸Ù’ãë±?’ý¤#²?œ!ìýŸKéˆOZ—ý1¤#êõÇÕÞZ—ã9¤#²½"µ.ü!³w?!ÑŸø¾H­«ï«oõ ³ëÔº³ÎÚã~kæºôðÔºð¯}ü¿Ë.þßr–þ‚`kU~¹ü¿á©uõø[üßá©uY~ÿ¯Ø½ø[ÃSëÂ?<öxkùB:"Öe†§ÖeùJl­êå…Ôº/Äü‘ú~²êxŠÔºúüzµGHGäxƒÔºl.ÁöîÒ#úwAœýKG¼1žP:Ÿ_áÿÑ߃tDÞ©uù>ŽîÀì/÷ë×x鈈#O­‹u$³µŽ—ŽˆuÈá©uÙ?A:¢·­lÙ¿"µ.üñck¿Ï7é0þ_±µ*ûGÅÖ ;Æ'¤ÖEœÒl¤úñú©å~¤ÖEÜÖì•qÝá©uÙ_cÍòvéö÷H­«vêxŽ5¿¯KGp|Çšþͺ¸‘cÏ·öçŽHÿ©uù=RýY_!‘ý)Rë†oekv‰«O­«ï[×Õmþ6ý¤ÖEtj<àXóyÀ±æxÔº¬_ŽÈòÉÔºæö{GŽHÿ©u]3{ÖþÉ8Öë¸Å±éŸ€cÍò؈c³ÿÇëÊÇ–küß_Ê{Ãÿ«öåÿ µ®>ÿúòþwy#µ.¢›f×÷ÔºxþöÀÿ‹þ|^O­c}jRâû4HG°½yjÛgÇÊúî©ulí‰T¯ÇÇøb¯Ò?¶‡[«ÆóN-ý•§ÖÕãîÿ­8®OñGÚƒ­ž|ÝÇìȈԺ¨_ k-OKõ/ïS¹‘Ñ\:bÇõ‘ZÇþ¯5øÎQ˜]ýMO­cÿÔÀ±ò{@æ:ýˆÔºè8Öàh†§Öqüi R,¯Ñí7î?{rfyy“ÓžZÇúÜZl­Úâ|µ<[l­úÄû˜ÿWžo­Ò5p¬—­e>á©uùþàX95HGäûyj]ô¯ +ý5O­ËöŽµÚ½úÿžZ—õkÖ—7¸´oO­«Çgo=µ.Û#8Ö¬oàXóû½!Õáõ k~/p¬Á1 O­“•÷[»Ö_HG°?kol­ïõkö=¶2óúÐCÊÀë78Ö,?HG0žÒÀ±ÒiŽÈúŽ5Ö%ÍÖú½ ‘õkýý¼ú?HGÔ÷9þ_=.u~ßÀ±r<Åž]9oŽ ?ÝÀ±FüÕìYüçéއ­G¼õò4;âC k–8Ö¼þˆùMÚ5ÞÐÀ±æóB:‚ñìq]¾'¤#hŽ`<§c¥ÿÑ Aÿ¾cÍ÷ÇJ A:‚þyÿãûÕøö±ïò¾9Öc¯/÷»âmD|[âþ{Ü×»âmÞþvƒtçÃm^ëêfK­ßàXëñ÷êo!‘õk–·KGðy!‘õeƺºÄïg«ý9Ö'îoñV¶HGdÿ޵ÚzµHGdûÇšåïÒ’Ï¿[í¯!‘ã1¥#|¼ÇJ½IHøï!‘åŽ5¯éˆ,çXYþàXs|‚tDö'ƒû+àX³?…t„,p]ÇžoíO[kq<–ØÊ‚ׯƒÙû~ÛZ‹ý;8V·¤#êû¬êÿ6HGäøéˆüžàXó¸KGÐÇš×ÇšõIïùMÇší_/nd@¿Î7;â½Máo³?Çë#f¯¿hHHäüµce| éßnŽ`¼¤cÍöéˆìÿÁ±2¾ÜÀ±fýÓð·W<ŸÇ[}üÇšÏéˆ,Op¬Ùß-Ä·y?p¬Œ?5p¬oÃrî±nè´µúÇàX³?ƒtD¶p¬Ù~]:‚þáºãÍ9V¾ßBy¿ñ=c¥¿â+¿ÿŠ­lg<¯~yÝÉ={]þ=8Öú<û­ýãºãm‡ToÚW{ÇëqfnÜìk¼ÇÊù]Û IXßÁ±æx Ž5ûÃòæxŽ5¿¿s¬¬È‹Ìþ+ç£ ÒùþàX«}ü¿6¶2+ï·žûù×(ë+ y‘YÁ±æxéÆÛ ¡Èõ}³¥Ô×Ò_ãX³>½Ž¨¿?å]_×ÛÝß\o6[KòB:"òHÌ>ñÍÜî±ÿÇõÇk=ßø†bú±3Š™…&9¶á áîá@CTv¥IÌ®îß åvo/”#ž}±2|ý¶Ø¨Õám_ŠÊ G¿PŽh¯‡‡_`¬A›˜= yy|Õç7Œ5`3•€Ù1G+…†•k/d#êÃÛ}õ †•}É Ù¶• +×_0¬Y˜È‰ÌÂÃʵʲù±À°2Vþ¶Û÷{M6"Û †5Ð#³ëXó"'’k¥/Ö,\ÈFäÇÃʵÜ +cyï‹Ø6+V¶½ +ûî9‘Y¾`XÙv_ÈFdÛÃZŸïø~Y¾&±=ü˜zÕE ¬Õ^íþùg9nxÌSÚ‘‘fv]i~`Í»A3âñ„µº´ ¬YxÐŒàÂ÷kkœfÎZ‘‘™Oco|£™+!¹c·¯ž>4)±cu6ЫÏ5ß#º23éI37iÒc~–óžÑ„A®rEý5r5PT3åc9·}Ìmç¥ôùDêYifn¢§ã5n5pQ3×ć`lÕLýXì󔯃©fJyh(DuföHˆÐì]  Ù”m<Ñšÿ˜ÓÙG?‹WÄcŠØ—Sg>ÙçX¦ «™ûÁóó4m& QÍC®:õj¦Wâ-¶}eëŒ\Í*p5È;³?ïä¿™»4Ó„Øž/jæ*—žï8¥«q©ãÔeí²š zí{Œû¸C"üýq¢óëYå¢Ú =:I/Õì8¬fG=ˆË®‹ˆ/ô êï7U^èAdGæÈ*û «YЃH'Èjv¬NÝŒóß·,ê¾Ðƒ¨çŸò®Çû5ÊÊíD¿Ðƒ Óù‚Y¥“õJ8u¶–EÃÌ*Îz\txÁ¬rø³š“Dy?q½5ª“f•‹œ/’¹Èù‚Y¥“øB‚“Ìj–/˜UBF¯éAÄv|fVféud•ÕréCYÍqrYÁ¬¦ÏæÌê Ÿrõñf!¾`V³8 AŸý³Z_WÛ]Z×ì_2«|þ5êç³ÊØ f5ÇiýRÜ`V9gx!‘Õ¹Žùü`Vóz+b¨3Ž¿£:`V¹fýB"ßÌ*׌^0«õzcÖêf5}pÈAds³Ê9È f5h³µÌÉ_0«9G³ZßoÕ9Ô»b Ý¿÷º‘w}ñëÀ¬æñòŽ5†Ìj^Ìj>/rÓѳšÝä ÒÏrf•ÝÝ¿Ž×»b¨/˜Õ¬ÿ`V³ü7Ê›sgVëñ]ë˜Õ쾜Ye÷¶¿”7˜UÎq_0«Œ1¼~4»?0«Ù}C"Ûä èww0«—­åûu0«ŒugV£ûë‘ø~ݙը¯rõz×A³ÊW¢¼Ÿøý¨1MlΩ;ä êý¤2+ý ùÝï'«¬Au0«õý.F¤?‘ 6ã~Kîã»Æì:˜ÕË®ÌFG®#c~Ì*×4z»áf•ß¿ƒYÍò€cŒÌ*c:Ì*cž¹ŽŒát0«Yþƒ ÓÑÁ¬²=v0«\Sëƒ`Œ¤aV{‹˜5Ï׳ë`VÙ_uÈAÔë[.XùýCíƒà¼°¿±=-ê{³šß r\³ë`V£î/å×âøÛjýyï˜uC~ k°Ì*cbÝ™ÕX£è.kðÌ*cnrìÏ;r9^u0«Y>.Ql­köý*Ÿ_¯ïïÌjô_rt‡ºç:Ž|ž]™Å9ŽÌj¶G0«YŸ!Á5»f5ŸÌ*ǫãî`VÙ?wÈAÐÝê`VéîvgVùüƒÈúÑïj³šý rëï¥2’rdˆ;˜Õz}Ýe¼ëƒ`ÜÁ¬æ÷u9ö_ƒàxÛYå÷³îa·ÊPu2«^žƒÈï1bïoO`Vóý!A ƒYÍ÷WFžÙ³¶W0«ùþ#Ê{Çýç—ç‘·ö—ƒÈïïÌ*ËwDy·x_­k6Ì*Ç×9ˆl_`V9Ýê`V#gjt“ƒà¬³Y¥ûÔ¡A÷°#ò:¾Ëaw5ˆ!wGVc8†{Ý¡Aw°Y¥{ݬæãÏ{vÓ¬ÖûÍU«Õz¾¹ü¼Pƒ »Û¬æpd•³›ŽÈìÞ¬æð5ˆîf¤ˆùõ%RļºÉ—ò²šÕˑ՞ç{y{u²šÕ jÙ}Y¥»Ö¬f÷5ˆn¬r:Ó¬æ÷Dv§@V¹„Ü¡‘ÍÈj6_ «\¢êPƒ¨÷3d•õM®­·Ì®ˆL²šÃ#Ô ò~z/t «ùþŠòfùi¸Þ|€¬fw¤ˆxùYÍûë—òÖî@Vïz»ÛÈj¾?Õ¬Pƒ¨Ç f}²šåƒÈì4…7ÞgÕ%»d•³õdµ–•7Ý «Y^@V³|™îÖ dÁŸjÙ½­XB÷ödµþþÝuxZ{ù|AV;Ô Ò=qdµ<¯! u «Dz»#«üþPƒ¨÷—š"ÓYe{‚D¶W «\DÁ—ò²Ê%éîÈ*ÝõÅݲšîÕ|^¨Adÿ d5¿Ô r¸òHöG;a/ß}#"Ý‘UÍû~zÿÞÝ¿÷›‘ïûF„;ÕìÏ¡‘î<Õto] "ʾ¿”7Õt¬Öã6½‰ñd<·û7 Áò@VYUŽ'jü¾È*û'4ÄDžR é~ «õyL}7ÚÃx"ú÷Äù£ºÿ㹑ìd•îÓ²Z/5¼1žYPƒ`û@VYßUޝjüÞÈ*ݽd•ýÓh‘’—ö,K¢jœ>v/¡£#Éþl@ ‚õYeý@V9 ¨Ap|®Á÷‡DÖ¤@æ÷²šßjlo÷^ö=€¬rüPƒ¨Çµ"âjìR ó{µÛýPƒ`¸dY¥?6Yö:Þ@²ý}ßÛÿ@V9¤@fy½,Œ¸Þ«·Ýßûz½¦ ¨A0|4Þ;ü7€¬rÙv 2ëUŽ‡ã½¶º5»"›Èj¶g¨A0Ü4€¬Ö㫆›R «½û}¿}µ «ìUú§Ÿ¶…[Y?¬f}²šýG${Ñ®)ÉŸv/[+š­ÅŸ@V.<ö,þëð­WIެ®¼ÿ,[+Ûá@ꆱ=HÌïd•ãñè·²~ùÖ«åýWnŽòf{²J` Â1>Žq¯& «Ù?„·YŸYe{²šõo`ŒXf@V³¾Y%2™õÈ*ýëO{>µ>;ü7Yå÷@„ÙHYâq}ïß«Ü÷wdUâüUÃMø0¥?²ZËÓSò¼?²ÊÕ·d5ÇÇó/"«OØæor8€¬ÒŸ@Vé?ž†Ðïã}ÿaYÍï;­¼‰DŽ/Èê±çý|òÿ|8²Êö;QÞáO «œŽáí¶ûÛ#®…[?íýÜÇ÷(ö²šã© ¼Y_€¬r¾3€¬fÿ/؃ã%Õìþ6ß)ôÏÕoÄÊ;ëUúÿÈj=VDvYMÈjÖGOdÿ dµ×Ší «õù×[ë³Àß~òýw«ßç ²:™íÈj–¯"¼Mÿ Èj¶ «ù=ámöo@Vóý€¬¦ÿ„Èúû~õŠ”<–‡Æ;Οuþ3å½ò}nÿϑՖ¿¿ìdµ>ÏÞެFøsh¨Áz{U ÙŸެ²²šýý‚¿ÍþË‘U¾ÿúâo#’\IJšþ¤<Òß²zÙò`¼jY%k2 åñ¸Úî±gßCO‡«Ó¨'Ë7š4S é3 X%¶1ŒY¾­¥™û0-nýYÔj†%?L«n|f¦|¨ïH8†‘ª‰6Ã@Uéåè>'ûSm_aWšë0.X–ôrÌf~>†«9óóÿד»$´7¨æû›p¡ >•€à0>5 ÀÒ!žó³TßÔÒLá¾pÇütšKEF¥.×»b„¿¦C©П€RéaNëàÕ¦1©ds&T²JRôß&T"çR\žHqd{˜@RcG/³ËgÇ6$5p‡ $•þá„T—‹'˜T²kRÿ'R¹ü:I zcBªƒýé“[p 86ÙÞ&¤:²tI%Ù4¤æÏ‘áHJrI%¸768 4l:’0Ót$5ÂÏP,ÛàN³øÜén'2³¸@¥æçƒRGŸQ©Ë…1Žiœ=y¹ÏÒ&Ë7Ieì~I¥/:[l·À_¯YÐŒ ™Žú°ækT»Î%çÛ[ ÚšÞ´1—½Æ´!S»kÓÚ¸øêfŽ£“öòè>ˆ†ùYžâûq›©âÛåóÓ§#d7DeSž&Î[Kš9?ö¤9ØÃNËhd»Ÿ¡²·ž¦ËA qƒÊÎk‚J ‚‚åS:‚º²xö(ëD2#ö¸:¶1¨{Ä£˜&;Ýi5˜]ß4•ý4AŽ,k›m͈iM nd¥²,FñÍïÍ\å³Ù¦¶¢ùÛOLjLç´8ljæ<'c™FžÊ›Oõé»éޝhÙ‹±Qé1µsO3õŒfO=ài)ƒ÷²™›G¶OK§`äi^ËÒó«yšÕâ±ç¡Ùš#<6o#6‰ëq¼W e‚>劄ÏÓcš O9Þãöç€Ç3ì9$H>OÝ$ÎìšÔ2<¶ðØçˆM+ž¸¿®ûüõÞϳ¤Ì æ@„4 ±ç ‚DelN$uE„uB|ƒ3òi,jMÓÅ7ÜŸHZ¤‡7'<äˆÐMˆody€GeÏÊ$à ñ Îø&xTFˆ!,š› M$-2én‚GeÄyB|ƒçJ b‚G­ï¯ë>¾z‰ÐNð¨ôÀ§'-¶|ÿ]=ö)‘Ôåï•ÀÅʤÀ)72Á£†XDZ‡›Y›-eÓ‘ •3Ô ñ nZ0Á£ÆæÔfܬ{@hözžÙKDi‚GÍïñ F &xTF˜&Ä7êûkM²šàQ9ØåÍ߯º‰ÀZËgK­ßàQóù\|ƒõÍÅ7Êqxˆo({T©LâœR³þ¹øFD@&€T&ÙMߨ/HZ¼ìº‰ÄÔ{… 5ë#€Ôì ¾‘í@*#(@*g”I‹œO½7Q˜.¾Áú 5¿€Ô|_ˆo0‚0¤f{šý¥‹oÄ r:¼¹"© 3¼ •@äü¤¢ã½l‹ØEa:3ôéâQ˜¤ÆŒ~B|#ûG©õùDïó-BZÞOë¦u@jºœßÈñ@jŽOßÈþÊÔˆXMRy}ˆod •ž 5¿Ä7™R³ÿ„øFöHZÌñ@*WL§‹oð}¤f°ïÄ® ñëxÝDqîØDaÇýDï÷Õ!™ßÈñ @*“T'€ÔŸw×ï·¯ú¿oX´Èò©ì?ä "aÆù'bÇjJàIL|#û7y"BŠþGž;B*HZd#Rëù£nZ"Rëóͺ‰€@|ƒþ‚ø&ª±¢¥Æü‚¬E¶oÊIøë«HeÄL¤ÖòÛuEZž;B*RÙ¿ Ä7òyHú- 韥 ‰ú¡óô¥¡¼P©¬ß •õC ¾Áö-R¹B"íŽH éÏ €Ô|_ˆo°=K "Áë€Ôz?­+` •ý§@|£ž¿ŸâÏ €ÔË®D’¼÷ ¹¼÷¦µñ F(@*# µ^¯nÊ|ìþ”DEø#ÚòFÄnÄýF]‘ˆo0b*o$õÏ8Ö|#Aâ"ÇZŸGê¦E˜þ”òZË£Šo˜­eÓ7šõ©‹ôàÈ—ú ñ úS⛨Fÿ$RÙ?K¿ç7â@jŒG 5Ëâ\‘R9 hodñ;ÚòñFÝCC ½ÁîXÀ£Ò½ð¨~ÚYÝÁ£fsöÝéᎴ8îé_#ŠïÄyTv7àQ±‘…VOð¨ hÉPìVómdÄ ^œé¾HÍò‡&GÖWßCõ)ǯáš9Ró}vìÜx¼æ÷Š©t¯¡É‘þ€T®ØÈŽ=ky½YÃ-²ï|$šîÛ ï'H”@¤½j 5§ÐäÈö¿cÏZïO ¤6Ú5ßL¤²~é@ÎW©ü~ µž…·õ ÷ïãý)ï£O ¨ßúÄZ<îšo«,¨ë{Ö>qþ¬@–Heùë{hñúR@ô aÅùZÃíúÜ{–)€TÖwuMŽ˜ž+€Ô¼~‹=kñ}šì@*Ç;uM^¿Ýî¶HÍûA“ƒÓ!m¡Öâþ}ÞÏÓk¾¹¶Ð,àõFn¨ç7F}SRY>Ðä`{Q©l/ÚB!ì‰ë_þ¶:þ”H­Ï·j{S©ô/Õ59¢½+€T®Ðê{ûÛ MŽ,¯7ü?>×äˆV}oDHÝy¿Þêû½wþ—Heÿ¢ÐäÈö •㹺&G„»Ô59¢¿T©ô—š/@jÖ/©YŸÞ®ýûHÍòw 5æO MŽZ»î7 Ðäàò•z~#ËÃTÖÇþ¥¼}ÕO@*ûs…&G¶©Ù^¡É‘å‰üÆ,©šôW@*Çcu µØò–ñ\Hé·:ý³öo÷xžU—·š¡mvÿÕTÖhrd{q 5æ¿:bà'lËoŒåší×59"œ¦Ré_*€ÔìÆ½g™H¥ÿ¨®Éãµ"¿‘óšõû‹&‡Håò‚ŽÛßVhrÔóÿÇpªHÍï5¢¼ùükÞ×[5ܦ¤²þŒ€ýz3æ7þ¾ÜCu„íþŸ—'49²þHÍïMެHp$𢤖ã]ëxé{¨²ÿšíšô¯uÆ~ ;Þgîú½f,'Ìø½¬®UhrÔ÷Óºg©H­ï{%Ü)€Ô,_©µò÷¶¿ëƒï¡ÊùÔEÞ׫Ž/ØC5Çc×ä ¿MŽì_6ü¿r?}îçÓ:ßÖ=kYŸ¡É‘ó3ßC•ãÁŽí¶Fœö‘ ¾t9­î2IBZ˸Ó=¢]äxƒY[ä ³¾ŒV­?¾·‚[Ðã ¯¿ž{©}Vå\o!¹‘K1빓ÿ×{-Œ8>ëRÛ¬JßxAƒ0ÿ"¬úÄó꼯§umc=÷^[Ëô8âu¿ûö÷ÿùíÏú‡¿þÅÇ_|÷í àÏGýûÝ_üÝ7»ÃûÇþx>~õ­}üÍç¿ÿa”¿ýÖ—íh hÿ·>xÂüÍÇw_‡i\â9îŠ%ü½›y»·ð¸›y°»™Çëåóñø/¾÷÷ÿåOÿËûÿôË¿ýù_}~ïÿõúՇÌìjÁÆnÛè~ÿÛŸÍÏŸ=?ÿøþß¿ýå÷vñ?ôkÛn¹þºýi?Ûr4þ^?ïpÜÁ½ûñ Pøù6_Nëh`–ãhZ<î--{¤’'D䲜{æù õóÍþ,_·‹m¯3 Þ:/ùgú¿Ðúñ²›ýXþ䟉Èg›²_Ï?ýסí×ãÿû4¨•ŸÍÒd¼Õ„ùöø¾ŸýÕŽÓ­ô.¼÷éË?ÿóNÛyé÷?|üŸÿ¨šÞñBí¹kì¾l£™ ÿŸoô?ûÅïÿåÇ_þüóøÇÏþï¯ü·ÿøýÏ?>{åŸýî—?üôÓÏÿùãû¿ùãš> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 849 0 obj << /Length 2000 /Filter /FlateDecode >> stream xÚ•XKÜ8¾çWr‰ h»-ù!;sJ“ dv°éÁ¦ˆÚVWiã²kýH§÷×/)Rv¹Ú‡™KY¢H‰"?>Tñî°‹w_ÅWß÷w¯n?dÙNˆ¨Ì2¹»{Ü GišíT,"‘»»z÷gp/E¼ÿ÷Ý?fÁÛ²\I‰HÅ),9ö“më®Ý‡‰Jƒ/}ïE’¾«ªnj÷²FÛˆþØõ4¨tcz=Z/9µ•éGmI`/UðüvfI¼×n†?f°šùO]cªõEB‘Â=rRhj4’¦IPk:9MÓ@DÓ4Eën/‚é¡y&­‚±×Õ¨aá¡1¯iáÜw09½¾ÁÓÀ„+cȬˆò¤ðÖøò<ŒæçV ›Á{Û5Ý>‹ƒÃ3I¯MYª()fawÀ.L²<Še¾¾•ŒEÆM“,ÈÕ}œÅ)üˆ·LÉD˜ç""yç— —$þÌ–ª<0ºo¬Aû¨,Ð=èÙZÑÍÐѨ6CÕÛ‡}è,N´¡;ê‰2YðdÆcç˜kf¶'°ßLfȤ¦fzË ª(+Òý2Rð·£óò=™·Wè»Â,ãåÀråßBlö±¹"Äæ…"­X#-ÇáhO©À‰@zm¿;Îþ`»DN´ûîDˆG Í”z[6À`Æab ËÜkÿ€€ªç /A溭iðË÷®™œêàyåJ,è ™#Ðb7Tt@+ЄÊáÅÛ‚Pvû!;P?Is·W(Á!e"½i”# ·q$÷€G™¡<7ÝGÓm)ã‘ÈÕ ÄÊDvÀ¯ `œBPz}¢ÉxÔ#­^C…X‘³êNgöhÑ.am&ôƒnxoøÁt‡ÍÓkæAC HF„Óà\®#¨&šm‰÷_ºýîkgâ$øc_ÈÀ4nv¼!Îßp¢Ç©÷Û‘;AvA.P±ŸçƒÌtš^_q‘z€¤Áõõ‘f=~’`ü•__™-ÉÁ!æ c¨ë¿½†ÀÊD¼ÛÎÒ•9dšœ«ìy†llÁ•7 Ùv+&„,#•Š­´{[i7D,½0§M‘,ÒuT~\%q¸Zƒ iš>Ÿuÿ Éþ|'ÚÏGí¬ˆË'A^Üá° ôùŒ‰¡Óä}Z'(ãò ñL>Ëe“—É“éàÉ…|Ù1z댊 œ`œ®3X bp¼ñãÞøM4ú¶.Ù _ Mq¦¸ïx´Ì»DÂÍ–×[Øëme•”†ÁD—rlÚÁR;ÀiG­‹AI9çÆûXf[þΣB—y.… ÃÝIƒìeÀù[ÍöØÔ SQœ‹Eƒ$Ù̵Ð`-9œÂm@5?-£DˆµµQN/lIj}^h«HH£ÙT@æÅ…zé¶RQ.ñfP­ïœuTB‹º6ì˜À!ÎÿŠ3…r9?‰¡õÙÈOv<Ò¨Et"y㣱‡#Gw.iTjmÈô ëÑánŒ2aNúàÂG”1U°¤(/×B)Å8vˆ. ÃžÆæ;&03ÎéŽÐ?.²Ÿj‡­*>B¡ýréZ.Œ,{šÕ×ÜÝ:º†étöQYÎaÆÁ\®« n4xÍ[˜%u½õüÌÞúÈöqMîÙLÇ+Ÿ¡yºœok¶“·¹¦©‡aeõÒc\åiy:K.¿?¨ü¨‰g¢CæÅ s<Š¢Rƒk‡¡À°rÚkÞæ¿öd7>±CcQ¾H™Îœi¾6s ƒnî|q¹íFè úÜÞþÏ𔸖ðÒÒÔ=-)cxrÕtö&vçö¼8´eÆÖäŒÒMo9è"ÌÊ8øµs¥Etá ÉÓ~±SO å±¥œ•.’ËÀ;8“¨‚ïŒüýdÜ3ŒÌ ”Ëû´¡ˆ®àÖóc¦šÜmÝa±‰õ}ÀÃŽÃÞ»¾¶÷±H øÌ1D‘©/úÑU; m³PÙÒˆF‚[ÑO-´4Ô0’­5£8æ×ÆÏP®,IËL]wª@q*|¡ìj—à@]hqœc ó£E4~oí°±®ƒ0D:qTÛÖðN؆ÛÈD7h3¨Ø#9ÿM?ˆãÊÙX‚â‚ß ºúç¼$<à\‡4`/À)’+Å‘‡ÜŸy÷çAotm]½Æ"&ƒw£môCcˆÌOú<ø{S‡À«{,ÚÉ‚{|hI°¹‰][~d ­Ï±›šš=„ÜÄèá™Fž•ã(tC„®SëSËä#ïó•sá©yCÛÔ¶7ÕØõÏûB7+mÙíOGãâUd¼Èƒ¯C_ݾ!"•$rá•|Þœf]V °uoáb !â¢UäËî®*5ëž­@c@vX¿’/^Ëòå³JrD·÷ö0áM2‘ahZteuò§ùÖ1ˆó­Oú›cÍ‚ªÁfQ·3[•y²pý´Ùöp³zùWÄy Bž¼8ˆ©ôÁßfP‘ œ‰­ S4}l«ûg…¤:(¢8Dµá³6ƒ„§®sÇ>ÒëeKå,WèÜ =áã†K,œ†‰úµDA*[×þ©ðyì& Òú²mð¾•Èq™mÆž¤ÇÈìÎ( ך……Œ”bsçjÅôËÝ«ÿDÛ/” endstream endobj 858 0 obj << /Length 2710 /Filter /FlateDecode >> stream xÚ­Z[oãÆ~÷¯úDÖìÜg¸ Di’¶ÈÛÍ¢-ä±h›YITHiÝý÷ýÎÌP7ÓòÒ¦ƒÃ3žïÜæÌèðÉÝ„O~¸âé9ÿxõæ{%&B°Ü9ùx;\2ïõÄqÁ„ö“‹ÉÏ™àL29 !Möa·^Wë»éL9“½¿Ÿ*‘}YÖ?”õô×ÿxó½Ì—ã“™”LXÂpéºá3eD¶->©lãk‘žÕz³Û&R|4˜€õ¶\AfÛ¦,c×/\èeÙMŒÏ–Õ ­ü)¾ßÖͪèV\/N–>Ì—ÙÃklï 1/4ÓÚFæïÊú®)6÷ÕM±¤Á:[FžnŠmU¯ÛHÇb£X†Q&Ãj"+S»Ú¤qõm|nïËØØt²¹+ס5õ2cÓ™yö·²I£ª4½XÇgù¿bµó=ü†/H›}žnªE|Mrâˆx@ã¦nš²ÝDI¯QÍh·È‚ Àñþ8æþ¾k·±÷·ÐYbo‰·«ï>^ýq%À"Ÿˆ½‘Ye˜Òbr³ºúùW>Y (˜Êýä! ]M„rLмåä§«E‹uùıJ&µfRz¬è.ÙÙ¿#\Û|ß™½%»¢fÃ#Ö S¦„{kÇðã^a ˜¾Q—ÖàÉrŸ?ZBç"¡zñ{.¤aã/.aá±úI n™tKYfE ¿pûÿÝNñÍ[Á‡™H.¯e(xÅAm^“Ûëã¹ëj[-Šoßr–k+ÜõTdò7 +¡s©j/£¡{d$<ƒ!"#‘3kU”Q1O €ÌIpf•<µ…G´<É #‹]U®Ûª% p®¿^ =DwÔ´†äÜúK2 °OFÐzFÌú¶_!#ÉÏv´©–ÕªC ˆ´F\ŸôÌÑÕõtÂ3ÒwBuž$ló ËßìSe0 Á—…3Ypð̽Å€¸aš'J(æày™Àz»ï„ •íÚ4† yêc«zY*:ƒÂQ9yÑb†"z,x:³É#XŒÉ=6¶d1ÇhæGh:3@`þ¢Ü,±Q™¶Á¸ðB_G*H9µ›«¤ï$©´Ã«/i0Â!ùœßq„D9›: Ï›¢ù¼[ø’D¥½»N´yºóôÂðDe÷©Ø‡DSµtö’,†é“…dZ¸1¼ÈxżJéÀ˰—ӯɕ^±D—ÒòòÊ{fàdüéE 2sQBÀ:¥¼”ÖJʇ°–ǶæŸÉj)=¹9½,똖ǷÛjÙ—å:ǰϼ„ÕÕ í¿*Í}Å.°ºg÷+™?ï,F0“ï38r”é,7VfŸ²Ó™–†gÂâ¤+­â‚o ä«™†ü(È45üÙü5ÈòÕƒ '(’ôÈTŽ}\ž‡{(ÎæÜfRžÆŸéðÊÆáȆþ.`ÈaÆp#²fùãüõ‡q؃'0’þqÂÔ*aŒ§ÊÎB:¬wt[•ÔŠ_‚6±h88‘ÐÇ€F‰º8‚6´ŒõAƒÅ<{l¶Z>ö“ u çtæ çÁÑÀWáÆ]>:H©qr‡L9?8-À¡ì=F¨ó<\ÒŽ`œœ3cýãóÔh¼V¥#ho¢ÄYž? o(o}èO™1Ðé\ãézN/G7Œ·tÝÂŽa8Á!5Jðö§[hÎiå^€m(g=à\ÎŒÓ〣{CsnþbpC9맘ôz »t𹳫ž}ܾ$5fó³BS¾D¨0a-gRFîGgF°0=ܤ>bD*Ápƒ‰ ã¼<åckûøËÕçÓ°,-íS"ø =¨å ¯³{c$ãZ£å êLõnK=•Dúy¨¶ˆö2 L<-(Šæ÷Vžš×CEÅ8šK*u!Oà*Û4ý˜ ?RêÝv?(6ÚP\³ˆ/©ŽfGµJôNõ54­«ï¡ö*Æ,Êô¹MÑ«Ž•æTënNúBª=êq£³jž§•"Œ¤_ª& é ¿|‰þ¼ 0¼Òžù®Šá¥È#¥h'³÷¡HIùCa•ʳ›P±bÔ‘RP$ïÚPØ2Å,¢Ü•ë²)¶i~¬QyU4wÕ:T"áj•|V·³¨ýá¸$¹dS~EEYØ> ¤BÛ*¨Pª¨BÙ)\žéïA¤^R!ð9©c˜}Ûêf·,šëËÏÖ¿IKÝÖ˜×Ä6"欯D+VZ•Û*þ`£?/Áj#5ÈOØ  6_ÁЊr'JÄÑ‹.sx÷{Ÿ4}ÊCSš½Gµ«b¹¤ |î¾Hì êQ š5ÙûeY´é»mYv;Nš*j%¨Aà”íE~ 6ˆk™*Íb™0®ê&‘ªu,Ò‹¢¡{ÞÇý'ÕªÕq^ÕmY›&è'R÷•lÇŠ¤Ž3EF©‰3£ïÅQÍ£J5ßBA/,yüP¬/šÅu,×û‘¥Æ¨º¯\†Å{´ÏþÚõ½'b±Ý5yô¼côÌSÁ?ìªõ"ˆÔŸX$þ"”~·‡½Œ ƒã‹^BvFU|q—9·Å¸8·Ù¢JæI7ã&–U¢¯ˆ¯íjj·©ô£âÅúŽì>ÔIƾ[ Ô_7ŸþDA¼ iÑ©ùÓ—v[’ÞoNØJÞ;¯j¬šŠ!÷jÓLÑÎImúpw µuJKŠúðÝ¿¾2•GÀí`àk¨ösûàÛHîFQ(ˆ}¡è’w%•Üt ¿û±™ªRÉïÊH| YA÷iUÚtV)'k{ãÆ±¸÷²F”<˜}KƤUV±’¥æQgSÍ¡übù¥M¡‹Îšò¶l(˜-:ں܆¯hrÿÞhöÇŽ&Ph*këø,Â»Ž™(Þáå!ÍÝ&ˆFŒòÔ ÏE…½CíÚ hz׳.!·¶[,} bM+Ë:ä©h>> stream xÚYYÜ6~÷¯hìKÔ@Z#Q¢Žû/ì ‹x7Oâ,âáHœnÂj©£ÃžIþüÖÅn©­8~"Y,RŪ¯RÑf¿‰6ß>‹¤}~÷ìæ¥*7q–Z«ÍÝÃ&VQ˜¦É&â0N‹Í]½ù%ø¡·ï]7 ÛJUð~«òÀöƒëZ¢$A÷À3?pêéöÅÏà7loyƬ¤K¢B[x\ 5§ÃÂŽwrÔLŒ;˜ê @§çþx0ÀØò ë÷¦uø­xÝØ‘ÄÑRÖÁž ìÂ$¹EíZÔEüØÖ¸y’g¬ Ë}Q>v/ÚýENH¦VÞÔÖÜý4‚ð4*g\[»÷®žvk’™Ž™f9ŠO­Á& NôÑî45†w$áZ82§ik¦Ö,¨¦ O õr0íÞò‚zêÁ'xŽÎBLÝÔ‚¯Hj)t T‘–Œ›T— §È; 5v€¶:6’.Š”UâÁG~/ –JÀybòL!=Ï»¡åÌ¥Õ,í=…$ô”ŒLcZ„bå oÁñ©ïÂÂËâ]øOg3‹­è›ì—d¨ém'„Ò¬ úîÈtÆ!ÞÆIzðĸqŒ]? ÿ`â'˜V+1 ×Ðq£ª™Ž§‰„oúZ 'ˆš‘öÁ‡µC¹¶ê­ C.ăÑf•"… ™± Ó»Á‚FsèÓ â.Õ ±ÑÁŸæBIpùÑí{DǤ ÛíikÕù0R¥*òß‹ P< =&’¡}¿ÅxÕ;ï@rÒ2žœ)òh~²(0Uß Òïí“(%gnÜ;þÞŠˆhÛ#D>Z‹V,RÊI¡ið Z¥è3coÜÈ“¦5ÍÓàÈò0\8 ²~ ÉGP@`Ç1eûB²=îºÈöëjÆ€]@\7rhŒ™H¨Íh¸g¦ýfdQ1NŒ–cDë~Ÿ,“,éCr[]Sü/(þóVÜ<7$&)vp^²eXq•+$rxláþ1xçr #(І‘)^ù<‚l?ò6 ¿aDÐÊ®‚ú ÿ§Á¡CY°¨À-k¡xA (½,Pð];ŒÖ ^JAsé1_BCJ,úTeÊzEŽ]/|½¥;R7P!`Þœo;¿câx‘uDÆ<Ôº\sHÚ)&ín‚ðLµIvu‘M2©Ô3ýWwÔ8.Ãüç[ˆT*B.¿…ˆŠößlKð›æÝ:Üáb­ËYDŽno·qTo8:£óÒÇŸÊÏéZ~ÖZî…¤•ÆÀXËd|k¾`$…S™‚)‘ÓnÊITÏÁp`™­$P¼æ ’¦Áyιm™¥ŸÚ–Š!ڨ鸫%ûá¶%äJ¶ßÓZÑW½‘aº'Äjd2å/a€×^ Pk¼¸œÅȶ0§ê]%鶯]ËÅ#NøëÐÂ_üuHvø»ë–Fi|C …ôƒÕø‰j}¾T$eΙ¥ôE9tÎ’Ï.äúÂäAÂ#CÏì‡D'_å îfyzýÂÙÂmÈUXpÍ„-ß¹àF‚õ¯õ43 —ofâj÷“k¤ÛÉN÷³Çlj‰4#æê'Ì=ëg/"¬ˆëKzD* ÔÜï­Ç^ F?³\a‰záÖ—a¨9¹™ã£Bä†íj,/Àøÿà hÇ/9):ÙÁçÊa­€Dß¡økûèîËã¬E¸:éß1 !íâÇÇPì\bJ""µýžCÜp˜B·4ì8O€“䑜= 0¶Žë73Fû ¼¡r'^¨¶@¯Ì _„xpUÓÅéÖ “x»^vñÕ [š§³»±© 2¾È¬ÄÞŸì ’+ICéB´Œc¥)ÿ˜†/^øÐ9"‰9G¬D`ØIEP“J~þWw<9^«J½|Ã,åÁ Ú¯S{ºòŒ]O7Ó×<ÉÓÁ­{ÜoqD:¾·¸ÖÊNò]hC2àMÞ¹yÖæh(žtÌR¾2Õ_‹k>A¶=Rúfù2'"ûg °‹æà$¦v<„¤˜]c™H¦çE켇²N,$и9ÔU¨ ò+Ë42¼*ÒæÙQK|©œšš'ÏÏ8ü=qϳŽ.A#9"÷G Öâ‡ßµB>È>¿I96_ð6µƒJbìz([b¨¾V¤åZl—œãkœ¿ }uóù•‰ò0#3Ùyo¼½º†oJ53.ëKxž:ïþ€–ð¥2㨠¬#¬åÒùœÂ}{óðºÄ-ÔQ)¸ oª®}p{òE§Áng[´åîtxêíã×ç“CòײèhÞ·†›Á´g¶2,3uáúzµx‘Ê q¥E™wb5p;r‡/4ú|>A’·½¤[ŒûÜÜC ±´±²ÚÖ,ÄR*KÈ/¤‚âÓ®ÖâIy£»s²¤ý[@@)—FYy}É™ïÚ«ªã •Í'õòç1%AìÖWKŸÁTgbô˜¡x‰> stream xÚ­]“Û6î}…çúíÌ­ŽŸ"Ù·f&×ëMÛÉ%{Mn’ÎT+kmµúŠ$¯³3ýñ”,gç|ñ“!IÐlµY±Õ÷W,ü>¿½úÛß…[q;­Åêö~Å™ˆ­U+ÃxÌ•]Ý®W©Út(îÊüúF&*ºoº*âë­Yt»-zDëè=ãŠXt´Îñ«Î{1l¾j®o„r¥õšX®µŠÒ®hvÒ¦]ZåC~Í£Ž0}>Ü\ÿzûOPþ†«X©„ôŠzƒ”r¨ VÖÔë]†"¤5áÓ:-û¢í-SÑ›k+¢œH›âátËi@Õt_Ôh0¨>h‚˜;oF^68b¦ d³•$?™ÑOè>ËÁ}9aßþôãœLð¨R9ŒÌ5x&àš{úMé§Ï?ìò: |iYlê*¯QÈðT|Qä.¨Ü°:i $’$zùÿüøÃK‚ß3ÍÐÓÿüâí¿_‚Ó'ÁiÙ ÿÜÃ6 G¤ÂmçýøP¬‹‘ß›Š@¡—–KúeLMÃÒÁ;Dsrü’³Èš®Ëû–xkšñè*XUô†ƒf.ú®&Rþ1­Ú2ÿ¬ÀOæ]Ðmr³H"¿ð0À¯¦… éó8†¾E)W/n¯>\qÆV|JÆ„'±’b•UWï~e«5a¾X:»Ú{Öjee¬¥°\½¾úe6dô<³ˆµ‘ LÇB-åÕ\E/·¯^¼EXO>÷„²ÉBà#é¾(ó§š*fbëþEçÆÊ˜YÔOÆB©S2ØJĦûT„r<Â~ˆI ø5†Ÿábý¼ÇY ‘0;jé7ÁÃN\cQ©rB•˜5_?õðhÛ¹Š=µM;K&N‹à,V‰û²qÚiÏèûó5¿í›¼þ¤Øadû¼=ç+³`…<‘òBYŒù¹é†í‹t2†kø)sÎVeÁ.I.zÚèX C•ùCÓ—dƒŽ!ô˜‚%„P1—Ò:y´3ÕZ0, Î|I„KþË’$fZ‘eT›lÿ0³Ìq%œ-ƒœº|²sõZ0MK¨|ú2¦i0Í 2m·½ßÿžŽ– iŽ9iF„Rš u´sõZ0MI ‹ËÄ£Jb.Bµ¨×Õþl¶jÜXÆg¦ ‘ئ«×‚iD8w™U“Iœè°¯þÞ¦ëü#Y"Ñ4£Œ²S@jÙ;UEÎÕkÁ4¡b&/”kLs2T‘Ù:Û“%†ª-ô¸ŒPE¸8UEÎÕkÁ48g1£.cœXŒädÚ¾îï†Í,×x¢´µ#¨#§Êȹz-˜Æ sqÓà×$áØÑûM]ÏrÍpε›r-îdí?W¯§¦)"ÔerM¹$¶l̵í‡u_ÍrMK§Ç€TxÚ4ìέׂiös™[Y0M…\{(ë¯5S@ÂÉVàE+¬šaZž(#gëµ`š¸çò2«fL,ÃY¤½ïêöyªqcÜÁ2ë ªœ°ì\µ,Kà¤.sÂW‰‰ ©–—ûõC7KµD9§§*b…‚Íý„içêµ`šÆ^fÑ´ËK8—íð±x˜­œœàð>";}9[¯%ÓD,¬ûšÛáWˆ/ä(‚” ­á€r|!_nµ)ÁcÃqºipZõ „®è#kÊ]U\„ßáˆµÌ žuŒˆ)à}!üòý£¿lŽX°i&™_ènÀ]µvkßQ¡‡§Ç6ŸŠ.àFÕž·³æìØ&òò° ÃmhŠar‚Ô:Â&‘ÅfRŠzš©'rðÂ\Û¶ói¥ ÓJ7uÑç{<€ 4ÔÆ¾2"úa 2\Û;û¡§OjjÑ8ì$üÛ7ÏÈPßmÚ¥ÙwA@±©Ó’ZP0KºÜ֪ƖLŸüaÝ´D“×›œ 8ê£í{ú›°ôE¦YTÅX¼Ýsbh“µ»Ò7}ž-6·¶é]1ø0œk£ïBwQI‚ €ªmÀ0ÓS¸J>Ž&>B²(íû]•¯‰ch:dƒh]ž i½ñ Tœýv9Bƒ}A­+))qð·oSß–ÝÐò¥}øà'!LÚþu+‰­à¢F]‘v‡‹üHä=f©39ÍöÙ¤ íãahª›2¿¨y˜5]í£hØvÅ‘O‹µˆ¡B‚À/·a>-Cª¡qãPêãâ¼^¸€ÛÐÆšö¦+6Û±™ ¨¦´ÏjW5IŸ·TÐ0”ÅÖˆc?÷Y>ÕW28ÕÎÕÅš‘Œ5Ãðè·%=”€k°ôX 7SÇ3’u”Á=á¶yÙ"±»!^Ü?-4è! L?5Ùg´²ð̈́βa.6„ ÖŠãbØzjÙb3[I˜eûTʧâ`Æ>(*8ˆmÚ Ç$zP$´ ›z’AaÔ~ÛìÊõ(Yv¥nbÓu!¶(9C¾Ær*­•°2ÚäͦKÛm‘a·YX1'„Ñ=ÈEo€˜*~ø¤D2”Ä–¢Có=! _§CJ;pN·ü(ã7 Ää/´£ž¨è{µ¡(§-¤!Tp+ÚÔŸ±4•§ííÕ«k¸ïGo–äKŸ:i9€{7[Â`V-([Ãcµä† $7³ ï±´Þ>-@ˆíw.Üvd÷E ´,°QŸbqkK`ÉFä(I^²Ö„Á½¯¨?ëT•,?¼¨„JxH_+Cúâ û¦,i£ü|¶«áèÙ3]ÂÇÉØ’ʼnϰ ótòƒ„%M?65î& å½ÐtHÒD".ìBTØéžª¤:òñiÙ7„ígÊ—Úðt®žì zñ¡k,¹ôŒˆüÜÄZ»c#ŸÏ^'a)ýFËÃC(üæ³¼kúÀLóëMŸþ-É$î{$~d£˜ƒIð±ë):œÏA?kÝîŠY8£ìêq2_ä–té =HÁ-÷èÕ61!Xß_Ù æI¦ ÒúÇd\8ªãˆ¢Ø^Ø'‹ÊöB¨ìz*±Î;G:=Oýœt¢,ЈíýƒaGœ{Ôwú$%)Àçá]Ûï'Ž6u_rwÕõáU°#¢ß!œ âý‘áº|ñ!ÜG#–''é4¿¤‹!]ÔQ†ã7U1‡U´,!/óµŸv©¼ÞøÓ-ÐH‹±¢Á¨÷\ª»]Wõ_ˆÒnÓ>#ó!‹ý9b!’i:æßò ¶]¨|l|ààP:`[Äg²°Ó±$<”O: ]q·£ãÓÞ‘}N¯“t_ë6áâöêû«Õ;ÏÄYÌcxèo‡s„‚ÙfiƒüEÐlé"D{¹‡»ùq©JýΤ¡áøÛã¹9\!+VpF޹ qÃŽ˜à2ý_{*ú endstream endobj 879 0 obj << /Length 2499 /Filter /FlateDecode >> stream xÚYK㸾ϯ0ú$#k-©·‚™ô›C°˜ídØÉ-Ñm¡e«#ÉÝÓùõùªŠ”-µz³Ø‹E‹d‘õúŠV›‡ÚüíƒZ|ÿz÷áûÒt£uX¦i´¹Ûot¤Â$I7¹Ò¡NŠÍ]½ù5øiµý÷Ýß§‰˜UÎfé0W †˜ýö¹kÏcÓ¶»8‚nOß8ž¶© ÌØ˜V*êwüÓÓoÝœÌh4mwz‰ãÁ md6Ë?! 9¢k9¢$ £$÷‚|žx»cWÛö/2!š ^ª0֥篺㎸6»8NÂ4Ë6;à:2~Úî¢<èNö´Åw ·»$J‚»C‘£2 äëä%“éGi½lo£Ÿ?oµ*ƒ/B>v¼:/†5ÌÑŽ}ó_[óŽqðÏÁö˩枬­iVŒ´Z™ÒÓª¶jö¯2òr0£Œ=õݽ¹o¶:h›al*¡Öh÷ͽÓÍIR·fÜË’B<~ËÆ±w}mûiÆŠ”×'õB+íçmš¦oŒ7ŸØ™Oä­€ì'Ð3£˜$v§ìoZ½7¤80Uß Î¨Úæd̓p‘iN¹[°á­— #˜„³•´ò馹Y3«´ ‹,ö¬Íñ©µGg5,Iù|ÕqB÷]á@ãÐzsª»£´_hŽi¿C·(‚&´!7KÙòøl¾… 5$šŠ®ö£RV(}y j 8‹'õÝùáÐÇËË¡#Cñl½}ÇãacyIýËŸÌñhVïJ«8Œòé²pøµ…wq‚À¤ý™Òåúm÷pêú£i×÷ˆ øù» IíNŠFo[óŒš;NÔöºÞ•ó•û-fw~biÉ Ç÷€{<ºâÞõàtê Wdþ½|Eùh ¨@+ð–ç­ø$YÓ~^iÕÒç~ÇX©@Äà5Ñh_·…(ô¤‚Æéøƒôy§˜£ÛÀ,ÉL|ÇÕ¸ï`GÇÞ /‚ªœú—‚Švâ"Fp˜žÔ—ØþÙ‡ dÃù«Ò‰¨DÚ‚¾Q¨pˆQàÎ/¶Œ4×¹ ­6¶Ý UV. ¨á6\jžœä.l“WS0$ÊÈ—Z¼X’Q÷ˆíj!ï{r±£çv Õì ‰^fÁ­©HÑãôF£íšXup91´‚˜½S/%±Z,SI\UæŒ týxØýŒ pR ÜšaÜ}ÙÉ.$øÊà68˜yVrNÚ°‹e)R=ìéå$7wšËutm=\ Ï‹®h¬oÈ[’,Yø º»Å˜yzjë6\Ï?vºÃ8ÕÎE¢Ép©ÉrO'/W/SØŠA6'ùÚo d © œKhF·ñÑbþšÚ,™ïÉò•+d[ó*m§!EY·÷$ ظ°Ã…e%|ê,ËRûH—Ï÷òµ†^–·q3 ³è›G9e ’?4.EÀQ™NhÄ´;¢€Í#~O´T‡J§~ ¤"(Ð'àEVÂRgo„¡ƒ‹‡’Z\0.ge£2óiöpîŸíëÚ. e:r·ºީմV Ó¨XÅëP@eÂüªRUÛ½9·#š:thüI¾Èׂ+ã"õ'å`"” ¬#[±ŽÕ‡¯R‘^.Uz™Ô p=…ç/*ú½‡+/f‚Ï%ÇëàCJžÒ¹/{9,ª2ƒ’CÌÔ¼ˆO,› øê–ëI<Ž!×K’O¸Î'@Òöõ]°¥<º:·øT+ ¤SS8ÉÃ_…@Úœ ™öŒ°GG7…2è›ؽA3½5«XÞÐéã„ ¡¡“–¬Ÿ ùâl²:|;¼X‚†É°ÞXm³ÕÉïp¸¤Š¯ÔºP ³ Ws–t$¶‚¨ Sì—ÏÏåô«øÚ,Uä“L¼¢åî9²SWn³j[ug:?é@kIn Nt¢Ì‚O€¯½p4Ô]KTÄãœ,&ðÆÔhÈ3'^i`JÃ1š¸;™mªÊr%Ú^Ë[k$€S‰g^—Û³"}çêí]„©êé?Ÿï?FŸšA{)Ï]<%Û6áchغuT-—êÕãœû}k+(òMû}Äüê‘ÐÕj!žÃäâëB|­ØVÁTd"¥pœ#ËPë¨îFæ!¼ª4ÿs¶¸OŠ”}Ñr\A¯êÚ±ñxBàË'Bx¡¿1Bk_é˜2,±ŠÖ–ª‰n)`Í(¤fÕ©{X먬æ=µ–h¥#ÄÔÕ1bhwAõ=JVuàT l!Še–é½åzMã–žåŠJxPg+µg»&%]ÀšF“oô‰ZZ'Á3­öéFßî’›ïWU¬S$àò:jªÃþ$ïÉ”V¥yhy\ä3øÙ=• Ä;:|¯—* #RE¹L¤S”e©žg"®°’<Ÿ@eN–&_Q@.öN›3X|Zo\¦Ž@9j1|’/H‘ºÓ¨1½kÀ…RÛÝúÝ{ìGÓù6'ùºƒR–ËæùâÒôûóÀŸ×]Q…Eþ®ê.ðÓBä×7îîÜ´yÉÈÌϦ‡®ÃÛ]ñž²uÅôE_ý —Aµ+Òò%ƒaõŽ!_R>ŸôX·½ö"²ü"§Ûk&§àú”¤¸8‘*ãÓK3J5FoQµPêþ:Šu¥TžÑ£ üÆUß)Ë*-I^ƒ#®æO9Ðw½¡©À3ôHØTHv”-"o*äš<Ü9²J‰Å'$tÚÓkÁUñOˉIÓv'NÝ(#ÕÎc×»Šþÿ§˜ô¤˜ Ëÿk›_?æiE/½{×ðùcp}S1E\ôVÇ<Ï%'Aq©_„ßkøýرM™êÝÜ´ÐÄG÷.ȯ†ëïÄqçÅo¦'á´?~¾ý¯¬f ¶96¬a"R袯c¾k(W〓Ûmå$¢”v\Ó•½Dœes¢¸PjJ"~* ޹ŸV¤°5ºÞ†pÍj¥ ÇQý¹s(jHZ}qÏ¿¼RÛ¿¼Jé šº{ ÂéÜ|údÏwô,öö¡#]>(¯F¿$ “Kì»Vµ„?þwàÓÍåq=¢E*F¡š\§/Jõ){(}ÙͨA§ãG]ןg’Uáfi˜ÄÉoØåLXYžãø{â|ǺXfÛ$AÕNÅB/‡ï¤dáP•¹º, N–°*«’È.‚íüª31.Hç.*‘²\ÄÍH¤ågeêK¥Û>³¸¡—C#õ©t¯kÐópαçH‚§ÌÍãPGêa/KœëÓí݇ÿD”-Š endstream endobj 883 0 obj << /Length 1180 /Filter /FlateDecode >> stream xÚWKã6 ¾Ï¯0沺ÖêiI@§‡¢-ÐSzêöàI”Ä@b¶³éö×—•‡3Þìî\"™¢HêãGJáÙ:ãÙ¯+¾Þ Õ·tBù½ÐÀM6Ý Kx@è7ÕômXœ¾Öõ-J&¶-÷=m«På—z¦³’šW2lu¥ƒ'5$¯> 7cW·NÏ5¼Lë—Cº!a‘ÆÓ= ‚u;/… T© @ËI1Nz*ÊILSÞÞížÙRŽZ€Ó|ƒ‘ëØ @g8ëÃ@‹çÿ (ÅMU«PÌó݄ՊE|X´7`!Ë’yïož á˜ãTRÛC¿¶áþ÷L`¼­™‡ƒÆÍVŽ´~™?ü°êK¾ endstream endobj 887 0 obj << /Length 2693 /Filter /FlateDecode >> stream xÚ­[ksã¶ýî_¡êKäIãÉGFÞ™v»Û&Ív¶]·“N6³¡%Èæ„-¶•Ùß ´H/ S¿X4âÞsÜ{ðžÝÌðìogØ|~>#ð‰gdF0EAÀg>&ˆq¶NÏ~ùÏ6ðå3ŒXÌé,ˆ ÉìÃÙ¿ÎþruvñÖƒ60 qHfWÛ 9ž7óÂùÐèÕföËâÍC”îy¾T,>båÃZ» ‰.Ì·úóýíþßo~ÖÏ?¿ûI?lcx÷׫ÏÞ\uÜæX Ðg#ÜîBg ¼ ¡« <£( ¯šà!A”Ç7ÑǼ™Bá{Š»ÀGÔWÔÄCª©#_t:êÀmª@Ç<ß]ÄG>}bsµ»ÝòA“_ÔŠ7—s©ûpnú«®vu…TÏ\Î៹¥ZbF¹i%& ˆc¢¤.b yï…® ÑÄtm¦ëtÖ·Qœ¡Df—sòæ[߉|ŒVä>C>6ÝÃÈ}°ìO4$º6äe3¼“Åþr.0va剻ǑGLpv"øÓ`ïÚl°ïŠ8«ZèÄ }”#VèB az@8 †xL3Þ;&à×u‘ÅYƒÙz”VÔÜC5ä{ØœCóux×fZWi´»œgùü•ð(óVÀ,DÀ»6î;3y”º-zÈ÷ÅóYêØ&N‹ÂÓN§i€£ÓôR׿êOË¥NF¿ýö¡Š²MTl¾ùF—”U½5Šâ&—¥~º•…üN?ÆH"ó¸ªò]žä7ûW¦`¹tuú(4Vþ(Ag:=tðGBÄ9™†¿®Í«]TTqç™LdÚò «õBF¹×'„ÁT@!æÂkZö`#y 1O™Ç6ñ¼×J…BLÓ^»Ô| ho’~ì=ôã»|#“¾ž¾‹Š8R=Û/.wP™º›x»­ËÇ:ѺÈK3e’8“ÑM;Üa>¥"ôq;:OÀZƒÃc J{FW†Ÿô@h¥ t‹âþÛ›(M##ƒEg7—ó².îäÞ‘Ç9kå'èòãPƒ"`’àät-nâr'‹2J”&Ê ”ÊäEó Çèኺ«JÞ.bPøà99%DÛ‚Ãg‚0gÆg‡ŒÈ#N3œ»Fâ§ü&Ë‹´ùMšÈ`fuk–éETÉ'A£¾.!MÔ*œ ‰ãðX)ôº:$¡Lñ]‹«u’¯?Ò÷aLæÝr¹ –Ñ›eàžÇ»j¥dwàû†ßE ä~ÎOšÇ6ñ¼×\ òèµC= N‘/Ø4s¢kÔ™5]ý$ŽÌãPX‰cðÒç‚Á Þ4²»gtURÞÈLIù4ú&Q^Î×y”Èr-³Ê̈Ln·½4­»‘ã¼¶E;>S‡št€ÉA!£kq—ßßù}u{9ßËÒŽwÀ ˜¨ÝÀ£*¬t_Z§¿ŽmÂá4†Û=—ÔÃ@òDkýžÑUÞÆíõ½Z(êGºü«E0¯ó¼ØÄ 3ù£¶þ6¯³Í€0 Ž•AÜeÐ!¹ÚŸ^ÌÆȼ—ì]}E‡Ú.îλøHËhtQ—ѧ¦ ª*çôç·*2Xª¶!»¨"ˆ““RåÑM<ï5(gÿÑk‡|äEŒN“*{F©òƒ¬ž¨ÄÍc¦Ü¶JRFë[S+Þ!ýôŸRnk3{b“KKY<Ψ²s>äœ8ã@ZyõòDË«CSrŸ!:ÑVÏè×(‹’}‘ã¼±àyHxf3:”#÷8‚Ä<ÉörÏ(èêh#;1þ%®-×qžXÁ XÑ ³¢¥Ê‡´*& ›=£«*zheå]”Ô_ÿ0 õˇ¼®n?½ŽŠDfô…ÐO„}ù;ù'qGÊQ®ZÙá>bÜì/Q‡Êä ©ñ§a§ktuÑŒ ÚQ¦íhq³s¥×R‘³”?)/ÛÄó^«½pÏ„æ|œ09Dàö,‚×ëÃ$&‡þô±°]TE&Ôâ¡ õ¥ü\Ël-÷n£²Íéc¥6éäú “ǃ¶’¬6Ì}®˜CŸrÂÒx¢Ù5ºZGI|]tÖ M¤Œw 厕BõLÌb.}©T5;1PÒ´^ßæ*Éïeñ ¯.ôƒ ô¬ 1…4mBs)E<À¤snÄ]ƒ«z·ÓˆõƒññæmpY¨NC Z‡Âdá4h»öVÑn—IJl'wöÑA ¸Þ¬ðƒ|‡d†úÓ$»®MÈu‡9î‚;ʾ1ÈÐ h3žCú1P›ÁKWîŒwtÏ{íÁè1‹NælÌóöOÚá8º ‡Ó‚­×)ÅD€˜?Í¥¥žQ›Ê¦®ä1Î+xQ€Í.:w(+Æ “L3µºF-*ûo=î‡~ðå‡Mt›×ã<´’ "¡™|Ü!܃ñî±iHé}Y\3mEË8jì8u……ýiÛ’G7ñ¼ÓTkí•3‡èajï6˜hÒvZå5®‘É‘<Î{+a€Ó¶›‚‰X£NÄW׿³2ÙéÆxcÅýf»OãwI( «Ö€N¡’{6J&dò8l¨ièC¤5*†;” ˜ {L&tòûV¼A¯C6Ñ`"¼]ƒn¥LÙk„CVü. FA`ú>Ÿ$uõŒÕÊã°c&³68¬X›KY'd°£›xÞkr!k¯;”asµgŠÝížÑî{{<öuζ¹íš¦96ø³Éj‰ŒÊê»ö¢Ês‚q°¬L †h«`q1 º“LsDÙ3z`²åOn:!ÀÜ=‘ÅÓC—ã­• îÁZÉHKáx”óæNÍ)d|/`> ~ÊO}Nh¢ý­å@¿pn]€”E°ö¢2 aŒ P¨+ú*MÀ:ªPÃ¥=Xx{Ný…þÈþ…¹«¡¦ãt±Î‹s²(d¢‡‘*Ò§o¥®¾-òT7‡|ªhw¾„ó²’ú¾˜úr—UCK×µžÎª0ߪޟ-a Â'hn"wÓ|ñcö_õ¨®4-7÷oÔW»¨ˆR fJ°€]\µ/AÚ‹Sí±zQ[¿®Á¾¹¦J£l£k?¢Sÿ”ušFžñ ÷}*+ˆEÐòZ5@1Ì/BI¸¸nü’º4ͳ¸‚¶Ñßmꢹ÷¢¾Ò  ðp‚§ŠëR×€/t ({÷úÝk]tÿQÃDþCÇÁ®[f•ù¶R}x¯þ4w @¨.~Xï“üF?7½ŸWç]ÑZŠ0F Ö–•úJo»«*ºáA½—æõ§ßé°ÑoB/¯¦#t‘rÂÆŸL¶Kù°K>0´‡ÊÔS#B?”¹ZŸ05v¶º ¦úI$À}cjÆ“¼®T½B~®ã†ø'ÍÛ§Ö¨êüï›Óþ®ñâ-L«î±èÍ–ÜÆfƒõ#5×Ë;ïÐÞ;ùXÀWMõ${¯X…žÎ?æ¡Ð¶Þ÷ª Yå7˯fŒå@ªÌʸéÚýy@¨çÌfÚý¥ú†Ñõ>ëÕ¸úÑÐ endstream endobj 893 0 obj << /Length 1327 /Filter /FlateDecode >> stream xÚ½WKoã6¾ï¯0ö$kF¤DQÊ©ÙM6mÑ‹Ä@ 4=0m •EG¦Û_ßåXŽÝ¤ ²ñ!5óÍ7…“å$œ\¾ ÷Æów'Ÿ¥œpÎ2)Åd¾˜p²8–rÆãt2/&¿7‚‡Ó?æ?nAJŒ¤8Sa ¯Üñª>«–5 œ|Ùî¹(aùÓéL†*¨ìR7e·ZOgQ"» ±[šl{«o˪ì¦B_žŠ‚ÖÜõ¦Î½Œ®Êe½6õT¤AG–å_¸2N±ÉÌ«2ã1Ø›Bt™H‚¼oVN6ºÆ¶Á¸™Ç`&àÂ0{!p×? ¸˜Ë]àDª$8:+pBÀMy°ƒî¦nG$™ÆÉ5ê!Y5¤¹õ®«Á¸“ƒÄ¨Í{Â<3å뵞<–›Ú§»ÿcÞà§c¶MfJ°¾;òÑ.dhHð®:C»}ÝöÃ\S¬Aî§µS'›ÆäekH´À(!^|@'>(}@ín@æÂú8Üùk'fC­’Ô´áI¬víèÚ÷ ¸€ ¿ÜÒ²1ÐØÓ° ù{Z íq,)ÓB áh —poœ»¢í«n{_×7µ)huKÞÕÖç–/+÷êêâ·>ƒWF·Þ3…æÓûÊ@SèËô÷¦sïàµ?€iѱò+“ðéf9¦W9(bh—Ò‡rÔ—uaë者Y¯Ù¢ÙãYÊâh›Æ·ùîä3lŽÊd,™ä&ð׬¼ËxÈ"M! |*}Kª$¢q‡Î¡P(…`ã¾$øè{×̹7 ¾§õeoýÆ9m@(SåȆèNçfm—Þ¬Ê|(: (Bôûâ}]`EjhµMÌÐÌÑmÜ0ÈjŒ´@IW´çx'KG¯¾_¿ÿ@nc³¡fªlÛ °À6ø4è×ã•J_v[X,-¤8°üzÈÃ\þ|K+„ â_„<ùàÿk„d<ŒÆFrÎOãh&Ãq¢†Û2Æ%ÔX•±Dú¬¦âÑ¡‹ù»XEt¢ endstream endobj 897 0 obj << /Length 2219 /Filter /FlateDecode >> stream xÚÉ®ã6òÞ_á# <+Ú` ¤“ÒA¼œ’9ðÙ´E´‡’Òí|}j£,ûÉ Ì\$²ªHk/†›Ó&Ü|ÿ&”ÿÛç7_½K¢MTq”¥›çã& ã ,ÓMFA”–›çÃæEÛ]Å™úÕìû¶5ÝA¶ï†í.)2Õwü?»þätË“iÐ'³ýïó|@$iãáfWAQÄ~ëÀoþK½M"uùð/‹« «,›—ÅA”¼ì¹6pN˜©ý6.TÝÛ=ÍsÕo#uäáèiFg;í`E©jÛ¤›SïìX·L«Ûž1°¬îYWÃUÛƒ90äϽ0!0Žf9…ë¦iΜZ”R©“éŒÓMsá©Æ_¬Æ~:Õ é;lwiÊåtÔÃh†Qðg”9i¬x kúíØØëFNèL0Ø™ŸšQw¦Ÿ†5.[^|°†Qº÷ÚcØþˆÿ„¥‰€3ß¶éáF"O‰Iþù=Ã`W ø?ô;F ï†êCïd?³c)àZóùÜôNX2š1£ÄNT ;Q¡†³Þ†Í¸þL·éGµ“ºz1whÝ6ú¥1~kÏPË9¥úí—_åÒÃ÷HªJ}3ÌtƒY“숇|œšd‰Ú7zHy0A–ñ/&š¥7Ì_9‹±T¼.U¶›A}#&ZÒ`bëf”#ûö<$T²½Lî`ºáiÕdaY\¦dºôo…%$ÛÆ%0Ý3þ`FãZÛž~ª-{%Sy»]îÈR…AÛ²ÇVbGQ ½»[@â¼0?®\BøX ² Âv Ð …Ë@¼ ”ø0) /&00ˆn9Ï?-0¸×[ÓPLøÄVVhÞ´±t¯,e£ˆ» +,Óm“8÷—´ìËXúœA¼å{0EØlêlÃâe$•ÄËè–æ«wÙMt…%UVŠˆOF ¤ÇYŒiAb|Úî2ˆ}S×ØÖŽf›…êÀd{“•Q@úѶ&X åq’UQùÓ(ÚAr€JBFÁáÔÛ Žkã„Ȳäv~“B˜~ãA·)cRþ'Šâ0Ðü#OÆd²Tœÿf¡ Lð„® ÉbtÚžjïGË•ä¶å ËKðL‡1xEÑ á,Ð Øo©Þ£…”>ÔÀàH~¥öÓÀsöšR±Ñy¶Õ,éÅÂÓ[WmϲV8¼F!cd—AŒz!nÃÁñd°8ÏÉ´óB8UHÂ`äEÁ’Ç„„Žƒ–=¢jÝ1Œ].Gk'÷€Áå.³wFû­øž€æ®»½y”"0Ç“yï$ƒÜ3N¤êŒ³ÿ5cor'Ì[ˆCú3æÍBM-Ãü¶\VÀ ±I ­¯")Q$ˆ=NÝu ÏêwJë¶€ò-J–sQ)};>;‹<Œ†aöÈ4,,bÌ|´‘i×ûcÑ™T×Ñà,eég¹:WýtÅQ¨ÌºÏ;É»(Ê)ãÿ+}¤…O0âô‘±r˜+àâÎî¯9$-^å}!‡„Ô¦Üä5ÏÆƒÃytóÞÈw~ýÖ¤²Ãµb}¥QxÕB'2ŒXsw`v”ÒàØip“Åu×aÊ•Ò ä Þ/© ”ÿ‡F\ë"dF‰¤‘ÈŒèP éw[LJNÀ-t·´%Ò »&?nÚŠqaP¥±÷ÖT‚eGæ)²Ðóò×d Nè=O"û2 ÀTom‘z†$ËÕ'Û4<òxÚ…!Ë2L¨ÙØeÅ]›–aÊУ!ª‘榖è`OX?jà°Z´†ÂH½—Œï‘ «³[Ô ¾!/÷á|Q‰`³å|ñ -@ù(€@K¹ÖJ}¡¾0Ÿ5—ãIšÉÅÓœ*Ðn‰0RrzÛΕ$jS‚„Õ=´ N6êUëk;ÂÍÒ6Ñòœa4OÖ tQH‚5NOcÍδŭʊG*#R´Þ+¹ƒ^¬Û›ån¹·q÷±]×ú „ø¹6 SÕP ˆ­xnå¿lëaŠësüL퀡$Bir,nÔ1œ˜óxiAŒþȳW–º–iHOÜP‚­ ‚­0…Y¸Æ LÞ¥ÀÒ )èÁGIpi’]"íNF:޼Õ80e¿4’$ ²| _¯$¡W¹F ŠIZYq!îB‰„QHΉÔÛ0ÀHMÌ"EU‹þ‹³}B%þGn.p¨ýà¾ÆE˜Á°r_ræ‹’³¬Ø¯+Ø\kÂÌ#ÏÀÙkC.+Ñ!F–j 9Ú§|Úv.öp&FKãƒòßv»5æ(h,^ ’œUŠÃâÕÛ`åmmªîïÝ.Ï(IÀ0¿«u4=*v¥d)®% °ý°dl%E IUØ%GÜûWJ¶CÕ •Y$ ñq ¾Ü)²ñN¿*©ÑÎB ÇþXÉëhò¿G¦f´g.æîFèNhÔyõª½N_·×–Fi”×Lü-,Ó(Dµ4&Ãé[ (;¿àVSò¶Ào‰CU4(OŽí.þÑ’ÿ/“m¸Bü2pÍï”G×·L<ú÷Í…]GRœÓÓèŠj¼ÅÆ™¢45Qo&µ™cmt !âK)…µTýÀž}‚Îè‰ÇÌ 8ÙâFþ©5–@¿¤¢'«Û—¬ ðù¸ŠT^\Šì†è»ç7ÿº@ endstream endobj 907 0 obj << /Length 2446 /Filter /FlateDecode >> stream xÚYK“Û6¾ûWÌ‘ªŠ>%*—TRµÙõÖÚåJ´•ƒ‡‚DìR¤ v&¿~¿~@¤dÚµ—Ðh61ñÓù)~úû«X>¼úþ—tÿ”$›}Q¤O‡ÓS’¥›$ß?íâ¿åÓáøô>r¦5ŸVEU«$êVé.Vë|»ì‰~‹hhŒNýjåzôÊà…¡ëõ‹¾‚3uO‚>Ñãlw~té½~RÕ5¶]5èÒÕÖÃèÌêÃ?qŒu’oò|+šö¤P\ª˜¢yƒ¾Ûw•{‘e¨"‚o,D_½PŸYw3ПY/ÓÉŠ¿ÊRm߬ÖÛÝ>ú­í•¯„þÂöÛ»_×Ï•7Ç%Õ3:ë[{’•F¾éÇöHã„w†™Œ$€Y>7¤ø<´8ôWæí¡wÛŸ_d™Ž=cÃÀýÀêv•J²9Kï†J¯rAÙk媋è`i¾ùøùT]Õ¾x–—ч¸ˆÍæ¼ùÓmÙ#Ô†Žƒý'yÍ–žË)£¦wö¯þæLUÛ¾è®êüÉ8·lóé _V+‰ÏÄytmHÊ ÌeXÄ´^÷œÇzÜ74MøãèµìmŽ"_ÛØé³ã‡Q.J¬{¤ðn7tmÛè÷ƶFõÝm „ïŽæT!jélû¨¿rî•ÉK0@ö'ä@äÚ\à’àßE¡Î¡¢R­ ìOeMr¯œÓDDz†æcÊ“˜t§Þ]$WRB\YOùެ–½;Jêß‘LYâ܇¹=½èŠ”"å„–kJ‹ƒVwÖ%þ`]2í¶>hò¨Qjrã,)gøê±ït¤9“?¹Ž-ØÉg¶»5â½DÅGdVé^o4¸L;Hí½‚x¥!9 ~濊â> ¼þX¬ß((q©ï\?Ve*É…(ß’½ýR6s âlç5" &Îѽ‘øÛÁíe6sÆ” ¥ÃÅ0ÐLœ¦§KXEµL­¯a|Ê!ºº\¦`Éóꢘ½‡V.7£Ê\ë­drB7ù*ÑıãÄ!”JQ¬¢'϶µ|¥/_«–³$%8ä”!›¸HyK»ÉB&áE òC†a<Àød*®Çy"23áŠÐ…ƒ9¡P)^†RœnŠs+Ë›j‡¯)k}›ÅZ7Ž\)©¯;áNFx#”º­W½ èeY"ì""Ú*áÚÝ 1,V­WUXù¿ jÄ 9)}Á¡0¸ÁcZjÅ"×zÌÖË©PPS›3jh£¬HÄñ®!¿¼ù×w*J%ˆÈDÇ#Ÿ~¨°^Ø@Û` ¸èq2æäò…Õ±ÀVÇïdkL¬Õ<Þ[ApZêô;PÊÆqh…R¶”îWâèóv+‘±Ø· TÑs×)Îoƒ3EºXʳ‚·´Cíz¯Àå¿…7»/ðw["îÞöa£fÖj+ CS 2r£j@_ÇÒ2 n†™ˆ@ÕBð:jl[!sÚ¦¡‹Î¦8)ƒaÝÜ4Ùtcsâís0ÚX ‚b ªÎ1c;FU'˜€~®lGé:É?’)yA8v‡KÈ€Ö>Û¡‘‘Ä;$xDY«yæ&iZiâlL{]¬fùL(ÌáÙNFl-ü©»ØNnœËÆÓjŸ~Õ¯0šÌÈøŠ‰Áàœ^»aÿ ~òôÅâ»:šuJ!»ëµ'¸íšÚ®.¥= Ê§; Ië r¤Î{¸;[2zQq}ÏC]vJYBÍXo¡N Jg˜e¹(J5Å]&(ãD€÷—)³ÐbáÃ4Ý$S9Ëe !AšÖ¶i{ãüVÁ`¨XwãSðŒ-›\ß~$þdah¸«!ñh|®^¨òhÃCüüksê[}øE²,ú8R‡ƒ‚öÜk¾çׄhÞÕ ›¶\9\ßöÎ Ñsê l³Ö†8šcÅiX$; ²3-ø@-síó¾®}Åå¡ÁêW¥ªP,O·!9mãåׂRëX% HµLT#1ED/M7…*Ê+!¾ Ãà݆Z“-›ßýHÑSð‰I«?é mÅeÊKáqNz©ùdèoOüþ(GK€"}Óóý­kó·ÿâÕ¢¸{µ@#ôз}H“øÛ/Ôìáéá§BÉÑÓ…v¹b£"¾9÷ªG~é O1?.E[’n7{´*õçJ*BîF,·¾TØOOz ¿Juq¯Ó+(Ê‹<¤$úØJƒÿÜzMiuÛû MŠKAˆVɇê”sÃT;Îñ=Ÿ^̼¦–×tM0kޝ¨6sQ„áIðW#üÕYY»q ;-ç –Wn§ -Éh>4yÚ¸‚áh*í½ånæwX5v©-6H5(Zž¨H­Lk‘¬pÊ(‰¾Uä!]樦å½µ¿—çÐä±énNSuÁÞòõ$¹©ôž§iŸ¤êF{îz}ÅßíU.L©ÕVfawʳ:@ b"N/¹˜x€ ½Ñí—ûBÛ·»,)ö›¤ÈlûMYê¿-v÷}á߯þº<³. endstream endobj 916 0 obj << /Length 2366 /Filter /FlateDecode >> stream xÚµXYÜÆ~ß_1oâšlÞOXö ’X ØdÀ\²w†X£&©õæ×竃s‰ÒC‚ìÃvwuu³ºê«k‚Í~l~¼ tüÓÃÝwïL± C¿H³yxÚ„‘ñøØdAˆ1ß<Ô›ÞÑ5ƒ·»83Þçm{¥{•Õ“:™MÎZšEÞ4œ)þv—ƒt? ©ÑK¦ƒuöipzÂŽ£í·&÷¦¦l¯/©¶&ó¶¢ÝgÝ:ØíoÁ vaìÇq*B–µý4—‹âÔžhÌN¢ ”‰-åZa™Gë¶¡·«íÇ Œ{[ ¹éó$üú’¸H¼û^vW[½D¥±dkÞ®É÷}óõ¡éðj'^oñ©ÐeE·Ðøˆ!ó”ÅͽL^šé |òúïÞÁ^—vËb?1 >ÊÛíúØî~x¸ût‚lÂMãf“fÆ“dSuw~ 65ö ­ùæ…9»Mä§j7ïïþ)8¹þ^%~†|—Iô‰u9•"Ü5¨Læ'QºÈ6§fèIŸAîýr°ýò°FU! ¬Ã‰B?€`Wªd™ç`ñÆÙú-–P©†é#趯x•ŠTL?ºlð¹©ÉÈD)õ&56±¿4m+Ä“)˜c߯˱¾^31 å'™1óø¼Uöeû:Ò h%£ɶÈ!uè1q Ÿìʶ}ÝæÆƒÂRˆ÷°\ÄÈ–iÝŒ“kç“Únäb!‚Èëäµme},]ÙÙɺñ-òÅ3vÄöU¸l½·2sådIð f 0­XKµúÁ6û»òrgUö²5‘©/¥KDº“š£ ñØÑÙß3ø;Ñk9=M¿Ñ%hÐÙ/ÅÃ6!aEêsÂXª°C¯·¿ÐíÃÜÖ²dž†`±vÆ ,ݪ•?²ÀÃÅÁop¤'»úìvK„…Û$—ž°Ã< à…\øÑ„Áí©ë ,‡ÔþÌ ÍSï^Ä/™(ÆèJ¤:Ý6 ¼á¦+Â9\ȼ¶y¶ms˜—þÕ߯:rZøQ.’ÓÔç§z¯tÉxKÓS¤Þ-ç®ôØû¾ËFæo³VM8Ÿàs_©ÐX 09&‘dV~¡Õ“ ZˆA†Ž¾3·Sƒd¸̲'Û­á²£\dªÚöc3qôVGŒM€Çs¼a’ôtè„9²l%í|fahý™––²'ïÎwò99]vÃ,¤Q¤P:P `îvk¨DüR›”iÇ+L¼Ÿ8æ½°š?ó÷–Xx‹òåH7hh¦*ͼ4£à´­<Ëš™…iMª9!ª7“Œµ˜˜ eÁAéÁY¥ û[`€F‰ZIö]‚« P+ó@œ¼C5mÌ㼪Ezðç´ ‚ö£P^8UÑL¾…ÉQr:,aSÏ"Û’ z¶”¡åÇõŒãapJzte¯Õ‡Nßúo¿šh Ê‘i `à`Y ,†˜ù•±VËΣŠgŠøâ´æÉQè Ú"Q¬.Ÿë ×o´ÓŒ§–úɆD‡°ÉÁÍŸØRˆ d<Ç ‹›úŽHÐ3Ý/‹Å‘ÓEëizƒO%2˜ó›H’3`°ËvÇèl9}ùˆ·µÖ_S-xѹÀ‹r¤ZG*ð€¢@ ßFg«¡ë(õ\a\>¿ ®ëh"oÛ9•JÕÞ0O_/1 LŽÏÜú)ÃÆ(l˜kQ¦z¡Ý>•„Bí4e$CG‘÷w®š„Þ!ó®é‰ŸÝšLÒ´ûbÌÛ(/µá‡÷ï…";±Ô 9× ´,÷„@bø$ÁéXËYŒÈÕÐÎ]¯·÷W·£F^ ŽËo`â¯7 §ÜŽð;ÏB'>ÊúÀ%aHÅe©ÅˆrÆÁ. ¨Ô„å‡%6ÈÖWŠr§~DKº<^9.ÿŠ¿µìšå~d§2™“ü¡\ÈoÒ'ª%Ŷq\Pd¨ "ìÒšë4b±”0£ª*‡çÕàœm5w§¦×éœ6¬îLË\VMB»-…ÕÙ¿ôQó>j¸³LFÆØ»’ E®¹•‘>ÊX[ÛY½†ã¹JÀâ&‰¬ Âöü?yóüºW‹—Úƒ`õÈ+ÕÙÉΟ‹š~ &÷‹<;wi\©}Ù§¹Ÿåé&Ê"?ÉÒÿ©Q‹4{YÆwE¥ôz^Ã_˜ùY_·iª—C£-³Ôsyî¹¹Ö êÐñ*?fK!jRíd4ÞÆ-=5È¡SvýFqhÒ‹Üþÿ.¸^¤äk¶/…Í=ur+;÷20O£–ßôoÏSŠñÄì¹^b°}|úö5C?Àw;icb´`}j¤"`еôÊ+¼‹,ã¼üsä/§›WH…£+KlÔG.}¤0q{òïméöVhò¹7ðì,̹qXñÁµˆŸÜFüô:âS¥Ft=6µîß$ ä2âÓ}Xy¾o¤VÏ'VäºÌ(#rÑG”"¼VnG!–ÜʃØHín]ψÇÖe“ †‹& IRÃeD%A&’mÖd“RâÒéÎ¥˜Ã²[N‹{5ò«-z}•É—Èæ„ß-¿‘->]ª#·V}:ó ðÂQHÁĈäs¦ðM ¼E…_D‘È7D-ùn‹Òqå¹€6.¸3jÖŸiͯÅò„¤Š‚D×Ò`\¸ìMðŠýÉ=‰orÅxèÛËcLó³§½þí¯Ô^%ž:Êã1}¤5¼< MçÄXk³©C“‘w¸¼f>Îi˜ü;¼Ñ[_$6,g¿ÿf ƒ°A\@§(’ä«qÌ|Çâ«vÝb¥­®œdÉÝ%ÆWùuÄÉêü#š)̩ڠ錴nD ºwß7ÿ–fÃ\4°Üƒj}Y¿·v­^xo«å׫;I‚n¯Ùðçï6{ÙÕc¿òcŒ…›ü¿Wý¨[•Î5å^{Kg§ÙõºÃîÈG?|ÐohBntû•¶Y™tð¬LÚej+Z:¥j'L¾W­þ qÒ1rùIÇ4¿Ô1­ÿE?… ³,$p±ÏÒŠÛ:mû‰0ÎNg"²èRöì´R \ªrF’kÈŽ_˜P¤Í®­…ç?{T$ endstream endobj 923 0 obj << /Length 1610 /Filter /FlateDecode >> stream xÚµWÛŽÛ6}ÏW}‰\¬ñ¢ÛSѦI¢ÙÙ‚"[ \‰¶…È¢CQÙ¸_ßåµN,Ú›©¹œ9CfÉ:É’ßždñÿ—ë'Ï^Š:áœÕy.’ëUÂó’Õ™HÊŒ3®ªäºMާݸXJ•§šþv½î©7Ÿ= o2®zs“Nfh‚ÞÈKƒwíŸÆÃîè³óÞŸšž?0=Su²”«rEÜž=Øô䜕™šýýsQ‰ÔNˆ¤ ÎÓA÷{04Ì!<µÞ àq>šHÀ~ô=ì`ÞÒ¸í Hëi`†…¨ÒTÀ@œÉ»( V«C–pJΡÞô9Hp¹8 Ïî|g˜ P´äü¤PB©ba„>»ÝBQ‚Õ˾ ûj|—1V€+¦Dù¨@‰Z¦+ u[íijWô¿ÇÙÉÑ #ŒáÅ™ˆ´B+HC(£à‚À™Æ®‡îÓÒÂ-’ÈžÖÞlðÔý«?ͯŒ9G#W¦™ãÞ@½&]ÂÁ[(§÷!t剳÷µ¦2VrK-r¥üžRûÕRÒßlÀ\n0AKô±pìä©í´ûB)}w¹ä/3鉢J;LE®ÒÖ&¦‚æ<}ö[E.S¯?kighCׯÒè0Å!ƒ ½ I£±n‰@ÂB0øûǧ´:vë!éO½ŠpÇ l ÷· ÐÔlhö¥>rCÜ;èm<›ÒhâäÐS¦%ã p/N‰ú}z†¼O¹[ý'€2£ï ð"šš>è5– qíè‰Òð¿´}Oæ€×ãØøÒ"²JS^d¡’Ë4x" Œl×;®`GkÄ 0îBЃÇ(@Q3¤܆¤ÁÀ;ô¸¥³¼3ß3$ñzˆÝ Ñ± l,õÏ0ŸÂo$øind~è `/š²¥ytçºÛΚ6*’+ne]T§©ØJ4ô¥å9óöc¸ o'Ox= š/Fä½]ïIë®ë{Z '€N•Î¥AÓ²¯á4_þ=8}NÌgˆbÂõ}ß…;f€£óÖ׌IÔjµ×ˆ:ÃðlâÖÅ’§#·Sï»]ÏYÊ:Ç—¨ð¿óå»À—ÀŠJû)%ÓfÖ!ö{0Y÷!0 ¢a\¥yè}abw][VEúOžàOw¦7z4cܾ¢ÿxåxÈ÷eTÖ81Úñ è™t¿iBP­Ø$H±ph¸r6¹#˜ØÌ`·]s¸˜KLeÉñØQd&ãÛ…TB5De¡ëü4@Ç™»|EÕsÙ Åv"‹Í%ž>Ý‚Á~ \$[bƒöl=™>”e@ 5W“<9½L}/Po76îÇ^aØš]ÐòÙÝÐ[6N©ŽØîŒe”'•›ô£¥«s74ý„ÙBqld¦ ]µ™u×ÖAT‘Gyõv3Ǩù¢Né&râÇsFKg"­æ×ßÌäDy‹Æ'ÓŠ”0„Œîº’'¼d‚cû€ëgž³ŒWP€5«¥¤r åÎEžþÜ,$O? v!Ez‡%7ñµÙB€AàÇs·g0^LTùñÝ^²xŽTÞÛÝö#ÑpQãN„oÛŽ®©°"²,#áF$º%GÍ•§â A:È÷UûÙçñÓᢠ—ú,Hf‹¶Ÿ ý÷XMU–¾5”Ss—¯šÎàó&lHKˆÔç—o¯Â$HÂóóöWÝÐ!‰7™ U­#Aé`ÁÓ`«”%S\$’fdÍLHz¥À%‡÷éÑÚ‹vjôÑ3FL¢Ê±¿—š<~ð^IxUÁ§€¢+΄ˆ½¨¬N”^\?ùÌMAÀ endstream endobj 931 0 obj << /Length 2145 /Filter /FlateDecode >> stream xÚXÉrÛH½û+xš#†åÚ°ÍMíE’mu+Zêžèñô¡D–H„@@ƒÅ–F??¹(‚ÛŠ¹…¬U™/_¾¢œ­grvúF†çO×oÞ~4j¦R¡Ulg×·3%µÈ2;K¥Êf³ëÕìkô«¿õ¯–¾ÿyýi7ýíGÏ”ykœ‹,6³…N„ÎbžùUý9š2ûº°¹ŒNû¹ŠŠjUWŸ/¬‘Ñ•€§’Ñßà!óèÔµËÞ—¡óèL2pg[lïKún]ÛñTW­¸ß-—}ã:ÞÊuÝÝf˯]û™©Lh™ÏÊ kÞ«o»bKóŒÕQéš5l2¼Ýoæ:Ëzí«ÜFÝlÝC±ë,ê·a~q‡Ý¾,6õ|-þ] üþÛñÈs:ý( .¢\=¶‡­KX+±ÑOE]ÖóXFëGž1{ž½¦Žk;Ž‘2ÂÆÃwÀ‡F'Q’'O©´ø’Fÿ–±ÔR8;4•‡oa”H`ï _’_õd¯:XÃÁ1Ü]Ñâ§2@(ãTF¿ž<\|Yü~¾8»|÷èJutÁLÙƒéq.n\ëWòë²!‡)5lç–›÷MÝyÂ8¬±­K¿ìKßÒTûE_5uXöL¼¬)xX¿xÐiÞq²«ç€7WKH‚Kf½°0\øÎÝ­,Úí¤÷“Xh«öÝ”NKÎI¢s‚døÅi_oÜ}¢m˜©Õ“2šx”“¥ XR9ä•<¨?+¿%(iܼoÎùÙgãóLGusì*OòIGŽL"àsPSÃ5M] ÿÅ Š@cLضÑuZG"!#¶…~N5hUÇ9 ƒý7\7@„3¬¨[ž@< &TG%EÛßÀº-‚‚ظ©û5Š ~Wpƒuó ¶ëW¤qI 0˜ûeéë®X =•!„L"òt'+>Õ}3PAèµ"šA|ÝòóÀxƒp ›>|Òf‚ ”•@¶;ø©äõ ¡izO¨<“”5*zT ›â#ÄÇGD¨._µ˜G(Hl}¤ÚŒy€‚lÁÚ5ž$4o›zË­÷?ŸpƒÊÖ«àx¨%‰†ûöÆô< Ôc¸8¦Yá×P=jj·Dn&ãªd,ŒÞ+…NÀÀσСé¯Cç"7vºôU¡Ó±ŠL’=?ðÖCèÔTZë0‡×‘ŒÌ^7£rŒÛ„7òX(“ »º<ûãËù%_®p7ø¾ÓXP6ÃE켂»*©·gæK·¼skOÈ#Ã7ÔGT$¬‰ŒHܤÄ^¤p4}düú{(ßMqÓwtÐ/ƒJ-l“0Ć떚9É ßyﺭçò…cT`=(å6 e—dãá*ú'Ê8×n&5%°]GwkLÁ+ﺎ.ÌÄͰ›<7?¤ç!ŒùdÏ€×÷÷÷F$ ‚ Ÿ‹vSTux;ÃòJË·T\-Ü®—Š{ÎXZ²SðÉg=ȬÅI]lkAÝuǯ}a5¾¨g|QW˜ÏøåŸØÏB6•œ¨|¿á!´J·D®.œ»uµj W.€;¦o}q*âìe›$”xŽó˜¸{˜6:Å_&wldèðã·Ä—´œ p³#ZŽ·¸?K`¡ä$.®)´Ì’Tºm’FŸ±t[þsÇä  êȨ¦§ ¹>„éˆ#ÐG8ï`¨íÂïMÞã‘Ï%ÁUÍP¦°÷g?Ôð½neŠºV†['€¡æ‡>9\4Ò—U(Wýב)4ÕŽÖ' ú¾æ'ýñãR CÐvõB¾S±ÒO±Nö15Í3:Dåú Î«é¿ ¿`á­z„…bnLïDh€ %å˜fÑt:ô]¹%ñy JÈœpgÀ‹pñÞ͘/2¨ö'ÜU¡°Å¡Û +±„¿ÀQPWüwE Îw%úŸy /µ&Z÷µ#[H}a+Rû‚HlÆ…Ÿ“DB³þoy}̳ä)7#±Ï×àƒ NEž…x§ùḣë7ÿM㪠endstream endobj 937 0 obj << /Length 2266 /Filter /FlateDecode >> stream xÚµXKsÛ8¾çWè´EUYâE{sì<7v\±kRS™9Ðl³B‘Z’òÆë?¿ý õ(ëK.$РûëNî'éäÝ«ôàýúæÕoo•ŸH)¼µjrs7‘©ΙIžJ!›Ü,&ß’oRý5ýëæãfáäÛÌø4¹™:•S•'Sk“¢Å柩ÒS“©$œLgÚ«äZLgÖËäºYä>YµÍmq[Ve×—sõ‚]_ô,—IQÌ¥É Ú°¤ ËŽ'55¿û‡0./ª§®ìð”eDš©ÉLaLÆWhîð0yr~yŠ,é¿סž‡NàšßÞÚ5XaA )¯þ4µið1ï×-uà$FZ:‰‘&¹(à,K8ú|(k~ÓqƧò.°èz^ÂÎÃWhs-w7WF é³qs™ó¤Ci¸œçœÐÅg:“BÁ¼½«ÛüÙepi•ml*½Ëà-žEg£Ö”™ö£áuÔðŸXÌk•%óg“à+KÞÝ|*4Égô©KNkžT.ÁöSå0•°`é}¨C‹ÆÆN±,ëfVÌËa° «ª˜‡e¨qIÔ ü¶üµ&èsǘMŦ\W€Ø™†æë²©”Ý?±€á7MµîK0sÄP2—ÂdùøaeÊníDv:ÍŸ¥V)vs2 (T¥©‹ZD6Óƒi6>i¢¦ùú_ UQãVR’ytš¡yðõ®©ËÍà%Ú.• úDš'÷¸t0öÃrU¶åœ»Y²l¦38í" }ò)˜&íâ…, J›µ©“ö_„¶Ü wm³äÖÅëª/Wž …ŠvÂmý»b ]$èŽ(Xw0$á"Ô+†O?Ê%‚n½œUåwÚ¯*ø6Ãè°éþ9‹ìWÌqþCWÖÿëa%ÝKa•yùœy¿ J‚:¢ Ê´ðÒ‚ÊFAu^ úžš?S©a3~y!¨‘%×°+ ÿÁGÑöÿ¦}¨` øúÜÎ×}ÏÑ¿¬SÞ…öb*7[T¡ÎŠö‰Gy×¢¾G±†HQÒíð4Ö'P¬"3.ÆKPa!PyÑ‘)¡¡9˜àt ±°¯Š7|p«’+ʃàÀ5„r'šFÀ á¾]orLÔîÞ —ç/ üƒÎð:Æ$¯—ÉDƒò}†££ÜÒ5/ 4 ª¶b! =+,ØûQô%t¡ÀD<Øš>úvêà®ëzQ ahA(,º‡²¾ïXQŸÄ¼ë\0hÏÄ Vúܽ<1eQ ~¤ýB‡Ÿ„¸v.†Æ–©ã8s͉Q@C ävÄ,lÆÐÁþÏ)‹J=àqÃΚåj݈DÈÅNW«ª$ÀÑ¡:–Ò‡á…`4~cÏP€…n—±¿"jÎN_ø|½õƒ(¦$Õ牱Läê0ˆc?+§¶ALBDƒäƒ†´Jd™=ÄFÅÆû€©ãÿèïZçœ!5E(|Á´Ã9Á´O‘œð.ôð=Ðø}[Pݽ»¦åÆ’õü¸)†}õ0 dàîLðqäޏà&í¬ì.Ñ`Á1¶×Њ²Nû±ò~Ý6'ܽˆ\ƒŠßxKèa2…¢1«ÎÆé{÷â”ÖÍiZ ç}$„`fÚÆ€ššÉ %«bõÐEáe½È¶aéýÈ$Ê¡V\ 8Ù‡šÝ(ðFS_!d"ŠRÒkaíÁÕv °Ã7”›¾?¡AšMŽñÿ¿øÙÀ×ÇÉP XX.Ëù çn&BЀ Ùͣ좬ÌTCs8$ex!ïÐíw‡!Ý´ý—7¿ÿç`<·àÈCMŒ<Ç {ŒÔŒ~°NîàèäÐ.ë»Ðb>@|Çï6ôX¢AM_¶ëëÌ[aM‹DÌ¡»ômQwó¶\õà±4¿q û@Éõ ­gÓ@l̆O}lÖ-ÑÌ6t6xG8öÏ™tf„ÜÒdk_3ûœë="­â,:/s H¥/‹{@(ظB†2v¾Ž `Ò ôâëÀF0F‚c1ÒSô˜YŸ'WÀE{JQŽBÿ}ö`‘ÙQf2Ø æ`ˆÈ)5ø…Ì¡è†RDd œAõ¥HìqŠ„Ö*A¡ب 3çàq,†¥·|’´X“ÀçšÞ• w~yE—7¦ú kSB ÿÂ:MüÛí Ԗ¦Q„ùL@ =D˜Œ"ì_ ¤AøÅèŸQ@‘oàÅÅ?3rÇú_gÒë`4à,0;ÝM¬¯'~ #ôO çL©¹|â1àÃÃàO~ÈÄׯû-£^ü[ÆëgyP?cµµKê„ÏëgÿQz±F£T*¨zoPï9Uøú*¥–‹Ç$ÇBu{±©…a˜'I€šì[ÐÚýAÅKœ<ÈÂÛªq„?׎ʊLÚÈÿRP4s*FwÙµJLûÚ ¹eõùKyžÉç<Ïö”Ÿùy!3+¼<¬ UügåþI&ûä8™®¤ó=jåŽR+ IÒê-Iªü¶œã¢Ì‰²Væ!.ÊG°’LÖ¤;-Ë~‡Ú?4õ¢-yÌíBèQ-+ÚÀz–çÂ*wì›ê‘ÁL†kI¹$&“¼°†™°íP«4íœ<î¦*yj#AÓ Éÿî¶yòf:“ÉãæàlüÌ^’9漜’ã–&qLMóg­þV6Æþ(H•‰ÔaÕè…sƒëºtoÒ››WÿP9« endstream endobj 835 0 obj << /Type /ObjStm /N 100 /First 887 /Length 2153 /Filter /FlateDecode >> stream xÚµY[oÇ~篘Gë¡sŸ93…T–êÄ@Û¶ƒ¤ô°"Wò6Ô®J.çß÷;KJæ’¢¼¼°s9sæÜ/Ãä´Ð"9ÆG‘¼Ö'|pðµÂ{‡¯Áò¾Ñx|ƒˆ_—EŠ|Þ‹¬Ã(¹(rÀ8Œf„˜ƒ™õ<È/Œu|î´ È_®y… :t$˜€£6X rÙ…‰À‘ºAix([¬&€]g`ÆÄZ&-—ë€ ãâ6âhŠQXÊydA¾e¾,VmJÌðd掼p:V8Ã[…sxÈa@%á<‹ Ç4'" @sJ8ùTʈ•e”ðäÈ[IxM¼„7[`Ƀz ´ð‚NÙC ™ pp4JÀåЧ…ï®Ûž¯° Õó¤z¾0å,pŠÑ@˜qWÖFÝÝ0ˆ¼E€ÄGY[(jÊÐGðÎbàEÝ©$ðÕd X´`9$Í+ÀÃ6‘ ’ÏÆ‰Øa6‹Éq‹h=¯$ € CŠÎØZ=›ŽÉ"h&[-"ÌlÓa†ò"‹„9‰Ùñ 0ç¤GÙ&AÚ2=< †1‚ hɰn² NÈÁʳs@t’2ȃA ïxÍÈC†6 Z ê¦ÈR§,ˆÀ©‡ˆÀœ‡¬)Y^Á]l;bž2«\³ Øî¶£óó‘z×Ô­8?êà˜Õâ&0gØÈÓèÜÓȇe¬&‘ežv £Ÿ&°è|… ÀЖ“ï¾©ŸfÍøcÙŠk¡~ºz'Ô§òK+nFØbŠ>ýùXb£¸/GêÔ•u;‡o'>>RÊy³˜K^ŠË¥–“ªxÛ|×|9Œ^²Ù!zÈ”op[1 °Nøê–ËYY´US_m)Þ\ýÕj“t´ž¼9Öf²sïSÕN±óA|?+?Wã¹øqÑ>.Ú³Ž·Éb\Îx×I/ýÙꮆ—ÎúL²ðGêãâ¶í¦¼hFê_Åïaô¶˜—‚ÔoÅãÝUUßßí|vÇåô²­ÆÅHý½7 ëbèšT t/¢üËÛf:yïµzyÉG&XíTv³v×Ó‰%Öçóê—ª¾¨çÕ×í«ê&Yõ×<ꡪs‘£úï¢iËiy×"€{5i ›ù¼R÷³âRãE[ªq5/î¦åÕVÓI©Šñ¬©Õí¬ Žã1ŒDM*\1¯æJÖM;)ïÔ w«1 l:-ž?/êûb¶x˜‹V5÷M]þ®Æã›?ãòÙ’¯Ä5ç´Î~ý÷oHF0I8)-3}½˜Nw’„€jm”DÀ;¼vÍéØÏ~ýñö?åx øþAØçƒ>où §½|0˜ukc–}ÚC>}`Û#H®;K’ÓÑa®Å©ÍxØ ë±­×Âæ¡BÛ.Ä#…ö1Â>ðRndœ4Hƃ€‘V%çÏaÀ1 p‡Fz¢îi„–Eß éjM#‡*!†-%DwˆÔE Á‹+D&‰ Äåׯ¾ËüÉÕáò»„Û °Ã³”ÿQÕ¿#f6³I9ë(Ñ7êõ^]bD7L;\ÿÚx'l*&+ e‡¸h‰%(à.:IêûæS# ¨7ãª-eÙ~.gÕä¾´Z§3–äiè‰F.Çžè!/“‰ß¦ç¶˜µMTìNGŒ3Zrõp¹F—ᬗ…nÔYæN;ˆ¹+§ó²ž·eU›Lá„…(Gµñh®ØµÔ(åàO2»›¢iùPþ UåÓÑâ=hH\äà]´!¨údp曤} )¦›<“¢£Ìܪ™,¹XG¹Œäè„qîG/Ò2ÇIx²g¼†¢ß#öWYÄ™ 6ÈO¬Ñ=ó·z‡>ÓSx)Ë 3ðî9Ú¡! útù‡¶CúèÈÖ7ôҒߌÏR£ó†¤Ã¥&Z™éå2_ÜòßÊ$àö0éM» ¡vñížé`áoWXtl…Eio¶zuP¯ôé%Ú5îe8¹-†“9’ádÔã0îû.¹î…¨FùÑâ(¹Ð¶\Â^rIyK.qo¹ìîï_‘Øñn·­"›C¸_‹AY¿ƒv%Có5èø$ùÙÊR’äøA™(Äk+#ñÕ«8Ö…1uq~ÞÝ .ºˆ£>ªŸ?¼çÿ7÷‹ªž4õߦÕìáAÞÍÎúA(Û=’SxUPs„2¹öoÞ|¾ùêktÛžó±öœã>¢Š{t5/GdÍ0àਫOs>‹™†rÒobÒ/ízÄ;P£Yoi”`òQ~÷e’øÙwùõ§l…PMIZÆG-É⛲4üR$Ò+íc3/&E>i$?ÿúÑ$þ A“:ʬ »))n‹ù¸˜êSv:¡¤ŽükŒ¼³Vò;¶#nw“r_LÛªœi¿QFñ+þ`·Ü^yš&ôn°M$5D8(±ï|Ä9þ:›¸åÆéƲnF§*¹œ4èã¬å§—?°¨›¹çŒ¯6Q´©eöÐrx¥8ît7óÔN`‹öwß"üµJnã¥ô…Û­"…ñ9RáK’ø—§ÿƒâYS|H^Ú}d’ÄÕé«{òó|}îîµm„®Ín¢Ý£`Ú^…›UE78ZG—‡s‚ñ/> stream xÚXÛ’£F}Ÿ¯ÐÓаuƒª~k{.½;m‡§7v×c? ¨Vc#Ðr™¹Þ™•%$4°­ØYYEQyòäIE‹í"Z|x]\¿x³~ÏÍ‚±Ð(Å ñPk¹H"2©ùâsð™Ëß–¿=Ü ŸWÒDÁ‡% Ò6ëmùÝr%~ —0 ‚ï‹úþîl2ÒŠ®ÅnßÔKž_ðÇÂÔܳlÓuE†ú‘ftO–nîïüRå¶nŠîiG›´µ9ÝÂTØß‚Ë0ŠùbÅd(eL›Oу-¼¿të‰`/¯—+xmnK¦w‚›ýoo«ÌÒSžviˆ+¯ß«ñ1%*TÆÀa¸w|¬aiY_¦ LAY£m{@ƒ„sÈiäÝ—ºì»‚¶¼~/Øxa2ÍŽ 3INAðyÃË¿sŸK³ƒßèãc­^b£àÅ<~TÄŒIàÊÂqµ­;J_ øõ:ÆÌÊ×¾¨òºròòò\1¼_jzG¢ª=˜Uð;ä>ÈOWøÑ\Ó5=iÚ&ݵ[{õ ^ê7'knÛ¬)ö>Í•“¡såÀ©aÎÅ$Àìp×s¢A‹„ !Ë;€ÀSZlÀµ,* [ng˜ß8B`~®ÔÌOÓÇr”_Ëüœ¿9*üâUÒ?V}M†û#Cž­‹·Œ‘õÝ ˆÇg<È2QÔMîX¤ˆ ¦ŸÍåÁ¿`4Q:¸÷ïb¼‘3nhÆgد­ÚbSÚÙ "]»®D8-ç;ÜÓM{^pá¹¨È ‚;5èÛdOÖkP¯DÁlÁ‡4–ñUá’,P&z‰9;–†z˜Ë½²÷‚È&ƒøã5ð Õ˜a"¸&¤H‡\Ÿ“3SH;Óìl¢PÄñÝfYÝWˆ ªöLÔr1;ð‡6Ŷ2ÐyÔ…®X"C¥åE ÜŠꯄEC§Ù ed®«è³ù¸jRjÐÐÇ Y;IœÇ£M8ùÐuûöf½~~~7EÝ|…÷_ºٮaÎÁÒemÓ¦<¬Sz™5øEj ´ Eo”šæú¨òɨþ 7­¶˜[" ~ÜŠ5f,(k¼½¿%ÇÖ®fó”B…Ìòý¹èžèp¼)ÒKbMUÛ»¹Ì²¸2}ƒÅ$>6i§æÎÎi]ÆU³!ûîê4|éÓÎ6îê8äûå?¯J2ÎÂÈ L ̵Ä-¢ø´á õrF²3¥ÃÈê#â5Œ@þ8Œèûÿ1 ìì›.¼Å¦ K J(“Ñ–C)õ‚}»aò-¹·$û]9/'\ÐîDú$3Kƒ†Us:ÉË?äñO'ùÊŸN«ãÊ£ý³ëÛ´X¿¨DŒb!××Wlù*-@¢ý=`Aæ&¸wý;ªÖ²µ®,CZýŒeYòàe½ -:·‡Š¸í°«±!B)PX†FãNÃÍ…õB_AÛçsoû*Çdç°hcÓ²hI/ÁÈ(¼is ëîØ·•3" * ”ý™sÐ!ÖO¹(>×ôa ô3æôßcru&ø‹£&,šˆ=lL³õtBœÐläóîáÍ_>û¯v endstream endobj 947 0 obj << /Length 2044 /Filter /FlateDecode >> stream xÚ¥XË’Û¶Ýû+TwႪ"†xdvÏØ.Çãë›™Mbg!1Ê©âÃΔ~>ÝH %*Vån ñ „sútñb½ˆo_ÄGåÕý‹Ÿß°lAi”IÉ÷ ³(MÅBÅ4¢"]Ü‹Ïä3—.ÿ¼?N\|^‰,&¿/SFtµþi¹âŒ’?"(iF^b3&­)[S…Îß S0N^×ËS¤¨«UÛ?´íúnI‰­+?kúa®7<Ö_¶0É;[­}s[—&_á¶LDqÂ+*"!¿ç¾Ô0O$1Ñ…Þuºs_píΗ¶*ì7[ôºôíÖv¦ CÊ?ã¬;·“Û/1¹7–¶2zmÚ?ÿó99BÛH2 å6r û\ʘänG¸ÝÕ0b²á+[—5\?Á„RW…¯Ü|«ËÞíß}Ó `TE"SÃ×hæ¡Ê#1nÈ’,N÷UØPäK,c1ƒ*¦h¯¨”Qg‹œ´€2°"™eÅ[X¦‡Ã­zû¿‹\8°mìº}¯¢P¹~Zâ17¡ù«£‹D. Øì»Þ”°,ÀC‰J…ƒ2Xÿ潇yŠepêЙ"ap©ncNÙ"ýAìW'Ps¥È·¥”D76Mõ#– iM‰„ôæ„ìt×™¦jý @!ìøg¶Ä|ÂÀ]SwƧ•’˜o.ꇃr&‡ó9´~‚iðò‹Š¢·°uìÁVn _k̮Թنôcacs'00¤0!À}7‡6—×A‰÷ª°îÎÝ€x%éé}yˆÆ¡{ævÿÿÈ?HO*Q;»<…ËݳŒ'Ç`þæ Â!ÌEn1O—¤Ap,ëã3eî^Ä3áØŧ-ínç$Æ]†(uÚ’pE^ù!C$O‡HÎ39Ä?ä ûvÈ«÷¦nÛ•Cíu6n¹Nlç/I.QÀr¸PùT¯<°}Â#4…}`Úyj°TF\Êsš’$þA:ÂàÉnÿ5 f+:†F/M ’I¸U=©Ì^ª)Hcò˜òÇO*L)/,œ’Wy^÷þHƒï4YÂ!¢—ö¡nYÐÓƒv7¶á²„4¬^Äâþ¤q~ŽOlã³Õ mó‚Ä œ¸TŽû ‘/ð‹º(Ÿ|Ûúm6:ïôCiþã­@hlçѧY$Ç™Œàο—Ýàû'dN¶Xw–.+g©ò \¬®ûØ…¾¢Ñïv|ÆJÛ5}ŽþpÒ„´õÖø8¯ $wnNìÑ8>޹7µsà™Ý$¸Ì"•¤Ç0|¥+o¼§½6Ug‚T2Dóo˜É® ¹¾8ŒƒS!&™œdRÎ瘤‘JLGœÒð)6tsÿâoòP¼j endstream endobj 952 0 obj << /Length 1980 /Filter /FlateDecode >> stream xÚ•XÉrÛÆÝû+¸JÀªé d'ÇRÇt©l•_Õ³³€È–„èa­èçs‡%ÐÍÄoÞnèsï¹§)× ±øí…8(_^¼øùL )ÓÂZµ¸¸ZH¡Ò<7 'd*M¾¸Ø.>%ŸŒûsùçÅ›ýÄŧ•)DòÒ/eÒù~X*—â%~J/M¦I×ÅHÃ*hl²"9á9ÿ³ž®•ÛWmÇþ±ië1@]„&Ø”ßz„åo /ñ®^·‡wÜ¥1À¤©fºÆÓÚãÒT†áM;v ­ŒÝW\ð.ñ·¼¬êjxà-´œmáDšgzÚBÚšÒ=÷FSŠšZªÔäòÍâßÑЄû.tòšP"ùÃ×µ¿aœ ù†Æ ‚Ša+L° †WX§'Ü$DqÊsD±Mˆ¢Gôêh8 ÜÀ–[®w~ÓÖ€Ã_S, ÇŽcÄH_ÈO¸c[í|Óƒ]ÿ ¸øÀÿÆ2ÄøÕCÕ\³ÕÝ 1Y ›´×¾½îÊг„à:‰˜Ÿôô~òËÚV§Úe™‰‚­a±b²ù‰ýU?*îM7¹2êýy>…ôÄàVDà#^AM5 MerTQ+°ûÏ@-oñBÚú.èŸl ¶u&¹¸ñVíÀFw;ÈÆ÷€Òqn£\ ÀY9’W—eï·<ÑÝÝÈ‚z(¨Ü Ûc»æ}ÚÛmK~Ì:É,¬HN…%uf'Ke“Àc’ü;°z°›¾þñw8]5ŒÅkßtUàŒ‚€£Ã%ù.î'25*ŸA~ž‚ÐϼÄDißÚ¼ìÀEä¿ó„šX*3ÖWLäZIb}("¬ŸÖƾr½ç„š£fÀÓ1èA,Ä9$¡f¸køèôV¤î4‡^E¡?CÚó5„D?ø 5&~ ônŒHîJÇ {¤ìÚnÄÛÉÀúvz·Õg!³ÍX† ÎøR 7<ø”#z\õí^‡Á%\2SS} ˆ•ÍÆÇ;¬rvÀ;@‡n8ß•ÃØ1ä°V41¾‹=Ÿk[<ê,çýY8C@™,•Zdi«£¼EŽÝù¤^J³ErŽõ44ޗ̪å8„ž“ièU7îvm³Ý÷ci >-2 Sh~7m7eG†À_ë`H@ÎÐÅ"ÛöUÙÕXSö|–:Yo“WJÓl{¾j"|õ¡•žÙ °ó·^Ÿ_ÛÝÝD¢/«¶ŽÊ+xÄØltT]e©Sö œ×ÙQ$¼2ŠÜ|£µËyQW„DL:,(òÕ4í(óF|À¨Tº§B¾ÛœrNëçì*»Ø³‡›ÆcÉ<Öñ:¹žY^¼øi0 endstream endobj 1035 0 obj << /Length 1672 /Filter /FlateDecode >> stream xÚÅZKsÛ6¾ûWðhu*„xǤ“d’ét¦‰nN0 ÛløPHʵÿ}—+" ’Ȥ[–‰o±|»‹eÜaðþ*ý~³ºzõŽâKD0gÁê.À!AJ±@(Š0%Á*n®?ä±}Z|]}Ü®„e2ÀiÎI³, –„"©Y·àKHXóü«wDï>&¤nú½G ” lóáÓû«àfI‰¸Æx Ñ·@^c9\°ì¤-1CŒ‰NæooÞ¾þ¼òH¦tÔ(¡î0LÙª.MºhŸ.mTäð÷&ª“"÷@í†Vô)»û»ÛÕðÍÛKôÛE¸MrS>wÊE 0ìƒ)MTÛ²ò)çÙYRüõÑçtæ†àýÖKØOÑý¬'¬}AÁ‡€X#MøpckÐ/MmêÙ›<3É(€—.Ù·›{Ÿ¿F̯Š\¯­Ä¬³LìU…ã£žŠŠ,3y¼L“ÜvqP¬›à®º3 gyçL»´Z.»3a’¼n%½]]}¿Âý>°–ˆJ0.Ñ:ˆ²«›¯aÃ??!¢Zÿ¶fEB7ËÒàóÕß_ ¥“£P wÂï’ÔºÈÌ&Àl§±Ï¾óAR‰Ù eŒÃ@L!ÌyÀˆOËIÂ#Åd‹E^¢¦4µuˆ•aMç«Â6 ÄõŒ<5/ˆQ& ^*‚„"{fNׯ%›Qˆvªlu\v6–½M®”(‘䲨ܓ߃ 8s¹¼-z®œ,ĦÇåïpA¼.*§ñ5âTáÚcüìÙx?âIH'4 œ#,ÕD&jª(X iÙ× ©Í«é\W‡…˜Ž5Míâ"Æu@Yå™vÈžj¡8¥Üúy=}½qÆ‘fz¬ð]ií… d%gQ B€Úr©ÓÇ ,f"Iñø`'étK{÷`#K'ùzS×½¹§1о„QZùÓÙœ_ÂæÿTE~8ʈPˆ‡tŽ(k hØwT@a‘e>"DÙVáÔšGç¹H`àPà»OVsqW6bÎu’?N­ÎýCëÒ}ßÑgJ ÅT#Sb™òEr•8Ûy <ËÔ¨_fM¿ä±B `JÞs”/TÎóªðlgŸ¬ùÙØmÙ3ïú÷ÀÝ÷E ¾úÅ;«̺ÛQ7â^ˆéÒd`ÙògoÅ9°ÿúÓŸ.ÙoCçCôœ÷¾åÑtwÞ>Ù\Ãû,¡Ú8iÝM­Y4ØØ;ö½Þ@N}aTs›ölzUß‹$sÑ®ÅÓ{öäA`ÇÃ0M¾µFI“‡bç”øàÉnZÒÖª“Ú½ýtÉgíðRÊ’§zSÚs=®û¥¨ØÙÚ7WFÝm(ÑH½ ÑÔð½( ÿD·‚Ó endstream endobj 939 0 obj << /Type /ObjStm /N 100 /First 877 /Length 2075 /Filter /FlateDecode >> stream xÚÅZMÇ ½Ï¯¨cr©)’Å" ü%À°tH²ÐA‘c×XI€óïóØ[½vV³£ÞxйlU×°_³ÉGY½Ý¥´Ò½—®´D^B’—VÈóÚ 3$ðÇHEH0rÍkÌ›z@¦çµ.k +Ñ© rŒRŒ[Qæb¿±§¼öâŠküîE•Rö Ê% ƒšjÂe@ jfetL0¢D#Ÿ&ÜÐ&š+ù’ÅíËÑ×Ã0©´2FNL1‘Bƒs8cäŠ2h78õ¬yš£ƒ©ÈñÇžî°ŠÁp„×=8T¡ð|–n {BC¦60X¡\@™#WFaé¹b˜ÀÜ3sØc&æ7_+@ÅïAéø!+Cs… [Küd}1æXr8+-«QdÀí1Z'=^C¢Ãd0Go©=ÌÑ9¡aŽ.°dÀz`2JxbàU»uX<)áÖ1ïZtU’8t…—!l ÷6ȘÀ¿I Ü w̯ހc£hr&ÒÃ-ßσS E"I8¤èìà”¦í,0Á#ðJáx€Ì#ീWŒòÝAhƒ©6^/¦éä"pÒí`·¸ ·7ø(Àe'O™^\8`8<ƨàr’; “{2LöTZ¾‘^¼8¿)W!1÷]9þõoǯ\I…·ÊÍÇ|søâ‹³Â`i0ë6aUaMÂj½6Ý*ܬ‚Лda­ [n“¥QáämÂÒ£vxq“0ǨÛ„{¯7¾·QIh“0 ¯üÈÈ/oo>”/Êñ%+îïz e»¬˜0h•¸ëøíÝí»W×ÊU9~ûÍËr|}ýó‡òøúß?]ㇷÿ¼>¿øõ͇÷ÈKœ·Žß]¿¿ýx÷îúý’1—¥¿\ÿÃÛ¯n.W¹ ¡•’Þ©z¼ÁÓÞÞY½/â¿zÅN¿~Eºç³¶šÙã{ü·ðgÈJ8Éϧø|JXápݨöŸÊeÁ¸[eeÔ!±MX\ªl–VÛVa8³Úfa–Ú· “µJ…÷â³}Êgý­|Ïáós’yÏáó)a‚[…U­ŽÍÂäÕ…¶ #;WÝ,Œ h`Oß$,nÕy£éD°©`«Þ$ÌN•7 ³ÕØ*LØ4Çcáø¯Ÿæsý­ù\Ÿ“Ïõ9ù\Ÿ“ÏO ³Ö~Šx§„Õyi«ðSü?%ü$ÿO ?Å¥gðÿ¤ðSü?%Ì À¾QXGuêÿJƒ8ú˜ÓX“ÿ…ÔÇ/onnyµô?©TVË8ÚiŽñ|âùÄó‰çÏ'žO¼˜x1ñbâÅÄ‹‰/&^L¼˜xÓ¹KW3'´NxÈ:éëD×ÉX'¶N|¬È´"ÓŠL+2­È´"ÓŠL+2­È´"ÓŠÌ+2¯È¼"óŠÌ+2¯È¼"óŠÌ+2ß#?bôºÃñÕÇ|X®ÿüÃÍ¿ǯn﾿¾[xÛÞÿxüÓñë+Z.’êï$DZ³çEðå[ w­=[_´ Mb_.á÷ªÿpûú¶ z÷‚§ý>£í2: §€û:t¯yŠòyì‚: YôlìÖŠ€Ê~IÓ.XÖþ´"—Ó…°ÓdÅe•¸+6Áð?­Ç æ69¦ÁÕ4GŒœÇ#È{žVbÈ%•h5Ï«Ô@…<S©Ywh´j¡û¸ƒÂjêêÈÕL¨æ: tÿç¼qQCd™•ˆËŒ ð17tP&gb£_26 C Ns³!9©C‡}⌠zAÆXú åVó-ëß{•Pöõ3ñyÉaQö®}3ö¶ÏêÀ—Ì•Ù%`ûÓ†d‰DM‚üŽ4kÉg’帤3À‡.¥£½É3ArÎÔPz ¬>C¥ËæJGZêŠôd±äJå<(FÂn´32#ŒŽZ”‘!P!R«ÀN‰v.4.é DcËÏ!„p‚S'l&ã\†ðK¦ÊÚÂ2#DºÒ¾”àüžµ|(½§2UÓ}bcOVd*ô©k|2jm=WR]4]No >:óo û"’ö.ÔóùퟱY å'­Úà (©Æ°(v %ŽÀ,K°!Q1íÓ4›®;`4ûäˆåý Älº *°¦r"{EFCƒÚ;Uþ÷BGa’’ižî´saëöüì„—³ö@G¾Ùžû^ ÏT"ÏF$~Q¢TX;íkd˜€nç!6H§úØÇN·üÇEñ¢(l¡ ºŽÏ]R 1ôáùïÙÃâ¨nò¸(7÷}2¶ Œò<ÈPK¢¢ð<€%¥·}RUoÈxqblYh3°æaç`dª¶Sº\ ¡áð†übÊc#Ý‹†tÿI$YL¢Í Šh]>øÙæï¢ÞÀ&Þó<¹ xžæ¢Wtær¶ù{HUÿÒ4G endstream endobj 1092 0 obj << /Length 908 /Filter /FlateDecode >> stream xÚµW]oÚ0}çWä1‘F;ßl¥]§!Ê´NÝÜà‚µ|0Çtåßω 4ØÚûøøúœ{¯cn8ÆuÏ‘ÏÏÓÞÅŒ ìØ÷¡1}6€í(òŒÐ6ð"c:3Í»ñpøÉú=ýÆg:0h5½z™\÷ŒÇ¾ Æò»@æ?}àÙžln4asþ£©š¨œX|ЗfÕÀQ¢dÈ*ed™b«ž0C ‰·³RÃø6Å£M§?ǹä„r”®KRjÀ]ørpGòÿ#IµÀú\Ð 1á@Ix4|ø~¯ƒ€jˆ‘N9 Vî«X2’‘1RäÕ@Äv ýæ*åê©d„­êA5êQ”a†iÙ}ù]dV,­>j‘óµA®÷áúº»{W@ƒ»[x_ýñ˜ð ñåxv–ô´îv#%‘ñן·7ãc¢ »F@­Æñ¢rÈ:-®q¡K-á1H“áƒ':gJ2¬ò÷¼Úð/Д’'Z{E‡¦Þ^’¢™–zg)É1šcΗÉôÛ<¾¤+Ò­Í‹g« É-™/–”WAeZëwUˆ”©Š¢|Vd‚XÍ`Ugü§š5¦ç%¢]pF1öÐ&ƒWMúáÊUóÁ)zÝä‘$-êMn Phþr|'³€Y}‰ÌNù@×E¨»‚ÉÄNlþØY@¬{zp &ÒXëˆ7¦)FBô•ºf{™½È 50A©N©¾Ê®þ ˆš´}?žœgž’Õ9ѵ 1'ÚÔÔ.¸ŸïtÅÓUS{Óºl5]ÊH^Èž™¶“ ”Ê¿ º…aÿi€0¶]~ÛQà ØiUá)J4©/4uˆXyÁ^ÄfëÚöÞm•î\•˜ž“wwKă6ëºêÈdå[VŠ©rqÅ/»—ÀÁð® O)Îçl!'5oŽ‘kGaÈ—õ¿Èd±Í¥‰5´=¯A{ŸR_Â78qVFl¥ã»6Ñét\5 ßpAF^ÙŠŸpг6F!°ýÐ=Q f$áÛöCœÎ=´ û¡-ë,mãâzvÀÓ¹8j.~¯'b˜—JJÜ*¢0´Cn„“)AÍ‘ øf:'L´¼­¢Žmøqèû·Wqqý‡Öа·ë­¨Ù2 §½ÿ–¹F8 endstream endobj 1038 0 obj << /Type /ObjStm /N 100 /First 1016 /Length 3310 /Filter /FlateDecode >> stream xÚí[M·½ï¯à1¹pH«H‚@I€l’,tpìE`ÄÐ’ 8ÿ>ïUwGÕ;‰ˆ¾Ä†Ååô°‹Åb}¼*rrJ9¤S*!‹°#¡Xe§ Z;Ì ;-´áƒ{ÅØá÷Ê&ƒZå½ ’Eù /U希·´û8ÌÑJfCºrÊŒ!£sÎÜBÉ…ŒåJQN–G(ÒI_Ís€@1%•RBiܬ`|*XBª¤6$wÒ»"d#•¤VòWzmNyi‰oÆué˜C0®wÒƒ€d¸(F•áY Õ\‚gM;{%Ô>8›Œ Û¸š‚f—Aͧˠ– µPVU‚â?>«A­“ XÓîªt¸ °K.ƒÚƒ•ìTF0Q®\S°ÚI"1Ë\¾°¦ s€“ „Ý\Ø S¶\}ó,´âòSìnÍN¥‡¦.?lm³Æq–BëÜÐdZàòƒRôÔ(+“–É3t¨C¼ìiè {º¹t­…Þ*%d=ôÞÈ•0¨c9µFŽk Ö8®•0jÌÁ†«a˜‘+=q^lã®ÉÍ•×8që®?l}"$éúP]£{öEr¬Ë ÃL.¬î[êû?FöÐðì›ÊÈÅw•j›Å7ŽMVß9ns6WnLn®ÝTÜIN™Gʘm€LçvW°Zv;».Ò1¼K’)±K¦2W]”LfqÅ»Bã£Nc‰èv’ÄaˆbéæÙ³›ÓËÿtNŸ¿~}ÿîæôÍÏÿxçŸÿüÃëÝœ¾¸óýÝ›Ûß^þxúÓéËÛìnN_ß}÷.ÜJ˱tªm}ÐXjZ‹PtŒû<<{Nß„Óî_Þ‡ÓWáw?}ûÏ»˜ÛïÃgŸÝàÿOg¢¦…F”"±æé%TK¬­ì°Ð×± Úã€Ri±è>³•hÐ7•ál>ÎDÉ ™€ÞNsŽ [lJGÔ"QûŽ l=u´Kxä!˜¥î012a=Âà~± p2Ò»žʺ³+å <]+N@ r€7¬JÚä ­„5fø¡ªœ#"y„›SábޱN2Q§jøK8ÍA8©µDć3!e¥‹(鑉š[d”yš‰¥NÛ,P“n¶'ÙàÈÌŽVV]¬Ø iæféQÚào>ÈG´‡ÛD†Z"h ‰ˆ¿ÒêZ¹@›T¤”8R]1€D4ZÞs–+µR*&»`¢öHTú4}-¢0D -~KÉðå IÀC¹^N&à¡\/Ÿdb¥$2˜Pæ 0ÔŠ`Þœ%Yl¥¥ðHù‚‰ Eð{š‰•žªZ¬˜¼ÀR‘AlQ’¬ä6A:@5PmdÊ8”‰Dê¹ã$LV:ìô€Á6ÕA]cþIe; ˼!Ù)PÆ*LL[,Hˆ#Ä´‡êJY6$vduHêà¨ÄÆB/J¡;ÊG$ˆ¿<2Q3$R®ab¥e0N «êÙŒYªP HAJ߉Ÿu¥Ÿ*@PÌ‘t4zˆ;K/ÈÅdì(DZ©-"•Dè¨h83N„äÏ¡©… ,1ê# pŸ–wðµ¼—p}n‘$Wþ:œþú·¿³@YæiÀïxýõÏ?þøjgtÙFÑ!«~oðóû×çEt÷·žïxmXhòÒ?0Ò •æ8½xsÿÝ7wXh8½øêy8½¼ûå]xõ¾ì^`E7§/1ÓÝëwoYpÊÑÛûŸß|w÷v«3ø³¿Ü}ÿ÷_Üÿ\ªÊdà«S{¸e/¾}"_·ñ¾1o1¿—·È–W·Î2;ãÜ©sLcêSevêìèìØì´Ùé³3)뤬“²NÊ:)뤬“²NÊ:)뤬“²MÊ6)Û¤l“²MÊ6)Û¤l“²MÊ6)·I¹MÊmRn“r›”Û¤Ü&å6)·I¹MÊ}Rî“rŸ”û¤Ü'å>)÷I¹OÊ}RîåWkÌ2Ã#23‹ÕÅBˉÐvÇ;-Œ™Y! †°%,ê!V².hÐùn;jaÚ›k…)<ÀYory‚‡•¡\YñhÁ¬Ç!êL ¨‚õŒÐ¹2ma¬`lT¸ˆ¬P¶’&á HÞf'n/L| âK©L7Uâ)&ÊB(ÈfX?7J:ł̺T†ÛŽDA—Á3WVëX®«‘‰°  ­zPqª@ýxAå +HA®abåvŒM»—ky®PR‚ô—MEä(0‘Áð$JéþîÊ ¸mO'–2¡”D¢pÅóžÊë Œ»‡ömmÆQ(d¾0UÑ2xBDÝñØm%œAÌêðSeQ榩€§œw°¾-v¬X(Î’×f¼"Pý„c7lä´ØÁ3!L<0á W0±²jš;3_0Q™íxØ<(ñÞ1yp†âõ4bJ¿ÎDÏÍS–Jà[bB™ý‰WLX¹¦?à=2¨£0'Èi}êËJÓȽ¹ ¶Ð„$Ño*Ò]¤¿R˜¬ò ÔµBK¿¬éËŽº?•y¶øP>e(g¡äÉúéÒsOã4k—Å?ïO5–. ޼“‰ C'<0tµ+xXyu‰gÎrðÛ}€0È? òOk‰‡N o „n$â<í3?k»öœë·Y­Ó(¼Ã†XÁŠ!ï-퉡֕÷"ŒW  iÀÄù€Îè)ö®$TYyM…x2mçB„1é Ê4(í€üjë7Ci¤IvCy}jX.e"cÅÙ«– «ä¥M=(ûÈ{Çài¥ räñYµ¬ðRÚXµ„·Ó¨+/%ÊAA!Á;¦Ê{¯PSɼ…|°m ß㯦mh6ÞÙaâÃÃð‘¯< <ßþßN±o)" ¿µÿí«›[cíyŸ NêVá:a£·<±E8uD¤xñcm®>  D¡¤ˆEÀMŸÒ’%zÕßþõ/Ø&t^m;«ËeŸÑ„¿1C^:\Qã$*xÞ:Zc!o±ãy‰,‘#¥BHN|>ø{&d7þs1>¨®H 8¯ ¾¸ÆðÎû[ÀTþ®œº«[þ0Ž/ã…áç¦TSà}Ñò^Ëû#QçŸ*ü—ë5P¼:gÛ¡ZóÓƒM¦4Ñ y§lw¢ý62Ö ¤)@Y9 ^aƒ•Ï1$@ˆÕ¶ÍnéJwõhhöÜJÂÖ×”>è]ÓbùÉ_ùï^»‚¨7¿þtÎ÷øäbðãçK;þÕ¡ÅsÆ‘t@ç¶°së—¡Ümí6—ZèÎí“Ûl ): 1’åî?ûAŽÆÊ'ú>2S;I æá¹2ö­mt°ËФÎ]Î,@`ëö jq»#ÍÌÎ*!–#os`°¨3Ae}›ŒZÍKvëÃ2?Ú^mó¦¶SþâBÚÚò <ú zôèÕ/ŒàÒ7÷ëÃçþ§G”Îe{v)ûƱݞl®£!‹Ëüá"MxÛ:w 6„Ü9Rø{!Ç @‘}r?¬þìˆ6ÊNáÜßò9Ïrž×[GT—¬Ž‡E\.èÃÅí„·ÈxÙßèË1gaoÏákúOçR¶1—ã·1ü½Ô o±ØÎËÍû˜wÞú×´gwx¹‡×¿|éóŸs9÷ûß¼÷êû϶ÚÚ— lãÁõ·äFèíp‹ßÚíÊezý6bcè¬4›‚^,a›¹WúväÙ¾«›Úå‡nJ:&ˆÿˆ{T^D'î\rº’ÜËÙè,iùOD¸-¯ÑDD$+ÿH] endstream endobj 1118 0 obj << /Length1 2383 /Length2 17575 /Length3 0 /Length 18970 /Filter /FlateDecode >> stream xÚŒ÷PZÒ Cp‡à~pw'¸»Kp=¸»»»‚;ÁàîîBpî.ïܹ3“;ßÿW½WT«{u÷îµ»÷ %UaS{c „½  #3/@T^ä3 +€™™‘™™ž‚BÍÒÅø;<…ÐÉÙÒÞŽ÷ Q' ‘ È&fä"ÊÛÛd\m,lN^.^ff+33ψöN¼1#7KS€<#@ÆÞè O!jïàédináªóŸ_Ô&4.ú…„mN–&Fvy#  -¨¢‰‘ @ÕÞÄèâù?)¨ù,\\x™˜ÜÝÝlíÌhèî–. 3ÐÉ h ø«e€‚‘-ðß­1ÂSÔ,,ÿv¨Ú›¹¸9 ƒ¥ ÐÎâjg t€ªT¥åŠ@»¿ÉrèÿÀÂÈòßtÿŽþ+‘¥Ý¿‚LLìmŒì<-íÌf–6@€¢„£‹‡ =ÀÈÎô/¢‘³=(ÞÈÍÈÒÆÈDø×ÑÂÊ#P‡ÿîÏÙÄÉÒÁÅ™ÑÙÒæ¯™þJ’YÜÎTÔÞÖhçâ ÿ×ùÄ,€& Ý=™þ}¹ÖvöîvÞÿAf–v¦fµaêêÀ¤ngéè ”û7d‚ÿc3º8˜™™¹8y@GÐÃÄ‚é¯jžÀ9Yþ2ƒzðõv°w˜ÚúZšA?à½Ü€'W ¯÷?ÿ‹àYX¦–&.c ¹¥üŸì 3Ðìo º'K€3hüXÌ}ý÷7=Є™ÚÛÙxþ¡ÿ늙TTE¥Ô´éþÝò""öo6+ €……ÀÅÁ ðýßóŸXi;3{ÏßÇéôŸ#»ý{¨ÿ½ 4€ÿÍ¥`š\ €úÏ ë2s0›€¾±ü÷…üÿ›ò¿²ü¿úÿ=‘„«Í¿üÔþüF¶–6žÿf€&×Õ´òö ]°û¿TMàß«+bocú}Ò.F ]¶3·ù¯Œ–Ζ@S%K‹¿Çåo»ú_‹fciT²w¶üëi0°03ÿh»L¬Aχ3h&ÿå‚–çKŠÛ™Ø›þµe¬œ#''#OxfÐ(±rp¼Y@ëh ôø×˜íì]@!Ps¾3{'ø¿n”“À$ü—éoÄ `ùƒ¸L¢7€Iìâ0‰ÿq1˜$þ “äÄ `’úƒØLÒ¨žÜª'ÿê)üA zŠÿEÜ zJ¨‚ʪ ú±˜Ôþ P·ê¨ºÆª®ùªþƒ@Õµþ‹x@L£ÿ"6ÓÈÖ´½lÿ倬Æ(Þ俈ä3±·]ù,ììYlmÿdýk˜LÿAšÿdüï1ü/Ô6h:Œœ-þÆì²ü“ƒí/èö¤ùí]þ¢˜ÿ‚Nù';;HK O  Ý? ›å? H(ë@Pß6ÿ€ Qlÿ@PÃRq€Bí@ð?Hû?ÕAÁöÿãÞá”ÌôÙfg4û#;Ë¿­Nÿ£;HMÐýYÚÿћԹƒ«ó?òƒ,Žÿ€ -þ¡ ¨ñ?dŽ¿ÐíÊp€èΠýO¨æŸ€ÞE& 'à?.Ô€‹»ý?@‚¸þ‚´tûÉáþ›Eÿ£+(½çŸÞ@¡^@§¿sÿÏcbâêÇå_Ï=h–þƒÿõù zMàW—ìM>…XÕ‡t<Ô ã»3ìMñÏSìi¦Ñ0x¯:uº>!äÐÔdýrºNíC]ß§¾Z#~õ>nm„ oKVnöy1HT™Ýk‡_™Áš.:n$„#`PÚ÷yuôÑ´†hï–¡ÈståFV*@pôh,ÿ1¶´§¼_Ã)‹ðR>Ç«£X²@‘oœ½ˆC íÂ@KûñÂeáönþcîô;±L"¼ïI,[±·ö&kÜã¢×ÏJ5Vç\r\mBˆÛ³”Þ"‡©2ØËÞ¥ßâe¢¿™ê/5 t¢9²×‘t¯ò•Ooãü6-GÙ™ ‹7QÞ¦ým£šÛ…ó1¯«dî•Å ÞY¹ëàË+ºj!Ë)XpÈÚåT‰5<½?Ɇ(ä–Zºë0ü0u™s·`hÇoŽª1éÝ_(q…Õ8ßE§×ÛÈé´ë×Ã¥ïô´¤lŽÎšÖ©€Ú Á(™Ñ‹Iî'hÃÓÍ‘¡êïÖàøe±³d­&ê~Ét{!¿÷+ä› ®éóí? !~Ø\vTÛs Y1-×ÎÆeXñÊôÚAŽË>G‘±ªÔê|9Ì1þ(8Q)dRÏUSjdT”Y@…×n~Sr¯DÈ;Õ8[6ðÛ´FÄ4ÉgVº|æ,TJß=B¥ºbH&&vÎ’]Á¦™\ØÉ81sÝ-ÈŹ\½@È—¦†+?zBú] Ä ‡·R!h3'q;˜,S YÛª÷΢`ô;]šú›{ÍûåüK#yÂnÿ̶£h1µÆœî¹Âþ>A^g_ 2Ô‚°à•ªso™|˜Ró}9BWœ§™ªgéÖR·ñ&Úd¿!+¡CÜÐÒöHB­‚«Ó¿«EYÜbÐ܈ØÔj~[¯ÒB´~‰/Ns 1TOÏü.Cé”—:íä"¶Ê¿»©bwì`¯=eÞ‹£0íÄÈK[“Œ_f1M<Úʱ Ýp¾–ãQg}äÓæ‹â\Éàý±Ñ>Oçõ‚&Ù™Ï NÓãï¤U™Å»\ƒ1jRŽ%‚T–Ï%­±ø µ´—§ùÞš©¢‡ô=‹gJ[;“ÐÖÇÛ>$¼.!p4HZ×6L,ÌÏ.ýËÑÞ)â].³.î«™b¦äÊdJG âÀ»ìÚÏÉӸ̪pˆOà!ÔcTkûÄ_{Íê‚‘^˜ŠM4¿‹¥ ¿â–rƒ=© Q뢔†´M¡@¬Îug¼;\ '“Ì®_ó4Ĩø¹´¯|˲Öô莽€¡80:écpxжߺhíôl²à _ý¢!¦ÍP“Ú[¾ ¹&›êð½ñ¬ ¥)ßOÍõ¾øbIñ¸3±’ä1ÀÏ(“’‹½(ø*æ÷ú\÷ =Ýx¹†¶É>Û [í8î0·õ ‚ʼnÔ)´M;æ°lÂ/£Œ½ïAÍw =ÃH ݼù%:é䓹¦¼3–&˜KéV¯¢Ïò¬»†NÕrñ×¼…8» E#O›U]“~›o&y—å áJ7#ÑIÌx ”Žj|a%ŠÊVöÓÐSšÒ`ö`Ù“;¹½€ÔaédpN¡q­Ñpùè¥üªõ+FÀÕjüÐ>nøÑ@ò`§Jæ2`„ÐM/„Ce}èH°Í°ÜœÊfsªK);¹Ю8›ØœŽ›äÞVÒ·=L€&³Š)ÝÌf”Fp¶á'~yäùæÆo!Þcð™zÈ3!Lá! †š¯äÛ”c‰¯`ã3{9T;:IüâgÑLèZq"™»¸Š®fTÝ•½Ïù8m©DÕ™/«6´- ø¼ZßF¹îRZäÚž‡W´s†Eý†mno+£>¶›¦³Mò2>ÌIè1†á;×}có‘•§è.`xØ4¼])ʱ6KÇ’Õß›¶‘¸ÀH>÷t¤ÛÚ¯¸Dš“iLñ>†‚†Ûw»·bršY\Ë Ö&TB¥a¯5[¢StøláâàHÕ‰WÑ&ç³ÈÝpOë$¾|fWFÿânaÜí/õÈf)îô]¥ØöÄë>EóœpþBG<Ý=tÀÁK…Ióñ72\{`©‘4Ôþ÷d[‹är ÙUGKÀŽcfs ,cö’(³+zÁ=áI'eùÞzáY8wR:öòb¹Ö¢4~²j ,­æ‡ñÈHƒQ™Î/ÃÆ„S…á…×Ú¦ñeá© õÑñ §e;ñÎß²[%åV‹-®sçícoæóJ³ñzÀÖd>]ÈÐéÚÂOÈà>sâŒõYã¢Ç-ÙòB+  Åæzu:/‡œîÞÂ(&|üÕn¾™(J`¢Å¿`çh£|œ…—¿ž˜ÉÑÝT±VÅ–$«Ú= îø‘Åú Ñ†éæ|×µ¼ Á|”™´ÌsO³•È6Ì:ó"=ߥr0qõVñÛ3¨PDíoÚ¥Ȉ4Ù탿s 3ÿî³èÁP‘à©ÍU[BôN . L» ÿšàÏ;~cÑwÿ~/ÿnÕsSš‹¸‚B‘ ñ[#ä}-Br{Ä­9ZÐP•wó˜Wè 24Ñ4Šòà¿Í“Y“7þ“Oë^ÇnäkSÕÍðÆ‡¸cXŒùÍ®­¥`î#ò§n2R ì ÿÇEkBÂK³ ³üÔø˜Üq„êeAˆJîøâßyJn§ÉÚCÖø ^Kß#H­>Cµv†x•wÂ[9¯i<É^”{!=$9¡5áË$WŽLœû€H/Èö±gǃ+õ’“ ¿û݈ä:Š?b‡lýùa4eÔµ;Ú¸ …)ù—dwÃ:@Jé^·L×Ðxkg‘üΉ¿‹fR0éÞ=O_¦=ºˆ:êÑñ*W5cGÙŽHÓŽŠ4 ½¡˜ÇˆGƒ}‡’ÐÅ|¿ä¸Ò1Í:…?5ì$† ÍÒ[ÓñSJç¼:cW¢MÕMh®Ðòw“ûÁœ'Ù«iÆû‡¾ñó0T ç±_~™ºÀÇȇy=ê¸ó5xÞ½+#Ö¶"ÁYôõuïм½ÉÜ¥X¡zÞ¡|›Ê§Ag£}îÃÕ.ɶ9(³ö´Žüõ®ãâ ip>ÃÖ³8Á³[½O ×ÇXÐ’¾ªäDF>ˆ÷[öˆËMÖ®Tç¯5_=Á$ŽÒB6úY‰0Z“|¥i7±ED§<3 FÁ¡:Ø¿~|áÝN©3?ÈÓÐ aišÓ¸x4¦& —µ—`65N0Âk;Á}ŸÈÝ0c—ÔŸ¨´N¢ö>èŸä]‡‡Mÿþ¶¡Ç”i^1ÆK7 \ĬË}™°½w¦û8Uàõ4dðÝ93gHµ;ûÞÈ¥ÔÓ¼îrvÂé­•¢ñJ‚ ÷ŵ8·x#š²@ÞwåGé[®˜õˆ…a¬n®“«©À¯ËO÷–­Âø]g‘˜ðö³é&Ö· ™ ÑÄv†On˘‹4¬)?Ò“vÉÉN‘8g½ßÎa_*¶«›t%ÜnÕO4 ºlÎà)< tÌPOC­8ýŠ?Š",`®“&%é[ÛˆÖŸ{¢´­S¼ÓÌPØ5i.Jd)2aÈ£¦{Vùb,ø]k;vž–­[J„’ËWˤõ.Ô{.?H¥¹!¶Ìwa×ÎLÕ[г݋ Ô˜K\S|N ¨¾í 1³|k…¿¢`ø £>”§cV«ö™k‰/Ô$+:V2‚þÞ‚ëœ[¾€}úˆÎë‡wg¢aËêÍÖÉí6Sé&Ž I )Ö8Àãª}Çà¾ýÛ¸\Ë@.‚gEXyrpíÍ4ʬŠ“·Ù±²è¥o…éXìÈòßÊŽSÃo’öö×ÜÙ„Ûö3¥BûæÓ€nùy:}*ú4ä3N¦šÞ+“£ç£L‘³GV ª¾so§2á^³ÎaQ‹M»Q[KVØp¥ ~^™rގº`*sä4Ѽ^ ª2r?= ¬ôs¾ '~O" ¢™S›ñ›‘Õ†Æ|Rb†Š‚–QÂò£ðãÙ¦ì/ÞpëÝÖ'… †ê¢é ÿÌq€Ïo¡0d¤€ºR_F˵½äͲnî&xÀÎÙÀ(u—ˆuLòvý]áæµ×ª`[‘°´cµËøçû^Qk,¸K¾Ä•çÕ~ÃÞí%å¹÷µ»²v”LRc <]ë–ÂùŽ­ý/+y;q3iD[„RIÂuȪF-ä…PìÒÂ÷lYÔ(^|½"’òAlĄ́óªeaÆ;ëo>¥‘¾¯‚{äLÆ;&*a[v$´Á;Wù<ÜQÄë (®jÙG,MˆÄ”g´PÀ"}ÊWiŸÛǺ÷%æ²ï¤¼à ¦Øª0U}œÕêî·Š¤âËÏþ„3WÇüñý|CÄy(³:¤¡Ì`h;¯é·ÚÞÞA±ý7ÄŒ!8ˆ§ÜãÃTMÚp½“Fæ¦H~íþ Æ;‡²š Çêy^aWàwÑc ÙawôÒ€à™%ÜÁ¦—ƒª-“°(:&‘¼Y? ¯Ð{†ý<„.¨,MLtM“v§øôß¡‘Ø1‚þ}ô¦àºäŸ¾Uº¨©ôP`Ès÷Šø·ÌÈå:kyGŠ5’±#<‹y•éZ}j&·+F5Ë¥šœ”GL¥rHÞC4š'º[7EÃgY2EF~{1G^g'íþƧs4Zé ÅÀE±Ò–~`ÍÄ*ÝdIUUâaÌ7!’òñÎgø“Öv"Bu·M„÷J9=æ]Ö~1<:½@°Í1A¡¶££P­!V$†htí=2'îšÏ•:îa½ëp™÷CËÄÞ¾÷AAh¸m²;tz¨oÓÖÅ+wB²(eI™]~ÓT' š]Ü..\s¥@ÇÙÌÚeÈ»ï}æËBðEê~Èo¹ØpÇa%kãõŸéàÜÈ_f—z¬-^°vºô“+¶½Y¸Ìp«Š¬1¦ïÓÉð( ÜAÕ jNÛt"Ãnî¡z"fç5,æ÷ûLg°ŸÖ¥B&¹+¬1à¢%¶aŠÔÕH·Ä°Mèú ê‡×ñ.vmPZ-þq…“Öìé·z…¨ÚÜ&ŠëY\sX°«<õÏ”“œ +Š]×O› šS¬uúk8 àÈ^’5§/K…¼¹©Š×WO³NÕwÒUgFsÃ;<Nɸבc‘¢—ÓÏg ß1nãZ?‹û‚Õe††î5?¶æÚØ(—¡s¾B[Ú—†&Ið5$à±-¤¿hC¼ýÜV ÀÚP†ÖwŸÂùÝïI)^Ã[`Í@‰ü™A RZ×,íSœŸë·¸–Yc&[fiíQ ˆ?óêµýÞ@˜g{Zmð³=µ†W)d(öoÞqj—ª;vN]‹\{Ñ.Ù«,g„Ô{ëÕÃ.à#i´ ™ôûdšéHa–Û¬‡±ýÓùî5„<È€.9Öz-iO¥?4 ×½îæ´M;­YXé9lÅïã“\ÔACG6k,ñ àú¬“‡ˆ óÛô£&g»Œpé³ä­ Ó9¹Ÿ(aIã¶oÒN¤¼l‚p³6ï]nW/Rb¢½/ÆDµ„rþo´j Vr³’…* ÖÔþš[ëk†z¡e8wÎÚy#§žþý— é‰þŽÊä`W”PÚ ¾Þ_WÛM¤ç¼ŒÇ~Sé°”UÏa«ßÕྀÉá+ð4HúñÓMuå3=-‡µS7¿ÃwCŒÍ¿;ñ”[´LìnÚuÎQ Èúñ­{¤m»z)]*›`sÏØ=’§ê| ê«j{s‹T×é•7=8=VîJÛ0kŒ„™ùîÎûó'Ù82¥Þ¡|Û§LÚfÎÄÛ—m}ù¾9ÏgIÓÖ[9‚N’z "Ù ‡ÍDúŒ;‡^,"9?M1:ç1SMIÎêzOã ˜ÏìP²’Åõdg\³l‹ NX¨¨‰ì¤vHS©2׫ñ¡S¶ˆ1?1úÇ‹É.‚¯Ûi›ùTènìqÝqŒLòÒ§Éd›Ò7Ö=„ÿU|³ƒÅå CÛMž-Z~ñ‚NŸó~eúÞ"g°‹¤QÕ_zSN­åvЫgƒ,:LùB cd„žqµ›Ó§Î-ŽÈ›ºí6¯øü¶ßŠ»Yß[mQ;fŽÙr©é YJobBÒ—ohŽ3õ0ž#‘R£9Ò ÁQhäŒm3äõul0[&“Bûv±º ‰¡ |™ö|Ɔu´Ùa"‰¬ö…B þÒ¤êæ²Ÿr5¨¯!l[~h´GQ}®WÓÊÀ §:‚±tÞ”€¤Éã`Þ¯g+—GùZÙx V<pdX¨ŸË¥N•-é.èwÿháÏÆr4¾5A©âƒL ñ©÷}ßg–ø²Ä•xÀ#F»Š\X!°dÎ ×I 3á˜âfõ][ãƒÞztqP>1ùç<ŠTùh³0]¦ œ¤*Ú•8ÿPW³¶@,i‹(ÿ­Óóx_µ’"–&Ùe%F¤Qy ÛãÙ4'ÈœËíºûÇÞoŠ‹WÜ0T‡úEHBTøï˜…~†lÇ,¿NŽ«¬žMíÕ¦†Ò)Wô6»aetFÞjê wS’Ip[îÀéód6ñ%Ç€‡¸ÏÂéòJlš;EòM³2ÝÐÏvEÊ`X¶ˆtH±±®q¬–†jÒêצÎÖÁoìÌÐèU‚A(7U†ËËö9…gåô‘éhaŠÁ3«F5Ãædv`”¯¥ulnn#<¥ƒ"ˆ½^¦7<V•*µ±vĵ°]Í1 …_ c6]¾ê, Ajñ2±»½~ó—‡ KƒÜ ±¥ÍôDçQÈ ÿÐ-‘IÎ1½ÈÈ!i÷ó9½ó'ÍÃ{ï…å¶ÎZ¡Tërï¿dÉîãí…vt±yêïa·÷‘ÙBÆm,ëÆï¤0'—ˆRo´×¿bÞŒ*çáÐÕ΋C篜S¢×u—M‘ís”†3\¬X“3 ͯ”ˆººñv×ÈŒÓ_îÇ®»pF‘Üc>üB‡¿‡ÆŠEz+¢F£_$k["åÛÐËÖrqSdÛ‡îQ¥„#Õ,£­ UÀËöÐ2ÖŒj–ګ͉=ÑËCºìÜöØ}ºP,l+Tu‡ŒµªnN c<þéÍó‰’MòÚ·+TÌŠ*\Fûû„ÆíºÞ2ëkë¥ý!wVhOGÅ.Åfvªm5˜\–öqƳ~á0vmÖÞ=XÚÖëqÃQCâ5üÆò{†%AFñÒÄÇ^þú–Ðß Zx²Ï0sÅ#=ÖË6÷¾ }Ú2mFú…ÆPæ Èûâ”ýûmãÕüqfÆÿ* Òð¸Üit×e¤Tk¾U=·ÞäR”ÐvëF§û.Q?·¼µk'Hm4¶i ·>{ζ &ÿ"šÅ‰žtUˆÿAlj¤Œ·Ð¬(÷ê2‹¹§ñÚ³ N££È"¬&³ÿ¨Ò[ÆQu%Qk™F6ÜÛ}Ôwù…‹jtlÊßÜ«‚ ¦D`í;²æ…ÓQÕRh¡¯Rýg—¯o¯(>} ïm¢å¸Þ0‹kÚQ¹x¸ùŸ ·ƒ¡BýEâ"d]Óa­Ë,q(ätÌ Nk¬¡õŠü”Ò $JGYwGüØgt%ê_Ö‡JìÔÊD8Ú¹°ÓÓ™Ö²Óz[Ì3úý[°Ù0QÒ2í)P,å»:g¬ »eñTÅ4-"Äæ-³èᬵo?Ü>™LIÙpã=Û˜^ÔXÖCÄ­ŒÐ´ãÃ5§âî¸/YR¸*2"³ûâ¬]M ñ®®"ÊqÒ2æÒÉÒ‡µqXÇÒoO’÷ժɺ}U¸ÕŠ*gÒ1CUÂÐ÷ñŸ¿é6Y…VŒr?•—þhÐòèr7Ç*¸}PŽí ƒ†Ë}ùÉ~Ã~uio½&%À‘&!{ áÊÞZ #™=Á,q銯¸W"Ÿ¬áõÎw“¿æ×…ý|ˆŽh ›ìÀÁÀsÅÉLßÑ?5G}/‘-šuÉõÓVA©ì)Šb&ÆÊ_&ö3YëFë³t§â˨Ói!áS™ÉÊGÿ=jžÌnÌ_¢Ÿa¯Š ’6}\4•Ï.é~Æø*Y¡9_‡SSâ_KN³Œ§†Â!%q!ñàµPíÄùG#":Ç}7Eʃ*H¿x®°Ý¿öÂÚ#tUÂjœUÈXaÀËâ¦G¹” âj¦µ?ᓦã`¹~¢ÌË#p¡ghÿ’š`Úâ~7U‰`­bãjÃA”ƒúGÐiœÃþ`¼;llj®±’)¹bˆü,£2‹7‡Ý7#.>PGÛücü`\aƒ©Çì½`ÙOµ‰@rª‘k˜ÌŒ#&wJv¡BžW¤«GãÊ9‚¬YÈr“ŒYü¡å¯5(ü¨:"âqN™l÷.Òóè“¥±åð[õ&%µó¾yƦ…z|îÑÖV}YZ=úœ³e`ž½;yf–0¾†íÄ4!nÖRªôp˜!¿§Ý¬‡XU'Í 41-td¯wÏœ¢Í4-à†OˆòBàŠÀª#1 ® '‡!]‚ˆ~¢Mìtbµ¹{ßWS) ‹\ºúBoaäo äa›)§Ü MÛXcìä4ʉ™Š3®Ä¹@»È&å˜ ¨¢î ÇĬµ5ežÎKîÍåš’iK{0aȯÞnÔ|1/û}ŸÖ8#ÂÜv6x>dY\€ú¸mß(˜º˜+§4FI+³Ö%eàöÒ¤4ðRZÔõÍ% _’¨z:bGl’:¬ò±RÖF‚TÁ›¦korFʰ½ƒu0ù(H~â__]Ö˜õÍ·±Öþýž)érɶ@ ,‰Nkâ³Ã£‡÷õ|ýtŽvâC¥_Çå#RÒÎÔP~»ËÖ0{p~ñ}Ão|gqVÐÅ@Ì ?«7ÓAÚ¯öåÛXÓžT”СrâÊÉŸÇk0©µ¥Mi±Úx±s#6i¬Ž‰üÍ „Šg~ãÏšSÁClo”õû~g7RÊîÛ(âµ‰Æ T+¦Å?&<©ÒÛ³ ä©°Ù¼žÔ·›Uê~ éÃm<Ï8æ´¹{:{AÌ^ ”?þ9•6Xÿ؈ãqûHèÌèAÂx;9ˆatÁò#!®[Çûh”g9(Æ…þ¶ŠFÿ÷L÷">†uï|hÉÆæë†åxÇŒç¾*+Ãrœ;Ë`mj^Îîk"l8Æ¨ßÆ0Ö9; ~%©l3°CZjÅºã—Ø™ì»ºÕñÓdŠÇ>ôá­Þ¨¦]}Ôv¾Õˆ[ŸæPµ,1¤UKÅ!®ÕcWŽ)8ƒ¤oÀde@œÖ]6oâù]¥ß‹ÈGì—uwsdà)B¾í#Gó‹spÒˆ†Oã¿Î¡ÕÊñ7ð8ÑÀ´ó¨{„t3‹qTµÍìòW!¿†Ü#ªÄßæâ̬Ì9ÑýòPP ÁN½È6sïÛi0©ˆÑ*Gü•80 {öÍŒÅ]¶âFоqI½ºÍâ„ Pïâl1Õ†ô˸–A8[~Ê4Æ0êäÌŸ ôhýãâç,t> ŽØ˜µoW×ßÞÔ¤ˆ^”fÉ_ˆ¢KËRM(.iW2-D†âp/GÚ­ôÇ;I¥ìÿ`<¨xÕOƒÖxô“Migôù¢»j¸¯<„ý$îéáÿ•mÐÂ0f†ÁjÅÄ­šÚ“§½íög ’¦pâÕê^ŒÃ¦7¥¸èö†7®ëxNý«´–ˆ¤ªúö±IÉC'‚™!\mžñ‰.+;çÇ÷ØÅù‚û³þ­F†if©6rœª&Iõð£›ÄÚ²zïLÃL¬;¼`²öœGñ²^ü!ƒ”ß7ø¡îën£s'Ž®xTèÎek¹eèæîálŸœQhPâ¯4B)eOmïuXº9ƒV‡ùRÏOYÄS.I‹™éTéz›±Þˇé8=ì`[¥ úÕGîz×8¥ÃaP~Õg™Ç~CòTxX½©Ô3]é6$<¡îs×ÇPéøE&³Jó,äŽb"?LXÔ5#=“„v§ãѰ÷dq>£ÐÇÙ1ÚᛸE‘Ði:_I ³Ï±ò¡Ë”—ÇÕ-“Âì?Á4kŸ¼ìËÁæÛ¤#y‡Â÷KýÈRƒ©¼µ°®˜ÞäæÊF"Ì-°¯  0$Œ%‹?Ý÷„ЂVÝP ¤1}¡½ÜTÁ(Óÿ% —K%2:ßÇw²dlP—úAˆ ³Ï/M"‘Àܳ(ðF웘€JÀD8šéì ]Mšœ“Kú3ßþ˜Ð'¢v4(dÉ^ã…)>N€ãsšM(gu&ñDþÊ*ìµ@Ýú¡ˆpo¼×툄q-QÑœ½ã+º&;˜X¬Òp3K•]`IÞeC—ËùÀPâ-¸5±ë ‚A<~z„TL»p…6X ÷Ž­=­¸Ê² ß©‚ë’× €Ñu) µ>îîrÆ}¡Ç‡œÃ™&Ï _+zmFàÛtõ¸ãçèë{e߀׉ŒÎ3uÛ½jåtkϾ}O}²è7¬Àˆ¯¿øæ4ÆÁbN! m*²4 ¡‘ÞÛ¤0ZÛ™"kkrô†Ã/§8Ì›qˆ~ìDZÍ­ô…´FF8÷Z»Z2Qç\F€ñ¡UëNqàAfüÂÑø(*üá|Öžý ¯¾ÊÝ.9s<ŽcjØR+ÄlÑÆíQêÿײµ² ›ÏñõW\ýû™ó78“©AßR+ýÔ±h¢¤À9º£Cä3ceE—3sGÁZ‚fÚ;ºsx¿µÆ¦#œ³E·9¹c²OÔ í†M lÓ¶A9Þ1^€¶Äô˜È‘…0nÔë¼C}z€€W OUÅoÃè\?žW¬d#ÕÌo <ÈñtUA?ø¦…ÄZ]Œí¹lƒX$£<°fa‘œŒü7)=Fcú h+…QJæ³|ñj!àëNŒw¬Õ«”ZðXÓ4p_P¥3ͱ¾=ŒëûgçÚJоɴ¨‰Þs}tüRj銒vñqy‡ÜŽ ë3ªÛ¬|0¯>‘ó-òÃ÷â¨@íð†!¸ð´üê Gz°õÑŒ “1*yrÜ×hD(òHÓ¥¬êž Ò1ȶŸŠ•ɧ~‰û›Õð¼p7Ÿl°? ¡nà"S+¦-çÝ‹[rާ3œ`6'œ/ÕiPc¶¢†»ì>A¡Ð°žL9à.¾=ÒîÛãuÔϋӎDF1tjdÒ3ôFBä¡ÿFº°Z'JÞ(_:ü<Å¡ض+ " >îôƒ±ŸCp3ˆʲpÊËÈÎDÓRÊ@RáàÈq*ƒ5LnÌgcU~G€p'Ø×)ðž-8¢æ’ ëà×ÜÇ×Éç̆•¨ª(Ùüz̪Ìtç q¡ŠRðíK×‹Ò ½†|5øxZ:•â¸ÏO×ÒéÚk"Ø™Äe›3æÑ«ÕD3øðw³ç{•Ue`#òü1Ý‚lç  :Ä~h2”DˆBɸáÚǤ;Nüà nÕIPÏÐg0ÍÐÅÚEïB<|usˆšBb“mÎç¼&q—pCóðŸáÐÆ–(m˜cøßö”Ž Â§8›=Ó^Ñ T¶Æ,jÎó›ÌŒ~Oå7+ô¹gz qæ”Zꔣ¾ã0{A¢¬†$RÃ÷SuÌîóç„¿O°¶§Ý$þºzB­*hÇjsøîíO[{7 7+fÀ ·Á‰¾ŠÇИڅwüQk͈8Ьm×Eä3@“¨|Z wW "×£ïÖçës¶#âþwÖ1ûK˜_cüÕÏQiv‡÷‘óµ˜a÷XHÒ0¸À´”0 ¹ù¤)fѳå'êµp{ƒ¯'>ý¸,x¯–ÌÈFºY»wþá¿6Áœ‹§cÚê.Š”Ds>bÅÏ‚À³›¢¦f}*&›òKºNödÏý€â³ÆïYxd¥‹9”ÍìBT§ Wè)á?—Ñ’ ø©` ‘ßì=W Ë\Áý±fý§4M”aÂbq³^ãA´¨ž„_a"n¹Ø=O¬Žcæã®þ(]Áj]S´HË ŒÁݦè-nù-KWyh¥¼-157ù§z3óm4bžâ®¹,XæÐWÄyîòÐo¢Ê±Ãà²FÎpýG´Ußéx•gôÒÁN²Àr$l~PØÖ+,~EøåkêGø»ží÷"ÔC!RVf, ]Äg;¼Þ†ÀVgSyöÄ2‘¼1Ž—wBÑ[³e[‚B´«Y¾II™JZ©ù÷&÷”Ä-,kì!ïÑò¨=R“>ò)w}002’×ÅI\Q-„I£Óvj†_¢ˆ«Ú0»šÒK—`ÊûŽ ª’Ž·ãëËzI{¦färÊÕÙ| Å»_™\Ÿü _ƒ?ü°–jý–rC‰Ÿ»«mPpTÌ–M)] À~È‹WÀÒåÕüV[½*‘f*_‰óþ®ÊHøxÙ»Ì5E¼Ë ÎѶ5(Öô²JóÍß屩ÑxÞ‘yuf@žˆ$i½ö7)þ8yKb¸¨ôh”oÀo¥Ýük–ÍÇñ.æÃ³Q<öèl£zÚÅR'ú»^°—è’dŸr®^8_¶K.ý£÷8ðom(Å,cYdƒP20!ü×ÒnÇ€R`=4*EèEÕ8Î[eaæ`ŒT!?2 w]‘ØÌˆsÿ˜ç84òóÍÈç­Óúäu©3nXØ-:ß«Q¥X½fcuÂß­¬•ì=ïgž_.™aò ÌתyEÙŽ%Zävc }ƒò]˜ð•Oñ_8ûcHÝÿ‚À]jöÀ/áÙEÐ7™’µq¬¥Ž„ßs´ÙF HOÙ€ V±-WþÌ ´£*”dõ&›’¼ U½G]c‡sBnA_ñI0‚^ŽÓûØJ» |D‚ ¶\*`ìÓ;Lk~ø/}²6\=H~Ǧ×~äñä-ÌIø5eÇq ©8¬ºm…í0‘ªöaA ûQ$’êúkµå‘•ÇûAÐß@W[²—cݳRe Š8f–NuæÄ?ƒ;5 £d¢J´…ú•Ql…Ý#~f7šÿ Æ·ÂpU­öÓËA¶'ìDéß"Ó‡—‡ Û->ÆnG@-ůòŸ:xÅ“¦ŽK(mg¿»A¼0ÐŒÏŤ‡®ð}íûõšÃÇEˆ?½wó{[—È+ò3mx*„Åa•9¼r„¶Â8ŸŽäR_wÈÊþpEý.åèx‡å¼Ûim^° ïYo[2Š®H¦Îñæªùw 22eˆÓRÙ›†Œ½gÆ2x´V°„ÑÀ„º:ÉÑ‹¼õ"™óÍ]¸[®˜=ºÎ%ÖÏ(²ªÔ•ØÊPÓ~Êí`H|¸‘Ñ9\Á€Þ%VxÉóìjª$y.êK÷ÐäÛhÚcÒë÷¯2ÏëÅÓÅQa„/(Ädœn%Œ6•–EˆöTî =ãª_p÷ˆ6–•Oä&׎÷˜zÄFÑênd3"*s‡oÒsHߣ1¢ná'ïðáßîrˆæ;pO‰‚ñn&\ä•N$Å”/h-Ó#›˜Z ØF™9Üáë£3:QîIF_ãgiØ”MÝf·´Å§{( ÈÉc˜»Qd¿ÉÕ& ʹb©cêð?tÔæ’oT¥Rb‚0c¾åÆ|Üü­zø CW‰á¢ê]€äë<ÀM„;à®óº4åÎÈ'ׯ_ µ®«ñ+§†÷¤€ÞMº@9Nç:•·/¾TÇŒëÆú¥Õ35í4°»üGX”¤N‰lºq³×TÃ4øèÑéZÈÏÕ©.ó»au_®¢e3Õ4æéÆÅ0Ö•„Gk8í&"!+1Z_EõÔ®Cóưrlûã³ìP¡ð},%©Ù0‚ŽDöIûÏk°ÙÎu'íùÃùðçHû+D&Ï÷)|Ðè¥(ûYX󈄀{jVAïG”pï(ÜoN Å“g 剺)º ™ƒ°½ì¡T ,¢‹Ê -ÐÓê­°ÊE‡l€á²³ oøøýMÐMòq oŠÈüÅgLJ”ÏkÎpÝöðÒQr´•Ûé‹–®1p5н’x?!üÔz>œi ! ŠÇþ‰ëÖpÖwÑŒ)ésô³f>Ôt¾¢Žžü·ñõIžIž¤JüFÖ¼¾˜ª§„ÉÛØÛ#¹S3‰þÀk(°þFhë °˜Î}fðqQi„¼ ͥЄ RÑÞ±÷àHl ?}¾ƒ©¸ïÇF.$4Ç&ÐDY7žÀcàdÊO$½éœè€¾)Ùò-8É ˜60 }b?4;\iÉŠd{€åÀKB2‹ü,?Z;U‹ä5ŽÜhì%Ç£¯@¤ÒV©wÕJM¿/ÔŸuKþ$ìÓÍVEˆQæ€.ÄBà÷ž„ý„}«($´€×p(ìb^-ï¥,æ·„5¡#pw_•(wd­*¢ºÄ»iø•ç[sDºòi›©Ã ÖäðØ3Ö á®Â@:±F×0©Kà»ê¨»9ñh`Îï³È[Uàw¥$Ô•YFz‰3ß ÑÕÔµ€û"†'RY¼ ¸sÂÁ D+xØ“iU<¢¦¾ï”Ó°ßñ3ð冧 ç¢ÝÐomöȆ ×åæVp-J-Í_`}3¸™>ªŸ‹Ê$”¦þ–%ÁèÓ¥[a ú^rRÝ7ð¤t8iØ-_Ä0ÐúeJú¢%ëµÒ}Ô-v™°%Õ›`‹ z 6Mtn67ð}˜)÷}e_†q‡~YOqE“åJÉl—¿j}/™‰…èöÉú}!…±ÿ¨É¾æp!ë4£®ö5\»”£–y‰9˜Ó¡OrUn„ʦŒƒÂF=(Á¬«þ3Sµ.‘¢]§l¥éëO´;l]:M”EwÖyãÂTS¦»ÉÕÔL¾ZÊ Sù¨¯æŒksxZªHv»˜„ª…=d©eLBHþÈnlz¦áõ[æO 8ë”â$¦CýŒihXôp:^Ö~ØÂæ2>&?ØËêN¹’!?ÃINGÙã#]Œ+×Jªz(”,ð¶k!`SÝ¡£¬\«ú’“S^U½÷ˆo_%Ä¡ C” »?ny²…–13¿y‹“ת]ú^h­u BðÁuó¦5ÚÅ Ðc'^dÙ_ @.q”wçŠ|1QëЊŠÂ¤ØÌ¨´õA]É3ÓL‚ÏêÙÊìÜ}_vùª9¢=¨à”hÅóÙsNdùj.[G?·¢},à2+wEi5´ê¤}@sºÞWƒ'÷{óz„…wÂ}Áâè &;QšvÄ0ƒ8þ° ‹”Û!ƒœ/ïÉ©îjÖ¾©œ Ó±w«9îèèÑ(ZA%ÿ-¤HAi!KÕDê=­—£²w|\è÷°û>+þŽðfóSâ­˜ô Ógl¹$gw\½vb¹Ü%o}š˜´¡Lœï—›½Isˆd"±ø²WiÈÄ0{ó Ì2ŸÌó3dKM™›¯$ 'nðÍ ép3è¡£m°´?©È„;ïÍ ¼rÕ4éSBÛj•‹ÕœVD§×¥’°>Ì#†â—Ú§Þ葌%3fg‡ûN<™V*¦Ð•—|ô쉳ëË£ñÆî¬~ðe%í-R3 ©Ñ.‡¯X¿ë$øxU1­q~"®•/ùl—"¹%_Ç«c—Ì_:b oX`-_zUE¥«‹að³W?G´mp™3%wÐ?^Ééô›´X¤›/Å…¸F¾èò3D|B½ñFÍZŠë^ —гc™º _rËÉ‹Ó-„?¶ÊÝ$.A vèP"­º.9—©Òï`“쫉ò$Qâü]á­YFáºðGáCI7Hq%µ'e‘³z¼èö­,Fòv”Ã8ÑÞ4ÒôbÝÐL¢o:×^1ݘã‚4á>”T‰FB5\×ø jG(1v.Ÿ!æ.n}™Å!–¸ýƒd¦yáU›DÐJ©‚QÀõÖ²Jã~YOI3á„;½XLEܬB‰¤ß[ ÞuüHۄا÷Å%+ól•Ýjë4D(-I•!oy›YÒÐê?y·šÿ¶ã†ÌoZÍNœ~á‚\-3ݼ@gKàó¨­%OoÔb,^ñv`[ÌRgÊ•5Ï—7%˜HÑ-¨—H%ø…ׇˆe»Ôpv@o8ñC.N’!˦0_B¯MUÂ÷ðë ¾Ÿ'Ú yneê_ [ôSzmZËÏ´¹¡Íõ®T òg‹aŸO<\ DšÝÙFoÅl6T,âž4TÝå› Ê‰&¥~Û«!~ÕÃFE_bEö“ ¢ÄšBt®h¨,CMA‡½¬Bª¿­Z_»:ºÊë¶?hs&d[üŒ(µ£e«CýÌgêzËA{$ðží­Þ±Î7Î{–’jU\ÒÚ0^`[GzH±!P²þÔg"%ÄÞ‹¨Ô¨òÜA‡Š8²þôkLWGù†àBÖ6æHqÁßá¨>§«gCÎíUŸ=Åù<æ‹EJâõžÝ•Æ ‚mêÛ6ÆItŽJ¼n;µ@!âë \›ÍùRF;fQ²"¾µÑx;U$Ry¥º†K›Ÿ€Új¶åê€)úÔ šY ò2PÀ…и4~uœ¯öµúöªÙ0?Ù…öd;’æSü¾ X¬ec`ž@0m8Ÿqh¶‚Ÿäè'v±÷%Ãé FoB†bw¡{ÛäÀÌáæ ÿTxð¨_!2£ÔIþa{”[#Û9D:BˆÔŽìEÒ;WÍÓ˜“ÂÏ9¯ÔpÜÔU%Ÿ ·£MŒÇÊ¥yšË½|Ú³™—<:¸¯S’"FŸ4’¹ôp>ÝŸºF-Èbᆠÿ.ÚD‚íä!Ë\é-¬PÉ”SMDé%³B†&$Å®¥IwÕÇ«b«Û攪B=,gµ0ÞX—b½mRzêâ(/‘–•x¿ðçxÞtï“NvI ©ö°E¶ãÿ¬$wK_š¾Î»Hxä¦4·²ôuÙÖ³$øy$¾P ½5ÄÉ3©Q$îΧDbΑœK9tÎü`«u9ôEüü1F=¹£§å¨Þå'×5BÚ|—Uw=óh Øïdì´™ÇDZ>€u´î'Kd´79I?™É°9¾dÚ¸'Âüºm:¢Ê3ò‹]úX‘‰ñ0AV™¹ü&õxÇQ*„c䮇?Ä úÎï4ìߨÃJ8Y´Þzk1Ú3ð¹EK¬µSÙné5AZ–ª­ø:ˆÙü0{Æ6úÞ1/X‚È)8¯Láx¡¥É Ϧ±ôÎòáï¬xsr„»Oófq¨·±åùoeVÚÒ+‰MÌH`lñ˜¡)|øAC‡Ñ]’7Û—ÂÆè üKéð:zPÈ(2ëC_Õ% +!<-J$§(£T ˆ D…ž€3fÌQcݹ«ãB½£úŽûÖQé,¶{Ö¿¼Ì>âö¶aŸrú¸Šr5wF³¤ÞÒK©Ç 物ÿTv‰´–‚n¨TM¢\ÁÇîn °^ú½W¨(YóÆwÎäè:áA+_,Ã(9ÆcÎ66àíííÛoøéãKõU|l«à³ ìð¹ŠÌÍíÁñ]“ „åέU=ôs©`Ðg«3½(— bB}Ý&äu¢ó©#¼¸ò« ¶fê]áÈÌ´ ™þžôª®ìÃëidø^ú'Ò«¡ŒÓl—Ž«˜|›ƒnHy qëL¤­7è>!ì¿â£×\T: öuq-r{¹ ïù¡Â_¿éïfå7ëüWD"9MX%Ä…MéÊÊÕøÉ$$i²3Í 1WhœÅ’´¢à¸~âͺÓRÛ*ƧìEqB=´ Y#M@23ÚŽÌØˆB$Qͪ) @³rñÁ¼Jÿ,¹æþ¸QÕY„=uèkŒ6àÖc÷ñÔsñ¬u– ê>¨$Z޽ѠÚ_ŒƒÕéE÷,èQ]À?ÀQ–Ø’Sz”éڎ>29|fß¿nP7½WšÇ¥]ÍŒ±¼òÈ}Çw”%Q²~×p†ˆü¦;¬‡^0»ÛÙÝ•û÷‹ª0}»›(eÇÏÒwMIz^Mx­?„&‡o“à—·W=L‰ Ñž§*kйþ RWR˜ã›Á­E!„"#îÑw‡â>¡ `}Éÿø› iÖ‚pÕ1q'ÒHKÄ_—K&0DF-5Õ»óˆÝÚð•¦XôçwññÑ>D±iQ„}ãïžxMZ•Ù§E]=BA°;”=.dƒŸ·Â«J56lž`Í‘B‘Ìi›ldjŒJÁia5å–dy †Ü&gñx B¡N6(ÈÛÙªynîs°† Ø2m}KÈ£Ÿ´c[Ó0 ½ˆÌ"°2ìi餧 Œ†y5Ñ“¦ÏL©‚:YöeFîlóÀÿc‰£NŒ9›7‹á¶‹ǬߎéêRwan€0öýöPló¢}‡]kE'é{å¼ÞUÕ›£=l8 "ÿo⿬£yåçë^¡qRïëȆPM+xÒÀ*Ih4Šó¨m:Mß9²|ÃË£¾‡‹€®u¬V`©È»>~9E˜Xo)8÷Ûq׿‚·h¢â2˜új••õTÃt󅿀)ÚUOxÕËš=t „"d´ÔñN®í:ƒý~ÎäÛÚ«¿_…w¢‹irs*NŒYvN÷Dî«\5p‘šZ½iÎú*^ˆ¹oSÞáUI‰ Q×Ñ ÷µ{ËÉ]–lJ´úÉža¢#¹î¬ªf檣A$Á9ÕÊ÷“²˜­¤q„¡(´¨˜DFö®¬!¦S}B‹‰“”Ëk3þ7¶ ØÞCóì[c7*Ï%–DÌ3·Ýµp¤"2»'Õ{­=wº ê݈TÒziÓ‚á·lšˆÓÍ.z¸ñªCN1A\-FŽ:RäÉf„X¦åÚͬ«÷$Dz ýò÷lß1ƒ5JyC©Ò¥þÐõ…ÀD¨ Ñ[ÚfìÈî<?ågõ N¬J0Ns“ÅÓmßv ¨Î¿ | 9_ï=é¯ý2µµ˜¢˜²ÐÐè°øGÖI«?ÙG=äÒAÒµq¸Ï½‚οö»NÙ‚™.ÀN9]ì8KKVF«»m¸Aƒ.ŒyYsMíUyôޤcSÝúœ‡^öBçôî츳 å•xÙ=HÃÈŠè‘Z½Œqu÷d#zmJÓ5¡íJºšÒ©–¢üplÄž,)cÄ׈Í}tÅ•6ä·æøXuŒç f»Ýøÿ<˜š›ˆÂ´s¾%OOô1ê9h§†™êÂz~J¯t$s×ÔL»Ë|û¢HùÄí‚yÒŽ4¨ιIëûܺ="[Ìžs<ùÕš€5ôà€#Yœq× 0.vÔnŒLØq ­ ¸9a1¦™)> stream xÚtTÚ¶-AzGZiÒzïE¤÷.„ ”B¨¡÷"E¥#Xè]é MQ”*é‚ôþÑã¹÷žûþd¯9×Úkí=çæb70TvD8@5p” H(PÕU·@ ¨(BÌÅeC¹CÿŽs™A‘Þ0\æ?ªH(uS£®‰º8àž;$ IÈ€$e€@€(ý7”¨}aŽ]!À=êMÌ¥Šð @œ]P×ûüýÀ ဤ¥%~§”= H è‚Q.Pë!`w€1ƒ¢þQ‚WÎ…ò”öóó{x !Î |?Ê`õ†"}¡Ž€_#ôÀÐ?£ sL\`ÞÆ'” \Üa(Üû:ÅîE®wkéô=¡ð¿È:ý«ÜŸì_…`ðßÉ`áá †ÀàÎ'˜; ¯¡#„òG ÀpÇ_D°»7â:ì †¹ƒ® ¿[4” àë ÿÌç AÂzE¶*ËD÷ ”7K†/}ÏÞðR}‹Ã‘¼‡¥E¦¡/ŒïfŧŠóÌ-üa`ùã;’¥>¾~OzI“žOÇ;sO&V˜žoÓð«Uš+—ö-Ì׳n±,LäùË>å²EæQ*•,`^¥PifV-„maBœNï‰EmHM }34t÷‹C¿½âÈ ©øŽŸ¾î÷Ä·âÛÀxì%-¨qã²wC ‹Äãž…Û-"7¼š‰µ>q­Z~rÜC¿õ{s„§ûÒ}Þ­²´c~‹ræú3D/è<Ã,Ÿ¢¾Òù |^Tzˆ É~É£E;º•qÚIUð*¼¶oÎÞGë)¥ræ(¡3b“‹ðž…Iåä:gàÓ1¨®¡‹{íðÜn“Á6n&0~zDÍÙîj=N{·n¼Þ,Z7ÝÕAªtH?t*u`¥‚yÂ{¼ [,uÊl o´6 Ò,áë;–dz#þ‘¼h4Ú±Â3Èæª¬@f£A0¹ÿ^+ðènôËš€ÛÙÅ·‘ø$ LÓBµþ®CR¢9„_·"n­´“Kéæú ~ùéûtïÜÄä©Ú–V-à‚&/æšo/¾:øV8:dñ! nO«â^“Þw·`Ý|<Šyõª!v½Dýab%ìëó-ëTåûY/I㬳…É1êFC²owÖ’e3È8ú%xû^Ök3)ª²)È:»ðuLh‚›Ià _²ÍvÉE(ѯìÄäñR³É}ÁŽKÎa âá ž0èK#Âý²Ö‘5ËËr>Ϲ¤EæR×´ÚƒÑ8„j Æ×ã±äO“D±Á—¿B—BØâœ|“Å€Ugo6l}õcwg­¨>ÆêqjmWñ`ÛHÏø½;ë‰6¨ÂõLÝ»Äo±_o‡Unâñ.‹¼×ÃgÄt*-þY¤Ü6øÀZñAèÉàUpvè'I½¯|}‚¨¾’ûåêZ¼÷gÒu­Éçcí¯7Lœ^Xwlt2½œ]CÎÜDR¨NŠTuZîA¾©ö• à—öU°Vâœ8a.èO|ßÃ+M¶MTœ§ï;µDéÓ”˜WÜŒ¦èÕžuþ^óÙYzU`:<ÑkŽNûœyLUñŒíÈëhÊXèýd1jðm|¨ÜâÑsÛ¦¾ùU“„VGÛ¥…ïHrªÙÎäÛÍÍ\,ɹ.Ñ•ì"¡_gÚVy6ô,ïjS’ ÝJì"¾¼]º±VsIW@ßõòÖÐâO—R#¨ŸvQ´M¶£«=›fwxf7Ý« ž5éTÆuÀLZ½PA/—‘:NbÚ DîfU-+œ$>݈Ö®LZÄ{ô95íÆè}· …ìÛšÕÍJ~k±4•½;XÌ™7¼ÄBd% ëÕâ¸ÑæŠ8ÆG­ÜŸE3_ŒÎíZë`¶NÊwîó “Î øÌ>4„©䀀V¶,&gɪ"4PYy¥O’sðÓj â Æ‚ƒ ÖuÊðÂÆÓþÁV®ê=;2ÒáI^¾›1gÑþ´Ú3νÞô^ìP»ÏÊÐW={gïµ5ðV°g§ÿ´Oræ›®6{§x ¯÷:ƒ“Ü :ðFë]¿9« ç†ç½Cw Jé Alz‰ÒìY©›J_æË„}¬à^LåU‹_í¼ØqrSe!¤±/¨ÊšñgLšå‘÷é6½ûóåMX±7Ùó*Ú‹ ¿Ø“ää§õú%íafëUqѰœñ{1: ŸN¹Ò3ѳp4°Ï9dˆ«¦@Ö3—=?òÈ­Iá“ÞÑÐüE[A5ŒPÖÏG¹·]–jßíü¥<-[µ©Gýåe<Å©Q†ªiÆôÞ óÄf*›ˆê$”»ú~\B¸Ã¡¶Öé<‘¢Y CŒã óKíU…/*ÌXæµGàܲÈå¯ú8²^Sy8ÝßÑ-ãD_nA©Û=³IVÁKõ<EâŸÔ»ºyÁ_fò`Ù—†#——}Åy)—Å‚A–Ëmu¸™”3"é‰ï&QÄk®¯º/ßà)§KLÆè¡C£ßrµdÚ&3¨ÕÙË®(hm´Õ¯<íÇ87±ç©ÃV§z!œFœéÜ|d¢…Y,¦;³ÅŸwlÀøtݲø›<âÊ•sûN}«H¸´º¨v½©§RgYJ³#ðv`.ÚsF$ŽŽKz{›‹Z–ií³å¹myŠ}!; ´‹>¯«µŠª“íaUD™ øVKÌô}{ÜZ⢙Vû¶ÅgªÚù=kÜãéQ6š%DÒ#ÓÏ)“qËrLœboÄnØ'ù«õïôb#dÔ'Q_YѺQœ2±Ù1UOlý¾Ïåä¨*—ågò¸ÚÉŸi‹Åáï³l«+÷È—Ô˼×Õ÷ñ›Y¼³^zæ 0Ëâž¾ÓœÀ>$!m•Pc;XÒÚTmÏ:øQ‘†.廫±Zì75Œáëaa‹g^\ÂÕ÷­Çí£ìV }™! °má¹Âþ<úödÛ?$õƒèýÓÀwrVXˆ!”ÀŠSË­æ…üÁ7Å5\cFqA6$*0í;z\;!,dåh»1n‡é|'¤ó2'â6ØÉ(íá@ïiÝâ‚¢üNiñMN¶”×ÍûÈwó0º¶s #þ…lXÍY~½âÝd=úWè…­\¦‚~­ìNwXÃÕ€ú‡ôÓ7n_!©çåPŒ9 0 lpOáÖG‘¹‹ú¬tèÀ×'aCñ©ZËÑ£¤/>Ó&%al X¾0Ôt àjìÉÔÜ-šJŸt·$ÕȺkºM c~ûàVB£L¦&åÒþETËOÍzìÀ-¬x´¹–1Èz¹·‰È‚ãe”É—AÚÆSÇÎ×µìÐfÝüˆÏ[ÕƒÕ¾:x&7Ÿ1RevÚP.‡¥1c­Íì­›yM"Ì­ ßBăÙW›Ðµ4×ë5ÝPO/K™¸iæù8mcØco_p™hñ}afl2Ó2½zlÃxR¥tÚ]­!p)…•*X@¸˜#£Ö|fÄÝ¡¤¤€ÊɈQ*oPŠÑ,I‘ÖD×FÖÔ®£“Ú·yÓÕ1íÌRÜ‹$Øþ8v§$踳͕è‰sI¸lŒŸ7ÀizÛÅJ ‹kÇ1¼9«¸Ã±µÒJâó4ÏQà·Á—N|ÎÛJ±8šúÚ™ÄaË+]ÍDÆÅ÷w2ÆÒØŒ&œÒ6›.ÕߨäT]Á°k8|_šf¿—•Áü°6Ü5ú„‘žbvÃrìˆ9ñëÊ´ýó£ždü&É 2h¿¨åt|¤çø¥ñ}—b…dÄÓ• ìóõ¬ãï"üÚ”}|Þ* MúÔl%[®6Þí8.n¢žTÞc\2GÑþŒÔõ¤Ž)„} ç¥.:â· 'õ´²•zÕÙSÜ\éq·S¿µ9uÞõz8L‡“éäóø§Úî7MTë•Oäm-%©îä¦L"# /ìæ†3Ÿ¢}e‡ÎØ ŽºÒ¬]Ÿà·î´Ô:˜SpræE£Ê×TZüñÈ¡$‡J #}WüãhºÑ'6G†T ~déòÈú]ÐÆÆOŸî~VLë[£j Ê4ͼBã¹öA=‚™|uù­P…[è€Öꈘ³ÜäZ+ýòW•õ–« ›NZÖòhq—ˆ­cô(ßÐv\~Ä’0ÎÂqWò–âW’\³àˆÃ,âwbýw^ K©!MÊÓùÚ-±¡>R¨1Ù ¬:Ûrµué4JèïJ”Ù°…ŒãHß9)$!ºužöId Ï~ïÌèé£Ö¿[U^,‰ÅØæ¤qÝÆ7HÞ,í’h$g¶\î¹oäË‚lXSÄo ×;ž4Ó5>ó¿Ÿg ¼6  ö­} ¤•gÜÆŸ6 MAë:lÚ ãÈ×øÐÉ'£í}ioˆ‡aQ­k·æ®î°Ãߺ‘¥Èb¯BU€ˆc¼<ÞëÈaÆVSòÌ]¼"èÖÆÔùÏf,©¥;rw—WØRÓ„6 l \Rèõ&GÊGAÔ¼Âz~¬ -©·ëjtSŒ¾ '’Q­wïÛY¼›^níØ@úð(Ï{ú@©ùßß²·$TðŠ˜ÿ´Ðl“püwÔaE‘NÚ¹KWN%ÍÅPÇ^݈È8Ø=Í5i>.~·õÃ.6úëýDÁ•Qkx <€Vßꩌþò帢iJFYèó´Ñ@Y $x±Œïypš°iŽàˆZ¢ŽYÙ'q°VgøPéÉË)!vSÿ‘Ÿ!äP#WySùáR5¯•ZígóéÜù>ÒkgxC^9Ãjr2ó€ÆêDÊE‡v!ѶݫÐ(Èò%>×ÛòÏñ²xU•ݽ¸$;ôíðVÓ#£€˜Ò¯V_d&’{ܤtÞ?¤ c/Œ<7Mz†3ñl[Œ¯ÏEÿUº.¡®cïEóJzèå$ÉHì AØâ,þ•7¸†ȱ§\¾QÑ8pE>^lJwOÁUÑ#O(DHåÎÖX~AH'º$ö)®C\¦ó³ØO£Ø Ä4–xß“¢õ“(Ú¿žBJ¨f‚½È;Äñ ²³lšN³x[&ØéR/žÝÿ6½Ë«ó¼é&H\tÚÕ76pß%aŒybMzíUFUÂJ6“ä$µÕªå!6&¹>¬ùƒ~÷B™Œû«ô SšhÕÛw¾¸Xk†¿áÂK^ÕÙïàä/ x˜%Á1¢`d$H)ÃùÎB‡«Ó2Ÿ¶8íZ¼cy¥€õÁyEUU¬F±ÉzaIxœó{ HÄHmg»L #Bz 6Ó½U¹sÕæÂå+}Àƒ¢#œ5eU¡)m(5ìËäŽ<Õ¸òì/ý:. ežˆÙÈn:ÜÐhþ¨Qþèa— a‰ºyÛˆšz]ਸw>§ ˆÂ5›PQ+sv{6˜?yg­Ò<#4?ç?l®ÊÔ¡3ׯVý…¯7aP¢Ž¢®$E¿ªdü6 ‘ŸàŸ9Ä+Z<¡uŒì9•ò#$Ê»µãÆ‘[Ã¥}ã>L<ºGº[5èÈ–åÞ÷ez±"O”k_BÏÕŒGoc3‡ˆ{+ok²AWã1ÂV¼pΟ4DóJì`Z]¶‡ŸêµÀÝÊîœ1BSÅjÀ¢ƒeɧöØ#­ÈÁì!ª{ÆŸüSÔE¼¬dð\—jŸ­¡ÌuÚk´Ëdû¥ªûŸ)ç’xor{Û ¼^´¤˜¹â¸`U¢náéX·á{ <4=òIêœwzˆÍÍÌHÚ µ ¥6Âö—.pÆBa$b Do(K<`g¡˜'ƒ£BöuæÀ¡Q‘½àÊä ְ»-4ÑýñHDèËÉ,K{•evv`Î$Çû‹Hy7£¡ÇMÃÊ'ön‹\‰´|Àçp›K£/±> ŽŒsø¤C2¨ÅW5›–ÏŒSNÏŠ„Í-Üéô×Rɪl»Ñ/\Óˆ»j²3ãìâ=ƒ20ëòVú9¼?øË.ì7î·ˆ“†<Ée•tt¹ñ§s²ÜÖì+¨abÆ«žL^í¦,µbOdQØOÑyž8oþL¦ñ\¶*¯8· é¬_eQΪɘ‰ØšÑ¡„„·ªƒe—jHäSÆ÷ñÈã½$ž™ Ø×§áÄ÷R>Š‘.±ÙlzSF½’sk§°9QÞ7tXð'Ïšš…³ƒ¼;ãÛ3}æ"¿Á@ÙT9í­g÷‰GBȾq§ZÞ=`f-g¿L¸ì÷Ñø¸Y¶ô{¼.Ôšm¨ï¦VòG•TAen‡´Šw—ÐþÌœylÏôݼ¹‘ж‰íç•»g„&O<Ó:š®°? ?ì}óH„f'RÝUíÞìÑPOônì‡>HÚ~%ñÎŒjxýˆnµA2ØU޹|ž,é±8dª–0÷8üÙX,Ä»|»1'^ l»dòJÆíöN^lk@Z?*Ö&‚¬†sÉæ«IO¬ÜµÑQõý®µšâ³)äß±™€°e¸M¦/PôâÑáù®Ãç•ȃ…Ámÿ>·¡ÌŸ¹%nØ:EÏÐèŠ. PÞàT ™- DPÅœiÓá@•™@ …{ Íc âPºà#÷÷7±, W‚ÛŠÝF7*²E‰Çm¡RölWÅ †X\ùo_Ÿ-ÛO´ô™) nîî4±ÅRc½Xɨр<‘sŽY¿7ñ­ÒŒyœ::fërôeq5ïm z„°~A.ñtN4[SÖNz\ÏlŸŒ“kÓ¹Ôý‘½Àº£p'\M³Q<ì.…Åw¿÷ë ~oïìg¥¿y¿,Ë´¾ìÍ[™Ìi 2ÝpA裸öõ0øŒb’Í ÉœïîgÅ}Œ$½â†.a¼Y½«ÕKú1¢à™w_¬çøfÜ)u³½!~ˆ¥v&±’¬Xá¿"º€þÊõj¤Z}ïE#Ì쪫ðʵÿÓ‹êæçO#Yõü­ŸÞü1ò¾Jiðù ˆ…ÓœpÄ·4GYj®S¢È1ðáë<­]”涃¸ÁyžŸ€P^{*§s+AytÒ分Ìt×6îŽØ…ŒµŠÙ‘˜Y“)RøÎÞ}ÓÞ³ÕÙÄ¥9#y™1+Oê°¸î=>RÒ^’e©TžÜŒ L@KŸ«lKÜÌ.Çž²Õ´´0 Ÿ!»É`ÉÖW^žµ˜¯<ÓÔïÚzl†÷¼EžËÍWa$Q¡|.&OÇôÂå"äd.Sì§|õæræ*Ëbo<Ò.ÔIµÆÒk³î+EJ“Y×®ÏóªI4Jð˜WàËÚ9O‰ammtMó…vž9ù§ïÕ²û—Þ‡›´î² ‚LºÂ(GûÑÅ£(Šlþ·ôC½åɾ`*ë`àÃ[~‰½TgÀhâI»ìE›«ÒJ?PM%å{/Ì·'!–B p¿®RŸ×m¬b½k´üX0]äi§ùpš×žâj½gÅ`þGZ,!+Fý —µÏäåñT*Ë,º™‰ãÂX…©J1, ¹&±ÖìkÀSéVò¾Ý)Ô¬vAS}½wWÒ\uã^gHè–ü¥Fy& fÑ-N|žgr`|z ©Zf<Ú'H/Ÿê}"¢ ô«ÃÖ~=iî©ß2ŸNì¶¼üI^™v<ÝdÄ¡,®"éÀ¢‰h` EÒÞ(öê€zhå‰ýH™ªÚ9&VXðÁÆ / WT %­Vëñ‚B°Æƒ|§C5 )ÐýÜæ¢ñ¦/~p[có^ˆàÞß?uÕ½òF÷ÜÎç–‰kÔ®´Â’Óªõ;.ÚP >N²®ã]­»´X¡,>¯ì.ܰþ¬Dù{<ÌKd‚à?£]0&<% Úx—L\i;k-–fq»Ryhû¤M ’@©®ÿÔ_%ÊH¹Ý¯võ+Ù:/ÈžÑí-öÒÛúPý‘Ьú¯¡9 &' ›ªáV¸B‘lÏ/»W ¸ŒJº“BÃDîed¶ŒØã0­¶ƒ;œ;[æ°N,r 3_ù~R…Ë`$0Ì ]ifg[@Í.¥ÜãKÈÏ‚‘tñÿíÛî endstream endobj 1122 0 obj << /Length1 2211 /Length2 18035 /Length3 0 /Length 19366 /Filter /FlateDecode >> stream xÚŒ÷t¤kÓ 's‚‰Õ±mÛ¶ŽmN<±mÛœ˜OlÛN&''{¿˜ý~ÿ¿Ö9«×ê~®ÒUußUÕݤ„ Ê´‚&vF@1;[gZF:.€°¬¬$#€™Ž –”TÅÂÙø9,©ÐÑÉÂΖëÂŽ@C癈¡ó‡¡¬-@ÊÅÀÈ `dãbdçb`010pþÇÐΑ bèja¥HÙÙ`I…íì=-ÌÌ?xþó 0¦0rr²Óüí´:ZÚd Í6ŒÆ†Öe;c  ³Çÿ„ à1wv¶ç¢§wss£3´q¢³s4㣤¸Y8›”€N@GW  ௒r†6À—FK P1·pú—BÙÎÔÙÍÐøX[m>\\lM€Ž€v€²¤ @Þhû/c™Ðþ}8F:Æÿ†û·÷_,lÿv646¶³±7´õ°°5˜ZXòb2tÎîÎ4C[“¿ ­ì>ü ] -¬ > þNÝ &¨0ü¨ðßõ9;ZØ;;Ñ9YXÿU#ý_a>ŽYÔÖDØÎÆhëìûW~"Ž@ãs÷ ÿ÷åZÙÚ¹Ùzý™ZØš˜þU†‰‹=½ª­…ƒ PRäß6"Ø?23 3€•ƒ™ƒ tÝÍéÿ"Pñ°þ­düKüQƒ—½=Àô£  …)ðãÖËÉÐpvtúxýSñ¿–‘`baì 0šYØÂþ‰þ!šþ Ü¿£…;@›á£ý ½þû¤ûÑa&v¶ÖÌÿ¾bzy!5Y -ê—ü_¥;À‹–™@ËÄÊ`d`b°<øüoC‹çÁðÇWÒÖÔîÃã_ù~ÔrvýwPü{B(ÿLÎî£uŠ?®ÃÀÊ`üñÆøÿ¹ßÿvùÿ׿Eùíôÿ›‘˜‹µõßzŠüÿè m,¬=þmñѺ.Îc k÷1 ¶ÿ×Tø¯Ù•šX¸Øü_­¤³áÇ8Úš}´4-# Ë¿äNbî@ gcóµÍ¿äª œµ…-PÁÎÉâ¯óáÅÀðtSflõ±Fœ>zó_*C§‘sþû"ÿÂÀ¡úß&V6€¡££¡ìÇå V€ãǘšÝÿîn=­ó‡ à£f€©#ì_ÍÆ  üKô/Ä úƒØô€^äâЋþ±3èÅþ F½øÄ —øƒ˜ô’лôôÁ.ó}°ËþAìrÿE| ПâôÁ§ô}ð)ÿA,z•?èƒ]õú`Wûƒ>ØÕÿ v?è£vÍÿ"Î\´þ ?Ãÿ¢@ohmoþGÂùÉèþ#W# ó?Ô¡ÿ‹XÿBëï?–=ðð#€é?àGµfîèCiö×÷ÔG‹ÿ1ù(Úâð£jËÿB¦Z¬ ííÿIø‘°õƒzkC#“?l>ֵ열mþ¸|daãò#ù°·ý£ýÈØöŸÚkû?ðAnÿ±;ìLþ8|äoÿ?®ôOy;ÞÑÜîêó?©1}ÜŽ“…Ù?”í£ 'kC'ó¸|Äpþãò‘‚³á?3ü¸þ ÿg]?&õï ú1¥ÿÁ'î@cØå;cî Ëú Ž‡ZA7Úý ˆËÔ &Ú‰B=hçÑýíxå¬Ìér±åŒbz–ÝrBÙ‹·^{ ,¿i ÄŽÌŒbÞƒÎ%xÝã-|nÉSOÂç*qQÀ‹@êá71P&ýìM^ß¿”àFö¥TŒ]*¸C®«§¶4S—SílGɹÕhXeŸõ&yÎŽMLàn¤NXŠ\:‘4O×#l¼[ ÒÖÐèðò¼Þ)×€ý+’oÎÈ¢Üø",P5jkùˆ/9%®§é(^Fâ¨Âèʲy„J˜°ÃÂù‰­—˜:/ÄP–™aæ °§˜Ÿ;óÓ‹ÌíüR™Yû9RræˆB̽LxÖÅ”üºZCFg0î—!¶F÷¬áz¦Ú)2‰½Í+Ko|¿Ž *GX¦VkÑÒ©çPó~ P¹3ÀÝ·Š3¦ð¸gÞ¤vs©ZÌ,'p“ô|¯íÇ9Úƒíèl¸T\2¼ðœÓihPÄ¢X[ ¥Àš©î 8„sMT°·;q&B%&%bì\ÄxÓë5ó'ĘÃdgÂAO;a…>œÜ°;¸:#Á ynîª7íÍL!˜ní¡Á×{N9§|íšêÖ>}HãhCQ¹ e1­9ðGmÍ.ŸÁÅ̹Y•ŽÐæ% a…‘i+&;yž7K›ß "cgC#ã»ykz¡H‡ñ‰çÀÓ49¦ÉSIrÊÿN´Ò1Ío»ÌY+¦¶ÔJøˆ6¥Ñìu@¨gæ]åúkƒÑ+ Ã9¹æG‚¾ˆ=A8W¥t¡Et–ȧô¡œ4z# ƒ(ScC¢ì®±$c=7lhNÑ&'À½ègÕÓ)èeߨšOÊg)ÅÒ¢ô=›_Ž/Q$S¸ûLT6–’y tßî¼Ùª÷E— $äÁê-(%‹;ÙVþòïû¼­br̤áÊ R-mí{·àþ€X· Ó"»Ä‰_,°À1V¥ 'òçðfö!Ôý*ÄÍ[ˆmælß,/¸¸$m+pC¼ä^Xï¤Rçà^Q,à ÝØ}ÌQÑv‹‰R k™žjÊÞ G ˆ¯E¸í@dî¯HŒî”äPž¢‰X=ÈÕrêBNÅU9”}j’‰I;q ;ºR8\ÁI DÁ+J™ºU]_æø ‡B@ÝÐã©E:Ê@o>ºÛ÷¼f©4ö…() èÍØ¤$ϦJ¡5¯”º$1ÃtsR ‚Wó¾bY@>ÿåy¸Ú²˜;ÛŸco¿ïxðÙ°€BÀ§ Þ& P21ÛÅ2}T }3Je n2aæ,Ž™Óû|»?°af–Å ýÈ4?͆¤þ=ÑÈFv‚Œ#“´†.È#í‹ßÆ4­ç<¾@1 r†püÉZà W1¹ÐQN½KÜ0yë@ò’dª"¢oˆ(ëJi-åö[éJhZ­x9”ŠVÙmüîÑ.NÎs×KRÙŠI3Ÿë|…@/Ö’Wÿ9ñ÷æË—P¨¥5“å˜4™‡¾DNHiÿq7ñ]¬3•9è¶Òt¼+Ñ qHœQì*ê5ñ솭‹Û[Øu·OŽ+Æìå5Þeu©£À ‚‘A–Já=\[oy¢08›Iµ£ÑŒzøÁWËì§Ñch|„ë‚»Œâ5ÎŽ¥nÿ•"«ëvÍ+”*j0hÈ>G§¨¦ëkkõÞœ€:s*R6ÁÕVý°;RÊ*-ñŒŒ­ðZá„§–pØ0>ONØ6'«þÔÏó»vñ@§!­idžxæ€:‚DX¸Y»lT>èÄe³IL3+z+h¹.V í=†quûTgÜJ(¿}¥i·wj6£–Ë>ÜÚkßñ‘ìqíJÚÒf]^ó©’ÎIiÂÚân“Òˆ¾TåMõ‰†‡wÁoõÌ! ¨"çÐc%3æ/"¿¯ü¯YíA¾qqoŒ„uMiË’sÁpÎ~–}SŒòÅ}a"xš?‰ììlºzSðò¨Ç¡oiB×Çø¢û³\ýÖÝØÛoeÀ²k‰èÂ[Ð’qÃbÜ¢ZX›qk.;He7ôk5K)³ïLN[€+éPÛwƒÈ›ý(¡ëBwÀüFÑY1V†Oè½”TèY„Í,kMê=ýؼˆªMÅB>Ôri~-.÷G–»~§#ÕD¢þ[yÂelÆÅ—ƒû¯º(ÍùAGòW{Kb,'¤­7Å›à¶rIÅ÷:Í¥ÊýæC]Ɔ«û'½»ìf¯×ƒúßΚ]Q%öTnÌ3Ìlsß›Îò'ÚðH׃¬ä,hf‚­Ùnæ æEAŽnWù2kzV<Ûù¦áUÁ>3F3È&ÑÀ,ŠY¬ûÕ$u†ìó)pÔì³Ã”€Ú£¬pI;JšíZÉÝl¯'M&>‚J·4ÛF‚±ºç¸;cM}Þ8Irªõ ³ø³ßë)Z­:­A?GpÅ Fw“!Á1°V—Ù¤8J}§~a¹Í'Ù`û¯J9ó{Î{Œ¯òçsnNÞš9‰vìáCˆDw<”< ”ûØ71pîJ=¢hYÐ÷û`ÕY.§V¸,Ëâݵ²bèp'ã…v¾×öØtÃ;) €úlj‡Üc”ä…!ãl¨v¤^?/ £¤•AŠYoÓÿ²I†ÿ"ƒÀº ÝÔMÚ?Qœ€ÆókëÔR<ù]FZ¦þÑõת¦OÔÏ¿*±gQ¬ñMÍy˜Ûj4Þo{³C*+Œ¹~؆ªÆ®•$`?Ý/âéÎ j%£úUSŸ‚‘Ú )â5µµмwe¸Š‡â[«²ZÈ½ŠƒT"%¥(>Ë»Ç#„š±ñf¸ÀÐ@<-ûÙ(*1 î©HãÔZ§µ-”%½àxÜÙ5˜r]U‰^š3,Ôn‰Ú}?§9e!,Ðo£¬fX¶^q%ReІ;aßz3 D¢»ãúzKI+kÒçøt ÛkV2sóiAŒ±y¿PÕCæy–=Üö¦ˆ œ5GgÆ9ï‚P:áu!(ë°0‡&Ž´«üÊ¢Q~—2æõ&O@Ø) ¢ìÂ>¬5Y9=Hˆ¦ë†ÙÖ¿ (P×J[§c` ZÀu¼KbTü»ö ßTA»W‘kûª“~—A]k¨Ž5¦4¨?»†‹ENL¯_Ts uÎiÆ‚Ko/z^µ_7ªøÂo.’cŒ©©IÙa0†æÈª3fp¾ªOoïôNÕèEº5gƒd&5Û¸”!ã‹ïÎ<÷SW®S`7Qkž]d'áËáÛeh¹ í!¬(BßMè¢D‡ [Ã-øT°KÏŸ¤2¾Q¤iÏû¦„l¨¦}“—ºCXÀGu9{uw>ðDqv ù÷åi6‰áɾªrÎå3áÚZÛˆ¤‚2UÊMâ‘ÂaC+¯®oº~zZDŠdž'q}eae‚’öi¿ ¾K Úw/Ím¢]\@ÊÚ)\úµ\œh .÷j F¬ÔßúSšaëȸRðâמºáЧ…óeŠ‚±ºä—ÖÅŽ‰Ps¡‰1ó¡¾€jt‰¯aî–1Œ<1Ùp? Ûóe­¿ûÓ'TΣñ× ™Ù:¤$pdCErØ º¨“D4Ûö§â­¡n[\»ºê«zaÅÀà(·”"øžÚ6ßõm·‘"É0­=̾î}gg ^ [.©£ "#]él›š±™­•°Ëi‘§åý:÷ÛÉ¥£ {¦Æi'ÛÄþnsFÂxWœÜÂcÖBº¸ªXªý„‚k¡s÷YÆÌ5>DÏÓBÑ߈œ>ô——¡AÃŽþJÁ‰µà.?N~‰+ wO/a6b¨œU:ú½YN_Þ Lj.zi­DƒyBFøs‘¯AfßW-WXÚãx#>Dåãàª#qjö•ñSÉ]Yø|/÷a&þ|û²<îWeHLöˆ)J\lÀaIÖ·q¯•ȯ¤9‚”ñΖ5vD\}ýû˜æšž¯P|A÷™µ.´Û`fËIåŽóˆ+¾ü¸ï沘äç8-ò„Àümt<‰ãÑåSÝÎÏÔÔòµ›KÕ³¡ëi‹­êg ÇÁ¨‹Ù—¨åƒÂ–’Ý_‘ÂJ›¯Ëå•NÐNº’di£RÔgïºþ­to™C³eTÌ ¦«8§=B8y¡±b社+¨ó°’‹w¯ß )ùaKE½öŽ—6 Mo)¬ñ="˜~I‰¤ÜشϬ0\¬p™1 [³õÈ:Ê :¹ÄðÀëU—ã™Vׯ¡F­*Ià® „jû5ëê6º«Q~+ý‰Ð~Nô-!pëZœ-_q|ëÍ­g^iö³/lÐ+Ã8s£4¿Äóå^I®©ÅÜàK¨7NüÜý'™Âò_2nò8˜n=-Áöê39A ¨ß¢‚8‘¬|  håÊYó½ŒGáÄB¢/'Çš¯ÄI1ÉMÈgÖ ü%Õ þñ–-–ÿuãÞr)n_ï IãfPoúä¶k¾È”A¢`|Qû,龓 ‰nþ%Ee q"¨¬›dÔ9³Á¬_[±•Y2p’Íêöˆ’$ì9²Pé{ÀEàð&¶2­yLEBùºfönÙ\d+]+‰“t¦«Þ¸Ë)ñ'Æ%kJ¡&JØó³ö5g¯>ø†øtɪwAXº.¬:Ó S©ÑG³äìBïf´Ï.“±½a9ÉJå?î6ºÜDQà)ˆ?žÔ¡5!š÷kÀ}À›|_俍EÆx¯´Õ_Ý~Ó§I¯[°mqÖÿé*;½¡K‰/æÜÉù¿Ó¸gƒª®ÅÔc®L¨¨0hZðxŸ#–YP›(ÙÌ2±ÛÜkÙìÇJJáîÔ{¾a‡-¢/òYÑz0{…µ`uüä#­ý¶>²‰#,çæÐð.í>Û™ ¨ö¦·\ªr{›yk»Ê ÎxtÆKæ ϶BLš¹;áÛtU¸ûWþW"ñ/òY ¢Þž±ÒSBÙÏÉàŠç$)ÑÊK[^Åg7œßÈË·ÂJøØ$[rï)ß,ŸV³O/!•„Z)„ˆ—pW¦zíByõ^7ñ²® .?‹d¦V")’_ ®‡K![”˜8I6§"šUc—º›â>"ó]9ÓcÿfãQU ˳Q¥]§›¶~˜CÇþ–œÝ+Û ‰3X03”„6?(Ù~pw“¥\ƒš¨íKÁ±kE–Ú&Bsùha”èhábÁmc—êp¼FRCZÑý )*ô )×ì„ÃxÅr”1³n(Eÿ b^˜C'¹V ^’RÓÔç]Ë”Å#æ> dæêe4¾Ù‡lU×-‡×«º:–ô+9-=ûY·†~{ì ýˆcèô¥Îfæ«S_Û9ˆ¼9K_ß—lëÛnÆ%醿aæËÎr„ž©sØ‚†2¾>ˆ÷ÓeuÚÅSbÒÚJéãâ*¬š ˜( r×K¥a!/¯^ûmèEY`«~„'Õ®kž+×üß—`OΑÑÙgž ePtd´øÔ©«¤ŸçÄÙ,(sÏW‰ƒóAˆ ííÔg*C¶ˆeÔ¿AãÜFKÞÐ× Þ¹_¦·“¯°e< bø„Fp*:áð,눋þŠ Ñ8VÐütÓ1Âø‡ÃÕ»Ž7.WWõ­ê´vñW²”ÒÆA[ > ª¥³,µ”Ñ&Nç)ûÔ–Ù¼˜‰òž©µKŠÄTyã]â|Hú’_h{¸±è·{®[°ƒžzñ›Ê"ÒùNZ|nÅÕ)xv˜Ž]Zû·Íþ©z§ÃEòyîíÙ›t‹ou.å‡Žó ¯´÷ÄAÄ„¦·HQ[ ¿KÏ;ÀV/Ë9`µ''¡CPg¬‘#±(t-Á׊ûϰßmýE1F‚?ñ³›öÄÏêÄ ^'!ƒ¼“R£dåÖl}I Y ~õBt°¤ãk(@ÞÐÁqd5P'Ïϯl•4Ÿ¬Òh4ÉîÁWµvøa×LûPQEÖü¶Ãê‰Ï]ç*ß±Y¯½ÚQx”–Õõ&pö:!3€j࿊ÝðA}ЗT‘}ÍÀ VÑd“ÙÚWÂV΀ÎIu,«oÉuö‹¾”g©;_ñ<ˆf÷‹–°3¯¼ºú ŠÊiÔ»öÔ!´¢¾‹í¶#›[“°Û!{ƒ6÷Gí)èÕ•F¬hèP ‘çÚº ùðÐú-cZøÒœ”ïWƒ»kL¾b2¡\/èÉ3>›íô¹8Pï–¥]í–:N÷ªÑüYøÍ-'šÇ¯"eGÔ y¹öe–Y­˜•9>Yïý 1eë]ý,IûHrÆŸ8T°èXâ£vUÈuZ‰(a¥ÛèRߣØhFÀägë³÷ YÃ2õ«'ñþ–aH,õwÄžHš5u*ì-»ƒîEÑÚ˜ VD¼KÇ:ЯÉ?…L‹Ó5ïØcàçT‰ììÎò\ª ƒÓègýÈ’ºµü¨ì$÷D‰ƒg„õI÷Øëst»Lñi üÇY ç)ŽÝE)ÕiŸ48Úµ½_­HÊ†ïØ‚‘bt'"yˆ¼é›Î½Q{ã5ºàñ6ç¾­ºãíÒ𩸗 3 ßZðJõêqàlT¬8˜&&Õõ×>¥±Ñq:Èv ôtð¡w_`›J&,ÀÄG‚&î’!Jb¼Ä ÷0­’ù¬ãɃcuœ‹¹­1¿a3ó‹Y18¦Ž9ňpXûeIãý<'÷,1 ïsL$Î Ò¨ÚÞ–‚jP‚Pí~Íߤ™°ÙÛ„%W±xE‹Ôo´,‘÷ÕØ©t}•].»exýý³ó–o/ö (Ús%ð,£ê±Œ1ü[²@³…ð‰ÕWíq[Õ4´Á<’4Ô;'tïÆëÊ.Múa爮3ú›}ý^ 5ïØ|’¶z9®Y”Ó«ïòa5‡/!ˆ®ÛoÊ£X^¸·«´¶‹”Q]­ùI{ɃÞÝÉ+7Ñr;¨ÅÔqIDI®½Ü_µÖJÈ`2+E•q£Óäf>9@ú˜Pç¯ûLà`.lø·/Å9ärp•ßÚM15ª(s¥²É˜l‰Å¿ÅXµMnäIc^\éDîzoœXâ~èòDÓO•ìöù¥OÉ6`/!•ÇÜM›EZ;L&ïÁÈŸ€ÐÞM×·OÜCQØÇYâ² }ç0²Õjœ¡Ž1¹’¦ïz®ñ@•Imî¡Ñ1"Ž8Ót'‹_Š{FÌØ|>¸ÖY%qÒ¯BJ)°ö`¨ß"}€ÇóöEmþ]};bR¢l.Yx³]”BLðŸVÃ^»çÓ<‰`•ÏYLdj©èÝ}oê<©„*jA”Á#äC:vþ¶FËé}L•ú)o8(™Ž_™¼û+I¾*a…xÚùàð»Ü@Ð|òFG~Êg"!ƒs1ž=ÈéøYÆ ›ëaoëöÀ"hV#rGˆÆ@‚ð…«-³5[2%LȉTf¼„¸ì¬SP œû«Ñ/“¿g|ú—¨3‰Í!ªpF}“7·Èá¾Ä²Š“— rOáW7ÜC1ãŠq~Ô™$“à—Œ´söK4æL^{ï@ê났†ãÙÁ”7EáÑÒ» Š h`ž1­[¡ÅóTÀÆðN¼¸wÇýñ³µä>†ÃƒjÀ—3> —}'‡ýQ|?Έ«"ü ˜¤ˆ@i2IÑH'wÒ¿m=…Å9˜Šàè^u™&ÀQëŸG<¨ (´Æï¦ñÙ1¢l;»Ðózi[¡¨3 ÙºÙ8æçÿ&#ÙäGØ HYgX´œÌ¯˜E®¢¹ìINAˆ³_0ïlÑ×F)z®8£oÿ•Z‘|§[<«ÿ}D•»òë‰%úï ì@¦_÷&‹ a t?x?‚§¶ øßhɾ¾²gsñÅkg›u`²`_~ š˜z…% E;2ÀÒª]Tšñ/´ «¬”SÞXƒ?ŽºyܪÍT®N’3ô‚:õН§»ÁÎäcHîàÔą줎yVEó75™¢÷)$áSŒÀ¨cQ5étPé®<"ÅãÀuÉŠÈÎ->Ç·âÂõ%&[éÆhÇÑ3lØ8‚¦ÃpòÏ“uns‚·sýPãås‹†OÖD •-4¬°F[»SøçhK{g2È|™³Åú‚õ |QrGBtXFT. Qxt”¡É뜴š»µÚ¦ìlоÍEbÖ‚Tñ‡¢±ÇUQ÷L¥ò¤þjc)¾ Éù­&ÝjSã •Lµp‰°¤0ê•^´WïN!ÇÝ—„#àª5ÔjSúºÙ"ì÷f:îâ7Q\Vª»€ÜÁ–‡…®þf½4‹Š…©w¶ïW½”!J±º¾mÓw]õy¾m¹¨W+õ}›R&E¹‹Qǹ™¡Z{v¿Jʼn¤NŒ›„-¡B%ܦ 5<½ãr©†;£ñg´µì Ò¼–½fcÑ¿Ï>yé*ÀÖUÃŽ,& ñ¥É•6¼^ d^5P0Í€A_û…ÍN—L]kÐD3žÊ9NLw!JÁmçœÔóäMv³Zì¾m`¼‹QŽYèz3^ÈÈB̸¿ø¡µ`zÿ°Z.íÊAæ{ç9æEk‚S½ÒúNœ×XD`þ…=˜sPÊ ¬„¡^j>1Zf·>MŠÆœÇ«Ê™ëFZÂ~SØøJ´=Î ÊÕZ–È?eÓ³c1øFw·éÜIWR¥ö$c‘nüÕ³íMË€MÑÙ.—¢›fáz¦¨xH’*‚k¬£©»ð`>¼Òv¾!øüÀ’^ÓʲjX@ÚË>qðO&†;Š §ÜúÔ@=Þ£Ø%@Ú˜lÒRÙ(´ŒIêY¿É†Cõ¨!y[“-Ôllˆ*‰Ú¬#Éð.Ѝ£…Ù|^Y˜s$Ô…Í'¡`Œ$næïæ0¥Cs:̆,"]à³WF€˜¹ø’¿Y”áSï:çuFÇ£Û»[Hx5Àšþ¢I{á­ÂîæWûÊì4 Q°šûÔ1µž•oþ]"Õ·Á–§F¡Ý½å° ¼xn5ïXÑ•È9cŠ3Õû½ü°MÓï'}ªëòmdSåêšú3 kñõ¦€Ôƒ¥Zs#„ü·üèêt`—LH\Ñ9œ¸²é.JNeUíHãÀ’±‡xã¶Ýêd.x¬.£î&øÚnS‰I L#*ç™­ogKç`d*¡q'¥Ìˆá^£…<· ÞA½“Ãrtô¡¢Ü{—r¦à7 ¶ÓöŠIp!“-â&)áÍâ<>†I¨Jâ6_Ó¬ÎQlÉt°\Ó•4¾‰+Ÿ”³œ -ªa¤{ÅÅä´Ài¯«ÐUDí$B«;ðGk•?gÓT™8·i T ¡ûߖΨg˜ür™ëyÞœl½Ù”ð ©=•¸ª ÉdUóâg!yý-·“|ãUmÁl¬ *‘à@!O°´‡§ÝH®€fÇD¨*sñ¼¤CÖ:Düe dnW£å4i&9!@²ŸåèotAyùH‚ìËšsè=¬ê ¡•>~pƒm·s‹|å 'Â={›wbÑî¤Ð4ñS{oœÝ‰-ìÐux*d·}Œü:y¨ßVfcòͯäI_Š$ ôú }AL]˜ˆiªÚ_Z¼Ø…ÎdÝç +Ò+ KÂò‹xÁ ŽzáêjN¢I6LÝ@ LÖ@V°0"Ú›¥¼u$pŽ©9r“„£o‚dØAolkD5áè·nÅ1Ö¶½úUä¢7hy… ž®…õÈê§òò UƒîEí8âÐÛô#˜vOâM¨ð8²‘qÆX?4—m„`Ð’\1ˆkïõxT<S†¨1ÜzŒ ¢ùâk¢\‘ñP †ÄNÆÊýµjêDr;ðg§1áÁwé é¾Óú:É(kˆ‡ØQû.¡›žÔ_Zº][µ—Àë͹a~©†õêès¾F›¸Ã5¡HxÐ4Ç|‡NQ²Í^–¥Q3ù”¶^Ñt¢.SL“eBCÇÁð)%°&µÇÐÀ¸Lþº&pU4ÜèÆ².ªÔ]ÞÎ~69æ}(zL.ñ®}€”^šÿ3$·È&¯-js=ŸÎܤ™æ "dVNdÈw- Y¨«ÅèÌŽŽÌòrMrGŠU†zÀ_Öµ±Ú&V1»«iÏ^‘“p;l«ˆD÷Xå ?òZÙZ ×Cü5kZ§%ooa§h…ßÏîÕŠ%6¦d) ýÈ#ÿrO–ÞÚ 6•x·>o«Í öÕ¸°ÿˆ\ 2&iëæ{n{*‰³8Ó ö¸’s†U`ŠÝü_®%“äQêgÖˆŸûù‰(Vë¿"MÏ´y X@=Ê6ǬU¾—5E„ŽbUóÀM¶s¡éI‹)4Ks¬¯ƒ¨¶,1fUV®Ž0¥¼iÚ¨Aœw̦w~O9çÎ-œK-È ­Ì‡§ØˆÖdÇE„òNÊv©ñ§™J&§n`umGóWùxžBšŸR°mÏN²ík3{Êj4h“øEà fz¾bvèÂtµ‡w†A@W‹d€‹õB#{€+;˜u9àÍùUœ•ã@óMäGÃlÛê!`{>›s²e¬ˆû/YM ´… 9ô7Áýà‡SÜUýí¾#¬£¬ØÔ©=ëkÙ¬¿nOQÎbqš1•;ÒÁHÂÈÆ¯Ž‚V/ˆî˜ Cç3¢K¢·h.Ä‘á'¹ç”­rLç²g€Êë%m餉BQ²Ž4™Qˆä3@>¦Àüu³¶þ)²”¾cáÕñwe죧Ú-#—™'zÛ ÖOÜ‚^¿½ ÈÀ%M.„ 4s}®ö»«ºQ5Îî õVÁr:ˆ¢ÁÚƒ²|yË5AhBæÉàç}æaºFO@|o›ñ_1¯äÂÛ–øà…ƒ/Ö|Å <²KÕÃúÂ5nè«@ÈõZ°4Úuõµ?«CÛyån‹¿¿ÏÜ›9¥DHÝ+Øår¦péù’TQx\J‰J_š|DO‡J;LšþHŽQh$3 §& Ž œ\¼1óæê“[œä–Q€ ]º„Üì¬Dö²ù—ëY‡È ôeÀ‹šøýê|ÔoÝõ‚¦ßÎsû’&†æi¶¤Êóm`¹S$‘ÅFPtnS‡w5Ý-¨4s¦V÷´'s\HJT¶FÍR]Ðæ‡šPâùþéc6¥*ž”ñ\g9_p‘†ÈŒˆ´„ŠÛÌ;•ï¨JÖ}ܳ0Å®µLÚºD[­Kôe2² f3ñܲÀøóÞêh ùuwúv¯ŒA)a”· !o_žñU‘³[ÇnÞºäÃ! ,BË'Î*ÆëˆŸíÐ|R1 ¶t ;7´~‹«ò¦d‘v´´ø)tåËLt{a«¿U±é„)óMžÅ©|ºäõ†~IÔÑ‘xˆµÿ½Q¾_=s5“®• ö¸ó{g3(îý7ÎÖ¯,”To¢VÌP™Wü3§¥ÏбŠÛS±Ï!?U™„Ã@ç¹a#ƒ…Wè‰Fbr{™Zá!ÿF% . `ZùÔ>–ÁÙ!½®ÞXe8,u:j»ÓQíìo+cò ;€Rš«uc‰‡is$uÆ›ðçWåG‘¹&4WݵdB vªsyõo´¯u¿qàm 8*дA5Ž…MÚÅ—‘Ræ_Qð-í:êùKln­‹ÚV »Þø~¼'Q¤ªGýÑ}Å?ƒ%´Ç¿×r©4Ž}:‰Ùå÷±¤'¸[€tp¢2Ï)ÖÅã50…ÅEÌŠMvHÖfé€â-ÖlŽü^Á†Fɱƒó¤@¢°+W^2A[Y¯éÀ´¾iT‚Ðæ ñ…D~ÎHQ& þØõÑáC0hÐÙ:ˆ£ìäôo¤f˜Ïäò¾ëÃë£S öú±OÚáóø“{TÚ‰s7%\€=õhá‚Nãu'֍卸‰jé9R8ΘÁ*>µ©" ÝkÖ먎¢äèü½çu—!]\ƒʷª%=.v}õ¥†½´Ùœg|Xa>£”ìûvS¹‹|ÄÎmÆS›Ž âË~·~‡ý†Úµˆ„ˆ/w£çMn5§"šjKõ‰¯%s#æÞOÕIJhT¿µãV0Wîᆅâƒcóõkw¹4Ïë9ç°CïUü=:Ù)IKét< "Ʀ®eì6ÁE›5 ³/ú¯vÉ-i:¹0þ§k|\¸.U~T°a&’ %O¡O˜Ê%þ¼2‘Y:”åbütÞv¼Í̱éÒK¸=ºð|¨Õƒéj8 ÐÉŸ(9~|ú|Ë vÇáç_af"í}ãmì*|ê$Š®lXÉgW:û¾lµ½&°äoh¤¯p“AæJ-¼¼8[B@]n3GÞZCtH^tcä]{'=Fî°Ã›t(vª,ÈJNÕW¾Å-4A¹Îe­òد>ŒÔ+@Y"úy€˜%²ýf(Çš6;ÄÁ¦R/ ŠÏXµ3À1 ‰áàÌ"Íñ=jïx<é6wºV¿’?c¯€ë¨@;OCZ¿$WEÄQh5K‹OºÂõ«k—¿Ttpç<õ´_Ÿ¨5ºR@aʼn=Üuå»Ç$x:øvŠéïiÍ×ó‰ß’åFÃ`ñ‘râv¯¬¤;¼¿š_oW¤×6ùUê£$ñe>šHF嘂K¢k¡ï÷–MÿÔҵРҕÜ9­y®¦Íóp³rB.!Ñå7Cût¡Ú¿:J…䯭áò­l¦Fø3¶ò׳ÄPÒâ‰ø¨—a»àzÐhwV"…Dd’HöÐÜ<™k[>S’í¸èî±xÑq”äÌ(­M1pÎ3Piç&†'nÇVÂÛ·"*°™ šŠ­¯ÐÒÐ÷4ñC™»Í~[ÆyËXeh¤¿Œ¬.!Ñ–,¿4Hl #GȸX ¼Ç”;þ„³ª¢8h™}? 'ÊÓj@ŽÕLEÕ;¼8Äÿmƒ5’—§3ê‹—Ò‰> #z«²ôc5Z*›ô;¢Lô˜á÷R-œG¢ZsŽî[b%WéeÎ1iFH룵ÓçàN&ÜÓgÔÅÖ˜—ý_m³ýïkÌìÉ€"rW7V$2!Q¿SºêL«C¨V& „Éwò G 3 3=£eÊöqº‘ê ÂÅF{Ïi¡Zùm„’þ&[¡sBtÒ²ä¶c ÉäÁÊMèU¼tÒ¯Ð$Yæ=ËUˆ eš?ÕØv“š‹m¼º§Þû‡ÄŒRz…iV&¿ÁE&3¢ðºì~èlµ­ÁÑü:(°<ó»ï.ö,îÍ#†XûÙ»Åáâå¼òâeÄ KYÝ# ­E)ž9cnbš¡=ÃŽŸ¹mɰ®˜´xŠÏ\úã_No}päù.:NB RXö)STî~§X¨Úþl·sú²Z¤1‹Xê±ëö‚aÞWºT?Ìïl?{v]%â{å¿î¸9 Ÿš¾Ýb‡$LRí¦]v0Æ>Ý_„ª ÷AÆô|884¬?_SÓÑ€FGØÙVnã§Ž90Ñ œ·4SoÎ däXvÉü)-÷’Ùý«sDQ&ýz‡;(,°©åa$.3F;žåD'¬µ×#Sv±ÛI5‡C>òݳþ’¨bK+„q ºf…L‘Õ“½J4êq#rØüÂ\ÒÎÌûI´jŠÙ&vˆc=C`QNÎÖ²{h¨°[ö÷ÂV9Æ‚>Q×A›Õë—AñÀ.x,†w$gÑŸ ýÊ/T÷¼¹W³½±v¥¦ª>ÓÆŽç¦\ŒïLt Tû5^»L~ë—¼o¥JºÅm*öó èª|xÙtt•úKt¯(cè°Zq ºõf¾q –ð‡R>}¤lV¤O¬ÙØŸ¦O2ÓâY¦£xQ<;ãÆ±“aŽ(Mщ ·:§ú"=ÉΧT5í'•PTùs•¹ÔÝ) }ÒZ@®­õ¹ì¨ËCa˜¤#¡Òvò\Èg9– @‡x~DUýJN/sGÄSYFÃ|×>):õ´‰ 3çìV÷ÕÏu³WÅCiÆæ1e]jÀñzôßíL9uLDxGëjüöú}}:Ñk§ýñµþ°ÌÌô¦ç?†¯SG¢ûÈä pò `ʤ÷À|m'üˆ<÷ ¤p:Éãá“Dà?èõ;#")>M× ©šƒ„Ø É’mF%Ò Q°ŽÎ@,UVMZëÑ‘À ¡– Ô!“#K€£]—ËHBý mFŒN¡‰ÐÅÄc9½¤µéy¿È|»“ô}•åÄĘÈ¥t ²aÿúÍÙ’&™xyŽWІh”I ×ÂJúD9ï»\†>Û†ó%ru_ónS‡DQXí&ªÉÀ’{Ùf®Çr`±ÚœZÊ¥9gÕáU—y•ö].t.jÛY¯‹ìV9ØÍùΑ¢Iã[è ,x²¶ð=Mï¨-¸ ï°r¥ËmVj”ã£F‚¶Ã½oø¼þ ÉnÝ"[|t_ÛÇ]E„bï'3,ª]ë£På8âð}›GøÎ¶p… â|lÁ™Å˜›„]uE•ñÁcó‚BË"½h4ŠzÑñ´ìÓþÑ>E¼¨ûþ< Žô\ë:Ñæ>@š~õ»Ïûr¿¿!À¼Z &-éüÂq¿K¤~¿Ú²6;-жñ`ŠŠëòÂÐ_¬`Ýk;6—¥· Zlõ‚äZYîtõ™zDðµ7£‰ ¼rLx–©-5÷p·-ú­X2aÔ²¡˜üÌlÕ VêyWí|~[' p΄mdu ÆÜ¬4gÓÍ„=_îÇå]|Dñá•Þ¿?]ò…ÀÀ‡.僚ïÒÊôG¤ Eœ3Xiã…#Pf£“dÏØ³V;¦\G;?|ÝP…Ū!+ÐØvº¤ûݬ‹Í²ç‹{¾?ét··ü#‰)=™ 1éW(»-•Ù ¦› ­fI™©;W°¦ê&™†¼ô)6 H°ßLåò!«IäYïªeMgX\'‡¼Ôþß…ÉOŒP‚¶¯ß &>UóxÜDƒF"乌Í#úqÝ*{ù<%~ÉÕèªtâ€d×é¯+¾ûžk†Ù¾ËfÐ@û8è9\Èà‚­ªî“Ùõ©µ§(öø7 ëc´§ø·óÄ~8$­ÄPg4òzÊ.rÔeÔ…2Ù½4¾t@J‹)÷u•Fªý݀ζ¼ ’k÷9UÓäû&ÑCmïT¶'·ÐYjÔIjñl«¿óMì7©L6 +uÅï4=Df|N_A¨ôÙyÛÓ[¾ç¤ï391;¬L§A¶FCl~ó"hp⃲_´Iƒ&ÅÊš7ÖýýH¿C‹mM›+ZÐÅ¥½Rîo‘x'¥›IÆñ*=8› ÚÎíïn»ÌŸñÕQRM,I‰ûLÏ\9ëhò´¦Àøq ÒìQؾ•G3ë¦;*¦½8”YëóÈ>ˆ#ÅL94%Ÿïo„+;t•fÑh²‹Þ ÜÌ4XŒUÄMªV'Bå‘E¢ñ G"iõõÞù…Rš 8¦P¡‰@JŠÔ†7Õ‘4[ßó²l=¯JÓk‰9;Ó5 ýW‚åøÈ ~ÎÑÔ‰SgÉãVÃ3# uNC•º[ðnôߨÉ$Ó×6-4aOpÿ ˆÖÝ‚½ñSþþ`³ÕÄu8’—ý6'¨Ðšv¬Y­pì¡'>b,ûPFÊ÷+øÞœY•¾õDêÜÕ>Œ`|0W¥ï”ƒÎ!!o˜ž08·Ã4ȼC+y¹­ÉǽO lø 1íÄŒ¤Qš6ɆY=`tåoÉêÙAýÔ¸|^ðÐØê P¾U1 ÐÍÊÒóìw*¤yö”ðpÍ–!êŸíÞíøf”M½¦ò»“€MÕ¤šÙÌp3d1ùƒCW*óTC­®MÛÌæQb05ä®ÉË·ù5U`E¬‡ }—–œÊ€îP’æ÷G½¯–¹G-mPJ¡A+×LHeo\ÍAÑ*¾r1ŒïV ©Å£j ‘D) yä#´õô ^9’¨©gÇ:à7ÉIÎ\ËKÆý^½eú+õ;Päcфߨ?Ãò_¶Ž_2[`¸<ô°ñ. ¦p'È)- ËÎU'ë„FY»Â©;ÙÙ}Éÿl{tìâ ûÍ„»Qê•S:eïÈ[ån§ÄféiXfløÛän%@ „kãWZT‚U_ÐËÏì!ê Å£)t¯Ïú´ÕyüÚûo¦ÐZˆkÃé†8fve°Á› ó…‚ü»Ù+ýúY#ˆZ›ŸŠ¥±C=¢?%PÁ#YÇ{¼ïc¡ùzÜôxv>½ަHƒ  ê•Û`COQBWžKÒÕˆ?L}¥z*NQøŒòp6”‘ìCºÜx8„ àˆFóÎÛ·±÷¯:n\ï—­+7¥|þß©°®þùæ×dü¤ç;IîÜ\ûf~òc\d<¹—çUÏC~«aòöÓ¯¯e†Á˜¸ ‰€Ä‰nìð:£tù䛀‹§®o¥îž£Èï*ýHFîvÕ‡ùzèð=ŸŸÃJ ÒM$9½Mf“9›ÎRiña5ðÒgÑÖÖÐþØÌRo•a#œ’+džÝ3¹—D“Iñî•âwû‡èä•ý²)³Ÿ[ÅÒ°lZ¦]äsßW@Ç+€´æÒÐ"hÐ"ùÜÐZRÃöÔÆÅÒ1ò‰º*ÛE4ÁÇ rä ðT¹ž¢dá*séJÞú)-䨱1戳rŸ~f÷ß‚ñ%öÃ~¥¨uC&å勸™‹ÿa¯lïcïº}iVº˜¹8„ô½õÚ9×&h²¹p„ Rßõäïf¼r…ПÊLÈXv!—°˜¬¹nÇ{ä˜í{Âíó_ù‘w•Ö’­E¦À_ÄM·ˆR âOÿò…ËËÅÚU¼”±‡¹ eq áOb!+w½›BõT„àQ\ê!@©ØæRÚ`uÐÍÇ ¥föÚ*XCpTþ¦«¦±Õ¿oOcMö& ²TŽbs¢Ù†²ÀN÷¬(ž+ ¾´]ðÕP5V>¦Ð_øÖÔëÖFOÉè0s•² DÃéNè´ò?n6Œs ü‚¯Ý6¬z×ß–»«áPE; 8m¡Î>¿ÿ%Wž@žÚ QÒ«ÏOªúÇ>¡W×IÊ£È;¨kmÜR‹þ£KéîGûømq9)‹eTP6–¹•ðz`ÒoµóòXÌ—.É¼í¸²¾±Äû£…t$)¡H\¡c#dD4éeD°#DÇpWkñÇ’rb~?é΋ut ”Âñ ÊT1“/Aç™ü’¶zâ0ªú“ý¿]W)·Îд$g<ÉH»Ÿ,<0ƒ„î.½Ñj½¨}Y:\ÿÝŒvÄèiÇÎü*æ9­¿.ß鵸©P*s9J½ÿò;zÝ»lAœ?W[B»ëU,„ÉF_’QŠðçsnZµpñR¬ŽvÜÍL/A;I`d•ì××R'¡xý4ÜÏ"™­ElÍÔP {xJKÀû©ô,©E˜Ám‘ iS€ÒQ©E4FñLwx^N¾XtÒÅÌòtí¾K“Âç¦n,ú·ƒ]éÃy‘U§ú<˜lÂV [°#aVvÓ—‹Uˆ†å1ÒQMñÏûˆBðàz×Bs:1±|ùŠjtœû ìà¼Î÷æÔZ?ë埔cwѱ‚ìŽÏnÐGUIka˜ÀU–Å^Ïí<œVg‚™H²‘ ¬ü=ìÃPÏÚ´@ ÌHA/ç#ý&Á8ƇêÂrôú@H¿ô(oó¶RåOW«=ùhÝ6 ›7Ö,cò‹H³€öZQá+eÃ>„ÒõIj6©fUò¹™3äSdÜ2À¸œ5k¹ÉóêTÙ:ipÎïQænVÜPaÃY½Ó-Â\3ôÁ2ã^ G=ó ?ã?3¤bÛÂ%è+ýᎪéÎm5÷møî å¼o;ƒã†kÎZ('$ÒWŸ° ‚c¯†R£Ëd(.òÕˆ½ÒšõÌtuÃ*¯ÇÏ‚ßÅ%Y §oƒõ„ªåÆ™kS»À/7œlãyY$ÞªŠÃ4‰x—„ žYIöžCuçÍT…IÕ޶¬ø=¼û˜ åYѾªásÑ‚f„ˆ ʯâ¯_Ê÷Çux¥WÍ¢Ÿ4ׂ?# |v«ξîã‰÷“ÝM9}àÑ50¾¨ã½?©*†_’$®ZþöQlRL×]4j¦v;hÍc ÉûOOÈlWLßóa ˜ .‚2, ìÌi¶sQ˜hˆ.þÝÇçV¤ÑG ÑÀhõÈ ©¿ƒãZÂ6<µª°âp#ÝÜ4v`™éµæâufgÌÈb¢¸hèÚðÛÇ‘W‘J ÙA_2)©M$ZZr‰GùÃkF"jëΊœ)¤oðó8RŸüìÀ¶Ý^s%^›eÅ%04) §aËg-cø÷M9N±w÷•(É™ä.ˆ‘oõïí|øeûfíº'„ç^†Ðkh÷oð©â4³cºT¿üA]F”íWZÈ«^¦ê@k£ýáJ´F«ÕìŸx÷Ùnì!åù‰`”Ž1ÇP)ØÛ]?<ݾžXŸázV5Ú -öv臣 °m7›£x㪣€Cd7@KþÄô]WýêÌ_É»¨œˆ@KßTàçWÅoÌÌÁ¶럸oÛPÎëUÇ ÇF«[íσLòiÖt® -ˆ|ëÇ?ÏðÔú}žåÝ 3ÂÇ|çç[• Ô™hȸb±Ifh-°R¤^Úí¼s¨äám$ð >å!ƒ3šg6¥N»ÇÊ *±ùˆ[ŠÖá6¦:í@¼ÁmU&#ê$¬Ä6!îÀÚhÜp‰žz” K>MÌ‘4Ú]¢óû·ÌFXo×ÿòŠŠà¾ŽZ$7Cˆû^MÆ/1|ÄEâµ-ÜÓîRüEÛa=¶|­žx#7ø·Ç?+(:… R†Õбï[ÌzðԀϿ´´“Ê>Þ•gúÈ!¡Q7 IZEiÖy3_%6oòU6GÛ{ñü‘.fBÁž“㢩ßïˆ5C €ñ£ø vbÔò1ý$ ™­-×âùh>È{êJrÇDV_[–ïï´ì¹ªß}=Ï]|ù[rm#_Ôô}ÛB}VÌ`±SôbÖ\úð¯üGH°’›¢î! 6Þ{ÔT›„gCÏuÁPc1çû/ŽŒþs,Gz«bTáu“š»ó² <y+KÝŸ`‘šò§A©¯Ͼ´€ò0¦µîÞ?gP¨N‡ÅÖL7²ó½º…^ë€u‡A [ô±%›®µ;XPF"‚g×du•€ É?üij5í#™Õí2ºy¼¤Ë5*ó‚ ÕŸ.h¢«ç ” ù9½w#j^õ>EÕFÃU×~¯§ç }K‹ÐNc©qÙtªvOIX€Úš½ éØù´ÑÑ"7¨ïPãÕ!½ ’¯?7XáÖ11 gÛE=s£Cݳíã' ¾HߘK®Í§«YIˆ•|ª È ]š C¹à ãc¯Šo6›apßmŸ™wS,øŽ:"ìª7½ÿ¹.媽)ñc]çú÷AÝ¥•!ê–¨‘°Ü^¹ê>®ÏÂ9þž|½¬hùÜѧ¦ÌNŸ•:„SŽñaZª`ÑœŠ¡þÀq‹¾ê޹ 1ˆt²;ÍÅ@0ÂñJÁysÛ=¹¶}ÍçCxïÏêg{ ¥cË_F7ð•$xú4n%-yNš݆MÇý˜¥lé)¡‡ê¦¥pñö¿X»DMçN¼±ý¥ì"Ô¶ÌB]Š7>ºŒñ®ø=0Ùú¼DŽ”¿Ãi™,º^õ"§kâ2õ®j:_ÕKÆ1†mkÄ~Ô\D%ÅCó«kc ç÷ ià)Œ>¥±"iA>3dÕžçœ@).C8@LVÐ #Š×ò°ú”‰Îa+cxë§õ¬Ó÷פ ^˜6"I€;ÞÛZìÞw´!ê*3øtYaH=zõóqM‹x_a]%iío2z¯Ñ÷˜žÙÛXC‡a7ƒV(û5G^h ý[_J$ ázšôqžª©¢ ñ7Á(&]-è;xÊW¼'þ+ÆÌ‘Ž\sÕ}b–Œ‹µœž„†!Y†æJ$à•z£ýѬø!ט–àØ»ˆ'?Å[ËL£Òã*°;/;Y¥¾L ®>_l|mˆj¯ûèB=11Þ:ñkÇ ,¹O~æpQUYIãZ™ ùÛ9¯C¡Õce5QcµBi,äô ŒtÀÍ`‹ÎtçÒjÈ\j•ý“@®Î,hdv\Iñ¦%ÖõIÎð¼iq.gUã`'ÖÁ‰0uÞšûæE+ué‹Såº\íǸ2poÂ+d¡$ê´/®¤Ä‹¿²0¹÷ö‡(ã19‰‡ÚS|„zŠ8óD„‰Á!’·S2œhŽXt»4±§„lûþIbÛC´ÚKç[àŸ<žÆF|¤Ž½1´eÑÏ_…¡*w*æ p¿6(`RüÎáîW±×\5• =.C¾ À/“¦¨,„èdg“,ÒFë/p‰oÃ",…™3˜Ì³GJvâRîK-ß4æÀ¸®¯§q dª6؈<‰èëð1- 1žtMFx˜(·$K3àwSj‡´nÊ (…ÔIlS¯Ã@ÊE“.üà‘Òø?1]È«£óßòCu¦#•­ÎmÛòÎBè%< .ž¦nеÉý’ƒt*î\‘áî© ù¬»…BL´gšÈuˆ–¹aàQ)¾*âT—šB"û¹¥ëŽ}mútþ8þw„’"ÛQ,^\!° « ºÐ5’iÜ…©ÝžŽP*[&K{ ÀÌÛ[%¦Ë÷Øi펴 PÞ4“ËÔ¯1Ë«¦ÔzÜPx¼©:žeX ´ï"—æˆåàXe‹*6:ý…¡éÖBÍÔ0´“}×sÞµŸ8Åuöš–ü÷e×%I£Æ|qΔ­îMíIlÞÇÔŽ:N|ÕÑ÷6EïU¡É¹ÍPü #øæ‘†Å¦¹@Óv d;gHî¼ Ц&J{cd¶ƒë’3¢xä”t¿Ð1©ü­Õ?†£™¸f'Õ;½d•T2%2/›óv`ŒÀV´ ï|ûá¬ûî7€2§j{‘ø_§/¼"tÅR‹¬ÂúéGÅXÀÆô¸\- ê®[†Æ„½€Öö´ZÖ ý›EEZ6ÎF€QbZ ÿ~c´#NŒR™îá80Û°JÁ¾K/òº}y s*\¹Và˜¾K endstream endobj 1124 0 obj << /Length1 1385 /Length2 6147 /Length3 0 /Length 7095 /Filter /FlateDecode >> stream xÚtTÓoû7¥¤¢t3¤ÆFJˆä‚¤€ÂØŒØ`Œ$•îîQJI#H—€ ¡” (’ òŸñ<Ïÿ÷¼ï9ï{vÎw÷Õ×u_ŸÏÍÏ£o(¦‚ÀØ !4N ÉÔ P-$ $¨øùP8'ä_5¿ ë†Â åÿ—ƒ Ãtê0ÁŠA´Ý`IXF,+$@ ¹9b°òu˜ €Ú4ÒŠ_ ãâEÙÙãeþuÁ…`99YÑßág$‡¡PÎéL¨‡9 1pçýBŠö8œ‹¼¸¸§§'æìÄ`프Ež(œ=à.Ò ‰õ@"¿èÁœ‘&RñŒìQnô†[œ' ‹N(8íFˆpG#X¡8ÀPKpljþã¬ûÇAð÷n` øßéþFÿJ„Bÿ†ÁágÚ…¶Ø¢œ€;] Î ' €¡¿aNnB<̆r‚Ù~w@T 0€ÇsƒcQ.87 Êé׈â¿ÒnYPÃ8;#Ñ87ª_ý©£°H8áÚ½ÅÿlÖñDûþlQh„í¯!î.âÆh”«;RKý¯ AEõÝ•¼ ]H/¸½ø¯ôFÞ.È߯ßjÂ~¾.€-a¤ÊIø£òuƒy 8¬;ÒÏ÷þ)QÁ ŽØ íPhªÿd'¨‘¶dÂò±(/€ˆ€=0ôë÷ïÓ}¼´“÷ÜïW\¢®{ÇDäÏÄÿ¶©ªb¼¾„šbÒ XB %üþ™E†úÛè?¡Zh[ úÓ-ášþÕ±Ç_ý%‡0àŸÉô0Ô"Bÿ¹%H'|ÀÿßPÿòCø¯,ÿ/ÿwCw'§ßf¡ßöÿà sF9yÿu €ÖG C ú¿]M‘H E"PîÎÿmÕÂÁDPAÛÀ,–‚¤þèQn”¡ÂÁíÿ@æÞøÕœPh¤>Æ õëm!D@ÿe#ð îHx?ܸüc‚¹Ȇû½Æ_2’@§ö¡†c¿x'!-€a±0o*Âê ’4 ‚"^¿‘ ¢18B€0³Àƒ¥úµf0H Žú¥£úG^¸;K(ü„¢ÿ’“‰ôB©f§1p…‡ê–ãç*ìžb«ÃŠvÓŽÍ$ĆŸ> ÀõhŒ[-'fgÍéà!³Ý`ȇv=U×ãœ÷o¿ù~¬á®õ–:ã†lØqÛÄMŸO&úq\›¦m Ê7MQå’/ÁöésF^yEy a×cÈOûP°ºk&ÑS€áDV;´E¯íÕógYºLr&Û+wq6ýF«Òû,‚¹+αÁ¢,ÃSõ2®é(¶P%xV]Yê蟿ÚÍÙ¨í´ú…ï1B?‡ºy•É|ÁåÓÜ­ :_Mz5&Ch>Ï]ª~µ‚¤Æ]ËS^r3‡¬pûDª-ÚÖ‚Œõ"{L@ꉤtgðÔÜÉkOì"|Š »moŸ Œ3Í^XøèDýj´Y(‹÷¡}ù³½GþoT #Ò*áæb@Ó<ä4}~7ÝuO8ˆú¨Qœªè•Óót/­-TÞØ^Ðò<ÏÝÈpÅÉ9‡±¡‰›²ÚìyÄ“·’¦OI¦âLZ^ãµMSÀŠÎX/‡¸ï5p9r‘*3+TïY}“L¡¹øÑu$—ÚbtƒÄÓ‚®óÑ"v«U]8¸4fà:ɦÁÞHó;Šy>¯,;E EÏ¢^ƒŽÚ¥+”©ð™ïÒÐÚ4p›÷™ÊÆ)1ëäiµÁ‚`mÕûµ×f㸮« Â¡x¢ëôB²Ž4=6§Þx¨hp6‚ûXgÔ|R¿”Ͻ鱜‹§R¹ýºBÕ–âþ0¾TÙ$±``vÆÉ±U¶Z«WŸ|ŒÞå§ ]% †÷»oYÈ}èog¿Uň >¹óNtP²€Ã ¹tó„&<ÖJ±¢¨i¡¦‚¦‘r® SLYd©?j Œr»ßåËÓ^<ýºúö,aü=TÁ>¿}³P>èIÍú@ø•mªO˜0£HSi,…Öp- oÆSe‰×ÉìšÄÊlsÄs’{6N{žÚ[}/ϲ³Å`­•>¤‹W[¢£ÛòRš~„Š%xG'·š¹Õ®‡g¾K¢ëõí;ª—dE¯¾˜’©<é‹ÙèîiB·ÇÞÚ´~? ç–ß@Xú•F ÷WI½Ø‘K½­ÎËÁ=y+&Žœ2º:1úÉÔ [¥6GG¶ÔaÀt˜ug|×Mýæ\JB…!òPÐêf ¡Ñ†s…P¦Ý×Â|bô~Þ rÌÝÛ.Ý.DgÊzFæwûpŒZ\Óuòáß\!¾©ÖìÔnᣠL-ô£}€ ¼ýÄœpB–;¬+Ó"³^®îŸ=r“ÑKª[“» ‚Ï•30¦ÊE’ðVt}S»z³öýàP¯ãí^Œä›Ÿ4HŠ7h¸vC¾8ÊêØ£!C!p'ÿ*ingLÂxå9ãKq•M*ûó0/}OÝ|Ÿ¨Ç?»ùÒ†ï|:]&Q~$6C_µMæ*aR}¼Ï8 wð Ú)"Ö77»%½EvíSøY‹a¯øY»Wº'Ö ó¬$µÄÞwN¼™#Œütx‚5IqºÁ±Nt¿ZDÆNtDüö›¼ ž+¶­€­ºÓ¼á¸ËðWþÛ ÔFDî˜Üðó«"ܸÙ*=°/D£67èïO²â†`m%Y6!t9ŠºÉ®*ôm½ìò›•WjÌßÑ £ýØI^G¿œíó†d+ª¨0`Ht †ˆr@uøGÈIÕ<Ÿ¥ÛÛ¹³5¶‹n2/c>ô?hÝ+½¼diR+±+Äï­ËþLOKöéG¥zÓiÝ.æ5ÜñÃZÚãsÍ1áÉ9lNÒ4ÝŒR[›2ùx;[ýsæ–†ƒ™ê ºò»ÚTÇÂ5F¢£%®&Û§E¶=·7Æ«Ÿcæñš)xÞ„ðu±ó‘GìçŸFñÅ«¢únd¢›l<—{)ã9ZCj*Jbq{yд ÎÊ=W?N™Ö9GœgÕæ'X¶œEᨤ’^ù÷¬§í¡.o§‹Æ,™Ëo-ëVÆíÁ3¶z›Iw§âH>nb¢¾§…ðg3E†)áK.Œs§ëž±}ndwT —Xs§›1þ¹Åšï¨³7Z¨)ñ K¼ÄÕ¼˜Îà3Œ§)Á<GMIkcˆë“F2ù¬Nö?³M§›¾ØƒšÚÿà¯ÖT.HÒõ×”xõÑd'Ãv çŽvÎõÑó°^²>MÝÒßl´úš}åAÖ“Ü^Ç&¹/Õ?âÏ!—ù$”û=ωBÉ¡¬ê_ér¡ÈJoø ù “€€…íâñ0DÞDÚ®Àwz³œ{2©ŸÖ¨N;êc8z†çŽ úÇÎu¥ùÙ¿Ûk„80Kõ.ñ6³_/<D¼nÞ°cÏ8¬ Í©.Øá¶ç5Yj²Ì”t^´pÕ[¸¬(â9Ï~#Q¦äoËmDòUÌb&³Ý`;ÊÓqÉ%ÕMîeþ”š.Äð ´»iõȵ߰«˜¶ƒ7®[|ÙŽìª/o—mžMÃÚ;Öɳ(u­dþrykNç¥N,T|FkÉa¸ô2æULoKdÒ@©÷wÝ=ç1­Ñ:²8q³ÍÛƒë­-Kg«Ù}7d½“¦¹ooð•íG<ÙÝù²î ;ëîQ4• ê=®Ûb^QŠì†{ßœ¿¬êïÉk턊ìÏtOÇ2•ä‡ÓÝ^2ì`ù6¦b œNxÂ[AÊè„)i†à GXêʨ3W:PõUKï¯w¿ M³Ÿkõk¹ûþcÝÇå"Ž;ÄDC ›Ñ;…©f•Nßûx`ºÖþÁðÇRÓškª¦lzäm™ËÌ®B;z÷5”Ngõ¬åÄSÃ{y‰ªRï,U_K‡îP ë´SSƾ)°Ü5_ιQ>×BËxI¥86H=îi”:NP+£­K ®u:%Z~4Þ?¼´ÃÖž´Êø4cåYˆoÃ&ÿdÒSîcµ³Ä^Uü8ÞX¤a@JÕ²/Ÿ“ŒÄ¸1©KlÊ’èÁêô×»«Jƒ}4Ó¦oâ×/îåjŸ‚O‡â9]˜M׸½á/úr(Ô"|NÖ«™çØØ&&?½ä¿•ƒ8;•ªòqÏ©îç[×Ôܽ ·+nüìÙÅ š´¡sÀ×?ÅÎ'Œw¨±§O’N¸s„»/ ¶¶™¾¨]úŒ¬.ve:›ICÐxuuêTÉèL²Ú²îjRòB·‘þÉ¥Í÷Ê©7UÇ;Gï ”S&9æÞrôü”ŒŽìî&ŸbøÑ_éP|M†yI‡‚bà¿õbþ&þhJÔú6Õz¼×òsÄV‘p®ÑpƒnåíL¤B.ÛXk­JOtÉÚ6µ”Ó0.rc GZߢœ:—ÙC ˜`£B¨”¹þÒAbˆ¬kÄçäØÕú9Gm¨Ý÷BÆ”}ñ¹.ÙñY5$ œ_÷kã{ú¡â•°êŒGˆŽÀÖ^ùªAOh¿®z-~%üvÄ—÷éñ„AfWœ_¼ëÄIy{Û–GšOÏ|xo|ÎðP3ßµ“Ÿy]*côÅ™¦ƒ"q;9G·ÜYq½âgUëòa£O‘åfá$ a6í1El¦¾ñEÆìüGÆ.ÖJÕ2ilÎ4}‚×Ä)„Y 3‘‰BÊ5Æfkä^¬èÆPÙ“ ¯z5,+7bRÿ“²‡tøˆ† uω5yíœ{!b UĵÍ{ÅüÂDÞÁXN„`º6‰ÙI¤0hÔ¤ÔÚàýEIÙÉ~À}¦ PH b|¤}á!×»ÒœèÑz«l]#¸Ä÷ÌÝûÄz 8Êîv…ƒ×̈́ףqÓ/o¿Ö,ßßd6«öïâP n³7.ùž‡k}×å̘z&³œªÀSE\ cºÇe°2tBUSËÍiwg“¢¢ÂÉŒÒ|ßïÝÉ ›/#© ׇPèÇ]¥C™w!F ;߯>|q,ªÑ2ܵ¹ ÖšÖØ0(?¶’£»šÕ”íxJ}ð:×Ö`pëL¬ŽäZ†hæàÌ‚†ÇDnLäÒ>~¼…O~]-õ𙼲<ˆ>ñ›'ü•>¤}ïê°Ï©I¬E?kúÍO­øB†m/ÃÒ5yܔŮ-æÎ܆m(¿Ÿû#H|™Í[Y“IOùjTé ÐÙê÷»À®ÆSù…®z£çq¨[ëz š"½õç@hp^h·JF¼6lĹåü©sÑ~b£›ùƒBPe¨cëÿɨJÄCÑ•¢{GÁ4lßè×*’3¾Z~—èаNÉø°HÄG|ÜbÚ¸åwŽ]§ÐºÉ~:üöÛP¸!3qÎW%4ÏÅ*™(]Œ ß]Ë&c>,·t´È¼ ¸–0‰ÝСÞÎ<£M±5Î-Tg²Œbñ¿ØOÕôèÊi$S>.|"Û&ÚTâL{ôBŽ ¸áÁÃ44,»ü"lúú·€ïÆÛ—¦Wå2¾±yo%çAÓ‰ožóÃ÷ùÞ]úYôÅ|´-Uždÿ¤Þg”Ë1í"ÓiÂf˜xeµGaNôУHéQ,£bv²ï×=à ¶éq‘“ ƒó{ÃO=ªÁ¬‹bO“8UµëèË|Û¤/­GÊ¡Ojk˜[¹Ds?ÌQû`]:gyƼ§§[ÊE¨½ýodüH¯Öq¿\kêÁ¤×ç c¶!–,¥ýFÂX-ùï<4ak¯(2 \èÜ λVŸÉ–éåëï#ôæ’"‰ûïÆgfþöp½üÐûlL¼ŒÌb‰fÙ §9 —LôÛ ²~·…Ÿ¼<®7j4ëʈÓÎ~Œ_hééëÐm.Z—ZIwŒ´^7±çø`˜¥³3Ó“(™tr‚~ é‚ÄXo¯H¹l)5·n1ÝßæxÓb° ^øìaiÞ×¹ÌÉï }öª MÑK«æŽÒþw¬Ì5%2¢ÝøÕR‹œu‰MÂÃ2¹<Ї¥ªï( ¸;3uÕ Šˆ÷J_ˆ¿ºç ÈadÇRP¼ µoè EЄ} *3˜º›=Æ{·àT+[ôø'ĬO0·¢@ýzªSæÓ×DÛ˜ê;'o…úØ®¥(­[ýáLÐp·hܾO'"+Y"M”¬åãR8#<ŸÌ2ûFöB }Û Í[NH¯Hã!àQU˽û‰ñ­tÆå}2áqvóõûÇÄ™)Ýlî’¾Ì×üé—:ˆ¤¶ÌPa½²ç¡Þ\âZLòÔQù™WòÜ·ÄΖËö°¡;ú¤Ø¢íào~6*s÷Öa˧¹£1EóérxúдÕYR®¯ÅÞÌ@ùñAô,‘e>Û ¼ÔœÊc¡3-öiríì‰ DócËcb‘j9 œÿn×7·Y’ª‘—|ËB;ÒSÏ»Ð%o1ó¨åÉÝRiëuV‡Ÿ7‡Þ Œš¶ì7àmÝ«A±¥-ŽHRxò½¦ÒãÇí"ìÅyºH‡ƒ¶¹.ìpîÉK=DÃÚ¤ŽGäÉëFuEÜ$6㪡&š™=ývßfpƒ÷Bݬ£Å¨Ã6UÌuÕ/´ß§ß–²©*úìCÁÑswï‘þÃæöÂîÖ™?ŠiÈP2«FѪ>ËkÙ&4µîþ_ö­^Ý>Mñï¬u9©^®à'£ë'oškŸ¸Ck”b±¤ô`‰IÐ’æ÷èÊ\¾Â*²{ ÏŽ;-L“>6,ÁèHÞó2Åt6_-“}“µY5ý¢]~æÞ¸Rßì‘æýÖ•ã2 óÆi„„Ší´ryM³“öʲmðLJÜU?×5µ¹6gj Aü“®xØ•÷<[¶[Êðƒ!Ÿg^\íìï6žën '.l-  )˜Å©·Ùî#È鎼Èüo=‹/æ'}–:?ä‘K ª¤¨J-(Å_Žö´Žq(5…?¯¿\z*–¼ù€[ëØo9V^âCmQT®Ñ7`4%nFïÝÇ1›ç¯_:^~áT=Í - ‹ ZŬ?K¿/gÊnpë‡,×j-_aÈö ä‡+æ5°»55O«î—ZeM§Ö^hw³D°\¿[ea‹ŒJ2´†'fíß“COßL?~´–¯*ÞDLj$\r-·hèI±— … 1‹êAÝž½i©áþ—üWf³’]c‰j6NwÒk‚4xDPúmƒOœÀÏ5Ôøo V4¨H©Ð2|œ]Hå-hȾøí0t¤”/$#•ö葇e$ׯHç©PWC«œìåv k%ÿgB3fÏn[õ4óÓÕÝc –]},Á98ï,§Šå=ÇR A:Ç-S5–N¾Ê8CuÌ·®òêäž¾©¡BûMõN ^{§w›¤ mÐ\ â‘'5¿<üÆÖ³[Ñ,´Õ å>Á’}ƪ¶gDn=\ºÅþÒÙØ¬Ê™+àgÅýA=|}JIÕnîiaΦŠZžžžT‹¸IÂ^Sl žl¸VÅ•î)i‘Oó”¾ò”K„$h.~<åg¼¢õ,VaWæ›Áí+èæ¥_ÅoÞ–ªqA*oGße¡ë 5ÿôMAª ='ª¼qµOEB(®k2%¾Ÿâ 9^w’¦ñÅœå»@çWÑU}°"âÔKô÷½Ì¤?»B‰XTS §4’â[D•e3°KSå¸qª§ET¢™¤~äRF;•òߟ°»1«ïµ“©[4xú8dEç‘%ì}kE^ÖÞ¡Œ •$k”&;dp¿|šóeVÒ\6¿|3óÆHóý׋ÕÍA±äãG25¾÷Ž_1½æ»YîG¿YÙæYm”Ê#±úp¹û°#8òìgSö»ÓYEém¯Æ[4Ëuâ¤ÞR0o¼N¯<N,èzŽy_uÝ}e¤çpbÌ¡q¹.ÝèKù7€ÁM°Ñ’ç‚Ù¯UsÙ¤s§ÙW{žÌ Üu<¡CïÞW±ßb°·þò­Uöñžžlë«WáRlÛZùoµ:öñ©£$7˜²? Ÿêä°‹Œ¤0¿ »ÌTû=r5ç3¨æ9‹QjMÎmáSÙkš”¬!ü\<þ§Ë¶G—ÆŸ{uØH+é%ÕT­Qbóßi³ñ-*·3¥ñjjî@Ä_’ÜŒ?³¿çòè’7#ëW>¢äØ,s¨¤>™ä¸Ó©Òú~kƒŸ;[TÍ%G¾V§. )¦‚å O›Þ?¤wö6îÂ,€‰7iÝápèM l1ÙdeD“@¤Ï¾ûk;A\›´ÜYs®> stream xÚ´P\kÓ-Œ„àž Ánƒkpww‡Á™f€ÁÝà®Á8ÿŸµþ'äÿO⿳üßTþ¿ ’uwrúãfüãÿÿ¸-œí¼þ&<ªÖö¸*Ç=ÿoª语UYÛ»;ÿo¯Ìâq$À¶jfãäaòüe·‡ÊÚÃAÖêö0+»¿4ó—]ç÷®9ÙƒAê¨ýïËå1 ü_¾Ç³r|¼@ ÂüËe}Ü6ØŸcüAûôßuÈ€­ Ö¿‹—`áæfá…ñxôˆàÃù¸¡Ö øi8ØÁØcà±g?€ Ä ã÷1ó 8¤›þ ~^‡Ò?ˆÀ¡ü$ÀàÐþäpXüƒ³XþƒVÿA¼¿ÑãúþÃæ|”7è_ Àaó/È à°ý|¬Éþ_ð1ó?ðQ²àÁÇ"Ýþc¡ÿ‚ ÁþÀÿš¡•»›ÛãÿHÿqÀÿƒÿÜd d…±8±u¨m¿ª• ódÛA9̸Òçb+1EƒõÉL™­'kåæ,)UÊ.örÊš:tªJº^å}?õÙj jôâ¹`£’ݵ¥²Lœ{¸@œyísIN3‡Û‚P¨—&I)TæÖ‡ Nƒ×….fmÛ§E‡ëËPÿiáµ'ý³rY~ŰvÕŽ®Úòe"rAÝïš°VËímÞ3†ü ç„ÍXã¨tÕ,%‘ŽkŒdϼµÏCËø½Ý1AŠÁÛG/Ãaø2ÂäÒ<¨5ºËE8wùeY>–r„RDZ*…Ôš$RE)­‡$Æw´¨ú9Qv¯1Hp?e}+µƒ¦_sóö„¤çÏÐDØFûX‹¬Èjv´ÎG M_.¢¬ m9avM´1æÐúÚ½-? ð–ЊqȨ¶2dc×+Íö0{Z1/[å8ÓEày}%'aB:v€KW·|Êé'^攞äåOpÙÈÜwð%<ò»ãÜã´b×Gíà ùÔËÉÑtíbÈŸoFœUPFÍm’ ÑËÌ3ÌI0–E,•ûÔ¨F'ù÷aÍ ž¿£|&HÅy%ŸgMáêc¹!NµI`˜0BëZ{-ƒ–pEõ’Ù<ËööSÛ‚˜ö¨ê|Xîn4’ág=оÀi>ÉÙݤÚú î…é-æuRø‰ÜügºN4CK{‰×–(•³Äª u q¥6T]«<ÍPi;ÁʃÛó¢ïÍ‚,åÃlÙܓ٭Œövg#2ƒ»‹ÂÝëÙF“O)—€Ó‹h³;]óyΊ[÷£‹•o˜Ez]ò}<Ä.±ŒÉÛä:ÓM®öörD¥褰QL7´¿F‰CX«—nA‹våØLsœR<´»‚³M’þé•)»Ò1 –h¿ÎŸšaò±Æ¿^ްN¨ž+¨ä8$šÝyèB¶éðí Ë4ì­Ù¼ú"_û+ß:½f)“…„ö¢_àøz˜ülEÄ"¹õV](»ñÖR<É™áŠxótÙf¼1æ h뜗šéÄž„0í…¢PηçK¼¯7¥8ЈÔýo8t¾%gy“ï3g+é°³Õðhj¾{êzÖ3壙-ÕÊ´¯“5ý´9 íÇUÇGߣÒ€¹v5»‹ZY^Yå ý˜å¡áÖd±óGôBäæ­«¾ßàáR ­h i¼pÞÞ_Ñóf'+²Ý¦vˆ“xò¢ÐwzÜ#^0„ÿÄõbx¥ßKÖȵg·¿'ÉÉ! cïb» áuÎy“ÃTæ(²¨SY-YyW}¥í·É íNq4£6ËŸJœªzy÷)ÈnLça„Òeƒ/¿œ¯÷Ʋ²Þ‡½Ûo’4ÐàåÎxê×¥ÁßÕ´ ûòPXô¶ÆÜRÖD¾˜¯àL-08 n0œ;ÍqÓR¸(E½ÈFž|a !ŒJpQøt«÷‹Í-;^ÝǽÇSrïÕ¡CZz^ÐÆ+n6.i‘Á|ˆ2㣓ܞBÀö¹eI®(¼Š³[™,ŠW§K¸w;*º¯¢IŒ…8;ÁÉdíšwiÁ*2L¥™–:Õ#Yf°hVXŸVÐÜ:sÅ)\¤[1¨÷ü†ÙD¿Bì[ìAɰ%2$ÁA\C€!ôµ ¶¡ßö>h·Ed™gáúÃAªãžÏÅ ”Í)¿ÐÙÕ5Ì­WÀyeÆÆ!h‘®ú,æ©­•á!ÑŒl„M5…´¯Sù¾r¢Áu·¤Ã¥í»›°Úì2?óš£àÍœZ»—ÄY;/³´åûØD>ÙšÉê{ 9o]Ž\ÞvÒ&å’ 5ûc¼2.—¹Ø:Ÿ®²üŒŠ‚‹z°X¹îIºÒïuZxO7‘IícSéÄèùBÇO¥?”ïP’*ˆ´Tôã ïk-}dX¥V(ƒà‰@ü.oFBÇ!Ö<÷)ÆŠ÷É üDñyrTaBû^Ø?E˜ßø&‰]å©÷²£c$âuK´bñ$§©ŽÃ–å.(„+˜‚¥FH¬å»f€›þa‹íHæ£þ ‡Qû}±Gw¶w³¸ÒqG¬ í~Û}êÙ2 T6QxÄX®¤‘_cLÒ¹\dˆ—CF="å¿ËCwøeõ|MïáVîÝ$žê×þ è dÁ`…ÄÉo¼|'´›·o¿Ò~奧a¿XªñÃë¶}kôí›?NÐzCÛ†<2“ß­é¹?fȼ˜‹ú•"ÝZƒä¾Læ}Nrëú ׃[õ'ùì~Ý>/LJçœHª›Ð‰'Ëðiˆ^jxÈLMë~$_ë7ÈþуôÍœ…Nðzú^xBÚ¿úõAÅ ýÓFo[èGNÓû¬yüë*r_†××!U"wgøùD2xj%"l/ŸÔ'2 ®Ävã©•_wH*H=Ù ¨õõŒXoÐÉžî*8-ѯg—Ì÷+RËWÌ5T¬ªVÞ÷‹,˜´ùÛd'YWõ³Ä½ÂÌ—&çéífÜÒŠxyê°d>)Íüw©d³àbÛ‚w©ÏzÉúvò}Ño•ÙlÐi[¹ù“CŒ¤²4GH𣇿ô¬ÇøªÒLODc’.’4׺Üuçá´'9¢^Î1æ²éמžÃ?<Í?ŒIAIÌ¡€Ÿd.EÙĘšhÊž6 ê¦|~J>Íü&ÎÓ{†pØöjx)•4-’£¼ÝMgàd¨2|ß Â.ÍkLlÁjëÿÖ…?ºüXû,o·ZºcÜ)Žè#Û ÛgÐß/ÉKjû¦„Ô+£‚öæNP:sžXìïí¾€$šm¤fYr‹y×¾æE-€ì}RíHó$5qÌi"\•þÑÒ¢•÷,ôàûŒ1üµþC#€3-3ö°=Nó´B;|À P ê1Iú5cYÃ×BÒGy¯7„×a¦ôéyΖcÕÍYÈmDØ{Œ[DØõúÈáΚyÃÂý%å !4¾©Ì†=ªªüÝÎêíðCyøT†7Î'ö%ê7C×›æw½*cíoüÃOŠ‘lg.¬r34vË÷ŒØ×…ØiH߆¶5”Â1È£ ;ÎêÖèèÍd]ËÔ_U"·8UáF,­0,õ“Z'ᳬ5„•ÝW† Ÿ"ô ‹©}ðæÝyv‰§6Á•'éÇÒ˜p!Ú~úËô²·<¦Ü@PZhMÒíM.’ÂMÕ¿`ÅrÔñCJË(êx± L*}€~sËÅ¿@Ïõ–Æ[[ÐסNy¸é› ‘ÉæRÝ8I¡œò×:ö gÃ×Gf÷Í~lÞË'Ø KÖ‡ÂÂðÇ•ÏtIÿ|" ðŸË™ÿN×¹îg_è|ò¢TõPþýÍ’D?é¥wS¾UªEi@¸2ÀNè2k„µX9„m>E¬Š\º»³‘FËéù’¯Qž´„Æ+ ´dMâÔ+þd>½ÖɽIȉ‰3Æy£Ä³Û7¨pò Q×8Y§Åß¿J?šøáX€ºû‚;®·¤ëò]qŒ ”;]¿jà§&F]oê›õ‹ÒV|h€t—BéT.€öciê1~åâдatV Ãúù9më5|:ÿÅW•‰ÍŽ×ì!ÂͯYüѱð¼j¼·ÕzÇpǾxÔ79m® gÙd'ÌÔ×”J£••âÁ/uzžÊµ*R¯ä© w]Æí`•à”¯•»3|s®¼EܶE2h$gßs,VyáAaûæ{©Í½êíòP¨\Õ’øÞ²˜ôí±®q.)¤Æµäg1tèkæ´FÚÍö„¸GÇ瘗.Ô3‚ 7S©t\b«ÓlsëHþBv)™Yל£„ÍÎ{ æáñÑ7T´»A†_¶YGï5niÖ¼_jzÒ‰[ È¥ ¢ Õ°ú\o“+*Úa_šÞþòêògÊ~­ÀÔë ³‰áÔÐOÞ0äi8·ï@&÷>OM¡?œ?ú ëï6dç¢bµ³®GdÊQü TÁØÜ\B!­N–-Uþi“ÜÒüíú8pòFHÐQzL÷E£5ÎÔ%{¼¿×=j’Ò Å“ÍÑ@F¼˜àÞ)…º×pÊÃó4ö™–a ë‘‹ùd5iñQP´“tõZÊT&‡MÓsù%0Uèž`a¿çùÔ/Úqï£îhV9åQe44OÔ»©Â,%Ó9Õ‰ø‡JËãT¦µÎ„] HêoýÙ¦N@.ðÎæÞp$ó¸„\9O§[¢süÞöÑœWæ_BDNñ˜uß½b(º¢e¹bÙöâß‹MÐIKBKåÞ}ÍæÎ{¾þ‹Ù”Ùa GþàZ'šLÙÇ‘Wë‰Ô`®Õ”l[)Nfñ–:E.ïÑG—ÙùÔ¾dÊ”úÁ%øÉTÂôiÎQ9ÓË›ô†> â=CBYÉÊ8ré\U´¼ú߯?ó,…æ ^Y«Šsg êÁò²jæ´•/ñŽè„~lMe“,OÌè# žã³™$øÐ›]ïp¾°ä÷󦯢å1±yñlð/c­“HÖÓQŒ.iz6ÂZÄ‚iáº$µ¾ M¾“Ž×ãgéû’páâä @HZ<»"G[7›‘÷‰‹™uzÆÖç-®íUG‹êñ&o ¿pÑ€¥o¡Žr‡ þҼǼ3Q$q …g³©¦×oÑ{’×”T*–ÔC¾G›>Lvn§„ÄtĈ¸¢)ꉷV Ðõ¥¯¬ä9"@ž¹k‡o-OÇ’¡œ‡Ú/cUÉp 4F·lŸWó8€·#5:a½ÔdïDiùðÕu$iô÷³[Fn#—9$M¯»‘bSÅqÀ/i£§p‰廿®ì–¤Ñ6ÛlºçÜX綬(×ãNF–iêB]?^±d@ïÄ0Á%åýc®¥“ñ3”ckNн“¥ïrbn7’ãc½Ê¥d†+®-LÀ«¦j²¡—ÙÔe'»wŒ©3¢K¶P“Ë1 sál‚§3ïˆt^µ¬$Ø9Ö‡å¾NÐFU¼ºÐW!`N1]ô>°eÆÔO†É0Uj¦buR§ó=éól:. Û8¦"ËžáNÃÿÈÀÀGìpÞ ¡P0´¢³€ß„Ø'q1ÚrþÀû…²£AOüœÿW–K¤ZlÓ)²‡x<éÃŒeRÀíl¤œÑåáËÉ,ceÞ¡¢´gc7K·³‘6¥H=¸|øj^)I“Q!Ú›#‚¾q·&js(ŸÍSÞí-6pâ±DFdé=a°~£šµ¹ø‰1¶Ìiµ³²ZrpIšÄÔd½¸Ýí„¥[™§–3=¼ˆ@#S‡À#–²òü™\ÖkIÊöìå׺ …?µÎËî\§ñS±<¶¯ºC˜â‰x~ÖãLãLÄ´“b‚|gÉíû:ÉœÌÝñC8bvRP mî¢f ÚHL¦Z(“l”a`O¿{VÌHCÕ™çRˆg5—˜˜qš( ÷Þ=3GÜíWÐ& —À‰›¾—X?ï¹ÂF5åňÙ….aoòi»YTñzˆÓoV@¢ê'Ån$_Nè¼H®ÅŸ T€ÙªjK«{7´xê{šf|šÇæâJ ŽŒHˆ?©ý´ -•©XµÍß3Æ'e&„G!IÍMdÒVŒ0úOѾêï~1ž„}þúS¿¾qÙÀœ×šÆXïÞ÷J³{zMÞž(-Å9S@ÖØÖL³ÛYª~çŽûÒ‰àõýM¦ÎÊkÄy¯zŽÐ6 ß|ä8Ip‹ñ–§ƒ&ÎÏrþO(w˜sˆïÜ~œy¾µžF4üâé<ø<ÃWOT•ÜÍ_y¯ßf7±û‚ $\¦´}~‹yœh:”JG‡#0 ³Ì4¼ë¾l7y¿mÀs‡%pñ}ˆd*Ý•ö=‘­‹ÝàöQ ÒWátñ–ðùî"¼~ôk5È•›ë(žE-X™¡¢ Þ(»{j+Â~·@Ë¿:º:(P‡ääOL®Ê,Е)ZCȵHóBκâæÅUA_V »|qJ@eÈrò²p•ã¡JbÐ^–v’âþ‹m—x ¶Ç/o €ôUêpìŸÏ¸ädÐoîR»Û‹ åºÂ´"R×¾5ZMäºdV$9*°!=GI€ #г¼zÿé=k¶Ö-^Q-ͦKkFµCØÅs>•ÐLeTïè3l„PýÅ¥Ô&´q¤í๭¨çtBBöäDÿ]õp­ø ‚íÜUë„úªí@d°ÁѬ2@Úšý…‡ ¡¶zÕÜC‚Ÿž(vàuĬ™Q݊ࢺŸdµ§g§ØóE¤È’Ë`–ï+z"¡wÛ™r*1+TÅ,˜ü(—fClƒ÷ß¼[P(ÊÌ4„(]Õò–ð‹)ˆ‰q˜5.µBø®ÕÙé ˆ‘Z¨'j"£ÛëLéÔ« (âÓç^2!¼¾[qoâ!?ƒÚuä(–`òõ¸¶<³h÷‹óŸZoôø>9QÎ úß(^ß} ˆô9[±¦¨ý¬ªw5jÿÐäÞÇ Ôµë¨R¸çõÈï¢öˆb+¹Ì§zɃå«ERDØâ„dжE0fE½›éæwª©ÎVlI"ÞªXSsÑ Ú¬·ç4›ÙÃr‡"}•%fûÜ jÍQD¹‹¿å¨+FÜBªyïÞ8A¡#°¢ŽSóî<2BjI3·¹Ïþ¯òÅÿÓõÉ÷go[~A³û «r¢°Ùã×U«’¹Bøì™|éH'Ž÷uKîœFò”ÈÞY¼ß14ÏÔ47Mù(ÚÞÈFl냟P}ë¶Ô…žÉÛ߇qÿ¦³ºp-jâãrü=×a}ÃÀÖöZuà%œ%ý˜•¿ê¹±žŒ*¶Ì3çî`ç¼5öñþRVµž""üüOÊ(´¹-öd†.Å=#Xæ4Ð&¾à®‹Ù›ÕHúH |͖݀-"#·ÌBsï|Gó9cä¤Äâ­­(7)I~kóÉi`Ч1é3é.B¼üåÕRLÒƒM+%ç=u…¦s ÚIs<ºî]=’aÎN j›ŸÀ=cµÂà ÕyÑN/ÛÍ©ºœ…¾eNè73s©{…L‘(4ñ2á©/O2¡½»b£[}·åŠf¿2äVf±ÜÒo^Ô?õÃRŠ# ¿SñÔøLÅ%=‡ü kŽk]"0‰$lJŸ•&K^/?þèüüLJ…J„rµ¼V"oß%9,ßRûԠƱ¦ ûu²S¡Ð.ºÐž!ýo¯ Ž[u4åÚú½K±8­õzöƒìuG— ʉ^  2õÄu¡Á.¬/­»wýùÞÞL»¾eϪfZjN[ÐUãëŸy”±¬´2Ëh¤º Õ…Yü¨–,!‡5¬êùMçã`Šñíµ^œ¬$lpU“6*ŠÞˆÕÆjHm‘â¤òæ(RÀ{é²òŸÌÎØ6e sq Ú¼óôl=¸C±3â=ó;˾ 7§ˆå¿9…~D£¿ A‹áZ!Íq=”‘9µa~U¶/ÁC¿AB÷<¦·©Ž`I+4Þ–[½IðkÚ=måû‰W™\Ò’õùƒ›$–žŸ7a—¢¿«úΧop”ÏŠQcRéè@¦rûHº:þÊöƒôÁ^:0J¤_Ñ@àÞeÝëÛ/J˜jß”Žîq,6߸É ²Ç°RVœÂá¹Î¼g6Ï;fé“ßq‡ T¥|_r¶fH ÿœ»PPúE>?pTËÏqò§ìa´êg•« š×Ï]LT™ӤÊ97ÉɬԈy7]õ¢$îuˆM;g"Ys³¼R¬ÜùåHw¸ñÓ²`ÁzÀyUøóÂ÷W)Žb†¦—Tc" .7î Çr|N6:¶š°‡2Iìg¾µW{IMÆ×!J—®É»úˆÌVïŽö-¼lÒ’îQsŸ—Æïl•¦H—¢ƒÑØfM2Tœäõ¦µSðŠj˲U­dåže‡ãS…Ï÷Ù;øÞöi"íR$SJ »®×pk½™Ùªw.êKFóYÙûåŒgxê_YH»±Á 6«A¤ÖÇÐ.TÀ¤’M ~šåbî·iì¡0Öæw6BÍ­™¸ÿeß¼¾þ– ‡MÞ±š`¶cØXåª!®ò~áðɹîY_ká2µœJJ€Q‚æsé&×UÉ<ÞYVç8vþ_g›—6 Ö¦O îµ>,„×ñÝg}bZ¶5ÏcOïÝÐoÍÌ*QãmOç@¯ûÆf(ûT¼¦Yq^Êá‰Õm ~µ²¨ ´¢z*Í—ámÛøƒŽ„ÄÍæ #´NÕàóvE e—FQÒîS—_4‘Qöh£¾_üXsÖê{‡ÒÔÙþÇQÈ8'TÅ5¯Iy¢|F î•çØ‘=ÈÂuØÍjn9bb{‹N¾¿[ß³WLõÃ!I·6Õ^ñîëÞ­ ꣴûö:vùî²5"¼˜XZ™mšƒ‡³0ÕC[¾8}Ó¿·Ú„2KÈiù*Ê`¼@NRxcŸ´½/fϬÍmÚ¢3£‘M?!_¨ôë;‡âíäJŸÜÑ4&¡XÇàPt;°†ÆÑˆ&›ì ¬I+½ Lz#åærõ`N„}ÆÉò­Îw‘lÐ *׋Ôàïíã¦5òö½vÊ{ó«}1í.ÞÃl#R|©BDuœúThœ¹ÿÂ879½ˆç ,é¸Q±!q£Ò"Á¥rœËD—ÉCú²ª²z²Uí¤Å³9;ÿZf ·iO1‚e±MÜ:Œ¨iúúim«¯œñnÿ÷Ú+R†.£woùi~¢›'"œõŽ(zîÈ&•îl7v€†²¯àVBY 04tÒÖãg©ß¡ {¼”"révUe¦Lx `ŽÕD…ˆ‡ÁœºF3Ýöí ¸˜öD†9ÎÌ™Š¨}9ãî)Å&u‚ÝH\D挴D¸Ž™&ØEž²:UZHÑ'8÷ŽJï2ûùR°y©‡>j77uEØ+at›ƒåO‘Ÿ åb')†[r8¡»|n­öbú{éÁß99ïø‘‚7L" G˜|Ù2C ‡Ä\Æäí š°w’¬çiH*º&€'±2jçôq¥±íº/àeORQUËüUQf/Ѓ:Óm‡qòt—iŽRcå*‡È®,zÂ,¼E#ªøfæ€ûÒqUuÀ_©¨å†2/ .õ–`g¥&-üUþÍú;ÒÏ{twÙC0÷ï^w(´)ÚI'~èܘB*¾[Ë6¿][›ÁÿúË˃¾xˆÀ×Ûû@–\ ¼Êˆj¬ÿžr0*Ùx{j;! ­/hëÑ'…JBã÷dÁä¨lqÑß™±C¬XsHiƒû›¥0éÙÖàÓàõ]òÈíeN8dC{oøè‚¦PEÃîì_õPÌŸ#×—¹IµÁOœx¸ûN¥V× š‹qîôØÍ] I÷^‹dp|º«Í¡®‚äTÓܵ€:[ˆÄ; ½Ëäׯ³¶zjO²òa®Ës‡KdŠ äûܲ%o‘E}’—âRi*M5 Ïþ–k2êtæ½ÚA’ ³¶â­ÅxØ< ¼Y"×›§jšˆ;‰Yôñ«ËüPPŸèÁÉõ+ùÔ»paqš`è%³Ì‰½2|Ê‘ó‚½øCGh½iHáùÇÀwÎÞø|ˆÑèGŒ},Û)f™ÃÏÄÊ9 :Á%Zy!7O ƒ Ô0ß{tœVÒN#ŽfgÅOîßi `bêŠMûߥ~mÖßf+W•˜NN ÂU_ËRПšŠÚ3±&¦qË£jâÑñkÞ+÷`­@¥1\t>ïY‹"ïëyñ“ò ¿îó+Ír!’Ðó‘ú #î„v|ÛuÅ =Ȳðù?4êü endstream endobj 1128 0 obj << /Length1 2137 /Length2 16997 /Length3 0 /Length 18293 /Filter /FlateDecode >> stream xÚŒ·PœëÒ-Œk ¸Ëàî.ÁÝ]‚;ƒ îÜ Á-¸»w·àî®A‚\öÙç;Ùçûÿª{kª˜wµ¬§W?Ýï$Jª ¦vÆfv gFf^€¨¼ 3€™™‘™™‚B èlcöo3…†™£ÐÄûQG3#çw›˜‘ó{œ¼ ãb`a°pò²pñ23X™™yþ'ÐΑ fä 4È3dì@fN¢vöŽ@ Kç÷cþç@mB`ááá¢ÿW:@ØÖÌhbÈ9[šÙ¾ŸhbdPµ3š9{ü5¿¥³³=/“››£‘­££… =À èl P1s2st53ü% `dkö·2F €š%Ðéo»ª¹³›‘£àÝ`419½g¸€LÍï‡T¥åŠöf ¿ƒåþ ü»7F–ÿÐý;û/" è_ÉF&&v¶öF  È`´1(JÈ1:»;ÓŒ@¦Ù8Ù½ç¹mŒŒßþU¹@BX`ô.ðßòœLöÎNŒN@›¿$2ýEóÞeq©¨­­ÈÙ á¯úÄ€Žf&ïm÷`úûf­Avn ¯s ÈÔü/¦.öLê  ƒ‹™´Ø¿CÞMlfÎfff.6€™ÀÌÝÄ’é/z5{³9Yþ2¿+ðñ²·³˜¿‹0󚛽!x9¹šœ]Ì|¼þéøo„ÀÂ0š8ŒÍ,€ „?ìïf3ó¿ñûå;Ý:Ìï³Ç`þëóŸ'½÷ñ2µÙxü ÿ×ý2I‰ËKªˆÑý­ø?>;w€;3€•ƒÀò×q½?øü7’ðßeü#Wdnàù»Ú÷6ýOÅ®ÿê/ ࿹ìÞ§Ö @ýgÈu™9˜MÞÿ°ü?ú¿Rþÿ&ü/–ÿÛÿï‚$\llþå¦þ—ÿÿã6²Úxü;à}h]œß@Þî} @ÿ;TÓì凌73ºØþo¯´³Ñû"ƒ,lþÓF “ÐÝÌT èlbù÷´ümWÿkËl€ 3%;'à_¯ÃûÕü/ßûj™X¿¿:œÞGò_.³÷Íùï#ÅA&v¦­+'ÀÈÑÑÈáý’ßÀ‹å}MÍÜÿ5Ä&Fó{ à]žÀÜÎá¯åä0 ÿeúq˜Dÿ n“Ø €Iò?ˆùÙÚýq³˜¤ÿ N“ÜôN+ÿ½Ó*üq¿3)ýAï,ª;€Iíz/Uý?ˆçóÏé<ïœÆ€Éä?ˆãÝgbgóÞáÿ±°³ÿeùgõµžÉôð]¬Ù†w5ßûŸV“ùŸ€¿‹ã?üïB,þßO´üsþ»K{K3Ð?"ÞmÀÀwyÖÿ€ïlþßÚþïëÎô‡Šã=ô><ÿð¿«±ûsú{²Ý¹ß«·ÿã~kÿ¾˜vÚÁþ.ÆÞÆÅéOƒß3\ìœÍLmlÌÌÿô…ýÃñ¿;ÆòîúGƒXÞõþ!d¯ÙÉÆÈÉòïuüIŸ&g7»¸ß3\þßäúø®Ñíd}Ïvÿ|ï‡ÇŸ³ßS=Íÿæþ¯å2qqt|ÿ}ù×ëï}óþÿëÇÌÌÌÝÌaiÁ΄/Ȫ6¨ý¡ZßaoâÓ,Åžf* ƒ×’c‡Ë2lMUFÀ†ã/á¤á”Õqê;¡e⯓–zØÐÖå¶ßÞÏq*Ó{m‹SX“'Âuý„ð jBûÞ/Þ_¬![ÀÈPä8¸p#+å¡?¸õIº×õ—®Œ…,ì)ïWqÊ">—Î0D«Gé~)š£È5ΜÇ!…qf „£E»tÿ8w÷k-{òX&ŽÁç4š­Ðëó&kÌã¼çZ¹«S.9îgBÈ;´±iJ/‘ÃdìŸ^Å…«‹î-ü…ÄÙHô)« (Œ‡¬éU@•HPSoëØR'ËnN ˆ }7¡¦¤ ÃÀ‘T³ªÍ ݹ†ÍÚŒð°Ó\d­ý—F·¹U Á2ÏLÝ`IÛòÄ¿¹Ûëw½ÃÚðÈÃ}HJëÃpÓÈN·f‘`¿ … ­¸¥NÄê o:a t©ó8D—¦™4 ý²k÷3´Q0¿WÀ•ÈËv3ógnè^ð1‚sŽï«ŸŠ†K…ÎÍ9ÔŸ6nhzoœ oÆ?R./ p-ÙÄ 3B¨sÓÅ»Ãs×c©”ùjÍæK™.7+°ÅJ<ˆåâ·9¯É Ù¥%{÷~VGèxX=òä3žkT¨·}åÈW&Ù=d?lø2$ÜÇóËôpûWY™ˆ>æ‘Æãe…[˜ÈpÌ–WPnx§Šv—“bš¤p$Ä÷ûù^xc²35WۦؚjŸžvÆ»¾?»Ñ—J‹QP.É÷Ëñ‡z/é-ŠöâVû a…ß5ù³Öv(>Pƒ}È@Y‹¡ÈØ_$3ènÒ¸zÅÁWU{È#óÜëý93¾C2:½CîeS¡[ÄÞ× àãˆJƒ´‰£$ù¹ãÿífãuTÄ«yD󺺛pý2AMúÜ€ÙÆéДl3†ÀÄ©  „*c]®ãm!!ËjÛ3Sè‰8¶ùS¥“ní:ÆpÙ'Ý.mpò 1Á0õcø©ýgΤìwÉ\eÐ`þ·Ü]`ÅBbÉÏi9V0ì¬o¨·;…~4$QæÁZp&‡¨‘p`;üóTCµ±ÉW*èJlâ¹$A ¼5¨T¨›¯SÂÈ2«¡—újEe&ÀdœKÁ({½¸`¾rÖ }јêê:™_šÇO¸‰d*A–øiáF*Á‘ëv¥Fî]õöÅN™â`"qÚз‘?“ˆ…¹Ä.í¿íÈö¢¾éq1c}Øòr='h£âÈ®¡¡º:]p×Pð†+ù Ñ`,Z'©ó†Û]‰Ÿežðæ“óäƒØòG$>δ–fGY–#¶ßßÔEÁ ß°ê¥œ+j§g}~yà-¼úšQèn8\øë¶¶î³+²»’è¤ÜK·æU_ÔU=cì›Dâ1o–]ËË<Êgk3—źzqnà$.è>ô ³†¿‘²á~º‡LÌT›Ñ–e\•Å9¦é¦Ç–‘õ2 ý,"™Õ@Dè±B!KÒ˪È<«‘RÉ)­DNnóû詼™!{S§ çdÎl|8òaWvì'%+…E¢q•gè½Ìn½‹¯|9kŽçºK|ZNè'í·6ÚïHý=HeÓoóã|¢Šß¥{i—~¶Txª_ðÚUD §²@ʹšÌÛbB¾wQ‘ÊŸÛö 5i·TàTØ®S0/¥BÓ>~;íËMØH`2¿ëÍ´é PgÍå%Ò¦Q‘cÚç/Å:ç@/ÍÎ߸ϴá«ôíB¤&k]Ô‚IÀÄ“ÂE‚¥‚q{©,ÚÅ£v÷©aSïh^B ¿úÉzÛÉ# /̦h¢n¼Äu yìʾqú—åÔèwÜ9gà )²œä2e‚I\'6²y‘¥í˜|”—ÿ9%ÙÿùeMÒ¶ü­Õs2JÂͦô±Œ´GF Ò jQC$VS„Àç@ƒæ+ÔªêÐ —>÷âËzÑ… V3VaG›Dô di‡R&ãa‡Ô´¿ûÔw -0TìÁ›[åœ*$5¥·;×ÀœG³úxû×e¼@G?Ë„§æ¬«¯AQ†t6^xp÷fÊ÷ _ „̱9Ùð¤6”Œ\§=qÕÇ1 ª³Ç1>—±Ñ–îF£UÅÊÓ Ûû‡ðy­•ŽÁ©PfÃ:ÔÐà[Ìm›EFB«TdTÌÚÒ·ss—-žö†[dÒý´)D*±ù$+ñ –kü;5®SãKŒ µEewæ²ñLEôIóaé|òü¨îÖË£»2 võ˜/ ŒgÛA£°¹h¬ï¤o}–çd“BöŒë†ƒ­È?(à] ËòÄÕ‹A½,uDŒ(Ì+ tU댔—äâ!—–¾R&/Zàol8=ÀCeàc%®ùeá÷N”Æ c„…qF\CüÖglò(´÷~ÖS-M€i.OíRvå1‘¼âb~c—f\à³ðzD¸û<…¥ ç³ÙÀ<¯urÜ[¶×œY„]*J3?Ø O2ê°ç«.²»%Ò™œK ÎÌðp, ÄÆj×ûIÓHˆ|wËøè¸ìu ÜÜqÑ´·%ô×8Ä+ÇW0Ѳ V[’%î·.ü©‰„?Ø4¡OŸ³®r»0Þ¸Ðï,‘>Ýð]Òûy×OS صUmä¸C1§: . á¢i²H¸OžÏ¦l,^mã¢Ü5<î–Q§3IõÈ<}qRŠì]¯»‘2 CâÒ~-ö3:Šð„“c‚šµE+DYžúœKM…ÈÁ¦¬Bç"e«Ásfùò»Žçl¾HÔWü25È—7 ,Q¥P«Sh•劭‚£SI[8Õq,LÒ¾ëG?Óv0ói¯Y$øPy¿¨ªôt‹0!®.žwzóu9+Ø5ÿQ*Šª¶Aü³²ÐÄGé¥MgŠüÝ·äŒ.b®>ÊÎçË Pæ‡Ü#mª¹£žFµÞ+*-G¿¹4&( RF. Ž:Y¡ö gtêBEƒ¡—¬DÃÆÊ¥¾uºñzèØëÌP®*_nŨ@=¼¥ßë9 ÍuûBncµu?=á–%•ÜÝÑVøíÜ) £gàæôy’6­íSÉýˆÓÝ¥]:†±WœÇ"‰¨(q¤¶ £¦ßçÆÓ ¢}fl⦱}°…“Rª)9ô‰¹tJ9~ûPhÍmÐ?x·ø¦×s>1÷%7Ò™O zz»oÔŠxVŽ„f‡Ü² ºÎµÃÁ@ß´ßý íÕ7Ê'áÆ/°EH^ űp["E€{àÚ“€×òPÕó½ ΆH«x´±Y8*O€'NÎt%a~Ž9KT´Ãû Í3.i\ -‚0Ë“Q nOA«_zà:Ÿwœ… ä@É‘)‚ÐëXúÁ+ñ ¾YX±|цDÕSgŲ"¡ë—œf}Ý«ÄUq͉‡6?”íãBðÊòüfiºB3 ¯™¢ù`Uq©>è·Üñî:CÉÔX c¸—ÕŠS3KŽðM´b®(;@Ä” &Z«Qµ\f¡ðeñuÀ-îº|q¶‘eIÐêpŒã¥ 8Äýìs˜)ü"¸9åÉ"ªJ×E¯ÄÒëKd6 ¡Ê:ŽÈV&“,¿<”dC}5Û@GÔj6¬¼Çdk¯À!Ë®ùbáMÓ»²¸n!•\±ù¹e¶ŠÝ%ZÝçGßAïm1 †:`šd4Y;éôì‘d\nN{¯x6W–âФP¼ªù”èwú'‘¥1i=|U–{ÙÍl+ª%ò˜Žrˆœe©6Ã^€¯ªã«‡@^I[²d~Šˆ*š@ªd[ +2XˆÃ?~mcšá!#N1³7°iXLÊ*4eÇ Ó3À}5aŸ±G`yj¡ª*wÒ:¥rÙ¦2¹ŠŒÿ`ù[õµÙWóé] ÏtæÁ&Á¼i0!U)Êdþ7èöøs(3W7ú—L‰ÝšR¶þ£ aöÞ«Y:Œ,’|÷KèäãIù×…ð-&s¶äô“Ñïƒ;¤’%ɨTæòNÓ°sÄZšê/>Ï¿ššµû¢õýç~RX’Hu^D*J½Á Ç<6Fò†ÖN\ûÅmË4»æ"×~Ñ[%C _‚-ý¸B%j)ø…#?Hç…°íl´ºûJ(¡'þ›Qy½?Fš°ŸIDÈ‘&x½<õu,Œ#XSÙŠáÏ)¶—ÕŠ!›· „+a¥a+•´M΋ßf É^ýsîݬRÏÈ©WbŒxUêŧ {£C}Ä/‹–'ŠÖ†™Mçé;öO*¸]ëRĪŸ¹.v!MyîèãlŽŠD{Pø+¨m77²}©Ô:Ùl·Å‰Àb˜e º'îü”ZýúÅ|2ðźY…ñ$ýîÅ•ÊЖj\u§G¬mlÉÆã™‡++ïƒöÝ‚h]E¿íQƒ~c•¤ ‡d:ìCÃË÷ß™¢æ_7£Ç¶/6ÙÃkX*@a¿Å|ìaèöÍK-x,É ŸŠûÁõ„.ä õgZ$eñq”Á¸ ž´AíJ;:\³™ lh£]Êý{Öv{¯;¦/NgдQŽÅî~ñÆF/›ÁªB®„Q?œ0”~¥Ç Ùn5*-nµÜžäÑ™+ryƒS=Àá‘Ç BíS“-1Ò"ßu³NhT ÔÙ†pÄw Ì÷€’¦N~k·Bá+*•î2iðñ¶$ê"óÛFWŸìùêÖ¦M×ñRþ™wââ o² ?ƒåÇuƒß’Yþ ¸¡Ëƒž7Tù)1æÂjØaý·ýeNüs¦,é߆F—¹h߇"tª&"P g:Çijò{Üðº¡Oˆð?äzî¯åŒ‚°Ñ|¬Fª†…~çGìùôû¹Ü¿Ðl„†MÛ…:Ť2ƒh‘½«l?—xÞD& E 4pŸÛ3ÈMSåÿ†¼5ÖSô&ç¯ýv*lumÐ×}§Ç\xQÙ*V06¦[iï\ʲ#…^*R‡o÷œ¾±8¶7ÚùêR/‘3Æß‹®õä±Ö\Z>ñDÛ1dñë]P‹U¯ç+{±Ô·ñ¼ôŸ×ßô»§äÌìj3RÕÏn|?ÜÆÇOq œÒ ܤI¾fA´Ws‘y‰…¨ð3±:¿È÷Þ>:í}÷ÿmÍ#­uož_’1 ¹ý6ùò›}é»–øiQ2ÊãñI×T/)­ÌŠ*rײ6QÁ!ô…Õ !åÌ’ð¡Ìº²ý°-mphËhŸî’r÷È9]kUñÔ´QÃÉVp*åRÞØ'ŠÎÓÁ&©~Þ÷>úI`›jHÊ-ÐÓ`9a–K¾lê35—8Ô÷B ÿ·ŒêÿXþøø™¨Ü3H¬ÄYèÛ½Ú·ôìCùE!+~MKÃ]ùö0·ŸyÃo¾[f›gb2óÞ)­­Z}¦‹D#†°Ô†„‡Íq^ Róã•|ø #HgÛeÍ’MÄ©å4!KÜ?éà½ÜëÏ%@âA"ò¥Áwy«Ätû¤\æ8ß”û_¦R©2•Ù†ŒùÜÉšcˆÙnˆUÇxK­ŒQÏV(šeâ`™FrßÎ35Ö¿ôàºëU·À´ Ðl_dw7èùÛd>BrØu¢èäNIð¡Ð+PS¡K"tk”»¥¯¥æÆo§ˆ»ÕxÏ„%.°ÞaUµº×˜køËiÚ,75`¾t°›·Hˆ5YÆ®0.Ö©AÐè«BO3ƒÜ|^èÃ>+4‹cN‰‚ßVÝ#j#F«@›5xöÌýºdkŸÑEh\t>{}ÕÞâ0ŒÅ–ð5HwTÏòŽ¤ÒŠo ’ú¨¾€Â)¨Kœt°úKà™wXÃà7İÀüwZif¬Ù]R¯EL¸ 6õeÏ«a—]‰ sȱ¥‚à;¥âñ¯aÜžÕ 3žÜh*/-Ð#F1æx7M­È [ªV1Ã,a 3ÚìZ„âd!%¹bwH+¼•§B!öKŸöŸ¯=¼ƒ|òûäæëUÑ# yýÍKçmÛ‹z„Ù.b.UYû>áÆ-èÔ™6-&<Ëdè®ÖaU\c™œ.ãø??~ô†uî´b™H>p|À¬ìš®|Å“qí¡—%ö‡¿®žLÒXÿú5!õ9]9¨^gu_½[‹—*`yEЄîÅf ü™BÛªˆ*OÈC`wxtiiïB_FÅ¡ÚQûÚ®¾q‰f?Ì u--9 Ê ¦üá3"*a'XCı¢WÛ³¿0„Û1…OØTZß)싃œÓSwÔæúãØKD†,;íøYÜŸkš…ª{J‘ã•Â¥’T}X}«OØuS3c⬋SRJ\ÝØUDgÚ»šÃ µÃhâòq?õ¾ ‰„og“£é]±Rð+·ìoûîCZêoíVûå’-z™~·w›">‰íàxÆÕ½@ž£>œªz7Ÿ” vΰ¾„7¨Ú•Õì• TtŠ"îí ^49KM¶*ð„H~¦ ëãUbÈ"V®Š6ñQ8¯Ž-·1Aï«Ò5këàÕ‰X‡Å’Ùj®0}VªóÛФ7þT€÷Û˜Nª¦jYes±€%á‡Ýf}šÑ6õ6‚s\½Ö9ŽÖDpÁ¥‰ZZÞb8Ó6Yæ<|l¥)) J=²«?0ÁÇJ¿I¹2ýêüèĤ¾JZÞ‹«ÿU¨i½ë°YøõYÔ¿üäÅþû¸ò\[ Ô¼ôh‚ï쪀À ú2èY}¶ ¥Q6ê;¨9æ8êìg‚{¥òqG©xØ¥!ÂEcט2;w~i®ÄhJŒPÏ*0 &SÐ×2DVÎÉ>ðm>êÜô…ü­Tš^¥€}Á Yõ’Á$d{ÑŸ.0‰yËȤïÿ-7DüŠz…gÔ¯¦“müˆâs =Оæ.ôp:ju_>ƒ…Žæ)]$Ÿk$©õáSÅzzÍw^!ÉcÀÚöÌoÜÙûÎf<’M6PãJƒ†¨ƒ~…’#©/q7$=l¨”[7ˈõv8ž2ŠïáÓð@öcã%TÉŽÞí㊗mÛ@í¬ðHô²ñV2²º¼ZÄ›°Ãt…¢aª'Ö=Èo´¾¬×ÜñêÕÒ(—@¶&\Å¥›ÝãÛiñÄ¥*ìì…æ UPõçÑÈ+làòåxëcÜ®ˆPŽ0ò­ØÅÄ }š†– _ÖâÉ÷sýmÑÂ>ìØè ˜ƒ–ñt*mŽ “Ú´Óg¨Œ=q®' wŽWÄÉ~ø ¼ä‚Àµ¾wN7W;¢þÅó¹e"u–¿Ññ’žñ‡Q»E´úUP&ö B¸ùJ÷h²8XLøWûÏ<$bhÍЈ*ÜVF¿?m©Ò ;r—ÿ®œuH]ù·ÚdÆ2Ÿ —ʆ5¥}Ýa@ó¾˚·E<µ~¥é%l•ɶ±jfÔx ± =Cfèqq¸is$aÍÂg¬oàý5œkçGâ ó‰žúšPßFtŠU±­Qó&ß‹7o>tÙÓ<¥¡œö¸EüC`¯PjÐ¥ÊôŠˆª‹ò59<–ÄóDt)‡¬ÇD£¤øUnÂÀ‰e9~¨²“zȯõ¸ÍÅh«‡¾ÚEL/où0ð4Ö6¯¹íUí/Mx%t®Lâ)k1$"%®‰­ÖBµ 7/»“ž¤ ÉÐt¥¼æ•zÙ;Yë ÌH$íý1 ïc\¶Umš_dc$öóxOVö(¸XR„ôŪ…ÏÚ¡+ ÷Òe`ƒšš œÝ¡Ë+ 2<*-ÎüÈ;â!ɯØÊ—nùb| œ‰ >Šáüe”„…No°ÁWŸPngù°C!¤-¹Âêj}æï¬­û)=É©v/þ!S:òºa‹‘§Ó̪jÌIDk†4²ÌWI3¶Úl÷àf©,„v ¬yö˜è‘äð³EY‰ (23ÔÝ€N“ϬšVcF\äJnyOß Uñ¡€¬…Ñ+-Z–¾:ß\Àéñ–#Ç·UGnÏ\›1I'ÇåpÙM8ÿž½BŸ\²—•1üóðèL7æG±äöÀ· 2‹0<­Îqº‹аº[7Ul´áïíÉ_Þx$±/æ‚ 3ý ÓBYIÀÝj|U÷aq6 P4a± ý‹ ءǻ%ùY —ºMÚ‹´jsèï$ ëTÄôñ…ëÆûЭ˜‘ÖÅ›53.”™ÏŠöf™kMRÂI#šW#)x‰‹,ÌÜ! '(;¤âRõ,'V¸É‹Ç< ÑùT°i"ÓDä Xéžj /R€H·DÕE‘¢Cé|C˜Ç€Å½ê7ÓUœú„•g$ó$B%hÊ ·¬„lï-0ž“8®û/sûñãEx½ÀJ^v>/Ü K¡/u•[­é†lŸhS [ø¥pU1„ÞÄÄ97,"Ú.‡í“ðVÕwpTÄ:¢‚Ü\õákŸ/DÄ“÷Ê™‘ i…äw¡ž§Ë]åCݵZûÔ=ö®ÛHÈ`H20kJgú–XZ{¡V¹çCéühŒ$oáˆÍ”pÂþKù9ÞT¼Ñq+;[O¾j òNÞ¶7Ée^ÒRMHÉoØÀÈHÆc¯ð_ø“méiâýÔúõÌñÇhÜoê¤V©k½ÊUw ø?9ôXD”âÙ0…¿hœŸ|¦ÜQL³­µ²Ó )蘄Êðû&ït;™…ó-ífè(s^•ï‘·XžRûÈJÏÁ5w­ÿªœ¹™—–ÛcÄņ܌ÕZk¼’~2º:r©Ç9Äö §9j¸æ¿;˜·ÿµ%ÆÂƒð¡õ¦•öF/¾{“hÉB>Ü„èâ»ÓwáÝ4Ñ_yèå_ji׉ ~{„Xë\Ór¯Í®"Áz²¼‚ž[Á»WèIŒ_0õpS½LÆzGXÜÖå}áŽl_/hŽ­0mÚ43{‰’±dD<&ú…ØÖÚxÎ ´ò‚¡ùQ³&¶o³Â…x,"œU‰Õ ·0Ë&â>yu¶”KÇÅ5·± ÇPsµ~Y¾uÈÁº£Â 65Æ"Êú2&UŸø¬*Åo>zn7ÅÉOi¡¯èk5»TÓB¦äÓ‚¦IͱÔý“‰•^¾¿À uJÆ{p*6ËÎY](íŒC=ìl» ÄìaÝØ|Ð7ù|è„«+ƒ§d{(îƒek©¿ä± ò"ùÓ»B' ^-rr3&Àª¶• .jÒ*öëÞHœ !†5©ÎëZ‚Ô|ªÔr‹•‰ÜzcÈD°U Ú½)Ñ´ÿZ¾®@k¶ORPŒPIüyZ”S$¹ßÍw!(Í›e—›+…»ßçŠç“Ó~C‰Ÿ%Á¨·EoýÄc¶jå\òÐó\Ò¾,Ö[ö·Åá?’G|Îiò†®*Z9«ô€%º#Éå¥I®Kļáu’+ù †!nºWàÌ®Ê{4BÞcçâšÜ{ųͧ¡×Ýi_àñ<¡»cXÌ‘$Xœ™·èã “~¨>'󾬰t¼ñBÝø‡Z×'ælqÃ1Ä8J_†4îùOè#¸–ÅSÖç\œ¿ w¯FrÐãwdíKŒŽÚ-"Œ‚f·)svÓg¹ ¥9¶¾’¼°¦œñÂvT‹:×tÎÜú»l~ùxïI/¦žûðvéÝ2RÁ¾{jܼùJŠUMœæÂ͸Ÿûl7¼–AÀW³<Œ_-·t’7ÜD×]®™G¿÷A ˆ„ Ï‹»È PU+‡Ã3Úèwò«¿øb³óB !Ãrè³a–?%Êó‡V1šßÂ'膛OoFtöìO:ó%È2òó¥¸âS äó£ˆhØue’‰h•­å_jŒ>‹3boŒ"IÏ9 ÿ@ý-ùÑÄõ~Ò^“wIQÜV½sŽÒå3griøÒçgÙ¬{ËD¯†hWݤ±ß¾äÎàO4’„¦úv=y¨À¯•Õó̆$æfj”kb°Ê4꯺DΖ¸]¯u©$o±~Ö= tjÀ»fèDžEÓ‘yþ׆W5þG!—éNŸöm‰î‚$?6‡gs§Ì¯ÒW`M3F=sÅ|Bȱ)n€ŒÆŒ§Ý…ŠªÈ í9Ð!+pYŠ‚>*‰7â2¦¥H±W4¥´ÐòÔ^R2ùCݯ‰P»`Ó0“¸ìš',ú½~´º˜} c*E½Bbk¶‹´º[ÚquNc([ÖžR½ð+aág§yIJ&ì—4h+÷$ÌA­c°q°¨`l)€UØ6ûõ3‰¦ÚkÃØÍ6ö$âϺ¾,0kQÈ9Æ]Ñd! ˆT¾Òõóí?ìsíQG‰ÙìPªï3å ,¸z¾ãñÅֆЧj*FMгoXÅ¿XbW1ÒùŒB&qŽØ%úç "€;EätÙpc Cí‚,½¢‘mv$ZZ¡"ƒ[2ÆG²™Î-‹Ó®šËvï”Ô«'‰§`ø<26Îýá² óPõ-¢`ÈŸìù4ŽO±ºàÕ¯|~W\VöÒBneEl:3O㦡wMä'-/Ð5@E•+ ý–[} ‰r/ßè•æ  ¹>¥úþ_=\˜[áygX0FšF>É—«Ë§&„ÑçÌ œûŸï”7íX]sk¨$iî¯[£™Þ挩öEC–L'ßè]ÜÉ¡5šì4нJ!_ép~Íeº³G„q_‚HZUeà<Ír±6µè0é4—¯gSƉ˜ðb¡,°)-·¾"t4©¨øÐ cô‡7*vCŸs¸ÔžmfhîRí ăc/*œ'§pÏ(=†ËC!j³N}ÒŽ1'öï;£šö%o7Ü‘MÓ1›ëµ%½Hõ¹’Ã0Ðzë¤u×34÷mJ lœ÷ње‘¡Weåx«Æsií‹$ ´·rÖÙQ(:ÏÓD(Ø#U„˜ÆÒt÷üHUþø Ƀ8²k¤V'þ©¡fö®¤GäYµ(?åð¿Ý»~鮟iM%±pn­6&tÅ’´ M¨)/õžDÿèÎä)Ò&e”Ä_Fyþ] y¨óæë"q»Bq·Â4Ü7µ%á™àzض[þõ»™‚ŠÌ”èD˜Ç”Mœk*24_þÓ3=¢+äèggÚ¹ú”„7•q|ª˜ë’âTFŒ4ž¸ŽNa|—ÇaØ®,#³ÓœæÐ"½3-³òS—Ûà«þºmܺ$Í_i«o>­¬r³ K;bÓ—f{öc£9ìpeå:ã62›kuÓ´e#e§ßc©àèŠÊ»õ«Òî¡Ý}ÑÉŠ{Dö*<¼úz0¾„º¡¶å±Þ/D&aèÑÎʦúˆ×a]ŠM| ?= Îbå ¦Iïj=àN ˆÜáŸèë?ã…àìAÓ}3¯ãô§µ]Ü=­fõL"ä÷p< -AÆŽÓJ¯ˆÿŠ^„ìiù ú û ºÒË—·„ÒÁÿf,#0GyKí.§ëÇéØÉ3Öª¨.êÈ!ÑÃóí‰2l4òxˆýz¯g°‡ßL®dðÔ«"žŽ+I[þ% ê­èc1rÏ´öèèë9‘þÛÙݱÃPåSC4t+<(t¨¨Ñ«—K¤Á àÒɧŸŸ™[^ð²ðÑS£†;.¦ˆ¶ƒi±$yN„3žàÊ Bc¥1-qµ“K;­”¬*ùä;x÷=¥¯°:£š_ü<2L äÃ9ZòÝÔ À¶EÒ€„¸d4HìâùÁB§WÜTü*È»_³¤–¢©Å^þǨT<4®¹¸ZÙO(„†%IÀ3…+rYß×¹'ûP¡þÃya’ì÷NÖ½>áÂ'ISJ^ÎÈîC ,®ñ^ ³À‹X ‚#è7µ„Ó‰ºÜbZÏv›^…ûpÅp݃#Eq‰\³„ô˜|Î(bÞâÆkEû@hŸh‚ÁRè“e‡$À~n¢í<Ž$õ Gÿû„åç̘ËÜDVž¢zË5òЦo8R2QäE2p1‡=5‚=†G_~Æv»ÔõZ¨\ªôÓ)‘ùᛟ÷kÞeéý½ØLõŠT¶Æma‚`…ØRç¯"øõú;’‚S97z–j:•J]Py­yÅ?Ò{–rmá{±b2E×ÐÅ~h,?èãq)åW£wv¶fa±äýX¯Jós8ó±Qí(õ–sšVUkÞA¾™¸Šçä r0Ÿö ­æ@’cÜGÒŸy@;ÎIˆÀªçÄi¿¼Å}ÄT‰øaÖ¥; ± qB±¥Çg5YeÕÉl+XÄù›ºã`pÓBäÍVtܦB`î°ÌÅk1R– ¦SêˆäGdÈ=®ö¿½ZN.â\R8o`9oôÿTžá8sß ‰¶škþxL‚×“Ç Ýú$Ùg/Ä/-5Ìž`]`Ð\JT˜¡œ‚ÍýÆbl±UÝ-H®ˆ™úìz¶¡^E.¾—™ÓLÇáx÷èð'\.IêZ“ˆŸð4L3jˆ÷ºäбzž¼§FðTó°‘±¦½S[õ)ÿv32¢w?_—Á~v'dò6!…9Òæ)rîZ1ÐQP¶Çq5¨V¢ÓMüt ªWû×ÁŠ1Øo‡êçÈg›ÙëQÜÅlÎ¥‚†§|7[=ƒnDo«ü²ÊUÛìéK ÷‰Ÿ¾ñüâ"v\‹Žz‹Æwf!Ê0´õ¡À‰®f!uY*Ûh<-!)%Ö€¬b ¾ñ+uýÜÉ8·Ì[‹O»ëÈOÔÅIZ[؉ª‹¹k3lEc}AÌþˆiñJ2FôV€œã¡N)ÙðBEåJòæúAY%²ÎוhŒ éÕP‹"Кs@˜ÁÐnÞŸ~dõhQ:oK1ÆF)Wð¨w±yú:ÞRÙhÊ —Ö°Ú¡}.˜ö=ïX¢No"Ÿh„®Éé«[ɬHqñÊÄÓH³zЙÃ(è§|™}À•Ïò\dd`Dz'}¨‚^ç"ÌJÝèg%=>Oìn)¥³9 ”?È‘pÍÔÏÛ….ænúE>¿ðÍRž÷<çnïֹÿ2ú€;÷%‰·˜_o2¼d‚GJh¿ÍJà"4sn]Ôc)$3uôÙåK# ÿ~9|‡—ؾ¶å¾yy\úï9§ÄqíŽû'ãfŽÖeBƒÊúÛð Ĭ‡„À.+Ðë ÙS~'ž=ªXÞb¥ ƒ.ŸÜtŒ Ý'm7ƒH°omA¶ü–3‹†Ä – ˜{øÔ[j^nB†v!æCV“ˆÜ1[WfV}ڌ੽-XB5ý¢ rl<¿ÚB¤½ï©,µ¢ÂºìDu.áæÁ ¬Æ{Ú´Dt¼FÞª¨jlV± ‰O .…Ý6+Ͻîð¿bHé³QtkÜ·¾ûiôœøùÞ’? c •rB¹y!~¦:ùÜŒPW„,þn`¹ï±rBÛ¸»ð†¢œöç.e“îuꡨ“ZkD3”–Fä Û]4iÏ÷u \¢@Ã?Qÿ¢ÐgÂÚ™,Ö¢²ЭºYEg]¹à\¦‚/Ã…ï"šÿö ÃVVJxUÏ'Kx_ºžOFÊi¤Ï x6M¨'³XÂúêT‘·N·~[‰©•BÔbÅhn[êÊPUÏF’tœ£É¶Ã5ü[Ë žÌ‡¤ ‚–ž‹¢qÙ)N’íÑ|2­BíѲwfµbø#wi3 áöê‘Å7½¡áäîM`1 0öäZϻաý…u’B80¨ Ì3z©kõ¦Î1¿Á"—ôöáb[¿BöLø|}Fùmã éyæ ØßÍ'*ènÆìÑ0«ðƒýxÉ»3í^ê.Þ¶MxÜBmÛº­Ž4Wð¼Ð½KafcP£gÕ8šešÉ pÊÚÄ!ÕnÆ-­>[4}Åth±àÖG鄉l– SÀ½vAmGÊ݉Û:¿¥‹[ÉÌÎ\ÿ²à¨ªåÃWôOLŒúi©ˆIðQ¡øA½ƒFT°çtŠdkgÍ–tµ_kî¾ùÀ ëÅpù£è4|qE™*hR¡ý—Ç ƒk‹ä2‡áÓõ5:‚•.eq4<8çZÊ©Ô9œr7ð¾Fõ4ÔÜŸpʯx·ø ±¥ö=| §Ç ðIOÓÁ׋báZ*ñ(üä9³âN+Y(a০षÇ“ô×Áoa ƒÁtA¿wbÎîËM8ë&r­°(°0Øa´pó»nÑz™˜e¨×:Ðq<æ”·>ç±€ïåOÍ{ê›zœÕZiðk=ŽUû±{w‰ú4Xgɨ’øôý×ú†ß,IgýÀ²¬mqØhKTtE¡[tÆcN6б;j·>_,’%÷£ePÜoÏ« ˘µXµfé– —YÿŽÊ&¢î¥4öþʘÞJ)PWË&n‘|]¶61ç®! ¯„Ï( ˆ¸9 wï9;‘),AÞ>S©þ/[ººYµhÜ kš%túq69»F ™ÌNÓí(†¾œkEžW!pø³"%ÍU²À&Ð"¸ÅÓÔ_Åú'`wƒ6ª@ãÚÑbAÒê‡^d¥— n¨6{‘؇Evnúª:’‰4I8<+ó7§H˜4?yÄ=D¡o¯«K®s{J^¥Q¤à‚Gvzv™6›Ëw‹F󛭟Ԝփ>s"èR) aî}½£¥ {p—.¯C!d-7'£nó#/b0"íM^¶ |èwa›‡Ÿá(KLÏ7Ç¥‰S9týC— ÐëiíhL¨Í©_í7k_À£AIäøn^ï¡fê7 ®´ôÛK4ò Ùn¿#IèOФáQÂN%ûÎS«VäÛ|ÅéEÌydÈ™] áÏ^"OÆ«¸½üDƒ€z(OÛ÷i]S,›}¢½¢ó£´"wu[L¨Ã¨Ì.®æñ§mG¾ÁhUÏc`G´ˆ£<Ñ@ø‰§â_2:…N¶¾Á/ñR¬.O‹$bP„´MÂ×ÅRbFdSy¹QÒÝ1 ãžG¡2l$ÒsÞ×Ç:]ÌS@ã¯R]Þ? Ã4<ó–¾'=ZË'ÙîÝ¡bÌÜÌ2¥vF­CÃW¬w'`#ZcÝ(»ÅTi]¸ÂáŽzó6ä:“ZØŽ ~‹¸1KycÉMò87?ÝS³½g(uÂ÷„SÄ*_&"ç=¶”äh£MÂb÷(¾è U·$¤×\üÀdás>„t~Чú‚ø]ÎýÖEÐNp…ƒ9zaÀOãU¥KCé$ò}oùºïŒø™ÍhVŒƒEñµÚÈ•Cµ‚S¾Å!ýõjâÇEë\ÞúW?·–#ž›2ne±|~›j?:¸mü³¦µf¸MÌ9Óƒ¼)ºëã¯ëǶ×-c”œõvž½Âú|ŸÐ®§ó T`c¦œ/_ O YRÄz¿UE<=„ÝΩٚ_aôvFmSvD¦0Y¥½Z€ ÛWFPÉ—òÜúGRÛÙ ®Ü ¢XJT¶lL‹Xbý_WB¹Ú<#Òq|ë ðFÝ.~- Q&yD¸+ØÕtš³±|ªâ^ƒ¡üöµ=©êU»Š••󆮥”%8¹ày¹æ¡wLã®Õwó‹¼zGf*—`‘‰æÞÈU '²R¤ªÌ¯çÀÎ—í ”nôÛäeua°_Ãk©¦ôqüëßLGQ™å¿(W‚;MÝwÌùÑÌ<ÑÓzm$X³•¿¼ºó{…j)ܸ$–Íwå5"zö~á"µ)ð꡵™ÝµNsˆZS’PnpÞSÝoQ9jªäm.nžÀ ꎉü|ùc÷Iªy?îÙ÷ć5¹öûU¹’ û…èܧàЩEKàž ëˆ‹¼³¯’´ Ry«àÝ|©Çu¬7†Â93BóÏèÎ…à¬ù*žElÀ+Ôj+T­ð&GÔØªn뜄fÕ) ¥k{É‘‚°þ3Z÷‰à¤fIÊ]¤·Þ—ÊA_o §óaÔ8÷Ôz~S÷”´ Ÿ Ê Ë/¤í ÜŽáâv°¦'¹#1!:‘Le_n˰óýèqK ›k[—1eý­;qZ­7ò’ŠÞZQº²€ìIô±níÛ^mµ[ùc×ÁHæ'ƒXms¢¸êÉMY5ê&Ùî«míVeésUã’ltÝŸÅ8>6 Zˆ‡ŒÕ]’»§X%§I~Eäi=Í£N¤’m…¸|XóYë:Ÿîßœܾ¸, bÌ~¬dww¿k/”$VéP…^ÍXÈ+x° ž]S¾DS€ÓŠe—q›ÞìUVÐ,Ù|û]T.ˆ*è‡VÝG< «bÍÙá$ãÏ52qãrœŒ˜ü¼Ý› PèÂúÒ0ÛZþ[Åz#où‘9Iß‚çäÿö ú“Œ:¨x)‹ìs˜<Ç&׺’%úÜ¿…)ŽYëJB»ñª„2 F-Mr7l昈éÊÓ¸>Z 4þ6„Š~Øjõ‹Å‹,"ö]L¡áêí"ŸÏìfO{/ÅèxsÙˆÝ. 1vû/7uàY÷ÖDÜ7îbî¸à̘üì èCÜ=ü|ühÙ³#4&ã(¨ôFÄ…¬39¢6¯ƒÛ|Ø‚Šíä>›•EU:þ=¹!¸Äú. (At`-ðy æºô=é¬ÁêƒñioÍÎiSÍùVوܗŒÃ`XçìÁhúì>n½˜ê¡ÔOÞ#¤õ©aÜâØ[¼ßH¦Á f!ɶH9:ê†`VÓêª v -}4=Ç›E²=ÎZöt‡¢ãõÛNåì t9¹©GØqÙ¯?ó÷œ4­šRÜÞ¤s}°áØA@[¬fÎLØüÇ`­‰ðDý>Yìzô.éàí9sÓaÂöλžÂv³þ>Ã=“1c`uÔœ l´+ëë1Ñ7wXÄ«ˆ,uÓ®R­J u ‰óéùtS÷þ¾®º€Q;¾rOxS²åº)89ãXå¹^ÖL«r;ݯvZ'\»VùkME°µ’g81í×sÕñ€ Ǻ÷]·;Ú|óÂÿ% é<®ÅšºÖ!eqr!ëtŸõƒ´ÿRã A+pE\›¦Bäö[(Žy˜¼€˜ò 5¹ÏíÑÕ+OIáàdäüéÅÝõ?(C‘$À5›Ê—1èka|y¿RÈÍõA…uJPŽ…KÇÒ™œáV½Ñ«r”¹!E~ˆn/†^¸œsÊ6pLÚ7iÖË‘jXfuÔY•>d,h>¹Áx@ ïüãðøPOÊ·¾5–€^qXðÁ„lAé÷*ù]LŒyÙ7ù—ÝLY”§Â:#|ˆ¤™X¢¢\I÷¹KšO¢AlRN°:èmZ—gÜße@ri•àåbž ¤y¼Ø=ªM|Föó•ê"šR™Ke[¿vàO÷uQAþšÍ÷–*ødö…eˆg´ $ü$-.'…QtyÔÏÂp_¶ÖE­¬2n£®ê`(»UUàKíÊ‚mã'¥=w%j /€ÿ¼ÒÿZ5œÀYª ’³ûʨa‘Y´ô¢Ž\ÿÅæCõøÃy3&œé°òq>5àW~Ð$÷!Š©yå—tKøßüåU¬òcCc.Ôm*±gX{êèý‚8ÒøAönKNXrÂù•,–š$±/å]QúTàCœ¢Ê̈ÇÀ°þËã mÍm*jL<1бxÃ2Æë{ß¿—î;Ô¥À«xûC†æÅâ~S—êßíÖc?ì[Ðð}œÌ•«­1ع>'/Ñ3,«aâ¹ÄÀB·ËÓy¿W ÂŒøcÕìùÁbðDí¡ÂzѤ G\ÇßdùÍhzÝñc#u:Æ¡ ɬϿÏÄ$«ò}™z!ÆsuãD`å¹€VØ Ç… U<|bª{ËJØVéL_Ò ™Â¨Ì(_±Â§áG±™“‹ûy¿´;.UÓa4Ua,œV¦&¤~z-mòÛ{ºœìñ]xzêîP*f…'Ìg-+>*G;ž?¨!|}•û“ ~‹V—=²þ[½¥´KAŽñBF*áRòU:hëÿßç¡€h¾v>òOØ}û¿]|£’xyR¥³™M<4p„xmµC…Á*È[¬¡)^÷Záüy1Âd5Joã*¾§;z[¿`Þ›')½µ$y¸Mƒ32¨’i]øàoÑà&¨äú÷ìkék9*ˆ â$…†ôº¦ÊïBGzD»I[Ó“nHæ3æ)`1t4PCñ9½TnÓ„Ü48Uâ˯b¼{Á‚Í£º/A1W)ÃÛ3;­d|5¤Ð˜ endstream endobj 1130 0 obj << /Length1 2883 /Length2 22126 /Length3 0 /Length 23736 /Filter /FlateDecode >> stream xÚŒöPÈ÷ #‚»CîîîîNpw×àîÜÝÜ%¸ww Áƒû›ìîo“ý_Õ{EÕ0çö•soŸî2bE:!;# ¸­3=#7@DN™‰ÀÈÈBÏÈÈ GF¦jál üÇ G¦tt²°³åþÃAÄhè ²‰:ƒüäìlÒ.Ö&;77##€™‘‘ëŽvŽÜQCW €=@ÚÎèG&bgïáhafî *ó¿¯Jc*í_á! £…±¡-@ÎÐÙhªhlh P±3¶:{ü'%¯¹³³=7ƒ››½¡½£?-ÀÍÂÙ  t:ºM¿ÈÚÿ  jnáô·]ÅÎÔÙÍЬ-Œ¶N [ #T "% P°Úþí,û·-àŸÙ˜è™þM÷Oô¯D¶ÛÙØÚzXØšL-¬qYzgwgZ€¡­É/GCk';P¼¡«¡…µ¡Èá/æ†q!%€!¨ÁÚs2v´°wv¢w²°þÕ"ï4 )‹ÙšˆØÙØmà~ñµpƒÆîÁð÷ÎZÙÚ¹ÙzýL-lML5aâbÏ fkáà”ýÇd‚ûm3:Ø9¸X@ÐÝØœáWzU{à_‹L¿Ì |¼ìí즠&€>¦@Ð?8/'CW ÀÙÑèãõçÂÀÄÂØ`4³°…ûdšþA›ïháÐai Àøëïßoº y™ØÙZ{üvÿk”eÄÄåeiþîøß5aa;w€ +€Ž™ ÀÅÉ à`cøü7‹¢¡Å?,‡JÙšÚ¸þ& šÒÿ»þ³ÿ”ÿœ *ÀsÉÛD PþÖøF6FcÐÓÿg¥ÿòÿO࿲ü¿iüÿw±¶þk™ò¯õÿŸeC k@šuqé_Ît lÿ¯«ðï3+4±p±ù¿«RΆ s dkfýï-œÄ-Ü&ŠÎÆæ‹åo»Ú¯Cfma T´s²øu«è˜ÿÏèd[n'"ÿZ‚ÎKŠÙÛ™ü:aÌlìCGGC8F˜ÙØ^L £htÿKÃz[;gPÔžÀÔÎî׎²³„~™þFìá߈À òqDÿEL ´v6ü½Ì`ûq0Ä#·Ä¿´$ahcó;”ƒÀ ù±¤~#Vƒôob+óØÊþ‹@a²†6F&äñ—û@üå#]…'ˆ“âo¢«ôØ)ÿF 2*¿ˆêob§öØ©ÿF .¿ˆ‹æoâ¢õ/âqÑþ@q¿;byƒäù»kP&C{Ðüu§þÏÊ âlèR±…“ÕïT W£ßÔ¤‘£¡±ôê™:ÿ¶³ükÿûèþ»ªmü/b%3¶³Éößš¬¿,îë/=3˜üA%3É•øŸ LÌ Ú …:™ÿ–Õ¯нðoÇ¿œÜ­ mþÈ ê×ô7ŘþYA‹?Ê€ðoÈÆò ºþ&ÆôËð»Û/w;Ç?ªÌ~CÐ$Ì ÿLÀªø»V,Ì=ìͶx€l0bÍÂòÚt«? ¨‚õ´ôÎòïÌl P[ÐÍñ{\ J¶.6F¿®l³?ü’ÝoŽ œvD1ý’ýïeP {ÐÏÛÿH…•éë… j$H »?ôš˜½µ‹ÓùA‡ß»ü ¹þºÿó/£3ÐÄÈú?uA/Ù¿ ÿG£ìÿ¬üןëë™~ ãmeMê7C6PÐÆâ¿"gûåtýc+Ù@Iœ@/õ¿­‚6ÀÉúO 31Xý. zœÍœÐtÝìþåpù‚ößõbæö‡šAÑî@Pz? hˆž¿É2yÿ.õŸwÄØÅ´‘νô #ø?ü×Ï6 Ðh ·4ogÌdYÔ~W-„ïF·7Î7C¶§‘JEçµäØáò€“DU•°áx#”4܃²º#Fy-¸LôìuÔRÚš¨Ôöèý¤¯<µ×·8‰50Qx$T×OK@§*¸ïýìà­îoÙÞ)M–ëà‰¤˜~çÖ'á^×_¾22¿§´_Å.ÿT>M­õÁ¿d–,Ï(k‡Ú™Žð-5Ú¹;òìõÍ ZÎÄ+‘t< œÏq4K‘—ö&sÌýœçÚgUf§.\R\mBÈk´Ñ)r/áïÉÒØ ^¥EŽ£)sXc[6Ÿ˜¬¿SzîÉ+ß9þÔ#'›à¦ÄÅa€ÄŠŒÚh•L°)!N€fÍ:_•Þp—úÉÑbäD«`ñª`ÍQǦ ϵ×ýSçù†³V“:TÙ3©ŽÈ¶—-”<§Ž)¬`Ïlð){ýàñÚÈFC3’aK‡ß¶Yf­›ÿáš*ñðªûÔì…´çt˜ëáµ5Æù•q†Ý@çþ˜“‰ ®xYCCß÷êÖ¤QxüH¬º,B—®|(¼è÷I™é¹-, Šðƒúºµ{GðTUßÛúÝàîÂúì`”«•¿ U}ÉåÌD-„•„‰¹o‚ÝsÁ’˜Üâ]G Ý’‹y¡ É¿ÔøÒs9öõòL·€Ž‘—¾ÜLEAÞúºv¶BœìÙL^ ¾W}/Æ w‰L+5”÷©8\@ЫWo8`9Ô¯|^Œv7ûÑ¡›¿Ã’Q/Åý(¹V©ÿ…B³÷ðÄ÷08¼Ýa˜×C{XñÚ¹ùÍN>ÿkÍâªýÁ;&õjpŸØAîâ®õrÃKFó¾/__^è9f·“Ñœä‡Ì`3¶ÉCg`p÷ø\æ~Q'N.g©xYT¦pƒM:+ ¤{Áæ±eß9PG^w’áïðºQ0å:ù_êÉ‹º4Fe£dÒKôիض»kŸ&`yÎd<Òg©D&Ê]Q…¬ð7Eº>+Θû½çe’z¯ ¿ç´VØÖ7$~kæRÝ»s‚e´i¹Bã r÷š˜wþˆ˜c£XAåNñ°KÎÌîe`o:oŽŽ};ñ„mñæÙì‚P®bâC›<ÌçK¤‹w5êé¥ÓØîÓšÀSc|{‹â„î4äÃŽÕ¥Tr¬ Vˆ>í¾Yª”—B¼p¥> t.ö­E)è|CÎ= ÑLˆ)"MÆ‚‹‘æô{š&kºÂ‡ÉÓˆƒ f%†gBŵSz»Måб×\Xélô‡I4Q_¥¡Ü«¸» öW'δ|”&Ì÷¸>VM:Z«=`z—ëR„: < P›mÜyÇÍÝLQæ‹]Itt Bµ! ÚZe|ôü#ÂÉw}¢¾D\Š– è*.Ü\òÎH˜í}¦Vøj!µ‘£¨ó,¨¢„Ü)z± y39qÔä-¬ö‹ŽÛîÑO[l@Èw¹±zæÈV‚*ú£1{D"ÖzzУ>Ët\‚­SÀ×uXÁš¶—b˜Ü&ï7¹ÇDc ® ELÊÝl^+Î6˜*ž¤rŽAI†Ä‚&ÖåeIœ6¶¯_fü ç÷Ô0hÅ ¼Ç¨W£‚ Ñ?GíÙ‡#áÊ« Lê“B#Øë'õõž»µ!ƒàW혰ªÞz{èè\­%(gÑä2®a@&€‡¬ÄIxå&ÁbFè÷ÂÓoRݼj=b;†×ÂüŒ¨¶uyíÒž*2I†×¯¥zM¡|5ˆg9 –c7ÏD(Wnë#ûKvžÈ­ðÒÀ0jp+x0“3³‡ †9ÌÚS_! ‡$Œ9:DZ¡e8W-‰ +ïkƈ%¥ô ÷’w:åÑÕ›÷„fVbiWÐ9ÚA3$Šk8Ö^ û Y5å;Í+פ‘}¦z.pë ¡*™åJ?p"ö"Ô·Éɺ‰Ý(4é›5ÖñWú옗ɸG“,«VÔª”•eºÙ½ÈìlÊ‹t:Ý”b_Ž…¤‰Yœ¸¡€ÔBù?V F ´_ʇĜêå§¢lê'Ë/èéWîùB{Âf~fò+u†’·à'ºWî¶xÚ¦"u†…X‰”V›:hÐ-%=²;„ÛÁP§ÚÓÐߘYZkç:¾3wÆ`áf.r^ºXò ÇO#vã½q :C:©n§—›AòÂ)ÛâIb´}0J¨píC×’§‘NØ©Bïg'Ï%=ÎxŒã…÷@ûñÞùv¢Ò/ðʲš^u7 ì:ç;yj(çÞlŽgM–„]W×è,‰ö—{?e”Bt÷Pomb½~ä¯nb† ¦5Ó§ÃM6¯™Ñ¬¬ø F•ò¯Çxi72+=,{¨?kü+Ì'¤…ÓÒëÚùõJи\sfâ<¨ña(¤lœ›g*¹Mäߟ¥|’Áß7TvÏí%~2!îP†ÿ”á–Þ@}‘ í߹˵Ÿ‹­RÙ/j‚nµØ‹—`DZý ~1R®çœÌêcÎŒ_—”sì“ü"UD«ÐÃN±Y„»5j_G’ô"¯ðgù½»!숂jö[õ=º6Ê&bé†&í¯š°¥ÄºUž «‚ ô~e÷˜l'á`t±‰¢²õlúŽK’{‡_ÌJªÞ9” |7«R$KŒt|6ùÑ™Üåž;+ôl|ÔŸ:Ò:‘—ÿ¤e²FDÍ}gmb–Ÿ/$÷ hBg[zXåü&A÷}CQø€µùð °4å ò÷d#6ô)j1X¶8Ä5UóÜ5k×N®6|}*ðûYÜQR{‘Œô#BšQÊf¹عöeÅGõÈû¼‘AgcƒÖ¹ÜmÆŒ˜¾Z¿JN¶ÏZB”ý‡ aLÒéðTxUèŸføFlÄìcb¶ Pó#>TÝÿ  ú¦ÏºDøÕGF+¯Š¦Ádž_Ïx]=’}QL{À™vè—ê³Å $Р@T÷e&‡Íµß‚S˜í…z (Å}Ó¶C¨[ìBTñ•¿5HŠ!u½r¬×l»Ôe¯UÎy——oõ~³ÒM Û¾w«þu,±÷y˹! ‹p¥‹XŸ Ð>ÓgâXëUôd‚°C›8-øS—f±1¾#BdÙ³åÚÕëÍ!£ò±Ze§ÌE-ùœÿò!>Qõ¼/q«»“ùL²ÂÕhï¥wkÁλ._z/š í±±1Ç`ãšÁÒh¨ñ2Ú²¢$†IW¦ûRL¥³–νÃœÜ ”QRÙy9Ë0Ð`# ìƒopCSyiòjËow™îÙ‹–þßøÂê}«Ú¸:÷<{¥¾¿)htDJÈwjÊÛ …'³B«9éñ˜Åƒ¿‹¦“å>ˆºeÀü¼\9jn¸˜ü™{g’Éý~ðÓÏ¡]ƒxhõ®¤ r11ˆFc¤ù; ‘•”Á4ŽZ:ƒÁ%Ò7U_ä\7`~þÀò® &wê‹G¨d×$î3{ok2ª“膺äoKd²“b7kGt[¢|üÉŽi‡w­­"¬†`±â]¨»\œT§\ÇÕRQÕÚó(÷Ó½–}M›‰Þ ôb\nF*­NýÂ0žq[óéCõÄ éÌfç…óOì¥(›+cF0ÆŽ©D-?Wâ5ð˜|…H6l5óG/˜ÀÛXƒmãýe»Dè°ä…ʶø¸°ÍØøN4ôÜÇF)¡Üýëû^—³Å|ßUw/;sb£øÈç\ÍKňŽ}JH ï¬H/"ê$öÆX‡ò#ÑõoÇèìïŠ_SEg²Q¶à…-îqd1Äb<ê'~gº0øª-B%“\ÓK¬zEÿ±i³¯¤!%MÃÎq)q‘-Ç#ž³Ÿ¡uZ½u§ªäj©¤¥÷§@ µž¸Ñ{Eüý˜f?:è§³Éx6½-Ï?e&¼w%P…Ëœ/Ò£À| ÐÊ¿ˆ¹ÒˆÈA& ›÷ÞGã"‡ÉìèGZ7uä@ÞjôSjÿhÛDe WBÛ;aЉ€è ÀÑI ðSPv–`?ñïIôMÀy‚=TY*~«¢µÔ8ðÿ„¥¼\éÂQï€xÜvgic ‘Î’C¼zŽËå˜t„m{ˆbàÒÇI\ËFŠWgü¦ô^M-íIa„ç£ÏJ)r3ê PÄÞÛ¤Ñä{D"³Ö¯0PàÖjOv®EÏ94¨u$Jdž|}¤¥j`à.¼M˜ÒìÊ)7#õ«£¡®6ë»uØd×÷½m9uÓºŸùE|‚žVõ™Wg­ž¯1ÐÉ ày€5 PERÉwQŒJ¦Ý ­ñ7°D¸gÙ@b•moæ˜DñIžèù8[L?îk ˸Ð[ªVIé£KrB‘%+Êü"­rz>º!&²Â.Í”n©Cýä€9 ijä³Ù¯*ÑŒÞßEÜì:‹,ä£üdåS£Ž0RoM«úv×î™×« {,æó8¦ BÈòÑÝ#¦ÆX‹8"O8¿5ùÕ„å³Y}œã~éÈu³'©à±¼¨zóðvÜ@EùC£Ö¤úi7ùMìg‘šx«=ôŠë.’ï)9‘&ä9ê®È RØïàÍx¾'2Ê™ây-&<гÂ&Fª¸IÚÚûˆÖ0žÀ<]y\ïšú•f ±ˆÝÄÐ+£ä#o@íù§@O¨y+ü,¥iQ#$­wœâ[ «Ä·{®?`3M* ÝÜb˜=×säaÀãYè[¨ðý+ìƒj§Á D°…Ø"?¥Ár©üÉ7ºläÂÉðßìäŽv¤x#ÔÙ=9ú“Ã^äsnl Z‘´p ãõ êu†òÇû›WvžÀ˜/°®ŠÛTèUO;{Š8dȵ¦ºd± Îþ¾±-{;8Ö¦íBV0ÛyhüÃó9Á[ D>‚aúMµ;¯Pe—ä¥TPïïÇüªÓ£æiò°I‡ã˜÷-ôÓÊ„³<]ßœèŠêÓ|÷óŸŠj ª‡¢¹o¨Ü“Ãgli¹Í[ø06ôm7@´rsiÓªWF[¤ªÓ~ ]°4otFÑï³üu©iœ&—þÐY¿a𖝏G‘jùr²$Û‘zu‹U#Ø~4ž@Í‹.ª±t*@8ÿ‚ç°œ›–gh 0êí°n’ •·¾5Îrˆ9ÓÛJºõƒáÒ{ZNù¡‰Î ³ ¡Œ‡}_îÁ»?§×ìãO¿[-€K¹NõOJ»ö¥WèY3¼4k1äc·Ä¦æîù ¿(_û+“å:MkŒXQM"Œül ø–wFÌrÀ/ˆ{áÔÀ……» åMwΡï)b¶*hI”1ó s=RÄf¶ý3z Ózñ-'žT¹˜pÎK«—®tU½û¦\Ó<75ä"Tøªã!/mñÁ×ð§­2î3^ú¢ßg£i¿G÷ÍÝ Ì‹g-ZÕ3}¸Þù^ë*µv»? Ñ™§„¶Žv™.Z3ûãòÑêÎ)9ßœ¿1Ý 8>Ç0ºL±šò£%™beHóÐ0?2\ƒ„†u’¬ÿ”DZVènÃù}ñÍ›µø2òîs—k0òŽwBà!¤(Qѳd1\ÆH$(IÖú·ËB¶Ž¡†»º1’¦QÀ<ƒßDå¤Ð$îúá7c,7–«oKF¤%\/ã6D3I,çÜJºGlk!·ªÖŽMW ƒ;ÅÑõÚ«DAWt‹ÔÕæ:pÃ@rq¹¡u•g¼B…ËëehB’æ×¨¸«›¶¸}•ߤÓôµ?"¼ŸXW»{[Q賈ð;ÛDZcÉj”¯ë֫ɇŸ¢ë?ß­g F2hœžÎœæ˜ñ®?KÐ|?-ó†Õ[ï› ú„-ÃM“údg,Ö [G›ä£ »”p\—<˜è=24hÅúW ŽL¾²D’QBÇÌN¿£¶KEÜi0éÓ‰¥b9‚Kr£N\kÜÖKq\y ¾>zÕÀHæ‰ÀÑh×&º.#šb$uúçr—0 —X#ˆ¯ÐMĶ’™½ ·ÛB@LÉ-sú‚VŒÁ“²I |,Ze˜<ìÀÕ±@aÕðÓA¢´·:‹)‡n‘ÄçEü°ËvÓðÁÖýRf+±fšŽtV*ºÖbK€%êÑŠÖ%ÉHíþ> EÍå~œxÞxž„&øjÄcLŒúƒÖΛ)!Æþ°ø„_ÄIˆ v¡q8×µ²ã|Kû Ó:1€|ÕM•®¨îš¥_hÊ)0f§7äîŽQ°¾%Yé\ùSᤠ§i./åý˜ôþg;<“v±­¼j}xešnú|ÇuE”ƒÕrL=¸a¶ÛN…8kS„\¼ò¡1d ¨b1ìZƒˆz\¡¬þ2±ìY.Þzµáç´!Œ±B#×¾2OÛ¹ý€!wE•ùI¯E˜ô™øÓ@Œ'ó{aŸÎïZÍ3ÇÌ.Ãp5sx_…Õ<ØÜ8𠺔iß|· }»òõT㥻ÐÙ‰Àæl¥—Öt g>¾[ä[|ü׌+¥ŽOÁ[1má³»Ch€´»dX1+Bäf/lëvCvÜš§ª—íJn2yZòyŠ¡*ÍìÕá»O¯ŒÂôÈCöçd&aç{_jµ'pW›ÇiÔÛH¦Ï•mŠoWÇ+‹Àˆß¶4_ØH³GŸy@¥¡º@¢->«³'f«a«¿!LÛàh¨ ÎHj¯DÈæ= ~PsåŠiOßàã­Éò÷Ò{Df:ÇN"\XZÇ9/æùöØ6| Dn¤°Y _IähÆHÙÏH{šÃÂò‡·[ÊìoþðEIè+›)ù—üèÍ®WOÜÍP åä_ý!¡L\~LÀ›Tòry¨-0hܘRûí ŠºZâd_Üê#e㢂¡d’„÷Z<E'^Z£ò$¡¾©¦ÚŽSbó-2äpljrëfTµYýXM7D: M{à°«€ž’¥r IÏÙÍ(šUÉØÑº=$DJ>ˈ#ÙÒ4ÉcóþrKtЮœ*‡U:§ãù^tyø ¡|ºí}Œœ¹ x·í7U,4à•p˜…­‡ß":÷jÉÁ*̵‹ÌŽ¡˜@’ž0F„œ´Þ9fð…Øgc©Mg‡ð³OAŸ¢ÏIZ}µwX"á6ê;91ŽÙi3½Ô».H·´5e,Áäv}ÁKèÂ?iOͽßEd—åšì{Çj6´”Oj’©‹Õ”¡´$Öy¢ íi¬Ž×HC÷¹Éíõ“= "jŸCfjσ2ǽДUs¥T”æCñ>A +œ0QiFFþqæ…¦!6=A‘[:;ÇZ¯’'ò £ø,[2Zæ>‹SÞ™ û¬]”÷¸ NÌæægˆ=ú2§“[‘”§œ“~¬™àØá"[ÅÊDN¨j4öäèçät½Zy…÷Ìâä1SÃëŸ.fľ ‡IåAø·iDhvvî 4âL`]nš8DÑ¢UueÅà5ÛÑVÕo­ Ÿzàž?ïdÞ3`Å‘,8 O=Eµ¤‡Ü‚ƒ¬DëaL­M0ÜOloß`ÿàg͹ û²W{’´~Ô±4DÅîa–©Xx„klꜯAaÑ&ó½_RÛ*2÷3¦ ”à禴5M<©§ÇŸy–³êo÷®¤5Ç[¯YÕÀß%„ZEUaÇ k|‚\€íæ ˆ Еo l¤–‡OnaÑ™ª½ƒu„ ðB-ÞðúŠ ¢ÜÆ>9/zyÆÚÙ4é¿f)j›'ûNUwüeR%wa~XKöñÅ éÓÆÜgbYÆSîî]hprBÕæ¯ßRßãándòOàjèúpø4Nú¦=½ŠûM_{hýñ>P#¾.øpdÌÝŠðlÃh;p1íhÇiâíá$$a¶uðHÃ3L×,Õ},žÚÚV®§×™ÜÀï‰M;¥®J?±óÛßO¯…Pw®>î°¦¯ )Ï>)ìÅÞ.ÃDkÑ­Â݆¿qTªôBÑæZÞdXî…Ohâ®säˆdUXÉå‚û¢0ZL0Ï­¤Bé~4;l>X¬BÜ,Å©ó{hàîö¬¥9 §¬¹¢f¶:ÿî’šÂé¼ã×OùD¾[Ó|»"øþI9äMyÈ-¬izÈvˆDóZêehaR»ðÕ·ý³hÏýʆƒóôõ tcÏ]/̽,Á„a‰A#¼àshâ¬Sb…Ž ÐPÌ_^®lˆ?¨"V=@\çñÀ½umW©Žµªåw?€ajXKÉ‹éâÞH8Rl®Ç0Ñxe,N±÷ÃvÙëwsFN® `? ^u/È{ÎúÆÏHR¢°‹ZéR«kÜ# uÈfLwV‚¹vB~x—i·ò¸¥O¢iº.ñ-£ Þ­jÜÍ6Ée6á Ö­»Gü…ÛþQÒàœ%Ã׋­¬ýütSóXçøûÏi¸õ€Úþzâ¸Ò³ãÌÆÍ çúÁDý©ŸëKÇ£8CåmÚÒ„U‡Ÿ´œýãêD)¹e—U4r—F©¥üÝ*8e\Š_òðU‹à ‡I‹:“8Ôð»ðÊ>p‰²yrÎËN!â±#}Ççû¨Þ|>&h(´ÀPР!Lë¶·Ã ý¡‚îV{~#[×_ôC[ï¡ùve(—Í™½Ë¤ çàŠêúgÖŸç[àz%ämœëžï1ì}µËj2V(x¤p[êÑ“¥œ–^F2ØQúŸbñ[–x ‡>Äa• Ä,Š¿n~‘ OÙãÇho¤ãu<9 “-c^) ú²•ÜÍtŽ%ÅjÀí¾¼ÏEUÈ×½÷Z5B£ó–t+‰øý$;˜ÕbÚeõ3kú70ZJ5Ωe®=ŠU%xscö« ÊÝ`5N§e™ãódÎ:”ƒÎPŒI…Séfu‘qÅ¡ŒŽ %ôÜ86üþÆ9‘§ß!Ê»ÂeÒŽU¥s‚2›‹ ù”Fn°†ƒÜ!Éz–' –÷út$ŸŸ†›ü—b´Æ uˆ·vÆI‘gEê©Ã8ƒ*×dŽë[Œý„ž?pú‘-8ê:Ç8òšï¥MÞZ[Ë,ùŠ'÷$Ó)×ùÉ‘5+¼aCÍO;Šif3hz9R÷Ç|ÊÉÀ5e¸å}Fn¹Ð= ¡ì E½E^ݬ`r­=¥Sê ¨¯Ï” òÄǘ“†6ÚÄón‡TW)ÿxwüŒ)NÝšù9à¾î•”>5 ¼<Ú‚kÌÅkÙðË–€¼•0 ú´ý‡½‡Ÿò>¬UE¾~YÍmð ¦cZ!¦wW¾V£=¾á ºƒë9ÄÞž!϶ivìÂf<|Û£¢»NïÀ^wèL¦…Ä^÷r'Ô( f ^7;øx“ãt3ãx¿4ol;¾Ž·Å·*8ã¾t‘ûfƒ’' "õ|2n¨žÑ#X 6(þàrÂÞ=Jí”Vb¸¯o9¢‘þ ÓhÌd—ä`2äú(ú ÓóuÀ‘tÛvA/G^h+ŒE+¨·á;CçЭžs9æÐ!¤O,º³÷äÇ~v XþžžUÃ'4e+6ýÜêÄ·|Bö<:«8qÔ¦Ö‘sþ¾ûÛ„óXßeôïÈ=º$çžÃ”ƒ^w(Ödˆ#të1¿_¡ÈUùÅSZ–×ñU½YVêïš7¤TãAÑ6S‰,+ðàÔ³ýÔÿªü SñŽ# 6ø3•¯@vðn¢KÝv F Z Í´ùV ƒ}a9ÁÿÉQ²&­n\ )>,F.R$J„ˆYcHNœØ‘”ຣ¨Xêºö¬¥0c;¨£S,íÇÊé~‹ÂGâ'@R s:Ê”J°g ¯Y»/ŒÖ³òSjñm&½e²ãGÓÇÐRþ’#b¿ýÕ## [RØòè™rм£FòHPÍw2¨Š!~réÐ l¸é?3ʰæF6 Q馽Y>˜è»Nrêë­êœß§ñw‡ì¦ÊH§7e×B-Íõk6Q}#îÒ=Û^¨"¥¤8à–µ¶=cXV›|["¸Iñ¦PÛ®0Ñ"ä~ÄíÑZl°sJLŠ"…kÚ’|–}mûÀǵš3»l 8?•$Z³õ¼tÔ ×¨}-l”Š/HS&f½šx­Â'eOÙóè{FÞÎ|³ÿŽÌfAl~ç Ø¥­@ÎxkoÒÂcϱ¯Ýqf< ÀµiƒÁË .naÃ+fZã1\ ©äjL6 ·Ìè¨çKñ¯ü"yg7àùƬ:ÂÝÝ3ì3°LCÃâSyòŒ0óA‡«ÕÜœ–4C‘É%û'7ãr´$«ƒÕYÛ»?#s¸$îöX†÷Qx0ýMÙ2?ZÑ&èÈ˨xaM™ÃN#ñ,\,sXP·ƒ¼ÐQ"Eñè6Qì¾Oa1dÜUëËŒdˆ¶ m®8O£J¤ÝÔš….»|v’è ‹àMJå–0¡Åj˜ý…íÎZTÀmóðÀu$Bye>8¸"Idö³E^NŸH‡ì…_Z#âÓê$Ž`-ވܨ OÒŽ òlÁSwiv¯I¡„j5%á}+þ}“CŠ-“"3޽㴂à)DVè¢!_·]%µŸqš°Þ#Jj ­<‘ˆ7aîK$JÓaç|‰5–lB t5žEcuC’¹Íap«ó³ôßÈ{ÜšÀ‰H3Á¨Zøˆy1ÊP²žší5j,çàê¢yÔ;d¤z§1صpí´Îé˜6 ¡çËòµ?\ýd—L¶ë s$C3a_m JaßI– ÌÙÍ÷/PìE#2<%”ÒµÎ@Àdßm{x5Ðæª·ó&Բ횄調/>€…T§’q¦çú3,)ìuá¥H¢VBµÏÜ}8õ3äOŠ=­£õ©¾D¾Ôf¯ÃËÏu‰=xÓøŸ›²ù-x³²sÑœMñP;Õ;”ÇZÓp»<¥SáÅã¢ÁÇ5­4Ö,÷øÌ=Z&oo›Ï¤ÖÅQŒz`,_ZoQRaÁ>e„ìZêæò;hw3gÙs²$‰ð5H û‹À?׌‡¥S˜÷œù[”‚ž%qÆôµ:oAô4¡,¸c‚x7šÐך›@áéd'žfÚܨºnRìí7g\[yZ f*’ì†lUÒ·¾¼µ û‹=› ™Mô ô¥B5õÜ»ôm/­ø.¦ºR±n"ãµZŠBªSú:[Å´^‰WO ËItNtbš8FòH`‹KJækS-!ž#ßz†¼}u¢À!aqC1­»(ð5- ÍiÝRçŠG,2QIGYM؉ãp¼¶PÅ£™ŸPf›0kXÁ(hU ‘P1º£·ÔQŸq¢‚þY,ÂE(\ý«éBGPU(î1rçN^¹´òðq›ªoi@lCþE‚y*µe¦îL)Þ.µ †¿„>”Ïôõ¡_9XYaS»×"ä7ãGÁŸš8˜0åjÚHô1EY5?Œ1“ðç3¶¼–Ýá©ÙQS4ì‡C"ùµÌ:šÖ^ ZnŽyGâ`Àð®N¼ãeT5 Ñ™mm¢4kÿâg¿8hwÕX…~à>¼ÄÆŒåî­ÃVÙ±|oÞÁ!þt7:,õ8cf¡Œ?ãѹ”Á|DU¥‘@±CËæ!ÏØšÔØI‰ò@FU|&´š„Lº…sTÔŠöJæ#J«€Dã „>aà{”¬ŸžõôÓ¼ÊYO­Â2¡lby»MoÏÁh›m2öDcf«)C«û|`§c·x×Òιø:ýx† Pˆ2ì’Ùm{ÞÅ¡ÖçŽ:Hö=çLÏFB§ùʉgª~ë-G–¦ üÄ(_@W^ ñùèÖgÒvÀm„hÝöF×aIÚ•„ßìAdÇ×oœªFo#ùZUÚ_ú1ˆ˜_cÑK¨þ:¡÷âê;¤8‡ô[’9á”}6ˆºˆæHø…H”¹ºïÎËÝZ"ÛÐ}í¸(ƒ€ªæÖú«5R‹ŒÒgÇ{ØÓ/v:Ä㺫Öôº\o#IaY<â{lßAîO6®¬«ÅÈ¢]¼0ǽšpò+”’ù§Èòtf-o:êã¼È9 ’tQàLú=}×ÂŽdå⸡°êOPûnxµgI&}G•5ZeQÞ(]ŠÜûQ f{4CÝÝwë°qf1dNérÎÆñÛ†[ÐçÐ/»«já»ê›ÅX4ë>Zè[WEDanQY3“PÄØ$ÅÖ±|Ÿ£Ä¿¬i<šôÚúwJšii&‰œi{WAe½z?…²úö8îí´‹òÄıl"JÈ.û±S¿í™áåD6<6UkÓ €¤'¾¢å‹RÒbÍ[Y7›Û‡~Jí‘à7K|R9B_sGb;œÖÌÆìçæD‚6*¼eòë \xßµžàá¿OÅ ýp¢56­YÛyt´´‹1QåÙÄÆÌ {âêA–X¶W°^f¿×ØÿñÃ$Ø „„a7?U1D9Š  –%é}8­{âáÞ„„OºÕKS¸ÜpôBUðõ!KRÊ…%îùa[,ð=üWø¥H'óO‚þé—¹Ç_Ë&ƒôto;M¯ùµy<Œ:ösô&Vù¹qzªß›X‡ Êm`]¾IïóÀ­<›ÆÈa™Ôv/ïIûÊ "Je_ÔU ]Ïg@žÑø:ÕÓ)QÌAEÁ°AB6ìR7£sŠÀ¶é‹ªui_'¸ Húdˆ­½qI /º8Uz˜Fgì“™ÒMʲ¦/¥žÛ¯*æ&r裸ŒAøho}:/ÉÊÕXÊWK”ÖÜí¼¯,Ù_\‰w8ë1q˜î“_…,Â6í‡<\‰óm5‚éB”p³|—ô܉͊úÊ+„áLߟ;w_8'{4кñg´—„ëÇ“pˆYÃ{¢H¢ èlòp-?99›²OA-]ýïæãc£%Æ5ÿFxj§ÂÀF“.­fj~PGné %ø[Ï€lòÛÛi¤=hÝÜ9œ¬tü Ñ̹B-"Q¡£]…íp¦NþG^cXDÁõ„ôºÙ"-‘ŒZ}Í%þÙwÛéµBS‰­ó}X¡3H{°¼ÑËóFðÀ»b1Þe¹¯4΀H³×t_«Ù—¨ þ¯ÉíôQ)ÖÙÐ1ÈÕG¼FÊZ®4„y^ìÁ„!©cmàÔ2#ÅÅìxF ÅÂXi5Càs¢Bî Ý5FðŽ‘o/«¬*3wÒÏ&r&¤ÒE›1ÁD{¬a‚»5äVFyI¿Ö.ªìýÞc1Ľë|§zÜx3¸}‘e‡ø\àR·®ºN~¡m;¸çeÄùžtSµ.lS/ ­Ÿ!W‚¼øh¸í[Ë~Á¿€Éd!¶íkOïÒ,|²‚ãÚnÌ„øb˨IQ­Ç›úЖÛèÕ(|áºoFÜþxÒ͆WT’¿E9þxK6:Úû9Uƒ^2ü=—¹××+3xc1’严нòˆé* ¥¤ŒúÐM”—7´hkÞÔ¸Qóï†-Fwö˜ß •ÙÅLÛÛ4de2-åøa1ÛÎ:`ŠE¯ÏåéìÅ u'c]Ñ,Œ¬««ÏD§‰'ŸYárìÐûƺ ªy_ ñ!ÛÑQGËâc`ÅÅÇlÑxØ÷Êà@À>¾MTúÌK 2U ‰ƒšù#©öV½ qÖ×ó,¾Z¨qû"ÚåDW%¾œŒH„µÊJ…B|¨½ÈMµë9> à@ieÀ‰¹ö0Åè0‰­% Ú«éS®ƒê; ÆwF-ú®Žw?¤4Bµ`3š‹³§ý¶±ÂliréÍWcGð¾úªà¡S[Ë.ß}ùdSùþdø1Á>)·6œo²t`yCŠnH[ñ-ôlÓe†yšöÂÞ>–h´Å‘?Å®»ý¿Ò=Ôþü¸»r·°ÎÊ3[é­2´Ñ–~j_ʯwX{Åu¡¨2ðca¼oi£¿µ†\CpD­;ã ]A&³€_ÉryŸùˆÌ¥!kÍjPYŽˆÌdõEðZóèåôÄ¿ÈÌ#ªvϹHÑ‚. u0u.\¶ÊŽ„f{ߟåšõŠÓ b¶¨ÿ,-áEÇIFÓ?Rrk⡭ܵ‘±ÕÃöMi‚Z3Qâû¹[¸Ûðd9™ D’".–j«¸4úûµ#DeGãT¾Ùà7¸¼ë#DDˆ”CŸC·pZ4ÊöI,¦0À¦' ×ÕZ£ü;'Œ2»Ç”gÝ’ÊœÏ>L@OÓkn šÎø /=ô[´º*ÞÕ}Š@©$‡ƒìß—Š,Rª³‘Bïè­ºQÅ=¼äêì®l¥’ó€üXóc‚žN{-¡FiMý–éAN†ìUÁû¹º¨Ú±‹‰"ž­C¨øKÅš-ôÛ°‘(¿+Aµ×f%ñí|æ*¤Ã()N™Ú%¾gý®£NŸµ7òš-qä>þ‡Û»oÖkZ¼ØÕéÆã™Hò%ÛW2r_ëL§²¢ T`G´xaFó–½_ÕDPÛ+ÛD}­Úž:* šÂ Щ±=éË@”{J”iÅx·+’»öã—׎W\…\¿”o+ôw³ÔÈ^ÈfZ,‡špXîå5¸RÔJz E´L¼6wƒ·{Œ w.ÔVÒ=Û\Ø‘p‘޶Õ,M6ØîGNví š8™‰RŒùéŒÒt§l€¯ähø,ýrÝ©*Õ»ºor¥Iô/Þô__¦T<ËŠBüR³ ‡t5ÝàÙ¨ÜLâcêŠsŠ˜ÚT>Þ6x€gðkVSê¯uÞµ)üÁïúÑÅ_ ™Ã½Þ®ß<‰JýÚ V‚–ƒ14„ÁÍi³óp§Qç#ŠP#Åó=~)­¾¾GÛ[Eò¾êQl“·$º™‘0ÈäÒïó â#O›¿.Žò½G·ÂôžR‘Û<…~me(‘}쩽GGªûá8svÇ®"³Énþ¼‘a•Y%>/Qä!—àh)S X0ø1iþÎÐFD‘qÎðˆŽâDÒ¥Ù‹+¨5ü€L»¿+€7÷9UH³Ã¶-Òê¾O‚´0\æ£c²wŽ\ñ0Àä姗k¡W3™AºZ÷ý”;î×øX–¥iV<}(£[Æý…æ‘ÆÓz…uÛðE’ÿuÙ‚-±%ÌÀ§ž£P îG9ª­1 ܱ•¢Â»Ab¯í+èÏ %s^\úɲÊF§‘_"÷³[i!â…t^Éùò0Veˆ²¿%\{ÎŒ|jÿ8–­§ÿÿ¸Gå~‚J0“лh¸eóäójõU[Ù ,ÿ—¤s ÛÜ8îÿ6ò”FØÞgoÿlÖ¨P'YÍþ‹Ò¦§Lþ´¶çì~Ò`)Qžß`?'æŽâ—Ê7… ³™ßUQ_#®Xv¬óôQÓpç7øKj_mèpŒÀØy›½b¡°Öz]…ôç˜Â““Šv ÙKÑý-‹µlÔG k/ð‹&+w6s;p2uÐòìnNþx^éJæ;—Oü,ŠŒC&¥Ÿ ­´g;.oÓŒ‰gÄ>oL·}ÇÇug)+í… xÒ¶eÍD±8’­×ÓWw¥¡ä··g;IÈÉFvf󙲿«µÆiÞà‰Ô¢ºPJÒ*§²¦a@¢õ*±Æ|…+fGïø~ýë¢6êâÒÄtrÒÍŽ}¯ãLÂùzZ]|Ïë¢&SÛ¤>0mS†$©—XoÝ©*èÖ¥ŠK‡Dľ2óiFÝ;ƒšD§Câ]Œº`æû8Þ[âÂD1|“Þ‰JÈ Ú5Öù(IáCêž,èýM›õJ„§•Ø;DÕIÎ&ÃÙ¾‘ÿOIgެ×H¦"ìG* »xpñ8T˶ˆ ¶™<ÒŠ Î.Í|ïÄ®jâœqÃÑÃ¥ ZX8:x÷‘5 Pn¾ Ì÷W5# Èšè”ÿ+hpDY¼ýð?Œºf},(- %'êÐéÔ¾4ãÍÒ÷ˆÀZçX²qÉÔίŠ"¤í=,È?²NÈ¥sþe/µ£sÛ>B¯Á(–›Í~>ÒTW{Än»ñ¶*' uxEó¥gæ­µü;Õç^Žlæ'”5.€‚á—BÂþNzú¾ÚçRü^ÓõÆrç`ŒCDZÑa4ì#/Ë ©äR^aO)ýI'âáD‘—mæEêi-×Ê&íÓx6 ïU{=ÄÏ -Ïð-j „¨ñÇé &uUa°¶æñ=N¢•äLf½†´*/™¿Ò‡}í(üŸmðY„w`yÀpAªûße-wÉoXò×Ò£µ{×ÀQø¥ïIBM<žŽ£Ë¼²p‚Š~­Î´3Øbº|Íý”ËÈ u±ã×ßBgìG¨aj_Æx¾3MOt ô KÉîøÇ#ϰ’ñyBóÖŒ Ü•ôÉwƒÐe¡²â¡¤vÈr‹ÅJ»¦9<æioäÏû/,5D$Šáˆ¬Dàäú‘™%{TzÈзoÏRjH—îv¢­=xÕ¶‰†²9ôªø½"¨)û£èoóKŽ—ý.n׎f­²8EMí:gZ3£>´,J~´Gf¶ÅŽ5s‡w—Ñä «ü)é=3ëo=œ#jFwõ=„Žéž£x4©gõ2fÒµ±äJ¡²í9ðÄhv>kRnÛDçX|‘ FÌ0 DêiÓ5]2c¼4´êæ‰ýAr{·ÿvX uøt-z´ŸO?:›X¢¦ü?TÙ}O(ßP1aµN2õký§æþ…¹àh½uÁÐ.<9Ië†Ð6 ÁKíGq !1ÉŽ,ÙÚCXQÍfÍ»n–ÖXè“ÓKše¾ î($0r‚ê©þD¥¿¨ÖÜŸ>òŠ/‚¬6Ir÷o‰åxùŸÏ!“"ë3«Çä„WKÔä‘'#(ó;ÔÍÚ’Í Þý´¼é¡”vËÏq°üYÓEÔvÂ7Ð ÑQžÝÙ¼bÓÁÀCžg£žÆŒˆԣ߮N9n¾Ù”¡¯óé·ú ?:p’ “OjO ÁÍàÏÍ %³©Gìü ¡_LÖ½BUÌã•uÙåp1ÇâµK0϶¼El\\ ?”uj »'ãÃx½ÆYü4 Þ—>ˆJÇð2§^S«HÖ™@;dÏ‘»ý’·˜ØÚÂ=M'Y³e&Õ?IŠá¥+^h±ÞÖl}…s$žm¹¶Aú¥)Û3e-x0Nuóå>4¾ÎжŽßk7`€CCV¾Ôq‘Ã{4ÅåеËË+ªÙcÓ‘¼&ÿ3Ù^dŒkEsŠ;ídؾv¸’âÖËßå‘|åjà„^”Ý`’øéh$ìÛ¡o*zc y³¾ŠRôýªµ®gNèp¼ò¿àÔO‡|ßuÌý·#âJàòÎo#ÇqN =^}£ŽQŽ Öø·€Ð¬c5#Î/ÄÉÑÀ\Š—¼xbüßSÏ’$C¨qU(ó+žu­ ].#i}Å#ÈS[ÒÐÿNèHX>.`.þzù­ôÖ“Mó<Ù^6îÚT#Ü{¨°À$¿/Æ1§•Ùñ.F90{º³çRÀàÊüàá…nbš­I‘/õlÖììx0Ü‘€‘IZS¡Ü¡åRµ2Å^$‚ïTŠzHt¼YëÕ¤ÅÂÉK  º$»°j3™—Á’h» Ç\>˜Uƒì ÏÔ׫„ÂÝÏ]©ÈôWø«¼¦èD|‡ ž?Ö†¹cÀŽc$'ȦTÞ±é`¬Þ•JÞ†-&²".€(lÛCõ‰Ý& lØR•ÂЧ€ºò{9{!W¨b,hÅÿ·ù$ªÂŒ×çj ¹Û k©ùȱ)¹Ó.ûCýùkÔå´¤ù5yÊÉIOÅsañ«¹9¡µ³‰€tʉ2é’®,XR)ËÔÔäÀ½ ½¶¥i],µ€›²äÔzªð©ô5 âk ‰L,™\\ß¿lŽ|9Ž­¨Ei3a£5¸] sÜfR}Éf4À›ïctcm „„©º…Yññ¦°¸ËùÒj-éb¤§R«È:—¹[Àºl@šM¾­2£q¿Ï‘s®â+¢l0w*Ê`eDç‘7Äé-‰¾G#B'Ë£ä×îºY«l$’íž1ô³×#·¶ÿü¾àœ}‰k‹HÆ$`*¨ê|Q,ðÈ Û×n?˺Ò˜<Í×·­Xý oCvw'hÝ|ôœƒ\#Ú9®×®ò`愵»o$ŒþIŠ._Ò;•lXþya#ú7E. ùðõó³bbR}5¹‚nc"ÄÖ#»Av Wç>€lÄ ø´mÂ|êX6…ð¹6,@'õE-‰ ó»Y[jg3Ãæà…·ý‘ëV34fÁ¾'ÕÙat WÀTœXŠ;°,x÷<)ÝÆåyE>½4±aPx¨6Âv.6=AHÜÃ`y:½ìµîÇ€¾£˜_Aÿ²×B>¥Ù¬Üç˪¾$ÔJ"tzCËNë^Vp,ž®ÖÎâ"ÉeO¤zÔRÅ£Eñ•.ˆAú 1ðF’£Ùž+á¨z„Û›§0åC*˜:x­°=&òîûJ”¾†Ñ…)Š7_TSP;-ŸèVÌjæèß¹fö;Àò­µBI>l=€T ùÇq0[pâ{¶U„ýnŽ p.+¾à\E1C9IîÅ·÷¥@G”€~¨l Ó˜uíá#vU³1Æ¿ Ϙˆõƒý¥,ºò=Û1ZçSL6)xŸxÛæøƒÛ”Jm°†ÄÓÌ&i¼Å¢.ŽëýU>h"ú,!Eë–gP:ù[sY‰Fº©Iÿ4òAÙDßì‰û§()«<)£€±Ø|¿ZÔŸ2V8äRbÅT œyÄGÞ„G9ÏîNmÊÅÚ]_h °Øì¡ˆÃ™Ã"®wÚLïóʶëPÝdtM’øÕØ7Δ’ÃßÞ˜³8yöžnFŠ%˜@>ö®Q¤¯©×QDPy,ºÄlœùlL0Øü®L"Âhóª§|tü½m¾‹×ªTGÉz©€Ñð÷`KWîÁžõîïÀžòCÜÏýwKT!Ÿ¶—c‰3™-ÏÕF›ü;GíYb-7€Õ…(;0 ÐT­9B¹ï«NuÂ.‰ƒ})Žìì©\ŒŸ)üæS˜ë62àÒ%o\­šŽ!¥5ÓÑR=H-ÖcU|xëæUñXztÇ?›"Åà§KUÚcªÁÿ+=ê–¼p¹œÚ¦']_Z–pW9çaØVsÊòÄzR¸c¨ŒEóœ"¦³[$!.jžÞ š4H —om{’dÿÞ÷Áy »ò˜,,‰ÍT2â°æYï&ÒÇä= <ô§¯µi—¿è_ãÑß6Éâ2zè¶L*£#kOifTÎw¿EfhÝèÞiEË÷Î<}P‘âÜR­5zìÒš8 •íS:¥I]{`á×j±¸êgMìçùÎ?²VÄŸNKèâoï‹]ïë3³œ«Â5Ø'£ßÇæÇ%&[l"ù× [¬T¬ÂÜõµ-Î^O§Ñyý†šeýNi%×J—åÍlìßá Ÿ¼³|4o*Ù` ¤D†#d}öŽ {²Þƒ,¼c1²m‡šì‰™/¢Cˆ*Ž“Ža³™#ˆ5GÀeHÙŽð„°?™ÏœyG­,Ø-iÁý¢‚¯¿Ö)Ú0d@]þ¼â‡Äà0ýúR¤ Ý}?Xd?§#:)µá]È 47Û)+Ì Aìèø]^@Rü V-ž¸…°ŒpA “¬IBÀ:Âùoòw°œFÂ^&R‹èŒQg¥¨eÎÜLÓûŽg SÉÜUsÅoøÌ ùà ¾t~Ζë6öÊrïルéE+è/Òú{BY2[)@«À 9Ènœ‘A2±jcTæ+e ±£8’(Mß1º¯®3 £Š åí`ü¦,DœW³ÀKà/ƦSo ˆ&…ÜÏCsêM.DÜ[×ÚžQ_|þ ñª(øIóBt㟩~YCÓFß<˜æP’_â9¾$ŽÙuÒy%{Èzjm€”àÜ‹,à:B$ÈñÕjwr`2qÓjÅÄlŠÈPš©§nUeÒ ‰Ø—Ä8eüt­ÍR,OÖÌq| ÃJÝ2Y<º¦òæ$×;=JvvE7ØA8ʤQE‹Iµ/SúÖæ3P³÷¥*´]¾ÓJD?&;A£4ͽÖ8iÆÁÄAòŸ.3j§¼Hº³j F…•!ï~¾ù¡½:ýÉ!PÉu‡ì¤æÐŸÜÏB>Ú!&øõ¶ë*P‚ fu*¿M†õt;hSïv@˜ž¿Î#xÜH€,©F¬»g 䨮œÉ§ñf :àWñ  ÖRî­ù<…£ó_gÍ s!Áç¦iò]*÷v4›0â¦÷DÞ„c¢Uºÿ±Õ|öà„obŸ4Gû±†q" ùާuuGf¶P–›íj”Ìp<$ÍÞ÷ÙTmò¶WF´kd”º¿ðãÏ휳e:"Ym)ýþ€DnŒ{œ%ž•¿æ2LÚƒ}È>+½ŸBr[~÷I~üDæC „·Ï‡·nôý5YÆk#*Þqÿ–n( #0ól̵d1ÚlJÑLÊ[Aò©2ðs”ñœ•býÑ ïXä+€G¯ß3V’0Ï}‚Ri©N'õIvTV¾§Â:Á8í’]+yÝÅäØT©òÚkuç»-ð£«*d«6}&à—Xs#TÚªU&Œ©ß’Ö? û¾öy¦-—+Y–¼] a½ÍZ#¹ NU^*ì™‚ßæ†¢y‚3 .©hse¼íb·ôÊ)c(¬`vuÙ3™ï¿*­.úuÅ’);Iu²–¥,KuÖpôÛÇ”NÅÒsK àk‚Žìi‡Zv"ŸkÒg–þ<?íÒ¯KÑ*ì9¿¼=-P?Õ¡Ò|IߟÜghsO{ ¡Dtß!»îózYVdß1>â!‹Ë(XŠè7¶Ô PQÒoì7QƒbÍòñoo µô÷¨¯©7òwÍÇrÿÕerg„(Þx 3ŠZT«– &h#œ/£ˆ@x€2° òUìÛáœYoQ+ñ90Ù7Œ›D¢Á¤š›°!–ä´j˜o"æ`‰X,>|j·ÍêËí)ðeOòÅõn•oСRžV-Ÿ¹Ôð=6?ŠKpŒœ¦ â"“,'yð¯êšP¤‡éäø¦‹ƒK¹LK‚ ºí˜/a¾ˆe‹qjT¼‡,À°¬52­ƒ•O/¦cÿ9 ¹×°ög/¿¡¡<æ~|… s®GNª!«IåÄ›‡*kã¾<'Qòÿü˜‘p†F×”¼Ikx)vÍØ'®ôÓòó÷4.²7I6ÛÁ¾|Ó'®Ñ÷œ®ßÊf`iž"´\o€Ô·{ÿ[ß®ØëÊøZ×*8ÜQÎö=Э.Y) TqÆoËe㉸@€à¯æ¤Çȵ7ý‡ ˼<¯-Âk;`þ?°¿æÌ8,äëw›nž€‡»ß­S£™¦ó„•èW…Q´iáTJËP9öﻘQ¡*&(g(]éÀI7Æå¾4¦r`LÑ€Î%ÏÅ«°fÏ,§üŸ§Qð‘3õ¦o…áOï* òX÷$'ùž>!ƒW:÷%Áz§|é`§‡gKNŠ~}`»‡Õ,ª©Y{êþBSZŒ$çÈXL‹ûæ&'sÕÝÉT|Þ…‡ŠrãÑ´øn×Fý\ÙÔäçL¯QOš¬@Î#ÃþÍ.F2ÑQªn£º©ä¶ô ²lkT®Ï„ÜÊPœX~f#+§_ÏS—Cðà—< Ê.ï›Q“òXí½¶ªe°…ƦâM#gJ¿=?ToÐ’xygo ‰JÐ~ߨj»n$Ƀ×.áïÞ½*‡(Â@£ucœµéÃ÷4è:%|œ­x‹ ¤•U%µ×“¸«–Ï7£géÅ{aœ_ƨ—Fr@“Ï¡uɉ]÷6“Í{\sã0Á·MDyp²8j$ÿž:4Ócsøsl¢Ò£éPèï™ö…Ýü!òß¿hq*ŽmÍ™flÛðÓ»Oß~Ç‚«%­Ññc>LJ@éÎ×hjí1J!ç\6}‘[sD8ÊŠ$§®Æqýõ©aé&YÅ“šlŒh…—4²2§V‹ÿì[¡+~ö—å‘ê"Î,íiÉrÁBéC=’;ûË'Í ÄÌ aÒ©©Á§kÈ(ö'Ù÷÷0†+” ÊÛx¨)-ôW´y˜é–ï`áJñp ´„ü„Í—Uø,ºÌécø›¡E™ÖÓóìw s#ôò1Õí·Tv~æ”î‰dw~2ð40% àÅ߬±@2"8¼1äŶžLÌB·a‚†§{ËË 36îr‡uß‘v°ºŽ6åP0Û3•¸„Éòy}TvLäèÕ«BÃu¥ŠPž9«xÛ)*ów>–¥z–;¾Õʾýî&A±¸,C?_Ô<æ&D Ž0sÐü\-ƒ€½½ô…2PÇÚaÓ–µ°9  H$q?ÅÖ"˜ ÒŒ Ž=Òi2»}•Sè†BÖ–}¸Vå›÷:ÔWÆðyðö©{ûv(5䌉kcèåìR∠̔øuâ’ÂR†Eº ÜT+=ã Eu ë~Á<²cÎQîA¶DõI‚vU¥Ýñdð ¥øß\îJÑôÓL¸`#¬ ƒ^¨7Õíæž‹gµÜ‚’x'2ÖŠÂͨ*6¨ éd;¼éAzî¨t¹¬bds‘méw¶Àäýî–¹érvéäÂ`i¼äºãX ‹2>¬œ·Ö¿ÒrRü0í'L ú80ŸKÊ÷áW¶@{¦¯#=ÑÐy™ìè~iŒQªÐ;=›^ÅàØéóx2Ça d$¥:÷tRØ}ÜW‰>bivˆÚYXЕ'¼Ð Gb7Ï’Û3ª)9µ“ù¿+ÑCûa°ÀîÞ×®¦nÎDQìV”ÙÅüŸN ¤SÐ#`ÝÊ=mK%æ0ˆµŽO7Ì%}j;×½ØO–zŒ&TÚWZÄŠ:? _‘±®ŽU¾:}Y&‚¾käêÙKû‘0ô ^%Mm^Ô„ð?'ü&‰]Fäf—±¾N;dËC ˜lÍ1á³ÅÔlöQNZjÆ̲L ¯„ÊÉ‘öÛ¾7.ëûÑÛ~eé§.瓌~P¬¸:qZ>îGPœ ”Ÿäªð‚[Ìø¦X“8Â;GÉx™‘–—iÊâe5U¿Sl›Î™¥æ±v<"2MʳÌ.q9Hâ•ö:,6˜*ž?cxÙ†·¥ÐϸšI,gŠÉfIºRìàÁ‰D .Ùô²[+ØrÞ„ÞÑ.néP’¸¬™¨á#ž*±ø)›Ð¯£ÐãúPôT­l¹·W4´(ÚÑä¾=ŸqvÛxÊ‚\¹z‘ÓQ¾“23†V®uûUhELrxº™_mñ8µbX½º¡{Yqôb,ö·hi9ÁúϾä ÈOð&e–¶'þF”EhŠQAW·S ’ȧ´ sðG¶¤£¤A-ʈÈNp”wˆ1f%ßÜ(¬xØѯ`EŒfþoåáµÖ\5ucßæÉÞõ5ºñjL©xH^„=Ô¼=ªÉ¨Y} JQs¶£ma0) ¸ºs€B­ø±S]¯ƒÊÈJÐCŸ2\ zzŒ4*2s\׬×Í%Y«›§ƒ~tWNõßUT¨j¥´‘&,–8ÜãÛ.’ÐÄ2wh'£ŠVƒ§[eÖ?™Âdgze:¸¿~9‹ÿ|[äñjDmÔðýP¡¦Q/½óPøíšýRQóu–Ó©¾8?ã2n¨=;æêqj0÷LÅdž;yoÎûý­ÍièKâ©¿ÀĔ⠘Éöz+¼Sü½§uÿè•_˜¶ëO.¡Ð…‹eºŸAÏžvæ=ñù´k:²,˜<Ä%4)b}Т7ª¢}€Nù©ñ¹õ¨u×wdØ‚.I!ƒ%æ ÇÞnªÃIoy³¸u³ô˜­X¤—Bx™,Îö(> stream xÚ·T›é.ŒC¡Å‹ V”"ÅÝÝB€Ip).Å)^Ü¡h)EŠCqw·B¡¸[¹tfÎÌœóÿkÝ»²Vòí½Ÿ­ï³ßõ…žZUƒMÌn–†ÃœÙ8Ù %uN^ÈÍraÒÓkBœíÀ©1éµÁŽN8Là_ G°™ó£NÒÌù§‡ä]ìœÜÎל¼@ € äÿî(4s…X”ØòpØ “^nïá±²v~LóŸG#ˆ ÀÉÏÏËú‡;@ v„€Ì`%3gk0ô1#ÈÌ AÀÎÿ‚QÐÚÙÙ^€ƒÃÍÍÝ êÄw´fb¸Aœ­ê`'°£+Øð»a€²üggì˜ôMkˆÓŸz ¸¥³›™#𨰃€À0§G˜Øð˜ !§P±Ãþ+þ `ü5';çßáþòþûÃÙ ‚CíÍ`˜Àb¨H+²;»;³Ì`¿fvNðG3W3ˆ™ù#àÊÍÒbj³ÇÿjÏ ä±wvbw‚Øýn‘ãw˜Ç)KÁ,$àP(æì„ù»>Iˆ#ô8vŽ?OÖwƒyþ%XB`–¿›°p±çЂA\Àr’AU˜ÿè¬ÀÎ ÈËÏ;Àî kŽßá5=ìÁ9«;ðö´‡Û,›{C,Á?˜žNf®`€³£ ØÛó߆ÿ–0993ÀlaþýQ ¶üS~<|Gˆ;ÀøÈ=Nð÷çï'£GzYÀavÿÀÿ8_=M-=9–?;þÛ&.wx²qsظx€þW<ÞWüïÿŽ¢jù« à?®r0K8€ÿÏb§ôŸ‚]ÿ:Æ¿vƒ ðß±”á¤ÿá¸!züâüfú.ÿÿåÿÆñÿ-HÚÅÎî3ãöÿÙ ±óø ðÈYçGþ+Á·ö¿PðŸ;«¶€¸@ÿ×*çlö¸b0+»¿Çq’†¸ƒ-T!Î ë?Éò§^ë÷’ÙA``U¸ä÷­`ãÿÇö¸Y ÛÇ›Ãé‘‘˜À‹óß)¥` ¸Åï ãây 0st4óÀ>‰‹‡àÉù¸Š`÷?8 à`‡Á]íy,᎘¿O”÷€Cþ·ê‰ï5€Cûo‰ŸÀaö·ôêù¸ÐÐ4œ|äÿ-òp8,!®àÙyDN €öü1:ì±ÇÙÃÁÿÉ÷X‹ý#AàÿB<Öàø/ñ1¾Ó?Ý­Áÿªè1¡³ü_9]þ¹=<þIÈàx vüþ_C¹8:>^3¬Áã üGþãNƒÝÁ ̹i8èMMUPóU…Ø 7¶­a¡ ú-d&6Ï9Ç—lôD¦Ïé+Žb‰}¸‹RŒç¢óT÷ž{_jÐCãÕšn½îLbÕǶš0gG‰zFò÷Ī»)ž³iŠ~÷ºwðÒö·Eþ‚Ø*OŸíà‡­šKpåÖ%ã^Ý]²0<½¥öýók¬»’q¶(­HCÿÂIúóŒ)4g6 fü#wœÉó‹ ü¬‘*ùXLïŸQÜžú«\ﯧÞ.•ir9µ‘Ò‘ê“P Ÿã޽ôßù O<ãYô1·}€+÷^>Ãègæ¬<5£ñ–_§§Í°B;ºäÏ‹Õð—îàà–ï—~ÞhGo¥›%j0"¾ë¼Ó“qoj„ª‘ÃúðØAH¸ú­^WS.ûòc…©Ds¿gƒÀ¯Ë_Âß?wL"ÄdÐÖÏ,‰ñfuqטÍoÿzd•+ÕæØÉW+®‡§‡½»¢:!’(3Ÿ›‹º šÂûg)­ý{’°i„ ÆIs)~Ôlh€àUä´´¦ÒúíˆvA‘’,ÒíæÌ˜‡¾LKè8’Z³Bw-éÒÛÊÖ?CŸøç3¢ØsÏO÷bž¡WÂWÁêïö¯ ?t¼ÜЙÚ=å¿sÁì¾n=Þ¼ò*¤–BÎíƒý³þ8ÁLI¾é#=nmâ×ÔÞ±ò{9Jö»wwðÑ¥P­*#%éÎ:Ö»•ÝÞF¯‘ǬšÕST潦Ëìýš–h/^ßà1ZÜË©ó#ˆ 2•Lßåýb "oÓˆŒ¿ô«aɲ2žW? ‰<‚Êøe0ù’O¬Uã•u˜ˆ! t»–‚P²KYý<¯9ØNëSuÚ~ƒ µªüÜœÞs0ï.¥’pÖæKg#jùE6‹¶nö‘ð…U¯# ^á@ßlÜ>L'·î]ù-[«œƒ0©ùê»Õ6e‹êÏ—p§‘ˆÿ“p¡·ÅFTŸ—¦ìNc {°î âc=Ãe¾]ö‡_ã¹Î± ÷=ã'Äï½Ã÷m@ᦠɓ­ ¼o©zò 3ûxÖ r4C)û¬ð<•‹H¹=Äì\ÊÂò0$"<׉$cJrƒw„ÍÓÃ8Q­‘0aJŽCåç#ƒ-å»úT e'Ó‹L Íxñù¹ô[9·ìþYK?ÑÛï«~¾Ÿîè“¢u>K·ËUŒœu¿¸~71ìäF=’ K‚¯Â̯Ô?NƒT™ã*Ny^Þ½&ÌdYøfäm1&>_MùÕËâN˜&µy“éìB.¦¤áý|óoq.‰q>b¾'_’ýH™‰B…É·†jžä›t£ 㨮PbaÛÜ÷ZÕ^Bgù9p“èÞ%—·o©Ñg[H±×3²|[Ƙ’Sàq}|£z'YÏv,êå,û•lœ|Ôوж]K43“×’ÛÞPIò{DŠÊàÁ6§¤’Mº'!Ë)úBZE ëT“Á¨²þ`øa`~¾–_}šàéºÉL{D씌XËÅ6Nl^A_Sb‘[¡ŽžfÇrOà†ß3õ‰×ä°õ7tfÖ±ûY~]kžR_7}žuêþ‹e^V÷‰úóÅdM—Іù¯ jj‰Þ §ºrZÑö>ÄEÏüâ¦Û‹ï{ÆáMö‹#/”vý]na%‹=S?uBB,šˆjPÙ&#Ëæ‰×q\<‚zÓÊ|âûýX)ßEÉUP|î¶}óôR‚gz^¶lÇÐ+fŽr~¹KÓÙë·ÅœÛ¨“T ÖL)Ūž’8]Ôœ _‹àáÐí×$}ÎÛ¢$ÎáBøÔíJ—ËÿÒG§_;¢Ðh|i- Ù=©io§Si¾)2ØÉãüJ9µ!&÷U¡€@ó¸âe9À¼Iûy`¢¾vXÛóË'o`p9’ÿ–ášaa}q&ö<–ýðnY¬<OišÕ[dÞ+ÙO¡#Œþïç&nçkÞ±³åÈ ®’b ‘â„ñ5IÊ/Ïé›ÏVûÊLº«¼l:@x×׭׳!´Š×s7#¶û̽¼ m, ] Ê;¢ò¿¹¹B‹,Lµd¿8¼Ý’üÈ,"Yz%ª+ä7Æ :izX⫨ٰ¥é¸²’žÎn¸½makxH4d@ÎcŽ]EÐ&APo]ç¾Í>×gøá‚¥¶‰×½ü @¢Tni>˜ÒÒÎ_‰Øà椩wg-—·êK }gd±Ô!Xþô!>Á§Ñó’óè¡_y_.2]¾è ©ÃO'M Ñ·—3ʵ¯§È Lé8„ßÖ™óÎeÞ3ØlË‘¢±†ÑA¶à;¯nÇ6:¾²ÏO rå3‰ê|ÊcPÖ*ÝxGÿ¦?üt>î PHŠ©„™I5iÎ ÏJÈ®†yZc áôº×­9]/Ž(ÎNMgÒƒùÌHCà‚Ür¦)"û˜+Êß¶À}$l¬÷—|RÓÇcV¡ÄöýÒSªg¦Ê=1sb(eþx,?9ýÄò°ïŸúˆõ¸"pt(%5RHŒŒ9 (4:TyG6§…˜ð­ùYAª)ÐæÏüÚk]ŠNÁ«÷º-݉Ԭ¥ƒ]Å š6áâä¥diÈà·:t%7½±‡ü„ªkœx¹õy£úXÓˆivR)Ͱ·I ^\P¸{~›Ã—GÖ!áÑÌˈ.Ø<×–s³ ªß‰Z¡Æôþ~Í1ýð¡|¥ÄdçÒ‰œ·b[t˜†Á×O7Ö ©+;ñE¯»(v?E$d±–Ñó³ì’l´GBÇ«Àr·¬îýíʼ¾ ÚÉî?p–bÞMûs\RÆ©´Û¢ˆ…Ö5Ö¦PDúF¯ÕÞK¼i9ä¾Ÿ× ¿Ô¸ »OݸÇ4³×´Ö¸dP&|¾ÉmS©8œë&Î}Z4}‡uõ{,ÕŽ,=…·àµ —’ñK_:¯Ñ¶¦¡¹’a„tõJ¸3Þ“#µ=*Ëf}+;J£`eæW2µ=ÌY`ÇY¨ºP§Ü(O‰Á-èO®Í¢K×HŽëXݤðà)r®jñ)øl¹ÆµÛìmLÍñB†Vªéùe õÇL?kq‰ŸÔ1? 1øjÕJ?¿Av˜÷yn7¼ðé­"Aò°À­S!¨åP m+I¨ÛÓ AÿA…”eµ|p“Yœ›jB›)ìâŒÂ¿Èo½V̯–ŒŸùx‡ÿÀ@©4&Óáe²G×ìX1Í-òâÆÓr½ëÇ©{-ª¡Á]Ñ!ްK ðݧXsⳫl…xÇ9HS­g!ÐD«Îñ7ø‡&ŠII\´BTßàì/']ÿÂò`ßjG´$ÓΛ"CkXå,ÄDöÈ£_£ÌÒ‰µÅ÷ÚcZLщ¦Ò¼`îV‰þÏÅ×t´+g¨½°]-Ý ÖÍÂð³k¼ÐóÉX-˜ûªTrGHêʶ1oüY\0ÎöÙ¿>ID¤Fûi”]©ŒMÆÄº6ßœ"´gÔŸŒµjãø˜qãí ¡Œ)l¬5ˆãŸÆ}‚¡ñ+uM|O=(°x2ÝõÚø§9ÑxG·¢Èƒÿš6ql†ö¢ªLJlRU˜-QèÌbû̈àË ¾¸üž¡õÁ…vš×éÎY¡3ù[Òu“ô>“*åí‡Lѹp\÷Š Dúä¾n7Û!Ší*œçÅ+ø …! ”òOuhgÈb5Â]SI˜êÏsS}¾ñ·DKh4)µU6žoóÍcï ¢ÊË&~$“QÑzecñ©¹Ú‚¯O’|ËPu Ò^_ʽ.¤Z—ôM9‡7é‰Ëª´¤û“zO¥Ã²Fª®óÈà ‘©É™É5$Oøøåú/ /‹Ð—Of“ߺì–?£¶7Él¹êú±>ò± ƒ,gSô ~ &`%¦0:ÖòJ9ÿˆ»¯!è¶ ´€Jgó°¬uÀôøå·)‰Ú™c…fcšcDA„­ë®Y‡9Øtiw׎‚ø / ¹ êgTbBtK÷Dˆäœ83û¨÷1ÐERæÃ³›¨CçÕ~Í}»þÁChåì[KtÎÔ«~¼” 2ZcXŸÕ¢ÉËȧºc\ëåüu¶5«U?Á/-Ü*™EÔ@Á¥’ ~f §ëíO5ž…ϔӋÆÐ$Dj¿¬*û<õg”¢ˆ¨µìQŠ]Û9÷jÆâÕté·4×) ·m>tû‡î/„ÿ|¦ÚÀžÐ?yùyIF"»‹È./Wí «PI;ä3Lu€’—q¦ö>ù†Ðé€z‰ñéz[ šâé ªÅŒä@¦H™¡*êbœû¡F j-7¼æ½ÂÓ$„Œ=FÀ±—¶M-Ê“=9ÄSVÚ³©pEõUŽ…!˜6±ìKµ‡A7ÓXöiÑî+ëî¥QP7œa›ý¢—¾¬S¸Öµµð„.aú#ý+²"ë*n]ñSœ!Û@1¥Ž'•³þÝ(wj¶xïžúò+&õÝ}{ŸU/:p!ïzÎ ¸“l«§3™rÿò^ã-GÏ&[w’TTI8¡Þ¶ BÏÞUnJ’ϺuMÄv\U«v¹B Á”–Ö›óÕלO6¾ä…“ºn¯ö׿J@§újOã¢Àˆ³öôãž§˜ËåšæHÐ|öËݸÊÎø€ÿbcHãâ´„‡¡ˆhø(ÐQC•‘ªÊ½Kž°­:ư2=³q*=¶Þ|A¯¨¢æƒAª®‡u‘¼«­A!ÏÈ_u!·BS}e¨ž D›Gï³Nû£;iOåh? O¼¸SŸ¬ñ}ªqïY›–é „R|>ö~¸ÁH©IYÔ·MçðMêiÏ8Ú-k&“ù³ †sR’È*¾¯°haDc=sßÃ]ZLè2)åù¢u,ªù]J«­Æ{Úæ[9„¡MÆfŽoëòM±?PÞ¿Î.}K> “8ìZi#2éHèa!¯ºT¯½G‡7g­âVÆq†Ï€?•™—Nxg%Àš¤ƒ£åœî¿ ï»”U‘­`:ÓªDKÊ®+ùvΈâ$ʈѢ¶vI°Âo†x Þ¡'9³§,Aî—Ÿ/a˜o ½37¢sU 6kN¤û§§¾è0u¼ªñ‹&ÝYê–ö V"Ó*f17CY²º%Ÿ÷„­œ‘æ¤ú<_ýœr"èêÛr—4­qPs³,²ÿÐ"]²Ðp]BË(%Ê€ì=Ú!t NImzwÌ´Ÿ÷ÕòÁ_…ýèvŠcVSÿÈ,˜€Î|ªC2ášó—Hû<Œí±!BÕ£A‹=VÿÄOCO 2ϲ—/k3¢ÕM™ÃXur“k'BÅÒ¡m+p7ÄÆ›ÚОýF/£‰CüÂôMUhZý•)t­ÈUè…™}ÊæEo¡V5¤ò2˜,¦1[œNw?"Æg•SÉœ@#Hìà2Bš„ýj)ò%'H$˜6˜:|Q\­òìWÏúœñýLˆ@?ª ì¦FÒ!a}íN) dRí§¼9îpj¹±fÚDíÓNË“Qð²Ýya ç"-À!·>Í.A¬¤Šíb"l(3c¼›"À=ç–Xö++ê§’p¦ü:ÆÝ,5¹¢V1h GµÙ-פdœ½éX„ù°Í5{ÉTÕù˜‡OëhYü”(¸R“¿'kêÆÕÇË Zº\u}3bmq&º\rÁy¡˜ÄÒ”À{šT,\È»W癲!ÖŒ¦Õ©þžägÄCqï(å:·J{ÃH>o}œ“Þ¥Ùf§‰+¯[×ÈŸÒB!æ“tóJ<ôØá[1K²‡mž%é·yæ€}ŸÌÏÔjÏøT›Ú\ޱÎå—<†v?Ç}°¦ü`/>¸ƒ˜u–Lˆ…‡ íM>cɘÊñ©!–óy¨¢¶ÝãÐÙo¢bY7ö¸äÅÓ@.´&ySãsqí”&—CŒædcè¾Øõ8HVl$`õdJ ‚ÓÖš_¿Ê‹’$¹–¤ª·WÈ'N*g‡Õh5ÂÕ*¤‹ÐUÐ÷G x‘n¬­ד4žyú5%¬ á›ò«;£R}QJË>ôÃl·17D]ˆØŠ’s,™¡Orç‹%ÊH¦´?½‹S¢Ù¿GÖ'p 9&èT$§‹ÒŽÍÆþÒ÷V•P¬%8k«Ç¨®Àß!ÜÑpqÂFÞ¥yð¬Ú;`ÓÉf¡mÂA»„ÌPFcN …ŽÓß ªZRËŠî;É´It]´R}EyU°ð+Þ%çZjÒå\nŒrvzþ9•Bð/ÌÃàýá¸R¬à&¢ Ž|ϳ¸3ÅAç…q¢Ñ=|„‡Ôï\EZ¯0–|úiÝœ¼V&R£T™û·ãä`J9nK[ƒ vº*Êd_îJKΆc­~0­T¦ZG`~hKFZ¼Ð~"œh¬ðälµK#S!_Œ^6Xüq]y†¢C©KX'B êŠÛ\8¡sC+JðQ‡N’[¿ìû®$mˆ0˜¨6ÉØ­“V}ˆL/ŒuÔÖûÁéð!¼6™ úÆmC¾:¶™ØŽ ol[ñØÅݸ•ja&º—}!DhÂsa†Í^ml,Ûáò«2õk #õ~C.Ö«U>´Küâ™n"ФYIi”yÌá&û•Ü·€ÌÉJ~œ.èA~ü¼THEóÌ‹ ™ðgÃZÌi†  =?ažêÖ÷zf@¶>¤òÂwL·†.ˆ7£!߯Dk'}O©Á,"§ªÍ±3¡Ø[K'/ô-#äÇ/'Š|üHᥠÛð%‡vì霨]Þ¹={‘À?þý‰…­ñò&pÕãÌ:Ì\ÅÛ^.cø2c!ï»qƒ¤g {Qï2åêVA žçäÁ"¼=á(Q^ÕQÝ.>@&,Ó^`¿íȦ·';ùòŸ6Kµ–‹j$c°m)Œ/[4tàéw¼b*¨ g9G+¤JáÓ×ø¾iéIU÷˜œpÄëcÕ YbN äwÕ Y<ƘNg™zöƒÜLS ““8~ÍÛ Žvía§QŸB µñ¹³rž9þÌE´÷ů۟¡ÏÆ+}´ËP$¶£™ÈtOF¨4Äk lCW\0ªóø©,püXÆ”®”õôô•B†Ï¨C‘d˜è<öOѹÆ%„¸7‡<é1Êaºc ¤ånÁvÊÓ•Êc¢¿º…×ÞÙ”µ3ÑŽq~LÌ®žØEª#á’àT6ã”óüÑàÖ™™^&ƒÄÛÁ5FTòqjb‹dêjJX¾-fÌüÐ ð¥Ò.2¬{íe¬‘íjbÜ)¼h7y6o\;?œ(‚j*3$ò%ØùåQb[uþÁKýD@ w0*΃=Ûºv¬ÿA *~A˜NX0-#u‹ÕÝ8‚Ù׃ԗ’€Qßë)ª¡%)„ìÌ÷ÕÄcOTÈ ”6ÏåfƸäR±‹z|ÚRU>MŒÏÑGo4gïÞÒ&?{…Be6¬>ÿ3±æžN²2·ÚÅÏ'Œ$QÖN4îHPÞØF{°C¥¡]wèìtÄ.lÃqrâû:ŽŠ…akà:¥'Ó$Èu‚‹’¬Dï¸×{¡+&ãÌÿA±¼8ˆ+¬§¼ðÈÄ 1xpkÁÏ/ü{ƒü{Õ’ñ©¼ißs‚-Ö·1K«W‚QÄ-;LÞ¯ã´7·¡°Ku3b`ä †Òù\KÓ´³YÆÈÌïá®—³a¯9XKT;Å>ê¼¶Y ¾—y–bS>YYÛø6a&²œÖuÉé-îÆ0©ô€¢d‘pøGiŽÖì*ß½Ô‰3@â9,•â×äŽ0ç{ë›\A6Ûþ`a›ïìM‰äžäcïäô×8x-“éAU‡ uEÂ#ÕŸ†žÞú–YvQ‚¶„:ÚwçN¡úLÜ´ô%î¡Ä·ÈȦ蜘Z½'x(å¨îk;éšû‰D"ŒðšùcN] Gò&o×ù UÌ TRsyõOÛS ¡ºDûbôï`Ÿ$p™›š×#Æ} @†ˆ3Ï_\—¢ŸîùÛů )Øê›Ç'?Û‰~ZN$ ÆlYLÑ‹2ùê:ýKƒl+SžÖq¾~"”ˆE¾" Ìé)¥-»¿íª”Ͻœ˜Š”½D65ê;µZé¹ ³·îR:ó”Ïîç³- Ð9}ÃãH ZßuxÈ´Ñ!&8´aLG, ‘${gáV¹…a‰ƒ] Æi†C}fžL2EÒZçÈ ·®ï‰_7.÷:†WK¶é‘Íô +‰¬eÌ4D'´‹}"æÊ&G»õÉ;|eešÝÍ5ɽlþž™8ÙËÀ áµTœÙ/âì@1\þ·™Òý÷رg똥/ö>~G7ž C’ͧš¨;ÕFrËT*ª-,8ޏ?¡N;uf´©qæ”89F`žQüpÚp—ç$‚RdFèµÕ¡4^õ Óq笷¾¬Aëj0?74`SâÛ*—•z3²€©÷cÿ†qHT:è‡î™íßÌYÚ˜>(‹HÚ@T¡x³ð¡?ê>ÑÒ;ÍÌÆ22Hƒ=¤qúIÐY&Û˜9Ýž '^Yá ƒoõéq³Ž? »6D }“:û+s;gÆ6UËÜÈ,†£Àíò¯áƒY½ê}=ìZbC÷✯jkPâ Wö^v¢)ŽþëY€a¾P¦lو߸anCö)I}D!ì5öîDS„Þ1çXÑÌeuWÙ¶ÀçÊΰ#e>Uå´·bŠÄcÛÃÛœ¸…Ú`9¼Ë›Qe–­F,vÂŽf9¾ã30ÃÖòUVˆbqßXžúaœ*^€y—qy«nu°ü‘Žõ0Ëݱ âøCÂ{-Üû1iÓ:Dþ ÜQlóI»`ZÅt¯Q|)íÁ"°£‰î—‹ÛŽ^­é«ý>¾t?³ØÀ• uvìtâ™qÿ0úIYZó§nÌåu–9º.› …ÓõL¥Û Ý0VuáÏgÈïú¤Î×Õ}PåDèÊ¡ú ‰Ü J¹+u†-mËj6?d~ì«Øå³ óÑ®#ï°?%eäìHº!³æýJÉͰ?ûèWa/ÖZ]UñQpa¶k‡†!Ù§ßK$‡¥Í™k¹œ) âØ·"ê‹A¸ÕÇ4c’…7y·!ñDCð¾±=ÍgïZú…±È…P±÷úbΨXuÇ„ v®:ñkŽýÁ{Ä=ç˲o7ßÏJT° Á Ôûƒ+á(ƒLý—áõå#¤ÜÖ·ûÁ5ˆ~œÚ?À vö]v_ÙÊëÔþÈ_1i™{ˆƒÏ^”g ¯b:‚,×ôétW ýˆ$[kˆÃðòžékø¨DäfGh@¤ÛS(U |fײXæX£š ¤6ªîÉZ¤WóôG‚´ë­¯žÎ”H˜ß$[öxÿžÆ¸†Ód]Ûõcç fiêÙAÝeºxËPì:T/GatMdþ8ÖX©·Þ‡ºó^±ÿM“³Xïaa³QÄà/9Þð·xÛ¨¥<Þ_?_¬?ñùusðâ)wÆí›ì™òdðñln_½T …‘rÊ$^q¼`Þ¡z¢+bIJçÒ—RõŽ‹l[™†¤ßîG/­ u”/3Hzge½«ôKŒzú;%3I0†ò†‹SSÓÀßïéq%²z½ÏòÔÜî0‘5á'VÂï°Ç×c}ªÝ'J/cÒAé}äѦ”ù T· ßý6ø\ Ëà%Gç«¢ˆA7òf#ž&è²sÅZq~O‰èöM@Ö m[ž f¹d3ô •>(Ô{c)bû.‚;üqøD8?-ºrUhÑðCE‹£L•r¨¸âš»žú1(Ðê”èG+7[]´Ý匙òD‰ÃšA¸•Im‹Ç*ŸÄÀ“WQòÏæ\J#Ô¿åØ É‹¶&˜ØŽ%TÉ]-Ú£ô€¥c IþÒ¥xšÈ›ý.:Ðd+ |y4ŸZ\Ðé 75÷<ñx=Ì­9¤¢Ë™ÕB•1i\AMôbK£àêüÌáD;ìu z³¶ªYc…»r×°¶£²Ã 7laéØvòÀTIí†þ„‚¨TR«õìˆ"`)c½‹Èϲš}PÞj|ÓÒ%ŽhºœšÓg2ZÚ åeìè—Ö¹a‰¹ZÃe© $X±¸w¹÷ÌÈì`8±q_ó¸`0d–±ä¸Å7åÙA3œõ}aò¥EÍÍ’½xk’zk©A{Y˜±)™ÛŒèÉ+é†66áÁ›dâCÇþ@MU_ì†Á‹Èy¡¨C´K›±áÝk²úŽmIê ·sG,21tˉЉÓ:g߃¾j«ÓÝ£¬é ç©è©ªê®Ñ2°Ú²ÏíˆMÓÑY!Ýøô®ÉN‘ÂÓ-®ºÞÇ{èÙXÈ“bYbæ…pòáçÍ&/A'G~>à…œg+ðÊ·Ý:m³ÊÌVêäP{}xS‘é÷Øúi–> stream xÚ·Tê6L§t#1t3C7Hw—”ä#0ÃÐÝÒ‚„„tˆ”H©4RR’¢t+HH|£ž{Î=÷ÿ×ú¾5kͼûÙñîxö»Ö°1éòÉ;ÀìÀ*0(‚O€$ PÔ6€@Bü ›á þƒâ±™€ážTò¿ôŠp°-‰)Ù"fÚ0(@ÃË •“‚ Ä apI€’­7Ä ÍЀAÁžxlŠ0w?8Äɼå?G§=@@BBŒ÷·;@Þ ‡ØÛBÚ¶g°òF{[W€!ÌFøý+§´3á. úøøðÛºyòÃàN²\¼Â`öýÁ€_åtlÝÀ¿ ãÇc9C<ÿÀ†0G„- @®{0ÔéàuÃÈ»†êZ]w0ô±Ö^À_­ð üî/ï_ Ðßζöö07w[¨êp„¸‚º*Zü_/ÀêðËÐÖÕ†ô·õ¶…¸ÚÚ! ~'n P‘ר"ëû«:O{8ÄáÉï qýU!ðWd“•¡Š0770á‰÷+?%lìºð÷X] 0hÀŸ³#êàø«/w 1âáVWúË áýƒ9$&.{À¾öÎÀ_ÁüÜÁ¿•¿`dþAî0w€#²pÄŒüÁ ð´õp/pPÀ+þ-á  ö€Ø Åû':;þ‘‘“‡C| $ñ _Ÿ¿OVHn9À ®~ÿ˜ÿ.ÐXA^O^‰çwÁ«`¾€>A€OPˆ!AÿŽ¢g ù+ Ð?¾êPG@âO²È.ý'a₩Ïù×bpþK†d,ÀùÁ-A" {ä—Àÿ3Í»üÿ±ûW”ÿ Áÿ7/W×ßZÎ_êÿÖÖ âê÷—ÉW/’ûÚ0ä@ÿ×Ôüg]µÁ/·ÿÕª#l‘; urý»‰Oˆ/ØA‚°wþC•?¸ñ¯s…@Áz0OȯÀ'ý¹Uö.ÈGÃÉÇß*0riþ}¥2Ôæðk»ED¶p¸­rÄHI €\C°ïo€üPé@–p„Áñ~ÍéüSþƒ€Ž$‰ÿ‘Ì þ B‘Ùý K€°ÿ–‘AÝ‘“…9üã#z‚½‘ÏÈ߈0AüoYD8ÃÁÿu1‰øÀþ +úƒá€uÁÞ G¾¿YŠlÑäßì ¶Ç[˜…ÙKE>nŠì¼h¿ï÷ñAfšmÃ4‡‹/`þÆëŠ;“«>?|þC>s¨xé‹2çÙƒOŒ7{íÍØ1Oô_ÿ ¼¶N3˜Üx7?AÙ?^º'ÿò==.ŸÑƒÍÀ@“0ôvÔn ¶"/qB½² Ÿwª¾/ßW-ŽFÏnèoÖ‹jâ_WMñ%'Z†U|d+¶+˜¡fÆBðÑãp“û}<û1MZ8~Ǩ‘ƃ´Ÿ$T`¾&˜|9ã¿\c$èÙCÃJcNM~F::É °¥A5ð¢l>š=Cùfì³[†€ë6§ÿ†ŽÁ|çÛ#v¶qINj :¹zBâj‡Zº[S:–pÁñ’ƪ¯ú7±v;O^ÝtÈ®«XFÍt9Ó¦9Ý!壽ÕÍÉæ|»Ê²„B)UìDé )×É·¸eº†™Ä%Ÿ ¹uåÞJt¯.|^Ë>m -¼Hdœ¤ã»ÁüY‰uáðs¢GÑò4C̶)gà{¨5¸ƒJeGb6ð¶y=ÖvãÛ3ˆ`âpÍ(TŠ0¼™ÌÝðü8©aLãBí¦V}OÅcÑÈqØœuûô¸v*0wi³MpÔ×õSnŒ×œoWº“ê60KrŸ]r̪1¤¬¿yäw½µ!|÷ý£l¥»ÇW¡œˆ»ÇeþÅëiÚò‡#Áñ_>ŒÙð½6 ì¤TªÄ9õTÌÐçÈ• ÙÒýdn£ LúaæY19Ϫt!/b£lÖ¾HUãÞ²³9ËJÚ´6—>!s*81ï¾Ù#m®Êc­†„̆{dƃ±sX( ,ãÞòqâÔ¬ Í8%„¹ÍÊj‹7K5À+ñŠÉÑé[RcLH\(Èæù€‘5§»¦]OìPÀãþá šÅ ÖUuh^ŽYqý“\±GO„:”Û/¦«ŽöCè%XÑ{Ì¿‘Í8øY¹"’áÄE$2…Ôyyò‰däš¡l£S¶Äo,9D_(ù•üSL9cYµuFÓZD?sÏ)KÍvßM(öÓ”ÔÛ>8÷©Xîæpn÷sÄkô$!þÄ/6Þ R×c!Qeqi¹Þ¢»_Ï=Xµ¢¹s\_@3ÚŠ\ÓOQ5ÙËX«–ÊXaÚ$’”>‰æÞD Ãßf~FT„“ò)Ñ~sþ܇ÔVŒVc`Vå¶öUïÖ+ª­0+×·¢µy•V‰Ñ¯­Ã4õ„ò¬÷óCŸÉãÍ—Rшڼyêü'UO¶õøò[Åêmã×åÙxËúö'½Q ï´†/£„å&Ñ1Þ-…$"ò†U âÅjîMivR‹Å v9Ô*>›‡€T)ܼäÂ#¨f„ãØ³¬ö¶>åÔ;ŒÝ©„.¹»í’a·“Ö9·M7öÒ°ú”YÖk8`‹óô)ËTô<Œ»ƒ¶Ž˜¤±M/ÊMÕϪ[G$¾UçZ<˜JÁJ ÚNzÅµÏæ~—ªÄæw™„}‹|ÈÉŽ•Ö5ÐbO‘*ýèc‡n„”Š:ziq«bî–æšãÙãγÃì%ÿد[‹''–ù{û×Î_=yÖ¸ŸÐóå×3®Y¾»á¤ë•Q²pàzp½Â†=Ëâby±§½-/s)¢Ãú‚Z@?Û¥–ȹzói ]}È.óAû£%йΙ ÔÌqÑžGh£>¥`¯Ž˜jõîL¾ü§=ØÌžL—³†/Ü盼uPp³ýÄ3ƒ°å=‹‰š $·>pû¨$>Ð ßizéœàcêeÝûeF´Ï‚²%]¦/ÙdÀŠÎ¬ºMPŽ­¯¶ãý.W£ÒÕÞ}Í:[V±™Z«ç"÷~Ìïµß]¬pT™4æå•ã‘tEUVÀ1UVÛ‡…ÞFÌÖàïCòúâáò|«qv6þµQÍ©Y‹å׿–Ä%üð£Ê{EÁ_<»s™_ÙíRYøåææ²Ã•@ÄÎZy†3\»5þ¢Ú›2ëÙd·ÌíººÛY·ýÈþãòd²OŸ5HÏ­½Nÿ6ljó£éòã[Ü!&ŽãÔ|ÞÙeçÊ·ß"\úSö•óÃD®T¬â'ü² Ît£8TØX@Îî`öÛ­½†2‰WŠw¾¡‰x—+»¸)lÔŸÏy% ±QIÆuq4÷§´¨s–0¼éÈÕxÉe§’£NéxE›3Иy”ú۾õ¤­°åyD75ú4^Ilm,v§R„ž?–fº V?ÏîûºÛ-BÛŸÙØãtg‚š>€KµÁK¾’/®þLsÜÞò4_—ñº "z:5(È(k÷œbù'™DÒçΈ=Ú´ÄQqŽ'xŽ&ªÀçÀ F\l™©éC,Í3½Ú‘q/X¡D§Tñ¢÷Xí¡Óà6‹ÂK¶ iâ—Ñ¥™õÂŒöŒýÓk§²EÕŒŒ4Ñ ±[bliæÙ$Gh-Ÿ`¾˜«u`ó¹¼i`˜ô¹ï³Ì–K%»Ÿº¸ñPÁ(ÐÉáÒ[£y]¾ =mÍ­ú`Ô@±Ë•âõÁ‘xCøYý »(•b Œ]²ï•þß9Ü‹Ø ß p7³2¼œÏbxŽ’nkc0©.3óÌáÀ;ÚqÞ’aÑ´ ò\a­ã¬ÑšìHKÅ{¨EîÉ*û7ãÝ›–‡Úãõ4×õö^ºáÇÞ¤êÙV&ê/Vë¢- ™Õ“ë°6½ C =q±Ò=ÌÜó±Æõ¬îDïÐẟâPCQííw@ß“4MçŠö¢…ÏW@жÝ×Ë÷<‡Äåû·_do~Û}uWl†&Ì·?½§Õ¼±uïåXý»c4þÑò¡ŠIc[¿/ú}eLë{µùÜ6Zºo÷¿ã dhvתÑ{†T¹i<ïc¡Y®O?*w÷&“¦y¼V×Þ„ÉgŠñì@r•ˆW†BÁl·æÖ­¸j-gÌ AÖÕ•„\½¯h ۗå]óYðU·œ_zƵ’|]ðÍ2@ ”4—éƒã:1¥î|´ùªŽôS‘¨œ6ÅÜ—'À/êM>ÇÂ][æŸwï’Ž,É ×ÚÙø.xНlªÅ—??zë`^rB;È€vå¾oáwSêµc'yÔ´5Vtï 64²'2”ªñz~äÖ>;]¡ñ5íî½¢ù«“û·„Zh%ÚY7n©Ú,7xxQ;fOCš;ó«'Y'ŠökC¢O1î÷–‹¶ç2n䦦¨¦«g·Ú¼stñ¸oôцiÎ^À‘Ö'óG¨,ò£†z…ñ3œphí`ÿM¥ü›zÔ¯EA¤¼×߸¶(%!48ýöÇÎæ’®Ý;õSá÷¤UòÄ>byÄ¿×w[ïõšð¿ÌOYº<,Å£v½­Ãà!}Þ?F+êS¦ÐQìu×}ŠßHJ¤2Ü›­ã«d5V(Í@Õǃkfš÷ýK?¸‹ca<žQñ5ª+×]îâ»]«¨Dj˜Â¹Ê ^jÕd1ÛCª^,³Ù¥ôŸ{:‚>ôØÚ!Þö²‚”¦,/„j@[{pmÖZ[Ü;uJ7ï§ß®tw»˜_ðâ‘EHr±)îu¬UjCZYžX4bâ-%Å!2§Ö(d¶“ŒµO  Öƒ‚YÖèI„ ^9rZS¼J¦Æä£·‰}ÛPhd¼‚2YÜZ2Eé§}å è}aê›ÿäa#ÇMÙ‹ã Ÿi… Ôp-¸Íü²;@Z­æÍ}=±Ê!¿Ù®8wo— £O£sFl?wûsÀâëžÖíü ¬n(¯©ÞqyÿS´¬Ä|©YƒXD”ÉØÃ“/2cø–S^å ™Øï¾s*z÷£ûÈ©Íá>FÜ£(–Rû"®¦#:®â•õÒ-}‰Pª§IM‘Å‚­á\u“ôÔh&½ºU¥*—‘0\®ØüAù²]±á¦œá{êŒþz/Ì=Îqù CÅpoˆ‡ÀøÍÐÈëEËÀ‡2üvg©Ü uÔâ`ì°Y¥á’ 0¥‹Aã7µÔÊÕ—*m~0)ЧÛPúc¹•Å©E7½ YZæ–Ìþ«òd# &nÚ‹ ªKCªÚ›b,âì³û|å—E~aЫwOWN/ŸL‰´6¨F6­Ì|Š4 Á>%Å;¯Î>à1Ei4´ ÕÝu¢HÓssˆÛá%©æÉ0  î½©81Ú/Žv¹ð;#6fŧûºŠûYð·}êGeaؼL™âÇ¢G Ÿu>HPе°T5­÷k'œå/5öÈ5+øS|›3˜k/*Ñ'oò¯®œ³"%óL¨2Ú;>Ö{ ™Kˆ¥Ê7°0ÐîÝð¯ÝøºÁ%D”šw¨Ýù»L­ö¶ïý¾;ìô2~Îiφ+©µ‘ÀUk,]£Â™gØ÷¦$lT1#ï]³ê™.”‚ÍŽ"N'e•Ù>–êÒÒ$»;(•-»úbVξ³úÜNÝôj¶ Ó¿'F3ƒÃWÂÄÏ»QòôT»»ÈmrNxäºÊ̤‹¥ør½£-¯]ûºäتü‚{ dî¹Ä’X Ä%µ ÜíÓ:‡ò˜Æú!¯¤"syŠÇ_ ”‘ƒ>ž|Iýl’³{îÝ'/e^¹n˜ þŽ´h± Ô¾H€iC¾Ýÿ¾É„Áý+Šw깯wç›xŒ\z`Tu9‹’D«C¦–—±Þ©üÄh~¡ò"›ý}NßP­ä‹rÝõû>­ò[dÒI)Ipâ–,HÈ‹=TIê$aÛòšQ¶9¬;@™VØö ñ9Çá\®ŠÎco&|”÷},¼ œž•IQÎÃ:™)¤¼PfùÞRÓ@!Èã×?옢,!Jõ¦¥~J» Rüý'ôAHà»}äûî£$ŸêƒhtºA¨"Ÿ٠™¤áÚÖON\'žn…ÒaRÌé±”¤&¿&ÌõæåÑ^9ØÝêqw³þRŸ¼_ :†è…ÞŽef%†w֜Ĥ¶9•u™ ĦH†FoB8Ó]ã¿È¸xÔÙÖ×ó÷}ÍŸ_á”âš]±f<æÝ¥òòµßÒZo´XxÄTyªEˆÒ—Î\äEùŒñé:ÞP~°LÙ¸â„P¤E€_@üué±úå•‘î¼>ž~Äã³ ¿%Î2e ²Ý5«1«"± Î!‘&¡ÙË6¼ÛgÞp!#úd£é€Õ»7Bº]‹7GÖ-IÉÒ{"§•öyp+îPWœ)Vhãš„ȆÃɤ?o@øw}Ôh%¦?°vâ*q†µÞ”ËT×VO3hÂj \X I+º¹¥ât&ÆžXLUðÙ±Èi+ÏY¦~¾Ü&¡FN" *ñ‡›Ë Q ±|g±?9+"=Ê8ØÀ´ÝØLOt?NpË;õO{µ¯ÉÙD­ >e‹v\0Üðq¸ôÌÖè*»W ŽyBv­ Sì =ºæé#R!(¬‰A³áÌÌNïtŸª×ác¤s›”õª¸çVÙ7ý7Ÿµæ)ujÄ.Sð§þް§¡U0?YÇ‹l¿3‡Øm<_}òÞ9ïg‘…4ƒQ?¸)ù)Ɉës¦üî›ùϦܪk|“K«Â癨]er¯ ´éÖlc‰Ï°.¼6Fu½¢ê$âh>}ÝÙ¹®þv»->¹«Ì‘ôxñÇbÉám?ÆSÙRwÛb–'½^’²omÆ ™­ `Ð &®lüq? ¢Èóq¸Ü'”±Ÿ<—ã‰2I˜aß»?_W[Œ§%Ú1üãfööÄ#äÝ£Z‘ sw@+œwI!êѺ$ºÎ{ òžæœ²;Ðw1ùñøÕ xÚLE²pÑ¿|íö ¡i |ô+›Í¬Ú‚»yǹ»ÌP@!,ä-OÀ GÕÙK/m’íd£Æµoo3ßcX„;}Wxk+¦0HÒ—q¨Èmætz’¤¤œ¦Ëeà͵´»çOéÇDFOŒùž¡2•ù¥.A-ø1úW—þý´Uµ“SFòñFL‡˜UÆ jçÐû°÷$krY ÛpŒŒ©+“aö»=å¾¹5×tâ°vÆêiÀ O‡2XmÁ¼ùú—±Ï¥ãWR¨,9g͵‰ï71Ç\¥ÍU¶õ ]—ÇM\g|t©‹k‰+©èUí)!Zà)5êÅDžÂ6*ÓP~ˆf±dYhÂ-5³»ÇU`‘êýJ×w:8Á*z<ÌrËâÒâ‰XIU“–[ ° r•ÍGŒ—ÔAD{àqó4n°¶eà`/ø£§Ç5ùÆãªF÷Z¯,Ecg-Ç!ÈýÓï¶{:¾Û¢“q„'›€\»7ÂX`ɰœü³ú×Ô«Ñ]þxûF7)QjŠ»ô8X>?ÔâæPÊ3}Vx®޾Ìzc 5l@gè"ú-{+™__¦•ôµ™üè£v•'1IòÐ^CTh;'ê<¯|?Z[çïúO–Pc‰¨3ö+-†/ €2ßd♿©ÿTz~[vFV…Û4¯m”ÂplS”çqBíR)›ˆvq0©•ÕhVåµ¼Z ,)­þ˜Ã‘ÙˆQBe‘Û >Ô»­ 3ó,e'x·z9M÷}‚“2%tŸ+Ë>¢ª0pãIû×Ï…}5É4›”‡¹QQ„ŸYå*3ˆ9¶Å_2N¾œ]ßÅTu÷^¥È ä Kï›î¦›ìT¼Yž¨žOqnÛÒac ßy>SsCçV<'Y’.¨êô:l‘à¦NàLz²n^j ¨è·ŠÄû\õF7y3ØÆ×ÈGZ(}Áð†¡4»Š*¥¬/m‹´¸Bš¸^LÜ…ì-WJU+îK­Õæ¸ô¥=¯ÐŒ&|Ù×oŒçÑø­{ž”îéÂϱÉÓ¯?÷£º¶Ñ×m-*hðˆ‰Øïiïl<‘¡·Ï„=Ÿª*3|ŽÑqmîNz+Pux];uå‡cLÆÕ,2ki2}9Ci/¨ßÞ½*ç©Ãí´i v`~šÎW8O]ùMØ ýTáêÒóÖ£:Õ•ÒÛ&”HeÈÉ=¨Ëñ´- paÒ”xL0Wz†ªûªí]Ñ%[¨Îâ]q9Ç%ÊöØÞìžö8›N¼ëJÔâ‰õ[⩃@rPð›°ºy(šeYz“Õð“ ñLã‘ãÑ@,ÏWѯ#Qs¼8”5Ú´zHÕGœäïPHŽˆó‹DßÔé·qæ±:§ITÒêd÷›[qNíÆŠADbÿøfTn\FLЏ‹ alo<]“j]s#°½³J×8°Ÿ ”8¼xô³9ã§àäžÃü™¬Á‚Ù!pJÔs#œÝoÙ“†Çòº¢òû¹Ýnלã NkÁåðAaøIùÓá†ÊÁPªç•~öwÎJø9É}ã´Ü.M#`×û«ˆ1úpW‡†Ê90N‚ªeSüzwr!{ÐI]ÚÃ÷y •Ye,|ÏÛ}UH!@ÂK*‘û÷ÖY“Ièd¯‰Ü׿¼€hCÏû¥Ô ˜ÚC “_R'QM…žÛžf5>Kõ}GUß!•ˆGñtóºx| Î¨#ÉÊ/ksê;îBFg¶~) áè÷ç ÒÃøXi8AÃÐǘ i§j 97oú²ÌL_H3ðšÒVXÓßuïãêIÔÏkH­Ó=¹ß¦¬Ú®_©Z¥RþN˜ÅK•Fëaúž]•MúÛìpÅðuÔÂ9ðžÁ§¿®$ôÎ*‡ePwcÅâZï=LíìÛ“œÔd±VVÙžX¦8HsÒqj¶ÁÐcd.>x.+¸qPpS7ÿü)£#Ôj5§>> SSf”¢ä‘EQsôˆˆ!Uó\ v¨eYøvTÔýäí¯8‡éç-×LUO™•®kx£Oýe1ó*¥dtmš®.½aTôî$ý§}ÉÕtJwé1ßN9dá¡Ø>ÐŸëØ Ê{[lµ‰¥­XC«]“MŒ¬;²½¼Ü‘YM•_?Ýl¤©}—ØÁ…út 5‘ÿ#«`Íü·üæ’o¢ø‰H†ÖeV-;…y¦†§ž`UNNVg.è®Ï»¶ÏDMw9+“M3¦¤éXú6Ë}x«fëMåGtãÅ_ O¢â+?'+’Gsg¡~8qz[Ÿ„“K`ˆé/ÌÂ¶Ž‘Í÷/†â?ÝÚÖës%Ï:SÆ$Qƒpš§;·§ã›ú›Óÿùìé endstream endobj 1136 0 obj << /Length1 1357 /Length2 5946 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xÚVT“Û²¦I ½HG~)JOB”Þ«T)ÒB „PHQš¨ M©ÒQ¤K'"MŠ¥JQª HçE=÷žwî{k½·²V²÷|3³gö|ß^>oj!©îŠqAè`Ð8I¨D Ð46W )D$,l‰Äy#þXAÂ×X?$­ôßpM,†#Ú´`8¢›1 ø{P*¯UP‚@iDñ_ެ  @ºÆR€ð kb|‚±Hwñ”-¸(UTTø¨£X$†Œa8Šx"æ X`àH.ø)D®xàp>J`p``  å'…Áº«ˆJHœ`ŽðC`®À¯v ñ»1)0`éôûc¶À¸áaX@4x#á´1ÀíŠÀij }#àªýÇÙèƒð×ÕP)è¿Óýý+ý;‡cP>0t0í¸!½ÀU#)\N€¡]9¼ý0ÄxX é s!:ü.訛0buçÇ"}p~R~Hï_‚¥!^²6ÚUƒB!Ð8?Яú´XœxëÁàßcõBcÑø?k7$ÚÕíW ®þ>`+4Òס¯õ—ÑúÛæŽÀrDA |DÜü+¹e°â7ýe&Ö†÷ÁønÄaH7ñ„÷ƒ Ö†ÿïÀ?w (pEÂq€ ‰ýhF¸ýÙ'E×!DâAȯϿWDn¹bÐÞÁ»ÿ.XÛ@ÝÂÒHüwÃÿ†440A^RZ”–ƒP¨´4 @\„ý3‹) ùW¿cõÑn@ñO±Ä[úWÁM_ä/aˆÿÌe‚!2ˆüMp{ˆNü‚þ¿iþ;äc÷¯,ÿÁÿ³oïߨÈ/ø 0Ò;ø/œÈW‘ûÆ¢Ðÿéjø#Wc„+ÒõŸ¨>FÔ€:ÚÝûß—ˆôÓA!\M‘8¸Çªü±[ý˜70Åø!=(€$ùŒ¨*¸ñÑð#òñ7„ ŠæŸGj£á×_ê’–“`X,,D1q'à¡Dº"‚~3K¡18b@l/ pÃ`A¿æ)«€‰ÏÒ/#è‰áþX,QV¿O<õ_ûßF ‚pÐÄ~ù¦çË›¯÷*Õy%û•‡…­ˆJâ'°Mþ Ti¢Ï³¢f°»êi=íL´EvÔ&ùñ«õ¯¨bRÌCœ’͇Aãƒìož¬ªWøhx%-Õ–B}C¯Ez‘ד¶çúú_b0ÍgÝ ìÔ ª"”M½‹[4[z.oH{Tö^òŽU¢}dñˆpžËãQNJœ$µËVãÈÎî0KÎÀ)¿A²8(líŽL!ÞnVúîþhȧ§–Ò~­\B\vœ|ä;,ï†.à5VÒ 8>àK § Fìý‹âe>¶’8è†ÍÓ(\ F&_z¡ÚM~~É}îçZ m]/ZB7®b2ýÉÒ±Dù 2¹¥å#ÈNN÷ ¦ ü_KÍK–£' š{¯ž—0<Ï­¬¼s1• {{2€_e’_w›+½â| ˜žßŒ^‡ÁøU8Á Œ:Ç#–‡¼-’-pYÚ–2ŒcU¡#Ѹ¦H8–Wßâá¢ØpˆrÌ…,spp¿ã¡ù^-çåQ:Læy5p¥é£ï͖׉”%'Õˆ‡ïNzâàçRЪ»Eý£Öq)¢Ù)飷ùY[¹ûùÈ‹hîxu¤/%¤9¯ß±{V›ÚÞ¾gÁBO›.Ö§šVMyJõ9uÑšàŽiNÞH>å~[ñÒ¥ yÉá·×\iƈ<¸ÙÓ +ª“—¼ÏP÷v÷Q„)ݵÅöñ¤V¤Wr³çæèÖgçÖÌê6ír+Q õÆ×jë-ZO ·ÛmS­uѦ=–‰ã” EïaNB›_˜žÑ÷øk¹²ÅŒËÜ5£ÞÍÐಳp ö—¥[É. jŸ-j˜›2Ù¿r’“çy?Ÿg3畦À1¬ŸY¯"Ìs´6|4~qjÑòá©hiøY!}áþSßÙû¦ú‚U’Æ,)+ׂ¼úÚƒkjÓ¯G¦²Xíf ä="6ŸÍO*{¨OVÎô¿£TbjL¸Œ4L³AÍöÇüÛŒyë¤íy>HJÏÊ™¸és<;ßDyf¯Æšðõ“øè‡V5×~­ð`lsšVÅU»¤í©¤Ê«)"ÂŽ%M`ék­u¢uÍÜ¿¾'t}™ÙZGm6p¹5pQaá5¿+ átžŽ¯µ4BmƒIw?›±Þ5ºÿ–7Š>Äpܘõ‚¿¯ðEaÖÖÑ8¸ã—º±õª× Œvï‰nYïÚºM­~:YÏëW9O¨ºFU‚&5ÛËZVå†(¢S·7Ïæ ;~I¡Ûgï,H!ß’•,ˆB´{=ÜX@­ 6_XËP½«Uå‹ðmKog~|§œ—ºJ2/·„:H{}Úùøà{R¾˜ æõ\Ń(Ûq^ÜDêà¸:‚ 2wQ97²¶Kßà·äæð.VSÀÏU™+¥ÁË(kMzV¬’ÉîŒØ™¼•‘<ß1  ŒlP=!Ýf²²!˜þ*7†B±Œûò6è…úÑG¦Á ´ qa«Qþ<:Yã]Ò y©O+ƒÂQòí”W®9z“ó÷‡\»ü³â‰€vá%F]¦½¼%ÂçÎÚÎf8Ï&†å× œ“ì¹OŠ:d Á6M5=S'u©Ôâ E[!.—òšýƒi6s>¬òê-¹p;bìW.cÞ<Ä-ö¾ËrH‘ùrBûÐ*ls˜§–Hóã:ƒî'‡ ‚n9Å—jÂ>ŰmªÃܽp·-À$«+†ÙÉ!{‘†Ï·LsŠ›rëçåvêßJ.’¿Ðj#ɽ‰]ˆÑŸ¶§ò¹œ‘_öµ.A[h*ŸYÂð°ÛHØ^Ä™ü±ã†8vD# ¾<•+s«-”™1{þÕS%ÞŸËt®#PýÕ”gÞWÆÚQƒ¤ôâãO"Ǭœ¶…$ÝhȘu§ùÊ=‹9U–}’ÉNºc²µ ;eMZÜ=d2úÕÂè[剦ºÉÜ®¢«)øj¿çÊ+(û¨È¨´foG]“nþqJµÃÕYÞŒ$?ú ŠÆù³)¼/(\Œc#/²ˆ}¥®¹H^VD_Tý¼¸ŠnQÏ­ÇgeW>ä—h|ÃgjïÆ­I™¡Ld¹¼f–DØHY3ë½e ÆûLeä-9SKsöÚ$ \UXÐé Ù«ê‡;>Çë}¸õàO4Ü3˜uF•})¾øæ”ñ¼Öb·µ­ t]ëa¹TúnHŸù§öpÓi/m¼Cä7ÂÁòµ¯£)åÓž ×`N°žÖ;’xÁõáuŽ¥bÉȃ³ ]¥e^—«S׿‰2oè={M5¢nC6©½Ú˜ÚyZüÓÊ=çŠWµo1‰WG•FùÒØ[1ϧà Ì cú‰é„Î4«M*¡¤¤bÀ¾Âe>Þ€F˜‡ÞÞíË¢¿ü\FƒaÎâÖ#Ô;A(²T9ºõe1ìÆ^zmKâeûK›rþá‹×•øÅu5#”¶_êˆ ˜0‡¹o¬ÆÚ=@qe¨ãÔ,B×vrPSâÊ•e×:Yõ(­sMge¾‡’åú B ›­\–k>4su_¿f“½™&U„kz®ó¶9 ;Z\ož[ðŠÓm²ºipTølwô^ÿÎ-]ãY³ð廦½›ZÞ$Ÿ·˜-}ºlßø,ìÒqÅ9Á§Í+mÌx¦|Y(™Q=ú˳sã™Vzíå”m¬†Ï2óÌwA‡M2kßê¬M»º’ä…ÆˆGm½èáá\MòÇ+›ÁÙñÔ«/=Ż滺íŽáSúRo§-—¥9 61^Ý+âž ÔFÜ÷¡¾vøã0xz¤ï`çút9 R]i^r½f ¤Vºyû\S G"­Ø×îæÌàÀ-öc&f:ÃÆóßóG +«2{ä¾R:N|6êéy:a»·å¬5‚ɘ­UF†¥C®¦ù.Qßð­Œ.HäÈn`õ{Â{>ò «ø-QM¯ïPžTÚª•ì7t—È”®0Õâõ›îŽ“©°¾ >³õ3¨ùêÓZ4¿º´r«Æ¾êFÁë6ó8æJP›»SDxÍáO_)íPy7a)©j“àòN6úÓvî'"»õ„œ“ldò´Öh¾z!ÅÈÕ®/l[:ÆúG&³ÔªlñÝh©FGá>±ÂA¾*ö^­‰ÐM;Õªõ› 7ïZC·HŸÑ‰Ñk]1]€öz:ìÇÏÒ†4³î¥å~¢üz_…ï›wŽª©Óé&n“×÷Ã0!-É(á"¼,a§–dgšæ#ïLlîm'›¥ [›äãÄqÁÐä»t—oôÏ_7‡’/NæßNsÞU«©ajúÑ{¼[¯¥Fׯ>éˆ÷ʰ~ÊÉø,jnÃ(ÈWW´Ÿ¯Xè"ûÍ&^ॠËN£aòŒ„dΓúbæ›Ä\³„‘d\ý.ï¾4ÏËItø†Ôzy4p³¥—'-´Ì‰pŽu‹s&©îÄk@ä™Î) „^¸$–}ÄkK"³/ åNþEÆBcüéù¾Œï}~Ó—^Óˆ÷/|Š¡OOC>¨›ø¢¥PßîuÔ¸_ñCpñùÎT+FûÐØ2 ñ)E—½»­mÙ9Qq(>ΧþÖ‰¶Ñì'uH´yg<ý'R £q?K947-D.íröZGf³5ÿöf5›ù–ÿÖ#ǵz‡W Ò‚1ÏZb·ž‚‚Øk-´Ùå* Ò®fnZ½URÅ<ó¥«b²¶gŠ’ÆCyz.,þö•v¯j¡ O·÷Òj2Ð+·ŽÓ–Z”™äãwWááçŸQ`Œëôg?ß×ÕLà‚fõ‹¸1“¾¢ƒ2ªÎ§}Q§²5¤âÑ´c»%\–êÇ&êó~àçtÐÖî©ÞU-ó7Éâc§˜çKKUA:_wÕ¦j“uuxKÎ 1°V[Ïú/¿1"kµÌÈMS€åöɇ¸ºOâ]”ç1{CwÙëJàw²âa' %¬©­oM-k»ÏÙœq+DQ¶™¼ç}*¦øóÕôÉE¸‹¶F‚Ú_O¢{ÇŽë.©F0ª ^ùÂ|ŠR-Ýì¸ùh¾½îx¸Åv#ƒ£UaÔÑ ÛõÍØ¹yÂFb¢gCRôˆ†nÊÄ!¦ääã!%ƒ¦ÅV¾ËXïpK÷©}÷>nŸÀ)-)°¼``¾©éæ¬uG°ÑÜŸÚ{vÎàðæ—ùaIÌcÎÌ«ý¶–éšKÈ‘.ðÁ›¯‡€!—cuQ¬%¬[ó2ŸHy™tîI) ÕMçâØõË µ*kÍO½?½â¥mõf™R“t…V &:wFR2®V«ŠGÒóŠëLý¢6ü¸žúÁz’‘aòË´µÝº48¯Sþá¨ù]¶¢¤eË'Ðìê'À'•MìJônfúzBâeÁsºcÅß.7ó)½$”¸ž]c·‰@‡ê¿Þqè+)ò/sB©cüE&B.>éï}j¯X¹ì@{’KõtV·ö«.v}$µå¸÷¼{P¢¸7¯ “ýmT»eÑÅK=>iO¿´b0I¤b§2¥ú1…"õÈÅ1M;0•bÑI<ú‚¡Ê:í7tg9%f.Htü³[ lô¼ýz+ÿ G3iýv_†–üÓY = ¿Ý”q3E€æK§ü°e f]ÒZó4}®´F™Ð6¸+5˜èGh7Ÿ“Lç‹ †¶VNr»Ò+*PìZŸ4ÝÒ¦C™8‘±¶u}}«Ùy4+3к—x9Ÿ¾ÆÃ.ðp9òs>½ÚÇ©çå>÷àÛ”2¸wN‹ã‚'ºàç(ætw¥ |ÛcÊþû¦ꂇI$ÕeªªÁWêºòª5ü„.0Ë)Âñ<Û…"ò£mñx§Òµ † õ&Ò6½¢¶ ˌߦN*çïQ i>À¤+ù;е8 X)|ª8˜jü~úèÓüIÏÀÐÑ9)æÃ‰>¹%Úw¸¹|TßäšwﲿU Ç–Ð! &ôjÈùÑòÊH¤÷¿Ð…/ð`^wàØ¹bŽåÔ‡Hxï…pŠWŠÏÁ´ÏÒu§@»Égw7U5Õ·\ªÏÒÙ\„"ÞÉÏF +š-çñ†™ê8kÝuˆ£ Ë>;o÷3ù¥èÓ{—|¢Š®Ç2~©ë)h¼~¡Ü?_©GŒü1ö‘ÿ†dM‚òƒ’j¬¦ÚÏ}”g÷æVVŸûðÞúei™vÈä——ýå0ÚÁ!±ó<â,/‰ÿqNCLudS’V6b”ëåŸb^”<åø¾ÿd”¡‚Ïm¤Ï)%Évµ b£W*,[)n<¥GŽ \çÛnR‹„í{Güèœ| ×(8v ‚'Ë ñâ%ø.?Ò %*`1÷ôY¡Ÿ=‹ìÙ™XÈ=êi¬†ªødŽê;fšTír†ÃìÆŒ¢ä”€ÜS=rSô)A]J’”a²êïæt'ûÊô@jY×5…áv?·ºÁòYaYš+Sƒá%ÞÃc¬NÒ½ë©ÖÕže®ÆW;Zø?“$,ZL¡¥<íM3´Êù(Ò2Å”ø·—Ð[±ª3t‹i5 [>3JµÖh2‡ÌW\¦Ò…àÖ«Q¢6ߦZRlA=Gäß'Ä[S.£ ³fëŒ"ÛX+ÄØÊ$ï@é"Ä_·}ÏÈÜä¬ð$ ¾›ÒûþÃgŸøsãÍàwÝVƒh7o®µÅæUõ‡ßݶÝT`rZšLB¥òõóÞîIÍÇi5b²›à<1Ö¼ BƳ<åE'¨yW!ªª”!H"biÌ[ûxTG/³(gÿ塽Mö‚zwKæ ÙLçwÏ×ÓCSb¢'¥¡-¢÷h³oå¸6ÉSH)è4xi.gI ãr®™Kœˆ,ÝŽñÜѾQéõüs$Q–<3­3Ù&]+¡jöMÂäo¨bšNk*¬B6;—àßë.ºáé sÐ9fç^Ú™¼ÁÒ˜WÝCç…™7%A§©4Bè—¾<äpÌJüðh¹}Y’q˜Z»`ÇËsi`õ# í%pŸçƒ\±ç.X:1üé‚Ëí{;Ú·Ä ¶é¤£l§J—ÃCM´|žeXòZÊÛ ;Ô£3pžeßCdr²&íÏb©LU`Ho¡¢9ßõÌ7ù2£àYøÙ‰±²õdÃé£çŽU7hçd\6…5¸Õ„ÊŒ]kÖ„.‰¬ú¥Ü6}k /²=ÝR’N2¹ðÝ—™¢ï£ìƒ$¡ë‚MCßÝ´¿%DÂT©Ù¬ã²ùÃÛØŒ4äŽCï|Þ–þÔs’ÊKuntå’ý³d“مW#‡5,¯Ý§àÐ+²åoõ1³Íô¼Dù4pÉÄ”ôØÞ:†åûÑ}Êi§¨³0³5jÐ0uº¥gM¡ÁÒiæî¶8o5ó†ó0—Ü]»ônŠü˜‚,Øg”‹¤­SÉ á zË2Þµè?ØëãØÙ¬öPÐ?pðŠì‚ “Ä”XX™Ï³ö[&ÉøF·í\íˆ857“ÜYw†<)>gWBu4 gÉS,íü"ó8·¶AVŽ+ÑB²ÃŠ­‡‰Ã)èÙì©ó;A†™Å–$|?ɽ+VÓ%V…~ˆbüƒ˜†CSE"^Ε/jQáä•J{ ÑÂïüÝÔ¹>yÉXVïòUŽÈ­‰h‡;dt£¤„W?.$ÄAÔ÷éKY?´¿šŒx±É¢Å¤Vq^_üþ~Ê<7õÆA©ÔõÏV/=ÃUÁ¶"Jäc£3rBã{7Ú`Bò{pÎÖ?ÉCkG÷ûìò²Wôß7¼IþÊÃs¨O“ö•ç gõ÷Å‹ ÊÏõ”{ÉsM> ” û’`Sqf]s»UE'Í©¼Z¬ÑxS o¼€<¶`9jÞ1½f»Þ¡‰€P…¬ÜvyÍýSOÁ¼\X4Òd{!"ÖDàù‡§]¶±÷#°MÏÑRë6½“grh0A¹ âšÉ¢vþ¯lŽÝ×(ë ó¶ä8©ºª§`OÏeŠ› ºV}oÌíJM}oÜÇÒDâ„kÈsKOûµšQ‹÷ÈœŸ2N¯þ1™ÐW‚xÐ]øRdg`™¹\3¬0@ÊB€„޽Œô@QMŽ©Âíl/²Í:›o†W¡¹Þÿúï1¹ endstream endobj 1138 0 obj << /Length1 1577 /Length2 7948 /Length3 0 /Length 8992 /Filter /FlateDecode >> stream xÚ´T”k6 ")]‚ÔÐCJwwˆ4 3À ÝÒ Òˆ€tƒH‡tKRÒH‹ÒòzÞsÎûþÿZß·f­gî}í¾÷µofz}nY[˜5H EpyøÄòšz||<||ü8ÌÌ`ôÅa6¹ÁÁ0¨Ø¿ôòn +S°B Í4aP€š;…Å€"b||~>>ÑÿÂÜÄ V`[€&@ Áq˜åa.Þn`{2ËŽ6vPTT„ë·;@Öä¶±‚4­ gdF+@f!¼ÿ+›„á"ÆËëééÉcå ç¹ÙK±s<Á€róÙ~µ вrýnŒ‡`à†ÿõavO+7 @À6 (é൹¹úªmô±Æ.À_Wòÿ÷—÷¯@`èog+˜³‹Ô µØ! €¶’ Á°‚Úþ2´‚ÀaH++0ÄÊið»p+€’¬.À Ùß_ÝÁmÜÀ.8 ùÕ!ï¯0ÈKV„ÚÊÜAPçW} `7 òÖ½yÕ ó„úþ9Û¡¶v¿Z°uwá}»ºƒTþ²@B8ÿ`ö @ˆOD¹@^6¼¿‚x»€~+ÃÈúý}]`.;d °ù‡ã ·ònî ß+þ[¶`Àd†âü ƒìþÈÈÉ»½¦|Hâ|¿~ŸÌ‘ܲ…A!Þÿ˜ÿ.¯®Žªº>çï†ÿVÉÉÁ¼¾ÜÂn~!>O„ ‚<øÿw+ð_Uðýã« µƒDÿ‹¼¥ÿìñ×ôÙþZ vÀÇÒ‚! °ýCp3>!>äøÿLóß.ÿìþåÿBðÿ­GÉù­eû¥þÿh­œÁï¿ôH¾º#Üׄ!7ú¿¦OAÖUd vwþ_­* ¹²P{Èß—†+½@¶:`„êüÁŸüZ0 ÒÁÁ¿7ïtÈ­²qB>p$«@È¥ùP˜í¯íâX¹¹Yyã GŒ”„¾@äÚ‚¼~3ÀË…!.d{þ;˜ίyŠŠx­~A¿%a €äꎜÁ!¯Ié¿~$swû"¹Ì û[EJPпÔH—Ô|H ùØ@! ;Ä?(ð/ôWþñðþ;“€þ/QÀû1’Y¼7пJEæBxþ)í¿.ÍÆÝ ™ ñ›ÔÈýüû}¼@68ó³0ñPǺжËY*Oî­qÉiæ­§éìܾóníî?ð1SÙ«³Ÿ¯¸Ë¦½'\ÚPd;“Y »õÝonÀŒhIÖm½ö»±LÒ›ÜjÅùô¼¢p_¶¾›šÛ@fÛïÖÕÏ0Ø ­µS9ÏÕý1¾N>É¥g¯²W}_Ùâhøì–îvµ°úƒ›²)î¸'±fÁÅ3̯­s>R0` ¸i°8ˆ½fÎΧ‰_MÜÑ©%qâøÄ ¼ñ5Yå¿úè³\aÀï¢d¢4¡ A;#dñ•Ûy©öpηäÍŠÛhÚGòö±5ç d‡ÍgKKïÒm÷» ó„%/©jLìJ‹Ê çbú‚9ÇKj+^ªßEš­á\Ú/ÀwÚ‘:|ËÞûÉúôv¸°øvê{´ œ´†¦J±WW—ª‡Z´@¯1JîÁp¹9ÆwœkɥÀ²Fº ²/9*ënql±Q6¯$^¡ë”; ªïcqú—ª¬pëÏT­siT~:h.©äZ6ÚdMU•²cÅggµr5†ý= ìIEòD^÷^R°émx§ruÁÙ9UVbÄ7œQÞs<”þ"¥’ÝÎ1ʬ×*þ˜ÕúdKƒ$Τ'µ+ÙzÀvÏ|ÀTÙtÜrš~dE:Oç½ëý¼¢Ä󧽫Ø4ÂIBÇ£Ñô¸D+aVÖ:î˜ë{È5UÔÎðìCÔCÖš:a¢6¿Àã…D0 –Û\Uù¹Íf»ÈæLPÑèwþ¹±GI þüŸ_úñJ{dN°Y¼ÈHiÈWê‰;à„’ÍûÚ[5Q¯h |ôd ¸/©Ý|ªAac©³^»ç‘$Z«4’å󃌙ðyÙ%Q(Èï6R;wÚú(¤š2¢ãÓõÞž!vy°:Þú ‹æ¦ÞðÇ3­ìš•]a±áX÷œWîÇ•ˆ~y™Dý‚ Ò_Ûhn¢?Nú…ÖY'ÄnL°f¦…&Ý_3*K§hhÇžÿCh7º®t6¾›‰ÿõs¾ ^š!Ê;ÿﱾŦDdÔB`5mã2©±BhÄFÑÄ&ÔALçŸB/¾Š ®4S`î˜ä¢Ü£.]H8,"(ä~¦Ð=é,}O`¼á 4”ëàŠ2²£ y½„Äp‚Sož*PùÖ%×[á!µÊ„‡—¯K±ùýü  gÛÎûŽå)âG½dQØMJ»šZölú¨Ñë€éöû-Òâm2š$£‡rZ+ÊFg `‚=O§j^¿í½¾Ñ¢º©Óþyl‚ý€é"»»ç„¤ö‰¥tÒñðФtSîÈ7‘‹ó(Æ ¯Ã'(;=íÎ-ñígÏߨ 950¹‹5a蕑·Eƒ¿²¬ËT³xЂ&Y°‰’´Cš:“3.nמÎÌ=·ø®³^Oªm=ZíÞ8Bætd W¢9BÞ­á†bõȧ`{3Ya2,ää_½'F¥8"­ÖqfOŽ+ItÒ½°Cc}ÎÇö¡ÆÕ@Õ\Ã,¨‡Tv4ër²cªWs,ùL3>5 VN÷ÊK£¥#&j*À}ˆÖ<¤Õrrrá *©èž¡2™éw´™T1¼°KÔþ\U&*Óü%c.•ðhâ7}ª Rü™ó¸ìûy7-¥U;ß4ôøÄxÅ w:'‡‘c+F§œË+j{©…ÿÀqTr. u`§4jG{MýñCDÌãÆš˜…Ý—¾î˜=x1a6[â%# éë­•ˆaÅO¿‹q"™ÂÞIn¢|jÇ}Y»uÑ·†7Ö§¯ë±‰ß3¸^´­s¤¤ß5lkIßÕ¹E›x̘p ‹¦ÂïKóá˜Ü[>|Ú§\ˆqåq·i Ø=꟬1rÓˆðwÅ28öpv”ŸÝ*·Öì%³Ï];ìî‰8Çî5ÔÞ'oI^(# ­dô›ôv¾àãæù–ýÀ.LéÜëéü¸öòö·q.ð&#ú8aWî„PMÖ#’Û×} + À~®“¸×Ð[Uý‚´ûY½Ù—Ćw ‡Ž"[يÆl÷ó ,ŽÔϹó¤c¿ }Íœ~Á³&nëËþqÍKÎá!§`ÅN‚ûìuå;÷ÖÄ~8'¿— a†?¯¥çÆy³>ôØ(kŒÓ…EðÜ1ƒl“²ñ\Û¢ XûÆÀÅ#N!Ì"-‘´·“.6sïÔ‹)ýí!§ätÓëEåëm‘îjÉuJ ¾°Õ±ÙMª€àê Ÿù^ZÁ˜QF˜|Ñç‘%:’½nl~Ê@ôþKø»B…ÅVéì[G+ùåf÷³btÜš66’‡XíWÓÉóºŠîvÌ^ïwØœ°PQå°Y»¹»Rº£š—«ÐØÌ÷¢Pºˆä%çWŠÕjÍëÊ’Ù¢¶†ühœú-ø«®›Ù‡÷–ú¼ƒ#­’ ¯™Ya  Oøãé+Šh„t¥N^—±oG§Ú³¨½f:¢+&% šáZXtÔ7'c(¹~åÜãX2ÊäˆO—A"¾ëÛi¥¤ùºšPcW³¢É ¬ÚÞ¿„Bhš|oÔ{NóQïú2±g‹Æ E3ïŒü@º¸nK™"ê'½¥¼odmZ8> ”Êv› ÒˆkMû6`Ð Þ¾¾¹/tV±Ù¥QÝ=/Io(Äó #Çß U}횆üëóMý 4V½’¹øAbC%TKÿ`mCnŠ#Ê yÂÛL¥$Éoëñ4â&¯ZãB?wçE*ÃbA8Šñs \²L€‰“ô™«½Cähzú(× Þ÷dâ‡`©‰.‰ÑåU+MD½{ÄËüŒË™¼¼œ{@¸­¿º¢¤iJANÆ–· ~˜¬|EŽq`‰PË)'sÈèÆT;Í}âä>(ç]ÇÈYVS T9аڷÖˆ¤lEed~ 9ÛêðÔš®Æœ]7ŽhÎÑŠ™0ââL¸…¨Ì7K\Š=,¶ÇåYW'y‹¦F Âoú´J¡ÅW¡Od©•F´ûœŠU-èsîŇ­kFàéÐ1MlÊy†®œÏ5×7Á•J¶Eÿh[~®¤zg ²š BöìÊy¦GvGê~é–$ó4Õ¶7ªzxBT¥·¦Ü”¾]ßÝÉÛƒA¨vQÁg¶x‰ŠUðÑÐÅÊ8J¨®ËlIË`×ô»= '–é¶yµ¼<\Açq¼ÓO]¦Éƒ~ãæ4Ù$B›+£8¢jƒqÍ´ƒgg§qø*ñ?n¼²ÿ¾IÙm‰Cí ]ëôÝmÓ•}‡E+.mV¶OVUykŽ©ˆwUƒ’ ì3̹{·Ô&(Æ5b¶aPhL‡ —è¬ÏkZ}Ù£Õ,½Š£ùj÷o—µfز‘;Ӏ徳¼™‡ËÍe™Pcu†å,¥*Ñ»¬ÖÈÃ÷ ‚U“™›7î™ùÛÏŒWfÈ[‡eïÖ‚N ½®k] UÊ£_ E&¸*œëîm(ï5 ‹J¥Nß”ˆ¨„?’MûHÑš<­ôÝøP•'m8=¢UÀå¢snü2þê}®¸êÏö•îTé|†ŒE¹éÙiïu¸šR8ŠË\}‚6E³Ý~»8ü“ð#ñÑ·$|©!mó"³V?â¿9º×}m±udñôâþYC‘*/Ýã‘¢Ú¨¯ª1®cÖçü†¨Ì=%‚™LU2[¿–TNäƒfm>Ô¢U–£Xp":ËÜþD*1G‚WÔ’ ¨päE'|Gþâ³€ô\Bf@'&ú, I!<±&§7A?Ðß0[„óÅ5þ“` ¬Ç›ËNkK¥ßè;)^ ú{$EL¾û‡d7ìæšÛ¼,Ú§Ÿu (‹“ög!%´6*Lor+Æ[G>´ÃSžd¶ 0(8ÄrÏѲ£]¹‚è3Oµq|åµéq³ÚöãâTŠcz” ññœ âË8¦o¾ÊWGE ÒÏ í„¯zÊØCbÅYü<Â5ñ)Z0/»zrÍÎsñõõ± ð5`ÇN;<·‘½“Z¹Tq,2ÏP §ô3cEÏ@#g /¿Õ„NNħ5¦Údg.ƒÛs @qO£Q;P;Úh8Î~– ù²i±åŽ÷\—¡e<;Êd#Âh-›r|)%äÊ,YQ%ÎIÄ"µF\»E8Þ³I{êÚq’6UÓI¸Ú®M{f64,‘ûC8eÊ6CžùMA9z›±¦Õ³ð>pÞÀ[àœl׍Е©ƒ@ÎpÍäÀæ-VXyÂ(o¿Þ <Ž)f…JJ®ñúŽ'{›Äó:ýÝTEŽ)Jb£õˉvîc›:}õ}òtäf®e JØŠe"æ!ù®â§ƒ¹Îã¯~¤/8Ñ|´‚;9%å£4ɉ.<íN1/¤„®×~FÄ Ó¬”Ê.dªªÅ°&ørËBê˜Ä¿:3Vê6Ñ ÑÙÚò=rà,£›•· .;3™ÆŸŒ™ñvÊõš‹o4®åáDÒÖ´LúwÄ,·íørœ&¾j¤ÇÔ¶ÚÅ/ê^éŸéUIŠÍpæî÷’9¹7½8œŸ2íäGi‹ÂŽÕ¢NŸ·~™ÎYÞlÍÊçн,_€¹û¯æ¼Š­:Ž=r„´‘¦¤(¼•²DËÅòšo^âF H¯‹–¹ MW'Kè{¿5³~2dŠvÖéè7éÒö‰§Ÿ7¥ò%x³Ò^ÈwêUå—hpÞK9Í8>¸;¯;L]-m pW+Úÿ^Ô$ì|üì»b”ðƒÄ,о±³æ¢íçi¶nÈ¥6¤"2r«×ºPU{°šäÃ2û''£Ÿ¬È#ÈWB_ÞÙШS“1¡ÙK:³=ÝüÊÓýs þ8uÏ™+YqÕÏSó’¡=î”Küçz±C欦4^N°K'…Œp#p57o³y0*ÓóÝ;?¼ÃõŒ59¦vsôlâû;•¦õ•í;’BR›fÃojÃQåò﨣Vø‡¾*1~VϮԸSäÛu.¥^ò|¿lÃ5TãÀõJ‚ѮՋù''튆`^ª÷õn§ Vc|Ú‰>¼)>Œóæ©cs{ÿàÚìõÜN›ëÖ+µšœàÎĺç5ÝÁ›øÃ”[˜*iUÁÏ–0ˆôýRÏX­ÈèELÏgMX‚xä<ÔEC}ƪYSB6Ï‹V–¯äDq…íßGCõ XüG•4²„Ü€þF;9­Òâ*Õ+4:ÚŠ‚Ì–Óc÷ƒu½£HxÁœÀvÔãaÿÏÁgâcãfúéuE™Šaæ‡}…º 3˜›ŸO™ NJ£*bâ[²È§¶›½é#ÅùÈ‹Ÿñ”Ò½KÝc»­[Z¿±Å¦/NáOHxÉkŠÚs"Åè [·7ÏÑ–êÂôáf/¿+o´¥¹,² ñƒai|¬Ãþ¶¡” ¨2•ea¥ºÃŸ }1BÚ¼öíëøV¢ûõ†ð“RPQßMà‘r•\ô]Â{uÍѨœmšëØLÐéÍ2znÐtpÒ~¡´LOÈ;Tz9Ã#¯·Éä§ kÃg—³wºÐ¦ ­˜KîYßñ.–kë“gÞc8ü«X¯P²ÈŒ5h!ÄCbó~^J¢×<8NX8ƒíwws–©÷/f'D+õô!Â|zyßùè9^™ûpåBzDÞ³4<°ˆÇ-'»ó¾îeiª0ÃyÑàÁYàa´GÒ²ï.ÏÿMµ*ÿ#àÕé#ûŒpÉK6—-ݶâó<=Ý®Ýb}W WÔh×—] ÝP¤©òós/º±T¢@§Wé-BŠ7%¬¸7>ñJÎi?2Ì+£Ž—œ z|'ž;d{M¢“ÒÙúi«‰o=²Ú]hÅ^;}ȧ Ì „QwëÜÌäã–ïÔ¾‚ˆ¯Ç\,×/ÿ>«?õV•ÉŒŽ§·;~§~Z¬(\0G$2ι¼á™—Ékü†ÓHë$Üp\c·Ë@UÚxp;›ÒÝI˜®ßmÕ¾¤Å*%›á*yEøES²ú§ô÷/‚"VŽÊw¥ž¨³/à G >fÔÜZ?þä'²Û¸³gI’JÜ‹*û}à-?\JæÐí“S< tkf<‚ Z9ßùìš4f¢ÍV]AË.,®z3P˜¯?H±•E8ù¬^Pt¥jtúçÙØ*ñ†‘r•ö“;ýjÃÑÒ\ÖL¥XÆã'k2†±§íÝn÷¯@ZìŸÅ™ÃFec£„§¹(¾4ÖkqgÛÐzšœéþÕ”Ñw‹t~”kò¬ÚÖ·j'$.Leïn×Å"ùcˆüapò2·Ýð!Ðíƒ-ò7½{Á‘-9,_c ï×gxÔ÷’Eâ‡MT7¯•?.áêTzƒÙrH÷œzq„¨m¬~Úž&Íp<Š_‚ ÅrÝlgV)hÀ€¾f#ÜU}¯ïýGÇ$;{_Ê$j¡™ÎñCQ‡fÓ>æ¤ÑEÞëŸTü3Þ}8ü™í¯Üx33²VÏ9"W®þ¨Û ¬ü _boúTU»y›ûR=î"·+Õæ¥µ¬Núxŧ×Èd¢;:ý<ý¹ûËÕ×!Ê_’¨ÁöŒ eÁ­;ÊaÑȬÐXÜÎ JyNç9çåÖRºR—ê:UW¾‰I¦í.(„ý÷w; /ÄãQžÚù龜õ”ë£;¾2nïy)3,·ù˜^R÷!‚„¹_ƈz–by™k6Ý0OñØÍÆtš/¯Åü˜xX‹ßgâí0¦yž4iNTG*¢Ù"¯6+°YáÕsÇ]¦3Ή¶ú$2ÿ†Ö>†m9ÁÔ T ï[{±»–uǼvË~ÚÐÓv ’" ÁíŠÕÔ˜B/÷ª¨Š—yk*]àC`A‡Z¨_k×Ìf¨õ {GAãÞá ·}Zjñå™ÏžØö ê×!Œ±úuæêÐx)ì=±Öó{~óÕ³4¦¶…½×}O™÷æê˜ÐÜs¡dl¼‡ÿ,{W5U#«Z= ~÷|D·ï­èR­Þñþ¼ ÎwLûU%°ÛAKæO¥îfÃl fŠÛ›´ =„¯êB=uOç ï6† «tq-.%©±x§© ¨ØY¾âƒg¡ûÝ|¼€g”]®ÊíR+œ¯Åü½³ ù–2fßZáÊú×`™o;› =pB®­$Õ îÌÐ-ËZ*#Þž•¨zß_ö0³~¯oA”Ý{Ã|«dAæªFýQMœƒøHÚÎ{+&C;{ì&àÝ“UŸvïë[ƒ¢07·†(Ÿæp`);Þõ™Z`QÕ¡Œéu¢ñ}á¶w¡o‰]Žä7⋽g>Ê' E؉ïÞ*èZJ´Lèõ'÷q*(p#»µ _BâåÇ2î^†|À÷eZÎé(2r`5n¿•kˆÆÊ±¹'UÚ®1p¿¦bìgh¯ù,à^¾n ƪ7[è¥ùA7¹Ú¡gÓF¯H0·|{­òjÊ|ÔéVQQÞ¨}w¬ûrœòæØeußNpu‡ X›o\¼oOMN!n“Œ¢pIdË™¶Tù>Œ}O÷6‰§N*âÜ¥9ã®.þõ >¿×ƒ,ÓÒ— œÂ<ä¢[0"šå£K} _­Î»Ap÷Ûç‹ ‚çƒGfõ:Œ¨\j ”¤mg®°¤¯¼Y„Z¼$çC8$(…öðMïnúû… ëšˆc–m¶æ–ç™ð/Ú#˜1x'³*Xíå«Ù‚à ü™ƒë\kº¦5(z%]üÑ t ˆäït8´iù7ši¾UdfLü¶³ß¾?ôîT»V°ÞX7Jß›Dánsô6ákÌCy°ó<ø«Æh¼¹5¢o£J¶D¢v)C÷QýE*ߤLð§—m“Ò’ù±=‹®jraA‘D|غe—!Ô#‰¯ÇàX#¹õlÅÿ²‹Ò®Ñº+s%Èf  ÝN}d—€¡­¥ cÊú`ÙtmìëÁ›–ržª¦5<Ô:k¯ñ¨ãÖãiÞÛfÕK#ñNï{kXϼ“÷¬gL¯¸°jyˆâ[W+URNÄ–­ÕA†àYº}ñœ[eŒí+4^Ì8cŸ`é6/Bz™~æ}€Pz ãÓf¼@[sŽE=¥ýÑúdÅÙê*¨âÂ'¯Yô–¡2I´Èɹjk×>¸ºÚ™x[ûê† 5£N/ð‘êj•z!a‹øò­Ó{¾H&˜C©Š°û3à²QþöÜ‘JBm©£TB¤oéªc& ©L¨KN'?X0õöís{…db|ž’Ûí]ï¯Î†.eS8×a¸¸©¤nz=Ö´gM´»j»ÓÏgѶOÛe#“cÙöÈv|œÙ¿6Œ?Ý(äT’éà¢ðt'=“¯fzÍ•þBÉ^%I عÞǾjYp¶Œ ÈöYG=JtÝ5{Þã|†Î˜+› Põ¥×SÌ)½ÛF‰Ÿ03¶Ü 7xA5¬_Â÷#ÈÍ•}ÓF̪{4•žóKÂ{\ïÙ§Á—cÚ8Yïo,¢{¯SQ ·gÉHJ¥,ïmYœ=ª#Ò¹˜a\’|jŸjâìºziT+©ÀKMjJЬ?WsmË”dÛ±“Úv€Æ»°RwßÚ4L&‘µÐ6ò/‰±z¦Ú.;;û9ˆ7îòS<§™s,cb/<íö;³ý¢ŠPÉ ­€^Fm¸mz³ËC¿ù¨>> stream xÚ¸TÓí7ޤ4HƒÀ@º»»»É1`06d£A:¥KA:$¤‘V¤‘¤Dwú<ϯþÿsÞ÷ìœí{}®¾¯ÏuogÌ z†Üò0{ Šàæçá“(jšóóøøyøøp˜™Àè‡Ùäàÿa¡è²C 1%;ÒPhxBü‚~ ~Q >>€Ÿø?†0 €’Ø ÍЀAApfE˜»¯ØÉÌóÏ#€ Èàåúãwy€vP€¶Âä†Ì´ƒ a@0áû_!ؤœw ^^ooo;78ÌÃI† à F8 @p‡Èð»e€ŽèïÖxp˜FÎ`ø_ C˜#ÂÛÎ@0…#]<¡ 2;ÀP]  ë‚þe¬õ—àïÃðóðÿ+ÜßÞ¿¡œí€@˜›»Ô u8‚! €®ŠÂÁ°ƒ:ü6´ƒÀaH;/;0ÄÎið§t;€Š¼>ÀÙáßýÁ`wœ†üî‘÷wä1+Cann (Žó»>%°ˆ¡¿p0\ìrÐ#€Î±æ/Üø÷¾AÀP þ}à ½øøþG‡\2 +ò#©ùGBîÐçU†a¿—M@X`çáa狃œ5Røó#·Òäó‡Ì^( t { 8Â-Œ`ùòÊßY +[uꙂ­C åÈK½¹ŠÈÉÙŽÃë1Ÿ§=¹!+jå …cîÂ?Îzœ@t0j§qÑ—1ÄGÉú´„¶–è–¬©¦³·¢½‚Ûo¾ßuÁ·-Ä÷n€ÒK"† D¼|~×ê s¦5İùS¢„G–™žFêÆãw¨/À W qT?|7,²†——?ä¼<-Òì«©‰$¡"õÓ`ÈI¢"KÎÕxGaQ¾T¬HOb¤*q‹dYA³]ù9]4Øž<$èÙ䤣‚«ûüS³gLxV:¿wåô±ÍfŽÑ^|Ê–”g®º—L ̵(—ÙGµ‚‚>tr:fC×â½ö4¬¬üÊ\ u¡9ëy˜ õ· ÊkÛøìd~«tiˆØÐ×× "z:÷GÓ…[©t 53‰ž:šƒËšçÈ.ž‹×à*3úTèùNˇŽáÞ¨cÓ!-ÙTH’Ygö^ÿnò;uáËÏÄ&Ê"ˆzÍ/°nöÄüÄé ƒ‚|t½ö.UI 9ñ¹ ÆDAÂB#â/FZÛ(™:ØæòÁÓD$®‡´oªE>½’m‘N æ{¾8qü@I?‘¨~W¿÷†u’½Ç1¯ÀCkÍ‚. gÛ2V „P¸y/évGÁ|*äXtv¥@á—q Iùó§Žñ?.¶Ï›Ž Ìä¢- 1iÝSA6¯?ÑvZ &<Î|?±ß×Éš¾í£Öts‰~Lb?¬*1Ä^©jNnS\$‹1¶´Óê8oyèÑûɱùü¿å•¤Ðfˆ»õN“ΑûÏÊg J€G„¬sâ‚5ÚÁ,âþèxÑ&AJøbðí&šBf¡<(ÎŽÍ8›YÍò¢=K¦-±Ä 7ªîÇ—}—IÚêój ù¯ÐJBUÄ~zé .}å5Óùà+ë®?|¾·meúŒF)T»3Ú\hµì,²…¸È¸QVÕõ”±êGsz6ŤÁ†—bú\ z®¾’3Á´œ WþùH.a§ë#òx{Gȶ¼úµž5jeC–÷|6I©ƒúG5?W6à•`˜ÏÏ$ºØ!û†ÃÆzê Žþšc£pê¼ÃQóÚŽÂÞ}¯žÄqËÂÖŸst-Z̺…r{Yja‘©¤VôX4^,y%Ïp 252:—iËž7ìÉ®¥ºs̆‹z|¡^Ôã‡n¨¦Êë¤[ ¦Çm5ˆ9¶E¨}õK£ÂZuÙÃñ«ùD§¿M1D`‡«âߤø½&9;süî5aM¬ä¼t.µY䟕µ®>²;xó~p>.àȪx滲^g3ôfúœN,µJ-úŒ5ŒêÛÍè[!W]iŠƒ_Ur³Æ€”ò%ײLùÅ Å7WÔÏY¢Ÿ¡Y.0`î_ݼ›Û™~ kµþÂôŽ%nëìÔŠX ’ž¸ùÞÊÞÛ´¾nÍžÍ`´Õl‡†ºV}8?ѰFÒiÈX(™¸“~ëibƒ#/|š%¢ M¼Xä]Ì2ÚxX“•X?ÞÁ1yUAbÅ‹9Êè=9øQ®`:ƒóÅãl0Áƒ»  Ý˜;ôãâFãô×ÿJ|ŠP”#gføÊïÇù”Ö/k:Åä¡›[Õ& ›cCaÝvÙVç;²3\x¨§öˆBHj¦3‘Hò½n´W¯M¦Á÷O âI†k4½}÷+ìž$š«V‘«ŽÉ’‹ŒîÁM¯9:qW<_âò&µ_wIj¥_6©.Tü¹ÇáVÕË9ö~ªŠ²ŒÌ¡ åo†úŒQ‘ø‘½¦oïZ%î;?³ìLP~2·SâÀZÝ·ÕMÃÝÚŒ÷A…—fÀ|’5ßM7·Dç6QkqKÝ_¤E 6þþ|>8rÖ4#G­ŽÍÑR+ùܦ¹t~֜Ϟyõ,ŸóË"ÐÜ7}`´½¤ ç‰ö§¸;[n¹,¾G&˜w4¬ç¹ãõ—ÃòÅ„²Ëõfdè$laæaýW®:¦MæïTæ¤v2¾»6,öa­°-ÌŒ[ Ì1ñ¡ÊßÞí»…·£Ä~‡¸…Á¦?ìWQéoµ‘Õ„ú摤&.xÑ?:â|žT\@ן¦ÜLøüv-E{pï oÍ%-ùb.íV ”9¯§ØøÝKçp›QU$¯tÿ« ߪ‰¿Pž"é}\gÀvÛf«ÉÌÉj¬jy5D4TÓ‘Æ”ÔoÅ£Àæ@ú§*£?k¥ÐH¤™6 ”­›²/½>òˆÊw©¡yÞoJ«Ï"< 5FéÝ 7á5>å÷æXj Û–3ù¡µ¨ê‡Ñ Ö¨æZä7ÓZ{:®ú1µ»BK£ø˜vm„^ Gã+¨"±Ô±´ ÅÛu!Š’îZŸ]ôay"˜1~¢ï(”‰vîWHcUŸ‰,¸ûÑ£¿³m±Á€î‡{_£ìø¾&·¡o/רž•}rR¦J>K>š{ß–ý@Ü£}Ë(Zq%ˆ·ñ¼-y 3£ FËqðRc©mR{…ÍýwàÇAÔ›îï/膱°à)¨Â¾± ŸâÔW§É±b¦Ù‹ºhÒÌê7oqöIžvzx9ŽÛ0cÔ‘FÜ—•´¨5¶J ±wtúÝZ \~gYz,—Ê[jèe8!]1Žº ÈAÉx‚ùCØ$|ÏqÒ8v÷™^HàÕíT€ô}\6ò÷L¯°n€^æ<[ü¤Œ.!ps+•‡–ÓÉ]>˜«Ž«G:À¥J@˜Xñc¨hÎÅ ^ÊQFmÓ˹ÇDA<ßyUÊih>¶Žðe r×ÚbQy{ƒðœ©©º ô‚_6gÝÜO5¢`ruõë!÷6Ç»òSA‚eëúdß»èLΟ3‹+µ‘'¹Hã¼°’Tíäù{cÔÚ ^•¨:Mw7å)dílæìË—W=Zë|övüx„~õýʤPV,]TqÒÄ!ÿ=GÊÏØÕg\³†"ç_y—Y&/÷xÙ~ÅëhªÿOqÞäs¥Êt_@^²;ÎXØ:†û)í]9ÅÒx—ÊhV°®>;9Tš²¦Ç‘â=ÇHg%&ï¶7fŒX›Üüü‹l?|`K§\Ÿ‹ºÛËüå×2f ÜÒA'ÃrcrÓ{Æ)Eµë<±Ï®3ÉR¾×¹:žøviX»%å<¥ƒG¨Æ’þhˆÀ[¢Wyu«(v ík fâo÷æóÐ&êÐxL̬Ä–rëÚ¡dÖ[  á:å-Ë»R«cÅ/¯ºè&©êÝïÎWr¦ j‚›¥ Ÿû²ºíÃ¥²Œ¿‡ˆ»3Øt¡–éw,\l²–êä¨6­adÊ ”¾w±j|=4“Ñ(ô“W:–Ö¹ŽxÐiŧ÷FaoÎ&Ã8/Ʊó¢ëã¨k¹¯à5l=öe |£¶Ñ‹Ÿ¨ä½ÞzmUŒ×I“D¶çðÊ_9…l¸¤ï…wÈ<ÕZ1™ÉÚ¶35"÷ÒÏ•ÉÕ•ÉJh¯– ýèØRxSKÔ®ˆnš!w:röS0ïò¥;=D¿öUªþ·¬tûµr2^÷³Mg¯¥>ëR™C·ù5#OœÒ Ý#ÑÿŒu_䦙àÏâ')5Óâvºa ý4NÞ¸—ûú„•ƒüî™Y°Ñè)BŠf&Îõ”÷¡l…€{þȸãykíAúÚzѵï¶Z[æÿJ¢2†}º\^>øªOë¹ã¶BgõŒÇ‹#åÕ#KÄä‚“®æãxý×L7Lo¥I©¿†~É•Ýu²Y VRgìÎ<žAaæÐT{ÜGõ½$_RÑáõZ&ÆG÷Nª:~R—»bj¢îh`œ‘~ Êzµ®ø4£Í½†ýóW® }6q{ý [ëMNI®¶vNSC8þ³A/–æÚá+ÅÕ-A”f- xƒ·‘ž§29¼£m¼îZ/ÿ'w^ME¡ñ‹—õ*Æ×zŒíšc‘‘œUSæ] QY¾*¶ôˇ`šl­FI'W,ñžGlæêÜIqÛ7‡’¶3dÛßä'ªI4¾yµf®FkÏŸÚ´Þ®6äßâ6d`m>™MEÀ…óŠI¥üs†šÒü© µ¬û)–ïäËVR½féöÐÞ¡A…(ÌËùËBUÍ9=ç†ç:–-èêÃ6»ÑÁŠÈýV¦±·±¥¦3ÒânCØ !¿••ùg5X;îÖ–™l °1 C±‚ž–¯ë¸:ÙÁ<5Dó‚ˆvO½Öv»Ïƒ4Mýsµ§We¿$ÆWhŸZý0¥’$%ö¢OŠ ÊÄ0[—ÄW OÁŽ)3#IäÑ[S—”-`0*Žðྃ“ï£][m¾ K‘ž4‹ý…{—"Üø>6Ø#X!ã+]ɱb¯ˆÖõÜ¿1@#ïQ_am¾(M¿={ðôüj®àãc­Ô½°B½TQ‚õÒSÕORÓIhál2žNò';ã÷É›%ÃôŒ^¯Î‘ãÛ Åç ²Ýaí¼)*Œ"Æ0 «µ/• Ÿ¼oEt—y_ä#öF‚„‰‹LÖG*8«‰KÞU×¼¿¥m0†‡f¿™­ôÝÞîOÅ2*ˆS¾UõpZ7Æì'þÄ”õ2Ž% .±©;öáóôeÕÊÍ9±ü—»ø…µ˜Ú^[«l.ˆ²°UþÉxôä ÇjÌj@õ“)e„î\2u´OÜ넚clË.ЉL˜Ž”Ë“o±†n÷wð×̼— ¤'<Žxª”œe“˜%ÖË^FDnXd ÑiF;E¡W ì÷Vl’ÈÅåU§fXí.™5lõ5¿}Ø8õTŠÌM!ɘD°š¥;‰s*‹Öëlb>Ìrˆó°:skÍã¢ÂcçðZ¸ÏA‰Z¾”Š&ñÆfÔÆèsn«…ÈeŠ×ʤ³!·©Å£D´1 JÖwuWÃÒå›KÞ:[y vJ‰¦k]áU½Ípï>›‰e¾XÍÁ˜‰Fë­ÉNÏ~‰óÕ;*²Iº3Jÿv~áÉqU…Ì(Žì…lÄbëþ8Ù³}4ü°Ì=%Ó¿eµ\]„B1CóN×».Ï«jiØð3ÓýŸt“ŠZçEgÉ-ä>™ÞØ_»Ji#TZVr0XðŸ3†o*§ÊŒF4KÚ¢àyýd¾¦_¨5²<ÎbZ…‚PcU_S»Ä¯Va†ûÆ#¼|f$<ô“É=-|mHß90¦V¾¶çÜîÑ´šƒÔú|eñ>Ý1{«HÔ­¤I§‹EÕå˜Ãæ$çmåXj’5Òk¹ô|/Ž_åÇw:kByA¯jì¡uݯ©ÚÇͼðpün¶ŒZVnFøæ—IíŸ\æ<°ÌñóO™aBñW/ºÎ¿t0ß·eˆóO’Æð5•é>ŽÞ”¹I®Ýö•û6pßj¼vóðÏ_ }j’C@ÿŒc)_{Ñ ‹ObÛ1†\EÔç£ô‡Ü…苞›»OQzGQ¿1f]±z1È, þäkŒ§èëxm=ó&’}&‹Ûÿnbkîì‘Ayo#¡Ï‡½‡ôÑúϽœ&’×;î ïÚós¿TBrì/ý$[ë3Õ}gž*ÁèÙq÷(wÕÆ{'‡)× byÿJ0=Ò7ƒ0¼úÖÏLrÀ¾Ãën0t½2ÿ¾’‘R É'S”"|ÍÙ?_/³8e¥~HZßZv‘ùuÛ>Zÿ-õùq!äQËÀ% ‰ŠÚË‹ …h%xý93‰¦ßSÒÂØðíÛ+rå],® ‰À±´6Œ„”;D8dòµXbŠÚx^`²Eæ#ô—©Œ„Ýú¦m¯Âtï.&“…8tý~¶ñ[Î\€iUæ,·«Kssã$‰û»Ò{¢ÒÌ)³/¯?ïrÉ C‡ÕWUbÓyseo?Åf­á[ÙÁyuØçäGM”¼øß¹¹oD9=GýøV[Ý)i”cF”t;:ÆîGÇ]‘_/E©†°ã›«Ó×eçy£¿wã¯ËpŽêR38øÆã3ç·¥“ÇJ;ÔÙÆ6Tó&zŠ!®«A=z_¶U æ¹Ë;ô¹æç)öcjÙ3¤‡6q³¤e·ºG<#éþhôS_fëBÙ…}æfL®ó*‹ÇÎQæ·Ââ¬yA¼ÑRöæ÷kFSž×¤ª›W¬&¼—|â“õiQ>€Wï…÷¯ò©Ò‡ *”|8k4í_ͨ?Ç,û4x ¤­MÝT ©z9^Ë?°ëØ/Ž«ìñÐl×·ÐÃa`£­†«Z)/ºQ$SwnµrêmXÏꣷ‘ö}ÇTm ~¢l2,_Å@ÌÝB$QŒÍ‰qÒÙLlh”ãIuLèž ý³»t}ž4Ç\úƒ8þû_Š¿;:3ü&Ø‚V¡ ›+W\`T¿ ¡¸"·/MЦ·êÞ‰¯íl-»œ4QØ­fZK~j×yÁ+Ì!"JÑœ4Þ-Ÿüò€úr³ÈòÓÅ-‰çç+ôaJ&pŽÜvÍ$õÖéãó±A„ícOØÚøZÒ%(âeÈîXhàü@SM¬·U*Vä°`Xd¹½‚iypÇäÔÅÕ‹Ò#îüšw+»&+¢å­Ô™fšS"¡®Y˜¯"ô™6ЩR¢í{’‹JM—oÍo7Ó)Åž^cŠc˜íh•ÔfÕLVßrOQ¾ãI —ß\¬ìè,=ÐBŸˆÅîmmѧw¥bëÞÜ‚ø—Œxê¿oÏ&|tÂ0 qY|šã¿áÂÙ®.•ð©÷HÐêš’ ÅxL¤VCã—Dýaÿ&––5FÑÚ Eî|Ï€ÇØÜ/žÀ»Ûßz"½CV~¦èÞ¸‰Âá,Á“%'•ÙG@ôgVa[S÷)#³\TÁ »#Ó{õ ìSJlí«¾¤ '×Ìw‘¯g&ªJ½Àyº¬%Ñ Þ.›Ks).~t«ÅŒB‡çÔšTÜEÀúàõÎ5%n‘`Í«„–è—¼$Ë:nÔñûhúxùŒªTqÅìÔª^Và4 fl¢<ÃÞë/LûLëX²)!>‹2é?¾±< nªeó0ï1(Žjl·äQÝŽò.9 é¥Vz¥”¦~ßR[Þíž{…ö…ɦvªzªC±Êfªî²åú¾Žêõ9Õ åÜO­ äîÌö(mYf+¿$ÔbÞ‡Ï8nz• mã/ øãqÌ0nXb‹ÌpðqL0?™¢d˽7Å5ÃfÿYJ9)¸” ì0+½æPÛ^€d ¢š%‘Ù~Ù§ö)b©מ!ö™D²‚}àÔ¡ÐI®)S Ý;Ñ㘆æÂa7%£–âü–ÑÎë¥â|X¸»Xän,›¦´å·ïTyuborx¾l—è±lr¿É3XÔw˜-Ëè€þ”[ªÓ¼´WüÖƒ‚­¼ãr”Òš—S4Fpg±Ä‡ž-èþU¯ ôIÇ<×0Üj ΢öl®Œ6ŸîPi7‚&‚â°lÔEUyë<Êÿ2N5ç´ÿŽ£CÕt%Çû=Sו쫣”A޲²ÿiÇ6#3ü×`í²œ4F´sáss%DCS2j­Ax'íöó(=óI·®R.ƒO ;‹stð^Ä™åëù(hm-( µŒ¦ãù_bGI-ÄæÀæc‡„ÜïŸ!|7’,du¤íJ(«U?åâ6.så(ùΣf~|.‚ÿ<—,øê³]µàç.*Yï³9ò\›°uc“äì£å’µnnè¸MŽKÅî¶‚jß2l8]pè Y‚>“ ©¼V¨‡îB™ø¿Zg]=Ql±«=èú*%jRùNþe°ÇÝ«PJZ~jÃD¨­Kn‘>µ?I8Å'\ý ÆÅÊH•ëÙ.¹1ûI€–¨™Y ÖÑ·ø bGšzúzç¹'5½²KÕ§7‡©ÆGÕo™§GÚ=°RBT¦&—Ÿá}¥l0°×ýˆ-Ü|O™ÃVïß-þ`#Ãealœ |ÐèáæÃ*kLK#þA«gv<¥±!wuðè®r2Cú¾^<«Â ~¥¿¹Ú'3³ì€ÕžIÞ_XÑ:X¦3)™?k1 ZØÏ”©“ì_1Šô ì¾yäQÉYI5ÄEÊ![´¡Y:ß)@Y]|3ª =Ø–Q°@Ò÷<”˜©ÈΞ֠‚P©Ê-»1k‚\ZšFçm†«v€À+ZŒrÓ½ =êH î¸yƒlçqWïlâ•Æx]x¸­<ÂrØ Vø“Ez¼ÔëjÜN”Ãäå-(,V¾ Ÿ¢•+Þ?<ãH4H/Ó¢þéUX wà)û>ÿÁ–ƒüàc¶MïŸk€ú4ÈÍšSßbiF×o`b&MôÝÊÛ×ádÀªñŸ¯R?Ó> <pù.ùÚ]O©N2rÞ|ÿ‘èò§ۧɶ‹’Â,ÔrSŸÏ PÄ~Æ8ûJÅÅ{ûÍyÞ%£ªÇá¹Ç kCSqehš÷Ôõ彯 /j%¶˜ïo5Y»¼bM‚§ÚqèÕ­W/4‚˜TÒyòѶ<ìjÓìˆÙ @yqØÜé…%/õ¦Aój ªA_IPÙŠ6‹%UŽˆ°êê F6ÙUQ¾wÅ:f¯fÑ@ñ]µº —O¨„¥W×:m=¡¬­CÛO¨ÍBe<—nMÛU ¬¯fÊÜæqœ×^òGwùä9„1NjpìÚ)üÊÙcí–íʆ"ãá =}µú¼ß •X_ßUHaIØõdP1f·ôtùZ;«ñ'ÔûlïÔ¨­è<³^íê3 U¤HÓÈË«íR/ïÂÅ,·ÿ«†ãŸ× ãŽì)¤ž™nû+}È6žˆ9°¢Ö£O×öyR Ü_=*ÛI‹Ñ¡1rrî_Cíàçà%)&)wn~Ñê`»„ÁJÚ{¤Jñ¢ÑóÉe«(6I߇¥Ñ+?“"'¯Æ² |ƒL”i"|0D€—ôÍå›rzÆÀ3š§[Ɖ¬ÙA?›ð_ÊTŒLY†É½×¿–'^;mY*šó •7=%pŠáê’i¼ÇB‹î=!/Æ£ds=D+;¶I.Wì¬9O–u~½KÊ]–|Qd®Š-Ôü(g¡(†‡¿6*êÕò¨ñþŠ›.W¥É)6Ý^’&}vŸ&›œ?Î;þö‡!Ñ0‘®WÔ¶)6jÃ…çãs…QK$&¢¢õ4'¬û2èa!I³íu¯„„6÷ï~>(n˜ ùøÊ¦ê`–³œ•Â'š§´¦[³..îf5jÆ`c¼êUKoãòÚXPå( ãA^±SukИWzj,=îÜO&«ìĽë%¥Ù¢å¦ quˆG]63÷ûg¾ëú,vW(“íwLðLÄn«ÀwßÓrÂ<8Ý.Ñ4nÐ b»U^êÂJh{oëÕõZØ endstream endobj 1142 0 obj << /Length1 1455 /Length2 7066 /Length3 0 /Length 8061 /Filter /FlateDecode >> stream xÚuT”k×6R"Š4H(CHIww‡t—ÃÌ#030CwwJƒ(Ý% "Ý "Š€„Hw£ž÷œï¼ÿ¿Öÿ¯YkæÙ׎{ï}_×3éµõ8eÁpkˆ†âäåâÈkꙈxxø¹xxøð?Ö‡¢ Áø !ÎH(&ö¿ä!@S¢Ðqšp@ÍÅÀËàããáðñðˆþ'î,PºBÁM.€Aâ?–‡#<œ¡¶v(ô1ÿy°‚ؼ¢¢Â¿Ó²Žg(hQvGô‰  @‚BPÿ*Á*a‡B!ĸ¹ÝÜܸ€ŽH.¸³­À вèBgWðk`ÀS #äÏd\øúvPä\nƒr:ChÀ ‚Àè â @ÐSÕh! °?Á8íÀËÅûw¹¿²‚Â~'A ¸#ó€Âl6P@KIƒ åŽâaà_@$tB€Öè€ßJ²: zÀ¿ÆC‚œ¡’ uø5"÷¯2è-+ÂÀòpGG …ÄÿÕŸÔB¯ÝƒûÏÍÚÃàn0¯¿ ( lók° ‚Ûur¨*ü‚†ðÿÁl!(€ ¨€(‸ƒì¸•×÷@@~;yÁè |¼pÀ=ÄjAÿà{!®ÊÙâãõ¿ÿ¶ðyy`(°†ØBaøÿTGÛ?6úò¡î34÷x<¿>?Y é†Ã<þ ÿ}¿Ü²º*ÊÊŠOþLü·ONîðâäçpŠ xyE¢Ÿ—ÑBÿjƒçŸ\U˜  ú§[ôšþÓ±ë_`ýKl€×z G³`ý‡äæ<‚< ôïÿ7Õ§üßþ«Êÿ‹äÿÝ’‹ƒÃo7ëoÿÿá:B<þ @“Ö…€&-؇AþˆV†º8þ·WD Af‹&3'¯ÀŠT‚ºCÀÚPÈîeþ࿤æ…A´áHè¯w :‹‡ç¿|h}ìÑï$š—¿]´|þ}®" ÿÒŸ èì ôÀçAÓ‰}ß^¼hA‚!î¿™ àæ‚ÁQèzF€ Üÿ×µ ó¸•~A,a·æß–€[÷o‹À D¢·EÚ£ïËîo]À sAþ ˆ¸ÎPôF!ÿêäâìŒVíoR¡Gùýû¸C@øsÓpxðó7Áͧղ4nœß‡q¿~kˆ7é D1ϼö²Ó¸¡<á$÷ \ñ`0U{¶$t|Ú›†}ûtÄݼ#+àKŠÊ+†bϲÜ.gÎÀÙA‡-äNm;*œ±L¼“ óð™¶Ë £éËáNþµÊÕü«Väš©è&ÀPxLDŸBƒŠ‘ÍnÝÄŒ2¡gú†ú`bNKâl–梯j0z…=‘kަ:óX6‹Mÿ°°ÐŸÕÛ“Ê¿Ÿ«ÞU%TJJEæ©FŸ=˜ØGEž¥Ö€Ä`–<–/IŽg *p eþ‚ìéš3mlß@©²nÇì$*5(ÑcËИµÎN¨q‚}¬w{Þ,hݱ ámÞ Ï%ž/ì¨m°Öã~—ÁoŠõÐÌm>X°1¤Mê“'Ä#È¡ÿ4ÔèÞÔñ\·EÖ.ÃÉèW*V6Pñ963‚ÖS¶ëÄս旰š44JZ×¢Z•KÌLÓô8“Z>×ö¼fˆ ÷¾‡ø‘)×ÓC÷ú2âÃ0 „“#íÈ-z½ ¢ƒíÁ°Ñu>À¿9O‡±‹­å#cÔó7ï䥈Ý-qPx>HÍt\TÞ‘Ø»ÞÂüúûpo‘¹dt£ëÂó̂؆=°ýÌàöàÝÉ^îo“ ¦ul¹É‚ש>5cùtQZ/&súIÿðëš½übßÙ³jsÇé–77h^‚ qæôÉ—‚hÂa+WൌIÔâ'>Ž ƒwþ8]5~¶²$E­a¬r¸YOQž1˜oŠŽó{yÆžKÁ¹*vÃ阷÷zÊý"qíâùz¤$D¶¹1+øŽ&>¼Wy} ?XóuÀŠ®ödƒ¦6ô{Ñ6׃'Ø#°¢ÉÆLqìÜÙ2y¦â&I‰™Ë.¬ ¶o8f§†)*EàsЙޅHdNTfýé¹*œ5‡cèHo)™-µ ª‹Äg”d¸ûé#¢×¿rvMåÑå•´³4ÀÒ7>*ÙÊ¬Šª¥8=HÁ3³Ã?³Eoˀ΢.FlÈÁBfÈá Ú³KÌïá·o²«u;ºŽ£¯·Äœ9fFx…ÛkQç ˆ}K¢$> :â ܑj!×™ §¹œÃ¸púFÛAÉ{BúÍÑᅢ°-Síqƒ~®3‡böÇ)<O2yÍXäÜL0ElùïYX>›º7’Jìÿ¡"ÍäT{¤£íßÍOg{ vÎþ¯ýHL(Có&£í¶hÈGùnC:?ù¯¦~±<\vΞ« ’Âäü_¥ô“ãx_t;Ne¬xçR–‡ oô;½<ÀÉ1K»MÁ˜2TǨ_ô–ëU¡÷UŠöÂAÐZ“¡òrï-’À\µOÄ5nk{0Ñ,öçšþHl3‰ût[X 6yX9:.g^/Õ|J_àùæ”Ͻ¤/^C”­k–â  »p`HE@»n™ÙÈØ B¸ÌñÔÏ0tŠt…œïš~Žd¼ìÜôì=×ï:¤—c÷ °›Íyë~1ÈSlü¨ˉɴuø”.tˆ7_T\—÷­ÄõŽŠ/{fG¼ó÷«°/Á,ß°,[„¦GGÚ’I¶ÌM÷Lt¥ <š2è•‚àÇ9‰Ä?Õ笧oŠŽêߘa©`Š(S×ù,.»1ýÛü0*4¨2î–‚²ŸNÖG¯˜ä{ŽÝã5;X @X®×?ÝA\”:É)HYf#NçÉYb¾ gú'žuÇØ×yç¯*c`ë$÷j×ùo|ºªîV¤o³Œ#lYoO‹Z”¼ñ~¼`:Éö,R Ô‘禮ÞÂfåàÆdF÷}'Ç0AŸ¸êTèa¸ )þ»Éϯ^b_b-/³Ç-}¿ETh(:ãwëJ®8%¹¢ZÆvc’î:ëÝ?ÉÐ?` jš!)?káYI¢¾²Í¯Ó´øþØë¡-ikqšÉ+ª¡¥@þ%¬LR£¬wƒ}_÷^—Ìp0¿±£ï *‰ˆž£Þrº±ÔààÓÔ«_È.àø NMõ¤È%»ŸàN `k*ð Ó^¬äS{TÃÓ߉e‡ŒÐ‡E3(,ÄI÷2:Y0šÒäñ)Í=ÌÇì‡|LKýd•–£(Ÿ> Xù¹²šª{@WU¹ûÎq—9îÍ›^‹Í°B˜QPàƒ>PÞJ só}!†«›™„c…™Ê㠞“Ùñ“½W$L½³ó•Ùû Rnsº—}þ¦aÀ÷ÙdßEº—;´‘Åóbl§Ñ ¯…†…ß¹uÛ6ûžf3ùÌ ]ª"iŠ {DôÛÕƒ»™pÙ':ƒX¯ïšìâ¸É,uµòÛ™u$õ6¶Üa m; >¾o JoÀgk¥çZ|ØD½þqÜ(¤áÙ·HBÐî@ªì—Î@&,·"éÛÕ²´øyLç%å±ÄZ¸õ2k ©‰xE¾ûóÓª™ouWúÚžôÇwi¤ÙˆÝÉåEÞ¡Ñj„4°®Èl$L “Î3”’°!Y*¡T,Ç:Dž‹šwº9ͼzµ@üjìxåØ â–B» L߉–ãš#y´ÌpM·‹‰·={Yà[īʂÊT±Nc—«‰•²êÕöwžõJ ´óM ,ã†üœ?P½“6NŽô±k޽Z‹à@š”ðaÖel)^WíGÌ|ù´‘û >UЇêW9r,ónÊA½ÔaÏœ“T“WÉâÆÌ.¶K4žd]ßöÀĵ&‡T¦hwŽ;ö²î¼iJ‡4¿´@‰d­Ò0…m„wáòÞAÎ8¡ÒÏ[ìùFE´\ÆêÁeŽ®5V©{Å”_x{ßÖÓßYÏÜ­Ar¼9 '…zÌjS“Ξħ[uR´^±>м&Ìq?޲ïpÓèŸ\÷ð‹(ñ,š½Þ%VH¬Žx?´]§ÚT7{/F„lÍDæUûM<3ç¼HºŒpêÑ'«åòôb"@¼¹ —r݆êX†ô™xú«AÝ!&o ‰T1‰/¢ÂÞþð`à»3ùv\-à3$ܼ)$?ö…5±Òôäü›†è¤• 1•‰“Ôk?*÷nì‡ÜÙÉ빩ZŸE²ªJá2He,ú——êÙp¾Ñòg!}À¬Ii’©{ùltYY{DO“ýsLæ˜{›„>Ó·×É—±Ø¸‡³ÕEùecÌêë«è6G”n\'º÷(…4ç=Ö DçÄO>]Øú!Ð2IæQ©_:Eeö/þŒJl{F¶¦‚w,^5úì&«¢2¯µypâüKõƒnßK®(±¿ÂÅŽ­ÔO¿áTXÎ=›Ƭ™Sg¹OÿcúÙ¾Û™fj˜ùZCž|#8†š»ãºÙFùÈnf¹5<¾&[Ç?'–€$›üú³g¾ÔåàÛ‘`•¶ÄŒüc3X î‹&,£Ú>ìùŠ<_¤<×DºLµÁys¦=éÐÇ'¯m¾†?¯]µÕÁǨGÀLçÃÌ¿{V[Â1GÇ% Z—(Ç+Æ%èZæ ÿð®¡êÊgõI¼RÃ6ÌÆ2“,í09¶.U!yÑÌ$ô0J¦€«C) ·ÝÖÛ– ËÌ]¹ ž¹‘³¥ÓWL!`S7 ¤÷«Ÿ@9PÙÃDVÒ)¼Ä/[X]?\ú›å\™·Ö ëŠÝ ÌØ^±§øFR ºÈ]ï!øDd-KHÝÈ2\ȵtW¹´J==–Â]ÖÕØ_”VG£ë>¢m/³­ æûQ‡Ö ”­ ™‹˜Š#Ô!È‘ó`Ò/qòQ6ˆLµ]†õ_âk¸X?úª¨¿%±3èz!)÷ 6{è\äÀºª-÷þKú·“,éà…6mòc‹ÁõBëÌw•-°oáß)ÄNÝ¢ù:ÓÓSzH¡/‡˜ü‰ÏGzè R)©k‰œW>ÞÒ4·îý²Þü©§•#£á²~—Þŵ ™âUJŠ<¡K‰ªœ31îí(y¢¼ê‘gKl§:ò¸¾VV #ñÃÇ'<ëɲK¥çÏœâé®­HºM4¿òfpíÃнÒßÅ¿¾I%u¼nºM©t;õUãpc• ÍåôIfm ‰‚ÂçÚéwiEu¯]™èš–±º)ÌŠfW¾ªL˜ŒQ›{jß„rA‚Y’/_NÅO›3„ÉjŒ{~.}忹à¯É‰‘%ÑŸÞ¯²ôH³{N·Zx7´Ã9T?Ðì¼)]€ü„”ÖŠ’z~åj"÷ÐX|úçÓçÙ®=ö÷ÄBô—çó1ïßPDŠé˜÷{Ï,‡2â¯ÊÕÞò&]T Ï]VTí«b~±mÄ ²µ“<Þä>Xý®p¿@ÚgÔçNݱTOŠKŽU`³Ð;[Ž;ËšˆžAjήOE!Žy"Žyo®ùDÅ.€Û^“5å~‡n£;&*9Õ‹!u‰_Rrâù›4‚ádöŒF±£ Ò$ò–@­&LçW¸Ÿk^Vµ p2"vz‡~V¦ª•’HÖéñj/žÌÞ˜¤}eá0·”¾µ`“½Apò1!©ÉÁÍ+¹D{”Ô^„õÂ|$ÓË‘GÀÐy|qˆdÔy ŸüÞYÕY½é;URï?÷ÅHB±ór ¿W³boJu³¯éµ¿ž?W€uÀÏÆš-|9¡)w‘Éz†ËœÄÄYÿ!oQÃ÷]ûe1ùñN„t!.g GV|º×—ƒÏ Móâ€Å ™NÛSVöî±pê¶܂óÈà«cs¤‘€eÁ±™ûqœdé²~ ÈЮê”ÍoÙ²Ô¾„êØ‰Oqô #Z ²—fì2iAål‹>u®–^°ñóz:Û²_6<Ž»¯JA &!›Y¡^µ O–Cã×Gp ˜Pø Tëý]"ì2r˧Vb„áÛ+Z2|’¾;±}ýzŠcƒ·œÛñ¶èÁ+±î… f¨õ²ÝJÁU?ŽŠUåì­gw¸ìfÊÕ/‰¾ÖŽR¢ì÷‰:Êi‚ÉFæ’ÏãDË…@,©†âœ7S}ÉgœP ËÎ5k"-•¾êÀeêø¼wf}£z«Å¦Ká›Ô20ûRp^Ò¾t÷%FkòL¶˜íÞi¼Tñ¶dõuÆOÇÅ\º¼¡ÁÄíŠ?N¡2a*ð—š æu`V·YÖcÁõP»‘жé!Ý­'jb\ó'qQì`ÅÒÅðÀþºD~bî,yÛc/ê8i{ÔiyÂBbÔîwTÇá‹æOLBï>˜îDɵˆš@§fxïjŒÜG2OO¶7\µ®ˆ‡yL}ˆ¶ ¥j7¡ e¹#|ÔÏIÒîŠÐº­s€oô(û4²Õg±þB®b(U\)âŠJnù¸ºõ½•ÑÇÈ\K¦Í/Jj¶2+äšåté'A”iT Àµ9e§Áœ×¼ ÊÛS¾µÝ/T؇DñSÚ,úpå#z¦s9S??š*Ñynöñ}€½/y9}7ÎÆTâé-Þpͽèè«Ãˆ—»†oí—áŸÍ´Ziñã®Íð¨°+$à-~à"ôdÄE>g›§gíŸð©ˆöofTi¾p <ðô‰­Â!™Ì«Vy™l8|xí¿†q†ƒêyøaœƒ‹þ‰Ãl–îxÿgœ[_Ä?u#Lçæ"åiFoþâYÚ²ˆ½¾|a¢ÿOKß®îæÚœãŸ'EÎ\Õ 0¦õäˆeÕœÇý—/§‹Ÿ_ÉvEgì&71åÑËpøè2Vzµ-{qØ÷†htñ5Õí¨jñáÜR[‘³ñ~(V¨ÚM"G>Äþ`G¹ ‰“C¥0±ÀEgî˵ :£ðºÊ¬›”*ô–©ç ûÙó4À×mˆÏŠKÃÅ´½êÖ„ê$G΄BE)yÖÏæð`‰/øA3™õ8ÙCР㜱հªNn‹³ÅAïäV›<É'}%GëÉg7 ¢JÒ¹».U寋ë¸sñ%d0MËû¶dåFw”†ë†(ºü5Ù<Šþ­I¢ùb§_nÀ_J«ÎÑ¢é¼2ÜŸÙ‘qãuqM¼5T×£q'61¨©¿3†¯ÑtãÖ=GþÕç=l+ãüãŽzÚ»vÊSŽóÆ) ýÍ{B·-‡åß²®ABúÒ­QÉXv7J¤YsX (E~·ž6´(aþ °F›º=‹KüÁ4æ¹ë^£^ñṆŭ:¬${Q_iŸæÇ4ÕÂø·ªŽEeTã§Xy³>’F’å‹.T7ßÏqåΟ 1Ú®eÍS2·¹¼D›¨"Ãã:ýbYõ¶¹Aúpå—+æßÒH‰tܪֲ O5qšt¥Lb*ºw˜†ï"Î}¹!5TÜS t†R-5¾˜æ>=T%ª—*²ì-÷ßH{NtZsïˆÇ;¿LŠ oµcÄÚ°ó}ÝUnåŸb‰\¹ROð§¯I{>úd&axÖo7kìJ^ãEn»%Ýó×^ØÙ¸m-Û|P_„‹‘~W&ȸ…îUS÷¦ý¢—_OÛhqöHÔðyç‘Ù¢â!mZ-a¥P¤Ýä¼ëEÌøÝÂ"dØ ~j{^çzùs-ê_1þ ÍîÊþ µ¹oTß}©í‘›XÔa½@<–7)gËFH›¨>Â(¦º6n¡])Îô9ÁÇX]i¿ë^&ñöuýüŒ–Õ§ì ®oÁu[«¶‡ûò7–ú¶#¨Ø™xy„±žú(>;“Ãaš6:ž|üviuÏYIÜô»˜®"qÅ#W0oY®ê;íP]ƒÏíõí®\x…U'äS9‚¦r/Ø`í´ „ÍÂÔ01ª/€ïÈa"¢c këP¤­ ÷ƒ‘×÷³Ng@P‚ÛT_ÒråÅ)g` DƧÞÔ)ðî…åtûóCP¡‹¹ŽÃ­‡G-¬†Aûþõ£~,Ÿµ_Ü 8 VWÑ ð¹2—¥&t)ÛÇ“7Ùå̼ôdW„{NTãU(“°¹»ÊNˆ60ëâ ÷ˆ  ®¤a1k¹Xqìlœ¯Æªñþj¬­æe]×qçjOì[09–xš»¶o_RHßñûÂz2US%0Ç=¤Ú{_­âycÌäúþ­¶ìÊ5‚u³ª³ò{.e´¾–ùôk„AÎÆöôbÒ\ ?XJÒŒYxePbj,æm¥*›¬N[Ø(Z¬’†]i=lÃéBê â’Q³Kë»ïN¦–´xÙVå'R싱.‘Ÿez}ÃEÍeþ«ï ¬£³øù€ó ‚úx½ôÃ[Ï;^Ú¨‰°-p¸>½kŸ¦ãíRÃWùBf(RW±+CȰ­zÛ® ÄÆc¸8ÙçC¯„ þ!uÛà8?“I¬Ë_-`ãóî1¬3úÝ\Ŧ»;„lЃþó‡9ɤ‡Õý,ÊWÁëÚc×âÂÚù¬¸…¼5ån²„n’Ș ãK£o5•ûwa­ÊŽ f3<×ñÈ3Ë»æ”kŒú$ h!Ù…ÎÚŽ'K+ÈVíÞFK<ýQôúÎÁà²$ëù4TÑ ÙÑëXwÌ”­ÁÉéZºÝãm½÷Ír,±«Ã¡OŽó“Œ)Êî¡Ò`£ŸªÕÓDïF)†V³‰¢Íƒ¯Mmˆœazrm=n ß*ÀO5BoôP…þþŒN¤¾ÇÕ£X«†“‚†{%ïŒè&€Å¨`RóÂâwÆ´•¾¨G™$¢Ä†T¦5êq·e =‡,jæ,Ÿ<0É<9ÓVØeÁum?f­«9;®Â𜱴ªÕtãN؆c sTgòÛ;åVf'i ؉6žÞºýTÏ$Hœªï¡>e\þ”îTÂÓ=Ã`|×ûm—ÔƒL¹Þ¹üÆól»*¬ZaÁnC"¬x“¦©å§]]ØQF³S»T¥&ß}só}wQ&…¼MJ"‚ÔuËß̘&ä0h˜î$ÏÛ4Žó°—#‡j¯ÞÜi#€¥;ug–‚áÆ\‹TNÑYk]éé¼ûW—&ã 0gpï[³­kÚ1E™O~³.÷ˆ¤Zè©T' ÞwëßA>Í¾íæˆë½^‡›]0mçõð ¶îþò@Ô3K‚P…ÞŽÉ£ƒäÅ{7šÕ̳4ñe„¸RùÝÝF¡…;%wõ6e"MÉåºË×é…£²9hX75##„ìKøëyä‡I密Ø&î6EL¨Ú~_Ï|!ÖW¾÷~CÆ &éžâJOœ(¢¾Îs}¤+ZëÚGˆ“;þ éäùZZíS‚µë¬QÕ´ÂhбÛÅè¾1ŸÂÎ÷–Ô.±IÉm¾‚½ã‚j]¡¶7UBÀ¼H&Šî.Ù·ò×>©¸u;íWi2  ¸oZÎ^=°žç9˜ÕĈ¨f’[ S‘Ò8õm±.y[LQ²2ès8w;)æÝÔ~{?÷Ȥ+keµÁ±Unzr3/ BàúìH62sGŠ&:?ÅtR@81(/²k Ê»ø,˜c¥[_›Lì¤-Î7µReYζEƒMÄû¤QãIâçæáR°UC˜h¤¡ÓÀ–×5Þ ŸräLR÷ˆÀÃa_‡:S±™BC‰Ý©:Ðí·T.³t?žužs."jpØŒäØnÅî.ñ-õ’“ »w¿.M$zq­óÊ܇9q„ɬɴóJh\‘îf€[ÛUú(“W½ìÇ-IßÏiZ$!2ÕíŒoƒÏËüh*T%™)obwÏ4¹ÖäH¿•eŒ91¦Š{|€"Þ›cq¡´ 6äÙæÛgF„‘b4w°Dþ3„£ endstream endobj 1144 0 obj << /Length1 2281 /Length2 17865 /Length3 0 /Length 19227 /Filter /FlateDecode >> stream xÚŒ÷P\ÛÖ ãÜ]—àîîîî®{pww îwwww‡àð8çJÎýþ¿ê½ê*ºÇ˜>לk³É‰Uè„LíÍÄí.tLôŒÜ9U)&f## =##3,9¹ª•‹­ÙxXru3'g+{ ÷?4DœÌŒ\>8Q#—E9{ @ÚÕÀÄ`bçfâàfd032rýGÑÞ‰ jäfe £HÛÍœaÉEì<¬,,]>âüç'€Ê„ÀÄÅÅAû·9@ÈÎÌÉÊÄ3r±4³ûˆhbd P±7±2sñüT¼–..Ü îîîôFvÎôöNüÔ´w+K€²™³™“›™)௒òFvfÿ.– jiåü/н¹‹»‘“àƒ°µ21:˜¸MÍœÑ*R²3à¿”eÿ¥@ øwsLôLÿu÷oë¿Yÿ6621±·s0zZ-æV¶fqYzZ€Ðô/E#[gû{#7#+[#ã…¿S7ˆ )Œ>*üw}Î&NV.ÎôÎV¶ÕÈð—›6‹MEìíìÌ€.ΰå'jådfòÑwO†® ÐÞèýdn45ÿ« SW5 •£«™”è¿u>(Ø?œ…™ €‘‘‘“™ `æ0ó0±dø+€ª§ƒÙßB¦¿è|¼ìæe˜ùX™›}|Áz;¹™\œ\Í|¼ÿ)ø_ËÄ0µ2q›YXaÿxÿ ÍÌÿ…?ÎßÉÊ Ãø1~LÆ¿>ÿý¥÷1a¦ö@[Ï?ê1ƒ˜š†ˆ¤ðç—ü_¡°°½À›Ž…@ÇÌÆ`bbdp°1|þ×¢‘Õ¿ó`üc+4·pý+Ý>ý'e·ÏÕ¿„ð¿¾äí?&× @õgÐuÙM>þ0ý÷¿MþÿMù_^þ_ýÿf$îjkû·œê_ ÿ?r#;+[Ïk|L®«ËÇÈÙìðÿªj˜ýkuåÌL­\íþ¯TÊÅèc„€MÇÄJÏÈú/ÞÊYÜÊÃÌTÑÊÅÄò_Só/^í¯}³µš)Ú;[ýuÃ|X12þÙÇ’™Ø|Ü"Σù·Èìc‡þ7®ÐÄÞô¯ecfc99yÂ2~L3À›éc+MÍ<þf=ÐÞåÃðQ£ÀÜÞ ö¯ƒeg0ýEý ±„ÿ ƒÈÄ `ýƒ¸>æî¿ˆƒÀ þ1$þ fƒäÄ`úƒX ÒÐGtÙ?è#ºÜô]þúˆ®ð_Äù]ñúˆ§ü}ÄSùƒ>â©þAñÔÿ xÐG­ÿ"®™ÑÓ‡ÌÈäcRþ˰|dgdçð±]rÿµú`ÿ +“ÿ"¶™‰½íDZÿ‡aeý‹±³ûGœy`0ýüè«Ù?àG¡æÿ€•Zü~¸³üãüã˜-=,Í€ÿÐøà¬þ?ºaýøQ²Í?àG¾¶ÿ€ÅØýL‰þÃóÇEÇ`ÿø‘¨ÃŸT>t>ž>@[3s—?,Ó¿Ù]ÿ¥?’úh«•ý?Úðñðepü3ˆ!W3ç¿Wè¿çÁõiÿ±Ëÿã‰é£)Nÿ€pþs$BçË÷ø#øã+ŒÁÅÒÉìÏ |ì$ƒ‹û? ýè™ë?àGÏÜþ?’rÿ™?¬ÿŒùýçßðöÛÄÕé£)._ÄËÿü÷“ÕÌÌÃÌviÞÞ„'غ.¸ý¡FÏnoœ™aà:òFcW Çí@)P„÷ñ†¥ jQ¨{v?êqõ„¹ä½ÉF“ÑFãKF7æRC;¤¹ñí—IT¾§gYWæ}™®.mC ©æE³ò/÷[Áj,ZÇ«½¹ì# ^ŠæªûJË hÊÆSzx°ñ˜(hlNNx°à¡ìŽ*áZ¡™ÙN)2çkÁñ³$ñ£ÇŒþf¶íå2ZP«­ ¼ãc™ÛìcþôÃ^v\ÃIÀ ùn¯ösƒ8¤oë0Pˆ±¹Ó†%L°7¦†ûɘÈט†™Pû~éÉæ5û¹^0œ-vOçÕÔÏè[¢GÇ<¿´ÍA͹d‰ÄµùkèFÃ&.ì­h´’u±ÖÊ S_aUæ±LxÐp±¤vQ\?Ôh¾»Â¯ QˆŒ¥`v” ‘$bÎ(½ãF Zl¡¥^ülûM¸óé¯mÖ=< RXyB%ñÛZŠ]22CÅKï-}‡Â×λþS\]BaÕ¢ÌRb§¯¿eäskiX¬„È]Ká àÊ[úèí=à·úHQ€ª´ZЂܔ³y‡q¢~—DóxÓóqG,Uûè %Å=5UªYÁ?ð…ý~-¤çØžwwƒ¼xg‡ã ˆÀ>î û ¨ÏL~ö? N«XæL¸­Q†Ûq«°sv²JcaÔL²ˆ—ÞœÀõm}~ONæB¹¬¬‹ .“eQš`1áå±!Úè¾d \¶úaÀÖ‘p…æÍA´Ahs”yki»óÿÐàK±\i ü‘ƒSMÚµºð#qäB¾ävoœǦåZEÿP{,Ä>ÓÁŒÙñù&Æ^z¹Û˜*Sàë'VýcéEMÇï»þJÆóM’âA÷þ|›Aè^ÅØ³›Ø›G1,©õélx/Á}ÂÓœP寖"¡ÊùÝÒÜä²Q Ôs\–‹­SŸ(Öv¬¤$ëŒXËÖ®ñ%KJpoÖC÷›â¡ƒ þ"GÝ’÷†gç» < 8Z­ñ»q™WLÍ-ÜÉë= {åKwßP©!+‡’vMVØßB'ìÔ?ý jP÷@ׄ)ìêÔÕîêVø¤‹3Ñ#¹Z¼l\à9¢!nA€ˆ òŸ]1(·ŒƒœÈTçX¡8ªéWfÑtcª¤¥-ùש3•‚fktôHjÁ=Ã/Æ#",CÉ‹áMìô§¬Œ…&ßÕ_ª>;½ŒßŒ#ºŒÀµÚtÏy—AÇÂåÁ)-0--Å>ò¸©I/4ohõ.í¹ ºÅ aÖx¬Ç”Ý5˜cÌw¹/D EÚÞ3s«Þl6E5;Ók¹O7!D¥ï~Ø¡¯k_ÉáD&Gc¤ãâZóëR¿uðʽÙ’@í“ò'×Ö4©’†=©t"ð@;¶Ð’ÿöâdÞ`⎻ë›VÙ$\&#ü­Š‚Âeªh¨ß\žå0ýtÒ€V( ‚ô*N!5;zí1F`ö”I~j‚1f…±s»RÎ6”|É{ŸÑ“/Â(‚V}G™™zƒÚZ¤;$^>ÿ ªóm׫m@gY¹| a…R/„¯*(z•úPÌ0?e|dìëAL‰–±ô}‘9[£@o®?Íf(EÚeMr)*ìà¶´Ü7Ùî*~/!ÏC‡ŠÒwߨ{o?B—ʾÛ%5\rKªì®K&2˜u¼íxñDdºuù|JãK]®w¡W•T¯šØ_¶¸Ìó-W4o3ÓÏ, 0ˆ/’Ty ‚UãgáM×8l¨ÞKÐrÿíMÑì¤näÄ#B‹‡ƒc2æŒ<²Åg0»C¬n¸@Ø8ÇF¬‹ªfðµ!GÓ ×þƒŒ¶*᫳~”îƒðì±Ári£)jÌé®O|»:”!æ¥Ê>9ûz¡¼`òÛy˜^q“s Ô¤gŒŽM#—m,ÌQ¿(­CÁ˯fwó+½¿A…¢Ÿª˜FEßø!¤žÓt•ÁË~ d r>Fßb"ælT&!e¹fo²RºtEuvêÈ­HÒž-îfŪxp¥&7Gs©ŠÞ{²·*9#|àÃë&†ûê;¨õIœŽK¦Ï†Ÿ¦\T ÐÔYd -¹RH²OɾG~‹7J¦´Ë)î ¿ð á"|ÚѪ-£Î ×[âÿ:dEí´ZÒd¼­E¥'õÊ­T»Xxq#M\ ß_±Ü‰EO0_¶OtØÃTÔW (K d·£•qYÒH6xa±2„kBþÞ]þíxÜõÕIrúu¾F‚ò{SÒ•R6éKe‡èO×.gÞ©:ôgåÛ¼Æ4“2¨aÈmY«—ÛŽGM¸³P+m$-É]˜#‰'ºœSü°Ö·z”R¿}fêŽÂg&C¯ªŸ7ÔƒØüÉæˆðÛfaÈ|XZW Ç÷Áîç‹å¤ƒM3S0î§÷þ<±E±×ȃø9öÐìJ¶bÎlÌþ;:]ßàM.ÈN!ËbÇêû£ Y:¹N×™fÏ|È®I¶§#Æ‘³ŒÓí?ÏŽ‰GÇ9»ÑÍìë²®¼WÊÛ)RÃhÄü®ÁÝXËïòkóó3@eµ´·ÇAàJÑÓ¤ wðgý‚ûkdñ¦ŒÛH˜ƒT†#r¤¸ zœBrÂYïÿk„)÷ëaØ*”wžüÎå5fj‹)B=Iô…’ˆ5³‘Æ›Âv-5”°,i'|3¼7ÔŠµ°j,K—ZlöI¥K«å–ä"_ eãfBNCúT!€½­*4 LŽègZÎÁÈâŸ×ØSo*'1y0r¿ )å4›~bʳÖL¸A¾}ö$ª,%ßRˆñpMÞ[K¢-`—¾Ré«÷f¿z‹”D^XÖ@ôj•rÐ8¤wå@ƒ™tàjeVJÉX+«MPÜA­Ke.Í'@‚h×?qw+ÿv™9{‡'=´ç9û°¸põ…`{åÚÂ1¥ÐNCm¤¨Å9Þœ^V L%Š?DÎ^ínÒ¹Gz‡ƒcà­×lín…¶è&y”ì~öiõÜ3}~Ó÷îó-Bh`h=nRm¡åDjGg¼£×ܱË% „hBʺ8¢Í…Ë›â51ƾ҉°-Uû0kÒÿ:weÀš[¥ãSϽÔú^·(Í ‡FÉÊ.[€W±DÁòµséâ•ãûŒ®&‡›]x*µ¼M.Hä1îÝ122Ä(÷“ªîm“8> p«ˆüqn`3ü¤ 1‘88)ûÚ9Û]Š·\;rg¤bÆ#oUS°GÆtU_̵NWžˆø/ÜD¤Œ¶Ûã£ÞèKí±Û¬¼5¤“-:Ë9Ëá£ú2ƒÞ:w™ú¨4¦£¼Ádk ÒÏ4vw]¹#R^^z¼ãTï_TgFtÓ«ÉJ KˆÁ©ï”à=b3&äh« þ q`ßG Ši^õ9TÛ9•Y¥ ¨É-£ã1Ûµßyî}"é%´øeS ™è°ba³Q›•|Ì·O -Äl UÑlÈ¢ëXêh³#6Ëã¤1ô¤tgš8¦ã¾‰Ï÷´½ÆEXïHLê °õôJ5F¥p?ÀÓ ¯ÚîtØpfºµ”1ëg%ìÚ«íˆ)¾Œ{µVj¯¦¦ =$ÌÙ€q|þNÝ•Õk\»Cð|ßHä{~ÌõŠ{tÚ˜¹_S%d‰oÈÙ*­ÞJX{‡»’/¶;z,lüíK Öhi‹ZC¢Ñô˜ÁЬÀÒ ']Ö·rºI]ÌãÜ=ò‡{;’•y'’Ew°‡UBO\o.,û:L¨&{K4É ¯‡’.V¢äØ.W£ÍéS(ëàÅÝ}kÙ‹¥óxå.ÒMtâ/¡OËÂWspåîä¶ž«…”¯Ê4 Û‹.Ê—¾¶m»IÌ3°†µú>µ]¸ˆâ} £ Œê´ÓS×Ôît¡+ʇ£“Ú¢BëCâÙF9Cÿ=B*Qãëø§ò{¿ºWx›ˆŠvy¯9ïÁ,<#Ý?ô8;«X‘:'{}@ ð®.ÓˆõT;¾áY Œîœ4 µ:Iir,%öfЋ¦KoÓQ¨ŸähK£ü²:Œê„9a¶ƒ¸w_ƒ ÿà(FJæúqø«‹`T ï“ß÷vÓõü«˜s@ ]Ê+áÍ5ùеóg“rķq:ÏÔb]PÁ{B”=ú{ ¨­œ>›Õg‹»¯Í¼ãáRŠ‘tVÔ Tþ?ÏIîè÷^™)UÞ¨A1ä®R60¥}-”&‰ð[Yß©†¯™rÁ!qrõ[ÀbElºDFxË.›fÔÔ´*–÷ˆR´Ë‹Wk}x”}Ê»„8~.©—ªjïØ§–é!?•ȽÁÆ5¼­¹o‡=43( '=·FÆKŽ¥EÛï©?¿|7>Ä] ¥j°Èo2ìL“>±€õ½%"†-;¬J¾íþ|½#&ÚV›ƒgV›ÝL~ϔٌ¶ýíX½‰2ayI>ìÓT #_€ÿ˜ÇÕššú¶NÊIA6ÓÞL´W¿ý;ü›â]<Ù\£v1‚Ï%¨vês˜àw†ÂÜ \n¥´ß~*'ù÷£QÌéë¿x©¯T¾«©©Ãd.³ÂK¦È‡ìSÖª×_‰b1W”Øxý¤¶ë.Œp½õVYÕŠsU±ùª+pfLûn•:HˆÖšk<,þ}fõúûsÒ¢›®%wŸ;#&ý”Ø%n÷‘Õa¢®;K(ìI±¦é—­‚ï\™ßKZsY\ã `•óóSk’lµüC[¦¡õ…ØF½LXÕqߦ4ÛýYÞL² °2¹[j…!-x~ŸÍ³N 0æ(Pòu<—µ§«ãä{V¹M+HH'²îÉCMÊÃá? ²¯íùÊQ²Pê´3^£Eû­Ê[‰ywd;älÆB,éL$Ÿ~dÎëâqv­ÚþÄíô„§©Š…éìcyLD-•²¼q탂{+Sñâ40á—)e¸è .¹]A)‰È(èd~Uÿjù&±±1’ÝçZËEÛ£©”Ô¼C ¿t¤û:‚e!¾õžõ6áBMî7ˆD±y><÷iHq9¶G¢lkWÙä^‹[U‰÷‹´ìÂD¤¢š©*Þ,®YòI¿ÿ «ž¥ë'ÛÞq£%B8j$ ‹Q$Óó²ëÂß…Ï´HL‰éù»[ß÷È‚¶k7] …º Í µ0¾mpÕ¯bíµrA“‡é8 ²ë¦ÓNl¹½jJiõ.l`‚”·(à•o× ÑEžDN?v£“,åœcû YSôµ$mwn7yõž-ž¶†оõ!þÑmˆî6G- a ò]sEÊûvýôuZ5ï_÷1ÿ¯¨Þ­<‘‚x­1ш‡ m)ãiõ~丰T–z÷bŽr~ƒ¥œŸŠ‘Óe§IÉÝ!‰â¿ÉéMä|°§L#  $"ÝÁŠ,°;ÂP6pJ.À¬Ô«‰Îøíø“Bu÷™è›¥ÏN#h¸À¾]nÒÅpóÆ9P:ˤŪÖX¢cRƒ Æ‹SåBñ1²]»öQ%@bÅN ç9ÿ8›Òk'·MRûÌ[1 Œìð¦ý)Ö•,K6þå×÷Ò•ô+)>¿Ü¥•9Å‘‘ä+>4ªœã‹#„Cø.¨Äšiî=hÊÀ ¾lU8hžèßQR¨“Ó2(Ñ¡#îy†?¨Á¿®€D0Vž^Þ±ô¼Ž…j`öÂ]TÿäË_ùê³ÄöÅR Û@1°lHË'H©LÉ4²N©K–Nh{¹Ùô—|«Òò© ~Ç$®“¿d ÓqÇ1&uË„`è!%÷ƒË4„¨›Fdø…†ök\÷ÞÜtJ)’ósà D o?Qi?µ"ýX³‰ÝPDw¸.„}\¨Æ 6±h‡à)ž°‡kÉo]MCI¢Š‚ê÷Q0³øÖf²Ír¢.¾\¶·Ì°«ntv´Sñ«CÏË|»MÒ>ô¹l‚ÚfSTD„ãþNÔz6§Tίú[d‡Ûf¥ä9³JúgšÌ¯E!¤,BʲŸ!Ÿé…ñîú[‚€›‘öó%cÒØÐ”½þž¿ ~xhÞâÀ\`áëë}²®µªQhDïC UœäDxv¼}›s‚Ç“tæ‡Lnn¥ôä®#KþBÐHw,@ù%ta‘Yn$`ØðHjãÃÈÓv¦„bárb“ÓÜ/|\,ÃFÆÛÞ Å×®½ 4ÅFrUFXd&:ÅŸ°ý©uiÁÒº7ÐÓ\ Ç\ÝLÖ >d;b½Íx1vøp1ª4ÉŽ1ò{È}wØ.ç€]\óèÛ]!`¬8Ÿ›¿Ÿ0œˆÄÅ¡†6nA†„kq÷0çò J÷„:Pn‹•’5Úa³ŸœØirwî‹‚ÞiU«gÿÚ%É-PõšÝ€À…ùíÌ )ò9V ?„÷²³}Ì\vØ»†JÍ®9¤õ?³×œ›0¥ü™j?› ¿¨ÿé´›ò®· „²ëé,Ê9fµ,4Ëm»õÊ»^[VÊuÓ*r»™…T bUÆ™ºD°ŽA0°¤¦‹´óD@þ÷ü“Ceíb¾JG]±D>ˆÌÉ$6hÝ·@uzyI€çy{«´8Ój‰v÷é­ø‘5eøÙþãuQsP&£hqÇŒI@œãÔùíÕŽ›KÅnûTo™š£5ïgÊèÊp9PŽ©­wHØTŠq86gAEŽ4‘Á¥ñL (­Ný1æ×øw• Y‰ ÆäHˆËåDv]`.î–¦©ÑE[€\Ï ´\[«Ø¢•ý×Ú©þä;ÔÐBá-UÂêC=fHÎ)Ç" •x(¡²êðmœP L\ ’¾#sWdŸ2ÀœˆG‘=«/C5JÏûÈìíF8‚¤eó›²ÀPtS¹.HÎè& rÈrËø®œàu;†—hEq±Ls Ò2ù[ãêdšó  *b)•¢ 49ýjBÉï…ór%Uä¿;F¬—KŸÔ_Íy¡ÃûÃ3BRçÌ × ž±ë=íœH¥ƒ…:|Ö; *CkTôêŠæäµ\Õ+€ ‹+ÊŠRTÝ?…ìc˜ =D±Û¤]vy4§nR¶BòCÁ<Öä6Súv´ë-‡@e£¹ H èöP"7§]T®x3ì“_þ¥âÉ-!œ«ÿ‹Ó²A&„0ÐqS¥E›ä:<èëâ¢f¥¬û±“äB3!ŠëçnjŸ¥¶ÛFa}o÷¸½ËŒ_àR+É4×uh¸A¿##G/oB%š¥A&8¡¯T.Ì+†àY£¥‰!¬\³ýg†Jzà7IçÈCYL÷·Ô^?®+äQ{ú ùk0 ×¦gJ4AÚå_Û&c(FMóɤ6·¯¦Ä~¼’š.ÓL®Í©I†áxR§Èßò@Rš(Ú©_î}ÏŠ ¥(~’;Ü,ô"´6\cÁu#ŽÒo0LuÚyµÊ_†ìxЉÅ[P.Ôø6L„üÖ €‘¼æ6Ó ãÛ—ã2]¼W¸‹C†ŒÌ¦3ÌVQ ³$™Õâmw±Ÿ3 V$¢øKâ§U["ñ¤‰»Ë¤4î£MDƒñéöPe6ZKª»ýO¾ñª’¨ÝÄå tÅÌqt ÄÜÎ Åv˜…>eÅ‹œDÐ𓉞äxÛo€¸$—+ çI«>‚‘=JÀµÍ¡‚Z”ÚVjI›¼S0¨N¥uj>}¬ôŠ”Áˆ=äì™þ§»êËãñ-ï΋À—N¤ý˜$ܽú¸*^›”%ÑÍáüý—äN‡/¡/‡z#ñJY¥´ÁÖ¥‘òˆJ“¯Y†üÛM$ÈJÏ„‚Oì*/¦{¬ ª¨hCT8ú2µàª.oÍBǺԴí\ŒÒ8‚ÃLœØIQ{/4ƒhZqcy3Hø¸ ÖTºŽxšNóF¬)Ö ©Pê>NS.™!ýr TÕ,tØa¸cÕ{•àõK7‚'h÷ˆÆ+BÑ÷iÉk07j)Ô¯àå”ã¨;æuwÙ«Þ ²å ©ŠâïK_÷ŽÂö[1÷àÅ;²ÒªDg+_¢€‡4b’Ò[î÷û)Ÿ8úL´†ƒœgØJw|Å@ºœO#ç“¢nÕ1Z‹ë‰2€l™.±ÝhÆP"–Á/%Q:º¬³/°ÆÇ¼Ão@k3ˆBàäѳ U¬ ï빉}M#ÒëŸäÏ¥EKÁœ) Ì ©§S›ö§VW­•ûm@sçᢠ¶.îçcõ$^»Ø;Žü—\ìÓðöèÄ–ºŠßBÔ÷ÓwÍžštäýYMMý¹úv½µç¬yNWúIã´bq=wwî–â~¬ þG;n*<òo½4p†›qYÈGÇqÓÕð ü*®,&ÌFE·Jr~ÄQï—@Ÿ)u•ÎÝ´R IéŒO†œ gˆpöŽy1˜ñùÏSþÜn?qEŸ vÚ\(õS_CÐÐÙQ½á&C^_/TKÃ[iÏhöÜw¸‚ÊOñ™?AÛG½E~7®È—^¸%¤õ¾$†Q¤åp˜–Ê`¿mrX:2ô×à•#™Lô*Å^úá¿â澕 òÉŸ½¢Ï › TãîðJx ¬öŒY;DŠV¨ü—¸ä#1BŽð¾5Ëέ>•O®Éˆ®á‹v ù*û8-Œ®Ø¤˜G”m’„ô>ÕðRеeè;¡• ¼!…L3¸½`í[ÌóAŽe$KR›z³'éÉUÎèXVfJº´Áp‹ne…ªù†Mä¦z 6yÝ]ÝJ%t´qx¦_Œx°7È+>3×V9ùíüRvfî”rI Þ3 •S¦x±TýÍh7 WþJò1éŠEæLßk3¡²/¬‡ =²›aw‰¸{¨ç§äð"¥.\ÕöÄÒKæï}SµìLá=³Ž¯ÞÏ´|NJçMÊbœ/v®% ¿"½ÏÎùÇLÊæì ¨Nç™o¡™*±â!CD¢‡P5ÃÉ–ˆj‘µ.`yWbŒ'-¾Š–øI­ä]ÓÓcª6ô}e7׿-ÙÕ'~2¹Ö`¼¾½h d±l¦„!S &†”´@zƒàW¾4jí¤ 6]Œ€¡0@ÑjÕ²^¨/ÕÄ5¢ ºz“vΛã´_eNÖ“uʵÓ=qê·±T]xWº>`:u_ÿøžâäÏ~Р™«Éß}WE¿¬Øëa‘l¨ÄµT£3óÚ†«xjÎKBC›™ªg£Ó-Û~’L«˜å‰Œ´ Lž[e—õépGØÐ¹W…ɘ‹ØÜS¥Ò.ȞΕìöýdn‰EÎBVŒÑ*f¥žQs3`Rò8_'XyuT€?í8Á¤Ñ ÁàxÓU®.0ÊWIÄÌ™‚_9a)ó†U¿âX§VM£d%ñò¨Ú™˜¯çÛi}¿R Vx™Õ0’<Œn˜rHž;‡!4‰T¡ë­ÓñÉýö…‘‰wOVкû¨>[¿M¶}ÝÙ~åè©Ïî;DçåÅ âÛr#ÛÛ¸ uC¡Ñʃ~ª©nÓ龂8¹8b:˜Œ/Ä‘9ÞÂÙ·ïá_ ~ºô…¦òh=Eõ±ù¾V!À@›²‚µ‰Š‹X[ì07**€8y*Gå»^B¬GïoSÙ ½/­žqÖŠ•½ÛñÐØè|GŸ©¹â]ÛˆœìÃûB°làâß¹ZìÆ#KwŤϭ0à=•eé%ÝY¨ÓNÍÅ„m@¿¬_…·©¡÷*´«¾çÙ&9î' Š­ï­|F‘‰§óâ“ëÿíÜOAÂÝÆüýæp"9ˆ¶Ú•;Q]Îç†mT˜ vYen)}K¨)‹‹Éæ3ì˜ÓMøÛDð$ID²aå›ß¬_5Âí`¹´†Ód® Ùñ¯_a-C¿yH7õ@ã:ª,ÂæWÁå ™ký ÌU—}_M–ôä„¡ûò† :¦H)iÅÒ¼aþõE‹÷‹Ð½êxûPs "sÄNG$sν«MU%×Ö àï¤2½ýe²5®C¹§º}l>E·4îçltÌïÒo?Ò±?I9Gçwß·”aÖT¤Ûoîx · Òëž¹1l Þ–ƒ/I¬òÀºÙ¸‡» ý¤F"JƒÊD>W½²jÖK§†kjqOÖsèÌXDµD-¼0¤PžKÕ=¸õfuC¦ð°ê7¹fFO¦B:ÉуQZ²‚ͺWÓ­9hüØ)ßÏ­VÀŒæÑ ™à2¶9냧}8¤àx–l¿×ðl_9¿6ö®Æ/ËT_»iTîo¤–``erÓšî˨y¥“.úé°i-¸ûæ—H~“Ž+Us…/·¤öV›m|Ë;iWbþ>¼\6&lqÐD*h¯­Pâ€:Øq[<Êùk‡%»sKG]ÒŠÝ Ò\Tó…«=¼|\´ªÄ6.‰²n³tï- Œ·52Uå•î)µ?F½{åQ×Y§–VÆè…KæUµOOØÞ×8”åfÞQ"Â+ξ¢Ì@Ï¡Ž0è;W­¡h_¼ô›¢Œis-1±VûųMAKæâ±AÚge)»­Ÿ¸ )!Ö¡06Le¥TTÇì;0¾ÓP\»ªf)ט$*Ì"ٰѱ !jRŸ¾øÞj½Ã0!áe««Ûx˜C¤Â°&ÒõFApJ@ÚA[ûãd|¤}Âwn×­ƒB×X~™œ •_Ð@’ÂgNqà’Hg[X¦Ü!"N)»Ÿp×üŽè™æ+¤|š€òŽºfí ²þøçìrM½C5œÑ]lÚHg¼åĘê¯äÃ5 ÁwK‘b÷Ê}{=Hh"­8ƒ‘èl’=þKû/“3Ø 3 D>¬ëXX—˜à:zå;ÏOGFŸç@.˜ÀRå’MYH®>—[ÖëA2 Òƒ¦FtóUY@°Pñç3ñ’£ æ!4г@%ÞPË]E2)/‰:-0æCTž J „A-pf-/u[Ü©l¦zv¹‚×$®öûRÞuD«f™ …ÀmÇkÒï7ŸWyÿ[wþ>r ÍÃ(³ùçñË)ßOÏ'z©*-ÚbnQ <ÖœŸEò÷'ñˆ¦tµ—ª `ÓwÅŠ¬å…pM ¦6 *ù«Ã¯ö¦ãðKoç—†ªv|Æ&ãìM[y–'¦‚þ¡“Yl'à+,ZAìÛ·ª¯ /QM½ò/y÷A|Òd›£`‰öe(søK*…#O´*¹›Ù«ißÔLfë8î<¥;jF¨-îçt§_?‹:Mép2o4úŒ¸­l§VGÃÿøéK¾R¶¸¯!ÑDPøã²\œ†ß„™Ô‘RÇY¥$£1rÎÉeÈz2Ä­?ô<Ž ¡[+xÐWÒ×1“!¸v®öÓ¸…º\ZÿQÿ&|ôs÷hiho8]â ~ŽwM?EÉ0%f,Xþ"L6j«7°”ª zHŒ¹Lkô3OÔ‡‡ˆ”ûªŒØbþz¾”ò‚¡kHÉè²ÝÓ9:ºPüX¦ÒÜôdÆ'ŠX´¾`¢š;%ÞåZÞ¡­¼0,ˆí²¯óÖ„|½MOC:ó~?†H÷’ư}ß¡…0Ñ Q€¿¡ëŽvq‰g•Dß]ükûUÈ”tÞΓS ¯Åé‡V…"*u×r+_ñWî'²2S¿:Œ¨æ¹Û* zƒ÷/zÒ*‹.ÁÔ…ŸÂke¡ßH«¹Tª— 3†Á몟ïÒȇãÙ<­È¾ØW¡ùW;펺`É®ïq_þì~ÍŒëùë:©Ú¼­íˆû Xñz+fܪýÕ–CŒ„)‹«ë³ºy€nÜ:E wˆd¦ ?x—‰ƒ3Ð^ÝÅLr.ÈUP®6 ”h@(tBqµ’öhÑûXç-ñK—? åÕCÑô—ç)ù2ö]Fuœ§â‡à¦oË!®b wSó‚¼G2™>ŸsÑHgŠ®fg~ÛÖ6e·‘÷Žòæ–0SŸŽ­­¸‘Ê*û#až°÷¨b"ði]ˆ~| ›W ÒQç­+h´'_Áœæ®- 1©Á˜8´4®¯+C×°w¹¥ŒÜ2ðQþlÕ(¤fa€äáEÃ?®Úõ–,T‚¿0àšiMƒø8¯=Ö÷"Ú[íÙÐD;çJ£‘€À6:̱ 2€¿ÿ-¯õ:‹çs‡0 'ÿ Ç(BÙNŸCîŒúäúÛÈÆl‚ø•üPºVkhZŽïµÕ§€y0æìak>5±~Ë®´¦×9«w|2á­«ÔZøÅ­?§EúýÏY(HVo¹œQ”ÇœÔ!ýWÔK¸ÖJ2\[ä}º°ùÓÌ ñì•Ùϰ ~ØÈ/kõ¦oêÞW·“5Þ îÊ +=+ës „ç°ê/‡×‡§™$HÛâèeoÊ­y®†J’߉™Á‰…r>GÙØ;ÐO‘.p’óº.–^|ã?"dŽ\FLU.Œu“±é?BOפäh‡ä™8´Vhzƒ=Rºâ)éãÂbî\i]‡ØÕ^gšÏÙߤ<ò]~\é 4òñ9‘[æsž²“/cr[»V®Îò‡IRwxJŒ“›ëÕ&'w*[/Üx|4Å€C‰@‚³º‡×êfnƒÛ§Ï‘ lÏ+É;PuÏB+~Pêc(³Vº¤ …ý~_l¤âÝ¡ÿs`§®…õKô—¦ªnü´o5D ×Ñ™ˆà ªGÓÅ­hó†«&ï_Ë*ÝO ÊkÈ^ÁœžÂò#"j¼ƒLù¦eùÉ<»v2ùÁ‚™¯±±$ìÖ÷ÈpÙöDî*¤}³ŸIecc³ I30d,xTÂ*0Ø65ÎQç¥oKPw±#‡"T÷s-NÞ¬à[›áÝocÅÈ xÝ;J XÈAþ $¡X7+SޱÁÊe€]¹f]àÛZªxbb$§¯Ǿæ4§¾f¬Œ+!¼Ð`·Õ3ÄG±oh½ŽùÙ±óÍö׺}AÝMÖûy¥¾;$wf°& ÌœÚ6S¯„­|~¬úÏ­¢‰Å ÌAÓŒ!VR/Ç–{Å7ßæ .xG] ZÓ‘^Ø-ìh…«QŒ¶¾:¸™Í•ûѦØL›ýüøDÇe‘¯nR” Ò7÷ŽƒØàÝJ‰‰ú)š pó7 ^pr¼åÂîþöEuÕú(S“v&p£°Xpžl޾yžƒT‹UáýdŒncµN.äKèµ€³%åÞŒ—¾Ê¹á$HÇÒ¸6Ëi¹¾YD¯ô>¹ÁØø­ß>9ú/ÃŽUqk,‚Ï©‡^UîÚŸˆl‡»ÓB­ÎãÕ#êBT((¡¸‹í ¬“$é)Ð ‘«T§±¢#ѳÀ.dI޵%28ƒ•1 ·–~W»QávöÔød™¢Ñx I$ONŒJ…·ÇïÌb+ǶíjB†Ö{uºZåèk(lÎ@pRòí&¥:‚'GL¡r‚ü dBZ»?>ÛÏXªp½¾ó°‹h±T¼ðézH‡Ç²#Á¼Oœ3Â2™¥ß­œÂÙ};­UGg­:g·¤pá²(â¹ ®œç–¼Ö,_baa|Dgëú@×¼õJ€˜Ÿê˜ªýëÝ1õi%¼¼|/ð-9MBãV¡LÜ‘ãáMéŽ7² *d?ÅÇçãDSß]á’ÀŽš‰^0fí7Œð6>«kú¼Ý¡NÂ0\ÉU- Ù’/Æ?&*ª¡µcT}_#ÌF°7«Ò±áÊL?"âÞöšÎ¥¡b–6T ù¨öšäÀtÕHÔ%w‰}íøôëÇH›o ¶Ô»Ö^öþ-ûqß/Qº/ÁúçªÑĆ$ ¹Ôˆ ©âÂî•Éd½ÓûÆ{ù© UQ_+n/ç80j áT'†b·8qFè.µYcgÙ+‡jîšñYóJ~ÞáýªÝN©qN,ìÑYöQ,ÈXd|g |Ì‹€ai2xáXH¯,䑉e®­ó¾·¾@á*x’ª(t`Ü0Qzû­ÙäÒ„ˆ’Å·TðÇSþ¸ß:Iæ(l¡ À¢Í͸,O)Æu˜‚€°ÂU‰7ž3Á0çdA©/ŠI$JnôõEF¨êʧN˜sIOÁL–ÀiHû~˜fàp",ÓÌ:I¸OR<4æ¶TØêô–õùà‹…*ÛÛfÇÍ>qåØ —Šk³>‡€\èîhAÍœöv0-fŽ5ß^K!ä Æc»‰ÇŽuƒ³8Àögr›[£Xs_Á£ ;R×Û³¶9Õ¯¶¦ GñëŠÁ[¿[Èßïí-¿P¥0ó]|/`ưUõèÃŽDWr<èÆay¤›Çí8ªLLÙ§rüÀÉï‘”¿O>”AÞß{)¨ „Õá¾Y’LbØrÜ·¨…Û}w›±è\¨5cwm*Ì µè²pLsÙ¤ÄÚ‘±o *€N] Wx Ðù¡Bœc0²7¦œÕÒi "Ñ;@¹Ôߤ5GB@PBH¹bÅ›ãC«ƒÇ:B¶J§d’:“×÷AeÊÉN÷•™Þ¨§ÍÚ]ÁèÔ›°Öd8Œ¨2–Ûõ"»{Îã¦#ÂdiŠ¥Œ]dÄBüI|P|5©«ÆËÛÌ=TÄL*Þ 5y$ çöUlx}¹4ãu-ƒŽ7í3ßé”Ûш-7Óœf€S¯Nû•pU ^ÚúÉ^l”L–â x,ÑG ?°Žq£H Âàcõ#Ù>­–ÈÔ‚VUP²݇,¦Ú×Jfd²µä˜ŸÎlÏ·Ü”cµ—kps¯làíá…Ú‰@úNŸÏKÒ¥òɇésPëçÄÚFæÃRžEpÇ&So“à–£éÃ8­Ë— lU!÷85Éá{òܟ‡¢G®oS”w-rÁ¢àι(Ydƒ˜5!È¥?¦i©~LOaÉ¥Mÿƒ#Í– ƒ² G¯ùYdkö(»zhzš‡uË—K}bØ-“¹P.Û>ž3 òdPH†Úõï¾›”9ãôÆè!¸¥‹°ò VÀ/ƒˆ+qkª Z‘ÍAÔ½hì™ ‡ÈÜ­´6oðÔfLhÐÓa QÇöå춘yœ,­ƒ³Ã_ƒŠ+4h€ÃI6ä‡>8Ü "’õXlM­]¹³€ WeP§ª làB ç ã3°g¦ºÒ1÷S²>í!œ›²ê-éÀGwLÈ/\ç(ʪIƒ_x«lqO»—ªî,Ì^¯â°zi]u2¼Þ€QVá^Ñ»|å¡’™Ë©“ʰM ’%0â®#<“u›ÆÒ\ ‡§×Þ}Ø~JK%Ö@´Þ8_EoB›wøy †ö½&MCì¯×S=]ßz|à@ZÒƒÝÈO¯‚´G›Z8¦ÚÀð¿q•¾ŠÙ†Ì¼øâ 7j’…ïœ8ѵ Nf ô½Æ“V=¤©µS,&nô¬í3ßö<%~>b ‘;aâsÿމ!:–¥Ÿfw¼MB÷S…÷e­V8_ÿ¬¯@Љõ³'D¦K¯×©~‡žn[IÊwY´Z™ ŸšààÞÓÇÞ“ÓÁ¼¢z¯^ž0»Âï„kdÂR®~‰–òs©´³Æëó g;þûƒg47u^Яv³˜d¥±¢9›“,^ÁÙOî{MåB2ˆ•¦Ìã“ß½i¶<5ôb‡å¯ƒvüØ`Ýê†pì6øC-ùúÄ‘ó›óÕiýÇÙ@=º%›rO4lÇØ ~ôÎÉú|™äY´™ú‹çKñ$‚™³„ÌŽPù‡ — ¾¸^µ8<>½´öŸìå: R©Íƒ*! ÷izinÀË@³@ÊI¶Œz£”_ñ2bÛ±‘ÇþBns¯„\° kQ°ôÎÑrw(U Rg-5M\þ¬/¶c»÷¶< %yÿyõƒÿ b³Sø—"´äÞ{ê뫽à;xðD™¥÷eyVû¹Š[ ÷üp¸k{œPëbðŠÚ/‚ˆÔƈªP§'ª¹;tF?gŸËNš÷)ÄïA;ÇôJwO/û$ÙËÌ^\øÁÉâ6‡áèÚî·VzÃÝÚ÷<µå©Ânn}à 9™hI $™·-ûQ2=Ü“d/2zv×?˜Vµˆ­¨6x…·(j½‰½Eü°uÙýád=Èa†¯ãV%¤ñ2Y”Œ MH‘.‡èŽQ¸Âã[y'ÝëF$¨`!¶¤fÿãЉû—Tß[éâ §Lo$/ÿXëDøO…ܪ©ôåù 20-ÊJÎÀ»þž#•äL“ÈIqáïfŠmÉí B±4ÓÈD;jhfѼ*¡UVSD[VÙ/°vì&N…ü+~5Àlw²ô®ì(ózÖÎÎÅílÖ¼c¾™l=U3eO…ƒéU1²PÃóRc_‡UÃ'¸ui¤[?d\ÎöÍÿÔq‡8÷ÅvÓI]‹ýn g´E µ]JkGoéž¼º›4Ãwã¤ShˆÅšÊfŒÐIÚ‰´#7ƒ)w *€õ%Íø~ ìï†!w¨ÇÔ„s”ù¦j/«âR4Ú’v#.ãæû÷*´âC²â5ˆxÎÄT¨l3zç»?'Ë`qqÊX†D'*ÏEXeÊŒø—¾ŸŠ†ÉŠ•™û œhCUlÌ„#Õ…ÛI[ªô´j¤Ï‹ÙÅ÷¼¤âOØ‚ÄÜSàä¼Ü2q|@ÌYþÑ€2 ]5àÛÂUþsšÉlÔÝ}œ¡Ý”N»f€kµöË:PRÕRÔz¡…ÉÅ|UþB·®ÂH­‚¦›š«(†¡ÁúGwÏ¿ë5_¤}0’€x¯Gzì±&ØP¥ÞÙì7‘4is©=nI/<=ŠV¹äðïÌt±ô €›rlÉH<¯ \•K-Hî«¡£:DnÙ°£ßˆ~§Á8Ï•.Ì_%ÅEè¦Çþõ§‘íövÜAB%ªÃ|y€Ä ±¦˜è vvFŠÌým¯>…hªŽ­Ä½#+Ð¥KÕNøÏ´`d€_άf,éñÇ€xO7;“í¯+Òy_í6‚Ôˤ;/”M‡¥;ßö8Kྕ…ÇôW©NoΘ©4Íh3ï¬.«[›™y#¥B† Œ1T·2B¶Ûþê~>ñp Ó—µ=&˜å7Z@²@ ªö&UúÆ~gФõ]ÇÚòºŸÐê;À¯à‹üz©<Û‰°t2v0"TÝÝ0‚›à­‚®YkÎUÅ2dþ®½eÁiè¤ÓjùÍ(œJ‹“¤†ýñI½ð¾Äë\Þ€àxë9­t.A ¡¿>³Hñe2}¼v¼2”aM§:ÙýÅ60Xßë—u¤£ß*ûÌ.Þ”˜>+*®ÖjÙ2³õ_¢NöÐծάr-9—8@>ž»w^}yt[/¢ï¿ò~:?Ì1/XWäôÉÞb0˜l,©é•WiÒQœnÄOp œfaä ]rn£ÃÄù ’ Zï+™»$½¯Á6{{çD)V ³í·Ä¿üx¿T²äÅÃÀTõ7˜—ps⺧a·Ÿw˜’7ý»iJÃÊAÿðy,@ÛaMw¥%ÿÊœ2õÈföòп…!íHæ_}¨=ÎDßÎ'´ùó0 ]žë¾Õ\lîÅebŽSÒë(¤Ñ}<¬(øÄ‚?¦ ‡6?®À/-å:Ú«Ò8'‘Ä7P!h!ß-M‡¸!Axo°ìÃå!¸ €z{4ðýa‡=ÿ†T vâÞÛÍæÔŒq Ñ ?ã_hoghö÷´P¾ØßÅ(“¨íÕÈ¥#ïßiöˆ›ex áâ*àö/Ùf †uÆ)0w¼Í…€ã³“‘ÚíQp¢È­›R<~&C¬„N0ƒƒk§hm¤Ý|—H2bÁ¹ç -£MÕFÑ6ûHQ+«–ái–,»RM¡±,“Çgj}¼ºDçèæf¯¤¤ó‹±áÈÛ­£’-µSÅ-œb¾:@8ÏýjÇVW Í¡b—¥?øÑpÁü‹1O©tuµÍ˜¿i@ >Àµ>ïOÅJæÀ bå([’”Ú6®u|a) Ÿ7ß²oèâ-Dšþ ây†c-‰1]¶‚›äžéÆp£“ýÂ\8ÊÊÜtk†wÿ¤°M½qZw¨V÷¨z·Ó¦Àsܺé›ýêåt<çõgè¹j~~Þª¥0Ì^)zALâlÌi/ÅS9¡e}6Üô² ЂȾđ÷,bÀ„•ù&Mò!¥zÈBl¡ˆÛ)+ç^0/E^›&\-çés%rº¨ï]«5ãÎùË8í{T™õ{Öv='¸i¥ÏHº> ZIž~ˆž²Ûµ"[Ûˆ˜½f ý¶¥¢Êl¨ØÔŒÄ@§ý˜=w4”!N½À¶˜K>KOÛÌ ‘7«PNÎWd÷ +œ ä¢ôlMv™2¡ŸÏ¯~\ÜgóS²,Dۨï1´Úå°?;Œh^M¦ J779××C žœc¦ä×(¼>&S¿•¾í¿R9 É|Á endstream endobj 1146 0 obj << /Length1 2743 /Length2 19496 /Length3 0 /Length 21064 /Filter /FlateDecode >> stream xÚŒ÷PXÓ ãw 6ÁÝÝÝ-¸Ãƒ»{€à®Á5¸w Áà'¸®w²»ï&ûýÕ½Eð´>ݧûœÊ7*jŒ¢f& ){WFV&>€¸¢º:+ €……‰…… ‘’RÝÊÕô?9"¥&ÈÙÅÊÁžï qgÐ,“º‚ ìrn¶Vv++7 €……÷†Î|  »•@‘ ç`rA¤wpôr¶²°tçùß¿SZ+//7Ã_îQ;³•)РtµÙ3šmj¦V W¯ÿ„ °tuuäcföðð`Ú¹098[Ñ2<¬\-ª ³;È ð«d€ÐôOiLˆ”uK+—¿jæ®@g,°µ2Ù»€]ÜìÍ@Îpv€š¬@Ùdÿ·±Âß €š`ebý7Ü?Þ¿YÙÿå 45u°sÚ{YÙ[Ì­lAe)&WOWÐÞì—!ÐÖÅìtZÙMÀQ¤D߀à ÿ©ÏÅÔÙÊÑÕ…ÉÅÊöW̿€Û,io&î`g²wuAüÅOÂÊd î»ó?‡kcïàaïó?dneofþ« 37Gf {+'7¬Ä?6`âo™ÈÀÉÂÂÂÃÎ9@ž¦–Ì¿¨{9‚þR²þƒkðóqtp˜ƒËùY™ƒÀ}\€î €«³ÈÏçOÅ"++ÀÌÊÔ`²°²Gü,™ÿÁçïlå Ðc+€å×Ï¿ÿ€'ÌÌÁÞÖë·ù_G̬¢+&*#MÿOÉÿ*ÅÄ<>ŒF6vv';7€‹— à÷ß(*@«Xüá)koîàý›,¸Kÿ#ìþÏÐü³´€ÿÆRrÏ-@ó{ÌõY8YLÁ¿Xÿ?û_.ÿÿfüW”ÿ×1ÿ¿Œ¤ÜlmÿÒÓümðÿ£ÚYÙzýcž[7Wð(:€7Áþÿšjþ^\E™•›ÝÿÕʺÁ» joaûo#­\¤¬ðYZz9Z‚ìÿ°Ë¬þ€`òÖ@ð¹ÙüÁýú]¸1¶¿¶ð·ÜÝ?*_·Ì¿Sq‚cÙƒ·÷wÀ©íÝìL~Ý›P?Ì¿Iƒc:üáÅÊ .Ôñ·œÃüZÛÿçü9Xÿ‘þ÷ô9ÀÕ9‚ÇÎá÷yr€›èhëöGàO/ÌN¿‹ü…Ü@.ÝEÿ2çø%tp™™ünøõø[ø&ì¼ÿHÿË„•âƒb÷â7N°“ ÈÎ꿳ÉùËäþÇéq‚ƒ¸€Ä‹·øÿl +˜Õï´à§†ÙÕÒôÇXûçêáð‡8†Ûï¢À9ÿúìãbêàüç!€'Áý&ìñÇš‚ƒzþÁY½~“»zƒœÿNùŸ[ÛÔÍ|d®=¬à+ýø¯ÏI 'ÈqiÞÁ”?غ.¸ã¶F”ЃqgBp†rG+–ÑgɹÓí>…¶:+hÝùZ4e¸}e[’æJd™ôÉ稵>¬-émûƒï£Q‚êôN;ââîÀdá‘h}?1£ºÈ®ï““¯f  t+d·ež“ªJÖ­GŸ´g}ù·±Ðù·»Õ\òHå_c4¢õKf)óM²çðÉà\‰_Ñažy¢Í^]Ï`æN¾Ê%Ð#úǰùèn°ÅÞÍy¯Vª³¹ôPèâC_aŽMSùˆíÃ[ð)-Ž^\Èa¡e‚Xë'õí~s§§ ‹‰Çbë¼Ä+=Fá×^Ϩý!kGÍØ‘®ÎñuŸÞÜÃCJº@¹¥¸Ïpw( á&Ü™ÞLÑ=^ÉËgws æJçèJþè¤nRÏ{DÏ| q g¥YlUâ)ÌÉ[Žèr—§Ç·Ð:³Œ¢Öç‹õä±ãŒç®§Zç@…ä©*"|aJ::VaF7åpÂU-‡>B5o» ‚þgZ½a‚e)oLNç»Ï'ùcºi<òÞD^¶É“Ųœ&˜Í¤Ö¦ 'º8•P¨é‘ Iܹ…óÃåòµ|·ä"rßÌ>‰L·KCŽ+†íÝ|6*Ï0à · ¯»?lÞ:Š„™Õ;kiNÕ"ŠTºÂŽ”áÔa^ÞЭ(Ü/ÌëO‚Ä%”/Ò Ê‹‘EêåØŸ»¹F‰þ÷ ßÒÑÆ¼9\I¯*‹Wìqxä¢ZªWØB5]¾¬Þ b<^@mF%¨¥ç-®²Hðª|KoŒèKÒ’A ¹Ú˜îÌgÝE¯Ï¡ê躰ÚÁ@-* ½„™ˆL*ÌÆ¶9~2^¢ö¿;¿®„õî/ÓÀ«yk&£§‰˜¼åQÒÆUûÝÃÃÛ¸áÅæ:O»–9Ü]O©ØcBÇ+(LÎ;X•ñŽæ>,=¾\"{¹Ùü‡ÌÕ]–¾“SL·%ª¢0kÃ5ò³ÐvY¶×†+TZ+xQ«ƒ>$ÍgOvR}¯WTg7¤v.Ï¥³ÇKÉûËâ†q‹àªs‹®(>(« F2ñÇ®ÆGËŒÐ[…j׿ðûÕ%Þæ`ïZ÷ëh_I.¸Uv|älwü/&ÛQ¼™©À},Ëãv|ÛÃÁb )“>;Çqæ¦wŒâ¡ÓùåCFÎN6[‡žëÔ×á‘Ë£²„-/Ó#[L²6Ÿé–ˆ¡(ÍŠŒ#)*!È!™|èdAyçe´±e¾Ó?ÊŽ¢Íñàî*°$ ]oÑgÍR{Kò+3³8Çv¼£'l*<µæþLyd%ò’Š»…5„AK9>ªÎ 1åþZceJê ö&¾•5ÙUr2èkójÊtA+Á—uR†ªÂ³S²/z‹pƒá ³Þñ’_ŠžlÒ ŠQì­ ÒŠ$Öñ•ÐhQï2@‡A<‹õK—#0:'Ž©ç‡¦ÌáêXÀ ‹1ØdC—îQ¡¿›¨$Ët;o_ÒÙ¸/3þ!„1mhLÑ@“R5C g—~OŒ$O&¿5ƒB-”‹‘%¹¡¢ÄÀ§¸ï©Æ.ͦŠ*Â¥Ÿ»!Ìx6gˆ«Cðmÿê.““eÚØÂÜ‹Û `y©ÇØ’Ò' Çñ㪪˭ EÞZ¸ïFØr_M<Þl¥"u¸ôލM†¨’è6 æÓrzcðÎj ߣ=Éøe¿° >šz§×xÃÒ®Y]=N¶Â^&dû½©£s<ñ"öæKž1æêõüv`ZÀõÂ*€º”Ä1|•F¦B‡µu÷º""O£{º²”ùXùV‘Ò˜ê˜È'˜_¾ŸIüØj\ž· ÛS¦ŸË}Kòq–ÃÓˆ“$|'.o©í12£á2§ÄlË–“ÚdÔdÕ‰áƒÌ5@9©fŸ§AIÉþF·OúÞÉmœ¤y°v^1ªëò³ÅÃÁ¬34¼Ã‰?]_çÌͶ.´‘n¶ãíh#"ëiŸZ€<Ä1͇>¢¯§\·‰…È9£~辘Y˜˜¥†_—Kh–Y»Ýs!µE­ãßhÂü|oÃ)x8@•©“lE²äñ3tÔ¯?;Ô]¼:Jä½-S»s`,õ~K^ùMOų÷@þà—’L´<E³\éS'—“_}ªB xïm¼ûÆ÷ù]îÓ¸ÙžR< <-“«,‘¥SÂÂs8  tžÓi@[m@µÐ^°ΠB?ûéPÜ7Z_¯²k“»o̧3 ôÏVÇÅç‡Eøõ­4"' …þÎŽXŸ•ã:ì¤!3dBß…`i¹oææ¬}ê.]Šàˆ%ˆôEʼnBž˜Âظ]ô±ðXÈÂWÜë>Õ Žk_n4i)±07÷mFVØß§«;>ŠÛûq5ë¾8Õø´;ã}ÖÐ}á•,ÏŸ•þ´é–ÀÁ»,´aì@àÔ5ÎT¸é€ê¹õ!N-Ä7Ëœ—t¡R¸GûœÉmHÌÓ\ÚDò‘ÉC‹ÿ!$Ý¡¯HLÁÆF¾Ñž×ü•…Å#¤íoUaÀW|TÅ! ÝÇYŠëânwò•&¡cncÓƒwã_šà+ ¨›¡°Ãì[”ЦÒ'X£3öеÖ*žáK—^4WËÒ”Üàèy_–Ñ8¸1¢¼¤Ñh¦{Ÿ××QJQz{"ɪ¼G¶P”{’}+MuŸ‰¼Å wß‹4눒®vÝmˆ?‚_ë…rL;9ø †b1ŒÏd˜×q»AÊÐ,Cl‚d^N•’KQî„ãMVÌ´—„1µbã 4RÕ«ê“E¬ Qòó„u2s¢h2aÐMê³v U¢jWŸäà’A)›BÀah ò¹°%-Õ³Ýüýõ‡¤7xm,ág®èÍŠýQÐÚ,Þ¬ë\8Í~Zë¬Ö;V[Ü\{O]µ Èš†zÀ^™ÂƒûD¾ºÛÛ}‡V¾Õ Ás?âFɆÑRšmµ‘Ñq¦¤îêXÖ5Z$³ܨ÷ä?GdáÆùÛT ð0;‡Ï[qU!»ŸS÷SÚd¡’Ɇ„3³“¯·MÄr''†x|W¾IO欭þÐço“AF´Ø„3e _¯ö$Õž€ÃÎc}#Ì·³‰ÑúaוœäË®0eëôMŠEp¤Z7HÏ;#4âY·¤M½—8F†¶f¼yÜw¬Ìå~åíV/bò!ªÁʳÁt`ÕØù&•sÏ ªìñ!fAÜr«‘Æ«@VµC53ØKüŠÓcÚÂÞª«é>ü>ØHÜÓî ¤[ULƒ))ÙOê6žg™Ö&92If¯˜hø?oý¨È"bŠž‚J¥,ttê.¿Â}W)dxàíɰìc˜8njàœ¹Ååð©9´±õ*h­ÒU&I}Eüir¢Ì?å´hÀsGíÕÒ,î àŒà#hÞÓTIA ºí÷£»zOyG…Šy_~ïjæR€›)©ämÚÔžQòÄ)í?þn±·%8d‹"ž5« „ŒÜ60qñ¦îâÛ™j‰6”§ qàÓ#>Asº­ Ê‘¨_ÜW%É„ã@ò”êl6ãÚ·`MMú<Ö2¢uÜÞ¿Êq}ùê§òxœìÚ‡SP"çYŸÂ³04£Jôm“ OßgÄØmõE'œ´±ä’ò •ýsxÜcw¯þœ³}P¨’iãásÔäEúSžT•MeR=ìE—²uwjçëOëË»ô ðZ ×sS.eŠsš©Q´å·i~~Þ€/—;×Ñ<Íäi8îaýügF.§ÀŠ+Œ¥Ø0$ŒEÖŸiR2öö3*Ñ®VsÓæ©™\ç†Îj$ [ÿ˜© œ:Õò“‚j;çGfˆ"á…Fðœs2.AW+8‡Ì[mQc6šD«n»ßß%?åGÍŸ¢ûQsئL%ïˆÜUw)Ë®·rdN2ûÄÂx{1š9ã{¢˜æwŽ‘ÞcrË­OÏŸß/ÌôÜ4¨e—mSç¾&ôö!h=2i,š1µQ1yå?±ˆÈ’_Ûûå¶xÜ›p[v¦êM0Šúû–(ÕrІ"’ Òcæ¼}1ˆÂã­@*É48žÏõ郊7YÇ©‹Ë} YVÅa:Æë­t Eú§KÅ„Bºælÿ6Âï•65¯@]ñ)‘ÐT¡„¹m£ëvnÙ¡\~Ê’Lê&ºs­þF쑚 §yp „ªdqĸ…uS‡g›¨¨(e¡r©±ZŸ©ºqZ}µtiî‚§d†EvÃ&¸Í”¿|Ü vÒŠ &\T¯Táåð¹àQ»“Б) ŒÁ‘¤y,lYó*Éêæ pÆXέ¢1ê'EÞ}W 1™ÅùÌPm¡lO̓3ü8T^õé ÞkÉÙPj~âçV\@ØvhÖÈ;j‚Ÿ@Ý€íQéLå5÷Yþ„I€úW‘do “='¬3q’æ,µYoêù©¯J§` ‹Ð&i~ü|wÿ™Sº)ănœ0D"$5B0K¥·­P'ó!±âª1rwÖTþ†[ú 2ÞîÃ^nP¹åûu ætÏöü¥é“ 6á ñSì·ØäŽˆ~:²ðòzAwýá ]37¢i?TUÆHáUl¬n´Ô!w’ ãQ6ŽŒÃ]'”ÃU2lÇâ®Õ}èôYÔ‘ÆI(‡Ä–wò”òë„aY’S ^NžÎ’µjQ–×î$’Jp;BÀ@L玅¤9‚;³®òÔÏÉ{îÕœØõP‡mYœ œ> sUúfSA+¨—ŠoÚ <ÄϳSvvQßø%«ªû ²d|«Ô’zkjÚäWCÝðÝ%g·£Ä %;{5=íhå¶{¨Wu„wéÛ€¡›Ò‹`5.TÜ»ÈÝ3Páéçî7ì¯ÄtÔ-ÐÓ`à–ájýpÕóÕiáAṓPæ8™³¹Åí³ÏgÚÅFô®É¬ùl´¢ó¨>륷?¶Mß/Ôä%T”z«Ð½-KU[PÝ1£#ݳU:Á[Œ3Á²+Æòèt3ê/Æ'bYÇg/2ê¶û"ͼ¿þîíùe½›ùåVâ9µ,‚LAû–ð0–“uùy:-âHìQÆL}NS¾(æà4ñ”sÁV{•ÌT²8ï¼3¬ïnç:ÌŸÒw”|arÎÏMk4Ò†½} õþÕž*p†ò[k³xŸ7tîuB$F“Èn[’)°…Í›¹IR—3Öý0ZµG¿;ì‡ï±?fQoÑ«‡€|¹¯üs=oy¥ºçáF’)Ønˆc?Ò’­¶_YB ò*¹b'†ðµ»Y™îºŒ— ð@4ÕõmúŒ K!>¤7Mb¹:{ô•ìâ¡n£k€ÿ5»¯h‚·Ô¦ǵü¢‘ÌHšÜfIέÿ 6eV‰‰^7†²ð—ó~~œ\U°õÖAÉ*ÎÂd9Z;¾üsŸd¹Nc ’µ¡¨õÍ"÷åï.]üØ¢ |ÞŠÒz¼–;t…×ވűbw‹VÅd‡RÏtâL0ñ%ñ?ºO8`{èá&0õ ÌM]¤ =«Ìµ÷ÀŒN eÌG:9{Þ ÕÐÝPJÒ‰sÎc- Iq%Íò2¦hìå'}Xœ…7"Lkš¸»öóCÆ ÷¦<Ò±‘ÎX[Èa¦d(‡+’IÜÆ9·pwDùæ`5áq]r⎠EÃI¨ÍùÉ(Úáf@<Š¡ÿàFs=ÂÔ® ;éV÷/ ^¡’2Öƒâý*ÐD¥l²š ư˜¬zsôܬûæh¿1ŸAµÝÆÝ–·Êêæ˜ÅÉñ¬ñ­'Ä´³Ã¶ÌýÛðútwïó½Ìþ÷g ð¥sŽ8ãÒÁ1P™ÉMZ›p…&u5Ðó ‡¹—nsa0²Ý?JqG\ü² âSòËW2ç B—Ì 5ñO»P‚½_½Fôff Þ0³RÔp*$¯)b`È2 =ãÎ%ËžB°†™‘gaÊñžR¥ËÆA‡×&û-b×›LéÚÅ0 éK«pV¤´ìÍBý&UuÜÒMT ›ƒªÜ3öL…,m8uúV±¿•æÖ¿ÿjž í·~"Ý+4û¸Øx4΋žW™¶ma3l%ɃÕ, –»h Wb6v„+AÛ›Ø:`c³‚.½wE aÖëÙöå/^‡0:smÏi_¡kµ0@uˆGEB@(ã^G¼=ŽÐ1.Ý3–3«Þ ±,™u:?ÀâA~Ã?Ìt19HØM××­ xS9øc/Ó¤;¹XQž ècâ Ÿ)»k?­ìÐBè1gA|Ážøy.Æ7AµË‰X㬂ú¾ mRí~ÞAv^S¿þ›Õ¼ºÅPTŒžÑºn£Ñ±u(ѧÏÉœ…Õ¥ÔJ<hŠá”ðô’|îш‘#dÁÐ-3å?ÊÞm&‹=qù'ucëíoj'@1?~”‘™¸lX9 1ô½Öµ!þRšÉ¾Û š£)ªµXtx(ÆéR«Þ5¿ä6>¯TÞÃVçRCoÉñ™Z—³™³!*%6ò±‹‹Çó+£¸“ ¼Ãªæìž &Îàù`ßß+޶G6]Sù)ìÚ»e¿Ã/âø–«©7¶AÏT`brXJáz]ÏzÈÔä7®n³@ç`\½#U)KlÖ¢#ÖÈŒTÎ9T @8b©?˜ÆáµMÌ÷´Áí¨×rN¤Ü0úqG½šÀ]büœI‡×"+þ)·u¨5T42m]·¿þ;ü'gåéWH¯íÓ0¹¶I±;â x­¶9×M0$ž”nêHI¨=zQP w0ë¬ÉR ´Üë½'LÌÝ3[ æBeà?…¾GŸnêÖ 29éáJ*Séñli ’ÅÄÏH9*Œ³¤AMÍÛ÷æ ÒódPÞ ÍÃL4äïÉÚºòR¹\z4‹žÑ#rÅhóžöøÎ?m aZÄû¡ú@YçÓ';u.[§RŽÃÇ¥õŒšÂ™>Ó5ã)l—›6˜vÝŽ*JAkìí,ʶwmU½Åu@s`èÂÏ„ñ„&2¦ðžŽs@8ºdæÝ"Z žâÈu7Qõ•õk»Ì4häò7ÔÅ0ÝØì­žØ}„z΀Óï0§yGöñ«†é.mÃ|¹†©Š>_x%“ú›±§‰ Æx¦WŶ]–µÈêµ\¾!°'úõ¢îúL*‰>Mûÿˆzjï±y™žcwê§œañ­¹ß_`4îøK¼•"hÎkÍ1KÒì¨Q~þ¢d0>âqû=…®ˆ”1Ù~¢ç)ŽANÛ´¬ óQ¸Zú^IA‰N/ð=9òOJiÂ}9Ä"¤©ÏôÇoZ—¨%Sùó%´ÄŠ{ÂåÑPÆoÒYæ3»Œ!o>©5C9÷òXáNóç9©OŸUg*ÍjÊÊá©T8Ëüx.7]eÃŽ2¿ì´>¬¬’ÿZ©ÁVËÂ=Dœ$ÊïÚkWA„€­<_˜mÒPÞ¢f5êtçW§ö½kêîHÚ,!@&Ïåì{¯†…œ¨¯'/mooq¾4Äc%=‡U’çjŽñ…–€¸š{K,¡ÖóvŸR'SÞ1¦7U<°B«}à»>iFkÞ×®n_ Q­õggб|Ó†\þÍN%Ž,X ¹Øž]óy=íîeHªlɤ— ÙIÆLš•H‚ŽÂE6!œåÂ3GlÃÌÏT”-¢¡\Å ›åûÝöb¶½WqÊ…,~º:ËEZŒöÙ®¨ÃÝbȧ Ø»ØÒ«wjºÏU!üX¦1ä–ÑØx%7ÎI_Aê|Ñ¡Ê2êtÕ—ìç·#e!NÛŠk•<õ¥e–ZMß ˜¹ÕÓ]j;OìL+Äo(Û-¦܃ÔàV]èwÍËAñ9pã"@‰àæ7|,Eã¹Id>ÓY|žf´nUú 7©¾9 +üGóKK.®lÃÎ5JØÓnÂæ'|™ñ9AþˆÚß¶\Žfç(§f ¸Ÿ¥1uSûòW^Ùó“š|ÝëÉB“™SyÚjÝTÓÁ9:M2¼N~k\KÖº‰XG¬ÔÇ7Ýr#Ì#By9ñˆõ™¨À}rû½¿v^ê– 't~0²UL÷Ú£ÛzŒ½8¬ŠÉêü ÓW7±H)µ—ÈŠ¶ò¼Ô$ÞkûµaÑÊã“ËŠW![ݧ-1¬29ï>ç»ÓhÿÊÙ(>ä­ñ¦ikŸWÂøT+1ËÄϼ\±?ö; tŽæ û{‡±3¸ƒ7Ž÷»IH}Ÿ¯†îvÑóª, ǯÏõ.RCr8ßlÜÆ‡Ô¤Kéó-_‚2×ãcP‰´wéæõ^î V˜n€8§@㪫" h8u>µ1\yµnÂp¬Ë³‚ Þ‡¼vÕfs}¬œŽï¬A£·üН>À©ßºŽ-±Ê’_±mÁž»¦99„uÍŽ¶Ã`}Þo‡“öŒ¼b“b4^NÄ',â+)ÖÏÔ½õllžiß穹_=›Y9[ƒÔenØ*P\žx¯qŒKÇ͵Af’ä¶œüHàúqùLHD5‡ÄlÜî26‚r@c°.ðé®Ç±¹¡‡; $Ãx%jý ~z -¹¸A½Djè òeó76¢¹¸W¥Ä–Âé<³oF•ôÛƒ¸äŠÕ÷²¾áQí™ù›RáâË>…áIoÆó­®1Á+ñÚÖÈ]Û¿ç§±QG^4`ÎêbiB\8YZƒZ!|VŠí‚ájß™ñ­`òDÔ/ Õ¼V(;¢Ç‹UÔã>Z»8Tô#(sY˜ð¢l!2\t¨»xÛ¼¤ág}Ì~4c§¤qe~bÃ÷c›XÀîÄ„“9®T™’êÿ¦::á`Îôµw¥EõêE‘%sÞbýâí7_P#b ÷1~]š+—‘ñ7I.¸gøÎiË„ÝÚm²{騑°M¾w1)~'ˆ”Ì"šB½k€ÙŸ—õ5ä%¢TA!$ÁÈ»·[0/šÆIDZGQå!ó‹nã0ÐÕñ(ùø«ÑbáÝyù¼iï2LŒ‰Å_=°oô‚r´ÞkN‹ø32µJ?®F±ùîãûNÕhŽ3+EÒF¼>¬Yv%§ÙêZMËÞGx¦ÿ¤æï׆ھ¾ "E­Ì®w䨙h{¸aèØ=ÉC¢¨Ýk¡‰.Çk{¤z‡ÒÆx¥ì¦2„{Ú‹ /*§2ã·VÜÄÄZ6F°Z›my®¢“Qº¡™ƒè d‘®ù’÷ÊÛÅÊÑñ2e"ã½ýKÇs•¢_Ö|×\9 [ä€-Ñæ7Ÿ4 „Û~·•âG&vÄ¡ÁSòxJNò¯}Ž^›d¯uslÞ“i„Ù_ù¼P×øñ$ˆö‚Ž­p -nŸ(y¬ù’êc•¼Õå†5â9¬–×BõÝq¼Ä%ŸNÝûMRoq7¾ªÂIQç»*æIÉH IûSÜiß.ZçwÚ•eñ«$â Øzºð:ãÛj`¾¾gVK1¥}tkJÐ~vPšÜ§üú'†2Z›ìIEce^ˆ<äQ({+…¯ñÏ9н:,úÞtÄ„…Ѽ¹¢Ø´S?U—5œCŽqF²7‰•l‚D¯e)ßè÷­ó+ib)ÛiΑ(—Î >0³B…§NnÎ.À3Ã[:q[„¿¤ÿ4²b5BØZȦ~)üΑ5r8›À±Ðë—p?ixž$ˆ,êAèí!;¶<†šÄÉYª;JŽ8Ù¤ ¶æ ~Ke?%•å§©~“j3=ÞE|k€¼íNÄ·;·V†êvt4RâžÉÎ^ÅßÃK‹”"ÒYò@ôãcóC[- °`•æ$_þcÃ)N¬- \ݤ=TQ‡šz ~U }±A× ý(M ·p8€RøãzFªü_Dz.Næ5û÷cĺ*(Õi¿©è]~Ó ;¨$¿óÓVv!‡Œ…÷JûÛm$JÌÙ± ó¯s³‡…’ß‹jºæ"B†“FšcÕÆ‘ ‰Ù¾Ã—“¿ü¢\ÕY2E·ßëùVæv|”ruÇCüÅ,×%#¼}z?®rF¬µÓN1»+¢Œ‘ˆ¶&_Ç…`Û­ÄÃâ”káǽ†zG“¾²äضk‚öGõTŠÊ‘TŸ4õ“¦kìY³…¾¸ûGœÄaÅL™Ë1~šy šWç+ƒQÓ¾äü¼y^”9—‘"ÎB¼ÍVº‰Q¼¡–/㌃ùKy”Tî|«¸n‡*wbbBË¡¤ûOÉr˜ƒÍȸnx¶JüTnƒcg3¨ov7SíVs;²86ÈHä!úöw0ÌŒrÜì–¸^TÉFb“p¾K,ìçÏ'eNÜ_8ÑÞÜR5­Î" `Esß<Š‚÷zm€X»—t­lEuNKy@x}„KضÍr-˜æuˆØB¡À‡@Œœ%ÑØpÝ$Õ&‰ ó¢ôã[!óíS(ƒ7 )$;©ÒÒl†Ë1"‚â—>…Ð$hn§~î¡ÓãMbÖH³;qÍJ{üâzRýbšAÐÉë³è\Úõ,-cÓ©˜ðmLˆH•ÌÕÄYYªŠLºc±üE™†’ãv\ópkD4Ž6J‚ …´Ž}¸&úG6¯c/$ÔÏá0¶\HÐ>Ùð!8«pÖßZ})Ègë}㸗wËÖðÖ|¢Æaì}ÚzE ŠØ‹Ï'æügiÛ8ƒ¡ö,=«pFÃM<;>©“ئ±à9jóuïÔKÇ1gÓ„†ÓûyØÌˆ/öWO9ÉþÖîÇÉþJK5}Ù¥‘¥/=¦aýYÎ,åcþÆ?ùí~¢r1.çaO-¹2@¿IÌxe Wlÿ¹;àóûK-• Rƒ©ÆŸöP¶'Û,í71ñК\SZpÇk­ûлR…ì¢ÏC}ø ±F›3sí_¯6•Ǫ̃!àʱmׄQ­a@) èqê4«”r$5ð}½YÓ,;0!Š?fKØfɸ–õ€‚—ˆ$Œnâ$¯×iìpð÷ê@ñ6J1Û¼´h½\ØÕ¤åIOÅ¡:?ç¾ÕQÇÆnMа°s£k ‹ÍZ+¶ëKjìKa¦ã+%@ÅXЬù‚°hOp¨x„$‡vMш 9Rq‹ã‹®ÚÉgÆ"± Z÷W<Ô@FVl&—ªß2+‹CtmÚÍ”y|zeF˜:øh€÷1¢í°¾N)0¾0k”szý²öòƒFÜn üüÑkÜ©Hi€¼÷¢…|”É|žÞ\…î<æ ûWd7ÞU3¾/—ÒÒ0Wn‡²*¾ØŸ°š½ÛIdwSǜߡ*ÇÝÞfíßýœ–œœE}í²ì}aÍ’Ô@ úõéP‡´¶‘ø„MŠØª …AÛVÉÃéü0ó+Y~‰¥ÍO¨úVy> þôP B¨R.q\¤îŸ¾Œ‚ áÙi: Jˆƒ ’Q¼Šâb°Ùöp7.ŸF~6~%€4yo”¥_Q$ehºï ?í8ЛïNc„¨‚QÀpCMÄN)=¦³FK@úŽCÚ¤âTjìeÏ„dõ<šÓ戞âââ0€è€nw¬Še(÷[ ˜àF×¢Ôh¦¸×&£@j ?Á¹ª¦†a®Zžáö?Qy|«ûí¸n²Fˆ¶ïC9llþÛ;ÊCF´:³ÐÙ‚â¬TZ¶£Ð:=ióöBlºÄöØm皣;hóÇU`Ã?rverÚBVH» w}ßß**C±Å57#ªËw±UÁeš¾ê.¯kÒD•·£g¬I÷Nùþ 8${8eß6žHãD(ºwì™Ð€.ÈecóCðîòt+?$ppV§Õ3]$õzìÄéþC-a,^†A2½áÏ%ǧ³8·q}ßg[çàBàœ€-qS'µtèãsŒðãùÅO2=oå.=å½(…JîÑG„H]‡Þ3ºÉ.À:×Öòc6J—rqu<’×ÚŽk”¼—š¤›t‘P*0ˆãÛɵ~ R-K–N¬ÙE<Ák‘Ú‰”OßKúc¬¶  n£ª’MP|CÁULžfvýü7Ï -µi4³™å5áe¹ùRG ç–7âD43þµ¨ïF Ï1jÇ’}™sÝS^ ÉïFZÍöì&lÓðÄIE»x*S“Ò.¦-‘‘¬GfjÕ»û3SV§ øjÃsy3¿B±úžœ=¸EðL<°ìo AÞ/8Äðµû¾bÌokøzYnÞîwv¤½ˆ=Â>ø2<5E dY\á͹ì&6’–ñákL¿‡=£'úÑ0Ö¹PÃ[³£,ÒœÛüQØ?H©ì8f˜Fph¾¨Ùþ´CÝmFaQå •Ì×[½®qƒ½çá³[FÕ“-±bmZíËtX“.Ît®¦qcÚãµ' ¹“ 2ŽN){ƒz9ßí¯Ë«©G×9mp3í=6xt”Û¿ «˜qLÜÑÖ!%Î7ª&«‡!›1’Áê˜:óTâ…"ªPuq.Á_þ²ÓN-_¨§ç¾´=Ÿ¸ ¾‘©â†@â©ZdŒ4#[\k)Ì#µèb»Ð£[W’Ñ_%Æ£6¥ûÂeŸ¦úù‡Kaý•ë.nïènÄõ=büºˆÞס—ÍC½<…ž÷­µ'ø0˜c3ª~g)cî^®u_-ʼnå¬çƒC¡›ÁÌ I&¢JУ6ýçjɰÙM1‰žÐÌ„iu•Ìþbü Æ™žMxb£@CÚ!¦ ÁG;sIç÷0ÔJ•iݹ:õòQÞõ¦BÅKW‰™¾Ò&«ä¾o]pk¦¢¾fÎð‘JÏ‘¯Ô©[Æh×Ãç´ÃÞàtŠH¤òû8‡¦­‚ê«ÞÄóc5Ÿ#;¤S•0+œÔ/Ïk·Ú&:ÉÙ;#üÒÛLäâÖ©°5ƒï’ÇL©itE¿['C³ãÐ ñû`&?Øá'„Î4Ä_Â’àh¶ÉÑåöÁ"ÿx ƒýiïâ•çõ)ÿgËñÓ ”òçPU+#JZ·‘ïã©™Ñ[¢ÛÔ3NÀùtLCÏ­BÔJ Š­¢ )Èñ‚ÓzQÞ)—Zä®­Fò÷ŠÅabþ¥#~?Åvin¦F.¬¸ñ›žJ¤åQ‡@3W¹/½Ã¬02Å;ÂÉ=°Uß yŸÞ“ËŒÃpa?’ 7(¶ô có…'i _R¿‡Cé!¾Lûzq”Å1rÀô¶Yê÷ò©_KŠßýrG›,h îñPu6J߬Ìå'F½ fA¡¬pj³¿²ß²±Åg%Âf„«o¹áV¶Î!ÛW4¯b»ÄÄCÄ uFÇ#k0•mr5v%¾§ør-pÉÔ&%ÄQísL­æcV¿j±,(¢„¾¹†(qzš˜'c?ô*)Î{N"Øg¾ÿ}`&Ø»Ž.0|¦~l*]Ĩ*òjØ#Èâõ»Î $ˆïZ\̃IKY„ñiT=Ãç‡<ƒí[Ü0ß“_X»Eäq¸`E˜×¡'Ó¢;LV"6+¼Ñ¶ãêýFvž¯ÑÇÏÏ(€gvL¦r¥ÒÆgZ6ee½»øˆÐK·’6!Zo‹üª^,E»ÅÂ<žÍk‹S!twXž[•s(:0¯pÑLŽ´Ò$ß²YÞó®¡åGL¨  Æ]·FÞip•{¼;ÖÌÍ‘ZWR®ËpG$ù®k«¦/„SvúÁüPyU-ôæ^Ìïq³%‚åý혋k¶„þT ÙFº¯¹B—a ñ+!ýJøO­[LÇjßuhÙ~²ò¶¦Í¦)xjýœìΞ*g•ë¸5FæiÒˆX‘=¥RÕÖ9Ënþr®…Ž,ÜO2Ö"Õ™ö'®”œcãl”Ö6Bç?ú{Ch .@ßõoLj¤23“E2ƒ«¦J ’ó™Ÿe¡1pX1“®Þõ·«O ÖÛÚä7ëÏ‘f,òôLˆmsÞη?úñбà>¢ƒ#le™ôDNm8´¾&£Šy”†…‘å:ÆžÖ™'±w© ‰¾&cZ9W9ÖmóS0i~O!T­%(¬£a€·Ñü™»T Œ/:ÉXB„ä©GF iSnùí8WÝÍÿ°ÀG8 Qç÷&ð§½’‚ƒ±¥OòmʺÝ?©yl‡g[PL‰Ê\zòÃ7Óϑɷc²f1‰—?£Ò®ðUÖ˜-v`Û_òUo¬iDÖ5 ¶O{oÂwõ_;ÒKì[sGªv * ¢‰ãPågƺœ°þÀ¦K5RMüɈvÄJŒ¸øF•¨t§{4‘ûöšaÖ»ëØ¼þdé¥áð[àB¹P¹bl;Õ’‚ã⣼ Ñ^ß·{ˆ§ýf€]"jÚÒUXLXvêÚ§d“ªüõê¯z–t=üÜé´¦ÃuÚ ›²kãFGýémLê‰o!lË-M‚?x("ÑhÇöÛ*'Ç–Ok Ã÷fâl)Õp G­]ùà».tߨæ4ÕCváíG)Ù“0°lÍHçp†’—ùâp­äÑ_]½£Dü¢¡Ú¥ËÃÚà ËããNÉ)yK_drCQÂa]¯¬ä<Î8™}v\ž¨½µj*ÑSwXZð1\#¢zÑ[½ÖK¡ŸUŽÚ›ñ€OÿÑ•³ï²†ð˜ø2I}÷ "Dƒ¾a&$#©q>±·¸–çêæ‚\¿î9X’–ˆ7ÔȘS™î`³”aE+Y+Ô·H÷$rf² $¨Ø|'è?¡GâÚ8HwàüÕk˜GáuÛYM€¢õ·—¬Ñn¬Pié¸s÷#ÙêwòçÒš‹(jX)·í¹t­¬¨ÚW2ð™Ê qEÝxz8‚$å_¥Å2;Ãáô×Úg;CÍ¥íÖ^ÉÅ ~]=eGßo,£/Hê¤ýNSLNm»7äôT¹Jœ«–M+ðݑڪiFx TáàÿN_+±Í-Ї<}ª²“? ËÙ¾c¡¤ØÜv™ùmžsÔâAæŒ.þ¶[Ö-Ïls€3tw UWÑ»jM–À]- ;w®¨VŒ9txè…šÆ91U¨FCÙc¬nŒï¬?™ÿ*vQf¶? Ò;L1“á$Æ?¡üœ¡;ÊClÅ(¡êå…’'s˜  ×»kÎ8mjN‰‚€÷鹎²‘¥dY¿fIw|k£ÅDFƒï¥ÇEoú"Ñ.]NVÞu®2Þ2š³ÊËñ…g'!m·•¸zäìÚ5X,qçv7`¥ò‡uÅçƒw=ÞIÒ ¡|¥ sØÞJr|ò¥ÐP…ä¼›ˆ»µ¦¦ÔV6vïP®àÊj5WûKYí4¬™?Ÿ¥È7ŠcÈÅM;Ý ª.}M&>.[èý\ÓŽÀ¿£Ip¶é¯™;Á¢¹‹Ê?ém5NDé‰Âª†;BøŽð1W~EaD;ï dí:ÐõUþÆìDU¿·<„îi[J•â‚$Ãú#¨ËVâÑ䛆âmZΦ¬’¶²w§¹…cúþ1äe”´gZXYvpa¾ôYŸã!—ÖM|Ô%îˆÔΨŸ.yü–³ÓfÎÀ²Ï@Õµœñn÷v'ÂX­%¹2ÉÄÔ…CÍJ#¾s¿Ÿ2‚Të$”Öêµòzt«%Cl_ÁBû'¬¡‰“4‚²¾î`VíÍÓ cfßÅýR0PÒ˜¥y“2 Ú9Á‘ÈÒ{œIÖ5Ž¡ßñ7:ù-}3]<,ÃÙ‘Ó›ÆdÕÆgXz|¶Q(„”&gÓ–ÊKÒGsvÈžmÅBÖ‡b$8é}þ<É—I1sIMáùÃëe(YÆìMÊW±´}véõÊ@ØaŸ]œñ\`MTGŠiê!¼lx/2àb )°W9pìÆ ‘AÎ>Žž³UØ.Gö:»WÔ-ÕuÍõ› Ø¥F,°e[€æÊëcúøw'_z (ª*BËx˜2U›ú45ˆù„>x Ÿ«6Óõ§¨~ƒïrlI¡ÏâC›OøFÍùE¢ô0¿ê°%¶Ïµð‚P0†€¨·m¦öígÒÀQ5‹¥Ç·%þ×Zõ[A­.cuxÐêÒ;ŽÕïÌvLÄt_?BZ»» O5äZÍX¨„ôZò‹ñ ÂÅkŒyc):É¥¨×Ç‘âOå.Ӿޮöó+û °.ì*3äräw–OX€P¶5 G8ëÐ)_h³d¢±c0ó¤ ‰œ“RÀzJÛ.ïÒ+ÁÆUŸ–#[LÓ:®N"›ÍœÖ{GZyŠ8T®eÜ=ˆHQ«ÄU¼KŽ0ã}«"ö¡ê]NÉS!6DÅëk¢UDAcÈI[ÒLòР`ëôk˜MDO`%;õ¢|]¨‘VØžk4}7 Éêʼe¡ŠT+Næ”Κ»OÅ;F¦ª™®˜%ËíÚíkÛîváà²3æQ/«Ù†Œ¿š :µâ Ç·uhWìo…W!\'hETæÙUýÒMôq~C¶jâ–jäßyü1ØC=Êú-z˜;cøîJ ÌÖø6n˜×ð“Ç1>"°r¬“ƒ(°™åA3Ÿ8€'“à’Ü…Ï©T]ð’Óº/• 7{®÷Èicþ¨äMÐkUªí4Îóó‡>ã.Ü ç û´¼ k≨<Ö j´ø‘£/÷õ—Ý2ì×¾Z³_Ì\Ç#5@/«jøß×a&Äú£Þ¥úæ„G.½Ôdf#†ÈfÈžcÜżGÔFÜþBÔ·;½ÇYÀ‰XÀÍ¡7-}sÇýÎõ<–3$ô#Í›<Ú“C;¸¸¡,Asé¯Ôí ËL_D÷O|dÚ‘÷­bœéD•j…4-‰ZgÂ3ު𥟦{&>Ún>W&ÍÀ›£¾B{.»Ù3ñbU½’s@u¼B–$ÒPœz…ú¤Ït¹ÆKð¶XA“˜êx]õý gÔl-¡rbLbx°jÇ4}ÇÚ`9äàƒ’–¨TD MëóY–ñ(é-û"ŽbÄ>Z…îCÙ#Ü[·ÍÀ̃8Í5ñÚÊð™·Ì¢æq¼5~Ë¢<u¬§Q¬}*Õž8Ì«©—›'rÇŸfäv®»kÏ«¢ÏÙÉš0†®Ì.6õú'@¯&bc'bæ&j&ˆí€[Â[”ÊJmg-Ÿ™g.†?ÔÞ y¨qÂ×»¸âäO¸¿ûpTLzƒÈ ÖsuMÙm²÷ç!m‡à¤±Èb)ªûg ©…T]èò­6+o›â ]Ù¶gåGi—kì»\©M틦§"o§½Õ ¾dúnÄmëIâ˜Ëg¸9J`äþìðáöH±O“æ¼zÙÏVŒvI lŒ^àÙuéÅ:η¨jOØæÞÒ¤Ù1å☄Ío‡ååg+†|ѧkr¹¥n{îÄ£WY¬øa™?ádzW¡µ¡/·{D“c·)„óØ/…JÝ|Õâ›­¡r,b1XŽÃÓºž§_iñü ëž5LjçÄËÒA¯Î7E¾çMê­ç>!_mÓàˆRᦰʫ³«åй¯‹â"Ulùê3ƒƒâó¨(€o×å8—‘NéxfÂF…7´ ;z×Å•“½Dz²‚î"0†¶@a~=õ\…>¸ç¯H¯›>¡Ñfqœ-s„u Mßv:´aÈ£‹·hÓ¹Û]ëÓ5pçaÖ ^îí[ÿ‚Ëò–Žàm]„¹Ë§Ë4õšTØ‹FöTùÚ×1”L™´±Ê .F+«{õ¥W®{Qr-‘„-:þ¹JÝõ¶Û9ÌN¦„PH÷I^vX1²Ök3î‡àï[,¢E:À½CÊÐȃo×ðAâ-ïÇYOWÒ¾”—¬>¢õ@2ÊÑán³BýÞSùWºýÎw›¸¬P#rôü´†‡˜_MÓt,ço“ñ~ª+jw3¼cÐäSÓÀ†}K‰ (®^ª÷¼:4îføÍbã’ðêÄ1óãèÓÊûºA GlŠ©.ü Ÿ¢ŸF—\eÁ$,ç=RtQÇ(cy¯¼á|Ðٜϖ^yîÌy…ìݺ¨©®)ïQ“‰Ÿ¤Îº=–) uÚλ̊“'v‚/gêŠCê¿B%Ñ å·-îÆÏyX«e Ú¬j'ÛM(6-P™Xˆë”i`$jn0Äæì“]›'¿Ñ·Ëû Re×S¯³Ùr;ÈŒø*Õ_žJ8–gÎò}Ñ@¡yÃüÐÑyHŒ¼ð½Ø³fÕÀŸ;¼Ôˆ$ë¸fMAÝjÈçÍídAf±üv5éÍ"Î}üå|j´ß’gðÞgy\³Z-©ÿœ>á·KDJ"ãXBªuÏ/ÎxoÐÖv8ãÉRðf½Ðæ´V±UÓû"î ¨zÙ˜7ö°•b#ùɯYâè3ë†E˜¶ÛIÓ—öžmÐÌõBÁeàKñ†ô+Áîy ’Äã©Z»@Wû6„wGïe¿0Ò(»º!·aÖðÓ°W2ŸÑa Ý·¹Ú6uI¢+1JŸ…“7?>+â#cþ(‰n9» N@“KÞ:ð%Ký¶.யSí²”ñ‰ã¼Èrµ‚–ɵiXM`zßO´‰v±MÌö*¼ÕP¸¾›¡a»ûJfF‰ÀåTŒ íï-]h/õ‚Å“ €¹Š î®ù¾cß:”DôûÚиmEµußžwÑôP]"÷¹Dx - Z…¦éú­æò‡7æË¢Ú6yQL‘R‰¤þ™­>rÁ]Uø3Òñ)+Àø’‡'uÙõd~ÅiÜ"rhBnк Y™èÖϲވ5(Qõ0?迺º€¯gìÑ{ÄKÁÑ“ä=âh­ÞruD¼·áŽçm ŸÓ‹ŸGò>X©ê{re•:ÖÞì®aŽ:wb]Ó6½©Ì/U<ûÄÙ‰¥vðÿ\£ï”Òõú®|ä •·;<uSÓ‘÷rÐÂ+ªès'œ8<_ƒBÛed•uEÞø8-Ï&¦–7/1ŽäЙKJRh6fv†Ý°—Ä,ŽÏ"›­æÎÀúôFÈpQ~R“Ì+®ªäUmm§åÀÃ|Hß›þÀÊÄúÈß+ª€œ]‰,@þÑPrnÉCiÂzþÑ_Ž͈w!²6@=„ž¯Åí:è_è$Ú—%š÷iý*‘{wÙcÕ§R¿š™ðZ*m\ùò‘¨$£pà¡IÀÓ©v$ßÑ•P5ÛâÚ¼E8v™Ë£h³È嶪„Èó€õ'aöBð\h…B4ƨ Z£8®–çxåR|¾]æMUd¡ST˺“Qjuü<ª »ÐÚæ¼òÌœ÷*m…Jƒ£¨ý°VUÿ ãúi[¸Å<ÖìÃcu©»•p^_osŽ~Ò{6eWÿñs>1Þ$ü6%h¸ÝTáˆÛÙX½%8 ‹Ó ;+UÆ5NãïVòïºô9üv~™®èÞ¯sHx?-rj ;X¨ÿ7EY]væ•æÍ»1®·vx² DÅ]z,®”¬8GŸNTÑþ›FÙ„øµ•?¬¶œm°3µÆ)Jnte®ya}Ã1îogTàø­Å±зIûz'LÐéÙ6û&‚Ïãl® fj}[ÑVà/ )Ó ,˜n¬Šš)WÑíâ–/úéÌ„ed)¡ˆÅך9>ȵuÈuõ,»såý`ëó‘Ëà˜sÅ@ÂÞÝlçÝ9þRtþ‘²ø!&!³õhÈr"0™™öñÁ>‘«>yšÝñ Ùöl­â8³1Ïæ “ö¸Kp¦S%iáxç^î Ñ•ñ­¾,¼ú+—Ò’Îð(=ë¥x\d{8GÖnÿ@n6]è¶ ‚·=Ÿ‹ .+]¥µB-H?sÜ-¨'=hH–šÎÂ_çbl_Ø.†Ð ÑS¡~ãe¯ ¶GñQi›-:UÙ»paiBAòGYtE šU ;kŸ^ˆðE•Ú'ŠêXŽWwž Ä™­IL˜!BC¢‹Fó-2ù„–÷£ãÁôæ$±K%3›!b¿hYŸÙÌÄ}¡Á xF ‚ŸaâÙLóÕè_Õ—6§"õ\~iïUÖÉ!!AªÝ : åy}eÌV7{w;ІmZ)v¾tÊ´3Ö–Õ4¤» Ù¾Ó»~z¬IAŒ?–œ2-øˆ5KXÎ,4Æó˜“Ó?Û˹û¬A°Ã™Â¶MYÂo’­ðqcr’õ´ò ‚𛝼ÊÿŠÓµ…·=EEeô£E8•†³áŒ-Ô" l/'÷–“mq’ÃcymæiݲUC>¦#0*Ð8Û©f«ÿ|§Í‰gY‚Ýx¥M5éyÌñ·ó—S™èœ(Ê‹»W¨Ÿ`²(ŠÕÓ«»Q3%A+{M"v!‘<¼Ë vóÌäãvhóSôGÔN–Š‹à³ØR+¸›’ }áåÔÛÖugDÍAÂ4'“õ‹áÀ]$H¶)ñG·£½ßjY:5·|Z|ò_ßeÛæXËüUÐYÁšñfw5PÃP÷{øfÃD±î¹9ÈŽµ=@óï”vÿ$eàïÖ‡ºž£§ÈŽyëã©¿Xž$)Ÿm sk´2uñ?§ÁœáÆ7rþã_{ëvnQh/“¸~÷(‚Ùx‚œû}dE>èÕÒ*0oSñfLåêÆg|Ÿ=É‘$lMÍßœ¸E¬$ùÄÌ›äÖsù<_öîÈssê7‘r‚¨ñ1TœƒÅÅEáøSÇ´ª:h8ؾ•Š*RÞv¤u×8˜mŸrÚ$9Ù* Ÿx;0H9ôaÄIc—ýPZSô3ÜÒ<:§®çÓ‘¢­9è.n‚Pϰ3E£!à¹*ÊG7B9ÖCѵ' hVuz,¢sZ{zv.á+ÕÓð{ÆœÝK¤^h~Ô`ÿL:lôÝ´ñCp1Ú Áº]‡Q¡™¾€ëàES¨¾‘ì-²®È¾ènô÷ ‹Úü™ÏüXðk­[¿”fyå¤B«”ø=•~DœÅZ ¿fªðÔ-Ú¾“c¸æ,L„ ¨€‡ÒnÙù½#Þî'¸¿òÿ|ÄögD&ΓÖÖþäU…ÝWA¿¥ý±ff™»ÿÏ$Å ðk/Ó²õ½_‰‡fœY#RÞÂn»¾êÛöÓ?Nƒ1k3Úm,¨ Ò5ÓR}gv '-®Á6“ìÞ‘VÏ*æÕ‹ï¹¢7’!Â6X©ñDh]Çsd»u® 3á@Âßo×ÿ¥lSe;Šß^' þNJD £±Ùs[© B¶ÐWöìw¯AÊ9ì­I¨6ÇŽõáÕtèŽ\ʶ Œ+¦|Ôù²29•3$;¦˜Õí{½“- £‚° HSÕüXêŒ$,­:Ó'ßZÕK‰ŠG5X=Ûׯ–tíØôÓ*”AÁ™ÅŠ‘¶âÝ/¤Å#–å0`.Ü{(V§yõ¢œ$S·K¼DedèÖoID8ó›u›fïF­¼•5ø+Y' sò}™jgÑ+¦7’ïg*]uŸ\¼Mn qQ#Ò~ÄDó¤„Q¯M$/¨kÅ ò-„àF—»NœÀíˆåÍË7 (Èfž…G{§!,ßÉ&¼º™UÈΪe½¾ž%ÂɦôÄ-~øè€´ÛqjžÀhYŒµœvè‰&k¼“²ºO%Ñû¿yZïIÝW¹Ò©µÙú:72'àK] x÷·!³v€]ÃnPÉ]Nž­ƒHSBIÈÓ`øDž^†¹Û5n}† ÈÆ+ Ê{‘´|3ŠÝ/ã<´x)æ®þÁ=bÐ}Œ’hYâÔëý•Cšà‘ Š¥'´Ou¹ÂÐ|‡o§ÈÐr y}ßj'—)Ž˜«\¢,ç†þ¸˜£å!dË`€æ¿8Bj«ªäQ´D?eç±meø—öµ¸åϽ89nžTÙ®GoC¹WGrŽ!äÞ½*bUº×‡÷ðQØw·cðÌxS¤œPËÏ©mÙ,™û‘’[TQ½¥žs@WA;®üÏ ¢h N*Äây±çΊ§ÇΞ¼#«¹¦D,úßò÷ÆTk‚V u±åP .ó‘þÚø ÀÔx¸V›‡}©ó¤´£©@côAº'Ž Ókk Û|µ +ÐL1Bÿ¡I$‡CêŸØp–SmžÉó¿4—aZ4as7óÁÛFÊwÛ\ö*¬÷Ñó.¸?õocp8r ì÷ʘwJÚÃJíDÅÏ?°h5qå¼Ëuøµÿ±¬—WJzs;¶OP“P0¦?gÙœé§ ~}j&@b5XÛ(Ar»J-åpïÂ:Èÿ0‘ÞË0».¦3âUp¿ü"ãAæú4 ´ñÕŒV •¼d •Š©$6ÿËD`Î(‰Ü*ö~,@É5bè#LÇn/4Ì‹-ȯ3è\)°_1‰¡ö:ó¢Wîb;¢Ó svʾ08&ï{Ö@‹èÁ §~îç]´GĤ9È'ñýÞÁ¢ˆm‘·¥…}¿£S”Í"ešª^ÞÖpBÖOóÂN“n!é±MçÈÌ @œ –{Nªèû0I”#¿y<–SNÒ® ð]5%xùï¦u?$0·ÉnE.> ]ÜkÈÕ]þs¦ s„NÔ8¤º:TÕ Ö»ÐgC‹‚²¼#,™æ½‘ÝÍZŒ}yœ>)áñQtßJéÞI‘¿á„YV€ í†e ¹à~dÅ¡ð07œfüšÅñQJUq'þ-¸J¾Ù$éšÏΊã®Óß§AgÚïVU´Äù¶ÉDå¨ëbi¥aöä+£_ØG§ÚÓ™UŠйYHÒ¦˜~v‹»Ï"5Õ5a„®à¨ÎV ¤ŸÜG^$rÐ Aðæ^c`¼í{}ÙeZH9Î9¿kÅæ( ¢ä·1¸§Þ­?¬ï¶¦QqÆÇç¨ kê²R®ðn‡Zz2ÀüÖš­¯Â’£w›SzA5þ›8¸_÷´"Ù¦nÙë³è5/m'5vB„@eÓc˯õ(š—“aÜkœíýÅh eµ Ç„ÕúD"Þ2wþyÀO–÷땪‡…„¨«wuCkoV/«3ç‚Ï:ÂM®ý†41o£É‰û»±Z²Ùä|Š2 ŸÕ¼…u¦’>XÞ'Iþß$–“Ùöðù„´)Cðék{!ô”Yï|œ˜ôåȤÈ8Ìxe6©Ûnt$Ôw™ž¾·N˜¼A³«tåÓIçk±s ž;˜¿ŽC­eÙu\“@ØC>ÃKÉ+—ÅÒ { $¼2X>Ås´Ü¹}U=)/Ìt~ŒÕݸ`¥ÇdªÇûlXb¨WÂ$5[±Urñ"ü]gÐvÈ øÇuˆzh¤Ïý—a=m4³ˆÏ>ÝS§»¨ÌB A9‰üŽj>­²û СVˆ8hìFÑ;Õïjô®¨º¶¬»6è赡*}Õ° Ý~G]„²ÀS=ÏÀ;ülÊxÛ Ke˜_nX¬]u¢fÐ;3d r¹TèêÁó6¤™î¾!›'Øë¶Öˬ—[¢‹=Îë3‡Iù*ö^ åidFÝÅÐ`Ø¢”¢MÉ–éµÞ¯&—MaÇÚè;¸ÉSþK£fa3ueýù6€#ÀùiöÚƒXÄ[æ‚vñ¡:b)|Õëž\žEl4nëE…¯ôԜ޵W>µŸÐ®ðÛ]ÙˆQo\¿ò\c×SP¶:Âê’·ÿKÝZµÔ›Rl÷°›ÊÞOåÁ6(аْâmvÓu©mŸ®Ö2ÀŒº@ß|›ØÅYã?p¿¾Õ%×I¶ë«†Úãèx;Èoô\{*VÎ ÁMH"b¾O ^-C_ÑB%rØåÀ²8mƒ×C.FäÁVDÂùèò·™<ÄãÆþÿÕõZ¬ où³<ÜÛÊÏÀÉfÅÒý$p›§fä{¾Øj«Ov?è)$¶Å«‡EßÓv /²å¨ c10ªÀZسTgþNÕæ95²> stream xÚ÷T”ë÷ ÒH ’Cwwww#=ÀC Ý"-!Ý) tƒ””H#Ýt7ïxÎù<ÿï[ë}׬Å̵óÚûÞû~¨ÉÕ4™Å-Ì@2Wfv6€¤²–;€“…•šZ ìjúŸ•Zäìv€üa!é ºBeR@W¨¡² àf`ç°ó°ó °±8ØØøÿgèà,ºƒ-Ê,È•ZÒÁÑËleí Íó¿Ÿ:sz;??/Ó_îq{3Ø(]­AöÐŒæ@;€¦ƒ9äêõŸtBÖ®®Ž¬¬,@{g+z&€ØÕ r9»ƒ,¿K¨íAÿ”Æ‚J в»ü­Ðt°tõ:ƒPØqº¸A,@Îhv€¦¼@ÕùÛXéo&À?Ͱ³°ÿîïßÀ¿œææöŽ@ˆb°Ûª2J,®ž®L Äâ·!ÐÎÅêt‚í€fPƒ¿¨2âê ´Âês1w;ºº°¸€í~×Èú; ´ÍÒ I{{ÄÕõ7?)°3ÈÚw/Ö×âàñù²C,,—aáæÈª ;¹ä¥þ±ŠPŸdV W7''äyš[³þN ååúKÉþ[ ­Á×ÇÑÁ` -ä ¶A¿P}\€î €«³È×çOÅ*;;Àlî 0Y!¨OÑ¡båßzþÎ`O€tüØl¿?ÿþ2‚N˜…ÄÎëÉü¯#fUSÑÒU“dü§ä•žfv3'€›ƒ ÀÃÏ ðýo5 ølOžòKÿßd¡]úa÷&€îŸõ ü7–ŠtnAº§17dãf3‡þaÿÿ<ì¹üÿ›ñßQþ_Çüÿ2’q³³ûKO÷·Áÿh¶óúÇ:·n®ÐPv€näÿšê‚þ^\eØÍþÿjå]Ð]‡XÙýÛH°‹ Ød¡v5·þk6þkÿÞ3;0¤æàþ}³˜ÙÙØþº\æ¶ÐÛÃ:’©@ÐÝùoFiˆ¹ƒÅï%ãàæ^¨lÐIâàæø°C·Ñäù×XY ®P´:_€¥ƒ3êï#åá°Šÿýx¬OˆÀ*ù„ø¬ROˆÀ*ý/âe°Ê—UŸ¡r¯H¯Öpü:D;“@fèÕERÖÏ@')g †TUáH¡ˆ \ön4¹#Îe‰¤TuªÆÓ†[‡ÓqtÙO8áéY\qsÇ“¾ŸÏœLß—ŽS7–¡7yÏ'=«qí迉¾PË$ÜÑ£C~ÖÎò|–¨ªIa÷ «-ìð¹výMÖje†^qè0ÁŠSh²µ·“¾M!N¶a¤[9œêhÞZôŽ5n¯á2¶kßõ™ %:ƒa%…™X*íæAÊχQ‘JJq*Ev5X×"çÓ`Ëô`'4ÿ)ó°<ÍEþmLý ÚŒ¦ã£æK¸([mÊ'›u÷guœÏç7Ü)eó¸ù—Ò¡ÐD;7ø+Ŝպ Þ¯4ú Zš¨0y£ô¬æäîh¦¤keBwd,Ìp²™Róæ*=zSÎoò±UP¨¶{_™e×)ê…^–_‡©¦°^÷:ö¬æ’}ÛïIò;L!ŠhËúbI³$ Ä]PÕ³¹ß*‘*Ó ÙµÛ™K¢á‚{ØÑ,Ìpe‘¹ÁºÀº€(DNÛžÕûépzs_¨Jz "ß1`J#;Q¾Í=0f»UücYP5ís¯~ÝDŠj—ÅŠy`=a¶O祋ÔF&`šü˜z!C2ùÄZñ,Yôë{X)a¥€­g‘B\ñßqa_ç†"‹V1»gleüÔ°M{é±~VuT´ÄÝ ;èÎ/*ë×N°2§€_€Á J’®BŠá›b. ŠËó7Z1÷J8fÿÞ^øžVëDûƒÛä)±P, úÞy¦“Ý=ŒÚJN AËPÃXæ…A}qɸŒî  må°pöûíÁÝÙˆ½hmsäÈ¥Ñv–ŒÊYM{|¢4~Šp.áëiÕÚ ?r› ÔïÔDŠ€óËïø¸ÃèŪš‚†9RJr˜ †8ÜêJò„™7¹Òâ½ú2xœÆúÇåE·þ+æ•&+Wpæj5•\8jÜ®fØÚë»~á©,,ñF†{…_Yd‚hFîÄhÚcNšù‰ÊËÜ%¯fõÎF(^X­ˆûª­„øÓ6G܇Õ!–XŽÒ|>B(« ¦zÈ¡  ?-M@gr€¥I>OrËUiU…ÍØ–I&Rö+ã82ÖB¯52=…·ë`[b“¾"µ=qüñMõõ¹ù΄gº<Ü1µêÅñ­ý0ºøpo†YÉ®måçñ:’²i†ç…qZ׈Ê$îŹ?yñ%Ló–ô4O&¥üTÒB×´èD*ílĈxQdEÖó·I‘p”ßôÙቌ’QW§†×–%ètF´ç ˆ Ÿ,¦ \ÕyÈ5YÊîÑÖÕM¿å7ÊÇæcM…rtc’µOnQFZÛã00·üüÍó…VÄÜg[ú*__*üŠtèŽgÚ:¿è¾½j^]ãçc-të L§ü¨•”"¢é¤?1o572"ÅNÅSÌ0¯þd«5sgßd髾 M;yNS­XÎÏ{]”¹<‘Eþñ‘Gä·.­Ì”磨¬²r‰Ú`%º¨ºR¶Jã–Q5\Ñó#˜œÙãÖÄá‚Ã&áTa6ld ¤ý¦IòwÄ–$ਅgüQú•qñZ.Jo‹9{U R]ïª%)³O(^oùyS¶»wjT);ØmfMP/Kc¯5 ãá©)Á/sóMêÜ`’™_ß²„uß¿ÛqÊ€^«wt=„ëæãáÁ^÷ZÂY ߸¿‡Oá˜5GåfJ'A~sÌaá&eÛNvqÜ[hóE;Éò¦&)_ŒCôǬ!88¯ °œrµÚ˜†9^§æòŠ7ÖNÿÅÝbùwq”«ã—ftÁ—p®¢šAöF5‚(!Ó9ü foL™^’ñx'EŸ6w [&wµYÌ2~èEvCAyãÑ($J×ûJv*7À _¼Ð, ·¦imjÁU¥üNÏ-ÍD4ލ•¬:]}Zè'%©Éó¥zñÖW×0Y®Z?_Y£¤öu˱µÑîn¾µœ#Pºklr¾}8Ö¿ªŒ€)cð¦Â1)©aå‹°XF]'”­¢Ö)Þ¢ xÝMU󺢸ú”÷+•l‹×°©G¼Uñk-gêúu|Sž¾=ïà—\õ ^E¡Ãš25—C¿ Ï1–@…ÏðåThåjE‚æø‘Î~jtaÜßàÕ•à6“¥*:‰—(oøÀ)ÛîHí¬¡.búóèljÇ)_Üæ®Î,ä6£,1Œ%7Žá˜*¦š|k®ã˜!lV¡žÍï¯ë9bÊÅJ3 Ä•^·ù)«Ö>½Ì"¿V¹T Üæ«œ±.†ÉGq7­w˜éÁG™ìŒwî úú5o±4zì ×Û ½<Ë& TÒŸafƒ17CÑò9çGþ0Ã#€”æ¿`Ÿ{nÝc‰Qѯꨯ”SN¬Ä.ûÙ«–غ|ŸÎG< ÇXÕÕ2¡y—*HÁ6Qc!ç~ØÐõÙ¡›ãm’]n€PÅ¢W¤E—µ$lŽ/ÄDI®5ä»ÇáðÑ·V|ÆUy©B†ßϵ²75¤wÝ·È0€ö.¨}:]n¼JÈÞ¯îfd«ÚÇ’nBàåŽÞ5„ùßDvÞï*ó‹ÈÅg]±eêê©/:Õ:‡õ¡[î\nH§¿Ÿ—ƒ‰ª?9™Ú=,[ÕõYFåÅ—⦹%ˆ‘³>“ þh÷ü|$×Ä0tìïfËÁú#ÿ%1Æ8ŠÛ¢oÂf ŠhÊE{õ³ÅÌ•÷çbg—Íz¿}ëà®ÂIö}o[Í@–êüOÀ„ΗÓíoøaæ$u™EE‚âUµÅóèl…Ò`¥{bkë° tVr_™Y”äRlu1%kÝnÄ}u­gl*­÷Œ¾ìcL÷¥Kj7¼®Óœ.*Ü$.+Í|`£G±h9ùGp†|p¨M˜¯M3€¯¾yqMéb@T>säê N«zT‡Uÿ±¦ÔÿKðnîÑ t"-yÛØçá3îvlT±—‡/ŠWgC_oª'^Ó„¶Îµ/;–VnÞsxZi ²z¬ù¯N«w>»©¢ÅÙ¤½2¹?*½$¡¿²¾Ý£aQzÙüXP ìõh[*ѸMˆ1`¯å˜{-–nê>ÊtÅûë6‘iã+âÑUÒns\k’,SØ×ü4I®ä ÚÕÂP–˜¾Fú GCpa˜` <&Eˆ­sbÆ9ûÝâð;½ó’2‰%Ë×4Éy_\‹JùŠ˜ôÄ×ÜÒä(¾²wiä~‚n:­Ø©q9Ð1UN¶ïvO—÷º|Ö^Ìh |¼VŸK‰qB€ ÖÍ¿o÷qÔG(BÉBš©˜Þ€µ¬ 7z34<ž #A¥ªV×TàøxO|–¼;-%ÅHO^o¾$B8b=óæUÈÎùAZš Þ°6“×Ð\Ü­•fóȶn¬ŒÝ‹è)ǼWåíâo«IŸÅ•‚JH;·ØiÔPöÅup«Ð‹õk ¤xÏú®²_õ„UØã[ö‡;ãW™lílRÿ˜»”Šêr«e0¹ù˜'®îhõáR›B•ŽãÇ›>ƒ(Yç‡âg—I)ÜDåï J³.ZäÒÊSbª`²ûŸ‘¡âA^ÆiÚfæ¼µWtÐ(þ(yß–”¹CsнHœ„àMèêÿù˜ý¼‘ä9÷{pCúŒ&š(3Ã뇉#Fç/•žz®HœÓy·Æ¥l™hÇ–#Ô©³¢úî(Žì•üŸCØüsz²ó#§˜wt{K»œžÃëבY“"ƒßúŠÖ·•J]tÒ&u N¸J¤eÑ`½-tÞ¢?´µm‹óþ–AŽWaDÿjŽØ/¥üW‰ë娰BjçèçB~¹´Éd`2öã”2œcy®íjQÁ¡¦†rÒ¼PJ–Ÿ8Ÿ)+ñ†wG¶{TÔ”=œi #Õ(t2ç>pqÌA|§ËŒÁ$\X—Ì‹‚/þÝmqŸð ÉS82\и~|øFù“ ÀûfÅ-á qÊbsžªyàðݥ̢S|Ãס#ÿµ³ð¯y³4þ¯Hhqú˜æ†ÛlŠ.ô^n¬ˆfFWQE²“LûK¾ìϵâá÷²ˆàQõÌåéØÂ:Ã6_i£dÏÎyNÚgÔóaç>ïU9†jÉnye’Þë¨q²‘TÁÇlÄÊP˜K¼ö/ÛÜðǬʴ¥3·µˆ©ýl³&Ž[ïÓ·‹S"+¯Y/…LZ‡Õ¹±g·¸&ÞÛ–$´¯ªa(´ãòÌ‹o vµ÷ü„ó°¿c¥’Rë)dxõ«§]›‘=ZÓë½™x¿×0q)a¥ÜŸ˜ fÖN¬Ù ÃGBÖ[,~㥯>y%lõ#òоKk9ñð)“ôíÀ÷§2¢»#¾§u~®ÃFhæN‘¿C> ³«ð5år)?ȱòÃ#¶°wå—>•ÎQ÷ÈÛ;–ðZüyŽçôœ/‚`}Ý®Ï è:Õβ¨2ŒÇ)L>§[›xEQhÂ|CÊ Z6ôüúŠ[·/"6ãã‹[ 7qž“vqÖ î2‰¶^ç‡M:œ‘ÚkyYùi¸†%}rÖõz‡,!tj78,FïxxGnª/–¶ifOéÚ’ÜÏkùÉÏ;¶ÔsæƒÕÜPŸ¼Ž*:QojVDÒ—]ÔMôo¬ÃF gÅŠï€Üpw¹È65|ˆXÓƒ9?:Œ¥'³OoräñdIê°"±Hj(u¦{6ÜžÛà—ÏCfK4߆ŒÁ†T_˜«.:Þ©Sˈ¸ýØpF;8s‹=6Àö¢ˆN{=§Bà¿8Ô¿PüKp¯:ô6<žmK©ž¹ãX®‘ü«£ aø·k[ÛþÀ¸· {-V­7ª˜ö„ä r„‚둎9ß¶E±`Z;Ñoàæ ¤o2üìî8'ÆM^™ÒmzÕáKß ˆ™:&ÁýÂ/’ª‹ö4íƒÄŽT’W ›µ¾ÔøØˆÙ>þL•@½°SMõ%A ¥ºUN´ï ¿Wæ=§&FÑM#y›tßìɶ WÍrÏ­ J¥Ÿ– ÛŽâÊ+_tA/›/¡ÊoÍ%DM §û2/ë3„Jˆ^¼ýµwmõ\üjµžƒëâ—Øšç5ŽÈ,†Ÿ³½±.·(q¶YS³Súƒlf\Ó3Ø”7À¦‰/ˆqÖ¼ÛÔJéÓš¦–þG›5Ò²öã÷½áÕ{”[ìr8«ÇÄíg™« uÏ6­zÊI±ËÍzߌÎcš48J0úô:çô7”ØýÊêÿYé<ÌzÅARN?É䛺m÷vc·™%ákÞKý­å™öëï€)H¸ž§>lá¶2n"wöñŒþXë&U™Á^-4±HÅ+“øZ%?v»áƒÞ@D1”Ní…Ðd¸’*YqfÅ73tž;K²ÀÈÓ~‘tÊê @ù¢ÀG«£@fÀŸ ûbìs£j´¢ñ9/>Nƒò4MÆç®Ëb®^¯:+Íø®—¤Èo`íè¤,%ïf´Æ ½ )˜qã'w—åa,'<þ&8Úo°8!è² `^ Tò® “s'$½­¼Ý…“-âü0Ä*p¬ï«ò¤Qйř"h¹D´¥p:æÅtÉ-ʰ¸²éQ»‘¤ó*äôÀª9Å5JECÈ…‡÷„äù0gÑsÖt{?Òñ]2–Çñ®vÜ|ÏKŽî7œa.ŽQÒ",«™ßï˾7™y€»Bi$ºƒ!³‡Ãa{Ôyõäü³ccYo´ÓsñÛtä*E¼ÌE»*Íaç"Zóg1Ž'|cxtfYA9Aæ«ëÇ|ëÀ8<|„ÙÞE¸êe üÔ¤Œ¦¬úNÉòòGIQú…†+³Õ{š GÑØÂrÌ|õÕóõ’Õ ¾5wA‡5bØÕ«‰xHÑ2v¤¬¨^ÂI³%S‰ð5ò¦Ö»9¶u»£_¤#Cæ,)&ë™;!¦šU2»o[l¾zr lЕõ‹ècÙÒ©6ROíO|Š!j7û-¹r!=ÉTyðb—ÿŽ™ËX*y˜æbZz©Ù€œXâú¹®ÆùXnœvŠJ=%»u•+÷ÎÛhßêÜÜ­q¿jÎ3`¾­ö•²2Jˆ\b³~@iÑ®[ªï$œF9}}“ªÂ¾Çû\nÑö…zY±Ô¾‰·—¨6zW~ðX}3ϛү9Þ»éÔél0³¹T“.Q?ÎÐáÞ¦â|øDÙ5Bv¢—µŽP|EÞ)gkò®è ½ËZè|**sLè˜.ÃÔHa1“q–¶çtÓ,² ®ö›¹Ty+©ÆFÇ›’Â` ÍË6«x˜yƒŒIä¼o£·‰¡cUZ¸+0—¡í:k cµ3‚ñÇòì©–½Ö$l2ßÂŽáåѿֈ4²z5P|qÎÍvƒ |¦:Es¨§‡Ä'GÏþB†}âS÷Ú]l’)‘\ÇJrpoÛKÑ÷Ö ‹M«¥?v…}¥íA¶³¹cKI—¶îË/­#C1BÊ}V Å ¥j¾`§nvŸzé3“J=†Ü+KP£Á€"€L¡|³ý¼ã¨^X¥Ç9 uBŠSæÒÈcµ/ŒÒ¾¦ Aüy.dëôЮ>z!uPˆ¥±[1ª@+µÁì~t3¼3"˜ª~ÇÄIÕsÀ> nÃ?GÓxpº ­A)ß[ÍÀT:m1¼µâ&{£éÒÓXéImÒÚ,]Þò5K²P*DjxYòŠz÷>n¡Wç—r yU{La“ÅDl"¬Ÿ1]Hö€ÆŽ„Qi‚úÌÀx†-ÿìýü%…U¬B}Uø¬¦xBBñ£}ŽÌußX^&v'芘4Ž­ Ž”¶Ü†þ0_MQ$~û•}cfBc¹”å>Õ¦½©ðTR”[¨`ÊÅÈTÛ#;2r’[iš¹Bý+ûá†I!ú1—Ô;—û·êÉ»A7Ç<ùqÔ¾"¹îa /°å|¤n³Ž ü²zèåMò…§v ´ös'+˜owðOÝR4+.Ð-åLòVѾҸ iÿîå,ìºÜTåµcÇe]ÛùƒÜ‚ûÞ¬ÇÉåuäZ¡LOm?0PŒmÁEqÔæ°Î½'2™‹s„PµæVµIÖt²ÙLÃ$&!6ü’€tÈbð²ó¾@ŸuW-£}æŒËθ[XÛ-e(iÆ`c«M 3•4¼OS€x\Aƒä%—qëÆèÅ>ºŒ±B,†OÚó¢ÆçÙ¿«ˆÀÂ}†7JX„ˆ%S“×—¡ÊܵĊf0Ó×>p¬X—œê˜ðHÆÎû`-ꮤ_Ašwžî×D#Z‡¡-i˜}-_?0l‘Ó#ûˆØ3Ê¿””Öü^I?+˜wp*Lùë€pµ§ô2”Iml•f–äÖŸD²è›ÎtSD:íXÃGÇ.ôŒ+= AÝÐAgyî°!gNü¥±4µR‹¶Ààü"á&×xìö‹ÞÙø‡)ª‡m4Ï6•®¯ŽO#Xš"G€Õöm•±bMëúoÙ×Eĉ.NfQ ÄÃìg1W6×Õ…5«ˆ¨CuÏ^ÜòÃÂ[tªM¤Ó8¬ûÞ´Tt»D˜Âñ_{µdñQðTvðœ¸öÙá¥æ§©$§ ÆHêšç„í)†—ŸižúÎGµåN›•G¬Á[\èÙ²Qt ¥œ ™‡wmÆFk¹B^³Å˜‘u²õõ%„ˆä“xt¸„|ïô"”aéûpàzrJö[ÛtîZK IlWׯ·»cl[%fw(Ÿ…tÁÙÈ+¥¯àë§Ç,9Þ2I¿I•Yô Ô‹ÔâŽ4¥{ Ç, Œ­ÉgôŠiÁÇùÞÈG^ e½hÿíÎZ7Û6'÷iIñ|«Bkо%ç5˶TÑ<ì¼âaUÛâѾ'þø¤?j¶›áǯՙo¹c}pÁEñ6] pôy#/Šð×ðŸ áv6aM"TYÃ}’ ýPiÞcsáèˆPŸ`À+„Âg‹õKóÃHÞî„VnÄ'vu=1N9îC °Š× ›-¦ÔÒpòOx Œižº§êSrzfÝ 6¯˜½<à4 — ´?Ž,"äe·Ê7S†ùBÂ}"0ŽÈ›ë¥²L!]ßÅ7øòkß`Õâ´ëJ3*¤Â‚—ê š'”Hl“w¸ËæT sÇø8‹ –› ³ü&Êo¯›Dl¢áG}4<àæÅ—ˆŠñP\¢}´çxw'¾]¯4ÈÑÜsêÌ*w:WšÕZJ#‰*êQ¬Gæâ[ÔÏêZºp1ä¦kQ©Ú1¯uÙ_×ñŸœÃ8Q‡ ŸMâÙVA·ÙCäs\á)Êšõ0t´9-’¿=ª×–)×Ð)#šÈiW‰äåÏÆJ%Æöƒ5@™v»"¥àd¦cà€¬ÂøºÎð‘èNPˆ83&&ý¤¬eÒ †\Eλ Àóö–nCà\ÞX>D¿5–v¬£îzý‘¹Ek¾瑬j& iüñ¶ÞU +ºö#¿ê•¬’]³ Ã[µN‰I„%pHW3±&{%åÞÝrÎ÷\kF7¬~Fµ¹ß›×$ ½*B BÊz%,ilÔA²Pñž r™«4 VÒÌ‚S?ΆZÔà i?xÙÎ_bÞ4¸³§\àtA&¿•¸"(ò»õç|6¦‰cÇèšW­MÀ*B-8ÎT%ßn7tO¯­Pˆê‰2¢KĹŒž°Î²QîXø„#ÿ»ó-R?´é02ãÐñëÍÞÛ¡)U¢ûŠž®¦¸¦˜xôq]ý¹\!>¸B *çÂÁ­²ÓÎ *—Y¬Ä|ãñ̉|¡FiÎjû‘˜o_¼+ûQLFî »)ï‹ +§Új$,ZeXë‹%”v¹p%y2í¢>‚€"™ÚÍÖ®0|¸Ä°ŽáߣOJ2[~–Üò¾:­„nJÚëgu¦þÚFcµÚ³œ¹N âO˜…AЍ¶Znb4ª™#¦v%Z§a_- +ãçUf*Ø8]ð^ðÙ¨Ãç,Ù£0kÔ¼¢8æ}6©WñsØüŸ?–vklh¯Bä©ñô-†Ñ©ûyýâņoØû—…šÃèÊëõÈÊâx£B}«Ú·ðfÝ‚òõ`2dáYpÏOCÚ— œ‰ `c°©ñ ¨m^ö‹Ÿ}Y¦s«+ž©\:iùWcuM¦,t°¼0ÅXýŸÚÍ\?.Y²¿ÉârãÄš—™¤#Â˸ë}_òY=ôÂh1xm à:5ôªº@‚Cr|=¼¨F4—UøD@‰ŠJï–CØ13dèfwØÊ´!ó?Dƒ‘ƒ¡ á3µÉŽxŸnoqÂÈÛtÃ9øN-å9®if³ ʃz˜ŠõU…e^Mèû´”Ra žøIxá+ñ¬á°4rƒ¡€Î)|ƒNeÓ½Ÿ}19]güëâ‡â=à\Û±V$ÕŸž‹Ì1U]Y‹”+ð ?ç¸- Êš¢´]Ç#æÊVøëVŒžm[È}‰½Œ|Ãx³©—ÿæ#º¢¿|mØçu{|UÝþcE®»óA.ë7Z°GeCºlû¤SÞ•Íë6yc±àÇ¢û]¡^1ù•áãu¢‚¨9k"ðº9eÍÉ¢w^œTdóƒŒý5_“B5qKொ[©iÅ„ÚNúüI$þDª6AÏ;P“ oGŽJYËÇq“¶ephgƒªœ£ÌòâS{×ú=/2çJϧKúÝ@‰”÷ZR­>Æ’§Œ«]Ö§FˆŸÄƒœ©F.ªý[4¼‚ ˜°ùÁ'P”„ævÕ[OuvW¥f–.*"fÚóM©c±DG_¥²¥ZæÄßþš–êª@ÛïùËBëx©—9rL½©r[$›(…H=g2!hqáÁ¿vm(~¥o~!ØR`ØÎ߬¯ÎµÀwwßÌx%Q#ý[YAf$癡é2å† ÙW zeeöÖ)ÓgßyìùèW:Ö|‚(©pfœ/U°½Cœ~ýILE©jÀ¨óKÇcôMÛÃ{ŠÆ‹KLÏz¤ç/AU¹¤”û¥ï3È®Íæ@¦1€røÞÍú•á—sâ‹¶*¹Ûà`Óï»c 2¤-M£[µ,öúñæ™ÕD¸ÓŸŽ^\ðÅy' MAô¤~’§ÄÓ€•Nû¼ghBU,˜‘:¾ì‹2Èfé¼ÅÝ ¥^æzÈ|Æqˆª³ô)U¦º]‚K¶ø§†öM]™GóG0ß®2 sðÐÑ-˜¿®÷ÂùEFÓþg‘ÝBÕ8êó·÷ç†_€Œœßîá gJŠ.GOÕ·CŒ“šÇ÷ó‘¿½¦3ºå\/EðïbÑGŒånꜺ"ÂmFH/rèaá îtðgÚ›]WÏT…O§ö‹Ø©»´Uÿ'H3ŸÇ%ùZŠˆhYtô‘ý„å;’@?ó5ö£ßµkNbY&=B¥86N‡sä嬬Y>ç³’ž– nµ‹¯ïàö~€CΧôÒ7L¯‘·qôïò¾ùKÄ.ä 7ãèN¯gz²éó‹âºŒ m´ôúçM ;ÝÊ =n $2N¼Ãd'}˜éËb }Í)†¹£ð].,v…ÃòåèW5Éê{tîì¶Ó/»Cè|] Wµ ê ø Ü2ƒ-oIéx­?Zªþ¥I aêv¡4ÍÞ¢P¶Ç}àV`ì\¦žábTY#ö «3‡™ºð+A¡2˜×ÉŽ×~N`—«å(}ŠR-f"½wG¢a) զƾDø¦²ßÎ:n_ÐÐ!qGÝêD ’_Â<åÓIì›>”y¦MÇöõ×p þ\Î{3öVD;?ÂÉ g3ÒÃÉ)kμˆ²ÉÒYF¹zj!ã‡V#ÍêYÄ*HñÁ¦T†‘`§ ÔLÉ=3ÔxH‰>´j‘…VV%b‹±Âý–J•[mxžzª†û“ùpcžˆï§ÕÀúhD–”Gøe7“ÿã61ç‡NA¢úYtëzžN°:Èŧ£ÓÕ†9}¹@9µµ© a Ž4™°Ö2QÛÚŸ½Ìðɧ³Ûò#ërZÙØû¨ü²N'^³ ÀôéU¼HfÀW[ T7{×L_Þ.b*úÅk/´Ä>ý´H—ïÝ”³cMxˆ³JšM=’ß>äÖ6ÈÞ°5.¼õòèÊ®­¶ƒ/JÉÀ.4dÔ6)jbÏ«×ÃD Çì!6ëÖë2¹~𶔢å+õÄ.X>ñ†ÍAôÖ¬]^QŠwCðAðÙ”øPGJ3Z£bùlïtŒú;R÷—ÒªÖîÏK=* ÷­û¥­±•¡8‚¢^¡j^r£ü{å•°•mHñµ¿i擽ï®J™£•ŸzV:I|&:‰à*ox¢ßM§×"…\`ÿÌ\~¬\Û6Ëüz=.èʺDq©ÓFÄÎUÔðh¥ÍUõÁÁÐwYº=s &‚S (̰ÆOê1T¢HÌjÁt²»ùUÎþ~Öò£}_¤zŸj¬Õ¾9ùël“ºyµª|Ò,»£WG†º~VþwcÑ á”ÊIžwN`IÀ*“Z`g˜é´É2õóísgã.ŠÞÕK6µÌ ´G¶oœW&œ|j6‡õ"°Ñ/Vm·wu´uÍcq*Z<—Nð×K“œ‹]£‡clL.Zõkê’ mŽz¼dô o<Ÿõ­\Éá9 iEá8(xîd³¸®û0æZÿ¬¢æÒ„F(¡,KÚ[±:VöÉtéT op´æk´bDÖx¼Ëfþ!•þ×Ѷ™WúôN§Ú8/fU4êûÝy›Í1ĹY’šòæ^z-¬ãMF$möÅ2Z K?£:Ç&¢oG[êkE!Á×\½éù®›Æ¨ÇTteù÷ÓõM[¡ÚIÀ4ÉKt_%¹\Ìl¢¥ëG«BjŒ ÔG&rùMØvé­Ñ¶¥ŒÓ7—0쓺¼±¨öJîÙÐ2‡]DYÙBÁèå¯ Ò»ÏYáNG5ÉÔ_é#ÜS˜TÝ7¦ËªÁéòí&m+Ti«¨æJ_õ±i³ULSºY“½£ÿÅ@Ñ%V¼"dA?º±ï´5ÄòátQá¨à®z±Ñ[ä…"Z‘)Æ q? vk#É% ù³!Ä:#ìÂÈù\ÑõLXqÏÔ㱬I{šùåo[ M dâsu*LfznjôŠŒâWÚô“û¦›@^É»]EÔéåÙI+qüƒ†UE<ÊçÅÆýª¶ÓLx{ú¼ÇmŒž.¬×ßo4£ž…Rºýœ¾ÅKðá¼Yz LðÏa¡÷êd» &•†ÏÞyM#Z+}$ÔÙB:•fÿÎ@R±M=9'ëC£O‹Å¼° ¥pMˆi~I]Mã!ÚÕ` q%Fw[ƒˆF‡ä/!÷,):*'2Ø:†È8‰ÜsQ½Rý1´6;êmÝ]e[R˜é½€Gò'ÑPA„×ùýõìò3ó¢ ßþIÕ°¸ÇþÇEʃ÷ýϦoÒS¶UÎr©·-hvmÏÁ•›"E±ÇˆaMû,‡ÆŒW@Ûåñ©fü/¯¶”»y¯ËlÔrV¨ÙCƒ&y­‹m6¾lb0 õ,̤…Rk9£dAá¡…Ù=Å">">,ú¢EgÒç âÔSÜŸl+hj¶·‚Î&¾Kýà] #®âÏoÑ*S©ÏdÀ¤E%Ýy©˜TÄlB4C,j#_4¾‰Aú²®òöEiÏù³ ŠäXbãr¼x› {õQÍV÷™ÝÔÞG>ª¼ ZwöþÎyµ²Ï¥ïè+?ñr0òätúGàÃR—ZÛ.t„ŠŸ–ŒwIÉÄúzìÖ[ÿˆ! Òn«ßußPí» ¼ï-ÍÓ ßAë–E¹Sæn G×2 Uø3+X )+(Å©8è4<ÿjè?ÑéN÷Óàž]'†@Ğѓ7#ý ÙAoß»ûà }Y_b‘tõ¯bó’œ/º±:ìÀ‚¼›Éå7r‰Þ‘Äü/0”rNY]¼€–H„â('hæKU4«q)ëÞ•*Vqºr°ðÃ,/ŒYó9ãÎñâ¢÷ÂZ9zæÒ93Äã‘c1\ëZ!X“·Ç4$;ƒ™Å ÄhtY³ám™yËï®FÃ៕à`ÞId#*†PÊvö‘mO†;»r-rvJµ»Ü¥¶—Œ„TØß ³¦Â†æýX¦WÝ“]FœnUÆw¦Ïý§xvŽú\"T&™bsPI‘®&íO²r=ŽÙy:E‡5T¡¼E)H«b«2©ÛyBÞÌŒ¢ ²ÓL½àS¹˜Î`†À)ÿÒ#§oü¸Ç,2WFÁo:Boþîփ¤™¹iߤžõ;ÑAÎfÖÚç—Ä÷ؼÙ=8¦ïƒœ=êß5Ý%þL,Ü5â lÄbÜøå^+>U€qI'êzQ(Ñð™ï’€ö?À¦Qdk8H`‰rí°<š?Þâ2„ݓǸ™åô‘ŸÌ(ÍÇæ¡âóä¾OÝú €±Èˆ†ŽR׺§\H‹(#$›‹ô›ÛhÉÚž<Á—“oÚQHžðãMÇß-Éqùs¡·,¯ü¸éYRŸ¯-°eÆ»IÂð{bñÒ-äÿlâš¹ö÷>r˜ÿ¾ìG1á¸T#ºm¼yV@Ùé¹ßÕûÿ#6û¡5våS¿£›ÓZ1'óO!éUÖ´Xâ a¸$qgígågvõß]n¥lJæ/éÂg™› 6h4ô3¢ðÕÝ®HX&3É}Eû|vn”zY.žöþ^ñýýj¢-<ž‚Bư–Içò¯‰Ýmm–ÐÑѼh=ùcBmÌíî ãi]¶”„‘ÏW®;»ª›*Å~?eîY0 å'.pç_áóÂòŸ t9pÐ/ªœk; ‚&æ> stream xÚuTlÓ6Ý J¬ »Ä‚Ò‚HJ—ʲ,°Ä.ì.ÝÝ- %Hƒ"!%!)) H)! ÒH«ð­ñ>ø¼ÿÎ÷=‡Ýkf®¹çš{æ†ûª®¾°¢5Ò ¦ŠD`„EE@2e-i$.‰‘qsÀ1ް?f2n# G"dþ PFÁ ¬M‚ÁÆi!€;®ŽQq€¨¤Œ¨” ®ÿ'‰’¨@ÜàÖ-À$†&ãVF:{¢à¶vì1ÿù àƒòD¯_—úE(:ÁPp(Ђ`ì`NØ¡G€> ‡a<ÿ•‚ï†ã,º»»‹@œÐ"H”­¿ÀޱèÁÐ0”ÌðS0@âû­L„Œ``Gÿ¶ë#m0î €58¡0ËpEXÃPìá}uM€Ž3 ñ;Xów€àOo¢"¢ÿ¤ûÃþ™ŽøE†@¡H'gÂްØÀaUMŒFAXÿ „8¢‘X>Ä w„Xa~U¨*Þ@°ÿÈCCQpg Z wü)ø3 ¶Ë·ÖÊH''ƒ&ûYŸ ƒbÛî ü}³¤;Âû°#¬m~аvu"à.®0u•?!Xم͆€A ´8sÀ< vÀŸé Di°']œ‹Ýh Æû«Áز1îÈ¿Ø6¸þ±t»€bØž2°N/ê7û_“uEaEc~=EØ5øþõoó€Aɦ&PÙûêæã*Å+îÂËCb”Ý{Qû$ÆŸn±¸­Þ R¾qòUÛïd[eˆíwÒwGÒ)V2¡OUoö™L±àÜûÖ%»¶>v[9”üA„1¥Á¤5í*¾ROÁŽoS†Ÿ/«YÍŸÈZg‡Yá{“›“¬×ªq”ûåíA¯V•7¦èœ¦'pZ:9,¸ ^ÇT ˆFËŸ½¤i™¢ìµYhØÔý¾ôz늊0Öþ=¢ÀJË·ØbCA|7tbS],OqÈ!b¹éš%šÑvé×|6@=…Û¹Á]Y2Ç,wV ­gMöì’GóË.Zõ®7ðh¾ÜòÕΚ¨fÞS…_ûX-c^sCm‘ éBt v9åÔ¥Šbœà9÷-?…Øh‡‰öã>¢ Ü¡³#s¸©F·‹y\ø$@×í8ß E=:î7س”Þ=/ê×,´#ÇÂO½ÜòÊâ[%²Îiu¤'  GXà_}i¾Í'ÛÌ zùªL¦÷HÊ=t„ÂÓE éT¨y Úè2D£¡g‚¢ÈÀ=o‡Ö±p´‰ã¤:åµ'fyÜÆ (ÚÛ[ R  mÚ”xà‡¨õ%¤À7ÚP-XuÕ’m¨6o(å瓼Šú4+/[S³=ë4arV¹¢tø•."*äùç‘ßQ\ùÁ+à²C‹ž‰е TC«gs^»å‘ysW›ž+[‚è·âýª¶z_ubÌŸÀíg†'ѺFòÄM wk¿ÚEçæÜ¥–u”I¨® ³SüˆKâùVw×=/êÞ#‰Ç·ÜÝZ 4­&ËŸÔ3IãélòÞióŽÜN>9ƒ’•f|K36 b(Ñ ¿íür∑å:deÖ݉;²Í{\ų4lô²•¥T|©û¶Ëô©W6½_‹Øè‹À8{õÚІ ðæüàùùbðrÆëLÛ×Ýdž«“DJ#çJkŸj%œÙvÙ'6Žh÷ñfª[&ðS§÷Gmì¼j´/1È}÷/XFÆš¬1 Ûãé‹@Õ²[-Xt¯°K(Í/O__Ãô—ÒfJðGž/ì¯ÊTM… ³t¼äàt³Í(Mû§Qó›3N¦³j|ÅJo½A§É¬)xšû‰zL~âÑMŒ*5ÏùA´Ùu¢_ñ'aC[ï¦"@µX¶6“Ý5Èò’<þP—c‘ó¼S$Ô¡Í.•o}Í‘8£¾¸£ v”H”p»V>š×è–5,!5¾O× ÒC´ÒÉ®+†L­På‘,d·§Ÿ¾‚*²™´üÔ×ÉÔqC]8ÖŠÔL ¹âŠwhý–å&åX6Lš|b›¨9«­vÀ¨7Y–¾?×eQ°†ÓÀ5%ô ]~û±9àý~6åËuïº:™‡Gfø?†ŒÊ™úÚBB³Ø?Õ×OEˆmœPÓ³¸åÓ²ùš ºjÞ´Ý’ìþŒsYÂcÛÝÎËš—k•2yMÙ™Ò;šœíÇ€[„ÇqÔ¥öqÀ{G›‹e Ëu®ã¾‹§›ëˆ „ Ÿ«k@ž<Ñ¿ðNY8ÓÑpdÓ5Ç<ÌHR3C]Oú€—{¬×üð°ã(Lcô^‚åɽ5íûˆ5Âç~-ÜÄ^iVÙ‡—r _›ë\ê?ð1Oãø’¦>`,x™°–÷}û>ù‘`OhéJi·Å†áž^“.áR7ÚÇ—òõ}ï5>ºŽ¥â8…³€b{¬É)öïðVOÉÓ²8|vIŸÞdÏÙÀµ'Ñ dD+Œ²s)Ö)èe›¬ûw++[;Z“—5Üž¾óÌM‘ŠSÞ¤ 1Ú%! }Üæë¸„Øù±‚7ÅÓ3¦h9ŽÄÝZzá8ht—Co!ØúA^˜$] ÏâJBDêtã½Ù³B#¥ˆÓTõ@Æë¬¸C¿&;j-÷‚oÖÅEÖwP±»Ý5ðØFcobÞÔâ~vᮦ·EIÊ—ÐÃ]ŸÃ¥³l÷ÊšÆïǬ(µªM)x„e窆æ^f}§ó&ÐJ˜Yš-wGPÿ1Õ3jÎ|(ÿú7Ò¨TÚ!…®g%cMOíˆ>ÍÊ9—_fi¼]†raþPŒ<Ú°¥jX:õ5£\7ŦuïÉZëÑLY¶~–ÆGÃ<“Ȯك À \SàøÊÛ6aY4r™:¥CëÖMšÁ¶dš0åýªZÑžǭâZ±õy›10ÃCÌt)1üh"CŒ‰z·NFÒûÛdŸˆœ|®Txü‘4¾Få€c¹øñ§…*58µær¬4ÄN³èä½L­äømÑ–©'¢\Ñ4ÄYÅ/VÀ0+:g#ÇuDs8⬟åÛÚ©ñ8®…æD[˜ 1h›Á]T8µ›E"О´œÆmÝeÍKI–*Ä»µSÝÍ×Â>?÷úÀ—žL.HO q{¹>ò™=вÃ]z5µÉ­žÀ4kÈvD]GÙQUãõu'Æä#V¥‰A'<Ö€éšôW¥X”+mýñAƒ3X¼z…œh}}[ÀîÓƒí©ôXLñ&çÛ’dv‘ò<>|6À<á™`Ü*ŸQl™ã~ŒkNJDð÷Æ’S²M•NÅdF‡ÏCqߦ³§äÛâ0—ׂ2Ú1¼ž¸[d¥ŠV…¨è‘wv´˜¤;eãà)í9ÉaúWߣ¼ýñ® Éß!·k.—†®$œ ¦ä™-‘T4ƒñ|Ý)me ²x%ÊhRÆÃ¿ÓöàxT¨q÷¹!«p ™ÒÎ >¾¾'î­®| åâ9Éæ”žš»á埩ÝynXýY™ÕêjqM« 3J²“IÍrëŒ×Rws“н[P=s×z8¶\¯ ~*1ëIcØS,ÜŒgðí`J*#NÈÑõ0ì¸,}È?r½^C<ì…ÈCIµ1û–U„˜â™y¯7*¼8è1Ę)ß»ÈN.Ž¢¥±H‹{`D7Ó*Cgû~Ô^­‘ðÒµøk3H/OŒš¯(Ÿø’î•M2á§Láš][ÑäCÕ"Ò :T"‘m"!ì}ʱúŸèÖa;ù]íK¢éÕ¯kÏ>¥£ô—…bÙÄž8êY¥b†®®Í¶Ü°Ì{~›æä̼ٺ痛´gÙdàü$|ÐÈ9±>ÕƒåC»g·qhZß@ÿ—Ô$ )šÚ¯;ðfŒ8²Œz\,æbw7oî€ö¦ûÉ‚Íõn­r|Éç)¥ç²}7»wu¦³gm4ES1à:b\V@C5@xf±æßÓÉc´OQ©Èñ=¾ï!’å ~„°+HMæOïBx5®-Çò£²n‚hµª)Oöl­œýЉ'c$¿øN/GK8×ýSí¢ƒæA,]6C’½ÖP36íe¾Ûà=§»%Ž{ Äé‰0u9Ë,J¸“˜¤Í©_ÿÕ|©Á8Á†„׺ö;;Ã]½Y̳ž”½Ùú8VÁoª¨ðª$Ov¹1‰¦†¥¢<]µêšCÙ2#xúSçÉ·ËXdè‹+užŽÇ†´ò“÷/œ8P F„û{ɤå.o$ô¹*n (òòÙpK²Ç³û™õòÙQ3½ŒW³ä"v‡hfï’ôk[пÜPŸ"—áhè>PòˆŸ4Éæ³¸ÅU¨Ü²š~h °‘ô’é’a~x]ÂÑi¶)kv0ß÷Wq0¬Í)÷’Ít~Í09¦t}xô¯3¾Ñ®§•ë\WscT©ViÁ‘cuñÆÿíø·T;Ü=(´½,Kê©Ýàê{+à‚«þËqp‰qÆ»=îôwü§BUÝçÆ§"l×Ç$ñ‰Ìtg¨ž¥[t¾y~¥S¤HI9³ò|oߺŠ!€ÝdTû>t*!÷´õÆæ÷ÙŽþÿ{C—á:· }ŸA¿p)ãú^ò8À`o+­¸@0™jZ뢉ÿÐ(àJ\@ÏóŠ˜jîð‰ñÔævø´4©¦fi—™„½¾g¤ÍÙ¢À3º£Äž}$p$Œæ¥”àãý»†V8À%<]j´Úh™Öw¢Ñ·Ë4HÖ¼ÍÇTwåœAš:·¾_2Ûïm|)7F«#õM³¨CðàØÏ’fEÛ…Û‡ã[*Çî¶Ä@¹‚l{õ1Kïm±/=å³¶•7ËÜ«dÄýÊ”×äëCîz}žò 07ÑRŸÍ¦uå9 c ôK€ U¿ìP¯7qÂS®r¾/Q†PýçÚKG`¼„ÞpºSQ‹¯jÃ?¼ûdmúýƸ£_`­€IÓÁ»Jûa"…¾‘6aöºgE:jâ2¸Apiw%€²gqKÅxŒkœ„¾‹wOÓeDÇåö࢟ì=‹‡ƒ?¾×ÿFÐDÁOˆc¸ð•í—qº|ÑSš® J9åîòÀà (*I} yÓbïùŠÆÎ›fFBJU$zOO1ž\5ÉÿXr¢B:(–ë3SÀYÑ#tc¥_Ø*ÃÝDì³j§‰iñ‹näî+Š¿g¸pcÛº±ë>¬o}ðÆ•G“ñ™sÎAµ³§øDx¦fraøÜ:ZƒJ¡"sÈ2û ¢$X@%k‚Õµ¦ðª“7yÏz'}P©â‡ùO:[[§½X gñ#ŸG\£/G”¬,ï·ůŠªœãpŠÚÔñ«·vß¶¸6Ì.õ‘¨E_þ¨Ó×bO‚>#[w¨ûÕ>rçL­ÀóÚÀsÞå*¡ï …=&«Ál­Íº„öÃ/ެ›%TÖû¯E~HR™õâ¾Ò%Ø;¼Ó¸ENøU—¦-è^ú¨Bnà“àþ¾(G¦¦”±®*­wcdùC&$âF•^êñnOÄæ çedžâ-C8UÉeÏA—Ûaƒ”ÜZ6 Ùñ΂ÐáN¼›¸åâ$ë9äÔa%Ƚü ›&Õ1Ì—@Oà1ïhÀܪ@Pú†Xku¶­êâ§Þ féÒDââ†Zâzjsë%€\a`Ó+¿¾’†JjE1T;’Åz‡€áþ¤Ñ7é¸;É ·ù…>äʵª}è‰Çé±Òã©>M>×ïy<4-2ûr©Ü[F„(› ñ]èͺðühÝ„@•‚p-—Ö×% w˽-/+½, W0“ì=N]&¨ããln{C‹ý[D“Õ×[Ùž¦‚ŒÈ„§çì ‹™sªæÙ´ºàWÔ3RžG(›/Íì"Óæ¼ ´3“™Èih9¿Þ›U´2dooB‚Y2»Œ#–¾¼…oGUD `\å‡g)V ¾ÂLé{nõvòÁFš¸­ ¸œ$Bû^“=öL‚ÇkL q4ç%S- éMUâÉ'’ W‚ÞÄ'Ý',‰—-/c~N½<„–Þ9+àŒTTbÞ^z|­ûIœ!ƒà^]AaÏçÛjŒÔú\wìv’Ml«-<ùžŠ}“{D/«x•aTÇ…¯FWdøsJ–Àv;™mPk+<¡Ë?ÉÕR«Š½ßý¢;"µ%.¤TtèÍ–©3$vgž¤‚›6Í¡ùÍþ®ùÓ"sRÉ÷.팃tûn 3E0E™Ø—³Ú$çQ]ùxéÑtÏ >µÕ' µOðˆ&)…½“ÎkbûîkûÔ{€Ë۸⊄´=ô&S/IÛ¶C$­¦æÞ•¸¢hÃÞ$©à½c. ðZNã.ιù¡•‰úÌáy–ÄwJ¤0ÿéÜ?!­îÍ1«•ËÞ]‰fÕŒô°S‰Q©¯K†úOƒ§õ”ž[ѱeŒ>å âd_ÐoÜë- |NĬlšWeDÕÛ!z?ë°™F‰´# ½#È£…iл¥`³qâÛðy^’é’RIžó3Ì%Ѝ§•kŠö…óŽùÖÕT€v ¸:D‹G2f©Ÿ¾jE&°“x—‘z‡Ç4¿Ã­ú®G¡ˆ‡ñ.d çà̈ÍέlK:Õóï½Ãã98UŠjùSÚ¾¥»¿‰C%1è½a÷àö Þ–LÃϺDüåû›môßÎVu’ó²E»4s‹Â÷1¾õx_ò¶gi78f¡? Þ~º|×ÖÛRnSh(J¯>±ðè—ݼï5•V··@'aÚ#Ãò°8ЍØ.Ÿ&îïãìöðT*Eš _»º qÚW|gãQ;Y'ëî­$ƒ$ÍD ,öÌ!Ü#Uç‹aÛèŽQ·–£áÏÝù >FïÔ î¥g2P‘¿Í”_sj;ž@û_/štîrgSa êåsóÙ­Oï¿6áë±0N„}›¿¹…oÏàÂßïõÊÕ9^"\!}·ÂB¾è§%Qãñ*å $ín?“@AÊɱîÚ¤÷1×>Q²KJ7¨–<•ÖÝÛ“Sž<õÕœE&í[ÔxN?Á·ïÅ| ÚÎÄ,P²Pv!|”ݼ©žÎÏÃXÉRs"¢Œc¤E”ªÇþê›PãÞ^Ê®ôš9väCÞÙXOW£šŽ½çBÖDÒ6 lÎŒ\SS6PL ÖÇÇ\Q[L4¾Ÿzæïøñ#¿¦|üsËxBËS½!|<òkÝÌq Dý*Dét Ÿq?¼=I Ö&®o-L+,ȼcš\9#ÃK&3Ù°…|”<½¬;µ·ƒ³zˆ7ÏuÅAÀJÙF ¾U¨ü8¼0×üé,øÜ‡b›7&b '•È:ŸéfUÆx%1ç¡OAÝš+çÅŠ×â*á‡?ò7=žJr¢Ϥ–:|„’hú5f/ œ÷¼tÊep•©MTa6ß'¿&töÙi—ðnBs'×kÛaÑFJÇãüb©a{|}Rs·¿-êÆ-kÒ–<'ïúfmôì[YFÙ/1Œ~°ûR\A]i¤¶M\9!çL“hbë>xõ?¶Ù endstream endobj 1152 0 obj << /Length1 1306 /Length2 1362 /Length3 0 /Length 2203 /Filter /FlateDecode >> stream xÚSTéVy*FqwEQAñ· EH%(y:ÆTš2$2’̤L1†&° \dzËCEQ@ ‚¨(ÊbW"¢bC ÍÆ oXð½sÞ;9gòÿ÷~ßýoù®ÅLN «‹„ÙŠÛÑÈT'àèæO£*•A¦Ré$ ‚‹á/v’Å2X®@0Ôé;„»†p¶Âõ@ >J1 1ÍÁ‰6߉Jt*Õñ “;ÅP "þdàƒ¡°‚dáŽIÕr$J„;¯G`Å·4GÇù¶ýtà*åB?„‹` ñ"ƒ@ŒÀ¸zH+–Ç¥NŠJ¥"C“G¹XÛ‚‹VÀòXô%ƒH–F&YžQ 81!®‚ä0 b„£ ‚¢D°¯ƒ@o?°D £`¿€-l ‘i_à ²õ´Ÿ ñù˜D ¡jBD ƒ%l?2‹ÛèX|(BÄP$èOl×¥"*¬OÁ—#R\AV b}}¢Í¨À“H`Wôù-Fä0Ÿè»š28ÜhS¡š/7!‚ „ú2J)%EdJØ{ñ †0‘¾Ù¢`0© šã:€eŽå‹(úxj)Üï¤éÍD Z“!Q¬E„0ñGÒ( àr%¬Õ|ïz#Ñh@€ðq G!(é[t îÄüåH,¥ò£ªþ÷õN(L€¡bõ7xÿˆ)\×e>óKþêtsÃbÆŽÉvötB§ {p$Ú¡q82˜Çw\oTˆùé}ú’rÌ ¬Ä €Ê…Õ7¡‡Q™T>ñ¡ýßrï§ü7•ë£üO¡ÿ˜[)÷û­ÿá‡$ˆX=€ðPŠaù€åðÀÂúÃD)ùÑëCĸ¢Qâ¯íCl$pœ/I¿&Ô?”ëò1~MèLÉåšD%´@'¦¡û$€cûe(dà *q-br’~$Ž€â¡7‘†„å+årb;ú'G¼ùåÞ¿Š0 óIº;ß9yuQòéG]ÍTvÏêèöFÕi]†ËŸzLi^šäÎúØÉøWz½kå­çéMxIÏë+^aB^ùpí®t'ݱÓ#…‘Ol×^›°ðÓK…Ÿ’þÜ·¢"$‚ ¢LÞ”q/©ºÝ´žl+kv;»Å“5·¬àýaћіÇÛÈãFÔmJ=eÁƸÉå®Ùån…®7oñž£èXT÷*s:»åã® WèÌÇÕ÷ÚGšv™µ¶I}»²[]v¾¨r0õ¸nZ<­ò˜Ò“a•Ôu:9Ñ*RQ¸Ð󵬸âÅ9òö§›‰²'‘ºÜÞ)Iûºƒ}Œ˜,4qaÈnF[Ú×nX¿:óàÝkÕ…Ù;pß3"+æîæxcw,™}×V¹kÏ¡=¢¼­Åì¾Q¶=æî"§3 9…d6Ë£Ö”á£[Öt­æƒpú¶íŽo·²_4ÞWö&š8 kRýÞ0òV]3 UE{鎩7Tu–h:yQw¾&ӼВ]{%7·þíù’8¯{ß-0À±©•ÂòöŠo…cU‘A‰þŽ]ûêÚrd—hq9õ}Iì)ܬüÆ.¨pã‰K¦¿ï:ÞÎì9ÔRfXBŽ ™Ñú¬{퟼Ëî Õ¹oÍ™OJÝ4hë'•¹g…óNnpÝØ³= ×]§‡`ûËÇÏaÞfÈbe}ðÚ˜ó{ìŽS›2¶Y.Êê o,Ú[¢L²f´çd8:Áùy–÷þSçWGTH»Þa¤íàÚ°7,õ^“‡wšEd]Þ}„ß<Ž’šÿ¼ïà åž5®J¹Ìº‘òêÌ“£ËŒîo2 ä¦yNÙÔÍjnýÉHáµ½³àñói'Ïp}¯ÀrËÄùÎäLƒä—Ü‹û_4’PGä7ÕªÔ·_+[9{÷¯áí7\è#g½ç}s¦}é¢ðêNf?5ÔoS<}ÃévÕp‡à‚U»¸»k_©mÝÎ6Fg>- ÁÝg¼Í>º>ŠÊºô–r×Dµá-uZ‰½Vúlt|Öæ‰Ð<,xêÎ|Fø¢kµ’²MmO‹š¸çIë+Êútow“{¶ÎÚ}WMÑæßXü©i’OïßwîUÓ—ôde?4Ñ7èeY7´þ†‹’Zu*ôˆzR4ï*©ÀlAκ¸›d‰¾Í½OÉóRßÏî¾ÝÈzdSså¯=füLf¤´j]6/š¹cGwL]+÷ù²¸W{`GÊlYö‡¤ÒS‚š'lë¬ ·ià”¾Õ@·¬ŠyÅžïš#¹Û÷ÇÎz0Ó¡ušdé¾¹Á•qÎùÜ[ׇð„o^/:Á3½Ü[Óñ.qåÇ9YiŽ7Ôwä\’$â|.­ðŽ1IÐò^ ïØ6~uLJZ{ã0|çJ†M1WdS¸%*ÔT_°»|§Mü í®r ´¥jMëèaÝ sÆ&{àÖ'´ä}¬™>oÙ‡•AµÚ®ò0£Î“ãEŽ£FnÝA÷îWÞy3 Ù›³qÕRû’œ Å¡ñçÆŽši025NÓÕû~¸|}øÝH­ÎÁâöì?Ž¥þ”xrOz¼numïËüú® Qììúi‡ãwVX[‘,Öõ–·®ÒyþÊl¸?ãŠÓ¯Ù¯5H8÷*W0™f¹gÏoÌ•ó¬büÄ[lÃ(æJZ(´aÅæÐ×þõEš®Ü«œnJ  æÉ_¸•~©/Å%ØL¶3„~Qs´yÛgz »e΃_X%«&ÿåëuÅïÑÈ’–’l¿G^oU>ÞÇ6à £‚ý×Ob ÏŠ}{’êÁÜ1þctÍë,U¼ÕáÓá3eUñ»KmÖeœ/Lsú7¨ÖZ© endstream endobj 1154 0 obj << /Length1 721 /Length2 1199 /Length3 0 /Length 1763 /Filter /FlateDecode >> stream xÚmRyTSw¦ˆKˆËÖùEB6ЄŠûæŠðH^’g“—ðxÁDD¡`d¤€ …°H+(‚ÐЊZeíaQ´j°… Pè™sæüþ¹÷»ß=÷»ßïZYøHP<\!…•Îa>¡ º‹# Síu­¬X áˆõ‚p˜ öÁ<KÃØÑé ]+À’H"â€È%- Rñ1‚H‰H’„p…À-))É#)QFÅd;©š¦0¸|DVPp;Ð}#€/ŒÂ$Á²xÂþFaàK0 ZNW‚òEM‰Ô%hŒáa|L"Þá»}‚Ã7‹ÎÊþ{4í(žÈÔ°a.&^ÜÎà«‘ZâW£Õ*&_ލº à!\ÄÃÕ¥-úÆFù°cæÉ¤+% D>@ÔxH<˜¯aËD¢@H "K"–ÊpŒ¡ T"†Ð$FDŠÿËû“ÁÆ!»QÆ9ú2„$ú r˜Œà«ùHcѾ^þ—˜‡ÈÄËý°ÆÍò$¨HñçHÍKi>VÄ>oòê,•½Q®„‡ †k¼„0Þ*°T†åëY³rM€ñWá"ÑtêâyÐßJóËÓS"O¦0œÅÞŽŽÀÅÁ.åäre£ø’áš]Vò¥C‚a9ÌÕì“p]ÓäÕQqÄ»ôaåZòÃûqä>ÆýÝw¦£ v!/öù¤‰:ܤ䠞ùƒÔx÷'£lõMKè ¬÷âÇ{§,²búLf®n«©ž ¹<{=kÿ”N¤±˜¨3}â7<ÿçÁ´`›{…Åã5~ åSqª¦o×êœxüõ%ÅX 8ózðùšþCa†r*~×ÌÓAíÌ’ãOô¦­Œc…ÊŠTéǫ́7ŽÄ—ÑžFÊë=ŸžÏ Ö2:­¨áÞܬ¼¿Yꑊeqù|[Ba3æKžñHkœê ½Ó:Ò}WÜ™¥?.(ªzµÕP+tþ¹ E}1· tZ{Råýw[L=g¿Ð¡” FרMB~ßõÌ5œî 5ÎÝ0;¿3½áX^S¦g3]ehôÓ¥á±Æ"öwóoÿîI4¶lôÑ©lú÷»Š†±Á+ŽgœÕÎÔÙð½Ef«YküÛe÷GZ7ëÆu­'$×ÑR2Êl¼~Ýè9x£vÉ–ÇŸÅŒè7SJÞ|¼@…Õ½wóh=k‚H xÐ¥¸¡”tó+_ðûà’{ îŠqÌ“àÖ`’f½•3q=çuûÓ ½œÖ›Wý^#ÿxVªL{d”b]À¢óêÙ îáSGÛÛ†ü·ýš—Ù»ô–9 l(«(Ú¨¨rìþä¹¥ö¨1ó»Mï):¦…zq¤Þ=U'O |øâуή£WMCiùÉåò‰”‰àC{êÌnùÔnÀ¿kouó§! ß2³g¬¯Cÿ€IÁËNßÿÈPò\ï[,<ÙF©!§ºû’~ÚìkK¸»ÿ”Üa0¼C =7eÂöü’]}Å äû*S²dôh•°!Âop¶löÀG µ:M æ÷ªÖžŠß Îæʱ4éíî´BÁ±ò€Ç ?Îûþþܵ™,ñ«d«uÔôÖè `Q—âãm»ÃivÍÕéÝ®~yšÖÔp‹øwî´-hT±ƒÏfG]ºîfø SdufÞÎ<ör€H\äŸX«ý†Ü¶ÅEOî$¿ÓÝËÜÂîlqo=ûëO”ñŸÕ÷'«á’ÉCÜ ~]Öø®÷%£-ïsüŒ¼2´2FI5•çç¶ ïz{%Á„^8i!TjUd[ÛºäÕùûÍ矢ܬ;'*mƒO®õÛD‹Gú±ZfºõGœ o1½v»žö¯ ¶MÅlC‰\ïZ_¯ûõõ' ï0 ð×—‰¹Iéë• 6ê›-Ì2Ë/¨…Ë pí:«éþ¡[ÛÌÅÌ#ëÂ9í¬ãÓ¥Aº¤Òã^‚5©Ú©\­z8 WxcÒ•þH…lO¡fZˆ/–&Ö½šÜU5RÌ5_pqyô`h¸­&Å”9ÔùRߥñkꤨ2ö°ú}B;Oìž¶£Ä> stream xÚmrPX°-–à,XÜ ÁÝmРà 0È 28A—‚—àNàî$¸»÷@»ûv_ýª_·êÖéîÓuOŸÛŒ´ pèåáåäåâè*è¨óòñðx¸ø±e] –(&g‰€ˆ `€.Ä ÀËx¢ðb1dáN^.P[€ÅŠõï$@ßÁ u„ºôápw¨•-à»»»”»«—‹›×S“.@ØBÖP@VSËHYCÀ¢¨¡P„À .–-7Ô  µ‚À\!¬k¸ ÀáŸ`‡¡iråú[Ìâ‚xfíw¨Ë¥45€yYn ,À¨)=µÃ®¢Olˆ•‹ã_Óqÿ!Ëÿè?ô_ÕÅóÄ…ÅË C­Ä ÃâþË7e˜5 øOìæôoéIë“>Ë“‡¬0Äú‰íæà aé°ÈÂÜ€: qtàŽ–°Y–ŽP¯ÿ/ïÊË'¤a6OÎñü“‚º*@=!`-(âÉjkK‡'‹þÎ@þùuêæøO?äɧÃa^ÿûäÓ?È-­§¤¤¬Êþßü]–‡YÁÁP˜ @ñ䥥 ø¿Äße-Kè?Û󯘷 Àû±º%Âê xËÃõ×zðüuþE¦ÿÇ’‘{úpò ¿pòóñxž.¾wÿ\+7 ñ·áO³üÿ½Hˆ'Ä knn%l—T÷¡ÈO>w¼øûø¨…û /òÏ‘Öã·„Ðn[°ùæÅ"ˇz,$¾z¸¢|VKg ÁÙŽ¢ 3¡¸ùJ_lãW¾t§}[fö MŸÜÑJí8ü‘2?÷^‹mX 5c¿\Ź@œP‘7Ê¢°±ãÁrÜìäL‘Õ”ùÅãGÈ:{Á¸mHÎ/äÍÚJhVÐ*Î1#¹¹mNQ Óf¨Ñùk–‘•©ïœ'ÊgŽw€:mq–·[aqQbev”gø´†þD.çÔÖÕBeΜÍwAj=7ö î¯íš9‡•ce\¡ôž‰Fƒa‚gEêÂÌ49ƒ‘?1“žYpHc˜[#ê‹q{ÂJ†[>’XÐŒÜxǼùùÊ9Ƽ<1/a\d|Sky(ˆ†ˆ—-ŸvH] ³¨t-—Üþsꄾ i·)m1'1ç¥seŽ_s¢;£Qx¼ž¸ÕY½ª˜‰Y§ xý½; ”¬£²QîèP£OÔBmNu£!Ûµ?[šÆ±s¾rø:E‹Ì8ÔíšAÈÂb”¨›Øž‹ú’ùïi‘5/¿=Qô›«è™j ™M&< Cnÿ£rG2M5KeŸ/ç_ò¤}óu-WKüòرr`[ç÷"„«g±Â·g ‚~Ò§µ‹÷Í`wjM9ïI_Öè ?±Ÿ{ž«»!Æ$ŠJòà1‚ÄJù0²4–Ê–ŸÐH졼“%1þ™Ì[5ô=$þu-´}ˆþj’ÝüUUÀ“Ñ>ìt˜÷…¿g„Âb¢f¦¿„ŠØ§ˆ¶q—¢Új²Ž¾GY»Î+3÷6Dï£ÞŸÝ—Û\zš,¶{ž‰MÑ)¬.cEØËm#û/zõñêñŸyQÛó°M;%ÍÚ·D¨Â«¬™/´PŽÕÊ(–7Í"öVgŸE£.¾ð_ÉÏ0óCú­´ÂHCÐ?…êÇÛ¢âüÜϤã’{䲋|¥ßÊD*¡’/#GõáçÎÇ©ù‚X›ÓAHx"ɬá 'ÛíwVæXÂÎgz¬µº€2kÀd>6ViGš Ÿ—Â7*­VWܲޥź–i\‰Á•ö#ì4ø»‰ßÏéo´]ˆ€QYf&¡•rÉϦϻ܎z¢\É#âjL8Ž-ò§éò”“CFd8›üõ„[ÖCÚ¥Îb¾"”ñò-w̤šFbí^õù—-|úžšŸßÆ¢§Ü¹´Ðyáöl’åWœi«Ý龞Ç:: ™•®ç‚yHóa7Dèd½•k×|±ˆ–^̾iùtÍê šp0jZnRòå¬M&šÐÛ´›Å[Ì?í‘¢a+áµt¦™ù¥Ãò×Qwð J{|ÜWì Èm–sºÜ`ÌNf Å’Ï ‹ hd±>FãÙí$`E‰ðgžê‡ÌçsuN%™»~(£ÄUòõñQÀìô±ìòþ´Â®S7mh¶—9•Ž}uQkÏÏb×¶ø²ÙŒe"xÕ†òäÍVmn@串ٯCþ¥™‹Sîœñ{))ý#µÖG'%Ý"ž÷†Þxž‘öfí/6¦ý0v.X—‰*Y²¥\ïïXéñüé㔄´3’L¶Ë¬†Vy›ŠmÊ‘~ÆÀRaáfAÞ‰;@`Ý›x e3ZÒ?Z£aG}¿ßVÀÌ–Ø­§œÒT™¦±=+º|¦j&R~EhÃÞÖ‰àÃÐYÑ;‚V]ñÁYÌzÚwT]G™ÆÍâøR¯/Dá¬Ô†eq_•8¸äT1&©0è9æ#sKªèñø­›’‚Î\¹ï5ÞŸ¯pQ{MÁ}Zu©Å(ý¤¡ª¨sŸSel²2ØBƒg^ÏÞVŒ¸%%¯òÙÕÓî¶=¼)€©³µé«&wI­{¤q¦Ôu¶BIRr@ô%_*ý­¢šÕì!÷egW¨ –F¹®ˆ\D:dÑgˆ×Ñ4…ìMYsÁ3kÄm¬ÖšÖ¨¶HEBeñßüܱ[¹NÎfÚp£¾í¡=*Í3ˆVg±"ʈ]{èzƒPÕ„p˜X=°§/ׂÈé ÈX]³óòUf³‚Ëgb¿G€€èYl·ZàÌU ƒk.“®÷< –BqÖ«?Ýûã]£‹W¹éB’覉ťùý¤}ŠZÓï ­¢ŸwŸµÆoèH\¬të×üÐo©J¿HüZXm€ŽŒ\Y]©y¦m,ªÃÁŽ).·€é–|ezoø]÷ºûˆÐãxó@¨É>%ý4?n¥SžVä’ Ö–âýMqtãBÚ4߯g¾ˆöÈàõ‚€³9ðÈ ê%¯dpË R;tà¤Ú@!ÈÂŒ%þéBÝÉ–pÊM_QÚ+Š#¼Õ¡½pt˜) ¹_r‹±ã,Æ7’ûa1ÔoWÁÐ૸3–;kÀ*Ä!¯¹SýPteßÒÖ˜¬[;rmêGhŒÝfOÓ.©é ë›òIZŠáe¤U|]®þ:zóoyÖ±ø9ëyi"Jר á4WàÝå¥Ó•å³J´É]í,Gq÷ŸUï螈Ӌ}ݲT¹(§Vå¦5ç[Ç.G*rä™g)¤<Â|UPO8'"“@1=‡¢öˆfOö¨*€þ¢,#–×1œ!(Lî{L7¥?Ø š®K†—…ÿj¼N®çÞàÑÜrHÒ+«+-2(§Ïù³ù|Љ?áŸP€q ïZñ/Ȫª|~77¸…åS1ÛlÒpÈ){ÆùÀ,E>:!áÜÄ‹dûƒç·$á¤A´èpž‡ë‹¶{Ýa{¾¹‰”Ïó„„r6l+¼-…,DÈòg‰%¢U9éáî,Ž}$$Ç\Bƒ\R&×ß# òù”)¾;ÇêOÑ ÕK‡³ôç«:Mo„Ï~äÎ,0œÞÎfÏqÃÎîW"zóçmr GKz¼ 'ŠH¯@!QSMVÔi.ÃVxÅ"ºšKŽÒ£éuñãÊÆ5¡èŠ­> S(ËSŸ:×@ß4§XßÚÀ… âÏz<Œãý¹¶F NnÊø…×Õç×I³A¿CešTWÊýTsш/-Åçqdè¸PÓb£¥‡f&¤(kGvwKÈ¿—Ûù&F$!òÏéSŽ´†&gûn2VX†õ@n–jwú/ШÝ2zUø+œé ^|¨Šâcøè’*Àè¨*Ö%¤©›ýkeøL{ÀLG¨á[%CL[oÚv‘³8éA/Þwk¯qÅ$;'Ñ#,ÞÙƒjR0–Õ6|W膱:ÊO|¬©6ðÉkÀÌ«:ð•ôWþeÏ‹J-²þ¡rìÁá„Sk<åmQ=%5tÉdj’Ò `Å^NqþÅ×Ï䊛ìþ{˜å«ÐS=ì²ô4XÖ[Ä·Må,DaW`îÐâ±ön:êõ(î:OA`ÿ#æ!¾ˆ85úw·À³|Û?‰‘ºqÄ ôä£Õ²Úƒ§BéžÕIjIç]cC^A².–?ÂU„³…Á‹82FkS-ºëV…¡Až§½l1WþÏÓ›-)¤k¿¶ÔŠ&édwÄ]¾ùJrb²§¥æ+e¤ÓÍPê4Q»ƒ@ûãSãŽs3œÁð>fÔ Û­6·ouž UϲÓ(Äž£åœõ.»š¥í÷e8t™´û®{9_”¦8²Éþù!GÒP* ýå”á*c¤šŠ»AÊ Ž‰üƒ«Ð¶¬zÀ,®%…©—¼gâ x¼ŠègÚþºý™ó·Mñ9;=ø°‡›g¸¿M榖ÆÀÉ tµ'ǹœÃ<š[Ïá'‡ït+¼Ç«/À²AÕÄ i7·(\zU4ŽoúU ëð[Å`¹4»‰W¥ÑâêÜÝÌéJ|Z÷t$ë±dûÃ2f´!m£µsFHakÚdPÆ^¡ç²[º~Uº­sµ‚d®Ùx2Á÷ËVïëŽö”g¯ù®[‘¤Ph;ØÒc rjݤ.ZÞ*ªã¶Ç!ã5‹Û›£•ć”úòL/™ÝÆN‡Zë=÷êvVN,Ïçïi¸EÖÛ|ÊndïfÞ4Ð÷4Ç®™ŽäÛ`¬÷ãúž’н5ã²7eàé?ˆÃU9>™"Íã3mÌK™èi‹=ew%|8?Ö»»+²u .…‘"úB›äÞJwŒÐÛ6÷ÄÓ]×y_|.8«Ñ°ÖŒ „þ)yÍ?š_Å­#Øßèç÷’ áWLAh»°llÇàBˆ÷ì%\å©ÝZûq¨d?Ê€ô¤)Í>Ñ;.ÝuhM³Ò¼Bû1Úð¡Þ®Eå†èȇùåÁ†Ï©ã¦#Ã`W;®-Gô ¸¢ß«¯©kÍD™×z1Íž³øZéD=µRHŒ Z#·xI)§2Ö=’ÃØã‹sºlØ÷ºü†_ç_hýüú'&2nÜ––Á dl*¥œU# Evƒé”jxÕ4_ëÐÙ°£¢,2® æÙpŠG¾<Õ²Ñ~rT@cÃí|„´ P›a¬žÁ‘6ÓH¹°ŽjfŠúÍ+ê<ßp‹*NÔÙ&wóÖÜ­ôÐmüå'Jrä ý¾ó‡•­úíãyµ¾Q¯×¡ÑÛ5¤ô$XÚ)蛀G’_GÚút…Gy}‹{<–¹*Nˆ®e®ÍŲA(EïÏ¡üýȾÈrhaBçÿù¦Cîµ ³ÂžÎ¡Š‰ï36 3 ?¦©1|'eHô)¬ú?Ãwv àÄÖ¿ÂeÓA56–'_ý8 R×=•,åÞ·n8³ø¥1ÐvBå#$Ut‰2GCOEzˆå¹·>¹Ž±ÆŠŸ«sŠL_YãçÓ=c®+£[­ÅÝÅîi³v1V³'œæ%bfÒnj*sdVúe±¨o0hž‡µxîÔ¥:3ÓyzMî­'T^²!J,áƒïjdf”û ½â“ÓïJY¾`(¹¥øÔr§?¼ÇMŸN‘ÜvHåf߆r°aŠÔ÷:gSyX}l¸“ÞcûuÒFoí4õ] ùËÁðâ‡ú¸ê7}¯JѾøSÉ0\]^r„vw9„G,)ƒO™(×Ôrì ëÐìèô*öï‹£8©Æês¼»›ä6Ò0šÝ.¥µ¢“óq”òrg·ï X0²só‰Hþ9ÊOä¡ ø‘]óÓÌzdá‡dNGÓÙÞÔ(ýׯá8ºûñç¤ý7æ‡Ñm̬>* ¤¹r¢N¢ÚŒÃ¡Ê•~¬¢¸5„JÎrb‹ƒZ) ×2Ë,{t<ú&äÌn¬¸C¿‘B´ÃÃ'ÏŒ‹k*¿yÈ4ïÝyGÏ|´qðE9á”ðá‹ßÈ7”Õß $§K“¼˜.û·¾ŽôÑW@/Á>–;Q8—iÞI,NÕ Ø‚·+l~'&¨}’B-‡õŽ$gS]¼¶­QÕ“[8¾B±ug)}p¦z‘ÛžÚ^`†§>÷ybg1ÿ»«}4‚mQ¹2Å#Gæ+æ­´ÚÉÝKºwéQMò%æî²_â4ت×Äè¼I!qž&‚‚öç«cWKí2 AK•äèBˆ>ÂSoÀuÌ(vÖ‡z¿fËU=;¬?Îø <ˆ=#A«Ò¯Ìü.µ†p?‹¥1ÞV^$÷8#É錹·"TøÁy¸Ös —’|Õí £¼HÍ‹V}vì>4m/Õ¹=<@ªŒø¾N@;¥Œr6?Ro+#ŸSBævûdxŽ)Ô.©DÎ%«·~±úKc{àZ”õA7ØüXØÀàÆ¨¥½2øÂ€¤Ò šÙc¨a:ÑÖJãvy`s\.2©ÕILÅ¢Zب`ó…"GQ¨Ï¶ÎyS ÝâÓ©ÕsÜ0øOˆ~k1 l$fë^ªœ¹ Døÿ°îeŠZãt}kÖ 4Ý÷æÜÌž% e $m!rêãæ¸¢’Oª;g‚deЩ³'ÿ+÷Ä`ÔOý¬K²Û~î!ÆÑ~Xøjæ ‡ƒÍÄ+Þi_(ì.ü›i»@, ^ß“3“2Óƒ30Ó…žê$¬C¡¡Ì>Òï°óM¬ú oÌž‚šQ ò‘Pž#Fh9JÎÌh6þc~þè endstream endobj 1158 0 obj << /Length1 725 /Length2 1116 /Length3 0 /Length 1683 /Filter /FlateDecode >> stream xÚmRyTSwnE XD¡:?d¤`@ކ¢”ÊI aÉò’Sy<¨¼«Êܽ«39ÚÝ@{³ç_w&âmáf‰0idÜaŠãP–j½ýÁI¾ßÓ`ÈÔW;yç!ë§íN9 ‡Ù«ÎUâãŸ÷Ïüt®6'ñùú˜m2AÄú‰ÜØc_&ëoméØç¡VøÙ2iÉ×õæ›>ê}ø Â$%¸n¾·h »×lê’œ¾òœ¿v¨o]vÙ©'ÖÄmI’+•'#ÙqeÿðmG¯ÿqòm¯¬Ù”uñ.æESeÅWiwTÆ6TÓ°‰ Ûti¼µ-Ö£’Ú´X-l­ ¤$“| âç€`MµâÓòÞ³ZY¯ö‹éºEŽŸèÛ¸…¡ Á×ïF®S¼ šËòêßIØA¬‡ž1ó=>Úîù×ô9~÷1»\­cX—Q×%“‰×*þêÌàŒª,[méÈ 3ß|úc­^ÕÔ@rIì¬uRéÕayÚÑß[ܪÍÕé(eÎS/?´äÞÄR}œíøq6íù|hýmøæ ?{ÿÜ!êø·hjæ6IœžüwÛÅ#ÕæBy`ÁéÉ…Ùíï?|sÛÂP¡b+Ô/Þ^Ô?Ìg;‘fX ¿8»ªçm¢óz¾ÉÍ •5mytûúXåî?q ‹÷+f[í·>>zgo%½á‘¥º¸îå-öÑpã4÷‚Ýú?U¶×ú¹i7îr@%Ù¼”æ³…V,½¯jöŽíx£=³ðàÿq$n¡´×Xûý­Ž‹¡Ý]ÙQo¹¹ú_95Hê9¢(e7OŽ|Û!z`馿–Ùä$©?Ûpl±r‘"Š( ôgØF|ôj ,6Ó¼Hʧ„xÙý3Ý¥Ñóä¡Óñô˜ØdëáGciY+Ð3•±%'jL£P_nó½ùÎЂYÞÑØ…NøÌ#lJ½yáMÇýî¶™Ì*Ö­ßè/¶LÖ'zY\f豯ç÷–væiÓS:¥mÌúÙ5÷×7¶g¡°ÆômÀü$—î¡Éa«ŽÚðõQôæ£òÔ;9|›\îUÝé°HNdÍþ=†&BRO#\0FßÈœëð“5õ:û{¨S|º#Zdä¼r­Ïeì^{†0þ›—÷:â­šLÿsù–6…k|›:ó°?èqhgïpë“R_Í+v¦¯h1@“oü˶÷mÓìü}f·Dw¾`F†Ç÷¿,v»?Ùe¿5µ<¤þ®‰¯_§»;×7@=¦)6 :ž”º”dY±Æ’ª§'hKÓ)£UM•~ƒ)’ß:þ‡º#ÅèÍœ_¶¡ñ­‡iÜ:D.~a¡w´/XæäÜ è»„º÷¨wÛ_¬“xº&æ3áùŸ.gD•z$ë±*¥¯³Ý€ï Ö™ïÊ®]z÷V ù°YKçãÀCJâD¢ =£Ñ‰}7•[ø–aÿ̹o^mþ3SÙ=𫫪Â9jpKS¯$9¼ßxïlÙë›;\BzÜÔ;Ð÷_…ÞÆ endstream endobj 1160 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GÈÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/znªb endstream endobj 1161 0 obj << /Length 494 /Filter /FlateDecode >> stream xÚm“Mo£0†ïü ï!Rz ˜|U‰ÄAÊaÛª‰V½&ö$E 6ÿ~=HÕUAgÞ¿“ɯ÷½Ÿ«ú~üÌÙ´uo$ø›ßÇÆ›LD-û t÷  @Ùö…½›Zî¡cÓÍNìtÙ=YñNËk¯`T=­áRêo ÞæøôeCîŸúòÚ•Úç(>”ÝÕŠæ™ ²ŸAæŠþ€iËZ¿°ð™sn[­6u…c´^0XaÁhî\je?ì„î¼0bª”ÝprOYÙ÷Åû[ÛAµÓçÚKS|ØdÛ™›óøäoF)õ…MZ³©}ß4W@Œ{YÆœmG;ÿë±<œñ®9Ü`‘;‡äKÖ Úæ(Áõ¼”óŒ¥E‘y Õ¹¡ât¤ba¥bi<Îg®bÌÅw­ü:/]×åvYsäˆâ[ä˜â+䄘#ψ]íœôò‚â9ò’8D^osâyMìîÚGÈ‚X o‰ä‚îBŸÉà5Éà‰<øÇ»’ÁÿÂò k£(Do9Örá,Âq¼B?"tŽýEDqì)bbœW$ÄèYÌèM»>sb×gEìjqÞ(ŒæÃ×po¿$îÝ}IdoŒÝ·œn-p!J ÷ýmê«ÜÏ-þøOÃÓ[áýL‡ endstream endobj 1162 0 obj << /Length 696 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS 9Ù_êãP·ò{=éÇsæ@öd”ôÇöçºkŸ˜xäœ;`ÝVY×`Œs4½JaÓQÜ¡n«þª‡í¡.’Uu9\ßèY6î>¼ý<¶Ù´‡.Z.ÙôÍž‡þ“4>DÓ—¾²}Ý~°û¯ÒÜÑör:-d0­V¬²WÑÍÿ¼k,›þ8ãóþy²LÒ»ðºÊ®²çÓ®´ý®ý°Ñ’ó[Å*²mõíLrŸ²?ŒÜÔqù¥ã• â5F8@ šˆ=@Šð)&°  È8Ô¹€ÂÅRx u€Dº\j2H—†ª¡ÐVÁ¹0CzL]ø Âb°ct‘I ©g$`htÑ‹0œÆ\F„áŒ0ä†sê‡á jd< —Iê6œ»õñzgóñºË»þê W ¤qÈ’£+—Ÿ#ö•ñÌÇkÄÞ .‰bªsré…¤šáæÄç†bïmŽXú¾„Kß7ǵHß7Géû„û¾nb§>&jÊØµäuœ¯¼ú•ñ1ÜV™÷•âÜãâµÇ‰Ou$ÕŸqWèS/%1{\øxB!€§ÔK(hH©—TЖ枃»J©Ïϯv×ÜëÁ=küÒ2ø¥UðKÏ‚_:~é$ø¥Óà—ÖÁ/¿Œ ~™Eð+7¿èË¢/ ÿlì¡ÛÒ(/}ïö -+ZXukoûìÔE?Z„ãæÅÛKý£ûƒÎ endstream endobj 1163 0 obj << /Length 695 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS'“ý¥>u;áà¾×ÃÑq~:fc_0F)l®»ö‰‰GιÖm•u f8GÓ«6•ê¶ê¯bØÒ"!YU—Ãõžeã.ÉÛÏó`›M{è¢å’MßÜáyè?IáC4}é+Û×í»ÿ¢Ìl/§ÓÑBãÑjÅ*{pÝìϻƲéOÞ(ïŸ'Ë$½ ¯ªì*{>íJÛïÚ-9_±eQ¬"ÛVßÎ$÷)ûÃÈM—ÏñP:^9À ^`„ª‰Ø ¤Ÿbr š€Œ@ ‘{@(\,…RH¤Ë¡&€ti  mœ+3¤ÇÔ…Ï ,;F™$Б€‘zF†F½ÃiÌeDÎ(ó0œAº1a8§ÎyΠFÆÃp™ nù[¯w6¯»ü·ë¯Îpµ@‡ )9ºréñ9b_iaÏ|¼Fì-ÐÐà’(¦:×ù(—nQHªY^`nA|n(öÞæˆ¥ïK¸ô}s\‹ô}sÔ‘¾oA¸ïë&vqêcâ ¦Œ YK^ÇøÊ›!¡_Ãm•y_)Î=^ ^{œøTGRý÷w…¾1õR³Ç…'ÄxJ½„‚†”zImiî9¸«”êðøüj'pͽܳÁ/-ƒ_Z¿ô,ø¥ãà—N‚_: ~iüÒyðËÈà—Y¿2qó‹¾,ú’ðÏÆºíŒòÒ÷nЪ¢5Q·ö¶ÍNÝ Yô£58.]¼½Ñ¢ä‚í endstream endobj 1164 0 obj << /Length 695 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MSÏ'ûK}êvÂÁ}¯‡£ãütÌƾ`ŒRþØþ\wíœs¬Û*ëÌpަWl:*;ÔmÕ_Ű=¤EB²ª.‡ë=ËÆ]’·ŸçÁ6›öÐEË%›¾¹ÃóÐ’‡húÒW¶¯ÛvÿE™;Ù^N§£… Æ£ÕŠUöà ºÙŸweÓŸ¼QÞ?O–Iz^UÙUö|Ú•¶ßµ6Zr¾bË¢XE¶­¾IîSö‡‘›:.Ÿã¡t¼r€A¼&ÀT±H>Åä4€"÷€P¸X ¤H— BMéÒ@5Ú*08WfH© ŸAX vŒ.2I ##õŒ .z†Ó˜Ëˆ0œQæa8ƒtcÂpNò0œAŒ‡á2 @݆s·>^ïl>^wùo×_áj4RrtåÒãsľÒ žùxØ[ ¡Á%QLu®óQ.Ý¢T³ ¼ÀÜ‚øÜPì½ÍKß—péûæ¸éûæ¨#}ß‚pß×MìâÔÇÄAM²–¼Ž3ð•7CB¿2>†Û*ó¾Rœ{¼@¼ö8ñ©Ž¤ú3îï }cê¥$f Oˆ#ð”z  )õ’ ÚÒÜspW)Õá9ðùÕNàš{=¸g-‚_Z¿´ ~éYðKÇÁ/¿tüÒ:ø¥óà—‘Á/³~eâæ}Yô%áŸ-tÛå¥ïÝ:¡UEk ¢ním›º²èGkp\ºx{)¢ÿÔÞ‚÷ endstream endobj 1165 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½à“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°mUªÕ^!1ÝHDI8ô߯Ÿá-Û@ãçñóŒ=˜»¯Û™®Ú½…œ½Ù¡=÷¥¥?w]pw—µåùd›ñÙÚÊVÓìðÄ^û¶Üڑݧ›lÓÔãƒ#ošòx®ìÄúždìGÝöa÷ïö÷¬<õBÍöçú8ÖÍŒ÷½ŽóÝ4s5vSc~É/ÛuÛ<1ñÈ9w…¼©Òö†`~ÑÁ擲CÝTýE Ûƒ´@HVÕåxùïòäo?‡Ñž6Í¡ ’„ÍßÜä0öŸ^áC0é+Û×Í»¿Qæf¶ç®;ZPÁx°^³Ê\Cçýyw²lþÁ+åý³³Lú±@Ue[Ù¡Û•¶ß56H8_³¤(Ömªÿæ®Ø&ªrT¾„¯PGë ‘¡Ã2†wØ`24XXºBX8aÁá ‰…ÃJû‚ÃA¢`R¥Ðˆ è¡¡‡^]wqº&j9)*ÿìú‹v®`‡ÆRò°Ä:(à!bx8ápŒØ÷¹ììׂN)¤ï‰&â>0Ni¼‚qFãÆù?ü‰SÜÖ€'¼ÂYðàNR–È}Â{àfØ{©çx2­¯AÃ! …u x‰k=Ç{ã™çàäàExo"ÿ}žžRÏÉ‘#£¿¯xÛ _J¼Æ °B ¾Cì©bÏ8!ž‘=Ñ%p&r"àD9ú Q¾ gÌ‘T†uà+ägÐG¡N—š£N8O-(7ZRntH¹Ñ ÊŽ(7:¦ÜhE¹Ñšr£1+ôè‹wÏÏ(O:¿Í“.nódømžŒøš'#¿æÉ„”'³ <™ˆòdbÊ“Q”'³¤<™åÉhÊ“1”'“RžLFy29åÉ”§”SžRAyJ%å)]\ïÌÿòý/Þ&xG¯¯^yî{÷ úÇÖ?tðÄÕ½¾Ç]ÛÁ*ÿñùô·£—"ø »s¨s endstream endobj 1168 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúx²=7û¡i'Ô·fØ[Ê7³Ì–Øçs ~›þÔtíœs[(Ú:ë0p ¦l:ÊÚ5mÝ_”°-tB²º©†ËÈ}W{X¼þ8 æ°jw]¦lúj'OCÿáô=Óç¾6}Ó¾³ûÏÂìÄú|<î D0,—¬6;ÛÏúþµ96ýÆÝ•ñöq4Lº± MUW›ÓqS™~Ó¾› å|ÉÒ²\¦­ÿ›KhÅv7RKås|…*Z© -–1 Üb[Àd¨©0·…°´8¢‚ÅA ‹å i‚É$C#.ÐC¡‡Z\w±ºFÉ|TTýÝôí<\`Gc)y ,©<$¬g„ àˆvàÀ1a×ç²³[ RHדLÄ1>g~¼À8÷ã ãâä”·5ð„ó Bœ…€{’ °$.ô çë°ó 3Çqd­‚®AáEBu<§µŽã¼ñÜqè xΛˆà_¯ÒñÉSæ8q$0ùpûJA· ýRÒ5æÀ aø©§'¤ž!8!‘†žèœIDœœ¨ ¿Ð•ä =cN|hHrªƒŸ?GŸ„tº»Tœtâ<•ð¹QÒçF…>7jæs£"ŸûܨÄçF)ŸEYQУ.Þ?÷yRÅmžTy›'Íoó¤Å×Ozîó¤>OZùO÷yÊ„ÏS&}ž²ÙõÎÜ/ßýÒñ6á½>zÕ¹ïí{èžZ÷Ðá‰kZs}Ý«ÜÇ=ãã?FÏeð‡†§y endstream endobj 1169 0 obj << /Length 740 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°ÛªT«½Bbº‘ ‰B8ô߯ß{ .Û@ãçñóŒ=˜»/Û™®Ú½…œ½Ús{éK;Kîºàî.kËËÉ6Ã/k+[M³ç'öÒ·åÖì>Ýd›¦yÓ”ÇKe'Ö÷$cßëÆS`vÿfÿÌÊS¯fûK}êfÆúVGGùf–¹û\b¸à·íÏuÛ<1ñÈ9w…¼©ÒöÎÁ|Á擬CÝTý¨„íAW $«êrGø]žÜIÀâíÇy°§Mshƒ$aóW7yúÔ÷ÌŸûÊöuóÎî? sÛK×-ˆ`ãθtJ!±'™ˆcøÀ8õãŒ3?NaœâOœâ¶<Dg!Àƒ;IXô ôÀÍ0z)rЃÌ@« kÐpÈBQ]^ÒZä 7ž!‡î /½‰ü òU Ÿ<¥Èɉ#“ÜW ºmÐ/%]cXß!õÔÀ ©gœÎÈ€žhŒœIDœ8QN~ACT/ès⃕QøŠøôQ¤ïRsÒ ç©…Ï–>7:ô¹Ñ ŸùÜèØçF+Ÿ­}n4eEƒ=zG~æó¤óÛ<éâ6O†ßæÉˆ¯y2òkžLèód>O&òy2±Ï“Q>OféódV>OFû<ãódRŸ'“ù<™ÜçÉ>O)÷yJ…ÏS*}žÒÅõÎð—¿tx›à½>zå¥ïÝ{ˆO->tðÄÕ½¾Æ]ÛÁ*üà3>ýcÀè¹þ¤C§~ endstream endobj 1170 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°ÛªT«½Bbº‘ A!úï×ãGpÙö?ŸgìÁÜýxYOTÝmÍ$|äìÕœºs_™Iöss îîò®:L;ü2¦6õ8{zb/}W­ÍÀî³U¾j›áÁ’Wmµ?×fd}OÒæ½i=û°û7ógRúùd{nöCÓN8¨oͰ·”of™-±Ï%æü6ý©éÚ'&9ç¶P´uÖ`àL/"Øt”µkÚº¿(a[è „duS —‘û®ö$°xýqÌaÕîº MÙôÕNž†þÃé{¦Ï}mú¦}g÷Ÿ…Ù‰õùx܈` étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx˜ÏJ›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌYÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vðc­48¸’ï¼äØWtù]Í:P~`áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×Mñ?®Xê endstream endobj 1172 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇ÷zö|ÞNÃ8“È}No)ç£e‘0ñ&hË?q:ûñ«P_¤” X}³ßa†c1¿ðó+³—aì§ ñ j…Ò¢ºÓå‹~»]›ß§¸{_öÅr)æ¿Òâñ4½ÃÏÅüÇÔÇi_ÅýÌÒÊãùpx‹`!d±Z‰>¾¤‚iöïÛ]ó¼¥<½¢Ðô­˜U·ïãñ°íâ´_c±”r%–›Íªˆcÿךv¼åùåš[§\Ù¤­ÕªX*be¨-€@E€-X€÷@à-ê©–·xkM PY«…@ ,Õ#bªE†A Ã5rEqIø†b>ù,¥å½A²$ G#é¨eÛ"&ÎÕcÊ «Dž`%r‰EÅ*˜ñ‚s »–ì(¬Ǩ£5ÇØ«™CIªÙ*”¿à˜ò=Ç”ßò^pÓkŽˆù¬¸ê+ öæ™Ü›bVšLbX+“‰«@­8¦:¤•1”Ï3Jp3<£¤|6¯Çì†ï„ Û^Μø—¬‰ANÅùV¨øþjÌRñµ«ÁÙòy9ð´Žcp³Üס¾½ÔAMË}ÉÄ–û¶¯)¿¢|ÖªÄ,îâ+pp¤•70¯»hÿ8ÖJƒƒ+ùNÀKŽ}E—ßÕ¬åöÎÈk)§åçâÖÓuÜp >õožñ’êð UÙÿ^gÿ{“ýïËì_eÿ{›ýï]ö¿¯³ÿƒÌþ*û?èìÿ`²ÿC™ýBöh²ÿ“giÊÛŒtËéVãŸ;¢Û³Ñ§)½(ôZÑK7bãíA;ìØEô^ß]|ýØÿs‰éQ endstream endobj 1173 0 obj << /Length 750 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•ÚÅ$*B²ó!qض*Õj¯˜n$H¢$úï×3Cð²íh<~3~Ï~î~¼ngºj÷v¦9{³C{îK;Kîºàî.kËóÉ6ã³µ•­¦Ýችöm¹µ#»O7Ù¦©ÇÞ4åñ\Ù õ=ÈØºñ8‡Ý¿Ûß³ò4ÖBÎöçú8ÖÍŒø½ôí>sIv›dXôËöCÝ6OL xû9Œö´im$lþæ6‡±ÿDŽÁü¥¯l_7ìþ–šÛÚž»îhãÁzÍ*{pþçÝɲù·¯˜÷ÏÎ2‰kA¼Ê¶²C·+m¿k>lp¾fIQ¬ÛTÿíÅT±?LÐØAù>J‡ë ‘¡‹e .1›ÊPbéªpqH I$\kL¸8HbØŒShÄ…r =ôêzŠã51Xò‰Qùg×_¸sµ‚2¥äÄ’òÀ€+Š Ä ŠsˆC:CQŒ}.'c-ð”BbOEðƒuê×+Xg~Â:ÿ?aŠÛàj îB€.U ±$,ð¨›ĨA¦ˆA 2®‚žAÃ%‹˜òâ%Õ"µñ 1ô9h¨M„ _®ñ¤)ELN 1éÀs¥ ×þRÒ3fg =傸aîCÑYj¥ VÑÝà^¬w&L˜Ó=·° ½Ð3â„nqFyÀDŽϠOLüñ5'žpÏZx?iéý¤•÷“^x?éÐûIGÞO:ö~ÒÚûI“‡4ðÑíˆÏ¼Ït~ë3]ÜúÌð[ŸñÕgF~õ™QÞgfá}fBï3yŸ™ØûÌ,½ÏÌÊûÌhï3c¼ÏLê}f2ï3“{Ÿ™Âû,åÞg©ð>K¥÷Yº¸¾Nœ0³`Â^Çayî{7)q ã„ÑW7ö:©»¶ƒ*üሟþS`õR$m¯ endstream endobj 1174 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQðÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú ¯M„Ç endstream endobj 1175 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇQÈÙáÒœÆÆÍ8ß›ñäIßž3d_ƒ “~Ù~hZ÷ÄÄ#çÜ W›ö c Ñü*…Í'qÇÆÕýU;€ºHHV7ÕxýÂwuö÷É»Ïa´ç­;¶ÑzÍæoþpûOÔøÍ_úÚöû`÷_¥ù£Ý¥ëNd0m6¬¶G_ÑÏÿ¼?[6ÿvÆçý³³Lâ·ºª¶¶C·¯l¿w6Zs¾aë²ÜDÖÕÿ%!ãpœ¨™§ò%¼b•l¢µËÜc€Ã¤ ¥¤ÀÈ ¤ÀPÀP«[ ßuªŸñ©_õgß_•ñxû4Ž$Oˇú<X^\NB8 ë\;c®‚šBbMx¹ ùy˜%ÆPÈ 3jok:E q:¹Œ/d4ˆ8ð€Q§4ÈA2="\¤ÂšYˆ+ÀË‹ÔÏsä(Äè5$ YŒ—Èú rŠÀ‘€ƒ~ì+A¿\HÈ•ÐWr߯{ÇNøxoËøŠ‡û• ¿”$¿TL~©ù¥òK¥ä—ÊÈ/¥È/¥ƒ†p˜1ðsòQä£*ÉGÍÉG-ÈG-ÉG“zA>ê„|Ô)ù¨3òQ/ÉG½"µ"µ&µ!uN>ê‚|Ô%ùh8ùhùh$ùhbòÅ,n~á†üá°nË£ºô½ß+¸´p]À¢hœ½íµ®í \ˆÓ†¯—2ú á«„Ñ endstream endobj 1176 0 obj << /Length 672 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öÆ6’*ŠdrضjªÕ^pºH‰A@ýûõŒCf»êô¿™yã'æîÇën¦êö`gñ#govh/}egæç¾‹îîò¶ºœ­Ÿ­­m=Oìµo«Ù½Ùæ[׌ž¼uÕéRÛ‰õ=IÛÆú°ûwû{VÇq9;\šÓظî{3ž<ç»cæcìKŒaÊ/ÛM래xäœû@ájÓža†!š_u°ù¤ìظº¿Ša Éꦯ_ø®Îþ2 y÷9Œö¼uÇ6Z¯ÙüÍcÿ‰ ¢ùK_Û¾qìþ‹2²»tÝÉ‚ ƣ͆Õöè úÙŸ÷gËæß x£¼v–IüAUÕÖvèö•í÷îÃFkÎ7l]–›Èºú¿³$dŽ5óT¾„W¬’M´–Âc™B€{ìp˜”!°ôY ju«á»Nõ3>õ«þìû«2¯bŸÆ±“ä)`âPŸÇkÀ‹€ ÀIèÀ§ckgÌUPSH¬©¯@"7#?³d€Ã 9aFíïm-P§ˆ!.@'—1ð… cƒþ0ê”9¨Sæ G„‹TX3 qxr‘ƒúyŽ…¸ýB£†4 ƒñùA¿AN8pÐ}%è— ¹úJîÛxïxÀÀÉïmù_ñp?0£ä—’ä—ŠÉ/µ ¿TB~©”üRù¥ù¥tÐ3~N>ª‚|T%ù¨9ù¨ù¨%ù¨còQ/ÈG:%uF>ê%ù¨Wä£Vä£Öä£6ä£ÎÉG]º$ ' $ML¾˜ÅÍ/üÃð‚?¶ÑmwT—¾÷kW® X³·­ÖµdáƒëpZ¾ðõRF ׃ú endstream endobj 1177 0 obj << /Length 833 /Filter /FlateDecode >> stream xÚmUMoâ0½çWx•Ú‹í„8TÉ·ÔÃ~h[­ö ‰ÛTàп~3„Àªý<óüfüìÜ}ùù<³M¿õ³ø«¿ü¡? µŸåß6ûèî®èëÓÎwÇïÞ7¾WâçÐ×Ïþ(îó§â©k!ø©«ßO£>rþ­í¦ì#î_üŸÙî°Ý)9ÛžÚ÷cÛÍ$‚_Úã{út]PÜ‚‚’~ûáÐöÝ£P_¥”(»&ïw(ãÍÏRÄ|÷ÚvÍpÖ#¶P)-š¶>žgô_ïB?üüq8úÝS÷ÚG«•˜ÿ ‹‡ãðA¢ù¡ñCÛ½‰û[iaéù´ß¿{È2Z¯Eã_c¨ÿûfçÅüÓ/1/{/4ÍëªûÆö›Ú›îÍG+)×bUUëÈwÍk±æ”íëu¬TáOë4[@ˆ 0@`Á%€€! £ˆ ÀòŠ#P°™ €Â.Šw)¡À¡ˆÃºp¨%K€cJ€e Rͤ™¥š”ÚÜÈ(ú*¤Ú1Ž:b®¥DDŒ”˜RÔ@‚ È“2Œ£UŠâR*N)KI˜Î¡Ô€Ã0‡C„‡ÕSƒ,úk“©Éªm:5ÙB“ͦ&[ðY{Åœšì@ê’©É)ÎNMv¨ÜåS“ÊpåÔäJs}irpÐh•…­SÿÝ á™Ø2ŽéÐù¬L9ΙÖVã¼â}åy®XišŽó³ÅÌ8'šz®¸Ý ÊÔšxqŽÓ1ÏGÍyלŒN–Z1f×Xt:æs±ÆìûÐÚ0>w’pÖVR.Õ­rÂ)>ç1qÒ¾ŠùKv´Çì‰ÃHX„¶”­¤„1iSì5r„ÒÈM y°‚R6FBñl´˜¬H>]„³6ê‰áb ×£Ã5&Ã5&0½a'ÔeøvÔbÀ_dfQTtÁŒ£ÇÂQ]z™ÎõKÊ/¯ÆÅWБÉé^Zz…¤&£·¾²å­¯œºõ•Ó·¾ræÖW.»õ•«&_åròUOzò䢓n9¯)ÞþËC]Ÿ†!¼áô §rÛùË7dßï‘E?úøŒ_;Ì~TÑ?mÑ endstream endobj 1178 0 obj << /Length 720 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5•Œ—~uôÇSo•/‘óÚLŽûM¸5ñåš ¿ì06]û Ô½”ÒŠ¶Îº#z½Å¬O,ΊM[³HñÉžÒ¢nªiþ¢wut&!y÷9Nö¸m·^‹Å‹[§á“ßy‹§¡¶CÓ¾‹Û/:ÆîÔ÷j„ô6QÛƒ+ì¼yÜ­X|×ø…úúÙ[¡é[±Êª«íØï+;ìÛw뭥܈uYn<ÛÖÿ­­8ãí0SPƒØ½¤tØ[›Ða³t/-5 ‰¢@¸D@#PŠÃ.P8œ®8P¸@Šz)3v ‚é:+ˆ¢³¢êÏ~˜µKak©8#¹¾†<©ó˜öÕÙ ˜ûHJà”s‰Ÿ1?Ω•8¬4chV<‹rÂ+Š»4‡ °Š¡GŌѴ*¯ Í:ÔˆkÖ©¡Y³'Ú4ìÐZÎ8N¹ìŠÆ¾šk†È Àц}A騇þâŠê‡”»ÌÐãrÅñ>Üï2gLœ‚{QÀ%ãÀáèÿ#âDrdá§QWϾž… Ø\%œ‰Ø_è0ì)ß1Ã× ýöTbo“\½3éõ‚ò‹}7|~ t›‚1<2ì]‚½b>×uâ÷…¾˜õ$è?ž=B͘õ¨óJ©é)ô§Ä§^âÙwœYL–ÅÙGþmøŒœqÂ|:ûtÞ Ò”Ïþ¦³~ðóˆrsðKÆåjþkè/Á™t™ÕiÜP¡ÁECã¡iíe¶õ],zh(žG3¾žJï/QôŒø endstream endobj 1179 0 obj << /Length 720 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5•–Ò¯ŽþxêíàO£ò%r^›éÃq¿£ ·&¾\Tâ—Ʀk„º—Rº@ÑÖYwDo£·˜õ‰ÅYñ¡iëa)Þ ÙSZÔM5Í_ô®ŽÎ$$ï>ÇÉ·í¡óÖk±xq‹ã4|’â;oñ4ÔvhÚwqû¥BÇØúþÃBÞf#j{p…7û£‹ï¿P_?{+4}+VYuµû}e‡}ûn½µ”±.ËgÛú¿µg¼fjj»—”{k:l–F #Q—hJqØ ‡Ó HQ/e†Ã.!Pp #]gQtVTýÙ³v)#l-g„À!×7À'užÓ¾:[sI œr.ñ3æ§À9u¢‡•f Í*‚gQNxEq—æ°V1ô¨˜1šVå•£¡Y‡qÍ:54köDC›†Z+ÂÇ)—]ÑØWs͹8:а/È9õƒ‚ãÐR\Qýr—z\®8Ç€û]按Sp/ ¸d8ýãDœ(B®‘ì!ü4êê¹Ñ׳0û«„30û †=å;føz¡ÞJìm’«w&½^0C~±ï†Ï/nS0†G†½K°WÌçš Nò¾Ð³žýdzG¨³ž5c¾C)Õ!=E€^â”øÔK<ûŽ3‹Iò 8ûÈ¿ Ÿq‚3N˜OgŸÎ{ACšò¹ÂßtÖ~Qn~ɸ\Í ý%ø¯1“.“£: ƒ*4¸hH`<4­½Ì¶¾ë‘E ÅóhÆ×Séý!|Œ¼ endstream endobj 1180 0 obj << /Length 720 /Filter /FlateDecode >> stream xÚ}TMo£0½ó+¼‡JíÆ6„˜*ŠÄ§”öUS­öš‚ÓEj9ôß¯ß IV«ªÐcüfüæÙÌÍçŸÔÝ›õƒ{)^ìØ†ÊúÙÏ}ïÝÜä]u:Úvz´¶¶õyu|ÏCWíì$n³m¾m›éΑ·mõqªí™õ5)µïM{¥`qûjûS5MJKéWG<õvð§Qù9¯Íôá¸ßÑ„[_® *ñËcÓµBÝK)] hë¬;¢·Ñ[ÌúÄâ¬øÐ´õ0‹oì)-ꦚæ/zWGg’wŸãdÛöÐyëµX¼¸Åq>Iñ·xj;4í»¸ýR¡cìN}ÿa¡FHo³µ=¸ÂΛÇýÑŠÅw_¨¯Ÿ½š¾«¬ºÚŽý¾²Ã¾}·ÞZÊX—寳mýßÚŠ3Þ355ˆÝKJ‡½µ 6K÷ÒR#€‘( „K4 ¥8ì…Ã銅 ¤¨—2ÃaÈ(8‘®³‚(:+ªþì‡Y»”¶–Š3Bàë`È“:Ïi_­€¹¤N9—øóSàœ:Q‰ÃJ3†fÁ³('¼¢¸KsØ«zTÌM«òÊÑЬC¸fš5{¢¡MíáŒã”Ë®h쫹fˆÜhØ䜋úAÁqè)®¨~H¹Ë =.W€áCÀý.sÆÄ)¸\2Žþñ?"N!×Hö~uõÜèëY˜€ýÇU˜ˆý…Þò3|½ÐaO%ö6ÉÕ;“^/˜!¿ØwÃç—@·)Ã#ÃÞ%Ø+æsMP'y_è‹YO‚þãÙ#ÔŒYO€š1ß¡”êž"@/qJ|ê%ž}ǙŤaYPœ}ä߆Ï8Á'̧³Oç½ !Mù\áo:ë?(7¿d\®æ¿†þüטI—ÉQ†Á \4$0šÖ^f[ßõÈ¢‡†ây4ãë©ôþ…Œé endstream endobj 1107 0 obj << /Type /ObjStm /N 100 /First 1007 /Length 4667 /Filter /FlateDecode >> stream xÚí\[SI²~çWôã91u¿EllØ`|ðuÂÚ !1’˜±÷ן̬juõMX‚}9±ÃP]ÝU••ùåµZÂBp[ðBî m5tÜñ€„ÀžÇž,„¶ôLRH‰= =%°g i½Áž-”Ò´ÂÊ ½½PhøžIQhoq…T…ÜaÏF;¤,]a¬£y¡0A = o%QVª°Þ+ì™Â M=W8Í9ì¡Bá,ǵZÎ[¤ S¼8O›ÂkIÏ\á½ÄÝt(‚rÈ©E÷00™Kg± ÷\;\c á lcAƒ4y ¨|!õ‚-¬F vÓ†Í-‰kµ,ŒÁQD¡Ò<+£’{@è”JíXÄ_v@G 0®Az!­S…vÀ˜D´‚=d° 6T‚B}„JI«{X¡4èÍ£Ú”>\€”ãaGIyL!÷šK Úô€7ÅQÛ @Ô '¡5ìaöŒÍ Ú‚Ê Ê!§8ê,È tpjÇÞ…á PÊÀ¹CÀ "ìQùFÀžF5Œx+ŒCͧÆz²Dì:€zœéÉ”ðÞmA)()è1õ0diù°ЖHÕJ@Ÿ É*´`¤d¹D[m$ôŽA«¶¸Â*µ¸Â¹#QÖå·GÑ^lô¥Æô-AûÂq  Q{-X‚ 'µ…¬p ­lzÀ°DÓsà\;5àŒ‚yW€$èaØó°-Î9pQÉq…—0­ÆìOxŽzhä° zã¥ñ;¿X’ÿ‚îòŒ8x⪫öt¨uüªj ç³'S/Žèôk²g*[õ³¿*ûE:&£é¤Ý  +|¦°g‰KK}gìžKó”ÃŒ—ž \I}OÏã¤jWR:Gg%겞ò5‘ ^˦Z¼cQÕ¦î+^ßWótBq4™¬´VÈ=Cˆ* “ð‹Om¢ ¡àëÎïVJП1Ôr\A°ØCÇ6 D=èk¯ö ô.´…¾±8Ç84>à(Ìñi¾1¸Ö€™Xƒá 5 ~‹{¸O"ŠVÙ={<àÆã瀖çQ‡õÊhx - VÊžVºø«ûmEügõ,ïA„ã´Âç ‘G ­B$œ“h'Bf`QhyLDÖ"÷ÚÁ˜ó$vÚCb özN|Â%¡‚ûX&Æq `¤-‘ëa „S˜§<ŽæmŽ“œl´*P“°IKžü—´ç‘"„kœG†d öcPã %OAìaÈE­B$EÝÂΠ½€´´BY´&™-J«€®ÅO@ ì¡å!š¦ÀŠè@ÖAúÔ#i9ü Ž4§SŸ¯ùqÇ!!»ÎÄ8D$ƒ&«kß¶ý¬Ô?Áù•€ÿ"¾ö'Î\ƒf@ýØ6öQ¨ ÔÒÈ岺!7hwhm}ÐM1âÅD´²8Öí+ѧmj#­ØJš©8öÄb¤ÕYZs'¼ãŽà‚‰ˬ¥TAÛÔ½|–òˆfl‰|>–±·Iò."UíõØ&x(È£ã&±,¹)˜5 ¨èÜbeѵM&'*%ˆ• â3Z›¨+ ´x¢o"œXcVÛc<Hº´ÝË bIY?Ó=mèTÖ4’*Lsvœ¡(2(²¬¤l4YRÌØ‚UBõ«WÃêÛÿ¶kZ d`ê`†¢JÈÖ…Ú×0!CS%în?•+Pÿã/RÁ_J÷!ì=T@ }Œ±Õ¼œ~|â©‚³àª`h–&¸[Ý«gä ;/7h Ò¢~¢ò¦â&+n,)±MH”p$Ù[a©).QÁbé”Lñfaj4á0ë(Õ'ÝZ¥*zqe¢-1º!ö‰6Γçvuƒé-¸Ù«ïLTGÝËÕˆOkÕbÍæé¡§«Yq¬R‚]ÕQõX2êÇ630K8¾íák—ØÇjöqm¤“·p ¦©¦§6>AuA¥h°$±Ö‘iR]-±PÀ RÐyC¥™Jâ Î)€”x ÆLBã‰*­N}®¡ú1îö¤6¬ó'X;ŠÝ~þ$RÖM=ïK¨„}cNZŸSrMØ8Ié•Öæ4iž"´(kìç£Q¢Ø§6UL” •Û«ZE§)¥éäc±?ÔzMåfH‡»yZé]5õŽUšJÏ+ÚTÑ{‘vŒ³c¿ž¥é^g32 «Þz¦M3ÎHEA”Z¼²º(07°Z¥suôïÑ6=k-IèÉÇ,h߉Y:öÑ%IŒ3&õ½Â&ªÃy:TYMób¥keêÆÖúZW¸OŽF.‘Ñt—QOtä™~ñiCëÎD¢Ö ­[ÍãÚPQ®éDUÏ¢±ˆPì§­)|ÝùÇ?vØù»²`G³éòy¹¸œï–³ùÝ¿ÝÂÈéÙ³ãó/¿<{{ðIH˜Œ®…Ž3fß‹ßw*v%¾£·š†Ýaû‹ËrºÄº‡=Ý—ãë¸õv‡á68¶+pðår4_îO¯'eÁwØÙ²¼ý€ïÐvا´*F q3šŸ•ËâØ>;`ÏØsvÈŽØ vÌ^²7ì-{Ç~e'ì”±söž}`Ù'ö™Øèö®œ/FÓ+vÁ.Ùål2›B{{;bW¬d´+§W£Å ûƾáÿ¿Jömv?g×ì†Ýü¸»)§lÌþ`v˦l:ž–lÆfÐÞ±»Ñ¼œNÊoËØ›1Øn<»bw“ûû“ÍÙ‚-Ê¿€Æbü-Ùòf^–lù÷ŒÝ³¿Øßì;ûÁþ]Îgÿñ< Bç°Óþó§ônÿàäËo  ÃO‚÷+HjPPÀתÚh ]µ†4ÏÄ3õXÎÔ£]¦%ríÜÍgW÷—Ë«ñân2úÁ÷õr<›v,Ëï˦Ԓo"õ¯Þ~B³|ûrÈ,•@³¤Ó‹}À,Õ:³Üº’ÜšAÉ»vù:Yæ û­c™_Ð6'w7#°Ë‹r9"ãD³ëÓ»ž—£e9Ëûûctw7û›Œn/® S.`‹·÷hŽ÷h†ÉâÆ`mó›ZÜø(-&hÕ`s#°µÔr¨ž¿ùõAm{‘Ðøùi€öÃ@[²èMd9>øüæÝ1Éâ×ø }ò!ø ãü 0ÏÉJÎÙ(ŧÚÆp0€´ýÄn$ðáÛ§ÏAàÓ¡à yå&<ºü£\È©1~ á–Þ&¬ü~ ‘ õ‹ÿë$<©4~=Á}¦÷55?½¿½®Æ×ÓMRóŸ÷åÑ:#¡»úyf9åí8ÊVg÷•5õåø«Rå»Ïçï?~~IVå¬JE?ß凟¶*3`UFåVÅs«z¦1ª£ªk\ûa™BW†EŸg©Ñûƒý“}Šev vW¡ ?E ÏòjгRXZÕ‹Qx´¾(~Vö­@è`£ìuøjÿìœBË€ HW å“à†c9ÈÚ’e£ÄôÛÉË×çg(Ë@"r)/9þ4²ØAYF)Õê\IÈ´k½¶`Ø([|†êêìÀpöy°zÅnˆ_eÁ÷¦PÙ®"ÁªŠg#^R28e£ù|ö÷ÅlyÃ. ¬Çw1šS”/Wñ>ÅÅÛñëíýd9¾›ü`Óòš ý¸*:2VÎË+<&ÜÍæ8  /Æ·ãÉhÞDQo÷O_¼8$‡¬ BCÀïÈà÷,œ Oâ°=€§« 'ž›ÏÝ||Ûr½Y1þþã³ãô|øÜc«ã8WOuîQœ{^uNäXH|î)"úʽoͯÎõ³òz;¥gÙzèìÝRÄF±øäËÁþ1:îùù`e z€¬l”äm¦!jÀÛ•¤”ÛÔÕ]%¼^ÿb$«ß:¾ýSÕÜÕl^[u­j.{‘Rf;jMgÙ§­ã_µÝO¯€ËÙ¼\s(Ðe»“wçOžEkp[„€s0Z”8Òý”©)}[xeGãùb‰b8íÍhuþõq|µ¼YÄoòÓäóÙû)D–+Ö‹uLµ?Yi3%E›)Ï3¦0HT<ñzx›óÔþܣÓê%r „π⾇)¹9S­O:<™OÜäLá]TŸöÔæLµ^õw˜rm¦Lhes dOz žšoã;ìpºË’Û"„·_¯µ™ÒëÍ×Ô<©ž¶á­—U–Ô:–¼Ì9êq8·Mün½Tê°Ô àaÐãxǹ-âwûK‡©Ž…+Õ`JçL‰¦¶àís|‡©°S¢ÏÈ·á­“c›'#Ö;^®=8Pôð´E o·:Lu¬Üæ&eñ©Ï¢¶ˆáÝ“S‡«®¡7Ø9_ø—¥4»*šãYvYÝ"¸wEV»¾Q«<œ ñsœnô»‡œ§]ŸÈ“c“QþSŒúžTp2º.pæ™Ýã+‘¸Ÿãa‰þ“¼_ÁQF à—>^#-¸ºx ä•à#4þu«Mtü ¨$]ãÇøÇñS.œØôö›˜VaâáˆÞÒ5~W˜´©‰‘rËML"+øÏñUa¼L×GÀeæ6†i¸ÆMl¬( +ÓsùˆM¬JDãk¹ÂštMÙ˜¤àº\²±I‚ÃúD<$¢Iá.¦ìÂÅò}»M\,jño\Ò5Wé>€ÓÙ$ZMáb¤†kÚĦû›‹%Ж›$+r 6—œÿè<^£$>ÍÛm⣓>Y“Oþâe"Ï8p}„â}²*ã2~e8^]uMã~3¨Æ&>qœb˜Oðž®I ±Iˆ_L)B²¢kd¸¦ûXO@^V/1¸ „õíF5˜ÔùrÅS ï;è¯ýéšà7Éßl¬¦·Üÿm€è­!ù@2ËJ™)Nyó ,B î‚ÿŠ@\'`ÃÀâ÷#)Ì­,ruký¯÷ËÉxŠ$(‰ÌÃôOÐÝŠÙjéx9) RZÞ‡™©î¨…I5Óɼü‹þÅ‚<3ÇåÞÖËÕÚåé ÀÞ•ßk®ZÄäŠXªW*b«Õ‰–ëYŠ1ZmúW§½Eßj]¯k©Nù‰X^W®8«°9ö»²½g½mb/«0niû ·5ôV­]-r†mò¶FÞ„~Ziu'¦FÞ´¯ÀŠœ4Îä5c,Û0Ôݶ¡šZA¦© Ù´IŸ€¦†Z»µ«M.®Q=´t ¼Vý´âê^Nt µ ëÀâMN\ºŠÍ]uä€NÕúQmý4L[õ‰«jà•X·ºzÇV}>ªj5H·–VCø^¾d­©ÖÒj(Eö)EÖJa-ÑðÙç ¢F[¬E[4¢’ì‹J¢Æ^¬Åž7°}Ø‹{>€}Z݇6¯Ñ®^™·Í6}ÓÇ+Æ¢¡Vï.“¡úö&¢ÚDTo.ûƒ°¨^Ä=jîÙt·Î9Dõ¡î©×î)rrÞEIUãMb2wná}Ïê*UÃê*¯¬Ö'"È>Z¦¦%×ÒÊ¥Êøú?=ÏI endstream endobj 1240 0 obj << /Producer (pdfTeX-1.40.24) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20250129143934+01'00') /ModDate (D:20250129143934+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/MacPorts 2022.62882_3) kpathsea version 6.3.4) >> endobj 1186 0 obj << /Type /ObjStm /N 98 /First 908 /Length 3191 /Filter /FlateDecode >> stream xÚ•ZÛnä6}÷Wè1^ 1ï $Xìuv±—§Ed[c+Óît·'ã¿OJ”H©¤™f`ºHV:U¬¢dÉ ÑHïú'½j¤¥ÿ.4JúiiÚ‰F;š·®1fXceh¤ ´Î˜ÆYw#h¼—Ô® ÆÓOÕD¥©Bc¤Ÿ´VxKR*5­¤UYZ"I­†MAzu Åй‘‚[›Hk„J 4M •žàÐPZD®È-%d’äž lÑAƒF¢Š¤LƒUJ8²E™@æ©N™œ†òZ“5i#Фzk)ád @¦p+n¾ÿþæî?ýõÐQK:•ÿº¹û‘2< öçîxMGgøýÜ}J7ýö®ûLstðÛ?”º¼Ÿu™=]ÆTº§KϺD­+ït¹ÀìvqÚíÜîî Æè²³.µ«K”ºx\3Û6ìé²ÛŽcÛÎl[³«KUº8¶í̶ÝeÛ„R׈²ÖefîÍ÷ãnŽm3³mÔnUlçìüc¾\g˜k/sXï~:½’žoýÒä½{tÃEÏAÑ»G@WA1\Pô-öt©*(š Ššƒ¢Ü®®*Dš ‘šC¤6B4ìVÜP3ÛrÁ6Õ¦J¨tÅ:ÀæàXXÊ…M9GEÖQ •ó’sWÎabg³¨¢ ¹(ˆ9 Âí©ª‚À¢s„ÚSU±(¸ˆˆ)"1lkŠUò &ùãÄrÜ!9T¾ &ñãDx\ð]–¢À¸&~ƒcw&£‘á3LtžÍag•„¡,2‹T õÅ~7çë™OÓh®Jù1¿6jÚ܉¸ªæ\»›ûî¢íV;]™ëžIõ¹/úo¥¦ê&š¹÷.ZoÞ9 a’hî´‹F[í¬Ú,×eç&»è±µš²˜shæþºh¯\;»©á‰l†2S2œ”)ù†3&ŠY¨Ÿ^vÛ:1«Âª¼¬z­w»Ö¦ ,mÕƒ¸6÷ÕE[­w–qàzêÜRµRSõSÍÜMÍ´VSFˆë¤s#]ôÑŠm®‹Mt·žÈ2¿sÆ a«:h¾La³ËËø|'ÛµVÒ¯Ø+ÍÜ´v[uae:ÄTv‹iUK™C9ÙÐ2${¹ñ]ûÒ]šÿ}óóéáÛ_Ûóõ–r!­h¾ùÓûÓéz<]»ïä-:5Hÿ|í^ 0F—qKÍM– I,%Š$Cx¡0õ/ýuazZ÷Ëß0¡IÁcy©Ä• ‰/%’PHЛB !°K`“ͼˆGe°¹„@œ.©p”ôyJúÂ-µú’«ò‹ÈÜNkV€zŠV{ß^ÚƒrÄ1L<¶Ͻ P™¨Vòè ¥üØ_ú—Ó§VДÍÖS³Í|Soçî‚X½¢t‰¯ÞÁ»sO©q:*‘RÌÚÂÒwçþñ©#7>®ŒÁûîp鎗k×eôÓ‘Ÿ²%Í>°®`Ù¼‹OíáÚwg³)KWžÚó¡'kÒVÂËÃkwx÷äQµúµ?>žŽ‡Sjf‚ô;Ëì@Ìí0±ò¨À¶Ü³áÌ8OøPâ~n/ÝSû[,"Y›çîØ Ú"bÊÜûõtì.ƒ¸ŒÖ¯¯º‹‹ˆC™ú—×sp\‡ëïÚ›Üb ï̇ӥ?༉%£‡öØ~êäAUòóµ?NWlñ®L¿C'R ›JöÒ½ §*x±žÀ ^²®ÌЖ[xWOæ3a2eH^ÚÇÇþr:Fª¯Ö‡jæJy+PwcIñËëá@Ù*béÉéÐSiÃYT¥øãóÛ¡ÿˆøùÈz1 ªóø?ž.Tvª§)C1ÈQo¢,)<·Ÿ_8 %žË3ÕàǶ?·‘°zQº|9½ÞŸ)ÕQ‰­-CwA³½ïÚ¡ÒñEm†·ÚÃûC5áêJx×Ùq€ƒ¬äŸèfÐoBéû§ŽŠ3Å÷[ßž;JQ!ï±£Œø[{|©úý|åÇ«^Ì;faÙÄ…hîqÿ1Kq@ýýzß?½žÓEÉæª>Š@¿•ˆq‚Ç›QÌKWhÇ:)A˜>¶Oɶо¤ÊQ->!J à WJP=åªzÎV§e+dÄA!—¥F Ie÷ J Žl¾b’I,%™ì–È&«Ó*yªMé»"~lîôƒü¸Ò¦Já+YUà'”¬*x‹KÝ΋6`X²£p_..QáBòÉ WªVå.ªƒâaÙÛiK ÜQKº4žt B+œ€j RÛUtéŠRû±·,.XVm;¾Rvªˆh°+`'ÚBbÀN©Æ”P>Œ0:­âq‰íeD Ñãe‰ËhHʼ7h¬ªZCôøŠxã 1,0XVmóØ^ÅeÆTFÑ>ªÃF(t••ôØ’A OŒN«x\ô¸J!è©rÅ‚_&µ=Õ´ § ¿…Ç!²Àìt"iÕ0Ð+£ '–¢wÉ2HwQ0'!))td;HÏã ·ó*—óLUYš€ªpᮯKìÎAR’ꈞP[‡Ë«Óª `¸ð¹ÒS²`TiÁ§«_µô„j è©éáq<®x;¯âqyÐ+… § ¤ÇÛQI<î^e†áù'V‡ÔãÁQóµÕO­Èoµ"Üœ«#ŽK~¬ÎhÀëS2¤ËIµïClµ†lK¡ù9eXØêEx–‘¢J}<•ä¾|é®ýéø\5´‘ !àåÌ›„:áñ•4mç¢-Í«V §)¢Kæ÷%“ ¯BB¥rNMB a¨…¨FµØW+%„bå&TÄÖzAò;ÊIMŽ_¬ ´E(³[(Ím¹r òõ~ö'] E¦ªš‰ùêTÏ€Éü⥜‘I›ggRHÖÚlÚ²JŒÆåž=¯l2æ[¸IFŽkeä©®ä.½ õŒW#¿ãKB¶Ü²çŠû.]Sè‘kÈÐòãU%OWŒÕ$2ò¡¦ìø’ -÷ìùâÓž1æã’™ð˜XÃpS*ÍM JÏÍ`O”;.%„«M{>ð*g…„I¶˜ÕœO ‡I·è1œ³ g}©^â[îÙwõÆs(PtÊÔªèPHÂæ4Žd~/ÈL£¤H·9Mœ)%v ·;Yw«,ô›MóÓÛ¾y”°mߦ·|S‰8c6§Sœëkøý_&@ %}Ë0:±9 ŒÎlNC¹césCâX¹5™Þc}Ñy5Õ¢åî/øî†Ô³qË>dÙœ÷ò²ÒÔ“éï^Üdˆ4~k5ÅÊ}¯Gäìî/8†Ú-­Ýî/qkuŠ'³(VnÓµT±FZ®íýax{&Ô¾³#âiÇÊÁaÉ’_† ’ÛXJÐõŸ#§ýÓªÉÄ_ûGZ!sOI#ƒ8Æ—rì.?åÚúƒçî_U²½ñBž>`6\dL1|Ý>VoC'k£/j|Q˜¾x*t|á5æê]ÎhE ›5¸<ðyò #‘_z+S>šf 2£–µÌ¨Ç—2éûéqà¶2™ ôd#c–³Ì˜UfOeJ}ÝÝv»me³*;¢²#*;¢2Êe£ØJóÜæÒGÝÃ@gŸtöIgnµÞKó¯skýŽëÿ…¬3 ëGàÎjÿÏÝ…¥ÏÌ˯*Þ>vÍÝOíµ=œžð9ÅU™?¿ûÇëõÐQþÀ"¡ôúøÆS÷÷Ócw÷ßK——ÓÆÝñÇäR£†:‹¿qqÅS endstream endobj 1241 0 obj << /Type /XRef /Index [0 1242] /Size 1242 /W [1 3 1] /Root 1239 0 R /Info 1240 0 R /ID [<04E1E09CE0ED6FF1F463C56992E1458D> <04E1E09CE0ED6FF1F463C56992E1458D>] /Length 3031 /Filter /FlateDecode >> stream xÚ%˜[lG†÷ûþíÄÛq|ˆIìÄŽãC'ŽØ±ã?Žíœí“ØñïÄ ¥€ T… êJ Aå.ZN*[@ ­*D[(P@¤VZ„D«HP‰ƒZ±mŠTAØçu.žÌ÷άÿÝ™wf¾ÏËl¿›ñ¼ŒgžWÍ{3^.èC3AëFÛO˜9´Ch½„yP†vma”£ õV€-hGк ·‚J´q´½„UÀ¡M í!¬5hÇѺkÁ6´Sh„u`;Ú9´Ý„õ í<Ú.ÂFЄæ£í$ÜšS-) u¶€V´hí„m ­M¡ïDÛƒÖJ¨ÚvMJ/Ù…6ƒÖL¨Ü‹¦wÖk¨szÐôÎM„êØ^´54}‚¥í:Za?Èx™’‡¦ÏÐòhÛ ‡ÀA´24uÝ08„V‰¶ð0A«BS·£hê—Â1pm7š†ìGëDs„à8Z/š†{L¡ÉC•„'À4Ú14Y¥N¢Í¢m!œ§Ð. Éf³`í"Z9á<8vM=΢•ÐÊÏóhëh²÷þ©LœAË.€E´,š¦†.¡mEË.ËhÕhšVWÀU´íhá2XAK“óo^«høÊ¿IXkhƒhë„×Á 4úÏ¿A¨Š›hÌA_Mø£Q:ÙëÞëQÁDô×Ðx«(ƒFgûüFÄE94&§¿JHoDehLNŸ÷‹èɨAñW…h Ú4¾-b£J´´«„Œ~äÐVÐè—çD5h·Ð.âº(µc¶ˆ }ú4±Ñv4‡v‰·G hÛЈ™5¡Õ¡-2Ë¢f4Àg,#fhÔŠÖŽv‘Ùµ£1Ù}|1Ù£hChç ™ìÑn4 Š˜ìQšà,!“=Ú‹v ÿELö¨…Ì?MÈdzÑÔWx7b²G,ÍS<Lìè y…><z«€…ÛgE÷™ÄÑ! Ò`G£€©LØh0M£ã€ÉM¦d4 ˜ˆÑIÀô‹N&]4ôºú} ¾\]¢¾R'ªwÕí ”FPV‘†Í+\Ÿ¥á–d.¹Nv”Oe`ìáûßGÌ”è ¼v5Ú˲@;Xhß*íV@{ÔV © h?ªÚ…jöž: §hŸiÚ]v€6 s]5ÏíÔ 53(ƒæ-ô+d;Ù`ÿØh5¯­GZ`ÿØèìl »Ìk?®&Z•†ÑØ!6öö…~0€!0 ö™×õ´þŠ1Üep\E; &Á˜yýë ­d>K½?‚vLƒ"˜Sæ´é ¶;¿ô½äI~c™Ò<8 ΀K`μã/èÙ³à¸À"¸ ®½©þÔ ¸VA ¬ëàX7Iøƒ$$Á I0H‚Ì`†$²Ê’y³ßѳlŸþ~>f\« ÖÀuþx6ô€ Ȃț÷Ækª-P*À ×Àu &L*Ì[=¬7À˜ >Mß'&µæÝóÕâΟ&3QŠÓ`Þ}ÓªmâíPRžƒYe-¸.QNÓbÞ÷©1+a¨_SÂ’:ñ¡;ª`™ kS#Qê²ôzé¿»”pX‚1<™t›÷ðGô¬ò—ƒ`À¼Û›ïJŸzzÉtQøÒ§ÔD‹ª~·è+1k2jÞ7Ï©ÉMp{2¦Àqp̼'¿¬&ï&x79&Í{öǪÅÊÉÀ¢ M°h‚“Yó~¦ä99˨۱c‚E\œ\4ïŇÔd‘wa"&>À±Iê¡ßüPµX9Á» ÞMði²lÞᄀZ¬œ¡øc”n‘œÈ¬ëæýù=jÂF_2³ðAvöRdÍ{û^…9ží¡TؘKì°%¶ÞR¹yÿýµÚmu lÕf…;ªeÿ (   Ô›Õ~OMš@3h­ ì{@»YË?ÔXyް°‹ÒQ~COt½ó~°×¬{Pí£ ûyØNØ”ïe¹Jkû̆>£'´#vòD`ïwÝÔ*·6¿¡ÆJ•ÛŽe¯GÌf·©V î$˜0[š–¦dö(‚)³õEULó»Ç(Í%¤'ÍÞ÷}Õ*gUBª tÞìþ©â ¯ÖIiœ3{°QÊJ}@ŽYZd‘¥E³OîVVï°‹©dé Y,-›}¾VMÈ'KòËu³Ç¾-íoʧÆJ ÉúJ·Ìž¨Th–ùàS*)õS®—7{æ¢4¼+¯«0ûiAšR?åpUf/•KSš· 0¾q=¨5{åCªÕ$Æ 1ö‰Ì^ý˜*v­R”0\Übö§*Õâ°'ÆŒeœšëÍ%Uh÷R:Íį̂‚Ή1\Ümöîæc³¸ô¦kóýÒp]Œ›â~Ë”k@ã^ƒáŽqX< °J«v—ÀÈ …•„7-—½Wµ·,wèee2 TXe¹zQè#j o±\Û×TÁh…>?ìµÜž7UAVöz7tgHç„Ú+Žº)¤›Bº)¤_Bõ ê%‹€~ éˆð 7Bº)œôK¨ÅWû9Ò!Òá ×BÐáкKÖ^Ë€t0$ ICÒÁt0$ •Ò±!³'ä¬ë¸±q¸gp\,8önǵ#Ñt\N¹rP¶.ÓÅq:v‡— ®05ÇaÇù×qàuõ 4–WÇUŽã`âZ@+`wv$ùŽ §ísÔrýïèMÛ@»åNŒ+dwœDgNÇéÓõ€}€Û·05‡Çzê¸Æpû´ã<ã†' ÇyÚ‘ë9n+Ü( ¯sG'Çõ„ã>Âq;è&+«ãŒíØ„]pç8‰8ÚŽÛ 7æK©ã¶Â\Æ9nß×JŽ{$ÇYÜ‘È9® Ý%À4p—ÁU°Órkê n™|ýî2à~Ã]«€lÎq‘縹s쿎û&wèâóò=oð§|áë[øØÂWJ‡-|?°…-üt>ÿU=¶År ©´ÕrÏþK¥JËgêTª²|{Q%gùÙ•ª-ÿÈ]•j,ÿÖæ³µVV÷+•¶YÙÈ‹*ÕYÙb‡JÛ­ìÃÏ©Toe_yT¥+{þ•­PÞ©R“V^Si‡no>Ûl…§7£Å ÏϨÔj…_<®R›þ° R»þ²êYáõÛ)þúJŠ7_Mñ·×SÜù{Šw¥xg9Å>›â¿L»ÎÞM‘LQ‘OQùû5-)êªRÔßMÑt'EëÇSt|+Åî—ôk¸Ä×yU×1ºÓš³ò1 E€ml`ÛÛØ6À¶¶ t5®{L]~ë¶ÛØ6À¶n4uå­;n]jcÛÛØ6À¶ö t}¬ûb]tëæÛØ6À¶¶ °m ;d]ë6TןØ6À¶n»±m€mlè6ïø4À§> ði {Q]8놟ëV>úhÚa§^öþŽ+†ã endstream endobj startxref 542418 %%EOF stephaneguindon-phyml-76a39c8/doc/phyml-manual.tex000066400000000000000000005445361501136442400223160ustar00rootroot00000000000000\documentclass[a4paper,12pt]{article} \usepackage{fancyvrb} \usepackage{amsfonts} \usepackage{graphicx} \usepackage{tabularx} % \usepackage{color} \usepackage{xcolor} \usepackage{psfrag} \usepackage[hyphens]{url} % \usepackage{vmargin} \usepackage{cite} \usepackage{caption2} \usepackage{hyperref} \usepackage{makeidx} \usepackage[fleqn]{amsmath} \renewcommand{\captionlabeldelim}{.} \def\thesection{\arabic{section}} \renewcommand{\thefigure}{\arabic{figure}} \renewcommand{\thetable}{\arabic{table}} \newcommand{\hl}{\noalign{\vskip3pt}\hline\noalign{\vskip3pt}} \newcommand{\hrf}{\hrulefill} \newcommand{\tc}[1]{\textcolor{black}{#1}} \newcommand{\dc}[1]{\textcolor{green}{#1}} % \usepackage[none]{hyphenat} \newcommand{\rep}[3][1] { \psfrag{#2}[c][c][#1]{#3} } \newcommand{\x}[1]{\texttt{#1}} \newcommand{\sfv}{$\Lambda$V} \DeclareMathOperator*{\Ex}{\mathbb{E}} \newcommand{\Var}{\mathrm{Var}} % \setpapersize{A4} % \hypersetup{colorlinks=true,linkcolor=blue,urlcolor=red,linkbordercolor=000} \hypersetup{colorlinks=true,linkcolor=blue,urlcolor=orange} \renewcommand{\baselinestretch}{1.} \makeindex \begin{document} \sloppy \begin{center} \thispagestyle{empty} \vfill\vfill % \rule{\linewidth}{0.02cm}\\ {\Huge \textbf{ P~h~y~M~L~~--~~M~a~n~u~a~l}} \vspace{-0.4cm}\\ % \rule{\linewidth}{0.02cm}\\ \vfill {\huge Version 3.0 \\ \today \vfill \normalsize \href{https://github.com/stephaneguindon/phyml}{https://github.com/stephaneguindon/phyml}\\ \vspace{0.4cm} \href{http://www.atgc-montpellier.fr/phyml}{http://www.atgc-montpellier.fr/phyml}} \end{center} \clearpage \tableofcontents \clearpage {\par \small \noindent \copyright Copyright 1999 - 2008 by PhyML Development Team.\\ \noindent The software PhyML is provided ``as is'' without warranty of any kind. In no event shall the authors or his employer be held responsible for any damage resulting from the use of this software, including but not limited to the frustration that you may experience in using the package. All parts of the source and documentation except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. } { \noindent \setlength{\baselineskip}{0.5\baselineskip} \section{Availability} \begin{itemize} \item Binaries: \href{http://www.atgc-montpellier.fr/phyml}{http://www.atgc-montpellier.fr/phyml} \item Sources: \href{http://stephaneguindon.github.io/phyml-downloads/}{http://stephaneguindon.github.io/phyml-downloads/} \item Discussion forum: \href{http://groups.google.com/group/phyml-forum}{http://groups.google.com/group/phyml-forum} \end{itemize} } { \noindent \setlength{\baselineskip}{0.7\baselineskip} \section{Authors} \begin{itemize} \item { St\'ephane Guindon} and { Olivier Gascuel} conceived the original PhyML algorithm. \item { St\'ephane Guindon} conceived the PhyTime method. \item { St\'ephane Guindon, David Welch and Louis Ranjard} conceived the PhyloGeo method. \item { St\'ephane Guindon, Wim Hordjik} and { Olivier Gascuel} conceived the SPR-based tree search algorithm. \item { Maria Anisimova} and { Olivier Gascuel} conceived the aLRT method for branch support. \item { St\'ephane Guindon, Franck Lethiec}, Jean-Francois Dufayard and Vincent Lefort implemented PhyML. \item St\'ephane Guindon implemented PhyloGeo, PhyREX and PhyTime. \item { Jean-Francois Dufayard} created the benchmark and implemented the tools that are used to check PhyML accuracy and performances. \item { Vincent Lefort, St\'ephane Guindon, Patrice Duroux} and { Olivier Gascuel} conceived and implemented PhyML web server. \item { Imran Fanaswala} interfaced PhyML with BEAGLE. \item St\'ephane Guindon wrote this document. \end{itemize} } \clearpage % \section{ML in phylogenetics: the basics.} \section{Overview} PhyML \cite{guindon03} is a software package which primary task that is to estimate maximum likelihood phylogenies from alignments of nucleotide or amino-acid sequences. It provides a wide range of options that were designed to facilitate standard phylogenetic analyses. The main strength of PhyML lies in the large number of substitution models coupled to various options to search the space of phylogenetic tree topologies, going from very fast and efficient methods to slower but generally more accurate approaches. It also implements two methods to evaluate branch supports in a sound statistical framework (the non-parametric bootstrap and the approximate likelihood ratio test). PhyML was designed to process moderate to large data sets. In theory, alignments with up to 4,000 sequences 2,000,000 character-long can analyzed. In practice however, the amount of memory required to process a data set is proportional of the product of the number of sequences by their length. Hence, a large number of sequences can only be processed provided that they are short. Also, PhyML can handle long sequences provided that they are not numerous. With most standard personal computers, the ``comfort zone'' for PhyML generally lies around 100-500 sequences less than 10,000 character long. For larger data sets, we recommend using other softwares such as RAxML \cite{raxml}\index{RAxML} or GARLI \cite{garli}\index{GARLI} or Treefinder (\href{http://www.treefinder.de}{http://www.treefinder.de}). \section{Bug report}\index{bug} While PhyML is, of course, bug-free (!) (please read the disclaimer carefuly...), if you ever come across an issue, please feel free to report it using the discuss group web site at the following address: \url{https://groups.google.com/forum/?fromgroups#!forum/phyml-forum}. Alternatively, you can send an email to \url{s.guindon@auckland.ac.nz}. Do not forget to mention the version of PhyML and program options you are using. \section{Installing PhyML} \subsection{Sources and compilation}\index{compilation} The sources of the program are available free of charge from \url{http://stephaneguindon.github.io/phyml-downloads/}. The compilation on UNIX-like systems is fairly standard. It is described in the `\x{INSTALL}' file that comes with the sources. In a command-line window, go to the directory that contains the sources and type: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure; make clean; make V=0; \end{verbatim} } By default, PhyML will be compiled with optimization flags turned on. It is possible to generate a version of PhyML that can run through a debugging tool (such as \x{ddd}\label{ddd}) or a profiling tool (such as \x{gprof}\label{gprof}) using the following instructions: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-debug; make clean; make V=0; \end{verbatim} } % {\em Note} -- when PhyML is going to be used mostly of exclusively in batch mode, it is preferable % to turn on the batch mode option in the Makefile. In order to do so, the file \x{Makefile.am} needs % to be modified: add \x{-DBATCH} to the line with \x{DEFS=-DUNIX -D\$(PROG) -DDEBUG}. \subsection{Installing PhyML on UNIX-like systems (including Mac OS)} Copy PhyML binary file in the directory you like. For the operating system to be able to locate the program, this directory must be specified in the global variable \x{PATH}. In order to achieve this, you will have to add \x{export PATH="/your\_path/:\${PATH}"} to the \x{.bashrc} or the \x{.bash\_profile} located in your home directory (\x{your\_path} is the path to the directory that contains PhyML binary). \subsection{Installing PhyML on Microsoft Windows}\label{sec:install-windows} Copy the files \x{phyml.exe} and \x{phyml.bat} in the same directory. To launch PhyML, click on the icon corresponding to \x{phyml.bat}. Clicking on the icon for \x{phyml.exe} works too but the dimensions of the window will not fit PhyML PHYLIP-like interface. \subsection{Installing the parallel version of PhyML}\label{sec:MPI}\index{MPI}\index{bootstrap!parallel} Bootstrap analysis can run on multiple processors. Each processor analyses one bootstraped dataset. Therefore, the computing time needed to perform $R$ bootstrap replicates is divided by the number of processors available. This feature of PhyML relies on the MPI (Message Passing Interface) library. To use it, your computer must have MPI installed on it. In case MPI is not installed, you can dowload it from \href{http://www.mcs.anl.gov/research/projects/mpich2/}{http://www.mcs.anl.gov/research/projects/mpich2/}. Once MPI is installed, it is necessary to launch the MPI daemon. This can be done by entering the following instruction: \x{mpd \&}. Note however that in most cases, the MPI daemon will already be running on your server so that you most likely do not need to worry about this. You can then just go in the \x{phyml/} directory (the directory that contains the \x{src/}, \x{examples/} and \x{doc/} folders) and enter the commands below: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-phyml-mpi; make clean; make; \end{verbatim} } A binary file named \x{phyml-mpi} has now been created in the \x{src/} directory and is ready to use with MPI. A typical MPI command-line which uses 4 CPUs is given below: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} mpirun -n 4 ./phyml-mpi -i myseq -b 100 \end{verbatim} } \noindent Please read section \ref{sec:parallel_bootstrap} of this document for more information. \subsection{Installing PhyML-BEAGLE}\label{sec:install-phyml-beagle} {\em Note: I haven't found the time nor the resources to make sure the code of PhyML stays compatible with the BEAGLE library. Please do not hesitate at all to contact me if you'd like to contribute here.} \\ \\ PhyML can use the BEAGLE\cite{ayres12} library for the likelihood computation. BEAGLE provides provides significant speed-up: the single core version of PhyML-BEAGLE can be up to 10 times faster than PhyML on a single core and up to 150 times on Graphical Processing Units. PhyML-BEAGLE will eventually have of the features of PhyML, even though at the moment the boostrap and the invariant site options are not available. Also, please note that in some cases, the final log-likelihood reported by PhyML and PhyML-BEALGE may not exactly match, though the differences observed are very minor (in the 10$^{-4}$ to 10$^{-4}$ range). In order to install PhyML-BEAGLE, you first need to download and install the BEAGLE library available from \url{https://code.google.com/p/beagle-lib/}. Then run the following commands: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-beagle; make clean; make; \end{verbatim} } A binary file named \x{phyml-beagle} will be created in the \x{src/} directory. The interface to \x{phyml-beagle} (i.e., commandline option of PHYLIP-like interface) is exactly identical to that of PhyML. \section{Program usage.}\label{sec:phyml_new} PhyML has three distinct user-interfaces. The first corresponds to a PHYLIP-like text interface that makes the choice of the options self-explanatory. The command-line interface is well-suited for people that are familiar with PhyML options or for running PhyML in batch mode. The XML interface is more sophisticated. It allows the user to analyse partitionned data using flexible mixture models of evolution. \subsection{PHYLIP-like interface} The default is to use the PHYLIP-like text interface by simply typing `\x{phyml}' in a command-line window or by clicking on the PhyML icon (see Section \ref{sec:install-windows}). After entering the name of the input sequence file, a list of sub-menus helps the users set up the analysis. There are currently four distinct sub-menus: % \begin{figure} % \resizebox{15cm}{9cm}{\includegraphics{./fig/interface.eps}} % \caption{PHYLIP-like interface to PhyML.} % \label{fig:interface} % \end{figure} \begin{enumerate} \item {\em Input Data}: specify whether the input file contains amino-acid or nucleotide sequences. What the sequence format is (see Section \ref{sec:input_output}) and how many data sets should be analysed. \item {\em Substitution Model}: selection of the Markov model of substitution. \item {\em Tree Searching}: selection of the tree topology searching algorithm. \item {\em Branch Support}: selection of the method that is used to measure branch support. \end{enumerate} \noindent `\x{+}' and `\x{-}' keys are used to move forward and backward in the sub-menu list. Once the model parameters have been defined, typing `\x{Y}' (or `\x{y}') launches the calculations. The meaning of some options may not be obvious to users that are not familiar with phylogenetics. In such situation, we strongly recommend to use the default options. As long as the format of the input sequence file is correctly specified (sub-menu {\em Input data}), the safest option for non-expert users is to use the default settings. The different options provided within each sub-menu are described in what follows. \subsubsection{Input Data sub-menu} \begin{center}\framebox{\x{[D] ............................... Data type (DNA/AA)}} \end{center} Type of data in the input file. It can be either DNA or amino-acid sequences in PHYLIP format (see Section \ref{sec:input_output}). Type \x{D} to change settings. \vspace{0.7cm} \begin{center} \framebox{\x{[I] ...... Input sequences interleaved (or sequential)}} \end{center} PHYLIP format comes in two flavours: interleaved or sequential (see Section \ref{sec:input_output}). Type \x{I} to selected among the two formats. \vspace{0.7cm} \begin{center} \framebox{\x{[M] ....................... Analyze multiple data sets}} \end{center} If the input sequence file contains more than one data sets, PhyML can analyse each of them in a single run of the program. Type \x{M} to change settings. \vspace{0.7cm} \begin{center} \framebox{\x{[R] ............................................ Run ID}} \end{center} This option allows you to append a string that identifies the current PhyML run. Say for instance that you want to analyse the same data set with two models. You can then `tag' the first PhyML run with the name of the first model while the second run is tagged with the name of the second model.\index{run ID} \subsubsection{Substitution model sub-menu}\label{sec:submenus} \begin{center} \framebox{\x{[M] ................. Model of nucleotide substitution}} \end{center} \begin{center} \framebox{\x{[M] ................ Model of amino-acids substitution}} \end{center} PhyML implements a wide range of substitution models: JC69 \cite{jukes69}, K80 \cite{kimura80}, F81 \cite{felsenstein81a}, F84 \cite{phylip2}, HKY85 \cite{hasegawa85}, TN93 \cite{tamura93} GTR \cite{lanave84,tavare86} and custom for nucleotides; LG \cite{le08}, WAG \cite{whelan01b}, Dayhoff \cite{dayhoff78}, JTT \cite{jones92}, Blosum62 \cite{henikoff92}, mtREV \cite{adachi96}, rtREV \cite{dimmic02}, cpREV \cite{adachi00}, DCMut \cite{kosiol04}, VT \cite{muller00} and mtMAM \cite{cao98} and custom for amino acids. Cycle through the list of nucleotide or amino-acids substitution models by typing \x{M}. Both nucleotide and amino-acid lists include a `custom' model. The custom option provides the most flexible way to specify the nucleotide substitution model. The model is defined by a string made of six digits. The default string is `\x{000000}', which means that the six relative rates of nucleotide changes: $A \leftrightarrow C$, $A \leftrightarrow G$, $A \leftrightarrow T$, $C \leftrightarrow G$, $C \leftrightarrow T$ and $G \leftrightarrow T$, are equal. The string `\x{010010}' indicates that the rates $A \leftrightarrow G$ and $C \leftrightarrow T$ are equal and distinct from $A \leftrightarrow C = A \leftrightarrow T = C \leftrightarrow G = G \leftrightarrow T$. This model corresponds to HKY85 (default) or K80 if the nucleotide frequencies are all set to 0.25. `\x{010020}' and `\x{012345}' correspond to TN93 and GTR models respectively. The digit string therefore defines groups of relative substitution rates. The initial rate within each group is set to 1.0, which corresponds to F81 (JC69 if the base frequencies are equal). Users also have the opportunity to define their own initial rate values. These rates are then optimised afterwards (option `\x{O}') or fixed to their initial values. The custom option can be used to implement all substitution models that are special cases of GTR. Table \ref{tab:modelcode} on page \pageref{tab:modelcode} gives the correspondence between the `standard' name of the model (see \url{http://mbe.oxfordjournals.org/content/18/6/897/F2.large.jpg}) and the custom model code. The custom model also exists for protein sequences. It is useful when one wants to use an amino-acid substitution model that is not hard-coded in PhyML. The symmetric part of the rate matrix, as well as the equilibrium amino-acid frequencies, are given in a file which name is given as input of the program. The format of this file is described in the section \ref{sec:customaa}. \vspace{0.7cm} \begin{center} \framebox{\x{[F] ................. Optimise equilibrium frequencies}} \end{center} \begin{center} \framebox{\x{[E] ......... Equilibrium frequencies (empirical/user)}} \end{center} \begin{center} \framebox{\x{[F] . Amino acid frequencies (empirical/model defined)}} \end{center} For nucleotide sequences, optimising equilibrium frequencies means that the values of these parameters are estimated in the maximum likelihood framework. When the custom model option is selected, it is also possible to give the program a user-defined nucleotide frequency distribution at equilibrium (option \x{E}). For protein sequences, the stationary amino-acid frequencies are either those defined by the substitution model or those estimated by counting the number of different amino-acids observed in the data. Hence, the meaning of the \x{F} option depends on the type of the data to be processed. \vspace{0.7cm} \begin{center} \framebox{\x{[T] .................... Ts/tv ratio (fixed/estimated)}} \end{center}\index{$\kappa$}\index{ts/tv ratio} Fix or estimate the transition/transversion ratio in the maximum likelihood framework. This option is only available when DNA sequences are to be analysed under K80, HKY85 or TN93 models. The definition given to this parameter by PhyML is the same as PAML's\index{PAML} one. Therefore, the value of this parameter does {\it not} correspond to the ratio between the expected number of transitions and the expected number of transversions during a unit of time. This last definition is the one used in PHYLIP\index{PHYLIP}. PAML's manual gives more detail about the distinction between the two definitions (\url{http://abacus.gene.ucl.ac.uk/software/paml.html}). \vspace{0.7cm} \begin{center} \framebox{\x{[V] . Proportion of invariable sites (fixed/estimated)}} \end{center}\index{invariable sites}\index{proportion of invariants} The proportion of invariable sites, i.e., the expected frequency of sites that do not evolve, can be fixed or estimated. The default is to fix this proportion to 0.0. By doing so, we consider that each site in the sequence may accumulate substitutions at some point during its evolution, even if no differences across sequences are actually observed at that site. Users can also fix this parameter to any value in the $[0.0,1.0]$ range or estimate it from the data in the maximum-likelihood framework. \vspace{0.7cm} \index{gamma distribution (discrete)!mean vs. median} \index{gamma distribution (discrete)!number of categories} \index{gamma distribution (discrete)!shape parameter} \begin{center} \framebox{\x{[R] ....... One category of substitution rate (yes/no)}} \end{center} \begin{center} \framebox{\x{[C] ........... Number of substitution rate categories}} \end{center} \begin{center} \framebox{\x{[A] ... Gamma distribution parameter (fixed/estimated)}} \end{center} \begin{center} \framebox{\x{[G] .........`Middle' of each rate class (mean/median)}} \end{center} Rates of evolution often vary from site to site. This heterogeneity can be modelled using a discrete gamma distribution. Type \x{R} to switch this option on or off. The different categories of this discrete distribution correspond to different (relative) rates of evolution. The number of categories of this distribution is set to 4 by default. It is probably not wise to go below this number. Larger values are generally preferred. However, the computational burden involved is proportional to the number of categories (i.e., an analysis with 8 categories will generally take twice the time of the same analysis with only 4 categories). Note that the likelihood will not necessarily increase as the number of categories increases. Hence, the number of categories should be kept below a ``reasonable'' number, say 20. The default number of categories can be changed by typing \x{C}. The middle of each discretized substitution rate class can be determined using the mean or the median. PAML, MrBayes and RAxML use the mean. However, the median is generally associated with greater likelihoods than the mean. This conclusion is based on our analysis of several real-world data sets extracted from TreeBase. Despite this, the default option in PhyML is to use the mean in order to make PhyML likelihoods comparable to those of other phylogenetic software. One must bare in mind that {\color{red}{likelihoods calculated with the mean approximation are not directly comparable to the likelihoods calculated using the median approximation}}. The shape of the gamma distribution determines the range of rate variation across sites. Small values, typically in the $[0.1,1.0]$ range, correspond to large variability. Larger values correspond to moderate to low heterogeneity. The gamma shape parameter can be fixed by the user or estimated via maximum-likelihood. Type \x{A} to select one or the other option. \subsubsection{Tree searching sub-menu} \begin{center} \framebox{\x{[O] ........................... Optimise tree topology}} \end{center} By default the tree topology is optimised in order to maximise the likelihood. However, it is also possible to avoid any topological alteration. This option is useful when one wants to compute the likelihood of a tree given as input (see below). Type \x{O} to select among these two options. \vspace{0.7cm} \begin{center} \framebox{\x{[S] .................. Tree topology search operations}} \end{center} PhyML proposes three different methods to estimate tree topologies. The default approach is to use simultaneous NNI. This option corresponds to the original PhyML algorithm \cite{guindon03}. The second approach relies on subtree pruning and regrafting (SPR). It generally finds better tree topologies compared to NNI but is also significantly slower. The third approach, termed BEST, simply estimates the phylogeny using both methods and returns the best solution among the two. Type \x{S} to choose among these three choices. \vspace{0.7cm} \begin{center} \framebox{\x{[R] ......................... Use random starting tree}} \end{center} \begin{center} \framebox{\x{[N] .................. Number of random starting trees}} \end{center} When the SPR or the BEST options are selected, is is possible to use random trees rather than BioNJ or a user-defined tree, as starting tree. If this option is turned on (type \x{R} to change), five trees, corresponding to five random starts, will be estimated. The output tree file will contain the best tree found among those five. The number of random starts can be modified by typing \x{N}. Setting the number of random starting trees to $N$ means that the analysis will take (slightly more than) $N$ times the time required for a standard analysis where only one (BioNJ) starting tree is used. However, the analysis of real data sets shows that the best trees estimated using the random start option almost systematically have higher likelihoods than those inferred using a single starting tree. \vspace{0.7cm} \begin{center} \framebox{\x{[U] ........ Starting tree (BioNJ/parsimony/user tree)}} \end{center}\index{BioNJ} When the tree topology optimisation option is turned on, PhyML proceeds by refining an input tree. By default, this input tree is estimated using BioNJ \cite{gascuelNJ}. The alternative option is to use a parsimony tree. We found this option specially useful when analysing large data sets with NNI moves as it generally leads to greater likelihoods than those obtained when starting from a BioNJ trees. The user can also to input her/his own tree. This tree should be in Newick format (see Section \ref{sec:input_output}). This option is useful when one wants to evaluate the likelihood of a given tree with a fixed topology, using PhyML. Type \x{U} to choose among these two options. \subsubsection{Branch support sub-menu} \begin{center} \framebox{\x{[B] ................ Non parametric bootstrap analysis}} \end{center} The support of the data for each internal branch of the phylogeny can be estimated using non-parametric bootstrap. By default, this option is switched off. Typing \x{B} switches on the bootstrap analysis. The user is then prompted for a number of bootstrap replicates. The largest this number the more precise the bootstrap support estimates are. However, for each bootstrap replicate a phylogeny is estimated. Hence, the time needed to analyse $N$ bootstrap replicates corresponds to $N$-times the time spent on the analysis of the original data set. $N=100$ is generally considered as a reasonable number of replicates. \begin{center} \framebox{\x{[A] ................ Approximate likelihood ratio test}} \end{center} When the bootstrap option is switched off (see above), approximate likelihood branch supports are estimated. This approach is considerably faster than the bootstrap one. However, both methods intend to estimate different quantities and conducting a fair comparison between both criteria is not straightforward. The estimation of approximate likelihood branch support comes in multiple flavours. The default is set to aBayes, corresponding to the approximate Bayes method described in \cite{anisimova11}. The approximate likelihood ratio test (aLRT) \cite{anisimova06}, Shimodaira–Hasegawa aLRT (SH-aLRT) statistics are the other available options. \subsection{Command-line interface} An alternative to the PHYLIP-like interface is the command-line interface. Users that do not need to modify the default parameters can launch the program with the `\x{phyml -i seq\_file\_name}' command. The list of all command line arguments and how to use them is given in the `Help' section which is displayed when entering the `\x{phyml --help}' command. The available command-line options are described in what follows. \begin{itemize} \item \x{-i} (or \x{--input}) \x{seq\_file\_name}\index{command-line options!\x{--input}} \\ \x{seq\_file\_name} is the name of the nucleotide or amino-acid sequence file in PHYLIP format. \item \x{-d} (or \x{--datatype}) \x{data\_type}\index{command-line options!\x{--data\_type}}\\ \x{data\_type} is \x{nt} for nucleotide (default) and \x{aa} for amino-acid sequences. \item \x{-q} (or \x{--sequential})\index{sequence format!interleaved}\index{sequence format!sequential}\index{command-line options!\x{--sequential}} \\ Changes interleaved format (default) to sequential format. \item \x{-n} (or \x{--multiple}) \x{nb\_data\_sets}\index{multiple data sets}\index{command-line options!\x{--multiple}}\\ \x{nb\_data\_sets} is an integer giving the number of data sets to analyse. \item \x{-p} (or \x{--pars})\index{command-line options!\x{--pars}}\\ Use a minimum parsimony starting tree. This option is taken into account when the `-u' option is absent and when tree topology modifications are to be done. \item \x{-b} (or \x{--bootstrap}) \x{int}\index{bootstrap}\index{command-line options!\x{--bootstrap}} \begin{itemize} \item \x{int} $>$ 0: \x{int} is the number of bootstrap replicates. \item \x{int} = 0: neither approximate likelihood ratio test nor bootstrap values are computed. \item \x{int} = -1: approximate likelihood ratio test returning aLRT statistics. \item \x{int} = -2: approximate likelihood ratio test returning Chi2-based parametric branch supports. % \item \x{int} = -3: minimum of Chi2-based parametric and SH-like branch supports. \item \x{int} = -4: SH-like branch supports alone. \item \x{int} = -5: (default) approximate Bayes branch supports. \end{itemize} \item \x{-m} (or \x{--model}) \x{model\_name}\index{substitution models!DNA}\index{substitution models!amino acids}\index{command-line options!\x{--model}} \\ \x{model\_name} : substitution model name. \begin{itemize} \item {\it Nucleotide-based models}: \x{HKY85} (default) \x{| JC69 | K80 | F81 | F84 | TN93 | GTR | custom | r(ac),r(ag),r(at),r(cg),r(ct),r(gt)} \\ JC90, K80, F81. F84, TN93 and GTR denote the ``standard'' substitution models. The \x{custom} option can be used to define a new substitution model. A string of six digits identifies the model. For instance, 000000 corresponds to F81 (or JC69 provided the distribution of nucleotide frequencies is uniform). 012345 corresponds to GTR. This option can be used for encoding any model that is a nested within GTR. See Section \ref{sec:submenus} and Table \ref{tab:modelcode}. {\em NOTE:} the substitution parameters of the custom model will be optimised so as to maximise the likelihood. Also, it is possible to specify and fix (i.e., avoid optimisation) the values of the substitution rates in the GTR model by passing the corresponding five rates to the \x{-m} option. Commas are used to separate the five relative rates and no blank space should be introduced here. \item {\it Amino-acid based models}: \x{LG} (default) \x{| WAG | JTT | MtREV | Dayhoff | DCMut | RtREV | CpREV | VT | Blosum62 | MtMam | MtArt | HIVw | HIVb | custom} \\ The \x{custom} option is useful when one wants to use an amino-acid substitution model that is not available by default in PhyML. The symmetric part of the rate matrix, as well as the equilibrium amino-acid frequencies, are given in a file which name is asked for by the program. The format of this file is described in section \ref{sec:customaa}. \end{itemize} \begin{table}\index{custom models} \begin{center} \begin{tabular}{ll} \hline Name & Command-line option \\ \hline JC69 & \x{-m 000000 -f 0.25,0.25,0.25,0.25} \\ F81 & \x{-m 000000}\\ K80 & \x{-m 010010 -f 0.25,0.25,0.25,0.25} \\ HKY85 & \x{-m 010010}\\ TrNef & \x{-m 010020 -f 0.25,0.25,0.25,0.25} \\ TrN & \x{-m 010020}\\ K81 & \x{-m 123321 -f 0.25,0.25,0.25,0.25}\\ K81uf & \x{-m 123321}\\ TIMef & \x{-m 132241 -f 0.25,0.25,0.25,0.25}\\ TIM & \x{-m 132241}\\ TVMef & \x{-m 102304 -f 0.25,0.25,0.25,0.25}\\ TVM & \x{-m 102304}\\ SYM & \x{-m 123456 -f 0.25,0.25,0.25,0.25}\\ GTR & \x{-m 123456}\\ \hline \end{tabular} \caption{Nucleotide substitution model names (as defined in \cite{posada01}) and the corresponding custom model code used in PhyML.}\label{tab:modelcode} \end{center} \end{table} \item \x{--aa\_rate\_file file\_name}\index{command-line options!\x{--aa\_rate\_file}} \\ This option is compulsory when analysing amino-acid sequences under a `custom' model (see above). \x{file\_name} should provide a rate matrix and equilibrium amino acid in PAML format (see Section \ref{sec:customaa}). \item \x{-f e}, \x{m}, \x{o} or \x{fA,fC,fG,fT} \index{frequencies!nucleotide}\index{frequencies!amino-acid}\index{stationary frequencies}\index{command-line options!\x{-f}}\\ Nucleotide or amino-acid frequencies. \begin{itemize} \item \x{e} : the character frequencies are determined as follows : \begin{itemize} \item {\it Nucleotide sequences}: (Empirical) the equilibrium base frequencies are estimated by counting the occurence of the different bases in the alignment. \item {\it Amino-acid sequences}: (Empirical) the equilibrium amino-acid frequencies are estimated by counting the occurence of the different amino-acids in the alignment. \end{itemize} \item \x{m} : the character frequencies are determined as follows : \begin{itemize} \item {\it Nucleotide sequences}: (Model) the equilibrium base frequencies are optimized using maximum likelihood. \item {\it Amino-acid sequences}: (Model) the equilibrium amino-acid frequencies are estimated using the frequencies defined by the substitution model. \end{itemize} \item \x{o} : the character frequencies (nucleotides or amino-acids) are optimized using maximum likelihood. \item \x{fA,fC,fG,fT}: only valid for nucleotide-based models. \x{fA}, \x{fC}, \x{fG} and \x{fT} are floating numbers that correspond to the frequencies of A, C, G and T respectively. \end{itemize} \item \x{-t} (or \x{--ts/tv}) \x{ts/tv\_ratio} \index{$\kappa$}\index{ts/tv ratio}\index{command-line options!\x{--ts/tv}}\\ \x{ts/tv\_ratio}: transition/transversion ratio. DNA sequences only. Can be a fixed positive value (e.g., 4.0) or type \x{e} to get the maximum likelihood estimate. \item \x{-v} (or \x{--pinv}) \x{prop\_invar}\index{proportion of invariants}\index{invariable sites} \index{command-line options!\x{--pinv}}\\ \x{prop\_invar}: proportion of invariable sites. Can be a fixed value in the [0,1] range or type \x{e} to get the maximum likelihood estimate. \item \x{-c} (or \x{--nclasses}) \x{nb\_subst\_cat}\index{gamma distribution (discrete)!number of categories} \index{command-line options!\x{--nclasses}}\\ \x{nb\_subst\_cat}: number of relative substitution rate categories. Default: \x{nb\_subst\_cat=4}. Must be a positive integer. \item \x{-a} (or \x{--alpha}) \x{gamma} \index{gamma distribution (discrete)!shape parameter}\index{command-line options!\x{--alpha}} \\ \x{gamma}: value of the gamma shape parameter. Can be a fixed positive value or e to get the maximum likelihood estimate. The value of this parameter is estimated in the maximum likelihood framework by default. \item \x{--use\_median} \index{gamma distribution (discrete)!mean vs. median} \index{command-line options!\x{--use\_median}}\\ The middle of each substitution rate class in the discrete gamma distribution is taken as the median. The mean is used by default. \item \x{--free\_rates} or \x{--freerates} \index{command-line options!\x{--free\_rates}}\\ As an alternative to the discrete gamma model, it is possible to estimate the (relative) rate in each class of the (mixture) model and the corresponding frequencies directly from the data. This model, called FreeRate, has more parameters than the discrete gamma one but usually provides a significantly better fit to the data. See \cite{soubrier12} for more information about this model and an illustration of its use. \item \x{--il} \index{command-line options!\x{--il}}\\ \x{il} stands here for integrated (branch) length. This model, described in \cite{guindon13} in the context of molecular dating, provides an efficient way to implement the covarion model \index{covarion}. Under the integrated length (IL) model, the length of each edge is described by a distribution of values, instead of a single value corresponding to the expected number of substitutions per position along the sequence. Let $l_{a,s}$ and $l_{b,s}$ be the number of substitutions at site $s$ along edges $a$ and $b$, and $l_{a,t}$ and $l_{b,t}$, the number of substitutions at site $t$. Standard models have $l_{a,s}=l_{a,t}$ and $l_{b,s}=l_{b,t}$, or $l_{a,s}=\alpha l_{a,t}$ and $l_{b,s}=\alpha l_{b,t}$ if rates vary across sites. The IL model has instead $l_{a,s}= \alpha l_{a,t}$ and $l_{b,s}= \beta l_{b,t}$ with $\alpha \neq \beta$, i.e. substitution rates vary across sites and edges. The IL approach is somehow an analytical approximation to the covarion model that, unlike the covarion model, does not incur any computational overhead compared to the traditional models. A notable difference with the plain vanilla covarion model and the IL model however is that substitution rates are not autocorrelated along the phylogeny under the IL model. \item \x{--codpos} \x{1,2 or 3} \index{command-line options!\x{--codpos}}\\ When analysing an alignment of coding sequences, use this option to consider only the first, second or the third coding position for the estimation. \item \x{-s} (or \x{--search}) \x{move}\index{NNI}\index{SPR} \index{command-line options!\x{--search}}\\ Tree topology search operation option. Can be either \x{NNI} (default, fast) or \x{SPR} (usually slower than \x{NNI} but more accurate) or \x{BEST} (best of NNI and SPR search). \item \x{-u} (or \x{--inputtree}) \x{user\_tree\_file}\index{input tree}\index{user tree} \index{command-line options!\x{--inputtree}}\\ \x{user\_tree\_file}: starting tree filename. The tree must be in Newick format. \item \x{-o params}\index{optimisation!topology}\index{optimisation!substitution parameters} \index{command-line options!\x{-o}}\\ This option focuses on specific parameter optimisation. \begin{itemize} \item \x{params=tlr}: tree topology (\x{t}), branch length (\x{l}) and substitution rate parameters (\x{r}) are optimised. \item \x{params=tl}: tree topology and branch lengths are optimised. \item \x{params=lr}: branch lengths and substitution rate parameters are optimised. \item \x{params=l}: branch lengths are optimised. \item \x{params=r}: substitution rate parameters are optimised. \item \x{params=n}: no parameter is optimised. \end{itemize} \item \x{--rand\_start}\index{random tree} \index{command-line options!\x{--rand\_start}}\\ This option sets the initial tree to random. It is only valid if SPR searches are to be performed. \item \x{--n\_rand\_starts num} \index{command-line options!\x{--n\_rand\_starts}}\\ \x{num} is the number of initial random trees to be used. It is only valid if SPR searches are to be performed. \item \x{--r\_seed num}\index{random number} \index{command-line options!\x{--r\_seed}}\\ \x{num} is the seed used to initiate the random number generator. Must be an integer. \item \x{--print\_site\_lnl}\index{likelihood!print site likelihood} \index{command-line options!\x{--print\_site\_lk}}\\ Print the likelihood for each site in file *\_phyml\_lk.txt. For $\Gamma$ or $\Gamma$+I or FreeRate models, this option returns the posterior probability of each relative rate class at each site. Such information can then be used to identify fast- and slow-evolving regions of the alignment. \item \x{--print\_trace}\index{command-line options!\x{--print\_trace}}\\ Print each phylogeny explored during the tree search process in file *\_phyml\_trace.txt. This option can be useful for monitoring the progress of the analysis for very large data sets and have an approximate idea of what the final phylogeny will look like. \item \x{--json\_trace}\index{command-line options!\x{--json\_trace}}\\ Print each phylogeny explored during the tree search process in file *\_phyml\_json\_trace.txt in JSON format (see \url{http://www.json.org/}). This option can be useful for monitoring the progress of the analysis for very large data sets and have an approximate idea of what the final phylogeny will look like. \item \x{--run\_id ID\_string}\index{run ID} \index{command-line options!\x{--run\_id}}\\ Append the string ID\_string at the end of each PhyML output file. This option may be useful when running simulations involving PhyML. It can also be used to `tag' multiple analysis of the same data set with various program settings. \item \x{--no\_memory\_check} \index{command-line options!\x{--no\_memory\_check}}\\ By default, when processing a large data set, PhyML will pause and ask the user to confirm that she/he wants to continue with the execution of the analysis despite the large amount of memory required. The \x{--no\_memory\_check} skips this question. It is especially useful when running PhyML in batch mode. \item \x{--no\_colalias} \index{command-line options!\x{--no\_colalias}}\\ By default, PhyML preprocesses each alignment by putting together (or aliasing) the columns that are identical. Use this option to skip this step but be aware that the analysis might then take more time to complete. \item \x{--constrained\_lens} \index{command-line options!\x{--constrained\_lens}}\\ When an input tree with branch lengths is provided, this option will find the branch multiplier that maximises the likelihood (i.e., the relative branch lengths remain constant) \item \x{--constraint\_file} \x{file\_name} \index{command-line options!\x{--constraint\_file}}\\ \x{file\_name} lists the topological constraints under which the tree topology search is conducted. This option should be used in conjunction with \x{-u} \x{file\_name}. See Section \ref{sec:topoconstraints} for more information. \item \x{--quiet} \index{command-line options!\x{--quiet}}\\ Runs PhyML in quiet mode. The program will not pause if the memory required to run the analysis exceeds 256MB and will not output the progression of the log-likelihood scores on the standard output. \item \x{--ancestral} \index{command-line options!\x{--ancestral}}\\ PhyML calculates the marginal probabilities of each character state at each internal node and each site of the sequence alignment. It then uses the ``Minimum Posterior Expected Error'' criterion to infer ancestral sequences. Works for both nucleotide and amino-acid data. \item \x{--leave\_duplicates} \index{command-line options!\x{--leave\_duplicates}}\\ PhyML removes duplicate sequences by default. Use this option if you do not want PhyML to discard them (even though leaving these sequences in will slow down the analysis). \end{itemize} \subsection{XML interface} \begin{itemize} \item \x{--xml=xml\_file\_name}\index{command-line options!\x{--xml}} \\ \x{xml\_file\_name} is the name of the XML file containing the information required to run the analysis. More details about this type of file is given in the section \ref{sec:xmlio}. \end{itemize} \subsection{Parallel bootstrap}\label{sec:parallel_bootstrap}\index{MPI}\index{bootstrap!parallel} Bootstrapping is a highly parallelizable task. Indeed, bootstrap replicates are independent from one another. Each bootstrap replicate can then be analysed separately. Modern computers often have more than one CPU. Each CPU can therefore be used to process a bootstrap sample. Using this parallel strategy, performing $R$ bootstrap replicates on $C$ CPUs `costs' the same amount of computation time as processing $R \times C$ bootstrap replicates on a single CPU. In other words, for a given number of replicates, the computation time is divided by $R$ compared to the non-parallel approach. PhyML sources must be compiled with specific options to turn on the parallel option (see Section \ref{sec:MPI}). Once the binary file (\x{phyml}) has been generated, running a bootstrap analysis with, say 100 replicates on 2 CPUs, can be done by typing the following command-line: \begin{verbatim} mpd &; mpirun -np 2 ./phyml-mpi -i seqfile -b 100; \end{verbatim} The first command launches the mpi daemon while the second launches the analysis. Note that launching the daemon needs to be done only once. The output files are similar to the ones generated using the standard, non-parallel, analysis (see Section \ref{sec:input_output}). Note that running the program in batch mode, i.e.: \begin{verbatim} mpirun -np 2 ./phyml-mpi -i seqfile -b 100 & \end{verbatim} will probably NOT work. I do not know how to run a mpi process in batch mode yet. Suggestions welcome... Also, at the moment, the number of bootstrap replicates must be a multiple of the number of CPUs required in the mpirun command. \section{Inputs \& outputs for command-line and PHYLIP interface }\label{sec:input_output} PhyML reads data from standard text files, without the need for any particular file name extension. \subsection{Sequence formats} \begin{figure} \begin{small} \begin{Verbatim}[frame=single, label=PHYLIP interleaved, samepage=true, baselinestretch=0.5] 5 80 seq1 CCATCTCACGGTCGGTACGATACACCKGCTTTTGGCAGGAAATGGTCAATATTACAAGGT seq2 CCATCTCACGGTCAG---GATACACCKGCTTTTGGCGGGAAATGGTCAACATTAAAAGAT seq3 RCATCTCCCGCTCAG---GATACCCCKGCTGTTG????????????????ATTAAAAGGT seq4 RCATCTCATGGTCAA---GATACTCCTGCTTTTGGCGGGAAATGGTCAATCTTAAAAGGT seq5 RCATCTCACGGTCGGTAAGATACACCTGCTTTTGGCGGGAAATGGTCAAT????????GT ATCKGCTTTTGGCAGGAAAT ATCKGCTTTTGGCGGGAAAT AGCKGCTGTTG????????? ATCTGCTTTTGGCGGGAAAT ATCTGCTTTTGGCGGGAAAT \end{Verbatim} \begin{Verbatim}[frame=single, label=PHYLIP sequential, samepage=true, baselinestretch=0.5] 5 40 seq1 CCATCTCANNNNNNNNACGATACACCKGCTTTTGGCAGG seq2 CCATCTCANNNNNNNNGGGATACACCKGCTTTTGGCGGG seq3 RCATCTCCCGCTCAGTGAGATACCCCKGCTGTTGXXXXX seq4 RCATCTCATGGTCAATG-AATACTCCTGCTTTTGXXXXX seq5 RCATCTCACGGTCGGTAAGATACACCTGCTTTTGxxxxx \end{Verbatim} \end{small} \label{fig:align_tree} \caption{\bf PHYLIP interleaved and sequential formats.} \end{figure} \begin{figure} \begin{small} \begin{Verbatim}[frame=single, label=Nexus nucleotides, samepage=true, baselinestretch=0.5] [ This is a comment ] #NEXUS BEGIN DATA; DIMENSIONS NTAX=10 NCHAR=20; FORMAT DATATYPE=DNA; MATRIX tax1 ?ATGATTTCCTTAGTAGCGG tax2 CAGGATTTCCTTAGTAGCGG tax3 ?AGGATTTCCTTAGTAGCGG tax4 ?????????????GTAGCGG tax5 CAGGATTTCCTTAGTAGCGG tax6 CAGGATTTCCTTAGTAGCGG tax7 ???GATTTCCTTAGTAGCGG tax8 ???????????????????? tax9 ???GGATTTCTTCGTAGCGG tax10 ???????????????AGCGG; END; \end{Verbatim} \end{small} \begin{small} \begin{Verbatim}[frame=single, label=Nexus digits, samepage=true, baselinestretch=0.5] [ This is a comment ] #NEXUS BEGIN DATA; DIMENSIONS NTAX=10 NCHAR=20; FORMAT DATATYPE=STANDARD SYMBOLS="0 1 2 3"; MATRIX tax1 ?0320333113302302122 tax2 10220333113302302122 tax3 ?0220333113302302122 tax4 ?????????????2302122 tax5 10220333113302302122 tax6 10220333113302302122 tax7 ???20333113302302122 tax8 ???????????????????? tax9 ???22033313312302122 tax10 ???????????????02122; END; \end{Verbatim} \end{small} \begin{small} \begin{Verbatim}[frame=single, label=Nexus digits, samepage=true, baselinestretch=0.5] [ This is a comment ] #NEXUS BEGIN DATA; DIMENSIONS NTAX=10 NCHAR=20; FORMAT DATATYPE=STANDARD SYMBOLS="00 01 02 03"; MATRIX tax1 ??00030200030303010103030002030002010202 tax2 0100020200030303010103030002030002010202 tax3 ??00020200030303010103030002030002010202 tax4 ??????????????????????????02030002010202 tax5 0100020200030303010103030002030002010202 tax6 0100020200030303010103030002030002010202 tax7 ??????0200030303010103030002030002010202 tax8 ???????????????????????????????????????? tax9 ??????0202000303030103030102030002010202 tax10 ??????????????????????????????0002010202; END; \end{Verbatim} \end{small} \caption{\bf NEXUS formats.}\label{fig:nexus} \end{figure} Alignments of DNA or protein sequences must be in PHYLIP\index{PHYLIP} or NEXUS \cite{maddison97}\index{NEXUS} sequential\index{sequential} or interleaved\index{interleaved} format (Figures \ref{fig:align_tree} and \ref{fig:nexus}). For PHYLIP formated sequence alignments, the first line of the input file contains the number of species and the number of characters, in free format, separated by blank characters. One slight difference with PHYLIP format deals with sequence name lengths. While PHYLIP format limits this length to ten characters, PhyML can read up to hundred character long sequence names. Blanks and the symbols ``(),:'' are not allowed within sequence names because the Newick tree format makes special use of these symbols. Another slight difference with PHYLIP format is that actual sequences must be separated from their names by at least one blank character. A PHYLIP input sequence file may also display more than a single data set. Each of these data sets must be in PHYLIP format and two successive alignments must be separated by an empty line. Processing multiple data sets requires to toggle the `\x{M}' option in the {\em Input Data} sub-menu or use the `\x{-n}' command line option and enter the number of data sets to analyse. The multiple data set option can be used to process re-sampled data that were generated using a non-parametric procedure such as cross-validation or jackknife (a bootstrap option is already included in PhyML). This option is also useful in multiple gene studies, even if fitting the same substitution model to all data sets may not be suitable. PhyML can also process alignments in NEXUS format. Although not all the options provided by this format are supported by PhyML, a few specific features are exploited. Of course, this format can handle nucleotide and protein sequence alignments in sequential or interleaved format. It is also possible to use custom alphabets, replacing the standard 4-state and 20-state alphabets for nucleotides and amino-acids respectively. Examples of a 4-state custom alphabet are given in Figure \ref{fig:nexus}. Each state must here correspond to one digit or more. The set of states must be a list of consecutive digits starting from 0. For instance, the list ``0, 1, 3, 4'' is not a valid alphabet. Each state in the symbol list must be separated from the next one by a space. Hence, alphabets with large number of states can be easily defined by using two-digit number (starting with 00 up to 19 for a 20 state alphabet). Most importantly, this feature gives the opportunity to analyse data sets made of presence/absence character states (use the \texttt{symbols=``0 1''} option for such data).\index{binary characters} Alignments made of custom-defined states will be processed using the Jukes and Cantor model. Other options of the program (e.g., number of rate classes, tree topology search algorithm) are freely configurable. Note that, at the moment, the maximum number of different states is set to 22 in order to save memory space. It is however possible to lift this threshold by modifiying the value of the variable \x{T\_MAX\_ALPHABET} in the file `\x{utilities.h}'. The program will then have to be re-compiled. \subsubsection{Gaps and ambiguous characters} Gaps correspond to the `\x{-}' symbol. They are systematically treated as unknown characters ``on the grounds that we don't know what would be there if something were there'' (J. Felsenstein, PHYLIP main documentation). The likelihood at these sites is summed over all the possible states (i.e., nucleotides or amino acids) that could actually be observed at these particular positions. Note however that columns of the alignment that display only gaps or unknown characters are simply discarded because they do not carry any phylogenetic information (they are equally well explained by any model). PhyML also handles ambiguous characters such as $R$ for $A$ or $G$ (purines) and $Y$ for $C$ or $T$ (pyrimidines). Tables \ref{tab:ambigu_nt} and \ref{tab:ambigu_aa} give the list of valid characters/symbols and the corresponding nucleotides or amino acids. \begin{table} \begin{center} \begin{tabular}{lr|lr} \hline Character & Nucleotide & Character & Nucleotide \\ \hline $A$ & Adenosine & $Y$ & $C$ or $T$ \\ $G$ & Guanosine & $K$ & $G$ or $T$ \\ $C$ & Cytidine & $B$ & $C$ or $G$ or $T$\\ $T$ & Thymidine & $D$ & $A$ or $G$ or $T$ \\ $U$ & Uridine (=$T$) & $H$ & $A$ or $C$ or $T$ \\ $M$ & $A$ or $C$ & $V$ & $A$ or $C$ or $G$ \\ $R$ & $A$ or $G$ & $-$ or $N$ or $X$ or $?$ & unknown \\ $W$ & $A$ or $T$ & & (=$A$ or $C$ or $G$ or $T$)\\ $S$ & $C$ or $G$ & & \\ \hline \end{tabular} \end{center} \caption{{\bf List of valid characters in DNA sequences and the corresponding nucleotides.}}\label{tab:ambigu_nt} \end{table} \begin{table} \begin{center} \begin{tabular}{lr|lr} \hline Character & Amino-Acid & Character & Amino-Acid \\ \hline $A$ & Alanine & $L$ & Leucine \\ $R$ & Arginine & $K$ & Lysine \\ $N$ or $B$& Asparagine & $M$ & Methionine \\ $D$ & Aspartic acid & $F$ & Phenylalanine \\ $C$ & Cysteine & $P$ & Proline \\ $Q$ or $Z$& Glutamine & $S$ & Serine \\ $E$ & Glutamic acid & $T$ & Threonine \\ $G$ & Glycine & $W$ & Tryptophan \\ $H$ & Histidine & $Y$ & Tyrosine \\ $I$ & Isoleucine & $V$ & Valine \\ $L$ & Leucine & $-$ or $X$ or $?$ & unknown \\ $K$ & Lysine & & (can be any amino acid) \\ \hline \end{tabular} \end{center} \caption{{\bf List of valid characters in protein sequences and the corresponding amino acids.}}\label{tab:ambigu_aa} \end{table} \subsubsection{Specifying outgroup sequences}\label{sec:outgroupspecify} PhyML can return rooted trees provided outgroup taxa are identified from the sequence file. In order to do so, sequence names that display a `*' character will be automatically considered as belonging to the outgroup. The topology of the rooted tree is exactly the same as the unrooted version of the same tree. In other words, PhyML first ignores the distinction between ingroup and outgroup sequences, builds a maximum likelihood unrooted tree and then tries to add the root. If the outgroup has more than one sequence, the position of the root might be ambiguous. In such situation, PhyML tries to identify the most relevant position of the root by considering which edge provides the best separation between ingroup and outgroup taxa (i.e., we are trying to make the outgroup ``as monophyletic as possible''). \subsection{Tree format} PhyML can read one or several phylogenetic trees from an input file. This option is accessible through the {\em Tree Searching} sub menu or the `\x{-u}' argument from the command line. Input trees are generally used as initial maximum likelihood estimates to be subsequently adjusted by the tree searching algorithm. Trees can be either rooted or unrooted and multifurcations are allowed. Taxa names must, of course, match the corresponding sequence names. \begin{figure}[h] \begin{small} \begin{minipage}{\textwidth} \begin{verbatim} ((seq1:0.03,seq2:0.01):0.04,(seq3:0.01,(seq4:0.2,seq5:0.05):0.2):0.01); ((seq3,seq2),seq1,(seq4,seq5)); \end{verbatim} \end{minipage} \end{small} \caption{{\bf Input trees}. The first tree (top) is rooted and has branch lengths. The second tree (bottom) is unrooted and does not have branch lengths.} \label{fig:trees}\index{Newick format} \end{figure} \subsection{Multiple alignments and trees}\index{multiple data sets} Single or multiple sequence data sets may be used in combination with single or multiple input trees. When the number of data sets is one ($n_D = 1$) and there is only one input tree ($n_T = 1$), then this tree is simply used as input for the single data set analysis. When $n_D = 1$ and $n_T > 1$, each input tree is used successively for the analysis of the single alignment. PhyML then outputs the tree with the highest likelihood. If $n_D > 1$ and $n_T = 1$, the same input tree is used for the analysis of each data set. The last combination is $n_D > 1$ and $n_T > 1$. In this situation, the $i$-th tree in the input tree file is used to analyse the $i$-th data set. Hence, $n_D$ and $n_T$ must be equal here. \subsection{Custom amino-acid rate model}\label{sec:customaa} The custom amino-acid model of substitutions can be used to implement a model that is not hard-coded in PhyML. This model must be time-reversible. Hence, the matrix of substitution rates is symmetrical. The format of the rate matrix with the associated stationary frequencies is identical to the one used in PAML\index{PAML}. An example is given below: \begin{center} {\tiny \begin{tabular}{p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}} % Ala & Arg & Asn & Asp & Cys & Gln & Glu & Gly & His & Ile & Leu & Lys & Met & Phe & Pro & Ser & Thr & Trp & Tyr & Val \\ &&&&&&&&&&&&&&&&&&& \\ 0.55 & &&&&&&&&&&&&&&&&&& \\ 0.51 & 0.64 & &&&&&&&&&&&&&&&& \\ 0.74 & 0.15 & 5.43 & &&&&&&&&&&&&&&&& \\ 1.03 & 0.53 & 0.27 & 0.03 & &&&&&&&&&&&&&&& \\ 0.91 & 3.04 & 1.54 & 0.62 & 0.10 & &&&&&&&&&&&&&& \\ 1.58 & 0.44 & 0.95 & 6.17 & 0.02 & 5.47 & &&&&&&&&&&&&& \\ 1.42 & 0.58 & 1.13 & 0.87 & 0.31 & 0.33 & 0.57 & &&&&&&&&&&&& \\ 0.32 & 2.14 & 3.96 & 0.93 & 0.25 & 4.29 & 0.57 & 0.25 & &&&&&&&&&&& \\ 0.19 & 0.19 & 0.55 & 0.04 & 0.17 & 0.11 & 0.13 & 0.03 & 0.14 & &&&&&&&&&& \\ 0.40 & 0.50 & 0.13 & 0.08 & 0.38 & 0.87 & 0.15 & 0.06 & 0.50 & 3.17 & &&&&&&&&& \\ 0.91 & 5.35 & 3.01 & 0.48 & 0.07 & 3.89 & 2.58 & 0.37 & 0.89 & 0.32 & 0.26 & &&&&&&&& \\ 0.89 & 0.68 & 0.20 & 0.10 & 0.39 & 1.55 & 0.32 & 0.17 & 0.40 & 4.26 & 4.85 & 0.93 & &&&&&&& \\ 0.21 & 0.10 & 0.10 & 0.05 & 0.40 & 0.10 & 0.08 & 0.05 & 0.68 & 1.06 & 2.12 & 0.09 & 1.19 & &&&&&& \\ 1.44 & 0.68 & 0.20 & 0.42 & 0.11 & 0.93 & 0.68 & 0.24 & 0.70 & 0.10 & 0.42 & 0.56 & 0.17 & 0.16 & &&&&& \\ 3.37 & 1.22 & 3.97 & 1.07 & 1.41 & 1.03 & 0.70 & 1.34 & 0.74 & 0.32 & 0.34 & 0.97 & 0.49 & 0.55 & 1.61 & &&&& \\ 2.12 & 0.55 & 2.03 & 0.37 & 0.51 & 0.86 & 0.82 & 0.23 & 0.47 & 1.46 & 0.33 & 1.39 & 1.52 & 0.17 & 0.80 & 4.38 & &&& \\ 0.11 & 1.16 & 0.07 & 0.13 & 0.72 & 0.22 & 0.16 & 0.34 & 0.26 & 0.21 & 0.67 & 0.14 & 0.52 & 1.53 & 0.14 & 0.52 & 0.11 & && \\ 0.24 & 0.38 & 1.09 & 0.33 & 0.54 & 0.23 & 0.20 & 0.10 & 3.87 & 0.42 & 0.40 & 0.13 & 0.43 & 6.45 & 0.22 & 0.79 & 0.29 & 2.49 & & \\ 2.01 & 0.25 & 0.20 & 0.15 & 1.00 & 0.30 & 0.59 & 0.19 & 0.12 & 7.82 & 1.80 & 0.31 & 2.06 & 0.65 & 0.31 & 0.23 & 1.39 & 0.37 & 0.31 & \\ \\ 8.66 & 4.40 & 3.91 & 5.70 & 1.93 & 3.67 & 5.81 & 8.33 & 2.44 & 4.85 & 8.62 & 6.20 & 1.95 & 3.84 & 4.58 & 6.95 & 6.10 & 1.44 & 3.53 & 7.09 \\ \end{tabular} } \end{center} The entry on the $i$-th row and $j$-th column of this matrix corresponds to the rate of substitutions between amino-acids $i$ and $j$. The last line in the file gives the stationary frequencies and must be separated from the rate matrix by one line. The ordering of the amino-acids is alphabetical, i.e, Ala, Arg, Asn, Asp, Cys, Gln, Glu, Gly, His, Ile, Leu, Lys, Met, Phe, Pro, Ser, Thr, Trp, Tyr and Val. \subsection{Topological constraint file}\label{sec:topoconstraints} PhyML can perform phylogenetic tree estimation under user-specified topological constraints. In order to do so, one should use the \x{--constraint\_file} \x{file\_name} command-line option where \x{file\_name} lists the topological constraints. Such constraints are straightforward to define. For instance, the following constraints: \vspace{0.2cm} \begin{Verbatim} ((A,B),C,(D,E,F)); \end{Verbatim} indicate that taxa D, E and F belong to the same clade. A, B and C also belong to the same clade and the two clades hence defined should not overlap. Under these two constraints, the tree ((A,B),D,((E,F),C)) is not valid. From the example above, you will notice that the constraints are defined using a multifurcating tree in NEWICK format. Note that this tree does not need to display the whole list of taxa. For instance, while the only taxa involved in specifying topological constraints above are A, B, C, D, E \& F, the actual data set could include more than these six taxa only. PhyML tree topology search algorithms all rely on improving a starting tree. By default, BioNJ is the method of choice for building this tree. However, there is no guarantee that the phylogeny estimated with PhyML does comply with the topological constraints. While it is probably possible to implement BioNJ with topological constraints, we have not done so yet. Instead, the same multifurcating tree that defines the topological constraints should also be used as starting tree using the \x{-u} (\x{--inputtree}) option. Altogether, the command line should look like the following: \x{-u}=\x{file\_name} \x{--constraint\_file}=\x{file\_name}. It is not possible to use as input tree a non-binary phylogeny that is distinct from that provided in the constraint tree file. However, any binary tree compatible with the constraint one can be used as input tree. \subsection{Output files} \begin{table} Sequence file name~: `{\x seq}'\\ \begin{center} \begin{tabular}{ll} \hline Output file name & Content \\ \hline \x{seq\_phyml\_tree.txt} & ML tree\\ \x{seq\_phyml\_stats.txt} & ML model parameters\\ \x{seq\_phyml\_boot\_trees.txt} & ML trees -- bootstrap replicates\\ \x{seq\_phyml\_boot\_stats.txt} & ML model parameters -- bootstrap replicates \\ \x{seq\_phyml\_rand\_trees.txt} & ML trees -- multiple random starts\\ \x{seq\_phyml\_ancestral\_seq.txt} & ancestral sequences\\ \x{seq\_phyml\_ancestral\_tree.txt} & ML tree with node labels as in ancestral sequence file\\ \hline \end{tabular} \end{center} \caption{{\bf Standard output files}}\label{tab:output} \end{table} Table \ref{tab:output} presents the list of files resulting from an analysis. Basically, each output file name can be divided into three parts. The first part is the sequence file name, the second part corresponds to the extension `\x{\_phyml\_}' and the third part is related to the file content. When launched with the default options, PhyML only generates two files: the tree file and the model parameter file. The estimated maximum likelihood tree is in standard Newick format (see Figure \ref{fig:trees}). The model parameters file, or statistics file, displays the maximum likelihood estimates of the substitution model parameters, the likelihood of the maximum likelihood phylogenetic model, and other important information concerning the settings of the analysis (e.g., type of data, name of the substitution model, starting tree, etc.). Two additional output files are created if bootstrap supports were evaluated. These files simply contain the maximum likelihood trees and the substitution model parameters estimated from each bootstrap replicate. Such information can be used to estimate sampling errors around each parameter of the phylogenetic model. When the random tree option is turned on, the maximum likelihood trees estimated from each random starting trees are printed in a separate tree file (see last row of Table \ref{tab:output}). PhyML estimates ancestral sequences by calculating the {\em marginal} (as opposed to the {\em joint}) probability of each character state at each internal node of the phylogeny. These probabilities are given in the file \x{seq\_phyml\_ancestral\_seq.txt}. The bulk of this file is a table where each row corresponds to a site in the original alignment and a number corresponding labeling each internal node. The different columns of that file give the probability of each character state given the data observed at the corresponding sites and the estimated phylogeny. PhyML also outputs an extra column called MPEE\index{MPEE}\index{ancestral reconstruction}, which stands for Minimum Posterior Expected Error. This column gives the state, which can be a single nucleotide/amino-acid or a combination of more than one nucleotide/amino-acid, that is optimal under the MPEE criterion \cite{oliva19}. Also, it is relatively straightforward to identify which number corresponds to which node in the tree by examining the information provided in the Newick-formatted file \x{seq\_phyml\_ancestral\_tree.txt}. \subsection{Treatment of invariable sites with fixed branch lengths} PhyML allows users to give an input tree with fixed topology and branch lengths and find the proportion of invariable sites that maximise the likelihood (option \x{-o r}). These two options can be considered as conflicting since branch lengths depend on the proportion of invariants. Hence, changing the proportion of invariants implies that branch lengths are changing too. More formally, let $l$ denote the length of a branch, i.e., the expected number of substitutions per site, and $p$ be the proportion of invariants. We have $l = (1-p)l'$, where $l'$ is the expected number of substitutions {\em at variable sites}. When asked to optimize $p$ but leave $l$ unchanged, PhyML does the following: \begin{enumerate} \item Calculate $l' = l/(1-p)$ and leave $l'$ unchanged throughout the optimization. \item Find the value of $p$ that maximises the likelihood. Let $p^{*}$ denote this value. \item Set $l^{*} = (1-p^{*})l'$ and print out the tree with $l^{*}$ (instead of $l$). \end{enumerate} PhyML therefore assumes that the users wants to fix the branch lengths measured at {\em variable} sites only (i.e., $l^{*}$ is fixed). This is the reason why the branch lengths in the input and output trees do differ despite the use of the the \x{-o r} option. While we believe that this approach relies on a sound rationale, it is not perfect. In particular, the original transformation of branch lengths ($l' = l/(1-p)$) relies on a default value for $p$ with is set to 0.2 in practice. It is difficult to justify the use of this value rather than another one. One suggestion proposed by Bart Hazes is to avoid fixing the branch lengths altogether and rather estimate the value of a scaling factor applied to each branch length in the input tree (option \x{--contrained\_lens}). We agree that this solution probably matches very well most users expectation, i.e., ``find the best value of $p$ while constraining the ratio of branch lengths to be that given in the input tree''. Please feel free to send us your suggestions regarding this problem by posting on the forum (\url{http://groups.google.com/group/phyml-forum}). \section{Inputs \& outputs for the XML interface }\label{sec:xmlio}\index{XML} \subsection{Mixture models in PhyML}\index{mixture models}\label{sec:mixtures} PhyML implements a wide range of mixture models. The discrete gamma model \cite{yang94b} is arguably the most popular of these models in phylogenetics. However, in theory, mixture models are not restricted to the description of the variation of substitution rates across sites. For instance, if there are good reasons to believe that the relative rates of substitution between nucleotides vary along the sequence alignments, it makes sense to use a mixture of GTR models. Consider the case where substitutions between $A$ and $C$ occur at high rate in some regions of the alignment and low rate elsewhere, a mixture with two classes, each class having its own GTR rate matrix, would be suitable. The likelihood at any site of the alignment is then obtained by averaging the likelihoods obtained for each GTR rate matrix, with the same weight given to each of these matrices. PhyML implements a generic framework that allows users to define mixtures on substitution rates, rate matrices and nucleotide or amino-acid equilibrium frequencies. Each class of the mixture model is built by assembling a substitution rate, a rate matrix\footnote{the rate matrix corresponds here the symmetrical matrix giving the so-called ``echangeability rates''} and a vector of equilibrium frequencies. For instance, let $\{R_1,R_2,R_3\}$ be a set of substitution rates, $\{M_1,M_2\}$ a set of rate matrices and $\{F_1,F_2\}$ a set of vectors of equilibrium frequencies. One could then define the first class of the mixture model as $\mathcal{C}_1 = \{R_1,M_1,F_1\}$, a second class as $\mathcal{C}_2 = \{R_2,M_1,F_1\}$, and a third class as $\mathcal{C}_3 = \{R_3,M_2,F_2\}$. If $R_1$, $R_2$ and $R_3$ correspond to slow, medium and fast substitution rates, then this mixture model allows the fast evolving rates to have their own vector of equilibrium frequencies and rate matrix, distinct from that found at the medium or slow evolving sites. The likelihood at any given site $D_s$ of the alignment is then: \begin{eqnarray*} \Pr(D_s) = \sum_{c=1}^{3} \Pr(D_s | \mathcal{C}_s=c) \Pr(\mathcal{C}_s=c), \label{equ:mixtlk} \end{eqnarray*} where $\Pr(\mathcal{C}_s=c)$ is obtained by multiplying the probability (density) of the three components (i.e., rate, matrix, frequencies). For instance, $\Pr(\mathcal{C}_1=\{R_1,M_1,F_1\}) = \Pr(R_1)\times \Pr(M_1) \times \Pr(F_1)$. We therefore assume here that substitution rates, rate matrices and equilibrium frequencies are independent from one another. Note that, using the same substitution rates, rate matrices and vector of equilibrium frequencies, it is possible to construct many other mixture models. For instance, the mixture model with the largest number of classes can be created by considering all the combinations of these three components. We would then get a mixture of $3\times 2 \times 2=12$ classes, corresponding to all the possible combinations of 3 rates, 2 matrices and 2 vectors of frequencies. % : $\mathcal{C}_1 = % \{R_1,M_1,F_1\}$ $\mathcal{C}_2 = \{R_1,M_1,F_2\}$, $\mathcal{C}_3 = \{R_1,M_2,F_1\}$, % $\mathcal{C}_4 = \{R_1,M_2,F_2\}$, $\mathcal{C}_5 = \{R_2,M_1,F_1\}$, $\mathcal{C}_6 = % \{R_2,M_1,F_2\}$, $\mathcal{C}_7 = \{R_2,M_2,F_1\}$, $\mathcal{C}_8 = \{R_2,M_2,F_2\}$, % $\mathcal{C}_9 = \{R_3,M_1,F_1\}$, $\mathcal{C}_{10} = \{R_3,M_1,F_2\}$, $\mathcal{C}_{11} = % \{R_3,M_2,F_1\}$ and $\mathcal{C}_{12} = \{R_3,M_2,F_2\}$. \subsection{Partitionned (i.e., multiple-gene) analyses}\index{partitionned analysis}\index{data partitions}\index{multiple-gene analysis} We first introduce some terms of vocabulary that have not been presented before. A partitionned data set, also referred to as partition, is a set of partition elements. Typically, a partitionned data set will be made of a set of distinct gene alignments. A partition element will then correspond to one (or several) of these gene alignments. Note that the biology litterature often uses the term partition to refer to an element of a partitionned data. We thus use here instead the mathematical definition of the terms `partition' and `partition element'. Phylogenetics models usually assume individual columns of an alignment to evolve independently from one another. Codon-based models (e.g., \cite{yang98,yang00b,yang02,guindon04}) are exceptions to this rule since the substitution process applies here to triplets of consecutive sites of coding sequences. The non-independence of the substitution process at the three coding positions (due to the specificities of the genetic code), can therefore be accounted for. Assuming that sites evolve independently does not mean that a distinct model is fitted to each site of the alignment. Estimating the parameters of these models would not make much sense in practice due to the very limited amount of phylogenetic signal conveyed by individual sites. Site independence means instead that the columns of the observed alignment were sampled randomly from the same ``population of columns''. The stochasticity of the substitution process running along the tree is deemed responsible to the variability of site patterns. Some parameters of the phylogenetic model are considered to be common to all the sites in the alignment. The tree topology is typically one such parameter. The transition/transversion ratio is also generally assumed to be the same for all columns. Other parameters can vary from site to site. The rate at which substitutions accumulate is one of these parameters. Hence, different sites can have distinct rates. However, such rates are all ``drawn'' from the same probabilitic distribution (generally a discrete Gamma density). Hence, while different sites may have distinct rates of evolution, they all share the same {\em distribution} of rates. This reasonning also applies on a larger scale. When analysing multiple genes, one can indeed assume that the same mechanism generated the different site patterns observed for every gene. Here again, we can assume that all the genes share the same underlying tree topology (commonly refered to as the ``species tree''). Other parameters of the phylogenetic model, such as branch lengths for instance, might be shared across genes. However, due to the specificities of the gene evolution processes, some model parameters need to be adjusted for each gene separately. To sum up, the phylogenetic analysis of partitionned data requires flexible models with parameters, or distribution of parameters, shared across several partition elements and other parameters estimated separately for each element of the partition. The likelihood of a data set made of the concatenation of $n$ sequence alignments noted $D^{(1)}$, $D^{(2)}, \ldots, D^{(n)}$ is then obtained as follows: \begin{eqnarray*} \Pr(D^{(1)},D^{(2)},\ldots,D^{(n)}) &=& \prod_{i=1}^{n} \Pr(D^{(i)}) \\ &=& \prod_{i=1}^{n} \prod_{s=1}^{L_i} \Pr(D^{(i)}_s), \end{eqnarray*} where $L_i$ is the number of site columns in partition element $i$. $\Pr(D^{(i)}_s)$ is then obtained using Equation \ref{equ:mixtlk}, i.e., by summing over the different classes of the mixture model that applies to site $s$ for partition element $i$. Hence, the joint probability of all the partition elements is here broken down into the product of likelihood of every site for each partition element. As noted just above, any given component of the mixture model at a given particular site is shared by the other sites that belong to the same partition element and, for some of them, by sites in other partition elements (e.g., the same tree topology is shared by all the sites, throughout all the partition elements). PhyML implements a wide variety of partition models. The only parameter that is constrained to be shared by all the partition elements is the tree topology. This constraint makes sense when considering distantly related taxa, typically inter-species data. For closely related taxa, i.e., when analysing intra-species or population-level data, not all the genes might have the same evolutionary history. Recombination events combined to the incomplete lineage sorting phenomenon can generate discrepancies between the gene trees and the underlying species tree (see \cite{degnan09} for a review). The phylogenetic softwares BEST \cite{best}\index{BEST}, STEM \cite{stem}\index{STEM} and *BEAST \cite{startbeast}\index{*BEAST} are dedicated to the estimation of species tree phylogenies from the analysis of multi-gene data and allow gene-tree topologies to vary across genes. Aside from the tree topology that is common to all the sites and all the partition elements, other parameters of the phylogenetic model can be either shared across partition elements or estimated separately for each of these. When analysing three partition elements, $A$, $B$ and $C$ for instance, PhyML can fit a model where the same set of branch lengths applies to $A$ and $B$ while $C$ has its own estimated lengths. The same goes for the substitution model: the same GTR model, with identical parameter values, can be fitted to $A$ and $C$ and JC69 for instance can be used for $B$. The sections below give more detailed information on the range of models available and how to set up the corresponding XML configuration files to implement them. \subsection{Combining mixture and partitions in PhyML: the theory} The rationale behind mixture models as implemented in PhyML lies in (1) the definition of suitable rate matrices, equilibrium frequency vectors and relative rates of substitution and (2) the assembly of these components so as to create the classes of a mixture. The main idea behind partitionned analysis in PhyML lies in (1) the hypothesis of statistical independance of the different data partition elements and (2) distinct data partition can share model components such as rate matrices, equilibrium frequencies or distribution of rates across sites. More formally, the likelihood of a data set made of $n$ partition elements is written as follows: \begin{eqnarray*} \Pr(D^{(1)},D^{(2)},\ldots,D^{(n)}) &=& \prod_{i=1}^{n} \prod_{s=1}^{L_i} \Pr(D^{(i)}_s) \\ &=& \prod_{i=1}^{n} \prod_{s=1}^{L_i} \sum_{c=1}^{K_i} \Pr(D^{(i)}_s|\mathcal{C}=c) \Pr(\mathcal{C}=c), \end{eqnarray*} where $L_i$ is the number of sites in partition element $i$ and $K_i$ is the number of classes in the mixture model that applies to this same partition element. Each class of a mixture is made of a rate matrix $M$, a vector of equilibrium frequencies $F$ and a relative rate of substitution $R$. Branch lengths, $L$ and tree topology $\tau$ are also required for the calculation of the likelihood. Hence we have: \begin{eqnarray*} && \Pr(D^{(1)},D^{(2)},\ldots,D^{(n)}) \\ &&= \prod_{i=1}^{n} \prod_{s=1}^{L_i} \sum_{c=1}^{K_i} \Pr(D^{(i)}_s|\mathcal{C}=c) \Pr(\mathcal{C}=c) \\ &&= \prod_{i=1}^{n} \prod_{s=1}^{L_i} \sum_{m}^{\mathcal{M}_i} \sum_{f}^{\mathcal{F}_i} \sum_{r}^{\mathcal{R}_i} \Pr(D^{(i)}_s|M_m^{(i)},F_f^{(i)},R_r^{(i)},L^{(i)},\tau) \Pr(M_m^{(i)},F_f^{(i)},R_r^{(i)}) \mathcal{I}(m,f,r,i) % &&= \prod_{i=1}^{n} \prod_{s=1}^{L_i} \sum_{m}^{\mathcal{M}_i} \sum_{f}^{\mathcal{F}_i} \sum_{r}^{\mathcal{R}_i} % \Pr(D^{(i)}_s|M_m^{(i)},F_f^{(i)},R_r^{(i)},L^{(i)},\tau) \Pr(M_m^{(i)}) \Pr(F_f^{(i)}) \Pr(R_r^{(i)}) \end{eqnarray*} where $\mathcal{M}_i$, $\mathcal{F}_i$ and $\mathcal{R}_i$ are the number of rate matrices, vector of equilibrium frequencies and relative rates that apply to partition element $i$ respectively. $K_i$ is the number of classes in the mixture that applies to partition element $i$. $\mathcal{I}(m,f,r,i)$ is an indicator function that takes value 1 if the combination $M_m$, $F_f$ and $R_r$ is acually defined in the model for this particular partition element $i$. Its value is 0 otherwise. We therefore have $\sum_m \sum_f \sum_r \mathcal{I}(m,f,r,i) = K_i$. In the example given in section \ref{sec:mixtures}, $\{R_1,R_2,R_3\}$ is the set of substitution rates, $\{M_1,M_2\}$ the set of rate matrices and $\{F_1,F_2\}$ the set of vectors of equilibrium frequencies. We thus have a total of $3 \times 2 \times 2$ ways of combining the rates, matrices and frequencies, potentially making up a mixture model with 12 classes. But we define the first class of our mixture model as $\mathcal{C}_1 = \{R_1,M_1,F_1\}$, a second class as $\mathcal{C}_2 = \{R_2,M_1,F_1\}$ and the third as $\mathcal{C}_3 = \{R_3,M_2,F_2\}$. Hence, we have $\mathcal{I}(1,1,1,i)$, $\mathcal{I}(1,1,2,i)$ and $\mathcal{I}(2,2,3,i)$ equal to one while the nine other values that this indicator function takes, corresponding to the possible combinations of two vectors of frequencies, two matrices and three rates, are all zero. As stated before, our implementation assumes that the different components of a mixture are independant. In other words, we have $\Pr(M_m^{(i)},F_f^{(i)},R_r^{(i)}) \propto \Pr(M_m^{(i)}) \times \Pr(F_f^{(i)}) \times \Pr(R_r^{(i)})$. In practice, the joint probability $\Pr(M_m^{(i)},F_f^{(i)},R_r^{(i)})$ is obtained as follows: \begin{eqnarray*} \Pr(M_m^{(i)},F_f^{(i)},R_r^{(i)}) = \frac{\Pr(M_m^{(i)}) \Pr(F_f^{(i)}) \Pr(R_r^{(i)}) \mathcal{I}(m,f,r,i)}{ \sum_{a,b,c} \Pr(M_a^{(i)}) \Pr(F_b^{(i)}) \Pr(R_c^{(i)}) \mathcal{I}(a,b,c,i)} \label{equ:weights} \end{eqnarray*} The probabilities $\Pr(M_m^{(i)})$, $\Pr(F_f^{(i)})$ and $\Pr(R_r^{(i)})$, also called `weights', can be fixed or estimated from the data. \subsection{The XML format and its use in PhyML}\label{sec:XML format} The few paragraphs below are largely inspired from the Wikipedia page that describes the XML format (\url{http://en.wikipedia.org/wiki/XML}). XML (eXtensible Markup Language) is a markup language that defines a set of rules for encoding documents in a format that is both human-readable and machine-readable. An XML document is divided into {\em markup} and {\em content}, which may be distinguished by the application of simple syntactic rules. Generally, strings that constitute markup either begin with the character `\x{<}' and end with a `\x{>}'. Strings of characters that are not markup are content: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=XML markup and content example, samepage=true, baselinestretch=0.5, fontsize=\small] content \end{Verbatim} A markup construct that begins with `\x{<}' and ends with `\x{>}' is called a {\em tag}. Tags come in three flavors: (1) start-tags (e.g, \x{
}), end-tags (e.g., \x{
}) and empty-element tags (e.g., \x{}). A {\em component} either begins with a start-tag and ends with a matching end-tag or consists only of an empty-element tag. The characters between the start- and end-tags, if any, are the element's content, and may contain markup, including other elements, which are called child elements. In the following example, the element \x{img} has two {\em attributes}, \x{src} and \x{alt}: \x{Foligno  Madonna,  by
Raphael}. Another example would be \x{Connect A to B.} where the name of the attribute is ``\x{number}" and the value is ``\x{3}". In practice, building a mixture model in a XML file readable by PhyML is relatively straightforward. The first step is to define the different components of each class of the mixture. Consider for instance that the fitted model will have a Gamma distribution with four classes plus a proportion of invariants. The rate component of the mixture can then be specified using the following XML code: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=$\Gamma4$+I rates, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} In the example above, the \x{} component completely defines a model of substitution rate variation across sites. This component has a particular identity, i.e., a name associated to it (``\x{SiteRates1}'' here), which is not mandatory. This \x{} component has six sub-components. The first is the \x{} component, followed by five \x{} components. The \x{} component defines the type of distribution that characterizes the variation of rates across sites. A discrete Gamma plus invariants is used here. Two parameters specify this distribution: the gamma shape and the proportion of invariant parameters. Their initial values are set by using the corresponding attributes and attribute values (\x{alpha="0.1"} and \x{pinv="0.4"}). Also, PhyML can optimise these parameters so as to maximise the likelihood of the whole phylogenetic model (\x{optimise.pinv="yes"} and \x{optimise.alpha="yes"}). The following five \x{} components define the rate classes themselves. The \x{id} attribute is here mandatory and must be unique to each class. Note that one of the initial (relative) rate (\x{init.value} attribute) is set to zero. The corresponding rate class (the third in this example) will then correspond to the invariant site category. Having specified the part of the phylogenetic model that describes the variation of rates across sites, we can now move on to build the rest of the model. The component below defines two substitution models: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Rate matrices, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} This \x{} component sets out a list of substitution models (HKY85 and GTR here). Here again, the different elements in this list correspond to the \x{} sub-components. Each instance must have a unique \x{id} attribute for a reason that will become obvious shortly. The remaining attributes and their functions are described in Section \ref{sec:xmlratematrices}. The next ``ingredient'' in our phylogenetic model are vectors of nucleotide frequencies. The \x{} component below specifies two of such vectors: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Equilibrium frequencies, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} Now, we need to assemble these three components (rate variation across sites, rate matrices and vectors of equilibrium frequencies) into a mixture model. The \x{} component below defines one such model: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Mixture model, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} The \x{} component defines a particular partition element. In this example, the partition element corresponds to the sequence file called \x{nucleic.txt}, which is an alignment of nucleotide sequences (see the \x{data.type} attribute value). The \x{} are sub-components of the \x{} component. Each \x{} has a \x{list} atrribute. Each such \x{list} gives the ID of components that have been defined before. For instance, the first \x{} refers to the five classes of the \x{} component. The ordering of the different term in these list matters a lot since it is directly related to the elements in each class of the mixture model. Hence, the first element in the \x{} attribute of the first \x{} added to the first element in the \x{} attribute of the second \x{} plus the the first element in \x{} attribute of the third \x{} defines the first class of the mixture model. Therefore, the mixture model defined above has five classes: $\mathcal{C}_1 = \{R_1,M_1,F_1\}$, $\mathcal{C}_2 = \{R_2,M_1,F_2\}$, $\mathcal{C}_3 = \{R_3,M_1,F_1\}$, $\mathcal{C}_4 = \{R_4,M_2,F_2\}$ and $\mathcal{C}_5 = \{R_5,M_2,F_2\}$. % Going back to the different components of this model, the XML code dealing with the substitution % rates defines five classes with names {\tt R1} to {\tt R5}. The initial values of these rates are % set to 1.0, except for {\tt R5}, which is set to 0 and will therefore correspond to the invariable % site class. The {\tt } tag that follows indicate that these rates define a $\Gamma 4$+Inv % model, with initial gamma shape parameter set to 0.1 and initial proportion of invariants set to % 0.4. These two parameters will be estimated in the analysis ({\tt optimise.alpha} and {\tt % optimise.pinv} attributes set to {\tt yes}). The two rate matrices have names {\tt M1} and {\tt % M2}. {\tt M1} corresponds to a HKY85 model, with transition/transversion ratio set to 4.0 and set % to be optimised in the analysis. {\tt M2} is a GTR model, which parameters are also set to be % optimised. {\tt F1} and {\tt F2} are two vectors of nucleotide frequencies at equilibrium. These two % sets of frequencies will therefore be estimated during the analysis. \subsection{Setting up mixture and partition models in PhyML: the basics}\index{mixture models}\index{partitionned analysis}\index{data partitions} Mixture models are particularly relevant to the analysis of partitionned data. Indeed, some features of evolution are gene-specific (e.g., substitution rates vary across genes). Models that can accomodate for such variation, as mixture models do, are therefore relevant in this context. However, other evolutionary features are shared across loci (e.g., genes located in the same genomic region usually have similar GC contents). As a consequence, some components of mixture models need to be estimated separately for each partition element while others should be shared by different partition elements. Below is a simple example with a partitionned data set made of two elements, corresponding to the sequence alignment files \x{nucleic1.txt} and \x{nucleic2.txt}. Importantly, the number and names of sequences in these two alignments have to match exactly. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Two sets of branch lengths (one per partition element), samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} Mixture elements with names \x{R1},$\ldots$, \x{R5} refer to the $\Gamma4+$I model defined previsouly (see Section \ref{sec:XML format}). The \x{} XML component defines a mixture element that had not been introduced before. It defined vectors of branch lengths that apply to the estimated phylogeny. Two instances of such vectors are defined: \x{L1} and \x{L2}. When examining the two partition elements (\x{} component), it appears that \x{L1} is associated with \x{Part1} while \x{L2} is associated with \x{Part2}. Hence, branch lengths will be estimated separately for these two partition elements. Note that a given partition element can only have one {\tt branchlengths} instance associated to it. For instance, the example given below is not valid: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Invalid mixture, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} In other words, mixture of branch lengths are forbidden. One reason for this restriction is that mixture of edge lengths sometimes lead to non-identifiable models (i.e., models with distinct sets of branch lengths have the same likelihood) \cite{matsen07}. But mostly, combining mixture of branch lengths with mixture of rates appears like a deadly combination. Consider for instance the following model: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Invalid mixture, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} It is here impossible to tell apart branch lengths and substitution rates. Such model is strongly non-identifiable and therefore not relevant. In the example given above, the same $\Gamma4+$I model (i.e. the same gamma shape parameter and proportion of invariant ) applies to the two partition elements. It is possible to use two distinct $\Gamma4+$I models instead using the following XML code: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Two distinct $\Gamma4+$I models, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \x{SiteRates1} and \x{SiteRates2} here define two distinct $\Gamma4+$I models. Each of these models apply to one of the two partition elements (\x{nucleic1.txt} and \x{nucleic2.txt}), allowing them to display different patterns of rate variation across sites. \subsection{XML options} \subsubsection{{\tt phyml} component}\index{XML options!{\tt phyml} component} Options: \begin{itemize} \item \x{output.file="filename"}. The main output files of PhyML analysis will be named \x{filename\_phyml\_tree} and \x{filename\_phyml\_stats}. \item \x{bootstrap="nreplicates"}. Run \x{nreplicates} replicates for the non-parametric bootstrap analysis. \item \x{run.id="idstring"}. PhyML will append the string \x{idstring} to each output file. \item \x{print.json.trace="yes|true|no|false"}. PhyML will print the estimated trees, the corresponding loglikelihoods and various model parameters at multiple stages of the estimation process. This option is useful for monitoring the progress of the analysis when processing large data sets. \item \x{print.trace="yes|true|no|false"}. PhyML will print the estimated trees (and the corresponding loglikelihoods) at multiple stages of the estimation process. This option is also useful for monitoring the progress of the analysis when processing large data sets. \item \x{branch.test="aBayes|aLRT|SH|no"}. Calculate fast branch support using the aBayes method \cite{anisimova11}, aLRT \cite{anisimova06} or SH \cite{shimodaira99} tests. These branch statistics are much faster to estimate than the bootrap proportions and usually provide good estimates of the probabilities that the corresponding edges are correctly inferred (see Anisimova et al. 2011 for more precision). By default and if no bootstrap analysis is performed, branch supports are estimated using the aBayes approach. \item \x{quiet="yes|no"}. Runs PhyML in quiet mode when \x{quiet=yes}. The program will not pause if the memory required to run the analysis exceeds 256MB and will not output the progresssion of the log-likelihood scores on the standard output. \item \x{memory.check="yes|no"}. By default, when processing a large data set, PhyML will pause and ask the user to confirm that she/he wants to continue with the execution of the analysis despite the large amount of memory required. Setting \x{memory.check=no} skips this question. It is especially useful when running PhyML in batch mode. \end{itemize} \subsubsection{{\tt topology} component}\index{XML options!{\tt topology} component} Each instance of the \x{topology} component (there should be only one...) has the following options: \begin{itemize} \item \x{init.tree="bionj"|"user"|"random"}. Starting tree. Default is \x{bionj}. \item \x{n.rand.starts="X"}. Number of random starting trees. Default is 5. \item \x{file.name="name\_of\_tree\_file"}. In case \x{init.tree="user"}, this attribute is mandatory. \x{name\_of\_tree\_file} is a text file containing a tree in NEWICK format. \item \x{optimise.tree="yes"|"true"|"no"|"false"}. The starting tree topology as defined by \x{init.tree} is to be optimised (or not) so as to maximise the likelihood function. \item \x{search="nni"|"spr"|"none"}. Tree topology search is conducted using NNI (fast), SPR (a bit slower but more accurate) or no moves. \end{itemize} \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `topology' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{{\tt ratematrices} component}\index{XML options!{\tt ratematrices} component}\label{sec:xmlratematrices} Each instance of a \x{ratematrices} component have the following options: \begin{itemize} \item \x{model="JC69"|"K80"|"F81"|"F84"|"HKY85"|"TN93"|"GTR"|"custom"} for nucleotide data. The default is \x{"HKY85"}.\\ \x{model="LG"|"WAG"|"JTT"|"MtREV"|"Dayhoff"|"DCMut"|"RtREV"|"CpREV"|"VT"}\\\x{|"Blosum62"|"MtMam"|"MtArt"|"HIVw"|"HIVb"|"customaa"} for amino-acid sequences. The default is \x{"LG"}. \item \x{model.code="012345"}. For \x{custom} model applied to nucleotide sequences: set the string of digits that define a custom substitution model. See Table \ref{tab:modelcode} on page \pageref{tab:modelcode} for more information about the model codes. \item \x{ratematrix.code="filename"}. When used in conjunction with \x{model="customaa"}, \x{filename} is the name of the file that gives the rates of substitution between amino-acids as well as their frequences at equilibrium using PAML rate matrix format. An example of such file is provided in {phyml/examples/X1.mat}. \item \x{optimise.rr="yes"|"true"|"no"|"false"}. For \x{custom} and \x{GTR} nucleotide models only: optimise the substitution rate model parameters. \item \x{optimise.tstv="yes"|"true"|"no"|"false"}. For \x{K80}, \x{F84}, \x{HKY85} and \x{TN93} models only: optimise the transition/transversion rate ratio. \item \x{tstv="value"}. For \x{K80}, \x{HKY85} and \x{TN93} models only: set the transition/transversion to a given value. \end{itemize} An instance of a \x{ratematrices} component where a GTR or a custom model of substitutions between nucleotides is used can have a \x{rr} component associated to it in order to specificy the relative rates of substitutions (see example below). Also, the {\tt ratematrices} component has the attribute {\tt optimise.weights=yes/no} (default is {\tt no}). If {\tt optimise.weights=yes}, then the probabilities (or weights) or each matrix in the set of matrices defined by this component (see Equation \ref{equ:weights}), will be estimated from the data. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `ratematrices' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{{\tt equfreqs} component}\index{XML options!{\tt equfreqs} component} Each instance of a \x{equfreqs} component has the following options: \begin{itemize} \item \x{base.freqs="a,b,c,d"} where \x{a-d} are nucleotide frequencies. Make sure that these frequencies are separated by comas and no space character is inserted. \item \x{freqs="empirical|model|user|optimized"}. Character frequencies are derived from counting the number of occurence of each amino-acid in the alignment (\x{freqs="empirical"}), given by the substitution model (\x{freqs="model"}), user-defined (\x{freqs="user"}, only available for nucleotide data) or estimated using maximum likelihood (\x{freqs="optimized"}). \end{itemize} The {\tt equfreqs} component has the attribute {\tt optimise.weights=yes/no} (default is {\tt no}). If {\tt optimise.weights=yes}, then the probabilities (or weights) or each vector of equilibrium frequencies in the set of vectors defined by this component (see Equation \ref{equ:weights}), will be estimated from the data. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `equfreqs' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{{\tt branchlengths} component}\index{XML options!{\tt branchlengths} component} Options: \begin{itemize} \item \x{optimise.lens="yes"|"true"|"no"|"false"}: branch lengths are optimised or not. The default is set to \x{"yes"}. \end{itemize} \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `branchlengths' component, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{{\tt siterates} component}\index{XML options!{\tt siterates} component} Each instance defines a class of relative rate of substitution. It has the following options: \begin{itemize} \item \x{value="val"}, where \x{"val"} is the relative substitution rate for the corresponding class. \end{itemize} A \x{siterates} component generally includes a \x{weights} element that specifies the probabilitic distribution of the relative rates. The available options for such element are: \begin{itemize} \item \x{family="gamma|gamma+inv|freerates"}. \x{gamma} indicates that the distribution of the relative rates is set to be a discrete Gamma density. \x{gamma+inv} indicates that the relative rate model is a mixture of Gamma and invariant sites (this is the common $\Gamma+$I model). FreeRate is a model that does not use any parametric function to describe the distribution of the relative rates (see \cite{soubrier12}). Under this option, relative rates and the corresponding frequencies of these classes are directly estimated from the data. While such approach is slightly more computationally demanding than the $\Gamma$ (or $\Gamma$+I) model, it often provides a significantly better fit to the data. \item \x{alpha="value|optimised"}, where \x{value} is a real positive number. Use this option to set the gamma shape parameter to the selected value. \x{optimised}: the parameter is estimated from the data (see also next option). \item \x{optimise.alpha="yes|true|no|false"}. Optimise the shape of the Gamma distribution of relative rates (or not). \item \x{pinv="value|optimised"}, where \x{value} is in $[0,1]$. Use this option to set the proportion of invariants to the selected value. \x{optimised}: the parameter is estimated from the data (see also next option). \item \x{optimise.pinv="yes|true|no|false"}. Optimise the proportion of invariable sites (or not). \item \x{optimise.freerates="yes|true|no|false"}. Optimise the parameters of the FreeRate model, i.e., the relative rates and the corresponding frequencies. \end{itemize} \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `siterates' component (discrete gamma model), samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} Setting up an analysis using the FreeRate\index{FreeRate} mixture model of rate variation across sites \cite{soubrier12} requires a bit more work. As in the discrete gamma model, the FreeRate model relies on definies classes of (relative) rates. In the discrete gamma model, each class has the same frequency. This is no longer the case with FreeRate. It is thus necessary to specify the frequency, or weight, of each class of rate in the XML file. The example below illustrates how these weights are defined in practice: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `siterates' component (FreeRate model), samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} Note that the weights do not have to sum to one. PhyML rescales them before starting the analysis such that these weights are transformed into proper probabilities. The relative rates themselves are rescaled too such that the weighted average (relative) rate is equal to one after rescaling. \subsubsection{{\tt partitionelem} and {\tt mixtureelem} components}\index{XML options!{\tt partitionelem} component}\index{XML options!{\tt mixtureelem} component} Options: \begin{itemize} \item \x{file.name="inputfilename"}, where \x{inputfilename} is the name of the input sequence file (in PHYLIP format) to be analysed. \item \x{data.type="nt|aa"}. Specify the type of sequences to be processed (nucleotide of amino-acid sequences). \item \x{interleaved="yes|true|no|false"}. Interleaved (\x{yes|true}) or sequential format (\x{no|false}) for the sequence alignment. \item \x{optimise.tree.scale="yes|true|no|false"}. The sum of edge length (or tree size) is optimized. This option is relevant when different data partition elements point to the same set of edge lengths so that setting \x{optimise.tree.scale="yes"} will find the optimal ratio of tree sizes considering the two elements. In other words, the different trees all share the same (relative) edge lengths but the corresponding partition elements have different mean rates of substitution. \item \x{tree.scale="val"}. \x{val} is the value of the (relative) substitution rate. By default, its value is set to 1.0. \item \x{print.site.lk="yes|true|no|false"}. The likelihood at each site (and other information) will be written in a file named \x{inputfilename\_phyml\_lk}. \end{itemize} Each \x{partitionelem} element should include exactly four \x{mixtureelem} elements, corresponding to branch lengths, equilibrium frequencies, substitution rate model and tree topology. The ordering of in which the \x{mixtureelem} elements are given does not matter, though exceptions apply for the $\Gamma+I$ model (see below). The $n$-th element in the \x{list} attribute of each \x{mixtureelem} defines the $n$-th class of the mixture model. In the example given below, the first class of the mixture is made of the following elements: \x{T1}, \x{F1}, \x{R1} and \x{L1}, the second class is made of \x{T1}, \x{F1}, \x{R2} and \x{L1}, etc. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `partitionelem' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} In general, the ordering of the \x{mixtureelem} elements does not matter. However, when the model has invariable sites, then the corresponding class should be first in the list of classes provided by \x{mixtureelem}. For instance, in the example above, if the rates are defined as follows: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `siterates' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} then \x{R1} corresponds to the invariable rate class (as \x{init.value="0.0"}). As \x{R1} is first in the \x{mixtureelem} (see line 6 in the example of \x{`partionelem'} given above), PhyML will print out an explicit error message and bail out. One way to avoid this shortcoming is to define \x{mixtureelem} as \x{R4, R2, R3, R1} instead. \subsection{Example: GTR + $\Gamma$4 + I} The example below provides all the required options to fit a $\Gamma$4+I model to a single alignment of nucleotide sequences under the GTR model of substitution using a SPR search for the best tree topology. The \x{phyml} component sets the name for the analysis to \x{simple.example}, meaning that each output file will display this particular string of characters. Also, the tree and statistics file names will begin with \x{p1.output}. The tree topology will be estimated so as to maximise the likelihood and the topology search algorithm used here is SPR, as indicated by the value of the corresponding attribute (i.e., \x{search="spr"}). Only one vector of branch lengths will be used here since only one partition element will be processed. Hence, the \x{} component only has one \x{} sub-component. Also, a single GTR model will apply to all the classes for the mixture model -- the \x{} component has only one \x{} sub-component, corresponding to this particular substitution model. The next component, \x{}, indicates that a single vector of equilibrium frequencies will apply here. Next, the \x{} component has five \x{} sub-components. Four of these correspond to the non-zero relative rates of evolution a defined by a discrete Gamma distribution. The last one (\x{}) defines the class of the mixture corresponding to invariable sites. The \x{} component indicates that a $\Gamma+$I model will be fitted here. The shape parameter of the Gamma distribution and the proportion of invariants will be estimated from the data. The \x{} gives information about the sequence alignment (the corresponding file name, the type of data and the alignment format). The \x{} components next define the mixture model. Each class of the fitted model corresponds to one column, with the first column made of the following elements: \x{T1, M1, F1, R1} and \x{L1}. The second class of the mixture is made of \x{T1, M1, F1, R2, L1} and so forth. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Simple PhyML XML example, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsection{Example: LG4X}\index{lg4x} The example below shows how to fit the LG4X model \cite{lg4x} to a given alignment of amino-acid sequences (file \x{M587.nex.Phy}). LG4X is a mixture model with four classes. Each class has its own rate and corresponding frequencies (hence the use of the FreeRate model below, see the \x{} component). In the particular example given here, the rate values and frequencies are set by the users. These parameters will then be optimized by PhyML (\x{optimise.freerates="yes"}). Each class also has its own rate matrix and vector of equilibrium frequencies, which need to be provided by the user (Note that these matrices can be downloaded from the following web address: \url{http://www.atgc-montpellier.fr/download/datasets/models/lg4x/LG4X_4M.txt}. They are also provided in the PhyML package \x{example/lg4x/} directory.) \vspace{0.2cm} \begin{Verbatim}[frame=single, label=LG4X, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} In order to fit the LG4X model to the \x{proteic} sequence file provided in the \x{examples/} directory, simply type \x{./phyml --xml=../examples/lg4x/lg4x.xml} (assuming the PhyML binary is installed in the \x{src/} directory). You can of course slightly tweak the file \x{../examples/lg4x/lg4x.xml} and use it as a template to fit this model to another data set. \subsection{Example: CAT-like model}\index{CAT model} The CAT model \cite{lartillot04} is a mixture model whereby each site may have its own exchangeability rate matrix and vector of state frequencies. In its original exposition, the number of classes in the mixture was also a parameter to be estimated from the data. PhyML uses a fixed number of classes instead. This lesser degree of sophistication facilitates the interpretation of parameter estimates. Examination of the statistics and site-likelihood files produced by PhyML under the CAT-like model makes it indeed straightforward to spot sites with peculiar substitution pattern (e.g., sites that sustained only certain types of substitutions, for instance between purines or between pyrimidines). In the example that follows, the CAT-like model implemented has six rate classes goverened by a FreeRate model. The first and second class share the same GTR matrix (M1) and vector of nucleotide frequencies (F1) (see the two leftmost columns in the assemblage matrix). The third and fourth also share the same GTR matrix (M2) and vector of frequencies (F2) which are estimated independantly from M1 and F1. Finally, the last two classes of the mixture share M3 and F3, which are independant from the other rate matrices and state frequencies. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=CAT, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsection{Example: multiple partition elements} The example below gives the complete XML file to specify the analysis of three partition elements, corresponding to the nucleotide sequence files \x{small\_p1\_pos1.seq}, \x{small\_p1\_pos2.seq} and \x{small\_p1\_pos3.seq} in interleaved PHYLIP format. Importantly, the number and names of sequences in these three alignments match exactly. \x{small\_p1\_pos1.seq} is fitted with the HKY85 model of substitution (with the transition/transversion ratio being estimated from the data), combined to a $\Gamma4$ model of rate variation across sites (with the gamma shape parameter being estimated from the data). \x{small\_p1\_pos2.seq} is fitted to a custom substitution model with the constraint $A\leftrightarrow G$=$C\leftrightarrow T$. The nucleotide frequencies are set to $\frac{1}{4}$ here. The model does not allow substitution rates to vary across sites. \x{small\_p1\_pos3.seq} is fitted using a GTR model conbined to a $\Gamma4+$I model of rate variation across sites. Note that the equilibrium nucleotide frequencies for the fourth and fifth class of the mixture are set to be equal to that estimated from the first partition element (i.e., \x{F1}) . The initial phylogeny is built using BioNJ and the tree topology is to be estimated using a NNI search algorithm. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of PhyML XML file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of PhyML XML file (ctnd), samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsection{Branch lengths with invariants and partionned data} Accommodating for models with invariable sites applying to some elements of a partitioned data, with these elements sharing the same set of edge lengths can lead to inconsistencies. Consider for instance a partitioned data set with two elements. Assume that these two elements share the same set of edge lengths. Also, consider that GTR+I applies to the first element and HKY applies to the second. Now, the expected number of substitutions per site for the first element of the partition is equal to $(1-p)l$, where $p$ is the estimated proportion of invariants and $l$ is the maximum-likelihood estimate for the length of that specific edge. For the second element of the partition, the expected number of substitutions per site is equal to $l$, rather than $(1-p)l$. While $l$ are common to the two elements, matching the specification of the input model, the actual edge lengths do differ across the two partition elements. Please be aware that, due to the programming structure implemented in PhyML, the program will only return one value here, which will be equal to $(1-p)l$. \section{Citing PhyML} The ``default citation'' for PhyML is: \begin{itemize} \item ``New algorithms and methods to estimate maximum-likelihood phylogenies: assessing the performance of PhyML 3.0''. Guindon S., Dufayard J.F., Lefort V., Anisimova M., Hordijk W., Gascuel O. 2010, {\it Systematic Biology}, 59(3):307-321 \end{itemize} The ``historic citation'' for PhyML is: \begin{itemize} \item ``A simple, fast and accurate algorithm to estimate large phylogenies by maximum likelihood'' Guindon S., Gascuel O. 2003, {\it Systematic Biology}, 52(5):696-704 \end{itemize} \section{Other programs} PhyML is software package that provides tools to tackle problems other than estimating maximum likelihood phylogenies. Installing these tools and processing data sets is explained is the following sections. \subsection{PhyTime}\index{PhyTime} PhyTime is a program that uses Bayesian sampling techniques to infer phylogenies from the analysis of genetic and fossil data. Edge lengths (and node heights) are expressed in calendar time units as opposed to expected number of substitutions as in PhyML. PhyTime can thus be used to date past evolutionary events. The main original features compared to other software for molecular dating are: \begin{itemize} \item a model of rate evolution whereby rates can vary along each branch (other software consider that the rates of evolution vary from one branch to another but stay constant along any given branch) \cite{guindon13}. \item the opportunity to accomodate for uncertainty in calibration information. A single time constraint can apply to multiple clades with corresponding probabilities as determined from prior analysis of fossil data \cite{guindon18}. \end{itemize} \subsubsection{Installing PhyTime} Compiling PhyTime is straightforward on Unix-like machines (i.e., linux and MacOS systems). PhyTime is not readily available for Windows machines but compilation should be easy on this system too. In the `phyml' directory, where the `src/' and `doc/' directories stand, enter the following commands: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-phytime; make clean; make; \end{verbatim} } This set of commands generates a binary file called \x{phytime} which can be found in the `src/' directory. \subsubsection{Running PhyTime} Passing options and running PhyTime on your data set is quite similar to running PhyML using an XML parameter input file, i.e., a typical run would be launched using the following command: \x{./phytime --xml=./dating\_example.xml}, assuming that the \x{phytime} binary file is in the same directory as the XML control file \x{dating\_example.xml}, which happens to be the current directory here. The main differences between PhyML and PhyTime are explained below: \begin{itemize} \item Unlike PhyML, PhyTime requires calibration (along with genetic sequence) data as input. The format for defining the relevant time intervals is described below. \item PhyTime does not allow partitionned (i.e., multigene) analysis yet. \end{itemize} \subsubsection{PhyTime input} As stated above, PhyTime takes as input an XML file very similar to those compatible with PhyML. An example is given thereafter. The first part of the input file (up to the \x{partitionelem} block) corresponds to a standard XML input file for PhyML. Note however that the tag name ``\x{phytime}'' replaces ``\x{phyml}''. The second part is PhyTime-specific. Three new tags can be found here: \x{lineagerates}, \x{clade} and \x{calibration}\index{PhyTime!calibration}. The \x{lineagerates}\index{PhyTime!lineagerates} element is used to define the model of rate variation across lineages. Its only attribute is \x{model} which can take the following values: \begin{itemize} \item \x{model=strictclock} or \x{model=clock} implements the strict clock model, i.e., all lineages evolve at the same instantaneous rate, at any point in time. \item \x{model=lognormal} or \x{model=normal}. The logarithm of the average rate along each branch is distributed as a normal distribution. The mean and variance of this distribution are the same for all branches. More precisely, let $R_b$ be the average rate of substitution along edge $b$. We have $R_b=X_b\cdot \mu$, where $\mu$ is the ``baseline'' (or average over lineages) rate of substitution and $X_b$ is thus the branch-specific {\em relative} rate of substitution. The lognormal model has $\log(X_b) \sim \mathcal{N}(1,\nu)$, i.e., the logarithm of the relative rate is normally distributed with mean (mode and median) set to 1.0 and standard deviation equal to $\nu$. \item \x{model=geometricbrownian} or \x{model=brownian} or \x{model=geo}. The logarithm of the rate of substitution evolves according to a Brownian motion process along the tree. More precisely, the logarithm of the rate of evolution at the end of edge $b$, noted as $Y_b^{\text{stop}}=\log(R_b^{\text{stop}})$, is normally distributed with variance $v := \nu \cdot \Delta t_b$, where $\Delta t_b$ is the (calendar) time elapsed along edge $b$, and mean equal to $Y_b^{\text{start}}-\frac{1}{2} v$, so that $\Ex(R_b^{\text{stop}})=\Ex(R_b^{\text{start}})$. Under the geometric Brownian motion model, the average rate of evolution is also random. This variability is taken into account in the calculation of the transition between nucleotides or amino-acids along edges. See Guindon, 2012, {\em Syst. Biol.} for more information. \end{itemize} The \x{clade}\index{PhyTime!clade} element is used to define a subset of taxa. Each of these taxa is given in a \x{taxon} element. The value that each taxon takes is a string corresponding to the name of one of the sequences in the alignment file. In the example that follows, \x{Gymno\_Araucaria}, \x{Gymno\_Ginko}, \x{Gymno\_Juniperus} and \x{Gymno\_Juniperus} are three taxa that define a clade called \x{Gymno1}. Note that this clade may not be monophyletic. In fact, it is not considered as such (i.e., monophyletic) during the inference. The second important element is \x{calibration}. It defines time intervals corresponding to the time of diversification (i.e., the time of the most recent common ancestor) of the set of taxa the calibration points to. In other words, a given time interval defines the calibration for the timing of the crown node of a given clade. Each interval is defined using the \x{upper} and \x{lower} tags. The upper (resp. lower) bound for each interval is a date expressed in any unit you fancy. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of PhyTime XML file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \begin{Verbatim}[frame=single, label=Example of PhyTime XML file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] 40 60 50 200 \end{Verbatim} \subsubsection{Accounting for calibration uncertainty} It is not always obvious to determine with full precision and accuracy where in the tree a given fossil branches in {\em a priori}. For instance, a first morphological feature of an ancestral (fossilized) species might be shared by species A but not B nor C, while a second feature might be displayed by A and B but not C. Assuming for simplicity that the true tree topology is ((A,B),C), then the first feature calibrates the most recent common ancestor (MRCA)\index{MRCA} of A and B. Indeed, this ancestor cannot be younger than the fossil itself because, if this was the case, then A {\em and} B would display the morphological feature of interest. In a similar fashion, the second feature suggests that the calibration should instead apply to the MRCA of A, B and C. Therefore, assuming that the fossil was discovered in a well-defined geological layer which age range is known without ambiguity, there is still uncertainty around the node in the tree this time interval calibrates. In the particular example given above, it is not clear whether the calibration constraints applies to the node corresponding to the MRCA of A and B, or the root of the tree. PhyTime accomodates for this uncertainty by giving a probability to the two scenari: with probability $\alpha$ the calibration time interval applies to the MRCA of species A and B and with probability $1-\alpha$, this interval calibrates the age of the MRCA of A, B and C. It is fairly straightforward to set up an analysis that incorporates probabilistic distributions on calibrations in PhyTime. The section of the XML file below gives a simple example whereby the calibration ``\x{cal1}'' applies to clade ``\x{Gymno1}'' (i.e., the smallest clade in the tree that displays the four corresponding taxa) with probability 0.8 and to clade ``\x{Gymno2}'' with probability 0.2. Also, calibration \x{cal2} applies to ``\x{Gymno1}'' with probability 1.0, which is implicit here and thus does not need to be specified in the XML file. \begin{Verbatim}[frame=single, label=Calibrating with uncertainty, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] 40 60 50 200 \end{Verbatim} Note that in this example, it can be the case that both \x{cal1} and \x{cal2} apply to the same clade (\x{Gymno1}). In that particular situation, the actual calibration interval is conservative and derives from the overlap of the two calibration time intervals (one corresponding to \x{cal1}, the other to \x{cal2}). The MRCA of \x{Gymno\_Araucaria}, \x{Gymno\_Ginko}, \x{Gymno\_Juniperus} and \x{Gymno\_Juniperus} has an age that falls here in the $[50,60]$ interval. \subsubsection{MCMC settings}\label{sec:phytimesettings} PhyTime estimates the joint posterior distribution of the phylogenetic model parameters using an MCMC algorithm. This algorithm relies on sampling values of these parameters iteratively. The default number of iterations is fixed to 1E+07 and values of parameters are recorded every 1E+03 iteration of the MCMC algorithm. The burn-in period, during which tuning parameters of the MCMC as adjusted, lasts for 1E+04 iterations. These three parameters can be modified by setting the values of the attributes \x{mcmc.chain.len}, \x{mcmc.sample.every} and \x{mcmc.burnin} in the XML parameter file accordingly. For instance, the first line of this file could look as follows: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=MCMC settings, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} The majority of analyses will not warrant 1E+07 iterations to converge to the target distribution (i.e., converge to the solution). I thus recommend monitoring each analysis by loading on a regular basis the statistics output file produced by PhyTime and interrupt the analysis once the effective sample sizes of all parameters have reached 200. The MCMC algorithm implemented in PhyTime relies on multiple operators that update different parameters, or the same parameter in different ways. The weights of these operators, i.e., the frequency with which they are applied, were adjusted for the analysis of the plant data set described in \cite{guindon18}. If you think these default values are not suitable for your own analysis, please feel free to have a look at the function \x{MCMC\_Complete\_MCMC} in the file \x{mcmc.c} to make the appropriate changes to the values of \x{mcmc->move\_weight[XXX]}, where \x{XXX} is the name of the operator. Alternatively, you might want to send me an email (\url{guindon@lirmm.fr}) if you are unsure about all this. It is generally very useful to compare the posterior estimates of model parameters to that obtained from a sampler that ignores sequence data (i.e., the Bayesian sampler only takes as input data the calibration information). Such analysis helps quantifying how sensitive are the marginal posterior estimates to the estimates one would get prior collecting and analysing genetic sequences. The attribute \x{ignore.sequences} used in the \x{phytime} tag permits to run such analysis. The first lines of a corresponding XML file would then look as follows: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Sampling from the prior in PhyTime, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{PhyTime output} The program PhyTime generates two output files. The statistics file is called `\x{outputfile\_phytime\_stats\_runid.txt}'. It lists the node times and (relative) substitution rates on edges sampled during the estimation process. It also gives the sampled values for other parameters, such as the autocorrelation of rates (parameter `nu'), and the rate of evolution (parameter `clock') amongst others. This output file can be analysed with the program Tracer\index{Tracer} from the BEAST\index{BEAST} package (\url{http://beast.bio.ed.ac.uk/Main_Page}) or Icylog (\url{http://tgvaughan.github.io/icylog/}\index{Icylog}). It is also possible to process this file using R here. Section \ref{sec:phytimeexample} of this document gives more information about the statistics output file. The second file is called `\x{outputfile\_phytime\_trees\_runid.txt}'. It is the list of rooted trees that were collected during the estimation process, i.e., phylogenies sampled from the posterior density of trees. This file can be processed using the software TreeAnnotator, also part of the BEAST package (see \url{http://beast.bio.ed.ac.uk/Main_Page}) in order to generate confidence sets for the node time estimates. \subsubsection{An example of PhyTime input and output files}\label{sec:phytimeexample} The directory \x{phyml/examples/phytime/} provides a sequence alignment (\x{seq.txt}) and an XML input file (\x{dating\_example.xml}) that can be used to run an analysis (using the following command: \x{phytime --xml=dating\_example.xml}). The XML file is very similar to that described above and will thus not be discussed further. The columns of the statistics output file are as follows: \begin{itemize} \item \x{sample}: the index of the iteration in the MCMC algorithm. For instance, a sample value of 100 means that 100 ``moves'' in the MCMC have been applied so far, one such move can correspond to an attempt to modify the tree topology, or height of some internal nodes, etc. \item \x{lnL(posterior)}: the logarithm of the posterior density of the current model parameters. It is this function that the MCMC attempts to get samples from. \item \x{lnL(seq)}: the logarithm of the conditional probability of the sequence alignment given the current model parameters. \item \x{lnL(times)}: the logarithm of the probability density of the phylogeny evaluated under the birth and death branching process. \item \x{lnL(rates)}: the logarithm of the probability density of the relative substitution rates along every edge of the current phylogeny. \item \x{birth}: sampled values of the birth parameter. Histogram of these values provide an estimate of the marginal posterior distribution for this parameter. \item \x{death}: death parameter for the birth-death branching process. \item \x{clock}: mean rate of substitution. \item \x{root}: age of the root node, i.e. the MRCA of all taxa in the sample. \item \x{tstv}: transition/transversion ratio (the substitution model used here is HKY, as selected in the \x{param.xml} file). \item \x{nu}: rate autocorrelation parameter. \item \x{rr0}, \x{rr1}, \x{rr2}, \x{pr0}, \x{pr1}, \x{pr2}: relative rate of substitution and the corresponding frequencies. The mixture model of rate variation used in this analysis is the FreeRate model \cite{soubrier12} with three rate classes. These columns give the values of these six parameters (though there are only four free parameters) sampled from the target (posterior) distribution. \item \x{t(calib:cal1\_clade:Gymno1)}: sampled age of the MRCA of \x{Gymno1} when calibration \x{cal1} applies to this particular node. \item \x{t(calib:cal1\_clade:Gymno2)}: sampled age of the MRCA of \x{Gymno2} when calibration \x{cal1} applies to this node. \item \x{t(calib:cal2\_clade:Gymno1)}: sampled age of the MRCA of \x{Gymno1} when calibration \x{cal12} applies to this node. \item \x{clade(calib:cal1)}: the clade id (\x{Gymno1} or \x{Gymno2}) calibration \x{cal1} applies to (0 for \x{Gymno1} and 1 for \x{Gymno2}). \item \x{clade(calib:cal2)}: the clade id calibration \x{cal2} applies to. \item \x{br0}, $\ldots$, \x{br41}: relative rate on all edges in the tree. \item \x{t22}, $\ldots$, \x{t42}: ages of all internal nodes. \item The remaining columns provides information about the acceptance rate of various operators in the MCMC and the corresponding tuning parameters. \end{itemize} The script below can be copied and pasted into R in order to produce the plots in Figure \ref{fig:phytimetrace} (assuming R was launched from the \x{phyml/examples/phytime} directory). The two plots at the top left and center give the trace of the node age of the MRCA of \x{Gymno1} when calibration \x{cal1} applies to it (left) and that of \x{Gymno2} when the same calibration \x{cal1} applies to it (centre). The plot on the top right gives the clade (which of \x{Gymno1} or \x{Gymno2}) the calibration \x{cal1} applies to. The analysis of these plots shows the impact of applying the calibration constraint \x{cal1} to \x{Gymno1} and \x{Gymno2} alternatively. When \x{cal1} applies to \x{Gymno2} (i.e., ({\em Gymno Araucaria}, {\em Gymno Juniperus}, {\em Gymno Sciadopitys})) the age of the MRCA of \x{Gymno1} ((i.e., ({\em Gymno\_Ginkgo}, {\em Gymno Araucaria}, {\em Gymno Juniperus}, {\em Gymno Sciadopitys}) is free to wander towards older values compared to the situation where both \x{cal1} and \x{cal2} apply to \x{Gymno1}. The age of the MRCA of \x{Gymno2} is here bound to fall in the $[40,60]$ time interval. When \x{cal1} applies to \x{Gymno1} instead, then the MRCA of that clade has to fall in the $[50,60]$ interval, while that of \x{Gymno2} has to be younger than the MRCA of \x{Gymno1}. \begin{Verbatim}[frame=single, label=R script to produce traces from the PhyTime statistics file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] file=paste("out_phytime_stats_June2018.txt",sep=""); d=read.table(file,header=T); idx=floor(0.1*length(d$sample)):length(d$sample) par(mfrow=c(2,3),mar=c(5,4,2,2)); plot(d$sample[idx],d$t.calib.cal1_clade.Gymno1.[idx],type="l", col="red",ylab="Time",xlab="Sample",main="Time Gymno1") plot(d$sample[idx],d$t.calib.cal1_clade.Gymno2.[idx],type="l", col="red",ylab="Time",xlab="Sample",main="Time Gymno2") plot(d$sample[idx],d$clade.calib.cal1.[idx],type="l",col="black", ylab="Clade",xlab="Sample",main="(0->Gymno1, 1->Gymno2)") plot(d$sample[idx],d$lnL.seq.[idx],type="l",col="orange", ylab="log(Probability)",xlab="Sample",main="Likelihood sequences") plot(d$sample[idx],d$lnL.posterior.[idx],type="l",col="orange", ylab="log(density)",xlab="Sample",main="Joint posterior") plot(d$sample[idx],d$lnL.times.[idx],type="l",col="orange", ylab="log(density)",xlab="Sample",main="Branching process") \end{Verbatim} \begin{figure} \begin{center} \includegraphics[width=13.8cm]{./fig/phytimetrace} \end{center} \caption{{\bf Traces from the statistics output file produced by PhyTime.}} \label{fig:phytimetrace} \end{figure} % Important information is also displayed on the standard output of PhyTime (the standard output % generally corresponds to the terminal window from which PhyTime was launched). The first column of % this output gives the current generation, or run, of the chain. It starts at 1 and goes up to 1E+7 % by default. The second column gives the time elapsed in seconds since the sampling began. The % third column gives the log likelihood of the phylogenetic model (i.e., `Felsenstein's % likelihood'). The fourth column gives the logarithm of the joint prior probability of substitution % rates along the tree and node heights. The fifth column gives the current sampled value of the % EvolRate parameter along with the corresponding Effective Sample Size (ESS) for this parameter. % The sixth column gives the tree height and the corresponding ESS. The seventh column gives % the value of the autocorrelation parameter followed by the corresponding ESS. The eightth column % gives the values of the birth rate parameter that governs the birth-rate model of species % divergence dates. The last column of the standard output gives the minimum of the ESS values % taken over the whole set of node height estimates. It provides useful information when one has % to decide whether or not the sample size is large enough to draw valid conclusion, i.e., decide % whether the chain was run for long enough (see Section \ref{sec:recomphytime} for more detail about % adequate chain length). % \subsubsection{ClockRate vs. EvolRate} % The average rate of evolution along a branch is broken into two components. One is called ClockRate % and is the same throughout the tree. The other is called EvolRate and corresponds to a weighted % average of branch-specific rates. The model of rate evolution implemented in PhyTime forces the % branch-specific rate values to be greater than one. As a consequence, ClockRate is usually smaller % EvolRate. % In more mathematical terms, let $\mu$ be the value of ClockRate, $r_i$ be the value of the relative % rate along branch $i$ and $\Delta_i$ the time elapsed along branch $i$. The value of EvolRate is % then given by: % \begin{eqnarray*} % \mathrm{EvolRate} = \mu \frac{\sum_{i}^{2n-3} r_i \Delta_i}{\sum_{i}^{2n-3} \Delta_i}. % \end{eqnarray*} It is clear from this equation that multiplying each $r_i$ by a constant and % dividing $\mu$ by the same constant does not change the value of EvolRate. The $r_i$s and $\mu$ % are then confounded, or non-identifiable, and only the value of EvolRate can be estimated from % the data. {\color{red}{Please make sure that you use the value of EvolRate rather than that of % ClockRate when referring to the estimate of the substitution rate}}. % \subsubsection{Effective sample size}\label{sec:ess} % The MCMC technique generates samples from a target distribution (in our case, the joint posterior % density of parameters). Due to the Markovian nature of the method, these samples are not % independent. The ESS is the estimated number of independent measurements obtained from a set of % (usually dependent) measurements. It is calculated using the following formula: % \begin{eqnarray*} % \mathrm{ESS} = N\left(\frac{1-r}{1+r}\right), % \end{eqnarray*} % where $N$ is the length of the chain (i.e., the `raw' or `correlated' sample size) and $r$ is the % autocorrelation value, which is obtained using the following formula: % \begin{eqnarray*} % r = \frac{1}{(N-k)\sigma_x^2} \sum_{i=1}^{N-k} (X_i - \mu_x)(X_{i+k}-\mu_x), % \end{eqnarray*} where $\mu_x$ and $\sigma_x$ are the mean and standard deviation of the $X_i$ values % respectively and $k$ is the lag. The value of $r$ that is used in PhyTime corresponds to the case where $k=1$, % which therefore gives a first order approximation of the `average' autocorrelation value (i.e., the % autocorrelation averaged over the set of possible values of the lag). % \subsubsection{Prior distributions of model parameters}\label{sec:prior} % Any Bayesian analysis requires specifying a prior distribution of model parameters. The outcome of % the data analysis, i.e., the posterior distribution, is influenced by the priors. It is especially % true if the signal conveyed by the data is weak. While some have argued that the specification of % priors relies more on arbitrary decisions than sound scientific reasoning, choosing relevant prior % distributions is in fact fully integrated in the process of building model that generates the % observed data. In particular, the problem of estimating divergence times naturally lends itself to % hierarchical Bayesian modelling. Based on the hypothesis that rates of evolution are conserved (to % some extant) throughout the course of evolution, the hierarchical Bayesian approach provides an % adequate framework for inferring substitution rates and divergence dates separately. Hence, in this % situation, it makes good sense to use what is known about a relatively well-defined feature of the % evolution of genetic sequences (the ``molecular clock'' hypothesis combined to stochastic variations of % rates across lineages) to build a prior distribution on rates along edges. \subsubsection{Citing PhyTime}\label{sec:citephytime} The ``default citation'' is: \begin{itemize} \item Guindon S. ``From trajectories to averages: an improved description of the heterogeneity of substitution rates along lineages'', {\it Systematic Biology}, 2013. 62(1): 22-34. \end{itemize} If you are using mutliple calibrations on a given clade, please cite the following article: \begin{itemize} \item Guindon S. ``Accounting for calibration uncertainty: Bayesian molecular dating as a ``doubly intractable'' problem'', {\it Systematic Biology}, 2018. 67(4): 651-661. \end{itemize} An earlier article also describes some of the methods implemented in PhyTime: \begin{itemize} \item Guindon S. ``Bayesian estimation of divergence times from large data sets'', {\it Molecular Biology and Evolution}, 2010, 27(8):1768:81. \end{itemize} \subsection{PhyloGeo}\index{PhyloGeo} PhyloGeo is a program that implements the competition-dispersal phylogeography model described in Ranjard, Welch, Paturel and Guindon ``Modelling competition and dispersal in a statistical phylogeographic framework''. Accepted for publication in {\it Systematic Biology}. It implements a Markov Chain Monte Carlo approach that samples from the posterior distribution of the three parameters of interest in this model, namely the competition intensity $\lambda$, the dispersal bias parameter $\sigma$ and the overal dispersal rate $\tau$. The data consist in a phylogeny with node heights proportional to their ages and geographical locations for evety taxon in this tree. An important assumption of the model is that each node in the phylogeny corresponds to a speciation {\em and} a dispersal event. As a consequence, this model does not authorize a given taxon to occupy more than one locations. Note however that the converse is not true: a given location can be occupied by several different taxa. \subsubsection{Installing PhyloGeo} Compiling PhyloGeo is straightforward on Unix-like machines (i.e., linux and MacOS systems). PhyloGeo is not readily available for Windows machines but compilation should be easy on this system too. In the `phyml' directory, where the `src/' and `doc/' directories stand, enter the following commands: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-geo; make clean; make; \end{verbatim} } This set of commands generates a binary file called \x{phylogeo} which can be found in the `src/' directory. \subsubsection{Running PhyloGeo} PhyloGeo takes as input a rooted tree file in Newick format and a file with geographical locations for all the tips of the phylogeny. Here is an example of valid tree and the corresponding spatial locations just below: \begin{scriptsize} \begin{Verbatim}[frame=single, label=Valid PhyloGeo input tree, samepage=true, baselinestretch=0.5] (((unicaA:1.30202,unicaB:1.30202):1.34596,(((nitidaC:0.94617,(nitidaA:0.31497, nitidaB:0.31497):0.63120):0.18955,(((mauiensisA:0.00370,mauiensisB:0.00370):0.20068, (pilimauiensisA:0.05151,pilimauiensisB:0.05151):0.15287):0.78769,(brunneaA:0.10582, brunneaB:0.10582):0.88625):0.14365):0.80126,(((molokaiensisA:0.03728, molokaiensisB:0.03728):0.71371,(deplanataA:0.01814,deplanataB:0.01814):0.73285):0.34764, ((parvulaA:0.20487,parvulaB:0.20487):0.40191,(kauaiensisA:0.24276, kauaiensisB:0.24276):0.36401):0.49186):0.83835):0.71099):1.38043, (nihoaA:0.05673,nihoaB:0.05673):3.97168); \end{Verbatim} \begin{Verbatim}[frame=single, label=Valid PhyloGeo spatial location file, samepage=true, baselinestretch=0.5] nihoaA 23.062222 161.926111 nihoaB 23.062222 161.926111 kauaiensisA 22.0644445 159.5455555 kauaiensisB 22.0644445 159.5455555 unicaA 21.436875 158.0524305 unicaB 21.436875 158.0524305 parvulaA 21.436875 158.0524305 parvulaB 21.436875 158.0524305 molokaiensisA 20.90532 156.6499 molokaiensisB 20.90532 156.6499 deplanataA 20.90532 156.6499 deplanataB 20.90532 156.6499 brunneaA 20.90532 156.6499 brunneaB 20.90532 156.6499 mauiensisA 20.90532 156.6499 mauiensisB 20.90532 156.6499 pilimauiensisA 20.90532 156.6499 pilimauiensisB 20.90532 156.6499 nitidaA 19.7362 155.6069 nitidaB 19.7362 155.6069 nitidaC 19.7362 155.6069 \end{Verbatim} \end{scriptsize} In order to run PhyloGeo, enter the following command: \x{./phylogeo ./tree\_file ./spatial\_location\_file > phylogeo\_output}. PhyloGeo will then print out the sampled values of the model parameters in the file \x{phylogeo\_output}. This file can then be used to generate the marginal posterior densities of the model parameters. In particular, evidence for competition corresponds to value of $\lambda$ smaller than 1.0. Please see the original article for more information on how to interpret the model parameters. \subsubsection{Citing PhyloGeo}\label{sec:citephylogeo} Ranjard, L., Welch D., Paturel M. and Guindon S. ``Modelling competition and dispersal in a statistical phylogeographic framework''. 2014. Systematic Biology. \subsection{PhyREX} \index{PhyREX}PhyREX is a program that is part of the PhyML package which implements phylogeographic models, i.e., models that analyse geo-referenced genetic sequences so as to infer the rate of diffusion of lineages in space along with other parameters of biological interest. Previous versions of PhyREX implemented the {\bf spatial $\Lambda$-Fleming-Viot model} \cite{etheridge2008,berestycki2009,barton2010,barton2010b,veber2012,barton2013} or \sfv\ for short. This model can be thought of as a structured-coalescent where space is considered as continuous rather than organized into separate demes. Under the \sfv\ model, the spatial distribution of individuals in a population is uniform and does not change during the course of evolution, as opposed to other models such as the very popular isolation by distance model proposed by Wright and Mal\'ecot. The \sfv\ model does not suffer from the ``pain in the torus'' \cite{felsenstein1975} and clumps of individuals with increasing densities do not arise. Also, estimates of migration parameters are not sensitive to variation in sampling intensities across regions, unlike ``mugration'' or ``discrete trait analysis'' models \cite{lemey2009}. PhyREX implements an original data augmentation technique embedded in a Bayesian sampler to estimate two important biological parameters: the neighorhood size ($\mathcal{N}$) and the dispersal intensity ($\sigma^2$). These two parameters are closely related to the effective size of the population of interest per unit area since $\mathcal{N}$ is defined as follows: $\mathcal{N} := 4\pi \rho_e \sigma^2$, where $\rho_e$ is the effective population density. Instead of the \sfv\ process, more recent releases of PhyREX implement various versions of the {\bf Relaxed Random Walk} (RRW) model \cite{lemey2010}\index{RRW (model)}. This approach relies on a Brownian diffusion process running along the phylogeny that governs the random fluctuations of 2d-coordinates during the course of evolution. As opposed to the \sfv\ model, the RRW approach is not mechanistic in the sense that it is not built on biological hypotheses about the migration and reproduction process at at the individual level. Yet, it defines a flexible framework to model the dispersal of organisms and is able, at least in principle, to capture important features of the underlying processes. \subsubsection{Installing PhyREX} Compiling PhyREX is straightforward on Unix-like machines (i.e., linux and MacOS systems). PhyREX is not readily available for Windows machines but compilation should be easy on this system too. In the `phyml' directory, where the `src/' and `doc/' directories stand, enter the following commands: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-phyrex; make clean; make; \end{verbatim} } This set of commands generates a binary file called \x{phyrex} which can be found in the `src/' directory. \subsubsection{Running PhyREX} Example input files for PhyREX can be found in the \x{examples/phyrex/} directory. PhyREX takes as input a XML file (See Section \ref{sec:xmlio}), in a PhyML-compatible format. This file defines the models and various parameter settings for conducting an analysis. We give more information below about this file. The XML file gives the names of a sequence alignment file in the standard PHYLIP (or NEXUS) format along with a file providing the spatial coordinates of the corresponding sequences. An example of the coordinates file is given below: \begin{Verbatim}[frame=single, label=Valid PhyREX spatial location file, samepage=true, baselinestretch=0.5] # state.name lat lon |SouthWest| 0 0 |NorthEast| 10 10 levosl 5.082206 4.133893 kmgcwv 5.914294 4.603446 uhfwja 4.990937 4.445124 ndmwkc 5.178017 4.442268 jpadex 3.747484 4.571090 lqcdcw 7.081925 5.133123 wnsbtg 4.164588 4.720346 ptwgnn 5.711159 4.462993 jhqdsm 3.539525 4.537706 vlnoes 4.613251 4.470530 pfrnpk 4.117791 4.489819 elwdvr 5.649958 4.824092 lptxiv 4.563302 4.005124 \end{Verbatim} This first column in this file gives the sequence names, the second is the latitude and the third column gives the longitude. The first row in this file gives the names of the columns. It starts with the `\#' character signaling a comment. The second and third rows define the limits of the population's habitat. At the moment, this habitat is assumed to be a rectangle. The position in space of that rectangle are determined by the coordinates of the bottom-left corner (\x{|SouthWest| 0 0}) and the top-right one (\x{|NorthEast| 10 10}). The `\x{|}' characters help identify the terms in the list of coordinate corresponding indeed to these two particular points and should thus not be omitted. The geographical limits of the habitat are considered as data under the \sfv\ model while they are ignored under the RRW model (although one needs to define these coordinates such that all samples are located within the corresponding rectangle). The following rows give the coordinates of each taxon. Every taxon in the sequence file should also be listed in the coordinate file. Below is an excerpt of a XML file that can be used as input to run a PhyREX analysis. The phylogeographic model parameters are estimated using a Bayesian sampler which hyperparameters (number of samples, frequency at which samples are collected, length of the ``burnin'' phase, etc.) are set through the corresponding XML attributes (see \ref{sec:phytimesettings}). Below is the list of the main options : \begin{itemize} \item {\em Evolution of spatial coordinates along the tree.} \x{} component. This is the part where the RRW model is parametrized. Users need to specify what probabilistic distribution is to be used in order to model the variation of the spatial dispersal rates across lineages. Using \x{name="rw"} implements a ``strict'' random walk, i.e., the dispersal rate is the same throughout the whole tree. \x{name="rrw+gamma"} and \x{name="rrw+lognormal"} implements the relaxed random walk model using a gamma or a lognormal distribution of the relative rate of dispersal respectively. The modes of these distributions is set to one and the standard deviation is fixed to 2.0. The dispersal rate itself is a composite parameter that is estimated from the data. Each spatial dimension, corresponding to the North-South and East-West axes, has its own dispersal parameter. The prior distribution that applies to each of these two parameter is an exponential distribution with mean defined by the user through the \x{dispersal.prior.mean} attribute. Finally, the \x{sampling} attribute is either \x{survey} or \x{detection} (default). This attribute specifies the spatial sampling scheme. \x{detection} corresponds to the case where sampling is proportional to the underlying population spatial density (i.e., the most densely populated areas are also the most sampled ones). \x{survey} corresponds to the situation where sampling and population densities are decoupled, corresponding to situations where some areas of the habitat are easier to access for instance. \item {\em Substitution rate (a.k.a., clock rate).} \x{} component. In case all sequences were collected at (approximately) the same time, it is recommended to set the average rate of evolution to a specific value (\x{}). It is also possible to apply a lognormal prior on the clock rate with mean parameter and variance defined as in the following example: \x{}. With serially-sampled data, the average rate of evolution can be estimated directly from the data and setting it to a particular value or using an informative prior is not mandatory. \item {\em Variation of rates across lineages (a.k.a. relaxed clock\index{relaxed clock (model)}).} \x{} component. PhyREX is similar to PhyTime in the sense that substitution rates and times are separate parameters. The rates can vary across lineages (using for instance a log-normal model: \x{}) or not (strict clock: \x{}). Finally, it is necessary to give information about the time at which each sequence was collected. This is done through seeting appropriate calibration constraints. From a technical perspective, these constraints apply to clades where each clade here is a single tip. \item {\em Tree generating model.} \x{} component. Using \x{model="coalescent"} fits a coalescent model to the data. If no other options are given, Kingman's coalescent is used. Using \x{powgrowth="yes"} fits a coalescent where the population size varies according to a power function $N(t) = N_e(t+1)^{-g}$ where $N_e$ is the effective population size at time $t=0$ and $g$ is the growth parameter, which is to be estimated from the data. Using \x{expgrowth="yes"} fits a coalescent where the population size varies according to an exponential function $N(t) = N_ee^{-gt}$. The prior distribution on the growth parameter $g$ is exponential with mean set through the \x{neff.prior.mean} attribute value. \end{itemize} \begin{Verbatim}[frame=single, label=Example (excerpt) of PhyREX XML file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] <-- File where 2-D spatial coordinates are found --> 0 0 10 10 \end{Verbatim} PhyREX generates correlated samples from the posterior distribution of the \sfv\ model parameters. The estimated distributions and related summary statistics can be monitored during the analysis using the MCMC vizualization software Icylog or Tracer. Most of the names of the sampled parameters are self-explanatory but some of them (listed below) require more explanations: \begin{itemize} \item \texttt{lnPost}: log-posterior density. \item \texttt{lnAlgn}: logarithm of the probability of the sequence alignment given the current tree. \item \texttt{lnSpac}: logarithm of the probability density of the location data given the current tree. \item \texttt{lnRate}: logarithm of the probability density of the substitution rates along the tree. \item \texttt{lnTime}: logarithm of the probability density of the tree given the tree-generating model. \item \texttt{substRate}: substitution rate. \item \texttt{siqSqLon}: diffusion rate along the East-West axis. \item \texttt{siqSqLat}: diffusion rate along the North-South axis. \item \texttt{nEff}: effective population size. \item \texttt{growth}: coalescent population growth parameter. \item \texttt{dispDistAlt}: effective diffusion rate (average number of kilometers covered in one unit of time). \item \texttt{rootTime}: calendar time corresponding to the MRCA node. \item \texttt{rootLon}: longitude of the root node location. \item \texttt{rootLat}: latitude of the root node location. \end{itemize} If you are unsure about the precise definition of one of these parameters or have any questions regarding how to interpret the results returned by PhyREX, please do not hesitate to contact me (\url{guindon@lirmm.fr}). % \begin{figure} % \begin{center} % \includegraphics[width=13.8cm]{./fig/phyrexlog} % \end{center} % \caption{{\bf Statistics file generated by PhyREX and loaded on Icylog % (\url{http://tgvaughan.github.io/icylog/icylog.html}).} The traces for the neighborhood size % (top) and % the dispersal intensity (bottom) are shown here.} % \label{fig:phyrextrace} % \end{figure} \subsubsection{Citing PhyREX} The ``default citation'' is: \begin{itemize} \item Guindon S., H Guo, D Welch. ``Demographic inference under the coalescent in a spatial continuum'', {\it Theoretical Population Biology}, 2016, 111:43-50. \end{itemize} \section{Recommendations on program usage}\label{sec:progusage} \subsection{PhyML} The choice of the tree searching algorithm among those provided by PhyML is generally a tough one. The fastest option relies on local and simultaneous modifications of the phylogeny using NNI moves. More thorough explorations of the space of topologies are also available through the SPR options. As these two classes of tree topology moves involve different computational burdens, it is important to determine which option is the most suitable for the type of data set or analysis one wants to perform. Below is a list of recommendations for typical phylogenetic analyses. \begin{enumerate} \item {\em Single data set, unlimited computing time.} The best option here is probably to use a SPR search (i.e., straight SPR of best of SPR and NNI). If the focus is on estimating the relationships between species, it is a good idea to use more than one starting tree to decrease the chance of getting stuck in a local maximum of the likelihood function. Using NNIs is appropriate if the analysis does not mainly focus on estimating the evolutionary relationships between species (e.g. a tree is needed to estimate the parameters of codon-based models later on). Branch supports can be estimated using bootstrap and approximate likelihood ratios. \item {\em Single data set, restricted computing time.} The three tree searching options can be used depending on the computing time available and the size of the data set. For small data sets (i.e., $<$ 50 sequences), NNI will generally perform well provided that the phylogenetic signal is strong. It is relevant to estimate a first tree using NNI moves and examine the reconstructed phylogeny in order to have a rough idea of the strength of the phylogenetic signal (the presence of small internal branch lengths is generally considered as a sign of a weak phylogenetic signal, specially when sequences are short). For larger data sets ($>$ 50 sequences), a SPR search is recommended if there are good evidence of a lack of phylogenetic signal. Bootstrap analysis will generally involve large computational burdens. Estimating branch supports using approximate likelihood ratios therefore provides an interesting alternative here. \item {\em Multiple data sets, unlimited computing time.} Comparative genomic analyses sometimes rely on building phylogenies from the analysis of a large number of gene families. Here again, the NNI option is the most relevant if the focus is not on recovering the most accurate picture of the evolutionary relationships between species. Slower SPR-based heuristics should be used when the topology of the tree is an important parameter of the analysis (e.g., identification of horizontally transferred genes using phylogenetic tree comparisons). Internal branch support is generally not a crucial parameter of the multiple data set analyses. Using approximate likelihood ratio is probably the best choice here. \item {\em Multiple data sets, limited computing time.} The large amount of data to be processed in a limited time generally requires the use of the fastest tree searching and branch support estimation methods Hence, NNI and approximate likelihood ratios rather than SPR and non-parametric bootstrap are generally the most appropriate here. \end{enumerate} Another important point is the choice of the substitution model. While default options generally provide acceptable results, it is often warranted to perform a pre-analysis in order to identify the best-fit substitution model. This pre-analysis can be done using popular software such as Modeltest \cite{posada98} or ProtTest \cite{abascal05} for instance. These programs generally recommend the use of a discrete gamma distribution to model the substitution process as variability of rates among sites is a common feature of molecular evolution. The choice of the number of rate classes to use for this distribution is also an important one. While the default is set to four categories in PhyML, it is recommended to use larger number of classes if possible in order to best approximate the patterns of rate variation across sites \cite{galtier04}. Note however that run times are directly proportional to the number of classes of the discrete gamma distribution. Here again, a pre-analysis with the simplest model should help the user to determine the number of rate classes that represents the best trade-off between computing time and fit of the model to the data. \subsection{PhyTime}\label{sec:recomphytime} Analysing a data set using PhyTime should involve three steps based on the following questions: (1) do the priors seem to be adequate (2) can I use the fast approximation of the likelihood and (3) how long shall I run the program for? I explain below how to provide answers to these questions. \begin{itemize} \item {\em Are the priors adequate?} Bayesian analysis relies on specifiying the joint prior density of model parameters. In the case of node age estimation, these priors essentially describe how rates of substitution vary across lineages and the probabilistic distribution that node ages have when ignoring the information provided by the genetic sequences. These priors vary from tree to tree. It is therefore essential to check the adequacy of priors for each user-defined input tree. In order to do so, PhyTime needs to be run with the \x{--no\_data} option. When this option is required, the sequence data provided as input will be ignored and the rest of the analysis will proceed normally. The prior distribution of model parameters, essentially edge rates and node heights, can then be checked using the program Tracer as one would do for the standard `posterior' analysis. \item {\em Can I use the fast approximation to the likelihood?} The suface of the log-likelihood function can be approximated using a multivariate normal density. This technique is saving very substantial amounts of computation time. However, like most approximations, there are situations where it does not provide a good fit to the actual function. This usually happens when the phylogeny displays a lot of short branches, i.e., the signal conveyed by the sequences is weak. It is therefore important to first check whether using the approximate likelihood is reasonable. In order to do so, it is recommended to first run the program without the approximation, i.e., using the default settings. Once the minimum value of the ESS of node ages (the last column on the right of the standard output) has reached 40-50, open the \x{phytime.XXXX} output file with Tracer and examine the correlation between the exact and approximate likelihood values. If the correlation is deemed to be good enough, PhyTime can be re-run using the \x{--fast\_lk} option, which uses the fast normal approximation to the likelihood function. % Figure \ref{fig:approxbad} gives an example where the correlation is too weak and the approximation % of the likelihood should be avoided. Figure \ref{fig:approxbad} gives an example where the % approximation is good enough. The current execution of PhyTime can be terminated and then % re-launched using the \x{--fast\_lk} option. % \begin{figure} % \begin{center} % \resizebox{14cm}{8cm}{\includegraphics{./fig/approx_bad.eps}} % \caption{{\bf Exact vs. approximate likelihoods.} The correlation between the normally approximated % (Y-axis) and the exact (X-axis) likelihoods is weak here. The exact likelihood should be used (option \x{fastlk=no}).} % \label{fig:approxbad} % \end{center} % \end{figure} % \begin{figure} % \begin{center} % \resizebox{14cm}{8cm}{\includegraphics{./fig/approx_good.eps}} % \caption{{\bf Exact vs. approximate likelihoods.} The correlation between the normally approximated % (Y-axis) and the exact (X-axis) likelihoods is good. The approximation of the likelihood can be used (option \x{fastlk=yes}).} % \label{fig:approxgood} % \end{center} % \end{figure} \item {\em How long shall I run the program for?} PhyTime should be run long enough such that the ESS of each parameter is `large enough'. The last column on the right handside of the standard output gives the minimum ESS across all internal node heights. It is recommended to run the program so that this number reaches at least 100. \end{itemize} \section{Frequently asked questions} \begin{enumerate} \item {\it PhyML crashes before reading the sequences. What's wrong ?}\\ \begin{itemize} \item The format of your sequence file is not recognized by PhyML. See Section \ref{sec:input_output} \item The carriage return characters in your sequence files are not recognized by PhyML. You must make sure that your sequence file is a plain text file, with standard carriage return characters (i.e., corresponding to ``$\backslash$\x{n}'', or ``$\backslash$\x{r}'') \end{itemize} \item {\it The program crashes after reading the sequences. What's wrong ?}\\ \begin{itemize} \item You analyse protein sequences and did not enter the \x{-d aa} option in the command-line. \item The format of your sequence file is not recognized by PhyML. See Section \ref{sec:input_output} \end{itemize} \item {\it Does PhyML handle outgroup sequences ?}\\ \begin{itemize} \item Yes, it does. Outgroup taxa are identified by adding the `*' sign at the end of each corresponding sequence name (see Section \ref{sec:outgroupspecify}) \end{itemize} \item {\it Does PhyML estimate clock-constrained trees ?}\\ \begin{itemize} \item No, the PhyML program does not estimate clock-contrained trees. One can however use the program PhyTime to perform such analysis but the tree topology will not be estimated. \end{itemize} \item {\it Can PhyML analyse partitioned data, such as multiple gene sequences ?}\\ \begin{itemize} \item We are currently working on this topic. Future releases of the program will provide options to estimate trees from phylogenomic data sets, with the opportunity to use different substitution models on the different data partitions (e.g., different genes). PhyML will also include specific algorithms to search the space of tree topologies for this type of data. \end{itemize} \end{enumerate} \section{Acknowledgements} The development of PhyML since 2000 has been supported by the Centre National de la Recherche Scientifique (CNRS) and the Minist\`ere de l'\'Education Nationale. \bibliographystyle{./naturemag} \bibliography{./ref.bib} \printindex \end{document} stephaneguindon-phyml-76a39c8/doc/phyml-manual.toc000066400000000000000000000151001501136442400222570ustar00rootroot00000000000000\contentsline {section}{\numberline {1}Availability}{5}{section.1}% \contentsline {section}{\numberline {2}Authors}{5}{section.2}% \contentsline {section}{\numberline {3}Overview}{6}{section.3}% \contentsline {section}{\numberline {4}Bug report}{6}{section.4}% \contentsline {section}{\numberline {5}Installing PhyML}{6}{section.5}% \contentsline {subsection}{\numberline {5.1}Sources and compilation}{6}{subsection.5.1}% \contentsline {subsection}{\numberline {5.2}Installing PhyML on UNIX-like systems (including Mac OS)}{7}{subsection.5.2}% \contentsline {subsection}{\numberline {5.3}Installing PhyML on Microsoft Windows}{7}{subsection.5.3}% \contentsline {subsection}{\numberline {5.4}Installing the parallel version of PhyML}{7}{subsection.5.4}% \contentsline {subsection}{\numberline {5.5}Installing PhyML-BEAGLE}{8}{subsection.5.5}% \contentsline {section}{\numberline {6}Program usage.}{9}{section.6}% \contentsline {subsection}{\numberline {6.1}PHYLIP-like interface}{9}{subsection.6.1}% \contentsline {subsubsection}{\numberline {6.1.1}Input Data sub-menu}{9}{subsubsection.6.1.1}% \contentsline {subsubsection}{\numberline {6.1.2}Substitution model sub-menu}{10}{subsubsection.6.1.2}% \contentsline {subsubsection}{\numberline {6.1.3}Tree searching sub-menu}{13}{subsubsection.6.1.3}% \contentsline {subsubsection}{\numberline {6.1.4}Branch support sub-menu}{14}{subsubsection.6.1.4}% \contentsline {subsection}{\numberline {6.2}Command-line interface}{15}{subsection.6.2}% \contentsline {subsection}{\numberline {6.3}XML interface}{21}{subsection.6.3}% \contentsline {subsection}{\numberline {6.4}Parallel bootstrap}{21}{subsection.6.4}% \contentsline {section}{\numberline {7}Inputs \& outputs for command-line and PHYLIP interface }{22}{section.7}% \contentsline {subsection}{\numberline {7.1}Sequence formats}{22}{subsection.7.1}% \contentsline {subsubsection}{\numberline {7.1.1}Gaps and ambiguous characters}{25}{subsubsection.7.1.1}% \contentsline {subsubsection}{\numberline {7.1.2}Specifying outgroup sequences}{25}{subsubsection.7.1.2}% \contentsline {subsection}{\numberline {7.2}Tree format}{26}{subsection.7.2}% \contentsline {subsection}{\numberline {7.3}Multiple alignments and trees}{27}{subsection.7.3}% \contentsline {subsection}{\numberline {7.4}Custom amino-acid rate model}{27}{subsection.7.4}% \contentsline {subsection}{\numberline {7.5}Topological constraint file}{28}{subsection.7.5}% \contentsline {subsection}{\numberline {7.6}Output files}{28}{subsection.7.6}% \contentsline {subsection}{\numberline {7.7}Treatment of invariable sites with fixed branch lengths}{30}{subsection.7.7}% \contentsline {section}{\numberline {8}Inputs \& outputs for the XML interface }{31}{section.8}% \contentsline {subsection}{\numberline {8.1}Mixture models in PhyML}{31}{subsection.8.1}% \contentsline {subsection}{\numberline {8.2}Partitionned (i.e., multiple-gene) analyses}{32}{subsection.8.2}% \contentsline {subsection}{\numberline {8.3}Combining mixture and partitions in PhyML: the theory}{34}{subsection.8.3}% \contentsline {subsection}{\numberline {8.4}The XML format and its use in PhyML}{35}{subsection.8.4}% \contentsline {subsection}{\numberline {8.5}Setting up mixture and partition models in PhyML: the basics}{38}{subsection.8.5}% \contentsline {subsection}{\numberline {8.6}XML options}{40}{subsection.8.6}% \contentsline {subsubsection}{\numberline {8.6.1}{\tt phyml} component}{40}{subsubsection.8.6.1}% \contentsline {subsubsection}{\numberline {8.6.2}{\tt topology} component}{41}{subsubsection.8.6.2}% \contentsline {subsubsection}{\numberline {8.6.3}{\tt ratematrices} component}{42}{subsubsection.8.6.3}% \contentsline {subsubsection}{\numberline {8.6.4}{\tt equfreqs} component}{43}{subsubsection.8.6.4}% \contentsline {subsubsection}{\numberline {8.6.5}{\tt branchlengths} component}{44}{subsubsection.8.6.5}% \contentsline {subsubsection}{\numberline {8.6.6}{\tt siterates} component}{44}{subsubsection.8.6.6}% \contentsline {subsubsection}{\numberline {8.6.7}{\tt partitionelem} and {\tt mixtureelem} components}{46}{subsubsection.8.6.7}% \contentsline {subsection}{\numberline {8.7}Example: GTR + $\Gamma $4 + I}{47}{subsection.8.7}% \contentsline {subsection}{\numberline {8.8}Example: LG4X}{48}{subsection.8.8}% \contentsline {subsection}{\numberline {8.9}Example: CAT-like model}{51}{subsection.8.9}% \contentsline {subsection}{\numberline {8.10}Example: multiple partition elements}{52}{subsection.8.10}% \contentsline {subsection}{\numberline {8.11}Branch lengths with invariants and partionned data}{55}{subsection.8.11}% \contentsline {section}{\numberline {9}Citing PhyML}{56}{section.9}% \contentsline {section}{\numberline {10}Other programs}{56}{section.10}% \contentsline {subsection}{\numberline {10.1}PhyTime}{56}{subsection.10.1}% \contentsline {subsubsection}{\numberline {10.1.1}Installing PhyTime}{57}{subsubsection.10.1.1}% \contentsline {subsubsection}{\numberline {10.1.2}Running PhyTime}{57}{subsubsection.10.1.2}% \contentsline {subsubsection}{\numberline {10.1.3}PhyTime input}{57}{subsubsection.10.1.3}% \contentsline {subsubsection}{\numberline {10.1.4}Accounting for calibration uncertainty}{60}{subsubsection.10.1.4}% \contentsline {subsubsection}{\numberline {10.1.5}MCMC settings}{61}{subsubsection.10.1.5}% \contentsline {subsubsection}{\numberline {10.1.6}PhyTime output}{62}{subsubsection.10.1.6}% \contentsline {subsubsection}{\numberline {10.1.7}An example of PhyTime input and output files}{63}{subsubsection.10.1.7}% \contentsline {subsubsection}{\numberline {10.1.8}Citing PhyTime}{65}{subsubsection.10.1.8}% \contentsline {subsection}{\numberline {10.2}PhyloGeo}{67}{subsection.10.2}% \contentsline {subsubsection}{\numberline {10.2.1}Installing PhyloGeo}{67}{subsubsection.10.2.1}% \contentsline {subsubsection}{\numberline {10.2.2}Running PhyloGeo}{68}{subsubsection.10.2.2}% \contentsline {subsubsection}{\numberline {10.2.3}Citing PhyloGeo}{68}{subsubsection.10.2.3}% \contentsline {subsection}{\numberline {10.3}PhyREX}{68}{subsection.10.3}% \contentsline {subsubsection}{\numberline {10.3.1}Installing PhyREX}{69}{subsubsection.10.3.1}% \contentsline {subsubsection}{\numberline {10.3.2}Running PhyREX}{69}{subsubsection.10.3.2}% \contentsline {subsubsection}{\numberline {10.3.3}Citing PhyREX}{74}{subsubsection.10.3.3}% \contentsline {section}{\numberline {11}Recommendations on program usage}{75}{section.11}% \contentsline {subsection}{\numberline {11.1}PhyML}{75}{subsection.11.1}% \contentsline {subsection}{\numberline {11.2}PhyTime}{76}{subsection.11.2}% \contentsline {section}{\numberline {12}Frequently asked questions}{77}{section.12}% \contentsline {section}{\numberline {13}Acknowledgements}{78}{section.13}% stephaneguindon-phyml-76a39c8/doc/ref.bib000066400000000000000000005431141501136442400204110ustar00rootroot00000000000000@article{lemey2010, title = {Phylogeography takes a relaxed random walk in continuous space and time}, volume = {27}, number = {8}, journal = {Molecular Biology and Evolution}, author = {Lemey, Philippe and Rambaut, Andrew and Welch, John J and Suchard, Marc A}, year = {2010}, note = {Publisher: SMBE}, pages = {1877--1885}, } @article{oliva19, title={Accounting for ambiguity in ancestral sequencereconstruction}, author={Oliva, A and Pulicani, S and Lefort, V and Br\'eh\'elin, L. and Gascuel, O. and Guindon, S}, journal={Bioinformatics}, pages={https://www.biorxiv.org/content/early/2018/09/05/409029}, year={2019} } @article{etheridge2008, title={Drift, draft and structure: some mathematical models of evolution}, author={Etheridge, Alison M}, journal={Banach Center Publ.}, volume={80}, pages={121--144}, year={2008} } @inproceedings{berestycki2009, title={Survival, extinction and ergodicity in a spatially continuous population model}, author={Berestycki, N and Etheridge, A and Hutzenthaler, M}, booktitle={Markov Proc. Rel. Fields}, year={2009} } @article{barton2010, title={A new model for evolution in a spatial continuum}, author={Barton, NH and Etheridge, AM and V{\'e}ber, A}, journal={Electronic Journal of Probability}, volume={15}, number={7}, year={2010} } @article{barton2010b, title={A new model for extinction and recolonization in two dimensions: quantifying phylogeography}, author={Barton, Nicholas H and Kelleher, Jerome and Etheridge, Alison M}, journal={Evolution}, volume={64}, number={9}, pages={2701--2715}, year={2010}, publisher={Wiley Online Library} } @article{veber2012, author = {V{\'e}ber, A and Wakolbinger, A}, title = {The spatial {L}ambda-{F}leming-{V}iot process: an event-based construction and a lookdown representation}, year = {2014}, journal = {Annales de l'Institut Henri Poincar\'e}, pages={in press} } @article{tilman2011, title={Diversification, biotic interchange, and the universal trade-off hypothesis}, author={D. Tilman}, journal={The American Naturalist}, volume={178}, number={3}, pages={355--371}, year={2011}, publisher={JSTOR} } @article{gernhard08, title={The conditioned reconstructed process}, author={Gernhard, Tanja}, journal={Journal of Theoretical Biology}, volume={253}, number={4}, pages={769--778}, year={2008}, publisher={Elsevier} } @article{ayres12, title={BEAGLE: an application programming interface and high-performance computing library for statistical phylogenetics}, author={Ayres, Daniel L and Darling, Aaron and Zwickl, Derrick J and Beerli, Peter and Holder, Mark T and Lewis, Paul O and Huelsenbeck, John P and Ronquist, Fredrik and Swofford, David L and Cummings, Michael P and others}, journal={Systematic Biology}, volume={61}, number={1}, pages={170--173}, year={2012}, publisher={Oxford University Press} } @article{ho11, title={Time-dependent rates of molecular evolution}, author={Ho, Simon YW and Lanfear, Robert and Bromham, Lindell and Phillips, Matthew J and Soubrier, Julien and Rodrigo, Allen G and Cooper, Alan}, journal={Molecular Ecology}, volume={20}, number={15}, pages={3087--3101}, year={2011}, publisher={Wiley Online Library} } @article{fletcher10, title={The effect of insertions, deletions, and alignment errors on the branch-site test of positive selection}, author={Fletcher, William and Yang, Ziheng}, journal={Molecular Biology and Evolution}, volume={27}, number={10}, pages={2257--2267}, year={2010}, publisher={SMBE} } @article{degnan09, title={Gene tree discordance, phylogenetic inference and the multispecies coalescent}, author={Degnan, J.H. and Rosenberg, N.A.}, journal={Trends in Ecology \& Evolution}, volume={24}, number={6}, pages={332--340}, year={2009}, publisher={Elsevier} } @article{best, title={{BEST}: Bayesian estimation of species trees under the coalescent model}, author={Liu, L.}, journal={Bioinformatics}, volume={24}, number={21}, pages={2542--2543}, year={2008}, publisher={Oxford Univ Press} } @article{lg4x, title={Modeling protein evolution with several amino acid replacement matrices depending on site rates}, author={Le, Si Quang and Dang, Cuong Cao and Gascuel, Olivier}, journal={Molecular Biology and Evolution}, volume={29}, number={10}, pages={2921--2936}, year={2012}, publisher={SMBE} } @article{stem, title={{STEM}: species tree estimation using maximum likelihood for gene trees under coalescence}, author={Kubatko, L.S. and Carstens, B.C. and Knowles, L.L.}, journal={Bioinformatics}, volume={25}, number={7}, pages={971--973}, year={2009}, publisher={Oxford Univ Press} } @article{startbeast, title={Bayesian inference of species trees from multilocus data}, author={Heled, J. and Drummond, A.J.}, journal={Molecular Biology and Evolution}, volume={27}, number={3}, pages={570--580}, year={2010}, publisher={SMBE} } @article{guindon10, title={Bayesian estimation of divergence times from large sequence alignments}, author={Guindon, St{\'e}phane}, journal={Molecular Biology and Evolution}, volume={27}, number={8}, pages={1768--1781}, year={2010}, publisher={SMBE} } @article{guindon18, title={Accounting for Calibration Uncertainty: Bayesian Molecular Dating as a ``Doubly Intractable'' Problem}, author={Guindon, St{\'e}phane}, journal={Systematic Biology}, volume={67}, number={}, pages={651-661}, year={2018}, } %% Created for guindon at 2009-04-21 13:11:50 +1200 @article{soubrier12, title={The influence of rate heterogeneity among sites on the time dependence of molecular rates}, author={Soubrier, J. and Steel, M. and Lee, M.S.Y. and Sarkissian, C.D. and Guindon, S. and Ho, S.Y.W. and Cooper, A.}, journal={Molecular Biology and Evolution}, year={2012}, publisher={SMBE} } %% Saved with string encoding Unicode (UTF-8) @article{matsen07, title={Phylogenetic mixtures on a single tree can mimic a tree of another topology}, author={Matsen, F.A. and Steel, M.}, journal={Systematic Biology}, volume={56}, number={5}, pages={767--775}, year={2007}, publisher={Oxford University Press} } @book{bailey64, title={The elements of stochastic processes with applications to the natural sciences}, author={Bailey, Norman TJ}, publisher={Wiley}, year={1964} } @article{lemey2009, title={Bayesian phylogeography finds its roots}, author={Lemey, Philippe and Rambaut, Andrew and Drummond, Alexei J and Suchard, Marc A}, journal={PLoS Comput Biol}, volume={5}, number={9}, pages={e1000520}, year={2009}, publisher={Public Library of Science} } @article{gillespie2011, title={Long-distance dispersal: a framework for hypothesis testing}, author={Gillespie, R.G. and Baldwin, B.G. and Waters, J.M. and Fraser, C.I. and Nikula, R. and Roderick, G.K.}, journal={Trends in Ecology \& Evolution}, year={2011}, vol=27, pages={47,56} } @article{guindon13, title={From trajectories to averages: an improved description of the heterogeneity of substitution rates along lineages.}, author={Guindon, S.}, journal={Systematic Biology}, year={2013}, volume={62}, pages={22-34}, publisher={Oxford University Press} } @article{arnold01, Author = {Barry C. Arnold and Enrique Castillo and Jose Maria Sarabia}, Title = {Conditionally Specified Distributions: An Introduction}, Journal = {Statistical Science}, Year = 2001, Volume = 16, Pages = {249,265} } @article{arnold07, Author = {Barry C. Arnold and Enrique Castillo and Jose Maria Sarabia}, Date-Added = {2009-04-21 13:08:07 +1200}, Date-Modified = {2009-04-21 13:11:32 +1200}, Journal = {Journal of Statistical Planning and Inference}, Pages = {3249-3260}, Read = {Yes}, Title = {Variations on the classical multivariate normal theme}, Volume = {137}, Year = {2007}, Bdsk-File-1 = {YnBsaXN0MDDUAQIDBAUGBwpZJGFyY2hpdmVyWCR2ZXJzaW9uVCR0b3BYJG9iamVjdHNfEA9OU0tleWVkQXJjaGl2ZXISAAGGoNEICVRyb290gAGoCwwXGBkaHiVVJG51bGzTDQ4PEBMWWk5TLm9iamVjdHNXTlMua2V5c1YkY2xhc3OiERKABIAFohQVgAKAA4AHXHJlbGF0aXZlUGF0aFlhbGlhc0RhdGFfECcuLi8uLi9teV9saWJyYXJ5L2NvbmRpdGlvbmFsX25vcm1hbC5wZGbSGw8cHVdOUy5kYXRhTxEBmgAAAAABmgACAAAKSGFyZCBEcml2ZQAAAAAAAAAAAAAAAAAAAAAAwttWiEgrAAAALPmGFmNvbmRpdGlvbmFsX25vcm1hbC5wZGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4bJbF7sAUUERGIAAAAAAAAgACAAAJIAAAAAAAAAAAAAAAAAAAAApteV9saWJyYXJ5ABAACAAAwtqtyAAAABEACAAAxe4JRAAAAAEADAAs+YYAK4iWAABLwwACADpIYXJkIERyaXZlOlVzZXJzOmd1aW5kb246bXlfbGlicmFyeTpjb25kaXRpb25hbF9ub3JtYWwucGRmAA4ALgAWAGMAbwBuAGQAaQB0AGkAbwBuAGEAbABfAG4AbwByAG0AYQBsAC4AcABkAGYADwAWAAoASABhAHIAZAAgAEQAcgBpAHYAZQASAC9Vc2Vycy9ndWluZG9uL215X2xpYnJhcnkvY29uZGl0aW9uYWxfbm9ybWFsLnBkZgAAEwABLwAAFQACAA7//wAAgAbSHyAhIlgkY2xhc3Nlc1okY2xhc3NuYW1loyIjJF1OU011dGFibGVEYXRhVk5TRGF0YVhOU09iamVjdNIfICYnoickXE5TRGljdGlvbmFyeQAIABEAGwAkACkAMgBEAEkATABRAFMAXABiAGkAdAB8AIMAhgCIAIoAjQCPAJEAkwCgAKoA1ADZAOECfwKBAoYCjwKaAp4CrAKzArwCwQLEAAAAAAAAAgEAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAtE=}} @article{boussau06, title={Efficient likelihood computations with nonreversible models of evolution}, author={Boussau, Bastien and Gouy, Manolo}, journal={Systematic biology}, volume={55}, number={5}, pages={756--768}, year={2006}, publisher={Oxford University Press} } @article{boussau08, Abstract = {Fossils of organisms dating from the origin and diversification of cellular life are scant and difficult to interpret, for this reason alternative means to investigate the ecology of the last universal common ancestor (LUCA) and of the ancestors of the three domains of life are of great scientific value. It was recently recognized that the effects of temperature on ancestral organisms left 'genetic footprints' that could be uncovered in extant genomes. Accordingly, analyses of resurrected proteins predicted that the bacterial ancestor was thermophilic and that Bacteria subsequently adapted to lower temperatures. As the archaeal ancestor is also thought to have been thermophilic, the LUCA was parsimoniously inferred as thermophilic too. However, an analysis of ribosomal RNAs supported the hypothesis of a non-hyperthermophilic LUCA. Here we show that both rRNA and protein sequences analysed with advanced, realistic models of molecular evolution provide independent support for two environmental-temperature-related phases during the evolutionary history of the tree of life. In the first period, thermotolerance increased from a mesophilic LUCA to thermophilic ancestors of Bacteria and of Archaea-Eukaryota; in the second period, it decreased. Therefore, the two lineages descending from the LUCA and leading to the ancestors of Bacteria and Archaea-Eukaryota convergently adapted to high temperatures, possibly in response to a climate change of the early Earth, and/or aided by the transition from an RNA genome in the LUCA to organisms with more thermostable DNA genomes. This analysis unifies apparently contradictory results into a coherent depiction of the evolution of an ecological trait over the entire tree of life.}, Address = {Laboratoire de Biometrie et Biologie Evolutive, CNRS, Universite de Lyon, Universite Lyon I, 43 Boulevard du 11 Novembre, 69622 Villeurbanne, France.}, Au = {Boussau, B and Blanquart, S and Necsulea, A and Lartillot, N and Gouy, M}, Author = {Boussau, Bastien and Blanquart, Samuel and Necsulea, Anamaria and Lartillot, Nicolas and Gouy, Manolo}, Crdt = {2008/11/28 09:00}, Da = {20081218}, Date-Added = {2009-01-30 16:18:39 +1300}, Date-Modified = {2009-01-30 16:18:57 +1300}, Dcom = {20090113}, Dep = {20081126}, Doi = {10.1038/nature07393}, Edat = {2008/11/28 09:00}, Issn = {1476-4687 (Electronic)}, Jid = {0410462}, Journal = {Nature}, Jt = {Nature}, Language = {eng}, Mh = {Adaptation, Physiological/genetics/*physiology; Archaea/genetics/*physiology; Evolution, Molecular; Genes, rRNA/genetics; *Hot Temperature; Phylogeny}, Mhda = {2009/01/14 09:00}, Number = {7224}, Own = {NLM}, Pages = {942--945}, Phst = {2008/03/05 {$[$}received{$]$}; 2008/09/01 {$[$}accepted{$]$}; 2008/11/26 {$[$}aheadofprint{$]$}}, Pii = {nature07393}, Pl = {England}, Pmid = {19037246}, Pst = {ppublish}, Pt = {Journal Article; Research Support, Non-U.S. Gov't}, Sb = {IM}, So = {Nature. 2008 Dec 18;456(7224):942-5. Epub 2008 Nov 26. }, Stat = {MEDLINE}, Title = {Parallel adaptations to high temperatures in the Archaean eon.}, Volume = {456}, Year = {2008 Dec 18}, Bdsk-Url-1 = {http://dx.doi.org/10.1038/nature07393}} @article{dereeper08, Abstract = {Phylogenetic analyses are central to many research areas in biology and typically involve the identification of homologous sequences, their multiple alignment, the phylogenetic reconstruction and the graphical representation of the inferred tree. The Phylogeny.fr platform transparently chains programs to automatically perform these tasks. It is primarily designed for biologists with no experience in phylogeny, but can also meet the needs of specialists; the first ones will find up-to-date tools chained in a phylogeny pipeline to analyze their data in a simple and robust way, while the specialists will be able to easily build and run sophisticated analyses. Phylogeny.fr offers three main modes. The 'One Click' mode targets non-specialists and provides a ready-to-use pipeline chaining programs with recognized accuracy and speed: MUSCLE for multiple alignment, PhyML for tree building, and TreeDyn for tree rendering. All parameters are set up to suit most studies, and users only have to provide their input sequences to obtain a ready-to-print tree. The 'Advanced' mode uses the same pipeline but allows the parameters of each program to be customized by users. The 'A la Carte' mode offers more flexibility and sophistication, as users can build their own pipeline by selecting and setting up the required steps from a large choice of tools to suit their specific needs. Prior to phylogenetic analysis, users can also collect neighbors of a query sequence by running BLAST on general or specialized databases. A guide tree then helps to select neighbor sequences to be used as input for the phylogeny pipeline. Phylogeny.fr is available at: http://www.phylogeny.fr/}, Author = {Dereeper A, Guignon V, Blanc G, Audic S, Buffet S, Chevenet F, Dufayard JF, Guindon S, Lefort V, Lescot M, Claverie JM, Gascuel O.}, Date-Added = {2009-01-19 17:02:10 +1300}, Date-Modified = {2009-01-19 17:03:31 +1300}, Journal = { Nucleic Acids Res.}, Title = {Phylogeny.fr: robust phylogenetic analysis for the non-specialist.}, Volume = {36}, Year = {2008}} @article{lartillot06, Author = {Nicolas Lartillot}, Date-Added = {2008-12-18 09:36:03 +1300}, Date-Modified = {2008-12-18 09:39:29 +1300}, Journal = {Journal of Computational Biology}, Pages = {1701-1722}, Rating = {5}, Title = {Conjugate Gibbs Sampling for Bayesian Phylogenetic Models }, Volume = {13}, Year = {2006}, Bdsk-File-1 = {YnBsaXN0MDDUAQIDBAUGBwpZJGFyY2hpdmVyWCR2ZXJzaW9uVCR0b3BYJG9iamVjdHNfEA9OU0tleWVkQXJjaGl2ZXISAAGGoNEICVRyb290gAGoCwwXGBkaHiVVJG51bGzTDQ4PEBMWWk5TLm9iamVjdHNXTlMua2V5c1YkY2xhc3OiERKABIAFohQVgAKAA4AHXHJlbGF0aXZlUGF0aFlhbGlhc0RhdGFfEC4uLi8uLi9teV9saWJyYXJ5L2xhcnRpbGxvdF9jb25qdWdhdGVfZ2liYnMucGRm0hsPHB1XTlMuZGF0YU8RAbYAAAAAAbYAAgAACkhhcmQgRHJpdmUAAAAAAAAAAAAAAAAAAAAAAMLbVohIKwAAACz5hh1sYXJ0aWxsb3RfY29uanVnYXRlX2dpYmJzLnBkZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALPmOxMsHU1BERiAAAAAAAAIAAgAACSAAAAAAAAAAAAAAAAAAAAAKbXlfbGlicmFyeQAQAAgAAMLarcgAAAARAAgAAMTKXpMAAAABAAwALPmGACuIlgAAS8MAAgBBSGFyZCBEcml2ZTpVc2VyczpndWluZG9uOm15X2xpYnJhcnk6bGFydGlsbG90X2Nvbmp1Z2F0ZV9naWJicy5wZGYAAA4APAAdAGwAYQByAHQAaQBsAGwAbwB0AF8AYwBvAG4AagB1AGcAYQB0AGUAXwBnAGkAYgBiAHMALgBwAGQAZgAPABYACgBIAGEAcgBkACAARAByAGkAdgBlABIANlVzZXJzL2d1aW5kb24vbXlfbGlicmFyeS9sYXJ0aWxsb3RfY29uanVnYXRlX2dpYmJzLnBkZgATAAEvAAAVAAIADv//AACABtIfICEiWCRjbGFzc2VzWiRjbGFzc25hbWWjIiMkXU5TTXV0YWJsZURhdGFWTlNEYXRhWE5TT2JqZWN00h8gJieiJyRcTlNEaWN0aW9uYXJ5AAgAEQAbACQAKQAyAEQASQBMAFEAUwBcAGIAaQB0AHwAgwCGAIgAigCNAI8AkQCTAKAAqgDbAOAA6AKiAqQCqQKyAr0CwQLPAtYC3wLkAucAAAAAAAACAQAAAAAAAAAoAAAAAAAAAAAAAAAAAAAC9A==}} @book{aarts97, Address = {Chichester}, Author = {E. Aarts and J. K. Lenstra}, Publisher = {Wiley}, Title = {Local search in combinatorial optimization}, Year = 1997} @article{abascal05, Author = {F. Abascal and R. Zardoya and D. Posada}, Journal = {Bioinformatics}, Pages = {2104-2105}, Title = {ProtTest: selection of best-fit models of protein evolution}, Volume = 21, Year = {2005}} @phdthesis{adachi95, Author = {J. Adachi}, School = {The Graduate University for Advanced Studies}, Title = {Modeling of Molecular Evolution and Maximum Likelihood Inference of Molecular Phylogeny}, Year = 1995} @article{akaike74, Author = {H. Akaike}, Journal = {IEEE Transactions on Automatic Control}, Pages = {716-723}, Title = {A new look at the statistical model identification}, Volume = 19, Year = {1974}} @article{amrine03, Author = {H. Amrine-Madsen and K Koepfli and R. Wayne and M. Springer}, Journal = {Molecular Phylogenetics and Evolution}, Pages = {225-240}, Title = {A new phylogenetic marker, apolipoprotein {B}, provides compelling evidence for eutherian relationships}, Volume = 28, Year = {2003}} @article{ane05, Author = {C. An\'e and J. Burleigh and M. McMahon and M. Sanderson}, Journal = {Molecular Biology and Evolution}, Pages = {914-924}, Title = {Covarion structure in plastid genome evolution: a new statistical test}, Volume = 22, Year = {2005}} @article{anisimova01, Author = {M. Anisimova and J. Bielawski and Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {1585-1592}, Title = {The accuracy and power of likelihood ratio tests to detect positive selection at amino acid sites}, Volume = 18, Year = {2001}} @article{anisimova02, Author = {M. Anisimova and J. Bielawski and Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {950-958}, Title = {Accuracy and power of Bayes prediction of amino acid under positive selection}, Volume = 19, Year = {2002}} @article{anisimova03, Author = {M. Anisimova and R. Nielsen and Z. Yang}, Journal = {Genetics}, Pages = {1229-1236}, Title = {Effect of recombination on the accuracy of the likelihood method for detecting positive selection at amino acid sites.}, Volume = 164, Year = {2003}} @article{anisimova06, Author = {M. Anisimova and O. Gascuel}, Journal = {Systematic Biology}, Pages = {539-552}, Title = {Approximate likelihood-ratio test for branches: a fast, accurate, and powerful alternative}, Volume = 55, Year = {2006}} @article{anisimova07, title={Multiple hypothesis testing to detect lineages under positive selection that affects only a few sites}, author={Anisimova, Maria and Yang, Ziheng}, journal={Molecular Biology and Evolution}, volume={24}, number={5}, pages={1219--1228}, year={2007}, publisher={SMBE} } @article{anisimova11, title={Survey of branch support methods demonstrates accuracy, power, and robustness of fast likelihood-based approximation schemes}, author={Anisimova, M. and Gil, M. and Dufayard, J.F. and Dessimoz, C. and Gascuel, O.}, journal={Systematic Biology}, volume={60}, number={5}, pages={685--699}, year={2011}, publisher={Oxford University Press} } @article{atv, Author = {C. Zmasek and S. Eddy}, Journal = {Bioinformatics}, Pages = {383-384}, Title = {{ATV}: display and manipulation of annotated phylogenetic trees}, Volume = 17, Year = 2001} @book{intro-algo, Author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest}, Chapter = { 17 greedy algorithms}, Pages = {329-356}, Publisher = {The Massachuset Institute of Technology Press}, Title = {Introduction to algorithms}, Year = 1992} @article{seqgen, Author = {A. Rambaut and N.C. Grassly}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {235-238}, Title = {{S}eq-{G}en: an application for the {M}onte {C}arlo simulation of {DNA} sequence evolution along phylogenetic trees.}, Volume = 13, Year = 1997} @article{bailey02, Author = {J. Bailey and Z. Gu and R. Clark and K. Reinert and R. Samonte and S. Schwartz and M. Adams and E. Myers and P. Li and E. Eicher}, Journal = {Science}, Pages = {1003-1007}, Title = {Recent segmental duplications in the human genome}, Volume = 297, Year = 2002} @article{baele06, Author = {G. Baele and J. Raes and Y. Van de Peer and S. Vansteelandt}, Journal = {Molecular Biology and Evolution}, Pages = {1397-1405}, Title = {An improved statistical method for detecting heterotachy in nucleotide sequences}, Volume = 23, Year = 2006} @article{berry, Author = {V. Berry and O. Gascuel}, Journal = {Theoretical Computer Science ({\`a} paraitre)}, Title = {Inferring evolutionary trees with strong combinatorial confidence.}, Year = 2000} @article{kumar02, Author = {S. Kumar and S. Subramanian}, Journal = {PNAS}, Pages = {803-808}, Title = {Mutation rates in mammalian genomes}, Volume = {99}, Year = {2002}} @article{kumar96, Author = {Sudhir Kumar}, Journal = {Molecular Biology and Evolution}, Title = {A Stepwise Algorithm for Finding Minimum Evolution Trees}, Year = 1996} @article{nei97, Author = {Masatoshi Nei, Sudhir Kumar, and Kei Takahashi}, Journal = {Special series of inaugural articles by members of the national academy of science}, Pages = {584-593}, Title = {The optimization principle in phylogenetic analysis tends to give incorrect topologies when the number of nucleotides or amino acids is small}, Volume = 13, Year = 1997} @article{nei98, Author = {M. Nei and S. Kumar and K. Takahashi}, Journal = {PNAS}, Pages = {12390-12397}, Title = {The optimization principle in phylogenetic analysis tends to give incorrect topologies when the number of nucleotides or amino acids used is small}, Volume = 95, Year = 1998} @inproceedings{abf96, Author = {R. Agarwala and V. Bafna and M. Farach and B. Narayanan and M. Paterson and M. Thorup}, Booktitle = {Proceedings of the 7th Annual ACM-SIAM Symposium on Discrete Algorithms}, Title = {On the approximability of numerical taxonomy: Fitting distances by tree metrics}, Year = 1996} @article{adell94, Author = {J. Adell and J. Dopazo}, Journal = {Journal of Molecular Evolution}, Pages = {305-309}, Title = {{M}onte {C}arlo Simulation in phylogenies : An application to Test the Constancy of Evolutionary Rates}, Volume = 38, Year = 1994} @incollection{adachi96, Address = {Tokyo}, Author = {J. Adachi and M. Hasegawa}, Booktitle = {Computer Science Monographs}, Editor = {M. Ishiguro and G. Kitagawa and Y. Ogata and H. Takagi and Y. Tamura and T. Tsuchiya}, Number = {28}, Publisher = {The Institute of Statistical Mathematics}, Title = {{MOLPHY} Version 2.3. Programs for molecular phylogenetics based on maximum likelihood}, Year = 1996} @article{adachi00, Author = {J. Adachi and Waddell P. and W. Martin and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {348-358}, Title = {Plastid genome phylogeny and a model of amino acid substitution for proteins encoded by chloroplast {DNA}}, Volume = 50, Year = 2000} @article{almagor83, Author = {Hagai Almagor}, Journal = {Journal of Theorical Biology}, Note = {{I}nfluence du {V}oisinage sur l'{E}volution d'une {S{\'e}}quence d'{ADN}}, Pages = {633-645}, Title = { A Markov analysis of {DNA} sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 104, Year = 1983} @book{alon92, Address = {Chichester}, Author = {N. Alon and J.H. Spencer}, Publisher = {Wiley}, Title = {The Probabilistic Method}, Year = 1992} @dea{andrieu92, Address = {Montpellier}, Author = {Guillaume Andrieu}, School = {{E}cole {N}ationale {S}up{\'e}rieure {A}gronomique de {M}ontpellier}, Title = {{M}od{\`e}les {P}robabilistes de {C}onstruction des {A}rbres {P}hylog{\'e}n{\'e}tique}, Utilisateur = {Gilles Caraux}, Year = 1992} @phdthesis{andrieu97, Author = {G. Andrieu}, Month = {d{\'e}cembre}, School = {Univ. Montpellier II}, Title = {Estimation par intervalle d'une distance {\'e}volutive}, Year = 1997} @article{arisbrosou02, Author = {S. Aris-Brosou and Z. Yang}, Journal = {Systematic Biology}, Pages = {703-714}, Title = {Effects of models of rate evolution on estimation of divergence dates with special reference to the metazoan {18S} ribosomal {RNA} phylogeny}, Volume = 51, Year = 2002} @book{atlan, Address = {Petaouchnok}, Author = {Henri Atlan}, Publisher = {Herman}, Title = {L'organisation Biologique et la th{\'e}orie de l'information}, Year = 1992} @misc{atteson96, Author = {K. Atteson}, Howpublished = {DIMACS}, Month = {november}, Title = {Workshop on Mathematical Hierarchies and Biology}, Year = 1996} @incollection{atteson97, Author = {K. Atteson}, Booktitle = {Mathematical Hierarchies and Biology}, Editor = {B. Mirkin and F.R. McMorris and F.S. Roberts and A. Rhzetsky}, Pages = {133-148}, Publisher = {American Mathematical Society}, Title = {The performance of the {NJ} method of phylogeny reconstruction}, Year = 1997} @article{bailly03, Author = { X. Bailly and R. Leroy and S. Carney and O. Collin and F. Zal and A. Toulmond and D. Jollivet}, Journal = {PNAS}, Pages = {5885-5890}, Title = {The loss of the hemoglobin \hbox{H$_2$S}-binding function in annelids from sulfide-free habitats reveals molecular adaptation driven by {D}arwinian positive selection}, Volume = 1000, Year = 2003} @article{bd86, Author = {H-J. Bandelt and A. Dress}, Journal = {Advances in Applied Mathematics}, Pages = {309-343}, Title = {Reconstructing the Shape of a Tree from Observed Dissimilarity Data}, Utilisateur = {Vincent}, Volume = 7, Year = 1986} @misc{bandelt90, Author = {H.-J. Bandelt and A. von Haeseler and A. Bolick and H. Sch{\"u}tte}, Howpublished = {preprint}, Title = {A comparative study of sequence dissimilarities and evolutionnary distances derived from sets of aligned RNA sequences}, Year = 1990} @article{bandelt92, Author = {H.-J. Bandelt and A. Dress}, Journal = {Advances Math.}, Pages = {47-105}, Title = {A canonical decomposition theory for metrics on a finite set}, Volume = 92, Year = 1992} @article{bandelt92b, Author = {H.-J. Bandelt and A. Dress}, Journal = {Molecular Biology and Evolution}, Pages = {242-252}, Title = {Split Decomposition: A New and Useful Approach to Phylogenetic Analysis of Distance Data}, Volume = 1, Year = 1992} @article{barry87, Author = {Daniel Barry and J. A. Hartigan}, Journal = {Biometrics}, Pages = {261-276}, Title = {Asynchronous Distance Between Homologous {DNA} Sequences}, Volume = 43, Year = 1987} @article{barry872, Author = {Daniel Barry and J. A. Hartigan}, Journal = {Statistical Science}, Pages = {191-210}, Title = {Statistical Analysis of Homimoid Molecular Evolution}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 2, Year = 1987} @article{barton2013, title={Modelling evolution in a spatial continuum}, author={Barton, NH and Etheridge, AM and V{\'e}ber, A}, journal={Journal of Statistical Mechanics: Theory and Experiment}, volume={2013}, number={01}, pages={P01002}, year={2013}, publisher={IOP Publishing} } @inproceedings{barthelemy84, Address = {La Grande-Motte}, Author = {J.-P. Barth{\'e}lemy and N.X. Luong}, Booktitle = {Colloque ASSU.}, Title = {Repr{\'e}sentations arbor{\'e}es de mesures de dissimilarit{\'e}}, Year = 1984} @book{barthelemy88, Author = {J.-P. Barth{\'e}lemy and Alain Gu{\'e}noche}, Publisher = {Masson}, Series = {{M}{\'e}thodes + {P}rogrammes}, Title = {Les arbres et les repr{\'e}sentations des proximit{\'e}s}, Year = 1988} @article{barth88, Author = {J. P. Barth{\'e}lemy}, Journal = {Journal of Classification}, Pages = {229-236}, Title = {Thresholded consensus for n-trees}, Utilisateur = {Gilles Caraux and Olivier Gascuel}, Volume = 5, Year = 1988} @article{bazykin04, Author = {G. Bazykin and F. Kondrashov and A. Ogurtsov and S. Sunyaev and A. Kondrashov}, Journal = {Nature}, Pages = {558-562}, Title = {Positive selection at sites of multiple amino acid replacements since rat-mouse divergence.}, Volume = 3, Year = 2004} @book{barthelemy91, Author = {J.P. Barth{\'e}lemy and A. Gu{\'e}noche}, Editor = {Chichester}, Publisher = {Wiley}, Title = {Trees and proximities representations}, Year = 1991} @article{benjamini95, Author = {Y. Benjamini and Y. Hochberg}, Journal = {Journal of the Royal Statistics Society: Series B (Statistical Methodology)}, Pages = {289-300}, Title = {Controlling the false discovery rate -- a practical and powerful approach to multiple testing}, Volume = {57}, Year = {1995}} @article{benjamini00, Author = {Y. Benjamini and Y. Hochberg}, Journal = {Journal of Educational and Behavioral Statistics}, Pages = {60-83}, Title = {The adaptive control of the false discovery rate in multiple hypothesis testing with independent statistics}, Volume = {25}, Year = {2000}} @article{benjamini01, Author = {Y. Benjamini and D. Yekutieli}, Journal = {Annals of Statistics}, Pages = {1165-1188}, Title = {The control of the false discovery rate in multiple testing under dependency}, Volume = {29}, Year = {2001}} @inbook{benzecri, Address = {Paris}, Author = {J. P. Benzecri}, Chapter = {TIB No 3}, Pages = {119-152}, Publisher = {Dunod}, Series = {L'analyse des donn{\'e}es}, Title = {Description math{\'e}matique des classifications}, Utilisateur = {Gilles Caraux}, Volume = {I~: La Taxinomie}, Year = 1973} @article{benzer61, Author = {S. Benzer}, Journal = {PNAS}, Pages = {403-415}, Title = {On the topography of genetic fine structure}, Volume = 47, Year = 1961} @phdthesis{berrythese, Author = {V. Berry}, Month = {d{\'e}cembre}, School = {Univ. Montpellier II}, Title = {M{\'e}thodes et algorithmes pour reconstruire les arbres de l'{\'e}volution}, Year = 1997} @book{berge70, Author = {C. Berge}, Publisher = {Dunod}, Title = {Graphes et hypergraphes}, Year = 1970} @article{bertrand04, Author = {D. Bertrand and O. Gascuel}, Journal = {WABI}, Title = {Topological rearrangements and local search method for tandem duplication trees}, Year = 2004} @article{bertrand05, Author = {D. Bertrand and O. Gascuel}, Journal = {{IEEE} Transactions on computational biology and bioinformatics}, Title = {Topological rearrangements and local search method for tandem duplication trees}, Volume = {2}, Issue = {1}, Year = 2005} @article{bg96_boot, Author = {V. Berry and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {999-1011}, Title = {On the interpretation of Bootstrap trees: appropriate threshold of clade selection and induced gain}, Volume = 13, Year = 1996} @techreport{bg96_quad, Author = {V. Berry and O. Gascuel}, Institution = {LIRMM}, Month = {july}, Number = {96-044}, Title = {A quartet-based heuristics for phylogeny reconstruction}, Year = 1996} @inbook{bhattacharya, Address = {New York}, Author = {Rabi N. Bhattacharya and Edwards C. Waymire}, Chapter = { No IV Continuous-Parameter {M}arkov chains}, Pages = {261-366}, Publisher = {Wiley}, Title = {Stochastic processes with applications}, Utilisateur = {Guillaume Andrieu}, Year = 1990} @article{bielawski01, Author = {J. Bielawski and Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {523-529}, Title = {Positive and negative selection in the {\uppercase{\it{DAZ}}} gene family}, Volume = {18}, Year = 2001} @article{bielawski03, Author = {J. Bielawski and Z. Yang}, Journal = {Journal of Structural and Functional Genomics}, Pages = {201-212}, Title = {Maximum likelihood methods for detecting adaptive evolution after gene duplication}, Volume = {3}, Year = 2003} @article{bielawski04, Author = {J. Bielawski and Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {121-132}, Title = {A maximum likelihood method for detecting functional divergence at individual codon sites, with application to gene family evolution}, Volume = {59}, Year = 2004} @article{bishop85, Author = {M. J. Bishop and A. E. Friday}, Journal = {Proceeding of the Royal Society of London}, Pages = {271-302}, Title = {{E}volutionary trees from nucleic acid and protein sequences}, Utilisateur = {Guillaume Andrieu}, Volume = {B 226}, Year = 1985} @article{blaisdell85, Author = {B. Edwin Blaisdell}, Journal = {Journal of Molecular Evolution}, Note = {{I}nfluence du {V}oisinage sur l'{E}volution d'une {S{\'e}}quence d'{ADN}}, Pages = {278-288}, Title = {Markov chain analysis find a significant influence of neighboring bases on the occurence of a base in eucaryotic nuclear {DNA} sequences both protein-coding and noncoding}, Utilisateur = {Guillaume Andrieu}, Volume = 21, Year = 1985} @article{blaisdell91, Author = {Edwin Blaisdell}, Journal = {Journal of Molecular Evolution}, Pages = {521-528}, Title = {average values of a dissimilarity measure not requiring sequence alignment are twice the average of conventional mismatch counts requiring sequence alignment for a variety of computer-Generated model systems}, Utilisateur = {G. Andrieu}, Volume = 32, Year = 1991} @article{blake92, Author = {R.D. Blake and Samuel T. Hess and Janice Nicholson-Tuell}, Journal = {Journal of Molecular Evolution}, Note = {{I}nfluence du {V}oisinage sur l'{E}volution d'une {S{\'e}}quence d'{ADN}}, Pages = {189-200}, Title = {The Influence of Nearest Neighbors on the Rate and Pattern of Spontaneous Point Mutations}, Utilisateur = {Guillaume Andrieu}, Volume = 34, Year = 1992} @article{blanken82, Author = {Roger L. Blanken and Lynn C. Klotz and Alan G. Hinnebusch}, Journal = {Journal of Molecular Evolution}, Pages = {9-19}, Title = {Computer comparison of new and existing criteria for constructing evolutionary trees from sequence data}, Utilisateur = {Gilles Caraux}, Volume = 19, Year = 1982} @article{blast, Author = {S. Altschul and W. Gish and W. Miller and E. Myers and D. Lipman}, Journal = {Journal of Molecular Biology}, Pages = {403-410}, Title = {Basic local alignment search tool}, Volume = {215}, Year = {1990}} @article{bledsoe90, Author = {Anthony H. Bledsoe and Robert J. Raikow }, Journal = {Journal of Molecular Evolution}, Pages = {247-259}, Title = {A quantitative assessment of congruence between molecular and nonmolecular estimates of phylogeny}, Utilisateur = {G. Andrieu}, Volume = 30, Year = 1990} @article{brauer02, Author = { M.J. Brauer and M.T. Holder and L.A. Dries and D.J. Zwickl and P.O. Lewis and D.M. Hillis}, Journal = {Molecular Biology and Evolution}, Pages = {1717-1726}, Title = {Genetic algorithms and parallel processing in maximum-likelihood phylogeny inference}, Volume = 19, Year = 2002} @book{breiman84, Author = {L. Breiman and J.H. Friedman and A. Olshen and Stone C.J.}, Editor = {Belmont}, Publisher = {Wadsworth}, Title = {Classification and regression trees}, Year = 1984} @article{bremer88, Author = {K. Bremer}, Journal = {Evolution}, Note = {Donne une bonne facon de tester la robustesse d'un arbre infere par une meth de parcimonie : faire un arbre de consensus strict pr les arbres de valeur opt, puis un avec aussi ceux de val opt+1,... et noter a quelle etape disparait chq noeud}, Pages = {795-803}, Title = {The limits of amino acid sequence data in angiosperm phylogenetic reconstruction}, Utilisateur = {Vincent}, Volume = 42, Year = 1988} @book{brent73, Author = {R. Brent}, Chapter = {5}, Publisher = {Prentice-Hall}, Title = {Algorithms for minimization without derivatives}, Year = 1973} @article{brossier85, Author = {Gildas Brossier}, Journal = {Math. Sci. hum.}, Pages = {5-21}, Title = {Approximation des dissimilarit{\'e}s par des arbres additifs}, Utilisateur = {Gilles Caraux}, Volume = 91, Year = 1985} @article{brown99, Author = {K. S. Brown}, Journal = {Science}, Pages = {990-991}, Title = {Deep Green Rewrites Evolutionary History of Plants}, Volume = 285, Year = 1999} @article{bruno00, Author = {W. Bruno and N. Socci and A. Halpern}, Journal = {Molecular Biology and Evolution}, Pages = {189-197}, Title = {Weighted neighbor joining: a likelihood-based approach to distance-based phylogeny reconstruction}, Volume = 17, Year = 2000} @incollection{bryant05, Address = {Oxford}, Author = {D. Bryant and N. Galtier and M.-A. Poursat}, Booktitle = {Mathematics of Evolution \& Phylogenetics}, Editor = {O. Gascuel}, Pages = {33-62}, Publisher = {Oxford University Press}, Title = {Likelihood Calculations in Phylogenetics}, Year = 2005} @article{weighbor, Author = {W. Bruno and N. D. Socci and A. L. Halpern}, Journal = {Molecular Biology and Evolution}, Pages = {189-197}, Title = {Weighted Neighbor Joining: A Likelihood-based Approach to Distance-Based Phylogeny Reconstruction}, Volume = 17, Year = 2000} @article{buckley01, Author = {Thomas R. Buckley and Chris Simon and Geoffrey K. Chambers}, Journal = {Systematic Biology}, Pages = {67-86}, Title = {Exploring Among-Site Rate Variation Models in a Maximum Likelihood Framework Using Empirical Data: Effects of Model Assumptions on Estimates of Topology, Branch Lengths, and Bootstrap Support}, Volume = 50, Year = 2001} @article{buckley01b, Author = {Thomas R. Buckley and Chris Simon and Hidetoshi Shimodaira and Geoffrey K. Chambers}, Journal = {Molecular Biology and Evolution}, Pages = {223-234}, Title = {Evaluating Hypotheses on the Origin and Evolution of the New Zealand Alpine Cicadas (Maoricicada) Using Multiple-Comparison Tests of Tree Topology}, Volume = 18, Year = 2001} @article{bulmer91, Author = {Michael Bulmer}, Journal = {Molecular Biology and Evolution}, Pages = {868-883}, Title = {Use of the method of generalized least squares in reconstructing phylogenies from sequence data}, Volume = 8, Year = 1991} @inbook{buneman71, Author = {P. Buneman}, Chapter = {The recovery of trees from measures of dissimilarity}, Pages = {387-395}, Publisher = {Edhinburgh University Press}, Title = {Mathematics in Archeological and Historical Sciences}, Year = 1971} @article{buneman74, Author = {P. Buneman}, Journal = {J. of Comb. Theory}, Pages = {48-50}, Title = {A note on metric properties of trees}, Volume = 17, Year = 1974} @article{cao98, Author = {Y. Cao and A. Janke and P. Waddell and M. Westerman and O. Takenaka and S. Murata and N. Okada and S. Paabo and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {307-322}, Title = {Conflict among individual mitochondrial proteins in resolving the phylogeny of eutherian orders}, Volume = 47, Year = 1998} @article{carroll76, Author = {J. Douglas Carroll}, Journal = {Psychometrika}, Pages = {439-463}, Title = {Spatial, non-spatial and hybrid models for scaling}, Utilisateur = {Gilles Caraux}, Volume = 41, Year = 1976} @article{cavalli67, Author = {L. L. Cavalli-Sforza and A. W. F. Edwards}, Journal = {The American Journal of Human Genetics}, Pages = {233-257}, Title = {Phylogenetic analysis models and estimation procedures}, Volume = 19, Year = 1967} @article{cavender78, Author = {J. A. Cavender}, Journal = {Mathematical Biosciences}, Pages = {271-280}, Title = {Taxonomy with Confidence}, Utilisateur = {Guillaume Andrieu}, Volume = 40, Year = 1978} @article{cavender81, Author = {James A. Cavender}, Journal = {Mathematical Biosciences}, Pages = {217-229}, Title = {Tests of Phylogenetic Hypotheses under Generalized Models}, Utilisateur = {Guillaume Andrieu}, Volume = 54, Year = 1981} @article{chandon80, Author = {Jean Louis Chandon and J. Lemaire and J. Pouget}, Journal = {R.A.I.R.O. Recherche op{\'e}rationnelle}, Pages = {157-170}, Title = {Construction de l'ultram{\'e}trique la plus proche d'une dissimilarit{\'e} au sens des moindres carr{\'e}s}, Utilisateur = {Gilles Caraux}, Volume = 14, Year = 1980} @article{chor00, Author = {B. Chor and M. Hendy and B. Holland and D. Penny}, Journal = {Molecular Biology and Evolution}, Pages = {1529-1541}, Title = {Multiple maxima of likelihood in phylogenetic trees: an analytic approach}, Volume = 17, Year = 2000} @article{churchill92, Author = {Gary A. Churchill and Arndt von Haesler and William C. Navidi}, Journal = {Molecular Biology and Evolution}, Pages = {753-769}, Title = {Sample size for a phylogenetic inference }, Utilisateur = {Guillaume Andrieu}, Volume = 9, Year = 1992} @article{clark92, Author = {Andrew G. Clark and Thomas S. Whittam}, Journal = {Molecular Biology and Evolution}, Pages = {744-752}, Title = { Sequencing errors and molecular evolutionary analysis}, Utilisateur = {Guillaume Andrieu}, Volume = 9, Year = 1992} @article{clark03, Author = { A. Clark and S. Glanowski and R. Nielsen and P. Thomas and A. Kejariwal and M. Todd and D. Tanenbaum and D. Civello and F. Lu and B. Murphy and S. Ferriera and G. Wang and X. Zheng and T. White and J. Sninsky and M. Adams and M. Cargill}, Journal = {Science}, Pages = {1960-1963}, Title = {Inferring nonneutral evolution from human-chimp-mouse orthologous gene trios}, Volume = 302, Year = 2003} @inproceedings{cohen97, Author = {J. Cohen and M. Farach}, Booktitle = {Proceedings of the 8th Annual ACM-SIAM Symposium On Discrete Algorithms}, Title = {Numerical Taxonomy on Data: Experimental Results}, Year = 1997} @article{colless67, Author = {Donald H. Colless}, Journal = {Systematic Zoology}, Pages = {289-295}, Title = {The phylogenetic fallacy}, Utilisateur = {Gilles Caraux}, Volume = 16, Year = 1967} @article{colonius81, Author = {H. Colonius and H.H. Schulze}, Journal = {British Journal of Math. and Stat. Psychology}, Pages = {167-180}, Title = {Tree structures for proximity data}, Utilisateur = {Vincent}, Volume = 34, Year = 1981} @article{crandall99, Author = {K. Crandall and C. Kelsey and H. Imamichi and H. Lane and N. Salzman}, Journal = {Molecular Biology and Evolution}, Pages = {372-382}, Title = {Parallel evolution of drug resistance in {HIV} : failure of nonsynonymous/synonymous rate ratio to detect selection}, Volume = 16, Year = 1999} @article{curnow89, Author = {R. N. Curnow and T. B. L. Kirkwood}, Journal = {J. of the Royal Statistical Society}, Pages = {199-220}, Title = {Statistical analysis of Desoxyribonucleic Acid Sequence Data-A review}, Utilisateur = {Guillaume Andrieu}, Volume = 152, Year = 1989} @incollection{czelusniak90, Address = {New York}, Author = {John Czelusniak and Morris Goodman and Nancy D. Moncrieff and Suzanne M. Kehoe}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 37, Editor = {Russsell F. Doolittle}, Note = {{P}resente les meths de branch-swapping sur un arbre}, Pages = {601-615}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Maximum Parsimony Approach to Construction of Evolutionary Trees from Aligned Homologous Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @book{darwin, Author = {C. Darwin}, Publisher = {John Murray}, Title = {On the origin of species}, Year = 1859} @article{daubin03, Author = {V. Daubin and G. Perri{\`e}re}, Journal = {Molecular Biology and Evolution}, Pages = {471-483}, Title = {{G+C3} structuring along the genome : a common feature in prokaryotes}, Volume = 20, Year = 2003} @article{day85, Author = {W.H. Day and F.R. McMorris}, Journal = {Bulletin of Math. Biol.}, Pages = {215-229}, Title = {A formalization of consensus index methods}, Volume = 47, Year = 1985} @incollection{day87, Author = {W. H. E. Day}, Booktitle = {Bulletin of Mathematical Biology}, Pages = {461-467}, Title = {Computational Complexity of Inferring Phylogenies from Dissimilarity Matrices}, Volume = 49, Year = 1987} @incollection{dayhoff78, Address = {Washington, D. C.}, Author = {M. Dayhoff and R. Schwartz and B. Orcutt}, Booktitle = {Atlas of Protein Sequence and Structure}, Editor = {M. Dayhoff}, Pages = {345-352}, Publisher = {National Biomedical Research Foundation}, Title = {A model of evolutionary change in proteins}, Volume = 5, Year = 1978} @incollection{debry92, Author = {R. W. DeBry}, Booktitle = {Molecular Biology and Evolution}, Pages = {537-551}, Title = {The Consistency of Several Phylogeny-Inference Methods under Varying Evolutionary Rates}, Volume = 9, Year = 1992} @incollection{degens83, Address = {Berlin Heidelberg}, Author = {Paul O. Degens}, Booktitle = {Numerical Taxonomy}, Editor = {Joseph Felsenstein}, Pages = {249-253}, Publisher = {Springer-Verlag}, Series = {NATO ASI}, Title = {Hierarchical cluster methods as maximum likelihood estimators}, Utilisateur = {Gilles Caraux}, Volume = {G1}, Year = 1983} @article{delsuc02, Author = {F. Delsuc and M. Scally and O. Madsen and M. Stanhope and W. de Jong and F. Catzeflis and M. Springer and E. Douzery}, Journal = {Molecular Biology and Evolution}, Pages = {1656-1671}, Title = {Molecular phylogeny of living xenarthrans and the impact of character and taxon sampling on the placental tree rooting}, Volume = {19}, Year = {2002}} @article{delsuc05, Author = {F. Delsuc and H. Brinkmann and H. Philippe}, Journal = {Nature Review Genetics}, Pages = {361-375}, Title = {Phylogenomics and the reconstruction of the tree of life}, Volume = {6}, Year = {2005}} @article{dempster77, Author = {A. P. Dempster and N. M. Laird and D. B. Rubin}, Journal = {J. R. Statist. Soc. B}, Pages = {1-22}, Title = {Maximum Likelihood from incomplete data via the \hbox{\it EM} algorithm}, Utilisateur = {Gilles Caraux et Guillaume Andrieu}, Volume = 39, Year = 1977} @article{denis02, Author = {F. Denis and O. Gascuel}, Journal = {Discrete Applied Mathematics}, Title = {On the consistency of the minimum evolution principle of phylogenetic inference}, Year = 2002} @article{derchia96, Author = {A.M. D'Erchia and C. Gissi and G. Pesole and C. Saccone and U. Arnason}, Journal = {Nature}, Pages = {597-600}, Title = {The guinea-pig is not a rodent}, Volume = 381, Year = 1996} @article{desoete83, Author = {Geert de Soete}, Commentaire = {Ceci est mon commentaire}, Journal = {Psychometrika}, Pages = {621-626}, Title = {A least squares algorithm for fitting additive trees to proximity data}, Utilisateur = {Gilles Caraux}, Volume = 48, Year = 1983} @article{desper02, Author = {R. Desper and O. Gascuel}, Journal = {Journal of Computational Biology}, Pages = {687-705}, Title = {Fast and accurate phylogeny reconstruction algorithms based on the minimum-evolution principle}, Volume = 9, Year = 2002} @article{dickerson71, Author = {Richard Dickerson}, Journal = {Journal of Molecular Evolution}, Pages = {26-45}, Title = {The structure of cytochrome $c$ and the rates of molecular evolution}, Utilisateur = {Gilles Caraux}, Volume = 1, Year = 1971} @article{dimmic02, Author = {M. Dimmic and J. Rest and D. Mindell and D. Goldstein}, Journal = {Journal of Molecular Evolution}, Pages = {65-73}, Title = {{rtREV}: an amino acid substitution matrix for inference of retrovirus and reverse transcriptase phylogeny}, Volume = 55, Year = 2002} @incollection{dobson75, Address = {Berlin}, Author = {Annette J. Dobson}, Booktitle = {Combinatorial Mathematics III}, Editor = {A. Dold and B. Eckmann}, Pages = {95-100}, Publisher = {Springer}, Series = {Lecture Notes in Mathematics}, Title = {Comparing the shapes of trees}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 452, Year = 1975} @incollection{doolittle90, Author = {Russel F. Doolittle and Da-Fei Feng}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 41, Editor = {Russsell F. Doolittle}, Pages = {659-669}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Nearset Neighbor Procedure for relating Progressively Amino Acid Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{dopazo94, Author = {Joaquin Dopazo}, Journal = {Journal of Molecular Evolution}, Pages = {300-304}, Title = {Estimating Errors and Confidence Intervals for Branch Lengths in Phylogenetic Trees by a Bootstrap Approach}, Utilisateur = {Guillaume Andrieu}, Volume = 38, Year = 1994} @article{douady03, Author = {C. J. Douady and F. Delsuc and Y. Boucher and W. F. Doolittle and E. J. P. Douzery }, Journal = {Molecular Biology and Evolution}, Pages = {248-254}, Title = {Comparison of Bayesian and Maximum Likelihood Bootstrap Measures of Phylogenetic Reliability}, Volume = 20, Year = 2003} @article{douzery03, Author = {E. Douzery and F. Delsuc and M. Stanhope and D. Huchon}, Journal = {Journal of Molecular Evolution}, Pages = {S201-13}, Title = {Local molecular clocks in three nuclear genes: divergence times for rodents and other mammals and incompatibility among fossil calibrations}, Volume = {57 Suppl 1}, Year = 2003} @Article{douzery04, Author="Douzery, E. J. and Snell, E. A. and Bapteste, E. and Delsuc, F. and Philippe, H. ", Title="{{T}he timing of eukaryotic evolution: does a relaxed molecular clock reconcile proteins and fossils?}", Journal="Proc. Natl. Acad. Sci. U.S.A.", Year="2004", Volume="101", Pages="15386--15391", Month="Oct" } @article{dress86, Author = {A. Dress and A. von Haeseler and M. Krueger}, Journal = {Studien zur Klassifikation}, Pages = {299-305}, Title = {Reconstructing phylogenetic trees using variants of the "four-point condition"}, Year = 1986} @article{drummond03, Author = {A. Drummond and O. Pybus and A. Rambaut and R. Forsberg and A. Rodrigo}, Journal = {Trends in Ecology and Evolution}, Pages = {481-488}, Title = {Measurably evolving populations}, Volume = 18, Year = 2003} @article{drummond06, Author = {A. Drummond and S. Ho and M. Phillips and A. Rambaut}, Journal = {PLoS Biology}, Pages = {e88}, Title = {Relaxed phylogenetics and dating with confidence}, Volume = 4, Year = 2006} @Article{drummond07, Author="Drummond, A. J. and Rambaut, A. ", Title="{{B}{E}{A}{S}{T}: {B}ayesian evolutionary analysis by sampling trees}", Journal="BMC Evol. Biol.", Year="2007", Volume="7", Pages="214" } @article{dudoit02, Author = {S. Dudoit and J. Popper Shaffer and J. Boldrick}, Journal = {U.C. Berkeley Division of Biostatistics Working Paper Series}, Pages = {http://www.bepress.com/ucbbiostat/paper110}, Title = {Multiple Hypothesis Testing in Microarray Experiments}, Year = 2002} @article{edgar04, author={R. Edgar}, title={{MUSCLE}: multiple sequence alignment with high accuracy and high throughput}, journal={Nucleic Acids Research}, year={2004}, volume={32}, pages={1792-1797} } @article{edwards63, Author = {A. W. F. Edwards and L. L. Cavalli-Sforza}, Journal = {Ann. Hum. Genet.}, Pages = {104-105}, Title = {The reconstruction of evolution}, Volume = 27, Year = 1963} @article{edwards64, Author = {A. W. F. Edwards and L. L. Cavalli-Sforza}, Journal = {Systematics Association Publication.}, Pages = {67-76}, Title = {Reconstruction of evolutionary trees}, Volume = 6, Year = 1964} @book{edwards72, Address = {Cambridge, England}, Author = {A. W. F. Edwards}, Publisher = {University Press}, Title = {Likelihood}, Year = 1972} @article{efron79, Author = {B. Efron}, Journal = {Ann. Statistics}, Pages = {1-26}, Title = {Bootstrap methods: another look at the jackknife}, Volume = 7, Year = 1979} @article{efron85, Author = {B. Efron}, Journal = {Biometrika}, Pages = {45-58}, Title = {Bootstrap confidence intervals for a class of parametric problems}, Volume = 72, Year = 1985} @article{efron87, Author = {Bradley Efron}, Journal = {Journal of the american statistical association}, Month = {March}, Number = 397, Pages = {171-185}, Title = {Better bootstrap confidence intervals}, Volume = 82, Year = 1987} @book{efron93, Author = {Bradley Efron and Robert J. Tibshirani}, Publisher = {Chapman et Hall}, Title = {An {I}ntroduction to the {B}ootstrap}, Utilisateur = {Susan Holmes}, Year = 1993} @techreport{efron95, Author = {B. Efron and E. Halloran and S. Holmes}, Institution = {Standford University}, Number = {Tech. Rep. 179}, Title = {Bootstrap confidence levels for phylogenetic trees}, Year = 1995} @article{efron96, Author = {B. Efron and E. Halloran and S. Holmes}, Journal = {PNAS}, Pages = {7085-7090}, Title = {Bootstrap confidence levels for phylogenetic trees}, Volume = 93, Year = 1996} @article{eigen81, Author = {M. Eigen and R. Winkler-Oswatitsch}, Journal = {Die Naturwissenschaften}, Pages = {217-228}, Title = {Transfer-{\sc RNA} : The Early Adaptor}, Utilisateur = {Guillaume Andrieu}, Volume = 68, Year = 1981} @article{eigen88, Author = {M. Eigen and R. Winkler-Oswatitsch and A. Dress}, Journal = {PNAS}, Pages = {5913-5917}, Title = {Statistical Geometry in Sequence Space : A Method of Quantitative Comparative Sequence Analysis }, Volume = 85, Year = 1988} @incollection{eigen90a, Author = {Manfred Eigen and Ruthild Winkler-Oswatitsch}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 32, Editor = {Russsell F. Doolittle}, Pages = {505-530}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Statistical Geometry on Sequence Space}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{eigen90b, Author = {Manfred Eigen and Katja Nieselt-Struwe}, Journal = {AIDS}, Pages = {585-593}, Title = {How old is the Immunodeficiency Virus~?}, Utilisateur = {Guillaume Andrieu}, Volume = {4(suppl1)}, Year = 1990} @article{elemento02, Author = {O. Elemento and O. Gascuel and M.-P. Lefranc }, Journal = {Molecular Biology and Evolution}, Pages = {278-288}, Title = {Reconstructing the duplication history of tandemly repeated genes}, Volume = {19}, Year = 2002} @article{erchia96, Author = {A.M. d'Erchia and C. Gissi and G. Pesole and C. Saccone and U. Arnason}, Journal = {Nature}, Pages = {597-600}, Title = {The guinea-pig is not a rodent}, Volume = 381, Year = 1996} @article{estabrook72, Author = {G.F. Estabrook}, Journal = {Ann. Rev. Ecol. Syst.}, Pages = {427-456}, Title = {Cladistic methodology: a discussion of the theoretical basis for the induction of evolutionary history}, Volume = 3, Year = 1972} @article{estabrook76, Author = {G.F. Estabrook and C.S. Johnson and F.R. McMorris}, Journal = {Mathematical Biosciences}, Pages = {181-187}, Title = {A mathematical foundation for the analysis of cladistic character compatibility}, Volume = 29, Year = 1976} @inproceedings{fk96, Author = {M. Farach and S. Kannan}, Booktitle = {Proceedings of the 28th Annual ACM Symposium on the Theory of Computing}, Pages = {230-235}, Title = {Efficient algorithms for inverting evolution}, Year = 1996} @article{farris71, Author = {James S. Farris}, Journal = {Annual Review of Ecology and Systematics}, Pages = {277-302}, Title = {The hypothesis of nonspecificity and taxonomic congruence}, Utilisateur = {Gilles Caraux}, Volume = 22, Year = 1971} @article{farris73a, Author = {James S. Farris}, Journal = {Systematic Zoology}, Pages = {250-256}, Title = {A Probability Model for Inferring Evolutionary Trees}, Utilisateur = {Guillaume Andrieu}, Volume = 22, Year = 1973} @article{farris73b, Author = {James S. Farris}, Journal = {American Naturalist}, Pages = {531-534}, Title = {Estimation of Amino-Acid Substitution when Back Mutation can occur}, Utilisateur = {Guillaume Andrieu}, Volume = 107, Year = 1973} @article{felsenstein73a, Author = {J. Felsenstein}, Journal = {The American Journal of Human Genetics}, Pages = {471-492}, Title = {Maximum-likelihood estimation of evolutionary trees from continuous characters}, Utilisateur = {Gilles Caraux}, Volume = 25, Year = 1973} @article{felsenstein73b, Author = {J. Felsenstein}, Journal = {Systematic Zoology}, Pages = {240-249}, Title = {Maximum Likelihood and Minimum Steps Methods for Estimating Evolutionnary Trees from Data on Discrete Characters}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 23, Year = 1973} @article{felsenstein78, Author = {J. Felsenstein}, Journal = {Systematic Zoology}, Pages = {401-410}, Title = {Cases in which parsimony and compatibility methods will be positively misleading}, Volume = 27, Year = 1978} @article{felsenstein81a, Author = {J. Felsenstein}, Journal = {Journal of Molecular Evolution}, Pages = {368-376}, Title = {Evolutionary Trees from {DNA} Sequences: a Maximum Likelihood Approach}, Volume = 17, Year = 1981} @article{felsenstein81b, Author = {J. Felsenstein}, Journal = {Evolution}, Note = {({\it construction d'arbrtes par le maximum de vraisemblance})}, Number = 6, Pages = {1229-1242}, Title = {Evolutionary Trees from gene frequencies and quantitative characteres : finding maximum likelihood estimates}, Volume = 35, Year = 1981} @article{felsenstein83, Author = {J. Felsenstein}, Journal = {J. R. Statist. Soc. A}, Number = {Part 3}, Pages = {246-272}, Title = {Statistical Inference of Phylogenies}, Volume = 146, Year = 1983} @article{felsenstein84, Author = {J. Felsenstein}, Journal = {Evolution}, Number = 1, Pages = {16-24}, Title = {Distance methods for inferring phylogenies : a justification}, Utilisateur = {Gilles Caraux}, Volume = 38, Year = 1984} @article{felsenstein85a, Author = {J. Felsenstein}, Journal = {Evolution}, Pages = {783-791}, Title = {Confidence limits on phylogenies: an approach using the bootstrap}, Volume = 39, Year = 1985} @article{felsenstein85b, Author = {J. Felsenstein}, Journal = {Systematic Zoology}, Pages = {27-33}, Title = {The number of evolutionary trees}, Utilisateur = {Gilles Caraux}, Volume = 34, Year = 1985} @article{felsenstein85c, Author = {J. Felsenstein}, Journal = {Systematic Zoology}, Number = 2, Pages = {152-161}, Title = {Confidence limits on phylogenies with a molecular clock}, Utilisateur = {Gilles Caraux}, Volume = 34, Year = 1985} @article{felsenstein87, Author = {J. Felsenstein}, Journal = {Journal of Molecular Evolution}, Pages = {123-131}, Title = { Estimation of Hominoid Phylogeny from a {DNA} Hybridation Data Set}, Utilisateur = {Guillaume Andrieu}, Volume = 26, Year = 1987} @article{felsenstein88, Author = {J. Felsenstein}, Journal = {Annual Review of Genetics}, Pages = {521-565}, Title = {Phylogenies from molecular sequences: inference and reliability}, Volume = 22, Year = 1988} @book{felsensteinbook, Address = {Sunderland, MA}, Author = {J. Felsenstein}, Publisher = {Sinauer Associates, Inc.}, Title = {Inferring phylogenies}, Year = 2003} @article{phylip1, Author = {J. Felsenstein}, Journal = {Cladistics}, Pages = {164-166}, Title = {Phylogeny Inference Package (Version 3.2)}, Volume = {5}, Year = {1989}} @book{phylip2, Address = {Department of Genetics, University of Washington, Seattle}, Author = {J. Felsenstein}, Publisher = {Distributed by the author}, Title = {PHYLIP ({PHYL}ogeny {I}nference {P}ackage) version 3.6a2}, Year = {1993}} @article{gaucher01, Author = {E. Gaucher and M. Miyamoto and S. Benner}, Journal = {PNAS}, Pages = {548-552}, Title = {Function-structure analysis of proteins using covarion-based evolutionary approaches: {E}longation factors}, Volume = 98, Year = 2001} @ARTICLE{gouy09, author = { Manolo Gouy and Stephane Guindon and Olivier Gascuel}, title = {Sea{V}iew version 4: {A} multiplatform graphical user interface for sequence alignment and phylogenetic tree building.}, journal = {Mol Biol Evol}, year = {2010}, volume = {27}, number = {2}, pages = {221-4} } @article{haydon01, Author = {D. Haydon and A. Bastos and N. Knowles and A. Samuel}, Journal = {Genetics}, Pages = {7-15}, Title = {Evidence for Positive Selection in Foot-and-Mouth Disease Virus Capsid Genes From Field Isolates}, Volume = 157, Year = 2001} @article{henikoff92, Author = {S. Henikoff and J. Henikoff}, Journal = {PNAS}, Pages = {10915-10919}, Title = {Amino acid substitution matrices from protein blocks.}, Volume = 89, Year = 1992} @article{hordijk05, Author = {W. Hordijk and O. Gascuel}, Journal = {Bioinformatics}, Pages = {4338-4347}, Title = {Improving the efficiency of {SPR} moves in phylogenetic tree search methods based on maximum likelihood.}, Volume = 21, Year = 2005} @article{huelsenbeck00, Author = {J. Huelsenbeck and B. Larget and D. Swofford}, Journal = {Genetics}, Pages = {1879-1892}, Title = {A compound {P}oisson process for relaxing the molecular clock}, Volume = 154, Year = 2000} @article{kuhner94, Author = {M. Kuhner and J. Felsenstein}, Journal = {Molecular Biology and Evolution}, Pages = {459-468}, Title = {A Simulation Comparison of Phylogeny Algorithms under Equal and Unequal Evolutionary Rates}, Volume = 11, Year = 1994} @article{felsenstein96, Author = {J. Felsenstein and G.A. Churchill}, Journal = {Molecular Biology and Evolution}, Pages = {93-104}, Title = {A Hidden {M}arkov Model approach to variation among sites in rate of evolution}, Volume = 13, Year = 1996} @incollection{feng90, Address = {New-York}, Author = {Da-Fei Feng and Russel F. Doolittle}, Booktitle = {Progressive alignement and phylogenetic tree construction of protein sequences}, Chapter = 23, Editor = {Russsell F. Doolittle}, Pages = {375-387}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Nearset Neighbor Procedure for relating Progressively Amino Acid Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{fitch67, Author = {W. M. Fitch and E. Margoliash}, Journal = {Science}, Pages = {279-284}, Title = {Construction of phylogenetic trees}, Volume = 155, Year = 1967} @article{fitch71, Author = {Walter M. Fitch}, Journal = {Systematic Zoology}, Title = {Toward defining the course of evolution : minimum change for a specific tree topology}, Year = 1971} @inproceedings{fitch75, Author = {W.M. Fitch}, Booktitle = {Proceedings of the 8th International Conference on Numerical Taxonomy}, Pages = {189-230}, Title = {Towards finding the tree of Maximum Parsimony}, Year = 1975} @article{fitch81, Author = {W. M. Fitch}, Journal = {Journal of Molecular Evolution}, Pages = {30-37}, Title = {A non-sequential method for constructing trees and hierarchical classifications}, Volume = 18, Year = 1981} @article{fitchfarris74, Author = {Walter M. Fitch and James S. Farris}, Journal = {Journal of Molecular Evolution}, Note = {etendent la meth de Fitch71 pr les acides amines, car il y a pr ce type de data qq ambiguites.}, Pages = {263-278}, Title = {Evolutionary trees with minimum nucleotide replacements form amino acid sequences}, Utilisateur = {Vincent}, Volume = 3, Year = 1974} @article{forsberg03, Author = {R. Forsberg and F. Christiansen}, Journal = {Molecular Biology and Evolution}, Pages = {1252-1259}, Title = {A codon-based model of host-specific selection in parasites with an application to the {I}nfluenza {A} virus}, Volume = 20, Year = 2003} @article{foulds84, Author = {L.R. Foulds}, Journal = {Journal of Theoretical Biology}, Pages = {471-474}, Title = {Maximum Savings in the Steiner Problem in Phylogeny}, Volume = 107, Year = 1984} @article{frommel85, Author = {C. Fr\H{o}mmel and H. G. Holzh\H{u}tter}, Journal = {Journal of Molecular Evolution}, Pages = {233-257}, Title = {an estimate on the effect of point mutation and natural selection on the rate of amino acid replacement in proteins }, Utilisateur = {Guillaume Andrieu}, Volume = 21, Year = 1985} @article{fukami89, Author = {K. Fukami and Y. Tateno}, Journal = {Journal of Molecular Evolution}, Pages = {460-464}, Title = {On the maximum likelihood method for estimating molecular trees : uniquesness of the likelihood point}, Utilisateur = {Gilles Caraux}, Volume = 28, Year = 1989} @phdthesis{galtierthese, Author = {N. Galtier}, Month = {novembre}, School = {Universit{\'e} Claude Bernard - Lyon I}, Title = {L'approche statistique en phylog{\'e}nie mol{\'e}culaire~: influence des composition en bases variables}, Year = 1997} @article{galtier01, Author = {N. Galtier}, Journal = {Molecular Biology and Evolution}, Pages = {866-873}, Title = {Maximum-likelihood phylogenetic analysis under a covarion-like model}, Volume = 18, Year = 2001} @article{galtier99, Author = {N. Galtier and N. Tourasse and M. Gouy}, Journal = {Science}, Pages = {220-221}, Title = {A nonhyperthermophilic common ancestor to extant life forms}, Volume = 283, Year = 1999} @article{galtier98, Author = {N. Galtier and M. Gouy}, Journal = {Molecular Biology and Evolution}, Pages = {871-879}, Title = {Inferring pattern and process: maximum-likelihood implementation of a nonhomogeneous model of {DNA} sequence evolution for phylogenetic analysis}, Volume = 15, Year = 1998} @article{galtier95, Author = {N. Galtier and M. Gouy}, Journal = {PNAS}, Pages = {11317-11321}, Title = {Inferring phylogenies from {DNA} sequences of unequal base compositions}, Volume = 92, Year = 1995} @article{galtier04, Author = {N. Galtier and A. Jean-Marie}, Journal = {Journal of Computational Biology}, Pages = {727-733}, Title = {Markov-modulated {M}arkov chains and the covarion process of molecular evolution}, Volume = 11, Year = 2004} @book{gamerman06, Author = {Dani Gamerman and Hedibert F. Lopes }, Isbn = {1584885874}, Publisher = {Chapman and Hall/CRC}, Title = {Markov Chain Monte Carlo: Stochastic Simulation for Bayesian Inference}, Year = {2006}} @book{gareyjohnson, Address = {San Fransisco}, Author = {M. Garey and D. Johnson}, Publisher = {Freeman}, Title = {{C}omputers and {I}ntractability - {A} guide to the {T}heory of {NP}-{C}ompleteness}, Year = 1979} @article{gascuel92, Author = {O. Gascuel and G. Caraux}, Journal = {Pattern Recognition letters}, Note = {({\it Estimation d'une probab {\`a} partir d'une fr{\'e}quence}) }, Pages = {757-764}, Title = {{D}istribution-free performance bounds with the resubstitution error estimate}, Volume = {13}, Year = {1992}} @article{gascuel94, Author = {O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {961-963}, Title = {A Note on {S}attah and {T}versky's, {S}aitou and {N}ei's, and {S}tudier and {K}eppler's Algorithms for Inferring Phylogenies from Evolutionary Distances}, Volume = {11}, Year = {1994}} @article{gascuel96, Author = {O. Gascuel and D. Levy}, Journal = {J. of Classification}, Title = {A reduction for approximating a (non-metric) dissimilarity by a tree distance}, Year = 1996} @article{gascuelNJ, Author = {O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {685-695}, Title = {{B}IO{NJ}: an Improved Version of the {NJ} Algorithm Based on a Simple Model of Sequence Data}, Volume = {14}, Year = 1997} @article{gascuel00, Author = {O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {401-405}, Title = {On the optimization principle in phylogenetic analysis and the minimum-evolution criterion}, Volume = 17, Year = 2000} @article{gascuel01, Author = {O. Gascuel and D. Bryant and F. Denis}, Journal = {Systematic Biology}, Pages = {621-627}, Title = {Strengths and limitations of the minimum evolution principle}, Volume = {50}, Year = 2001} @article{gascuel03, Author = {O. Gascuel and M. Hendy and A. Jean-Marie and R. McLachlan}, Journal = {Systematic Biology}, Pages = {110-118}, Title = {The combinatorics of tandem duplication trees}, Volume = {52}, Year = {2003}} @incollection{gascuel97, Address = {Providence, USA}, Author = {O. Gascuel}, Booktitle = {Mathematical Hierarchies and Biology}, Editor = {B. Mirkin and F.R. McMorris and F.S. Roberts and A. Rzhetsky}, Pages = {149-170}, Publisher = {Am. Math. Society}, Title = {Concerning the {NJ} algorithm and its unweighted version {UNJ}}, Year = 1997} @incollection{gascuel05, Address = {Oxford}, Author = {O. Gascuel and D. Bertrand and O. Elemento}, Booktitle = {Mathematics of evolution and phylogeny}, Editor = {O. Gascuel}, Pages = {205-235}, Publisher = {Clarendon press}, Title = {Reconstructing the duplication history of tandemly repeated sequences}, Year = 2005} @Article{gaut92, Author="Gaut, B. S. and Muse, S. V. and Clark, W. D. and Clegg, M. T. ", Title="{{R}elative rates of nucleotide substitution at the rbc{L} locus of monocotyledonous plants}", Journal="Journal of Molecular Evolution", Year="1992", Volume="35", Pages="292--303", Month="Oct" } @article{gaut95, Author = {B.S. Gaut and P.O. Lewis}, Journal = {Molecular Biology and Evolution}, Pages = {152-162}, Title = {Success of maximum likelihood phylogeny inference in the four-taxon case}, Volume = 12, Year = 1995} @book{gill81, Address = {London}, Author = {P. Gill and W. Murray and M. Wright}, Publisher = {Academic Press}, Title = {Practical optimization}, Year = 1981} @article{geman84, author = {Geman, Stuart and Geman, Donald}, journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence}, keywords = {annealing, mrf, simulated}, month = {November}, number = {6}, pages = {721--741}, posted-at = {2008-05-07 06:09:28}, priority = {2}, publisher = {Routledge}, title = {Stochastic relaxation, Gibbs distributions and the Bayesian restoration of images}, volume = {6}, year = {1984} } @dea{giordano91, Address = {Montpellier}, Author = {Jean-Yves Giordano}, School = {Universit{\'e} Montpellier II}, Title = {{R}epr{\'e}sentation arbor{\'e}e des {P}roximit{\'e}s et {A}rbres {P}hyllog{\'e}n{\'e}tique}, Utilisateur = {Guillaume Andrieu}, Year = 1991} @article{gojobori82, Author = {Takashi Gojobori and Kazushige Ishii and Masatoshi Nei}, Journal = {Journal of Molecular Evolution}, Pages = {414-423}, Title = {Estimation of Average Number of Nucleotide Substitutions when the Rate of Substitution varies with Nucleotide}, Utilisateur = {Guillaume Andrieu}, Volume = 18, Year = 1982} @incollection{gojobori90, Author = {Takashi Gojobori and Etsuko N. Moriyama and M. Kimura}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 33, Editor = {Russsell F. Doolittle}, Pages = {531-550}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Statistical Methods for Estimating Sequence Divergence}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{golding83, Author = {G. B. Golding}, Journal = {Molecular Biology and Evolution}, Pages = {125-142}, Title = {Estimates of {DNA} and protein sequence divergence: an examination of some assumptions}, Volume = 1, Year = 1983} @article{goldman93, Author = {N. Goldman }, Journal = {Journal of Molecular Evolution}, Pages = {182-198}, Title = {Statistical tests of models of {DNA} substitution}, Volume = 36, Year = 1993} @article{goldman94, Author = {N. Goldman and Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {725-736}, Title = {A Codon-based model of nucleotide substitution for protein-coding {DNA} sequences}, Volume = 11, Year = 1994} @article{goldman98a, Author = {N. Goldman}, Journal = {Proceedings of the Royal Society B: Biological Sciences}, Pages = {1779-1786}, Title = {Phylogenetic information and experimental design in molecular systematics }, Volume = 265, Year = 1998} @article{goldman98b, Author = {N. Goldman and J. Thorne and D. Jones}, Journal = {Genetics}, Pages = {445-458}, Title = {Assessing the impact of secondary structure and solvent accessibility on protein evolution}, Volume = 149, Year = 1998} @article{goldman00, Author = {N. Goldman and S. Whelan}, Journal = {Molecular Biology and Evolution}, Pages = {975-978}, Title = {Statistical tests of {G}amma-distributed rate heterogeneity in models of sequence evolution in phylogenetics}, Volume = 17, Year = 2000} @article{goodman65, Author = {Leo A. Goodman}, Journal = {Technometrics}, Month = {MAY}, Number = 2, Pages = {247-253}, Title = {On Simultaneous Confidence Intervals for Multinomial Proportions }, Volume = 7, Year = 1965} @article{gouy84, Author = {M. Gouy and F. Milleret and C. Mugnier and M. Jacobzone and C. Gautier}, Journal = {Nucleic Acids Research}, Number = 2, Pages = {121-127}, Title = {{ACNUC}: a nucleic acid sequence data base and analysis system}, Volume = 12, Year = 1984} @article{graur91, Author = {D. Graur and W.A. Hide and W.-H. Li}, Journal = {Nature}, Pages = {649-652}, Title = {Is the guinea-pig a rodent?}, Volume = 351, Year = 1991} @article{gu95, Author = {X. Gu and Y.X. Fu and W.H. Li}, Journal = {Molecular Biology and Evolution}, Pages = {546-557}, Title = {Maximum likelihood estimation of the heterogeneity of substitution rate among nucleotide sites}, Volume = 12, Year = 1995} @article{gu97, Author = {X. Gu and J.D. Zhang}, Journal = {Molecular Biology and Evolution}, Pages = {1106-13}, Title = {A simple method for estimating the parameter of substitution rate variation among sites}, Volume = 14, Year = 1997} @article{gu98, Author = {X. Gu and W.H. Li}, Journal = {PNAS}, Pages = {5899-5905}, Title = {Estimation of evolutionary distances under stationary and nonstationary models of nucleotide substitution}, Volume = 95, Year = 1998} @inproceedings{guenoche00, Author = {Alain Gu{\'e}noche}, Booktitle = {Recueil des Actes JOBIM 2000}, Editor = {O. Gascuel and M.-F Sagot}, Pages = {181-191}, Title = {Quelle confiance accorder {\`a} une repr{\'e}sentation arbor{\'e}e ?}, Year = 2000} @article{guenoche87, Author = {Alain Guenoche}, Journal = {Math. Sci. hum.}, Pages = {21-40}, Title = {Cinq algorithmes d'approximation d'une dissimilarit{\'e} par des arbres {\`a} distances additives}, Utilisateur = {Gilles Caraux and Denise Levy}, Volume = 98, Year = 1987} @inproceedings{guenoche00b, Author = {A. Gu{\'e}noche and H. Garreta}, Booktitle = {Computational biology, LNCS 2066}, Pages = {45-46}, Title = {Can we have confidence in a tree representation ?}, Year = 2000} @book{gilks95, author = {W. R. Gilks and S. Richardson and D. Spiegelhalter}, publisher = {{Chapman \& Hall/CRC}}, title = {Markov Chain Monte Carlo in Practice}, year = {1995} } @article{gray09, author="R. Gray and A. Drummond and Greenhill S.", title="Language phylogenies reveal expansion pulses and pauses in {P}acific settlement", journal="Science", year="2009", pages={479-483} } @article{guindon01, Author = {S. Guindon and G. Perri{\`e}re}, Journal = {Molecular Biology and Evolution}, Pages = {1838-40}, Title = {Intragenomic base content variation is a potential source of biases when searching for horizontally transferred genes}, Volume = 18, Year = 2001} @article{guindon02, Author = {S. Guindon and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {534-543}, Title = {Efficient biased estimation of evolutionary distances when substitution rates vary across sites}, Volume = 19, Year = 2002} @article{guindon03, Author = {S. Guindon and O. Gascuel}, Journal = {Systematic Biology}, Pages = {696-704}, Title = {A simple, fast and accurate algorithm to estimate large phylogenies by maximum likelihood}, Volume = 52, Year = 2003} @article{guindon04, Author = {S. Guindon and A. Rodrigo and K. Dyer and J. Huelsenbeck}, Journal = {PNAS}, Pages = {12957-12962}, Title = {Modeling the site-specific variation of selection patterns along lineages}, Volume = {101}, Year = 2004} @article{guindon05, Author = {S. Guindon and F. Lethiec and P. Duroux and O. Gascuel}, Journal = {Nucleic Acids Research}, Pages = {557-559}, Title = {{PHYML} {O}nline -- a web server for fast maximum likelihood-based phylogenetic inference}, Volume = {33(Web Server issue)}, Year = 2005} @article{guindon06, Author = {S. Guindon and M. Black and A. Rodrigo}, Journal = {Molecular Biology and Evolution}, Pages = {919-926}, Title = {Control of the False Discovery Rate Applied to the Detection of Positively Selected Amino Acid Sites.}, Volume = {23}, Year = 2006} @article{gusfield91, Author = {D. Gusfield}, Journal = {Networks}, Pages = {19-28}, Title = {Efficient Algorithms for inferring evolutionnary trees}, Volume = 21, Year = 1991} @article{hamming, Author = {R. W. Hamming}, Journal = {The Bell System Technical Journal}, Number = 2, Pages = {147-160}, Title = {Error Detecting and Error Correcting Codes}, Utilisateur = {Gilles Caraux and Guillaume Andrieu }, Volume = 26, Year = 1950} @article{harshman94, Author = {J. Harshman}, Journal = {Systematic Biology}, Number = 3, Pages = {419-424}, Title = {The effect of irrelevant characters on bootstrap values}, Utilisateur = {Vincent}, Volume = 43, Year = 1994} @article{hartigan72, Author = {J. Hartigan}, Journal = {Biometrics}, Pages = {53-65}, Title = {Minimum mutation fits to a given tree}, Volume = 29, Year = 1972} @article{hasegawa85, Author = {M. Hasegawa and H. Kishino and T. Yano}, Journal = {Journal of Molecular Evolution}, Pages = {160-174}, Title = {Dating of the {H}uman-{A}pe Splitting by a Molecular Clock of Mitochondrial-{DNA}}, Utilisateur = {Guillaume Andrieu}, Volume = 22, Year = 1985} @article{hasegawa87, Author = {M. Hasegawa and H. Kishino and T. Yano}, Journal = {Journal of Molecular Evolution}, Pages = {132-147}, Title = {Man's Place in Hominoidea as Inferred from Molecular Clocks of {DNA}}, Utilisateur = {Guillaume Andrieu}, Volume = 26, Year = 1987} @article{hasegawa89, Author = {H. Kishino and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {170-179}, Title = {Evaluation of the maximum likelihood estimate of the evolutionnary tree topology from {DNA} sequence data, and the branching order in Homonoidea}, Volume = 29, Year = 1989} @article{hasegawa94, Author = {M. Hasegawa and H. Kishino}, Journal = {Molecular Biology and Evolution}, Pages = {142-145}, Title = {Accuracies of the Simple Methods for Estimating the Bootstrap Probability of a Maximum-Likelihood Tree}, Volume = 11, Year = 1994} @article{hein89, Author = {J. Hein}, Journal = {Molecular Biology and Evolution}, Pages = {669-684}, Title = {A tree reconstruction method that is economical in the number of pairwise comparisons used.}, Utilisateur = {Vincent}, Volume = 6, Year = 1989} @incollection{hein90, Author = {J. Hein}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 39, Editor = {Russsell F. Doolittle}, Pages = {626-644}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Unified Approach to Alignement and Phylogenies}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{hein93, Author = {Jotun Hein }, Journal = {Journal of Molecular Evolution}, Pages = {396-405}, Title = {a heuristic method to reconstruct the history of sequences subject to recombinaison}, Utilisateur = {G. Andrieu}, Volume = 36, Year = 1993} @incollection{hendy82, Author = {M.D. Hendy and D. Penny}, Booktitle = {Mathematical Biosciences}, Pages = {277-290}, Publisher = {Elsevier Science Publishing}, Title = {Branch and bound Algorithms to Determine Minimal Evolutionary Trees}, Utilisateur = {Vincent}, Volume = 59, Year = 1982} @article{hendy89, Author = {M.D. Hendy and D. Penny}, Journal = {Syst Zool}, Number = 4, Pages = {297-309}, Title = {A framework for the quantitative study of evolutionary trees}, Utilisateur = {Vincent}, Volume = 38, Year = 1989} @article{hendy93, Author = {M.D. Hendy and D. Penny}, Journal = {Journal of Classification}, Pages = {297-309}, Title = {Spectral analysis of phylogenetic data}, Volume = 10, Year = 1993} @article{hendy94, Author = {M. Hendy and D. Penny and M. A. Steel}, Journal = {PNAS}, Pages = {3339-3343}, Title = {A discrete {F}ourier analysis for evolutionary trees}, Volume = 91, Year = 1994} @article{hg01, Author = {{International Human Genome Sequencing Consortium}}, Journal = {Nature}, Pages = {860-921}, Title = {Initial sequencing and analysis of the human genome}, Volume = 409, Year = 2001} @incollection{higgins96, Address = {San Diego}, Author = {D. G. Higgins and J. D. Thompson and J. T. Gibbson}, Booktitle = {Methods in enzymology}, Editor = {R. F. Doolittle}, Pages = {383-401}, Publisher = {Academic Press}, Title = {Using {CLUSTAL} for multiple sequence alignments}, Year = 1996} @inbook{hiv_epitope, Address = {Los Alamos, New Mexico}, Author = {B. Korber and C. Brander and B. Haynes and R. Koup and C. Kuiken and J. Moore and B. Walker and D. Watkins}, Publisher = {Los Alamos National Laboratory, Theoretical Biology and Biophysics}, Title = {{HIV} molecular immunology database 2002}, Year = 2002} @inbook{karlin, Address = {New York}, Author = {Samuel Karlin}, Chapter = { No VII Examples of continuous Time {M}arkov Chains }, Pages = {189-209}, Publisher = {Academic Press}, Title = {A first course in Stochastic processes}, Utilisateur = {Guillaume Andrieu}, Year = 19} @article{koshi96, Author = {J. Koshi and R. Goldstein}, Journal = {Journal of Molecular Evolution}, Pages = {313-320}, Title = {Probabilistic reconstruction of ancestral protein sequences}, Volume = 42, Year = 1996} @article{koshi98, Author = {J. Koshi and R. Goldstein}, Journal = {Proteins}, Pages = {289-295}, Title = {Models of natural mutations including site heterogeneity}, Volume = 32, Year = 1998} @article{kirkpatrick83, Author = {S. Kirkpatrick and C. D. Gelatt and M. P. Vecchi}, Journal = {Science}, Pages = {671-680}, Title = {Optimization by simulated annealing}, Volume = 220, Year = 1983} @inbook{hillis91, Author = {D.M. Hillis}, Chapter = 13, Note = {Preliminsaire a l'article hilhuels92}, Pages = {278-294}, Title = {Discriminating Between Phylogenetic Signal and Random Noise in {DNA} Sequences}, Utilisateur = {Vincent}} @article{hillishuels92, Author = {D.M. Hillis and J.P. Huelsenbeck}, Journal = {Journal of Heredity}, Note = {Examine la distribution des arbres les plus parcimonieux : gaussienne applatie}, Pages = {189-195}, Title = {Signal, Noise, and Reliability in Molecular Phylogenetic Analyses}, Volume = 83, Year = 1992} @article{ho05, Author = {S. Ho and M. Phillips and A. Drummond and A. Cooper}, Journal = {Molecular Biology and Evolution}, Pages = {1355-1363}, Title = {Accuracy of rate estimation using relaxed-clock models with a critical focus on the early {M}etazoan radiation}, Volume = 22, Year = 2005} @article{holm79, Author = {S. Holm}, Journal = {Scandinavian Journal of Statistics}, Pages = {65-70}, Title = {A simple sequentially rejective multiple test procedure}, Volume = 6, Year = 1979} @article{holmquist72a, Author = {Richard Holmquist}, Journal = {Journal of Molecular Evolution}, Pages = {115-133}, Title = {Theoretical foundations for a quantitative approach to paleogenetics {Part I : DNA}}, Utilisateur = {Gilles Caraux et Guillaume Andrieu}, Volume = 1, Year = 1972} @article{holmquist72b, Author = {Richard Holmquist}, Journal = {Journal of Molecular Evolution}, Pages = {211-222}, Title = {Empirical support for stochastic model of evolution}, Utilisateur = {Gilles Caraux et Guillaume Andrieu}, Volume = 1, Year = 1972} @article{holmquist83, Author = {R. Holmquist and M. Goodman and T. Conroy and J. Czelusniak}, Journal = {Journal of Molecular Evolution}, Pages = {437-448}, Title = {The spatial distribution of fixed mutations within genes coding for proteins}, Volume = 19, Year = 1983} @article{huelsenbeck93, Author = {J. P. Huelsenbeck and D. Hillis}, Journal = {Systematic Biology}, Pages = {247-264}, Title = {Success of phylogenetic methods in the four-taxon case}, Volume = 42, Year = 1993} @article{huelsenbeck95a, Author = {J. P. Huelsenbeck}, Journal = {Systematic Biology}, Pages = {17-48}, Title = {Performance of phylogenetic methods in simulation}, Volume = 44, Year = 1995} @article{huelsenbeck95b, Author = {J. P. Huelsenbeck}, Journal = {Molecular Biology and Evolution}, Pages = {843-849}, Title = {The robustness of two phylogenetic methods: four-taxon simulations reveal a slight superiority of maximum likelihood over neighbor joining}, Volume = 12, Year = 1995} @article{huelsenbeck97a, Author = {J. P. Huelsenbeck and K. A. Crandall}, Journal = {Annual Review of Ecology and Systematics}, Pages = {437-466}, Title = {Phylogeny estimation and hypothesis testing using maximum likelihood}, Volume = 28, Year = 1997} @article{huelsenbeck97b, Author = {J. Huelsenbeck and B. Rannala}, Journal = {Science}, Pages = {218-219}, Title = {Phylogenetic methods come of age: testing hypotheses in an evolutionary context}, Volume = 276, Year = 1997} @article{huelsenbeck99, Author = {J. Huelsenbeck and R. Nielsen}, Journal = {Journal of Molecular Evolution}, Pages = {86-93}, Title = {Variation in the pattern of nucleotide substitution across sites}, Volume = 48, Year = 1999} @article{huelsenbeck01, Author = {J. Huelsenbeck and F. Ronquist}, Journal = {Bioinformatics}, Pages = {754-755}, Title = {{MRBAYES} : Bayesian inference of phylogenetic trees}, Volume = 17, Year = 2001} @article{huelsenbeck01a, Author = {J. P. Huelsenbeck and F. Ronquist and R. Nielsen and J. P. Bollack}, Journal = {Science}, Pages = {2310-2314}, Title = {Bayesian Inference of Phylogeny and Its Impact on Evolutionary Biology}, Volume = 294, Year = 2001} @article{huelsenbeck01c, Author = {J. P. Huelsenbeck and J. P. Bollback}, Journal = {Systematic Biology}, Pages = {351-366}, Title = {Empirical and hierarchical bayesian estimation of ancestral states}, Volume = 50, Year = 2001} @article{huelsenbeck02, Author = {J. P. Huelsenbeck}, Journal = {Molecular Biology and Evolution}, Pages = {698-707}, Title = {Testing a Covariotide Model of {DNA} Substitution}, Volume = 19, Year = 2002} @article{huelsenbeck04, Author = {J. Huelsenbeck and B. Larget and M. Alfaro}, Journal = {Molecular Biology and Evolution}, Pages = {1123-1133}, Title = {Bayesian phylogenetic model selection using reversible jump markov chain monte carlo.}, Volume = 21, Year = 2004} @article{huelsenbeck04b, Author = {J. Huelsenbeck and K. Dyer}, Journal = {Journal of Molecular Evolution}, Pages = {661-672}, Title = {Bayesian estimation of positively selected sites}, Volume = 58, Year = 2004} @article{huelsenbeck06, Author = {J. Huelsenbeck and S. Jain and S. Frost and S. Pond}, Journal = {PNAS}, Pages = {6263-6268}, Title = {A Dirichlet process model for detecting positive selection in protein-coding {DNA} sequences}, Volume = 103, Year = 2006} @article{hughes88, Author = {A. Hughes and M. Nei}, Journal = {Nature}, Pages = {167-170}, Title = {Pattern of nucleotide substitution at major histocompatibility complex class {I} loci reveals overdominant selection}, Volume = 335, Year = 1988} @article{hughes90, Author = {A. Hughes and T. Ota and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {515-524}, Title = {Positive darwinian selection promotes charge profile diversity in the antigen-binding cleft of class {I} major-histocompatibility-complex molecules}, Volume = 7, Year = 1990} @article{mrbayes, Author = {J. P. Huelsenbeck and F. Ronquist}, Journal = {Bioinformatics}, Pages = {754-755}, Title = {{M}r{B}ayes: {B}ayesian inference of phylogeny}, Volume = 17, Year = 2001} @article{irwin91, Author = {David M. Irwin and Thomas D. Kocher and Allan C. Wilson}, Journal = {Journal of Molecular Evolution}, Pages = {128-144}, Title = {{E}volution of the {C}ytochrome {\em b} {G}ene of {M}amals}, Utilisateur = {F.Catzeflis et G. Andrieu}, Volume = 32, Year = 1991} @techreport{jiang92, Author = {T. Jiang and Ming Li}, Institution = {Mc Master Univ. and University of Waterloo}, Title = {Some optimizations problems related to molecular biology}, Year = 1992} @article{jiang94, Author = {Tao Jiang, Eugene L. Lawler, Lusheng Wang}, Title = {Aligning Sequences via an Evolutionary Tree: Complexity and Approximation}, Year = 1994} @article{jin90, Author = {L. Jin and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {82-102}, Title = {Limitations of the evolutionary parsimony method of phylogenetic analysis}, Volume = 7, Year = 1990} @article{jin94, Author = {Li Jin and Ranajit Chakraborty}, Journal = {Molecular Biology and Evolution}, Pages = {120-127}, Title = {Estimation of genetic distance and coefficient of gene diversity from single-probe multilocus {DNA} fingerprinting data}, Utilisateur = {Gilles Caraux}, Volume = 11, Year = 1994} @incollection{johnson90, Address = {New York}, Author = {Mark S. Johnson and Andrej Sali and Tom L. Blundell}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 42, Editor = {Russsell F. Doolittle}, Pages = {670-690}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Phylogenetic Relationships from Three-Dimensional Protein Structures}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{jones92, Author = {D. Jones and W. Taylor and J. Thornton}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {275-282}, Title = {The rapid generation of mutation data matrices from protein sequences}, Volume = 8, Year = 1992} @incollection{jukes69, Address = {New York}, Author = {T. Jukes and C. Cantor}, Booktitle = {Mammalian Protein Metabolism}, Chapter = {24}, Editor = {H. Munro}, Pages = {21-132}, Publisher = {Academic Press}, Title = {Evolution of protein molecules}, Utilisateur = {Gilles Caraux}, Volume = {III}, Year = 1969} @Manual{R, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2013}, url = {http://www.R-project.org/}, } @article{kaj03, title={The coalescent process in a population with stochastically varying size}, author={Kaj, Ingemar and Krone, Stephen M}, journal={Journal of Applied Probability}, Volume = 40, pages={33--48}, year={2003}, publisher={JSTOR} } @article{kannan95, Author = {S. Kannan and T. Warnow}, Journal = {SIAM J. Comp.}, Number = 3, Pages = {511-519}, Title = {Tree reconstruction from partial orders}, Volume = 24, Year = 1995} @article{kannan97, Author = {S. Kannan}, Journal = {Journal of the indian institute of science}, Number = 4, Pages = {353-364}, Title = {consensus of trees : desirable properties and computationnal methods}, Volume = 77, Year = 1997} @article{kaplan79, Author = {N. Kaplan and C.H. Langley}, Journal = {Journal of Molecular Evolution}, Pages = {295-304}, Title = {A new estimate of sequence divergence of mitochondrial {\sc DNA} Using restriction endonuclease mappings}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 13, Year = 1979} @inbook{karlin, Address = {New York}, Author = {Samuel Karlin}, Chapter = { No VII Examples of continuous Time {M}arkov Chains }, Pages = {189-209}, Publisher = {Academic Press}, Title = {A first course in Stochastic processes}, Utilisateur = {Guillaume Andrieu}, Year = 19} @article{karlin93, Author = {Samuel Karlin and Stephen F. Altschul}, Journal = {PNAS}, Pages = {5873-5877}, Title = {Applications and Statistics for multiple hight-scoring segments in molecular Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 90, Year = 1993} @article{kashyap74, Author = {R. L. Kashyap and S. Subas}, Journal = {Journal of Theoretical Biology}, Pages = {75-101}, Title = {Statistical estimation of parameters in a phylogenetic tree using a dynamic model of the substitutional process}, Utilisateur = {Gilles Caraux}, Volume = 47, Year = 1974} @article{kaslow87, Author = {R. Kaslow and D. Ostrow and R. Detel and J. Phair and B. Polk and C. Rinaldo}, Journal = {American Journal of Epidemiology}, Pages = {310-318}, Title = {The {M}ulticenter {AIDS} {C}ohort {S}tudy : rationale, organization, and selected characteristics of the participants}, Volume = 126, Year = 1987} @book{kendall73, Address = {London}, Author = {M. G. Kendall and A. Stuart}, Publisher = {Griffin}, Title = {The Advanced Theory of Statistics}, Volume = {II~: Inference and relationship}, Year = 1973} @article{kidd71, Author = {K.K. Kidd and L.A. Sgaramella-Zonta}, Journal = {The American Journal of Human Genetics}, Pages = {235-252}, Title = {Phylogenetic analysis: concepts and methods}, Volume = 23, Year = 1971} @article{kimura72, Author = {M. Kimura and Tomoko Otha}, Journal = {Journal of Molecular Evolution}, Pages = {87-90}, Title = { On the stochastic model for estimation of mutational distance between homologous proteins}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 2, Year = 1972} @article{kimura80, Author = {M. Kimura}, Journal = {Journal of Molecular Evolution}, Pages = {111-120}, Title = {A simple method for estimating evolutionary rates of base substitutions through comparative studies of nucleotide sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 16, Year = 1980} @article{kimura81, Author = {M. Kimura}, Journal = {PNAS}, Pages = {454-458}, Title = {Estimation of evolutionary distances between homologous nucleotide sequences}, Volume = 78, Year = 1981} @article{kimura87, Author = {M. Kimura}, Journal = {Journal of Molecular Evolution}, Pages = {24-33}, Title = {Molecular Evolutionnary Clock and the Neutral Theory}, Utilisateur = {Guillaume Andrieu}, Volume = 26, Year = 1987} @article{kingman82, Author = {Kingman, J. F. C. }, Citeulike-Article-Id = {3431666}, Journal = {Stochastic Processes and their Applications}, Keywords = {coalescent, ebsp-paper}, Pages = {235--248}, Posted-At = {2008-10-20 21:06:45}, Priority = {0}, Title = {The coalescent}, Volume = {13}, Year = {1982}} @article{kishino89, Author = {H. Kishino and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {170-179}, Title = {Evaluation of the Maximum Likelihood Estimate of the Evolutionnary Tree Topology from {DNA} Sequence Data, and the Branching Order in Hominoidea}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 29, Year = 1989} @incollection{kishino90, Address = {New York}, Author = {H. Kishino and M. Hasegawa }, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 34, Editor = {Russsell F. Doolittle}, Pages = {550-570}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Converting Distance to Time : Application to Human Evolution}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{kishino90b, Author = {H. Kishino and T. Miyata and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {151-160}, Title = {Maximum likelihood inference of protein phylogeny and the origin of chloroplasts}, Volume = 31, Year = 1990} @Article{kishino01, Author="Kishino, H. and Thorne, J. and Bruno, W.", Title="{{P}erformance of a divergence time estimation method under a probabilistic model of rate evolution}", Journal="Molecular Biology and Evolution", Year="2001", Volume="18", Pages="352--361", Month="Mar" } @Article{kitazoe07, Author="Kitazoe, Y. and Kishino, H. and Waddell, P. J. and Nakajima, N. and Okabayashi, T. and Watabe, T. and Okuhara, Y. ", Title="{{R}obust time estimation reconciles views of the antiquity of placental mammals}", Journal="PLoS ONE", Year="2007", Volume="2", Pages="e384" } @article{klotz79, Author = {Lynn C. Klotz and Ned Komar and Roger L. Blanken and Ralph M. Mitchell}, Journal = {PNAS}, Pages = {4516-4520}, Title = {Calculation of evolutionary trees from sequence data}, Utilisateur = {Gilles Caraux}, Volume = 76, Year = 1979} @article{klotz81, Author = {Lynn C. Klotz and Roger L. Blanken}, Journal = {Journal of Theoretical Biology}, Pages = {261-272}, Title = {A practical method for calculating evolutionary trees from sequence data}, Utilisateur = {Gilles Caraux}, Volume = 91, Year = 1981} @article{kolaczkowski04, Author = {B. Kolaczkowski and J. Thornton}, Journal = {Nature}, Pages = {980-984}, Title = {Performance of maximum parsimony and likelihood phylogenetics when evolution is heterogeneous}, Volume = 431, Year = 2004} @article{kondo93, Author = {Rumi Kondo and Satoshi Horai and Yoko Satta and Naoyuki Takahata}, Journal = {Journal of Molecular Evolution}, Pages = {517-531}, Title = {Evolution of Hominoid Mitochondrial {DNA} with special Reference to the \\ Silent Substitution Rate over the Genome }, Utilisateur = {Guillaume Andrieu}, Volume = 36, Year = 1993} @article{kondrashov02, Author = {A.S. Kondrashov and S. Sunyaev and F.A. Kondrashov}, Journal = {PNAS}, Pages = {14878-14883}, Title = {Dobzhansky-{M}uller incompatibilities in protein evolution}, Volume = 99, Year = 2002} @article{kosiol04, Author = {C. Kosiol and N. Goldman}, Journal = {Molecular Biology and Evolution}, Pages = {193-199}, Title = {Different versions of the {D}ayhoff rate matrix}, Volume = {22}, Year = 2004} @incollection{kruskal71, Author = {J. B. Kruskal and Isidor Dyen and Paul Black}, Booktitle = {Mathematics in the archeological and histor. sciences}, Editor = {F. R. Hodson and D. G. Kendall and P. Tautu}, Pages = {361-380}, Publisher = {Edinburgh University Press}, Title = {The vocabulary method of reconstructing language trees: innovations and large-scale applications}, Utilisateur = {Gilles Caraux}, Year = 1971} @article{kufels94, Author = {M. Kuhner and J. Felsenstein}, Journal = {Molecular Biology and Evolution}, Pages = {459-468}, Title = {A simulation comparison of phylogeny algorithms under equal and unequal evolutionary rates}, Utilisateur = {Vincent}, Volume = 11, Year = 1994} @article{lanave84, Author = {C. Lanave and G. Preparata and C. Saccone and G. Serio}, Journal = {Journal of Molecular Evolution}, Pages = {86-93}, Title = {A new method for calculating evolutionary substitution rates}, Volume = 20, Year = 1984} @article{lake87, Author = {James A. Lake}, Journal = {Molecular Biology and Evolution}, Pages = {167-191}, Title = {A rate-independent technique for analysis of nucleic acid sequences : Evolutionary parsimony}, Utilisateur = {Gilles Caraux}, Volume = 4, Year = 1987} @article{langley74, Author = {C. H. Langley and Walter M. Fitch}, Journal = {Journal of Molecular Evolution}, Pages = {161-177}, Title = {An examination of the constancy of the rate of molecular evolution}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 3, Year = 1974} @article{lanyon85, Author = {S. M. Lanyon}, Journal = {Systematic Zoology}, Number = 4, Pages = {397-403}, Title = {Detecting internal inconsistencies in distance data}, Utilisateur = {Vincent}, Volume = 34, Year = 1985} @article{larget99, Author = {B. Larget and D. L. Simon}, Journal = {Molecular Biology and Evolution}, Pages = {750-759}, Title = {Markov Chain {M}onte {C}arlo algorithms for the bayesian analysis of phylogenetic trees}, Volume = 16, Year = 1999} @article{lartillot04, Author = {N. Lartillot and H. Philippe}, Journal = {Molecular Biology and Evolution}, Pages = {1095-1109}, Title = {A Bayesian mixture model for across-site heterogeneities in the amino-acid replacement process}, Volume = 21, Year = 2004} @incollection{lausen86, Author = {Berthold Lausen and Paul O. Degens}, Booktitle = {Die klassifikation und ihr umfeld}, Editor = {Paul O. Degens and H. J. Hermes and O. Opitz}, Pages = {306-314}, Publisher = {Indeks Verlag}, Series = {Studien zur Klassification}, Title = {Variance estimation and the reconstruction of phylogenies}, Utilisateur = {Gilles Caraux}, Volume = 17, Year = 1986} @incollection{lausen88, Author = {Berthold Lausen and Paul O. Degens}, Booktitle = {Classification and related methods of data analysis}, Editor = {H. H. Bock}, Pages = {367-374}, Publisher = {Elsevier}, Title = {Evaluation of the reconstruction of phylogenies with {DNA-DNA}-Hybridization data}, Utilisateur = {Gilles Caraux}, Year = 1988} @incollection{lausen89, Author = {Berthold Lausen}, Booktitle = {Conceptual and numerical analysis of data}, Editor = {O. Opitz}, Pages = {481-488}, Publisher = {Springer Verlag}, Title = {Exploring homologous t{\sc rna} sequence data: positional mutation rates and genetic}, Utilisateur = {Gilles Caraux}, Year = 1989} @article{lawrence97, Author = {J. Lawrence and H. Ochman}, Journal = {Journal of Molecular Evolution}, Pages = {383-397}, Title = {Amelioration of bacterial genomes: rates of change and exchange}, Volume = 44, Year = 1997} @article{lawrence98, Author = {J. Lawrence and H. Ochman}, Journal = {PNAS}, Pages = {9413-9417}, Title = {Molecular archaeology of the {\it \hbox{E}scherichia coli} genome}, Volume = 95, Year = 1998} @article{le08, Author = {SQ. Le and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Title = {An Improved General Amino-Acid Replacement Matrix}, Volume = {25}, Pages = {1307-1320}, Year = 2008} @article{le_calve85, Author = {Georges {Le Calve}}, Journal = {Statistiques et Analyse de Donn{\'e}es}, Number = 2, Pages = {29-44}, Title = {Distance {\`a} centre}, Utilisateur = {Gilles Caraux}, Volume = 10, Year = 1985} @article{leclerc85a, Author = {Bruno Leclerc}, Journal = {Math. Sci. hum.}, Pages = {5-40}, Title = {La comparaison des hierarchies : Indices et metriques}, Utilisateur = {Gilles Caraux}, Volume = 92, Year = 1985} @article{leclerc85b, Author = {Bruno Leclerc}, Journal = {Math. Sci. hum.}, Pages = {5-34}, Title = {La hi{\'e}rarchies de parties et leur demi-treillis}, Utilisateur = {Gilles Caraux}, Volume = 89, Year = 1985} @article{leclerc94, Author = {Bruno Leclerc}, Journal = {To appear in Journal of Classification}, Title = {Minimum spanning trees for tree metrics : abridgements and adjustements}, Utilisateur = {Vincent}, Year = 1994} @article{lecointre93, Author = {G. Lecointre and H. Philippe and H.L.V. L{\^e} and H. Le Guyader}, Journal = {Mol. Phylogenet. Evol.}, Pages = {205-224}, Title = {Species sampling has a major impact on phylogenetic inference}, Volume = 2, Year = 1993} @article{lemmon02, Author = {A. Lemmon and M. Milinkovitch}, Journal = {PNAS}, Pages = {10516-10521}, Title = {The metapopulation genetic algorithm: an efficient solution for the problem of large phylogeny estimation}, Volume = 99, Year = 2002} @article{metapiga, Author = {A.R. Lemmon and Milinkovitch M.C.}, Journal = {PNAS}, Pages = {10516-10521}, Title = {The metapopulation genetic algorithm: An efficient solution for the problem of large phylogeny estimation}, Volume = 99, Year = 2002} @article{lee95, Author = {Y. Lee and T. Ota and V. Vaquier}, Journal = {Molecular Biology and Evolution}, Pages = {231-238}, Title = {Positive selection is a general phenomenon in the evolution of abalone sperm lysin}, Volume = 12, Year = 1995} @Article{lepage06, Author="Lepage, T. and Lawi, S. and Tupper, P. and Bryant, D. ", Title="{{C}ontinuous and tractable models for the variation of evolutionary rates}", Journal="Math Biosci", Year="2006", Volume="199", Pages="216--233", Month="Feb" } @article{lepage07, Author = {T. Lepage and D. Bryant and H. Philippe and N. Lartillot}, Journal = {Molecular Biology and Evolution}, Pages = {2669-2680}, Title = {A general comparison of relaxed molecular clock models}, Volume = 24, Year = 2007} @article{lewis98, Author = {P. Lewis}, Journal = {Molecular Biology and Evolution}, Pages = {277-283}, Title = {A genetic algorithm for maximum likelihood phylogeny inference using nucleotide sequence data}, Volume = 15, Year = 1998} @article{lewontin89, Author = {R. C. Lewontin}, Journal = {Molecular Biology and Evolution}, Pages = {15-32}, Title = {Inferring the number of evolutionary events from {DNA} coding sequence differences}, Utilisateur = {Gilles Caraux}, Volume = 6, Year = 1989} @inproceedings{li87, Author = {W.-H. Li and K.-H. Wolfe and J. Sourdis and P.M. Sharp}, Booktitle = {Cold Spring Harbor Symposia on Quantitative Biology}, Editor = {Cold Spring Harbore Laboratory}, Pages = {847-856}, Title = {Reconstruction of phylogenetic trees and estimation of divergence times under nonconstant rates of evolution}, Volume = {LII}, Year = 1987} @article{li89, Author = {Wen-Hsiung Li}, Journal = {Molecular Biology and Evolution}, Pages = {424-435}, Title = {A statistical test of phylogenies estimated from sequence data}, Utilisateur = {Gilles Caraux}, Volume = 6, Year = 1989} @incollection{li90, Address = {New York}, Author = {Wen-Hsiung Li and Manolo Gouy}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 40, Editor = {Russsell F. Doolittle}, Pages = {645-659}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Statistical Tests of Molecular Phylogenies}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @incollection{li91, Author = {Wen-Hsiung Li and Manolo Gouy}, Booktitle = {Phylogenetic analysis of {DNA} sequences}, Chapter = 12, Editor = {Michael M. Miyamoto and Joel Cracraft}, Pages = {249-277}, Publisher = {Oxford university press}, Title = {Statistical methods for testing molecular phylogenies}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Year = 1991} @article{li92, Author = {Wen-Hsiung Li and Bousquet, J}, Journal = {Molecular Biology and Evolution}, Pages = {1185-1189}, Title = {Relative-Rate test for nucleotide substitutions between two lineages}, Utilisateur = {G. Andrieu}, Volume = 9, Year = 1992} @article{li93, Author = {Wen-Hsiung Li}, Journal = {Journal of Molecular Evolution}, Pages = {96-99}, Title = { Unbiased estimation of the rates of synonimous and nonsynonimous substitution}, Utilisateur = {Guillaume Andrieu}, Volume = 36, Year = 1993} @article{li94, Author = {W.-H. Li and A. Zharkikh}, Journal = {Systematic Biology}, Pages = {424-430}, Title = {What is the bootstrap technique?}, Utilisateur = {Vincent}, Volume = 43, Year = 1994} @article{li95, Author = {W.-H. Li and A. Zharkikh}, Journal = {Systematic Biology}, Pages = {49-63}, Title = {Statistical tests of {DNA} phylogenies}, Volume = 44, Year = 1995} @phdthesis{li96, Author = {S. Li}, School = {Ohio State University}, Title = {Phylogenetic tree construction using {M}arkov chain {M}onte {C}arlo}, Year = 1996} @article{lin02, Author = {Y.-H. Lin and P. McLenachan and A. Gore and M. Phillips and R. Ota and M. Hendy and D. Penny}, Journal = {Molecular Biology and Evolution}, Pages = {2060-2070}, Title = {Four new mitochondrial genomes, and the stability of evolutionary trees of mammals}, Volume = 19, Year = 2002} @article{lockhart94, Author = {P. Lockhart and M. Steel and M. Hendy and D Penny}, Journal = {Molecular Biology and Evolution}, Pages = {605-612}, Title = {Recovering Evolutionary Trees under a More Realistic Model of Sequence}, Volume = 11, Year = 1994} @article{lockhart98, Author = {P. Lockhart and M. Steel and A. Barbrook and D. Huson and M. Charleston and C. Howe}, Journal = {Molecular Biology and Evolution}, Pages = {1183-1188}, Title = {A covariotide model explains apparent phylogenetic structure of oxygenic photosynthetic lineages}, Volume = 15, Year = 1998} @article{lockhart00, Author = {P. Lockhart and D. Huson and U. Maier and M. Fraunholz and Y. Van de Peer and A. Barbrook and C. Howe and M. Steel.}, Journal = {Molecular Biology and Evolution}, Pages = {835-838}, Title = {How molecules evolve in eubacteria}, Volume = 17, Year = 2000} @article{lockhart05, Author = {P. Lockhart and M. Steel}, Journal = {Systematic Biology}, Pages = {948-951}, Title = {A tale of two processes}, Volume = 54, Year = 2005} @article{lopez99, Author = {P. Lopez and P. Forterre and H. Philippe}, Journal = {Journal of Molecular Evolution}, Pages = {496-508}, Title = {The root of the tree of life in the light of the covarion model}, Volume = 49, Year = 1999} @article{lopez02, Author = {P. Lopez and D. Casane and H. Philippe}, Journal = {Molecular Biology and Evolution}, Pages = {1-7}, Title = {Heterotachy, an important process of protein evolution}, Volume = 19, Year = 2002} @article{lundy, Author = {M. Lundy}, Journal = {Biometrika}, Number = 1, Pages = {191-198}, Title = {Applications of the annealing algorithm to combinatorial problems in statistics}, Utilisateur = {Gilles Caraux and Fernando Carvalho}, Volume = 72, Year = 1985} @article{lundy, Author = {M. Lundy}, Journal = {Biometrika}, Number = 1, Pages = {191-198}, Title = {Applications of the annealing algorithm to combinatorial problems in statistics}, Utilisateur = {Gilles Caraux and Fernando Carvalho}, Volume = 72, Year = 1985} @article{lynch00, Author = {M. Lynch and J. Conery}, Journal = {Science}, Pages = {1151-1155}, Title = {The evolutionary fate and consequences of duplicated genes}, Volume = 290, Year = 2000} @article{lynch03, Author = {M. Lynch and J. Conery}, Journal = {Journal of Structural and Functional Genomics}, Pages = {35-44}, Title = {The evolutionary demography of duplicate genes}, Volume = 3, Year = 2003} @article{lynch03b, Author = {M. Lynch and J. Conery}, Journal = {Science}, Pages = {1401-1404}, Title = {The origins of genome complexity}, Volume = 302, Year = 2003} @article{lynch04, Author = {M. Lynch and J. Conery}, Journal = {Science}, Pages = {978b}, Title = {Reponse to Comment on \"The origins of genome complexity\"}, Volume = 306, Year = 2004} @article{maddison91, Author = {D. R. Maddison}, Journal = {Syst Zool}, Note = {interessant, grpes d'arbres relies entre eux}, Number = 3, Pages = {315-328}, Title = {The discovery and importance of multiple islands of most parsimonious trees}, Utilisateur = {Vincent}, Volume = 40, Year = 1991} @article{maddison97, Author = {D. Maddison and D. Swofford and W. Maddison}, Journal = {Systematic Biology}, Volume = 46, Number = 4, Pages = {590-621}, Title = {{NEXUS}: an extensible file format for systematic information}, Year = 1997} @article{maidak94, Author = {B.L. Maidak and N. Larsen and M.J. McCaughey and R. Overbeek and G.J. Olsen and K. Fogel and J. Blandy and C.R. Woese}, Journal = { Nucl. Acids. Res}, Pages = {3485-3487}, Title = {The {R}ibosomal {D}atabase {P}roject}, Volume = 22, Year = 1994} @article{maidak96, Author = {B.L. Maidak and G.J. Olsen and N. Larsen and R. Overbeek and M.J. McCaughey and C.R. Woese}, Journal = { Nucl. Acids. Res}, Pages = {82-85}, Title = {The {R}ibosomal {D}atabase {P}roject ({RDP})}, Volume = 24, Year = 1996} @article{maidak97, Author = {B.L. Maidak and G.J. Olsen and N. Larsen and R. Overbeek and M.J. McCaughey and C.R. Woese}, Journal = { Nucl. Acids. Res}, Pages = {109-111}, Title = {The {RDP} ({R}ibosomal {D}atabase {P}roject)}, Volume = 25, Year = 1997} @article{maidak99, Author = {B.L. Maidak and J.R. Cole and C.T. Parker and G.M. Garrity and N. Larsen and B. Li and T.G. Lilburn and M.J. McCaughey and G.J. Olsen and R. Overbeek and S. Pramanik and T.M. Schmidt and J.M. Tiedje and CR Woese}, Journal = { Nucl. Acids. Res}, Pages = {171-173}, Title = {A new version of the {RDP} ({R}ibosomal {D}atabase {P}roject)}, Volume = 27, Year = 1999} @article{maidak00, Author = {B. L. Maidak and J. R. Cole and T. G. Lilburn and C. T. Parker and P. R. Saxman and J. M. Stredwick and G. M. Garrity and B. Li and G. J. Olsen and S. Pramanik and T. M. Schmidt and J. M. Tiedje}, Journal = {Nucl. Acids. Res}, Pages = {173-174}, Title = {The {RDP} ({R}ibosomal {D}atabase {P}roject) continues}, Volume = 28, Year = 2000} @article{maidak01, Author = {B. L. Maidak and J. R. Cole and T. G. Lilburn and C. T. Parker and P. R. Saxman and R. J. Farris and G. M. Garrity and G. J. Olsen and T. M. Schmidt and J. M. Tiedje}, Journal = {Nucl. Acids. Res}, Pages = {173-174}, Title = {The {RDP}-II ({R}ibosomal {D}atabase {P}roject)}, Volume = 29, Year = 2001} @article{manske87, Author = { Charles L. Manske and David J. Chapman}, Journal = {Journal of Molecular Evolution}, Pages = {226-251}, Title = {Nonuniformity of Nucleotide Substitution Rates in Molecular Evolution: Computer Simulation and Analysis of 5S Ribosomal Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 26, Year = 1987} @article{margush81, Author = {T. Margush and F.R. McMorris}, Journal = {Bulletin of Math. Biol.}, Number = 2, Pages = {239-244}, Title = {Consensus n-trees}, Volume = 43, Year = 1981} @article{massingham05, title={Detecting amino acid sites under positive selection and purifying selection}, author={Massingham, Tim and Goldman, Nick}, journal={Genetics}, volume={169}, number={3}, pages={1753--1762}, year={2005}, publisher={Genetics Soc America} } @phdthesis{mau96, Author = {B. Mau}, School = {Wiscontin University}, Title = {Bayesian phylogenetic inference via Markov Chain {M}onte {C}arlo methods}, Year = 1996} @article{meacham81, Author = {C. Meacham}, Journal = {Taxon}, Pages = {591-600}, Title = {A manual method for character compatibility}, Volume = 30, Year = 1981} @article{metropolis53, Author = {N. Metropolis and A.W. Rosenbluth and M.N. Rosenbluth and A.H. Teller and E. Teller}, Journal = {J. of Chem. Phys.}, Pages = {1087-1092}, Title = {Equation of State Calculations by Fast Computing Machines}, Volume = 21, Year = 1953} @article{messier97, Author = {W. Messier and C.-B. Stewart}, Journal = {Nature}, Pages = {151-154}, Title = {Episodic adaptative evolution of primate lysozymes}, Volume = 385, Year = 1997} @article{misof02, Author = {B. Misof and C. Anderson and T. Buckley and D. Erpenbeck and A. Rickert and K. Misof}, Journal = {Journal of Molecular Evolution}, Pages = {330-340}, Title = {An empirical analysis of mt 16S r{RNA} covarion-like evolution in insects: site-specific rate variation is clustered and frequently detected}, Volume = 56, Year = 2002} @article{mitchison95, Author = {G. Mitchison and R. Durbin}, Journal = {Journal of Molecular Evolution}, Pages = {1139-1151}, Title = {Tree-based maximum likelihood substitution matrices and hidden Markov model}, Volume = 41, Year = 1995} @book{miyamoto91, Address = {New York - Oxford}, Editor = {Michael M. Miyamoto and Joel Cracraft}, Publisher = {Oxford University Press}, Title = {{P}hylogenic {A}nalysis of {DNA} {S}equences}, Utilisateur = {Guillaume Andrieu}, Year = 1991} @article{miyata81, Author = { Takashi Miyata and Teruo Yasunaga}, Journal = {Genetics}, Pages = {641-657}, Title = {Molecular Evolution of m{RNA} : A Method for estimating Evolutionary Rates of Synonymous and Amino Acid Substitutions from Homologous Nucleotide Sequences and its Application }, Utilisateur = {Guillaume Andrieu}, Volume = 98, Year = 1981} @book{mood, Address = {Paris}, Author = {Alexander Mood et Franklin A. Graybill}, Publisher = {Dunod}, Title = {Introduction a la {S}tatistique {T}heorique}, Year = 1973} @article{moore73, Author = {G. W. Moore, J. Barnabas, M. Goodman}, Journal = {Journal of Theoretical Biology}, Pages = {459-485}, Title = {A Method For Constructing Maximum Parsimony Ancestral Amino Acid Sequences on a Given Network}, Volume = 38, Year = 1973} @techreport{moulton96, Author = {V. Moulton and M.A. Steel}, Institution = {Univ. of Canterbury}, Number = 148, Title = {Retractions of finite distance functions onto tree metrics}, Year = 1996} @article{muller00, Author = {T. Muller and M. Vingron}, Journal = {Journal of Computational Biology}, Pages = {761-776}, Title = {Modeling amino acid replacement.}, Volume = 7, Year = 2000} @article{mullis87, Author = {K.B. Mullis and F.A. Faloona}, Journal = {Methods. in Enzym.}, Pages = {335-350}, Title = {Specific synthesis of {DNA} in vitro via polymerase catalyzed chained reaction}, Volume = 155, Year = 1987} @article{murphy01, Author = {W. J. Murphy and E. Eizirik and W. E. Johnson and Zhang Y.P. and O.A. Ryder and S.J. O'Brien}, Journal = {Nature}, Pages = {614-618}, Title = {Molecular phylogenetics and the origins of placental mammals}, Volume = 409, Year = 2001} @article{murphy01b, Author = {M. Murphy and E. Eizirik and S. O'Brien and O. Madsen and M. Scally and C. Douady and E. Teeling and O. Ryder and M. Stanhope and W. de Jong and M. Springer}, Journal = {Science}, Pages = {2348-2351}, Title = {Resolution of the early placental mammal radiation using Bayesian phylogenetics}, Volume = 294, Year = 2001} @article{muse94, Author = {S. Muse and B. Gaut}, Journal = {Molecular Biology and Evolution}, Pages = {715-724}, Title = {A likelihood approach for comparing synonymous and nonsynonymous nucleotide substitution rates, with application to the chloroplast genome}, Volume = 11, Year = 1994} @incollection{muse95, Address = {Penn. State Univ.}, Author = {S. V. Muse}, Booktitle = {Current Topics on Molecular Evolution}, Editor = {M. Nei and N. Takahata}, Pages = {115-124}, Publisher = {University Park}, Title = {Evolutionary analyses when nucleotides do not evolve independently}, Year = 1995} @article{muse95b, Author = {S. Muse}, Journal = {Genetics}, Pages = {1429-1439}, Title = {Evolutionary analyses of {DNA} sequences subject to constraints on secondary structure}, Volume = 139, Year = 1995} @article{otha93, Author = {T. Ohta}, Journal = {Genetics}, Pages = {1271-1276}, Title = {Pattern of nucleotide substitutions in growth hormone-prolactin gene family: a paradigm for evolution by gene duplication}, Volume = 134, Year = 1993} @article{navidi91, Author = {W. C. Navidi and G. A. Churchill and A. von Haeseler}, Journal = {Molecular Biology and Evolution}, Pages = {128-143}, Title = {Methods for infering phylogenies from nucleic acid sequence data by using maximum likelihood and linear invariants}, Utilisateur = {Gilles Caraux}, Volume = 8, Year = 1991} @article{navidi92, Author = {W. C. Navidi and L. Beckett-Lemus}, Journal = {Molecular Biology and Evolution}, Pages = {1163-1175}, Title = {The effect of unequal transversion rates on the accuracy of evolutionary parsimony}, Utilisateur = {Gilles Caraux}, Volume = 9, Year = 1992} @article{needleman70, Author = {S. G. Needleman and C. D. Wunsch}, Journal = {Journal of Molecular Biology}, Pages = {443-453}, Title = {A general method applicable to the search for similarities in the amino acid sequence of two proteins}, Volume = 48, Year = 1970} @article{nei79, Author = {Masatoshi Nei and Wen Hsiung Li}, Journal = {PNAS}, Number = 10, Pages = {5269-5273}, Title = {Mathematical model for studying genetic variation in terms of restriction endonucleases}, Utilisateur = {Gilles Caraux}, Volume = 76, Year = 1979} @article{nei81, Author = {Masatoshi Nei and Fumo Tajima}, Journal = {Genetics}, Pages = {145-163}, Title = {{DNA} polymorphism detectable by restriction endonucleases}, Utilisateur = {Gilles Caraux}, Volume = 97, Year = 1981} @article{nei85, Author = {M. Nei and J. C. Stephens and N. Saitou}, Journal = {Molecular Biology and Evolution}, Pages = {66-85}, Title = {Methods for computing the standard errors of branching points in an evolutionary tree and their application to molecular data from humans and apes}, Volume = 2, Year = 1985} @article{nei86, Author = {M. Nei and T. Gojobori}, Journal = {Molecular Biology and Evolution}, Pages = {418-426}, Title = {Simple methods for estimating the number of synonymous and nonsynonymous nucleotide substitutions}, Volume = 3, Year = 1986} @article{nei89, Author = {Masatoshi Nei and L. Jin}, Journal = {Molecular Biology and Evolution}, Pages = {290-300}, Title = {Variance of the averages numbers of substitutions within and between populations}, Utilisateur = {Ne Obt}, Volume = 6, Year = 1989} @incollection{nei91, Author = {M. Nei}, Booktitle = {Phylogenetic analysis of {DNA} sequences}, Editor = {M.M. Miyamoto and J. Cracraft}, Publisher = {Oxford Univ. Press}, Title = {Relative efficiencies of different tree-making methods for molecular data}, Year = 1991} @article{nei92, Author = {Masatoshi Nei}, Journal = {Molecular Biology and Evolution}, Number = 6, Pages = {1176-1178}, Title = {Age of the common ancestor of Human Mitochondrial {DNA}}, Utilisateur = {Gilles Caraux}, Volume = 9, Year = 1992} @article{newton04, Author = {M. Newton and A. Noueiry and D. Sarkar and P. Ahlquist}, Journal = {Biostatistics}, Pages = {155-176}, Title = {Detecting differential expression with a semiparametric hierarchical mixture method}, Volume = 5, Year = 2004} @article{nielsen98, Author = {R. Nielsen and Z. Yang}, Journal = {Genetics}, Pages = {929-936}, Title = {Likelihood models for detecting positively selected amino acid sites and application to the {HIV}-1 envelope gene}, Volume = 148, Year = 1998} @book{nutall04, Address = {Cambridge}, Author = {G.H.F. Nutall}, Publisher = {Cambridge Univ. Press}, Title = {Blood immunity and blood relationship}, Year = 1904} @book{nr, Address = {Cambridge}, Author = {W. Press and B. Flannery and S. Teukolsky and W. Vetterling}, Publisher = {Press Syndicate of the University of Cambridge}, Title = {Numerical Recipes in C.}, Year = 1988} @article{olsen94, Author = {G. Olsen and H. Matsuda and R. Hagstrom and R. Overbeek}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {41-48}, Title = {{fastDNAml}: a tool for construction of phylogenetic trees of {DNA} sequences using maximum likelihood}, Volume = 10, Year = 1994} @article{fastdnaml, Author = {G. J. Olsen and H. Matsuda and R. Hagstrom and R. Overbeek}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {41-48}, Title = {{fastDNAml}: a tool for construction of phylogenetic trees of {DNA} sequences using maximum likelihood}, Volume = 10, Year = 1994} @incollection{neyman71, Address = {New York}, Author = {J. Neyman}, Booktitle = {Statistical decision theory and related topics}, Editor = {S. Gupta and J. Yackel}, Pages = {1-27}, Publisher = {Academic Press}, Title = {Molecular studies of evolution: a source of novel statistical problems}, Year = 1971} @article{ota00, Author = {S. Ota and W.-H. Li}, Journal = {Molecular Biology and Evolution}, Pages = {1401-1409}, Title = {{NJML}: a Hybrid Algorithm for the Neighbor-Joining and Maximum-Likelihood Methods}, Volume = 17, Year = 2000} @article{ota01, Author = {S. Ota and W.-H. Li}, Journal = {Molecular Biology and Evolution}, Pages = {1983-1992}, Title = {{NJML+}: an extension of the {NJML} method to handle protein sequence data and computer software implementation}, Volume = 18, Year = 2001} @article{felsenstein1975, title={A pain in the torus: some difficulties with models of isolation by distance}, author={Felsenstein, Joseph}, journal={American Naturalist}, pages={359--368}, year={1975}, publisher={JSTOR} } @article{ota00b, Author = {R. Ota and P. Waddell and M. Hasegawa and H. Shimodaira and H. Kishino}, Journal = {Molecular Biology and Evolution}, Pages = {798-803}, Title = {Appropriate likelihood ratio tests and marginal distribution for evolutionary tree models with constraints on parameters}, Volume = 17, Year = 2000} @article{otto00, Author = {S. Otto and J. Whitton}, Journal = {Annual Review of Genetics}, Pages = {401-437}, Title = {Polyploid incidence and evolution}, Volume = 34, Year = 2000} @book{page98, Address = {Osney Mead, Oxford}, Author = {Roderick Page and Eward Holmes}, Publisher = {Blackwell Science Ltd}, Title = {Molecular Evolution: a phylogenetic approach}, Year = 1998} @article{pauplin00, Author = {Y. Pauplin}, Journal = {Journal of Molecular Evolution}, Pages = {41-47}, Title = {Direct calculation of a tree length using a distance matrix}, Volume = 51, Year = 2000} @article{penny87, Author = {David Penny and Michael D. Hendy and I. M. Henderson}, Journal = {Cold Spring Harbor Symposia on Quantitative Biology}, Pages = {857-862}, Title = {Reliability of Evolutionary Trees}, Utilisateur = {Gilles Caraux}, Volume = 52, Year = 1987} @incollection{penny91, Author = {D. Penny and M.D. Hendy and M.A. Steel}, Booktitle = {Phylogenetic analysis of {DNA} sequences}, Editor = {M. M. Miyamoto and J. Cracraft}, Pages = {155-183}, Title = {Testing the theory of descent}, Year = 1991} @article{penny92, Author = {David Penny and Michael D. Hendy and Michael A. Steel}, Journal = {Tree}, Pages = {73-78}, Title = {Progress with Methods for Constructing Evolutionary Trees}, Utilisateur = {Gilles Caraux and Guillaume Andrieu or Vincent}, Volume = 7, Year = 1992} @article{penny01, Author = {D. Penny and B. McComish and M. Charleston and M. Hendy}, Journal = {Journal of Molecular Evolution}, Pages = {711-723}, Title = {Mathematical elegance with biochemical realism: the covarion model of molecular evolution}, Volume = 53, Year = 2001} @article{hobacgen, Author = {G. Perri{\`e}re and L. Duret and M. Gouy}, Journal = {Genome Research}, Pages = {379-385}, Title = {{HOBACGEN}: database system for comparative genomics in bacteria}, Volume = 10, Year = 2000} @article{hovergen, Author = {L. Duret and D. Mouchiroud and M. Gouy}, Journal = {Nucleic Acids Research}, Pages = {2360-2365}, Title = {{HOVERGEN}, a database of homologous vertebrate genes}, Volume = 22, Year = 1994} @article{li85, Author = {W.-H. Li and C.-I Wu and C.-C Luo}, Journal = {Molecular Biology and Evolution}, Pages = {150-174}, Title = {A new method for estimating synonymous and non-synonymous rates of nucleotide substitutions considering the relative likelihood of nucleotide and codon changes}, Volume = 2, Year = 1985} @article{pagel04, Author = {M. Pagel and A. Meade}, Journal = {Systematic Biology}, Pages = {571-581}, Title = {A phylogenetic mixture model for detecting pattern-heterogeneity in gene sequence or character-state data}, Volume = 53, Year = 2004} @article{phillips02, Author = {M. Phillips and D. Penny}, Journal = {Molecular Phylogenetics and Evolution}, Pages = {171-185}, Title = {The root of the mammalian tree inferred from whole mitochondrial genomes}, Volume = 28, Year = 2002} @article{philippe97, Author = {H. Philippe}, Journal = {Journal of Molecular Evolution}, Pages = {712-715}, Title = {Rodent monophyly: pitfalls of molecular phylogenies}, Volume = 45, Year = 1997} @article{philippe00, Author = {H. Philippe and P. Lopez and H. Brinkman and K. Budin and A. Germot and J. Laurent and D. Moreira and M. Muller and H. Le Guyader}, Journal = {Proceeding of the Royal Society B: Biological Sciences}, Pages = {1213-1221}, Title = {Early branching or fast evolving eukaryotes ? An answer based on slowly evolving positions}, Volume = 267, Year = 2000} @article{philippe00b, Author = {H. Philippe}, Journal = {Protist}, Pages = {307-316}, Title = {Opinion : long branch attraction and protist phylogeny}, Volume = 151, Year = 2000} @article{philippe05, Author = {H. Philippe and Y. Zhou and H. Brinkmann and N. Rodrigue and F. Delsuc}, Journal = {BMC Evolutionary Biology}, Pages = {http://www.biomedcentral.com/1471-2148/5/50}, Title = {Heterotachy and long-branch attraction in phylogenetics}, Year = 2005} @article{pollock99, Author = {D. Pollock and W. Taylor and N. Goldman}, Journal = {Journal of Molecular Biology}, Pages = {187-198}, Title = {Co-evolving protein residues: maximum likelihood analysis and relationship to structure}, Volume = 287, Year = 1999} @article{posada98, Author = {D. Posada and K. Crandall}, Journal = {Bioinformatics}, Pages = {817-918}, Title = {Modeltest: testing the model of {DNA} substitution}, Volume = 14, Year = 1998} @article{posada01, title={Selecting models of nucleotide substitution: an application to human immunodeficiency virus 1 (HIV-1)}, author={Posada, D. and Crandall, K.A.}, journal={Molecular Biology and Evolution}, volume={18}, number={6}, pages={897--906}, year={2001}, publisher={SMBE} } @Article{poux06, Author="Poux, C. and Chevret, P. and Huchon, D. and de Jong, W. W. and Douzery, E. J. ", Title="{{A}rrival and diversification of caviomorph rodents and platyrrhine primates in {S}outh {A}merica}", Journal="Syst. Biol.", Year="2006", Volume="55", Pages="228--244", Month="Apr" } @techreport{prum92, Author = {Bernard Prum and Fran{{\c C}}ois Rodolphe and Elisabeth de Turckheim}, Institution = {INRA}, Month = {October}, Note = {{I}nfluence du {V}oisinage sur l'{E}volution d'une {S{\'e}}quence d'{ADN}}, Title = {{F}inding words with unexpected frequencies in {DNA} sequences}, Year = {1992}} @article{pupko02, Author = {T. Pupko and N. Galtier}, Journal = {Proceedings of The Royal Society B: Biological Sciences}, Pages = {1313-1316}, Title = {A covarion-based method for detecting molecular adaptation: application to the evolution of primate mitochondrial genomes}, Volume = 269, Year = 2002} @article{purvis97, Author = {A. Purvis and D. L. J. Quicke}, Journal = {Trends in Ecology and Evolution}, Number = 2, Pages = {49-50}, Title = {Building phylogenies: are the big easy ?}, Volume = 12, Year = 1997} @article{qu83, Author = {L.H. Qu and B. Michot and J.P. Bachellerie}, Journal = {Nucleic Acids Research}, Pages = {5903-5920}, Title = {Improved methods for structure probing in large RNAs: a rapid heterologous sequencing approach is coupled to the direct mapping of nuclease accessible sites. Application to the 5' terminal domain of eukaryotic}, Volume = 11, Year = 1983} @article{quesenberry64, Author = {C. P. Quesenberry and D. C. Hurst}, Journal = {Technometrics}, Month = {MAY}, Number = 2, Pages = {191-195}, Title = {Large Sample Simultaneous Confidence Intervals for Multinomial Proportions }, Volume = 6, Year = 1964} @article{rannala96, Author = {B. Rannala and Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {304-311}, Title = {Probability distribution of molecular evolutionary trees: a new method of phylogenetic inference}, Volume = {43}, Year = 1996} @Article{rannala07, Author="Rannala, B. and Yang, Z. ", Title="{{I}nferring speciation times under an episodic molecular clock}", Journal="Syst. Biol.", Year="2007", Volume="56", Pages="453--466", Month="Jun" } @article{ranwez01, Author = {V. Ranwez and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {1103-11016}, Title = {Quartet-based phylogenetic inference: improvements and limits.}, Volume = {18}, Year = 2001} @article{ranwez02, Author = {V. Ranwez and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {1952-1963}, Title = {Improvement of Distance-Based Phylogenetic Methods by a Local Maximum Likelihood Approach Using Triplets}, Volume = {19}, Year = 2002} @article{rasmol, Author = {R. Sayle and J. Milner-White}, Journal = {Trends in Biochemical Sciences}, Pages = {374}, Title = {{R}as{M}ol: Biomolecular graphics for all}, Volume = {20}, Year = 1995} @phdthesis{ranwezthese, Author = {V. Ranwez}, School = {Universit{\'e} Montpellier II}, Title = {M{\'e}thodes efficaces pour reconstruire des phylog{\'e}nies suivant le principe du maximum de vraisemblance}, Year = 2002} @article{rdp, Author = {B. L. Maidak and J.R. Cole and T.G. Lilburn and C.T. Parker Jr. and P.R. Saxman and R.J. Farris and G.M. Garrity and G.J. Olsen and T.M. Schmidt and J.M. Tiedje}, Journal = {Nucleic Acids Research}, Pages = {173-174}, Title = {The {RDP}-II ({R}ibosomal {D}atabase {P}roject)}, Volume = {29}, Year = 2001} @article{ren05, Author = {F. Ren and H. Tanaka and Z. Yang}, Journal = {Systematic Biology}, Pages = {808-818}, Title = {An empirical examination of the utility of codon-substitution models in phylogeny reconstruction}, Volume = 54, Year = 2005} @book{renyi66, Address = {Paris}, Author = {A. Renyi}, Publisher = {Dunod}, Title = {{C}alcul des {P}robabilites}, Year = 1966} @article{reyes98, Author = {A. Reyes and G. Pesole and C. Saccone}, Journal = {Molecular Biology and Evolution}, Pages = {499-505}, Title = {Complete mitochondrial {DNA} sequence of the fat dormouse, {G}lis glis: further evidence of rodent paraphyly}, Volume = {15}, Year = {1998}} @article{reyes00, Author = {A. Reyes and G. Pesole and C. Saccone}, Journal = {Gene}, Pages = {177-187}, Title = {Long-branch attraction phenomenon and the impact of among-site rate variation on rodent phylogeny}, Volume = {259}, Year = {2000}} @article{reyes04, Author = {A. Reyes and C. Gissi and F. Catzeflis and E. Nevo and G. Pesole and C. Saccone}, Journal = {Molecular Biology and Evolution}, Pages = {397-403}, Title = {Congruent mammalian trees from mitochondrial and nuclear genes using Bayesian methods}, Volume = {21}, Year = {2004}} @article{rice97, Author = {K. Rice and M. J. Donoghue and R. G. Olmstead}, Journal = {Systematic Biology}, Pages = {554-563}, Title = {Analyzing large data sets: {\it rbcL} 500 revisited}, Volume = {46}, Year = {1997}} @article{robinson71, Author = {D. Robinson}, Journal = {J. Combinatorial Theory Ser B}, Pages = {105-119}, Title = {Comparison of labeled trees with valency three}, Utilisateur = {Gilles Caraux}, Volume = 11, Year = 1971} @incollection{robinson79, Address = {Berlin}, Author = {D. Robinson and L. Foulds}, Booktitle = {Lectures Notes in Mathematics}, Pages = {119-126}, Publisher = {Springer}, Title = {Comparison of weighted labeled trees}, Utilisateur = {Gilles Caraux}, Volume = 748, Year = 1979} @article{robinson81, Author = {D. F. Robinson and L. R. Foulds}, Journal = {Mathematical Biosciences}, Pages = {131-147}, Title = {Comparison of phylogenetic trees}, Utilisateur = {Gilles Caraux et Vincent}, Volume = 53, Year = 1981} @Article{robinson98, Author="Robinson, M. and Gouy, M. and Gautier, C. and Mouchiroud, D. ", Title="{{S}ensitivity of the relative-rate test to taxonomic sampling}", Journal="Molecular Biology and Evolution", Year="1998", Volume="15", Pages="1091--1098", Month="Sep" } @article{gharib13, title={The branch-site test of positive selection is surprisingly robust but lacks power under synonymous substitution saturation and variation in {GC}}, author={Gharib, Walid H and Robinson-Rechavi, Marc}, journal={Molecular Biology and Evolution}, volume={30}, number={7}, pages={1675--1686}, year={2013}, publisher={SMBE} } @article{zhang05, title={Evaluation of an improved branch-site likelihood method for detecting positive selection at the molecular level}, author={Zhang, J. and Nielsen, R. and Yang, Z.}, journal={Molecular Biology and Evolution}, volume={22}, number={12}, pages={2472--2479}, year={2005}, publisher={SMBE} } @incollection{rodrigo01, Address = {Boston, Mass.}, Author = {A. Rodrigo and E. Hanley and P. Goracke and G. Learn}, Booktitle = {Computational and evolutionary analysis of HIV molecular sequences}, Editor = {A. Rodrigo and G. Learn}, Pages = {1-17}, Publisher = {Kluwer Academic Publishers}, Title = {Sampling and processing {HIV} molecular sequences : a computatinal evolutionary biologist's perspective}, Year = 2001} @article{rodriguez90, Author = {F. Rodriguez and J. L. Olivier and A. Marin and J. R. Medina}, Journal = {Journal of Theoretical Biology}, Pages = {485-501}, Title = {The general stochastic model of nucleotide substitution}, Volume = 142, Year = 1990} @article{rodriguez03, Author = {F. Rodriguez-Trelles and R. Tarrio and F. Ayala}, Journal = {PNAS}, Pages = {13413-13417}, Title = {Convergent neofunctionalization by positive Darwinian selection after ancient recurrent duplications of the xanthine dehydrogenase gene}, Volume = {100}, Year = {2003}} @article{rogers99, Author = {J. Rogers and D. Swofford}, Journal = {Molecular Biology and Evolution}, Pages = {1079-1085}, Title = {Multiple local maxima for likelihoods of phylogenetic trees: a simulation study}, Volume = {16}, Year = {1999}} @article{rohlf74, Author = {F. James Rohlf}, Journal = {Annual Review of Ecology and Systematics}, Pages = {101-113}, Title = {Methods of comparing classifications}, Utilisateur = {Gilles Caraux}, Volume = 5, Year = 1974} @article{rosenberg01, Author = {M. Rosenberg and S. Kumar}, Journal = {Molecular Biology and Evolution}, Pages = {1823-1827}, Title = {Traditional phylogenetic reconstruction methods reconstruct shallow and deep evolutionary relationship equally well}, Volume = 19, Year = 2001} @article{ross02, Author = {H. Ross and A. Rodrigo}, Journal = {Journal of Virology}, Pages = {11715-11720}, Title = {Immune-mediated positive selection drives human immunodeficiency virus type 1 molecular variation and predicts disease duration}, Volume = 76, Year = 2002} @book{ruegg, Address = {Lausanne}, Author = {Alan Ruegg}, Publisher = {Presses polytechniques romandes}, Series = {Methodes mathematiques pour l'ingenieur}, Title = {Processus Stochastiques}, Year = 1989} @Article{rutschmann07, Author="Rutschmann, F. and Eriksson, T. and Salim, K. A. and Conti, E. ", Title="{{A}ssessing calibration uncertainty in molecular dating: the assignment of fossils to alternative calibration points}", Journal="Syst. Biol.", Year="2007", Volume="56", Pages="591--608", Month="Aug" } @incollection{gascuel07, Title={Modelling the variability of evolutionary processes}, Author={Gascuel, O. and Guindon, S.}, Editor={Olivier Gascuel and Mike Steel}, Booktitle={Reconstructing Evolution: new mathematical and computational advances}, Pages={65--99}, Publisher={Oxford University Press}, Year={2007} } @article{slatkin91, title={Pairwise comparisons of mitochondrial DNA sequences in stable and exponentially growing populations.}, author={M. Slatkin and R. R. Hudson}, journal={Genetics}, volume={129}, number={2}, pages={555--562}, year={1991}, publisher={Genetics Soc America} } @article{rzhetsky92a, Author = {Andrey Rzhetsky and Masatoshi Nei}, Journal = {Molecular Biology and Evolution}, Pages = {945-967}, Title = {A simple method for estimating and testing minimum-evolution trees}, Utilisateur = {Olivier Gascuel et Guillaume Andrieu}, Volume = 9, Year = 1992} @article{rzhetsky92b, Author = {Andrey Rzhetsky and Masatoshi Nei }, Journal = {Journal of Molecular Evolution}, Pages = {367-375}, Title = {Statistical Properties of the Ordinary Least-Squares, Generalized Least-Squares, and Minimum-Evolution Methods of Phylogenetic Inference}, Utilisateur = {Guillaume Andrieu}, Volume = 35, Year = 1992} @article{rzhetsky93, Author = {A. Rzhetsky and M. Nei }, Journal = {Molecular Biology and Evolution}, Pages = {1073-1095}, Title = {Theoretical foundation of the minimum-evolution method of phylogenetic inference}, Volume = 10, Year = 1993} @article{rzhetsky94, Author = {A. Rzhetsky and M. Nei}, Journal = {Journal of Molecular Evolution}, Pages = {295-299}, Title = {Unbiaised estimates of the number of nucleotide substitutions when substitution rate varies among different sites}, Volume = 38, Year = 1994} @article{rzhetsky95, Author = {A. Rzhetsky and S. Kumar and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {163-167}, Title = {Four-cluster analysis: a simple method to test phylogenetic hypotheses}, Volume = 12, Year = 1995} @article{rzhetsky95b, Author = {A. Rzhetsky}, Journal = {Genetics.}, Number = 2, Pages = {771-83}, Title = {Estimating substitution rates in ribosomal RNA genes}, Volume = 141, Year = 1995} @article{rzhetsky96, Author = {A. Rzhetsky and T. Sitnikova}, Journal = {Molecular Biology and Evolution}, Pages = {1255-1265}, Title = {When is it Safe to use an Oversimplified Substitution Model in Tree-Making?}, Volume = 13, Year = 1996} @incollection{saccone90, Address = {New York}, Author = {Cecilia Saccone and Cecilia Lanave and Graziano Pesole and Giuliano Preperata }, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 35, Editor = {Russsell F. Doolittle}, Pages = {570-583}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Influence of Base Composition on Quantitative Estimates of Gene Evolution}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{saccone91, Author = {Cecilia Saccone and Graziano Pesole and Elisabetta Sbis\'{a} }, Journal = {Journal of Molecular Evolution}, Pages = {88-91}, Title = {the main regulatory region of mammalian mitochondria {DNA} : Stucture -function model and evilutionary pattern}, Utilisateur = {G. Andrieu}, Volume = 33, Year = 1991} @article{saitou87, Author = {N. Saitou and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {406-425}, Title = {The neighbor-joining method: a new method for reconstructing phylogenetic trees}, Volume = 4, Year = 1987} @article{nj, Author = {N. Saitou and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {406-425}, Title = {The neighbor-joining method: A new method for reconstruction phylogenetic trees}, Utilisateur = {Gilles Caraux}, Volume = 4, Year = 1987} @article{saitou88, Author = {N. Saitou}, Journal = {Journal of Molecular Evolution}, Pages = {261-273}, Title = {Property and efficiency of the maximum likelihood method for molecular phylogeny}, Utilisateur = {Gilles Caraux}, Volume = 27, Year = 1988} @article{saitou89, Author = {N. Saitou and T. Imanishi}, Journal = {Molecular Biology and Evolution}, Pages = {514-525}, Title = {Relative efficiencies of the {F}itch-{M}argoliash, {M}aximum-{P}arsimony, {M}aximum-{L}ikelihood, {M}inimum-{E}volution, and {N}eighbor-{J}oining methods of phylogenetic tree construction in obtaining the correct tree}, Volume = 6, Year = 1989} @incollection{saitou90, Address = {New York}, Author = {N. Saitou}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 36, Editor = {Russsell F. Doolittle}, Pages = {584-598}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Maximum Likelihood Methods}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @incollection{saitou91, Author = {N. Saitou}, Booktitle = {Statistical Methods in Biological and Medical Sciences}, Editor = {R. C. Rao and R. Chakraborty}, Pages = {317-346}, Publisher = {North-Holland}, Series = {Handbook of Statistics}, Title = {Statistical Methods for Phylogenetic Tree Reconstruction}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 8, Year = 1991} @article{salter01, Author = {L. Salter and D. Pearl}, Journal = {Systematic Biology}, Pages = {7-17}, Title = {Stochastic search strategy for estimation of maximum likelihood phylogenetic trees}, Volume = 50, Year = 2001} @article{sanderson94, Author = {M. Sanderson and M. Donoghue and W. Piel and T. Eriksson}, Title = {Tree{BASE}: a prototype database of phylogenetic analyses and an interactive tool for browsing the phylogeny of life}, Journal = {American Journal of Botany}, Volume = 81, Pages = {183}, Year = {1994} } @article{sanderson97, Author = {M. Sanderson}, Journal = {Molecular Biology and Evolution}, Pages = {1218-1231}, Title = {A nonparametric approach to estimating divergence times in the absence of rate constancy}, Volume = 14, Year = 1997} @article{sanderson02, Author = {M. Sanderson}, Journal = {Molecular Biology and Evolution}, Pages = {101-109}, Title = {Estimating absolute rates of molecular evolution and divergence times: a penalized likelihood approach}, Volume = 19, Year = 2002} @article{sanger77, Author = {F. Sanger and S. Nicklen and A.R. Coulson}, Journal = {PNAS}, Pages = {5463-5467}, Title = {DNA sequencing with chain-terminating inhibitors}, Volume = 74, Year = 1977} @article{sankoff94, Author = {D. Sankoff and Y. Abel and J. Hein}, Journal = {Journal of Classification}, Pages = {209-232}, Title = {A tree - a hill; generalization of nearest-neighbor in phylogenetic optimization}, Utilisateur = {Vincent}, Volume = 11, Year = 1994} @inbook{saporta, Author = {G. Saporta}, Chapter = { No 5 Notions {\'e}l{\'e}mentaires sur les processus al{\'e}atoires}, Pages = {103-113}, Publisher = {Technip}, Title = {Probabilit{\'e}s analyse des donn{\'e}es et statistique}, Utilisateur = {Guillaume Andrieu}, Year = 1990} @article{sharp97, Author = {P. Sharp}, Journal = {Nature}, Pages = {111-112}, Title = {In search of molecular Darwinism}, Volume = 385, Year = 1997} @article{sharp87, Author = {P. Sharp and W.-H. Li}, Journal = {Journal of Molecular Evolution}, Pages = {1281-1295}, Title = {The codon adaptation index--a measure of directional synonymous codon usage bias, and its potential applications}, Volume = 15, Year = 1987} @article{scherer89, Author = {Siegfried Scherer}, Journal = {Molecular Biology and Evolution}, Pages = {436-441}, Title = {The relative-rate test of the molecular clock hypothesis : a note of caution}, Utilisateur = {Gilles Caraux}, Volume = 6, Year = 1989} @article{shankarappa99, Author = {R. Shankarappa and J. Margolick and S. Gange and A. Rodrigo and D. Upchurch and H. Farzadegan and P. Gupta and C. Rinaldo and G. Learn and X. He and X.-L Huang and J. Mullins }, Journal = {Journal of Virology}, Pages = {10489-10502}, Title = {Consistent viral evolutionary changes associated with the progression of human immunodeficiency virus type 1 infection}, Volume = 73, Year = 1999} @article{schoniger93, Author = {Michael Sch{\"o}niger and Arndt von Haesler }, Journal = {Molecular Biology and Evolution}, Pages = {471-483}, Title = {A simple method to improve the reliability of tree reconstruction}, Utilisateur = {G. Andrieu}, Volume = 10, Year = 1993} @article{schoniger94, Author = {M. Sch{\"o}niger and A. von Haesler }, Journal = {Molecular Phylogeny and Evolution}, Pages = {240-247}, Title = {A stochastic model for the evolution of autocorrelated {DNA} sequences}, Volume = 3, Year = 1994} @article{schoniger95, Author = {M. Sch{\"o}niger and A. von Haesler }, Journal = {Systematic Biology}, Pages = {533-547}, Title = {Performance of the maximum likelihood, neighbor joining, and maximum parsimony methods when sequence sites are not independent}, Volume = 44, Year = 1995} @article{schwarz78, Author = {G. Schwarz}, Journal = {The annals of statistics}, Pages = {461-464}, Title = {Estimating the dimension of a model}, Volume = 6, Year = 1978} @article{sibley84, Author = {Charles G. Sibley and Jon E. Ahlquist}, Journal = {Journal of Molecular Evolution}, Pages = {2-15}, Title = {the phylogeny of the hominoid primates, as indicated by {DNA-DNA} hybridization}, Utilisateur = {Gilles Caraux}, Volume = 20, Year = 1984} @article{sibley87, Author = {Charles G. Sibley and Jon E. Ahlquist}, Journal = {Journal of Molecular Evolution}, Pages = {99-121}, Title = {{DNA} hybridization evidence of hominoid phylogeny : results from expanded set}, Utilisateur = {Gilles Caraux}, Volume = 26, Year = 1987} @book{paup, Address = {Sunderland, MA}, Author = {D. Swofford}, Publisher = {Sinauer}, Title = {{PAUP$^*$}: Phylogenetic Analysis by Parsimony$^*$ and other methods}, Year = 1999} @book{bambe, Address = {Duquesne University}, Author = {D. Simon and B. Larget}, Publisher = {Department of Mathematics and Computer Science}, Title = {Bayesian analysis in molecular biology and evolution (BAMBE), version 2.03 beta}, Year = 2000} @article{sarich67, Author = {V. Sarich and A. Wilson}, Journal = {Science}, Pages = {1200-1203}, Title = {Immunological time scale for hominid evolution}, Volume = 158, Year = 1967} @article{self87, Author = {S. Self and K. Liang}, Journal = {Journal of the American Statistical Association}, Pages = {605--610}, Title = {Asymptotic properties of maximum likelihood estimators and likelihood ratio tests under nonstandard conditions}, Volume = 82, Year = 1987} @article{shan09, title={Evolution of plant {MADS} box transcription factors: evidence for shifts in selection associated with early angiosperm diversification and concerted gene duplications}, author={Shan, H. and Zahn, L. and Guindon, S. and Wall, P.K. and Kong, H. and Ma, H. and DePamphilis, C.W. and Leebens-Mack, J. and others}, journal={Molecular Biology and Evolution}, volume={26}, number={10}, pages={2229--2244}, year={2009}, publisher={SMBE} } @article{murrell12, title={Detecting individual sites subject to episodic diversifying selection}, author={Murrell, Ben and Wertheim, Joel O and Moola, Sasha and Weighill, Thomas and Scheffler, Konrad and Pond, Sergei L Kosakovsky}, journal={PLoS Genetics}, volume={8}, number={7}, pages={e1002764}, year={2012}, publisher={Public Library of Science} } @article{pond05, title={Not so different after all: a comparison of methods for detecting amino acid sites under selection}, author={Kosakovsky Pond, Sergei and Frost, Simon}, journal={Molecular Biology and Evolution}, volume={22}, number={5}, pages={1208--1222}, year={2005}, publisher={SMBE} } @article{shimodaira99, Author = {H. Shimodaira and M. Hasegawa}, Journal = {Molecular Biology and Evolution}, Pages = {1114-1116}, Title = {Multiple comparisons of log-likelihoods with applications to phylogenetic inference}, Volume = 16, Year = 1999} @article{shriner04, Author = {D. Shrinner and A. Rodrigo and D. Nickle and J. Mullins}, Journal = {Genetics}, Pages = {1573-1583}, Title = {Pervasive genomic recombination of {HIV-1} \mbox{\it in vivo}}, Volume = {167}, Year = 2004} @article{sokal58, Author = {R. R. Sokal and C. D. Michener}, Journal = {University of Kansas Science Bulletin}, Pages = {1409-1438}, Title = {A statistical method for evaluating systematic relationships}, Volume = {38}, Year = {1958}} @article{sourdis87, Author = {J. Sourdis and C. Krimbas}, Journal = {Molecular Biology and Evolution}, Pages = {159-166}, Title = {Accuracy of phylogenetic trees estimated from {DNA} sequence data}, Volume = {4}, Year = {1987}} @article{springer01, Author = {M. Springer and R. De Bry and C. Douady and H. Amrine and O. Madsen and W. de Jong and M. Stanhope.}, Journal = {Molecular Biology and Evolution}, Pages = {132-143}, Title = {Mitochondrial versus nuclear gene sequences in deep-level mammalian phylogeny reconstruction}, Volume = {18}, Year = {2001}} @article{sourdis88, Author = {J. Sourdis and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {298-311}, Title = {Relative efficiencies of the maximum parsimony and distance-based methods in obtaining the correct phylogenetic tree}, Volume = {5}, Year = {1988}} @article{srs, Author = {T. Etzold and P. Argos}, Journal = {CABIOS}, Pages = {49-57}, Title = {{SRS}-an indexing and retrieval tool for flat file data libraries}, Volume = {9}, Year = {1993}} @article{spencer05, Author = {M. Spencer and E. Susko and A. Roger}, Journal = {Molecular Biology and Evolution}, Pages = {1161-1164}, Title = {Likelihood, parsimony, and heterogeneous evolution}, Volume = {22}, Year = {2005}} @article{squires07, author = {B. Squires and C. Macken and A. Garcia-Sastre and S. Godbole and J. Noronha and V. Hunt and R. Chang and C. Larsen and E. Klem and K. Biersack and R. Scheuermann}, title = {{B}io{H}ealth{B}ase: informatics support in the elucidation of influenza virus host-pathogen interactions and virulence}, journal = {Nucleic Acids Research}, volume = {Database issue}, year = {2007} } @article{raxml, Author = {A. Stamatakis}, Journal = {Bioinformatics}, Pages = {2688-2690}, Title = {{RAxML-VI-HPC}: Maximum Likelihood-based Phylogenetic Analyses with Thousands of Taxa and Mixed Models}, Volume = 22, Year = 2006} @article{stamatakis06, Author = {A. Stamatakis}, Journal = {Bioinformatics}, Pages = {2688-2690}, Title = {{RAxML-VI-HPC}: Maximum Likelihood-based Phylogenetic Analyses with Thousands of Taxa and Mixed Models}, Volume = 22, Year = 2006} @article{st77, Author = {S. Sattah and A. Tversky}, Journal = {Psychometrika}, Pages = {319-345}, Title = {Additive similarity trees}, Volume = 42, Year = 1977} @article{steel92, Author = {M. Steel}, Journal = {J. of Classification}, Pages = {91-116}, Title = {The complexity of reconstructing trees from qualitative characters and subtrees}, Utilisateur = {Vincent}, Volume = 9, Year = 1992} @article{steel93, Author = {M.A. Steel and D. Penny}, Journal = {Systematic Biology}, Number = 2, Pages = {126-141}, Title = {Distributions of tree comparison metrics - some new results}, Volume = 42, Year = 1993} @article{steel94, Author = {M. Steel}, Journal = {Systematic Biology}, Pages = {560-564}, Title = {The maximum likelihood point for a phylogenetic tree is not unique}, Volume = 43, Year = 1994} @article{steel00a, Author = {M. Steel and D. Penny}, Journal = {Molecular Biology and Evolution}, Pages = {839-50}, Title = {Parsimony, likelihood, and the role of models in molecular phylogenetics}, Volume = 17, Year = 2000} @article{steel00b, Author = {M. Steel and D. Huson and P. Lockhart}, Journal = {Systematic Biology}, Pages = {225-232}, Title = {Invariable site models and their use in phylogeny reconstruction}, Volume = 49, Year = 2000} @article{steel05, Author = {M. Steel}, Journal = {Trends in Genetics}, Pages = {307-309}, Title = {Should phylogenetic models be trying to ``fit an elephant''?}, Volume = 21, Year = 2005} @incollection{stewart93, Author = {Caro-Beth Stewart}, Booktitle = {Nature}, Month = {february}, Pages = {603-607}, Title = {The Powers and pitfalls of parsimony}, Utilisateur = {Vincent}, Volume = 361, Year = 1993} @article{stoffberg10, author = {S. Stoffberg and D. Jacobs and I. Mackie and C. Matthee}, title = {Molecular phylogenetics and historical biogeography of Rhinolophus bats}, journal = {Molecular Phylogenetics and Evolution}, Volume = 54, Pages = {1-9}, Year = 2010} @article{strimmer96, Author = {K. Strimmer and A. von Haeseler}, Journal = {Molecular Biology and Evolution}, Pages = {964-969}, Title = {Quartet puzzling: a quartet maximum-likelihood method for reconstructing tree topologies}, Volume = 13, Year = 1996} @article{strimmer97, Author = {K. Strimmer and N. Goldman and A. von Haeseler}, Journal = {Molecular Biology and Evolution}, Pages = {210-211}, Title = {Baysian Probabilities and Quartet puzzling}, Volume = 14, Year = 1997} @article{strimmer00, Author = {K. Strimmer and V. Moulton}, Journal = {Molecular Biology and Evolution}, Pages = {875-881}, Title = {Likelihood analysis of phylogenetic networks using directed graphical models}, Volume = 17, Year = 2000} @article{studier88, Author = {J. Studier and K. Kepler}, Journal = {Molecular Biology and Evolution}, Pages = {729-731}, Title = {A note on the neighbor-joining algorithm of Saitou and Nei}, Volume = 5, Year = 1988} @article{sullivan95, Author = {J. Sullivan and K. E. Holsinger and C. Simon}, Journal = {Molecular Biology and Evolution}, Pages = {988-1001}, Title = {Among-site variation and phylogenetic analysis of 12{S} r{RNA} in sigmontine rodents}, Volume = 12, Year = 1995} @article{sullivan97, Author = {J. Sullivan and D. Swofford}, Journal = {Journal of Mammalian Evolution}, Pages = {77-86}, Title = {Are Guinea pigs Rodents? The importance of adequate models in molecular phylogenetics.}, Volume = 4, Year = 1997} @article{susko02, Author = {E. Susko and Y. Inagaki and C. Field and M. Holder and A. Roger}, Journal = {Molecular Biology and Evolution}, Pages = {1514-1523}, Title = {Testing for differences in rates-across-sites distributions in phylogenetic subtrees}, Volume = 19, Year = 2002} @article{susko03, Author = {E. Susko and C. Field and C. Blouin and A. Roger}, Journal = {Systematic Biology}, Pages = {594-603}, Title = {Estimation of rates-across-sites distributions in phylogenetic substitution models}, Volume = 52, Year = 2003} @article{suzuki99, Author = {Y. Suzuki and T. Gojobori}, Journal = {Molecular Biology and Evolution}, Pages = {1315-1328}, Title = {A method for detecting positive selection at single amino acid sites}, Volume = 16, Year = 1999} @article{suzuki02, Author = {Y. Suzuki and G. V. Glazko and M. Nei}, Journal = {PNAS}, Pages = {16138-16143}, Title = {Overcredibility of molecular phylogenies obtained by Bayesian phylogenetics}, Volume = 99, Year = 2002} @article{suzuki04, Author = {Y. Suzuki and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {914-921}, Title = {False-positive selection identified by {ML}-based methods: examples from the {\it Sig1} gene of the diatom {T}halassoria weissflogii and the {\it tax} gene of a human {T}-cell lymphotropic virus}, Volume = 21, Year = 2004} @article{swanson01, Author = {W. Swanson and Z. Yang and M. Wolfner and C. Aquadro}, Journal = {PNAS}, Pages = {2509-2514}, Title = {Positive Darwinian selection drives the evolution of several female reproductive proteins in mammals}, Volume = 98, Year = 2001} @incollection{swofford90, Address = {Sunderland, MA}, Author = {D. Swofford and G. Olsen}, Booktitle = {Molecular Systematics}, Chapter = 11, Editor = {D. M. Hillis and C. Moritz}, Pages = {411-501}, Publisher = {Sinauer}, Title = {Phylogeny reconstruction}, Year = 1990} @incollection{swofford91, Author = {D. Swofford}, Booktitle = {Phylogenetic analysis of {DNA} sequences}, Chapter = 14, Editor = {M. M. Miyamoto and J. Cracraft}, Pages = {295-333}, Publisher = {Oxford University press}, Title = {When are phylogeny estimates from molecular and morphological data incongruent ?}, Year = 1991} @incollection{swofford96, Address = {Sunderland, MA}, Author = {D. Swofford and G. Olsen and P. Waddel and D. Hillis}, Booktitle = {Molecular Systematics}, Chapter = 11, Editor = {D. Hillis and C. Moritz and B. Mable}, Publisher = {Sinauer}, Title = {Phylogenetic inference}, Year = 1996} @article{tajima82, Author = {Fumio Tajima and Masatoshi Nei }, Journal = {Journal of Molecular Evolution}, Pages = {115-120}, Title = {Biases of the estimates of {DNA} divergence obtained by the restriction enzyme technique}, Utilisateur = {Gilles Caraux}, Volume = 18, Year = 1982} @article{tajima84, Author = {Fumio Tajima and Masatoshi Nei }, Journal = {Molecular Biology and Evolution}, Pages = {269-285}, Title = {Estimation of evolution distance between nucleotide sequences}, Volume = 1, Year = 1984} @article{tajima92, Author = {Fumio Tajima }, Journal = {Molecular Biology and Evolution}, Pages = {168-181}, Title = {Statistical Method for estimating the standard errors of branch lengths in a phylognetic tree reconstructed without assuming equal rates of nucleotide substitution among different lineages}, Utilisateur = {Guillaume Andrieu}, Volume = 1, Year = 1992} @article{tajima93, Author = {Fumio Tajima }, Journal = {Molecular Biology and Evolution}, Pages = {677-688}, Title = {Unbiased Estimation of evolutionary distance between nucleotide sequences}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 10, Year = 1993} @article{tajima94, Author = {Fumio Tajima and Naoko Takezaki}, Journal = {Molecular Biology and Evolution}, Pages = {278-286}, Title = {Estimation of Evolutionary Distance for Reconstructiong Molecular Phylogenetic Trees}, Volume = 11, Year = 1994} @article{takahashi00, Author = {Kei Takahashi and Masatoshi Nei}, Journal = {Molecular Biology and Evolution}, Pages = {1251-1258}, Title = {Efficiencies of Fast Algorithms of Phylogenetic Inference Under the Criteria of Maximum Parsimony, Minimum Evolution, and Maximum Likelihood When a Large Number of Sequences Are Used}, Volume = 17, Year = 2000} @article{takahata81, Author = {Naoyuki Takahata and M. Kimura}, Journal = {Genetics}, Pages = {641-657}, Title = {A Model of Evolutionary Base Substitutions and its Application with special Reference to rapid change of Pseudogenes}, Utilisateur = {Guillaume Andrieu}, Volume = 98, Year = 1981} @article{takezaki94, Author = {N. Takezaki and M. Nei}, Journal = {Journal of Molecular Evolution}, Pages = {210-218}, Title = {Inconsistency of the maximum parsimony method when the rate of nucleotide, substitution is constant}, Utilisateur = {Vincent}, Volume = 39, Year = 1994} @Article{takezaki95, Author="Takezaki, N. and Rzhetsky, A. and Nei, M. ", Title="{{P}hylogenetic test of the molecular clock and linearized trees}", Journal="Molecular Biology and Evolution", Year="1995", Volume="12", Pages="823--833", Month="Sep" } @article{tamura93, Author = {K. Tamura and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {512-526}, Title = {Estimation of the number of nucleotide substitutions in the control region of mitochondrial {DNA} in humans and chimpanzees}, Volume = 10, Year = 1993} @article{tateno82, Author = {Y. Tateno and M. Nei and F. Tajima}, Journal = {Journal of Molecular Evolution}, Pages = {387-404}, Title = {Accuracy of Estimed Phylogenetic Trees from Molecular Data : I. Distantly Related Species}, Volume = 18, Year = 1982} @article{tavare86, Author = {S. Tavar\'e}, Journal = {Lectures on Mathematics in the Life Sciences}, Pages = {57-86}, Title = {Some probabilistic and statistical problems on the analysis of {DNA} sequences}, Volume = 17, Year = 1986} @article{tillier98, Author = {E. Tillier and R. Collins}, Journal = {Genetics}, Pages = {1993-2002}, Title = {High Apparent Rate of Simultaneous Compensatory Base-Pair Substitutions in Ribosomal RNA}, Volume = 148, Year = 1998} @article{clustal, Author = {J. Thompson and D. Higgins and T. Gibson }, Journal = {Nucleic Acids Research}, Pages = {4673-4680}, Title = {{CLUSTAL W}: improving the sensitivity of progressive multiple sequence alignment through sequence weighting, position-specific gap penalties and weight matrix choice}, Volume = 22, Year = 1994} @article{clustalx, Author = {J. Thompson and T. Gibson and F. Plewniak and F. Jeanmougin and D. Higgins}, Journal = {Nucleic Acids Research}, Pages = {4876-4882}, Title = {The {C}lustal{X} windows interface: flexible strategies for multiple sequences alignement aided by quality analysis tool}, Volume = 24, Year = 1997} @article{thorne91, Author = { J. L. Thorne and H. Kishino and J. Felsenstein}, Journal = {Journal of Molecular Evolution}, Pages = {114-124}, Title = {An Evolutionary Model for Maximum Likelihood Alignement of {DNA} Sequences}, Volume = 33, Year = 1991} @article{thorne92a, Author = { J. L. Thorne and H. Kishino and J. Felsenstein}, Journal = {Journal of Molecular Evolution}, Pages = {3-16}, Title = {Inching toward Reality: an Improved Likelihood Model of Sequence Evolution}, Volume = 34, Year = 1992} @article{thorne92b, Author = {J. L. Thorne and H. Kishino }, Journal = {Molecular Biology and Evolution}, Pages = {1148-1162}, Title = {Freeing Phylogenies from Artifacts of Alignement}, Utilisateur = {G. Andrieu}, Volume = 9, Year = 1992} @article{thorne98, Author = {J. Thorne and H. Kishino and I. Painter}, Journal = {Molecular Biology and Evolution}, Pages = {1647-1657}, Title = {Estimating the rate of evolution of the rate of molecular evolution}, Volume = 15, Year = 1998} @article{tourasse97, Author = {N.J. Tourasse and M. Gouy }, Journal = {Molecular Biology and Evolution}, Pages = {287-98}, Title = {Evolutionary distances between nucleotide sequences based on the distribution of substitution rates among sites as estimated by parsimony}, Volume = 14, Year = 1997} @book{trivedi01, Address = {Chichester}, Author = {K. Trivedi}, Publisher = {Wiley}, Title = {Probability and Statistics with Reliability, Queuing, and Computer Science Applications}, Year = {2001}} @article{tuffley98, Author = {C. Tuffley and M. Steel}, Journal = {Mathematical Biosciences}, Pages = {63-91}, Title = {Modeling the covarion hypothesis of nucleotide substitution}, Volume = 147, Year = 1998} @incollection{vach89, Author = {Werner Vach}, Booktitle = {Conceptual and numerical analysis of data}, Editor = {O. Opitz}, Pages = {230-238}, Publisher = {Springer Verlag}, Title = {Least squares approximation of additive trees}, Year = 1989} @article{wahlberg06, Author = {N. Wahlberg}, Journal = {Systematic Biology}, Title = {That awkward age for butterflies: insights from the age of the butterfly subfamily {N}ymphalinae ({L}epidoptera: {N}ymphalidae)}, Pages = {703-714}, Volume = {55}, Year = {2006}, } @article{wakeley93, Author = {J. Wakeley}, Journal = {J Mol Evol}, Number = 6, Pages = {613-23}, Title = {Substitution rate variation among sites in hypervariable region 1 of human mitochondrial DNA.}, Volume = 37, Year = 1993} @article{wakeley94, Author = {J. Wakeley}, Journal = {Molecular Biology and Evolution}, Pages = {436-442}, Title = {Substitution rate variation among sites and the estimation of transition bias}, Year = 1994} @article{vandepeer04, Author = {Y. Van de Peer}, Journal = {Nature Reviews Genetics}, Pages = {752-763}, Title = {Computational approaches to unveiling ancient genome duplications}, Volume = 5, Year = 2004} @article{vin04, Author = {L. Sy Vinh and A. von Haeseler}, Journal = {Molecular Biology and Evolution}, Pages = {1565-1571}, Title = {{IQPNNI}: Moving Fast Through Tree Space and Stopping in Time}, Volume = 21, Year = 2004} @article{vonhaeseler93, Author = {Arndt Von Haeseler and Gary A. Churchill}, Journal = {J. Mol Evol}, Pages = {77-85}, Title = {Network Models for Sequence Evolution}, Utilisateur = {Guillaume Andrieu}, Volume = 37, Year = 1993} @article{wagner02, Author = {A. Wagner}, Journal = {Genome Biology}, Pages = {1012.1-1012.3}, Title = {Selection and gene duplication : a view from the genome}, Volume = 3, Year = 2002} @phdthesis{waddell95, Author = {P.J. Waddell}, School = {Massey University}, Title = {Statisctical Methods of Phylogenetic Analysis: Including Hadamard Conjugations, LogDet Transforms, and Maximum Likelihood}, Year = 1995} @article{waterman77, Author = {M. S. Waterman and T. F. Smith and M. Singh and W. A. Beyer}, Journal = {Journal of Theoretical Biology}, Pages = {199-213}, Title = {Additive Evolutonary trees}, Utilisateur = {Gilles Caraux et Vincent}, Volume = 64, Year = 1977} @article{waterman78, Author = {M. S. Waterman and T. F. Smith}, Journal = {Journal of Theoretical Biology}, Pages = {789-800}, Title = {On the similarity of dendrograms}, Utilisateur = {Gilles Caraux}, Volume = 73, Year = 1978} @article{whelan01, Author = {S. Whelan and Pietro Li{\`o} and Nick Goldman}, Journal = {Trends in Genetics}, Number = 5, Pages = {262-272}, Title = {Molecular phylogenetics: state-of-the art methods for looking into the past}, Volume = 17, Year = 2001} @article{whelan01b, Author = {S. Whelan and N. Goldman}, Journal = {Molecular Biology and Evolution}, Pages = {691-699}, Title = {A General Empirical Model of Protein Evolution Derived from Multiple Protein Families Using a Maximum-Likelihood Approach}, Volume = 18, Year = 2001} @article{wilkinson95, Author = {M. Wilkinson}, Journal = {Systematic Biology}, Optnumber = {3}, Optpages = {435-439}, Optvolume = {44}, Title = {More on reduced consensus methods}, Year = {1995}} @article{whitley94, Author = {D. Whitley}, Journal = {Statistics and Computing}, Pages = {65-85}, Title = {A Genetic Algorithm Tutorial}, Volume = 4, Year = {1994}} @incollection{williams90, Address = {New York}, Author = {Patrick L. Williams and Walter M. Fitch}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acidsequences}, Chapter = 38, Editor = {Russsell F. Doolittle}, Pages = {615-626}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Phylogeny Determination Using Dynamically Weighted Parsimony Method}, Volume = 183, Year = 1990} @article{suzuki08, title={False-positive results obtained from the branch-site test of positive selection}, author={Suzuki, Yoshiyuki}, journal={Genes \& Genetic Systems}, volume={83}, number={4}, pages={331--338}, year={2008}, publisher={J-STAGE} } @article{nozawa09, title={Reliabilities of identifying positive selection by the branch-site and the site-prediction methods}, author={Nozawa, Masafumi and Suzuki, Yoshiyuki and Nei, Masatoshi}, journal={PNAS}, volume={106}, number={16}, pages={6700--6705}, year={2009}, publisher={National Acad Sciences} } @article{wong04, Author = {W. Wong and Z. Yang and N. Goldman and R. Nielsen}, Journal = {Genetics}, Pages = {1041-1051}, Title = {Accuracy and power of statistical methods for detecting adaptive evolution in protein coding sequences and for identifying positively selected sites}, Volume = {168}, Year = 2004} @article{yang11, title={Statistical properties of the branch-site test of positive selection}, author={Yang, Ziheng and dos Reis, Mario}, journal={Molecular Biology and Evolution}, volume={28}, number={3}, pages={1217--1228}, year={2011}, publisher={SMBE} } @article{yang93, Author = {Z Yang}, Journal = {Molecular Biology and Evolution}, Pages = {1396-1401}, Title = {Maximum-likelihood estimation of phylogeny from {DNA} sequences when substitution rates differ over sites}, Volume = {10}, Year = 1993} @article{yang94, Author = {Z. Yang and N. Goldman and A. Friday}, Journal = {Molecular Biology and Evolution}, Pages = {316-324}, Title = {Comparison of models for nucleotide substitution used in maximum-likelihood phylogenetic estimation.}, Volume = 11, Year = 1994} @article{yang94b, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {306-314}, Title = {Maximum likelihood phylogenetic estimation from {DNA} sequences with variable rates over sites: approximate methods}, Volume = 39, Year = 1994} @article{yang94c, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {105-111}, Title = {Estimating the pattern of nucleotide substitution}, Volume = 10, Year = 1994} @article{yang94d, Author = {Z. Yang}, Journal = {Systematic Biology}, Pages = {329-342}, Title = {Statistical properties of the maximum likelihood method of phylogenetic estimation and comparison with distance matrix methods}, Volume = 43, Year = 1994} @article{yang95a, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {689-697}, Title = {Evaluation of several methods for estimating phylogenetic trees when substitution rates differ over nucleotide sites}, Volume = 40, Year = 1995} @article{yang95b, Author = {Z. Yang}, Journal = {Genetics}, Pages = {993-1005}, Title = {A space-time process model for the evolution of {DNA} sequences}, Volume = 193, Year = 1995} @article{yang96, Author = {Z. Yang and S. Kumar}, Journal = {Molecular Biology and Evolution}, Pages = {650-659}, Title = {Approximate methods for estimating the pattern of nucleotide substitution and the variation of substitution rates among sites}, Volume = 13, Year = 1996} @article{yang98, Author = {Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {568-573}, Title = {Likelihood ratio tests for detecting positive selection and application to primate lysozyme evolution}, Volume = 15, Year = 1998} @article{paml, Author = {Z. Yang}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {555-556}, Title = {{PAML} : a program package for phylogenetic analysis by maximum likelihood}, Volume = 13, Year = 1997} @article{paml4, title={{PAML} 4: phylogenetic analysis by maximum likelihood}, author={Yang, Ziheng}, journal={Molecular Biology and Evolution}, volume={24}, number={8}, pages={1586--1591}, year={2007}, publisher={SMBE} } @article{yang96b, Author = {Z. Yang}, Journal = {Trends in Ecology and Evolution}, Number = 9, Pages = {367-372}, Title = {Among-site rate variation and its impact on phylogenetic analyses}, Volume = 11, Year = 1996} @article{yang96c, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {294-307}, Title = {Phylogenetic analysis using parsimony and likelihood methods}, Volume = 42, Year = 1996} @article{yang97, Author = {Z. Yang}, Journal = {Trends in Ecology and Evolution}, Number = 9, Pages = {357}, Title = {Are big trees indeed easy ?}, Volume = 12, Year = 1997} @article{yang97b, Author = {Z. Yang and B. Rannala}, Journal = {Molecular Biology and Evolution}, Pages = {717-724}, Title = {Bayesian phylogenetic inference using {DNA} sequences: a Markov Chain {M}onte {C}arlo method}, Volume = 14, Year = 1997} @article{yang97c, Author = {Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {105-108}, Title = {How often do wrong models produce better phylogenies?}, Volume = 14, Year = 1997} @article{yang00, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {423-432}, Title = {Maximum likelihood Estimation on large phylogenies and analysis of adaptative evolution in human influenza virus {A}}, Volume = 51, Year = 2000} @article{yang00d, title={Maximum-likelihood analysis of molecular adaptation in abalone sperm lysin reveals variable selective pressures among lineages and sites}, author={Yang, Z. and Swanson, W.J. and Vacquier, V.D.}, journal={Molecular Biology and Evolution}, volume={17}, number={10}, pages={1446--1455}, year={2000}, publisher={SMBE} } @Article{yang06, Author="Yang, Z. and Rannala, B. ", Title="{{B}ayesian estimation of species divergence times under a molecular clock using multiple fossil calibrations with soft bounds}", Journal="Molecular Biology and Evolution", Year="2006", Volume="23", Pages="212--226", Month="Jan" } @book{yang06b, title={Computational molecular evolution}, author={Yang, Z.}, volume={284}, year={2006}, publisher={Oxford University Press Oxford} } @article{pond11, title={A random effects branch-site model for detecting episodic diversifying selection}, author={Kosakovsky Pond, Sergei L and Murrell, Ben and Fourment, Mathieu and Frost, Simon DW and Delport, Wayne and Scheffler, Konrad}, journal={Molecular Biology and Evolution}, volume={28}, number={11}, pages={3033--3043}, year={2011}, publisher={SMBE} } @article{yokoyama96, Author = {S. Yokoyama and R. Yokoyama}, Journal = {Annual Review of Ecology and Systematics}, Pages = {543-567}, Title = {Adaptative evolution of photoreceptors and visual pigments in vertebrates}, Volume = 27, Year = 1996} @article{yang00b, Author = {Z. Yang and R. Nielsen}, Journal = {Molecular Biology and Evolution}, Pages = {32-43}, Title = {Estimating synonymous and nonsynonymous substitution rates under realistic evolutionary models}, Volume = 17, Year = 2000} @article{yang00c, Author = {Z. Yang and R. Nielsen and N. Goldman and A.-M. {Krabbe Pedersen}}, Journal = {Genetics}, Pages = {431-449}, Title = {Codon-substitution models for heterogeneous selection pressure at amino acid sites}, Volume = 155, Year = 2000} @article{yang02, Author = {Z. Yang and R. Nielsen}, Journal = {Molecular Biology and Evolution}, Pages = {908-917}, Title = {Codon-substitution models for detecting molecular adaptation at individual sites along specific lineages}, Volume = 19, Year = 2002} @article{yang05, Author = {Z. Yang and W. Wong and R. Nielsen}, Journal = {Molecular Biology and Evolution}, Pages = {1107-1118}, Title = {Bayes empirical {B}ayes inference of amino acid sites under positive selection}, Volume = 22, Year = 2005} @article{tateno94, Author = {Y. Tateno and N. Takezaki and M. Nei }, Journal = {Molecular Biology and Evolution}, Pages = {261-77}, Title = {Relative efficiencies of the maximum-likelihood, neighbor-joining, and maximum-parsimony methods when substitution rate varies with site.}, Volume = 11, Year = 1994} @article{uzzell71, Author = {T. Uzzell and K. Corbin}, Journal = {Science}, Pages = {1089-1096}, Title = {Fitting discrete probability distributions to evolutionary events}, Volume = 172, Year = 1971} @article{winter02, Author = {K.-U. Winter and H. Saedler and G. Theissen}, Journal = {The Plant Journal}, Pages = {457-475}, Title = {On the origin of class {B} floral homeotic genes: functional substitution and dominant inhibition in {\em \uppercase{A}rabidopsis} by expression of an orthologue from the gymnosperm {\em \uppercase{G}netum}}, Volume = 31, Year = 2002} @article{zahn05, Author = {L. Zahn and J. Leebens-Mack and C. DePamphilis and H. Ma and G. Theissen}, Journal = {Journal of Heredity}, Pages = {225-240}, Title = {To {B} or {N}ot to {B} a flower: the role of {DEFICIENS} and {GLOBOSA} orthologs in the evolution of the angiosperms}, Volume = {96}, Year = {2005}} @article{zaretskii65, Author = {K. Zaretskii }, Journal = {USpekHi Math. Nauk.}, Pages = {90-92}, Title = {Construction d'un arbre sur la base d'un ensemble de distances entre ses feuilles}, Volume = 20, Year = 1965} @article{zharkikh92a, Author = {Andrey Zharkikh and Wen-Hsiung Li }, Journal = {Molecular Biology and Evolution}, Pages = {1119-1147}, Title = {Statistical properties of Bootstrap estimation of phylogenies variability from nucleotide sequences. {I.} Four Taxa with a molecular clock.}, Volume = 9, Year = 1992} @article{zharkikh92b, Author = { Andrey Zharkikh and Wen-Hsiung Li}, Journal = {Journal of Molecular Evolution}, Pages = {356-366}, Title = {Statistical Properties of Bootstrap Estimation of Phylogenetic Variability from Nucleotide Sequences: {II.} Four Taxa without a Molecular Clock}, Volume = 35, Year = 1992} @article{zharkikh93, Author = {A. Zharkikh and W.-H. Li}, Journal = {Systematic Biology}, Pages = {113-125}, Title = {Inconsistency of the Maximum Parsimony Method: The Case of Five Taxa With a Molecular Clock}, Utilisateur = {Vincent}, Volume = 42, Year = 1993} @article{zharkikh94, Author = {A. Zharkikh}, Journal = {Journal of Molecular Evolution}, Pages = {315-329}, Title = {Estimation of evolutionary distance between nucleotide sequences}, Volume = 39, Year = 1994} @article{zharkikh95, Author = {A. Zharkikh and W.-H. Li}, Journal = {Mol. Phylogenet. Evol.}, Number = 1, Pages = {44-63}, Title = {Estimation of confidence in phylogeny: the complete-and-partial bootstrap technique}, Utilisateur = {Vincent et Olivier}, Volume = 4, Year = 1995} @inbook{zuckerkandl62, Address = {Amsterdam}, Author = {E. Zuckerkandl and L. Pauling}, Editor = {M. Kasha and B. Pullman}, Chapter = {Molecular disease, evolution, and genic heterogeneity}, Pages = {189-225}, Publisher = {Elsevier}, Title = {Horizons in Biochemistry}, Year = 1962} @incollection{vach92, Author = {V. Vach}, Booktitle = {Analysing and Modeling Data and Knowledge}, Editor = {M. Shader}, Pages = {141-150}, Publisher = {Springer}, Title = {The Jukes-Cantor Transformation and Additivity of Estimated Genetic Distances}, Year = 1992} @Article{wu85, Author="Wu, C. I. and Li, W. H. ", Title="{{E}vidence for higher rates of nucleotide substitution in rodents than in man}", Journal="PNAS", Year="1985", Volume="82", Pages="1741--1745", Month="Mar" } @phdthesis{garli, Author = {D. Zwickl}, School = {The University of Texas at Austin}, Title = {Genetic algorithm approaches for the phylogenetic analysis of large biological sequence datasets under the maximum likelihood criterion}, Year = {2006}} stephaneguindon-phyml-76a39c8/examples/000077500000000000000000000000001501136442400202205ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/examples/lg4x/000077500000000000000000000000001501136442400210765ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/examples/lg4x/X1.mat000066400000000000000000000035541501136442400221000ustar00rootroot000000000000000.295719 0.067388 0.448317 0.253712 0.457483 2.358429 1.029289 0.576016 0.251987 0.189008 0.107964 1.741924 0.216561 0.599450 0.029955 0.514644 0.736017 0.503084 109.901504 0.084794 4.117654 10.868848 0.704334 0.435271 1.070052 1.862626 0.246260 1.202023 0.380498 5.658311 4.873453 5.229858 0.553477 6.508329 1.634845 0.404968 0.084223 0.123387 0.090748 0.052764 0.151733 0.054187 0.060194 0.048984 0.204296 0.086976 0.221777 0.033310 0.021407 0.230320 0.195703 0.069359 0.069963 0.504221 1.495537 0.188789 93.433377 0.746537 0.621146 0.096955 1.669092 2.448827 0.256662 1.991533 0.091940 0.122332 0.286389 0.382175 0.128905 0.081091 0.352526 0.810168 0.232297 0.228519 0.655465 1.994320 3.256485 0.457430 0.155567 0.235965 0.127321 0.205164 0.590018 0.066081 0.064822 0.241077 6.799829 0.754940 2.261319 0.163849 1.559944 1.671061 6.535048 0.904011 5.164456 0.386853 2.437439 3.537387 4.320442 11.291065 0.170343 0.848067 5.260446 0.426508 0.438856 2.132922 0.525521 0.939733 0.747330 1.559564 0.165666 0.435384 3.656545 0.961142 0.050315 0.064441 0.360946 0.132547 0.306683 4.586081 0.529591 0.303537 0.435450 0.308078 0.606648 0.106333 0.290413 0.290216 0.448965 0.372166 0.102493 0.389413 0.498634 0.109129 2.099355 3.634276 0.115551 0.641259 0.046646 0.260889 0.587531 0.093417 0.280695 0.307466 6.227274 0.206332 0.459041 0.033291 0.559069 18.392863 0.411347 0.101797 0.034710 0.102453 0.289466 0.262076 0.185083 0.592318 0.035149 0.105999 0.096556 20.304886 0.097050 0.133091 0.115301 0.264728 66.647302 0.476350 0.148995 0.063603 20.561407 0.916683 0.102065 0.043986 0.080708 0.885230 0.072549 0.206603 0.306067 0.205944 5.381403 0.561215 0.112593 0.693307 0.400021 0.584622 0.089177 0.755865 0.133790 0.154902 0.147383 0.017579 0.058208 0.017707 0.026331 0.041582 0.017494 0.027859 0.011849 0.076971 0.147823 0.019535 0.037132 0.029940 0.008059 0.088179 0.089653 0.006477 0.032308 0.097931 stephaneguindon-phyml-76a39c8/examples/lg4x/X2.mat000066400000000000000000000035531501136442400221000ustar00rootroot000000000000000.066142 0.590377 0.468325 0.069930 0.013688 2.851667 9.850951 0.302287 3.932151 0.146882 1.101363 1.353957 8.159169 0.249672 0.582670 0.150375 0.028386 0.219934 0.560142 0.005035 3.054085 0.568586 0.037750 0.421974 0.046719 0.275844 0.129551 0.037250 0.051668 0.262130 2.468752 0.106259 0.098208 4.210126 0.029788 0.013513 0.127170 0.016923 0.344765 0.003656 0.445038 0.165753 0.008541 0.002533 0.031779 0.292429 0.064289 0.210724 0.004200 1.217010 1.088704 0.014768 0.005848 0.064558 7.278994 0.071458 0.855973 1.172204 0.014189 0.033969 1.889645 0.125869 0.031390 0.065585 0.029917 0.042762 1.218562 0.079621 0.763553 0.009876 1.988516 3.344809 0.056702 0.021612 0.079927 7.918203 14.799537 0.259400 0.075144 0.011169 0.082464 0.002656 0.681161 0.111063 0.004186 0.004854 0.095591 0.450964 1.506485 0.009457 1.375871 7.169085 0.161937 0.726566 0.040244 0.825960 2.067758 0.110993 0.129497 0.196886 0.169797 0.637893 0.090576 0.457399 0.143327 30.139501 0.276530 11.149790 0.267322 18.762977 3.547017 0.201148 0.976631 0.408834 0.104288 0.123793 0.292108 0.598048 0.328689 3.478333 13.461692 0.161053 4.782635 0.053740 11.949233 2.466507 0.139705 0.053397 0.126088 1.578530 0.641351 0.297913 4.418398 0.125011 2.984862 13.974326 0.021372 0.081472 0.058046 0.006597 0.286794 0.188236 0.009201 0.019475 0.037226 0.015909 0.154810 0.017172 0.239749 0.562720 0.061299 0.154326 0.060703 0.045779 0.036742 0.498072 0.027639 0.534219 0.203493 0.012095 0.004964 0.452302 0.094365 0.140750 0.021976 0.168432 1.414883 0.077470 0.224675 0.123480 0.447011 4.270235 0.030342 0.258487 0.012745 4.336817 0.281953 0.043812 0.015539 0.016212 16.179952 3.416059 0.032578 2.950318 0.227807 1.050562 0.112000 5.294490 0.033381 0.045528 0.063139 0.066357 0.011586 0.066571 0.010800 0.009276 0.053984 0.146986 0.034214 0.088822 0.098196 0.032390 0.021263 0.072697 0.016761 0.020711 0.020797 0.025463 0.045615 0.094372 stephaneguindon-phyml-76a39c8/examples/lg4x/X3.mat000066400000000000000000000035451501136442400221020ustar00rootroot000000000000000.733336 0.558955 0.597671 0.503360 0.058964 5.581680 4.149599 2.863355 1.279881 0.225860 1.415369 2.872594 1.335650 0.434096 1.043232 1.367574 0.258365 0.397108 2.292917 0.209978 4.534772 1.263002 0.366868 1.840061 1.024707 0.823594 0.377181 0.496780 0.994098 2.578946 5.739035 0.821921 3.039380 4.877840 0.532488 0.398817 0.517204 0.358350 0.284730 0.027824 1.463390 0.370939 0.232460 0.008940 0.349195 0.775054 0.672023 0.109781 0.021443 1.983693 1.298542 0.169219 0.043707 0.838324 5.102837 0.763094 5.349861 1.612642 0.088850 0.397640 3.509873 0.755219 0.436013 0.888693 0.561690 0.401070 1.890137 0.691594 0.466979 0.060820 2.831098 2.646440 0.379926 0.087640 0.488389 7.010411 8.929538 1.357738 0.540460 0.063347 0.141582 0.018288 4.102068 0.087872 0.020447 0.064863 1.385133 3.054968 5.525874 0.043394 3.135353 0.200122 0.032875 0.019509 0.042687 0.059723 0.072299 0.023282 0.036426 0.050226 0.039318 0.067505 0.023126 0.012695 0.015631 4.972745 0.821562 4.670980 1.199607 5.901348 1.139018 0.503875 1.673207 0.962470 0.204155 0.273372 0.567639 0.570771 0.458799 0.233109 1.825593 0.580847 1.967383 0.420710 2.034980 0.864479 0.577513 0.124068 0.502294 2.653232 0.437116 1.048288 2.319555 0.151684 0.077004 8.113282 0.450842 0.661866 0.088064 0.037642 2.600668 0.390688 0.109318 0.218118 1.065585 0.564368 1.927515 0.120994 1.856122 4.154750 0.011074 0.377578 0.222293 0.526135 0.265730 0.581928 0.141233 5.413080 0.322761 0.153776 0.039217 8.351808 0.854294 0.940458 0.180650 0.975427 11.429924 0.026268 0.429221 0.273138 4.731579 3.839269 0.395134 0.145401 0.090101 4.193725 0.625409 0.696533 0.104335 0.377304 15.559906 2.508169 0.449074 3.404087 1.457957 0.052132 0.260296 2.903836 0.564762 0.681215 0.062457 0.066826 0.049332 0.065270 0.006513 0.041231 0.058965 0.080852 0.028024 0.037024 0.075925 0.064131 0.019620 0.028710 0.104579 0.056388 0.062027 0.008241 0.033124 0.050760 stephaneguindon-phyml-76a39c8/examples/lg4x/X4.mat000066400000000000000000000035471501136442400221050ustar00rootroot000000000000000.658412 0.566269 0.540749 0.854111 0.058015 3.060574 0.884454 5.851132 1.279257 0.160296 1.309554 2.294145 1.438430 0.482619 0.992259 1.272639 0.182966 0.431464 2.992763 0.086318 2.130054 1.874713 0.684164 2.075952 1.296206 2.149634 0.571406 0.507160 0.552007 3.192521 4.840271 0.841829 5.103188 4.137385 0.351381 0.679853 0.227683 0.528161 0.644656 0.031467 3.775817 0.437589 0.189152 0.025780 0.665865 0.581512 1.128882 0.266076 0.048542 3.954021 2.071689 0.217780 0.082005 1.266791 8.904999 0.695190 3.010922 2.084975 0.132774 0.190734 2.498630 0.767361 0.326441 0.680174 0.652629 0.440178 0.967985 1.012866 0.720060 0.133055 1.776095 1.763546 0.278392 0.343977 0.717301 10.091413 14.013035 1.082703 0.344015 0.227296 0.291854 0.056045 4.495841 0.116381 0.092075 0.195877 4.001286 2.671718 5.069337 0.091278 4.643214 0.978992 0.156635 0.028961 0.209188 0.264277 0.296578 0.177263 0.217424 0.362942 0.086367 0.539010 0.172734 0.121821 0.161015 3.427163 0.878405 4.071574 0.925172 7.063879 1.033710 0.451893 3.057583 1.189259 0.359932 0.742569 0.693405 0.584083 1.531223 1.287474 2.333253 0.802754 2.258357 0.360522 2.221150 1.283423 0.653836 0.377558 0.964545 4.797423 0.780580 1.422571 4.216178 0.599244 0.444362 5.231362 0.154701 0.830884 0.073037 0.094591 3.017954 0.312579 0.074620 0.401252 1.350568 0.336801 1.331875 0.068958 1.677263 5.832025 0.076328 0.548763 0.208791 0.221089 0.431617 1.238426 0.313945 8.558815 0.305772 0.181992 0.072258 12.869737 1.021885 1.531589 0.163829 1.575754 33.873091 0.079916 0.831890 0.307846 5.910440 2.088785 0.456530 0.199728 0.118104 4.310199 0.681277 0.752277 0.241015 0.531100 23.029406 4.414850 0.481711 5.046403 1.914768 0.466823 0.382271 3.717971 0.282540 0.964421 0.106471 0.074171 0.044513 0.096390 0.002148 0.066733 0.158908 0.037625 0.020691 0.014608 0.028797 0.105352 0.007864 0.007477 0.083595 0.055726 0.047711 0.003975 0.010088 0.027159stephaneguindon-phyml-76a39c8/examples/lg4x/lg4x.xml000066400000000000000000000036761501136442400225120ustar00rootroot00000000000000 stephaneguindon-phyml-76a39c8/examples/nexus_example.nxs000066400000000000000000000041771501136442400236400ustar00rootroot00000000000000[ This is a comment ] #NEXUS BEGIN DATA; DIMENSIONS NTAX=10 NCHAR=60; FORMAT DATATYPE=STANDARD INTERLEAVE SYMBOLS="00 01 02 03"; MATRIX tax1 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 03 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax2 01 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 00 00 02 00 00 01 03 00 00 01 01 00 02 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax3 02 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 02 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax4 03 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax5 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 01 01 00 02 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax6 01 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 00 00 02 00 00 00 01 03 00 00 01 01 00 02 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax7 02 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax8 03 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? tax9 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 02 02 00 03 03 03 01 03 03 01 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 03 00 tax10 01 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 03; END; stephaneguindon-phyml-76a39c8/examples/nucleic000066400000000000000000001665431501136442400216040ustar00rootroot0000000000000054 886 tax1 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C---CC tax2 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-TCAC tax3 ?????????? TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TG----TGAT tax4 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T-CC tax5 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAAGC TGG-C----- tax6 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax7 ?T-GCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA --TTGAAATC TGGGC-T--C tax8 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax9 ?????????? TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax10 ????????AG TA-CGGCGAG TGAAGCGGCA ACAGCTCCA- T-TTGAAATC TGG-C-T--C tax11 ?TTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax12 ATTGCCCTAG TA-CGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax13 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax14 ?TTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax15 ?TTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax16 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax17 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA TCAGCTCAAA T-TTGAAATC TGG-C-T--C tax18 ATTGCCCCAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAATC TGG-C--CCC tax19 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax20 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax21 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax22 ATTGCCTTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CCTCTT tax23 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA AAAGCTCAGA T-TTGAAATC TGG-CGTCTT tax24 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-TCTG tax25 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax26 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax27 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T-CC tax28 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CCT-CC tax29 ?TTGCCCTAG TA-CGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax30 ATTGCCCTAG TA-CGGCGAG TGA-GCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax31 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax32 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax33 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax34 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTAAAATC TGG-C-TCTG tax35 ????????AG TA-CGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-TCTC tax36 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CCG-TT tax37 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAAGC TGG-C----- tax38 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAAGC TGG-C----- tax39 ATTGCCTTAG TAACGGCGAG T-AAGC-GCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax40 ?????????? ?????????? ?????????A ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax41 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax42 ATTGCCCTAG TAACGGCGAG T-AAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax43 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax44 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax45 ??TGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax46 ?TTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax47 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax48 ATTGCCCTAG TAACGGCGAG T-AAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax49 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax50 ATAGCCCTAG TAACGGCGAG TGAAGCGGCT ACAGCTCAAA T-TTGAAATC TGG-CCTC-C tax51 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCACAAA T-TTGAAATC TGG-C---TC tax52 ATTGCCCCAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAATC TGG-C---CC tax53 TTCGCCCCAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAATC TGG-C---CC tax54 ???GCCCCAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAATC TGG-C---CC TCTCAG--GG TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GCATTGGTTG TGGTCTAAGT ---------G CCCGAGTTGT AATTTGTAGA GGATGTTTCG GGTGAAGCCG CGGTCCAAGT ---GAAA--G CCCGAGTTGT AATTTGCAGA GGATGTTTCG GGCGAGGCCG CGGTCCAAGT TTT-GG--GG TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GCGTTGGCTG TGGTCTAAGT TT----ATGG CCCGCATTGT AATTTGTAGA GGATGCTTTT AGGCAGCCGC CGGTCTAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GTGTCGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGTGCTTTG GCAAAGGTTG TGGTCTAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATAGGCAG CGATTCAAGT TTT-GG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GAGTTGGCTG CAGCCTAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGTGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCGTTGGGAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCGTTGGCAG CGGTCCAAGT T---GG--GG TCCGAATTGT AATTTGGAGA GGATGTTTTT GGGTGTCCGC CGGCCTAAGT C---GG-C-G TCCGAGTTGT AATCTGTAGA GGATGCCTTT GGGTAGCCAC CGGTCTAAGT TAAAAGA--G TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GTGTTGGTAG CGGTCTAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GGA--G TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GCGTTGGTTG TGGTCTAAGT TTTGGG--GG TCCGAGTTGT AATTTGCAGA GGGTGCTTTG GCATTGGCGG CGGTCTAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCGTTGGCAG CGGTCCAAGT CTCTAG--GG TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GCACTGATGG CGGTCTAAGT TTTGGG--GG TCCGAGTTGT AATTTGCAGA GGATGCTTTG GCATTGGCGG CGGTCTAAGT TA-----CGG TCCGAGTTGT AATTTGTAGA GGATGTTTTG GGTACCGCCC CGGTTTAAAT TT----ATGG TCCGCATTGT AATTTGTAGA GGATGATTTT AGGCAGCCGC CGGTCTAAGT TT----ATGG CCCGCATTGT AATTTGTAGA GGATGCTTTT AGGCAGCCGC CGGTCTAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TCTGGG--GG TCCGAGTTGT AATTTGCAGA GGATGCTTTG GCGTTGGCGG CGGTCTAAGT TTTTA---GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCGTTGGCAG CGGTCCAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GTGTCGGCAG CAGCCTAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GTGTCGGCAG CAGCCTAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GAGTCGGCAG CAGCCTAAGT TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGCCGCCA ACCTTC-GCC CCCTTGGAAC AGGACGTCAT AGAGGGTGAG AACCCCGTAC CTGGCCGCCG GTGCCC--CC CCCTTGGAAC AGGACGTCAT AGAGGGTGAG AACCCCGTAC CTGGCCGCCG GCTCCCC-CC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGCCGCCA GCCTCC-GCC TCCTTGGAAC AGGACGTCAT AGAGGGTGAG AATCCCGTAT GTGACCGGCT -CTGGC-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGCCGCCA ACCCGC-GCT TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTCTT-GCC TCCTTGGAAC AGGTCATCAT AGAGGGTGAG AATCCCGTAT GTGGTTGCAT GCCTTC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATC-GCC TCTTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA TCCTTC-GCC TCTTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTC-GCC CCCTTGGAAC AGGGCGTCAT AGAGGGTGAG AATCCCGTAT GTGGCCGGAA AGGTACC-CT CCCCTGGAAC GGGGTGTCAC AGAGGGTGAG AATCCCGTAT GTGACCGGAA GGGCGCC-CT TCCTTGGAAC AGGACATCAC AGAGGGTGAG AATCCCGTAT GTGGTCGCTA GCCTTC-GCT TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGCCGCCA GCCTCC-GCC TCCTTGGAAC AGGACATCGC AGAGGGTGAG AATCCCGTAC GTGGGCGCCT GCCTTT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTG GCCTTC-GCC TCCTTGGAAC AGGACATCAC AGAGGGTGAG AATCCCGTAT GTGGTCGCTG ATCTTT-GCC TCCTTGGAAC AGGACATCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCCT GCCTTT-GCC TTCTTGGAAC AGAATGTCAA AGAGGGTGAG AGTCCCGTCT TGGACCGCGG TAGGGC-CT- TCCTTGGAAC AGGACGTCAT AGAGGGTGAG AATCCCGTAT GTGACCGGCT -CTGGC-ACC TCCTTGGAAC AGGACGTCAT AGAGGGTGAG AATCCCGTAT GTGACCGGCT -CTGGC-ACC TCCTTGGAAC AGGACGTCAC A-AGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC A-AGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC A-AGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCCTGGAAC AGGACATCGC AGAGGGTGAG AATCCCGTAC GTGGGCGCCT GCCTTC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTG GCCTTC-GCC TCCTTGGAAC AGGTCATCAT AGAGGGTGAG AATCCCGTAT GTGGCTGCTT GTCTTC-ACC TCCTTGGAAC AGGTCATCAT AGAGGGTGAG AATCCCGTAT GTGGCTGCTT GTCTTC-ACC TCCTTGGAAC AGGTCATCAT AGAGGGTGAG AATCCCGTAT GTGGCTGCTT GTCTTC-GCC --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --GCTGTGAA ACTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATTGG-TGG --GCTGTGAA ACTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATTGG-TGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG TTA-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --A-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG C--C-GTAAA ACTCCTTCGA CGAGTCGGGT TGTTTGGGAA TGCAGCCCTA AATGGG-AGG --A-TACATG GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG ---CTGTAAA GCCCCTTCAA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCAA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA ACTCCTTCGA CGAGTCGACT TGTTTGGGAA TGCAGGTCAA AATGGG-TGG TTA-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG TTA-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGGGAGG C-G-TGTAAA GCCCCTTCGA CGAGTCGAGT -GTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA ATTGGG-AGG --G-TGTAAA GCCTCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG TAAATTCCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTCCAT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTCCAT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTTGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCGA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTCCTT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTTGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCAT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCGA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCGA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAA-GCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGA AAAGAGAGTT AAAA-GTACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGA AAAGAGAGTT AAAAAGTACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AAAACTTTGG AAAGAGAGTT AAACAGCATG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGTACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGTACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGA AAAGAGAGTT AAACAGTATG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGTACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT AAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGTACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CACCTCGGC- -TTCTG--CC TTGGGTACTC CGCTTGCGGC CAGACTTGCC TGCGGTTGCT CATCCCGCC- -TTTTG--GC GGGTGCACTC CGCTTGCGGC CAGACTTGCC CGCGGTTGCT CAGCCCGCC- -TTTTG--GC GGGTGCACTC CGCTTGCAGC TAGACGTGCC TTGGGTTGAT CAGCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAAT CAGACTTGGA CTTGGCTGTT CAACAGGTC- -TTCTG--AC CTGCCTATTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT TATCCGGAC- -TTTTG--TC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CACCCGGGC- -CTCTGTGCC CGGTGCATTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CACCCGGGC- -CTCTGTGCC CGGTGCATTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGAC- -TTTTG--TC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCCGC CAGACTTGCT TGCAGTTGCT CACCCGGGCC CTTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC CGTAGTTGCT CATCCGGGC- -TCTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGC- -TCTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC CGCAGTTGCT CATCCGGGG- -TTCT-C-CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TTCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT TATCTGGAC- -TTTTG--TC CAGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT TATCCGGAC- -TTTTG--TC CGGTGCACTC CGCTTGCGAT CAGTCTCGAC GGCGGCCGTT CGGCCTCTC- -TTCTG--AG TGGTTTATTC CGCTTGCAAC CAGACTTGTT GGCGGTGTTC C-GCCGGTC- -TTCTG--AC CGGTCTACTC CGCTTGCCGC CAGACTTGCC TGCAGTTGCT CATCTGGGCA -TTGTG--CC CTGTGCATTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTTTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTTTA--CC CGGTGCACTC CGCTTGCAGC TAGACGTGCC TTGGGTTGAT CAGCCGGAC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC CGCAGTTGCT CACCTAGGC- -TTTCG--CC TGGGGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTCTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTCTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTCTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTCTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCTGGGC- -TTTTG--TC CAGTGCACTC CGCTTGCCGC CAGACTTGCC TGCAGTTGCT CACCTAGGCG -TTCAG--CC TGGGGCACTC CGCTTGCAGC CAGACTTGCC CGCAGTTGCT CACCCAGGC- --TTTG-GCC CGGGGCACTC CGCTGGCAAC CAGACTCGTG CGCGGG-GTT CCCCCTTGC- -TTCTG--CT TGGGTCACTT CGCTTGCAAT CAGACTTGGA CTTGGCTGTT CAACAGGTC- -TTCTG--AC CTGCCTATTC CGCTTGCAAT CAGACTTGGA CTTGGCTGTT CAACAGGTC- -TTCTG--AC CTGCCTATTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTTCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTT---CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACGTGCC CGCAGTTGCT CACCCAGGC- --TCCGG-CC TGGGGCACTC CGCTTGCAGC CAGACTTGCC CGTAGTTGCT CATCCAGGC- -TTTTG---C CTGTGCACTC CGCTTGCAGC CAGACGTGCC CGTAGTTGCT CATCTGGGG- -TTTTC--CC CAGTGTATTC CGCTTGCAGC CAGACGTGCC CGTAGTTGCT CATTCGGGG- -TTCTC--CC CGATGTACTC CGCTTGCAGC CAGACGTGCC CGCAGTTGCT CATCCGGGG- -ATTTC--CC CGGTGCACTC TTCTACGGGC AGGCCAGCAT CAGTCCGGGC GGTTGGATAA ATGCCTGCTA AATGTACCTC TTCCGCAGTC AGGCCAGCAT CGGTTTGGGC GGTCGGATAA AGGCGCTGGG AACGTGGCCT TTCCGCGGTC AGGCCAGCAT CGGTTCGGGC GGTCGGATAA AGGCGACGGG AACGTGGCCT TTCCTTTGGC AGGCCAGCAT CAGTTTGGGC GGCTGGATAA AGGTCTGTTA AACGTGACTC AGTCTTGTCC AGGCCAGCAT CAGTTTCGGC GGCCGGATAA AGGCCCTAGG AATGTGGCTT TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CATGTACCTC TTCTGCGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTATGGGC AGGCCAGCAT CAGTCTTGGC GGTCGGATAA ATGCGTGCTA AACGTACCTC TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTGTGGGC AGGCCAGCAT CAGTTCGGGC GGTTGGAGAA AGACCTGTGT CATGTAGCTG TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGCTTTTGG AATGTGGCTC TTCTGCGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTGCGGGC AGGCCAGCAT CAGTTTAGGC GGTTGGATAA AGGTCTCTAT CACGTACCTC GGTCGCCGCC GGGCCAGCAT CAGTTTCGGC GGTTGGATAA AGGTTGTGGG AATGTGGCCC ACC-GTCTGC AGGCCAGCAT CATCTGGGAC CGCTGGATAA AAGCGGAGGG AATGTGGCTC TTCTGCAAGC AGGCCAGCAT CAGTTTAGAC AGTCAGATAA GGGTCTCTGT CATGTATCTT TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCCTTTGGC AGGCCAGCAT CAGTTTGGGC GGCTGGATAA AGGTCTGTTA AACGTGACTT TTCTGCGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGCCTCTGT CACGTATCTC TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTATAGGC AGGCCAGCAT CGGGGTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTACAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC AGCCGGATAA AGGTCTCTGA CACGTTCCTA TTCTGCGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGCCTCTGT CACGTATCTC CCCCGTGTCC GGGCCATCAT CAGTTTCGGG GGCCGGTTAA AGGCCTTGGG AATGTATCCA AGTCTTGTCC AGGCCAGCAT CAGTTTGGGC GGCCGGATAA AGGCTTTGGG AATGTGGCTT AGTCTTGTCC AGGCCAGCAT CAGTTTCGGC GGCCGGATAA AGGCCCTAGG AATGTGGCTT TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGA CACGTTCCTT TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGGTAA AGGTCTCTGT CACGT-CCTC CTCTGCAGGC AG-CCAGCAT CAGTTTGG-C GGTGGGATAA AGGTCTTTGA CACGTTCCTT TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGA CACGTTCCTT TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGA CACGTTCCTT TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCAT TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCT-TGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGA CACGTTCCTT TTCTGCGGGC AGGCCAGCAT CGGTTCGGGC GGTCGGATAA AGGTCTCTGT CACGTACCTC TTCTATGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CA???????? TTCTATGGGC AGGCCAGCAT CAGTTCGGGC GGTTGGAGAA AGACCTGTGT CACGTAGCTC TTCTATGGGC AGGCCAGCAT CAGTTCGGGC GGTTGGAGAA AGACCTGTGT CACGTAGCTC TTCTGTGGGC AGGCCAGCAT CAGTTCGGGC GGTTGGAGAA AGACCTGTGT CACGTAGCTC TC--CTCGGG G----A--GG A-CTTATAGG GTAGGC-GGC ATACAACCAG CCTGGACTGA CCC-CTCGGG G--AG---GT G--TTATAGC CCGGCGCGCA ATGCGACCAG CCCGGACCGA CCC-CTCGGG G--AG---GT G--TTATAGC CCGGCGCGCA ATGCGGCCAG CCCGGACCGA CC--TTCGGG G----A--GA G-CTTATAGG GCAGAC-GAC ATGCAGCCAG TCCGAACTGA TCCCTTCGGG GG-A-A--GT G--TTATAGC CTAGGGTGTA ATACGGCCAG CTGGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACCACCAG CCTAGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGACGGAC ATGCAACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG A-CTTATAGG GCACGC-GGC ATACGACCAG CCGGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACAACCAG CCTAGACTGA TT--CTCGGG C----A--GT G--TTATAGG GCAGGTTGGA ATGCAACCAG CTCGAACTGA TC--TTCGGG G----A--GG -CCTT-TAGG GGAAGGTGTA ATACCACCAG CTGGGACTGA CT--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATGCAACCAG CCTGGACTGA CC--TTCGGG GTT-----GG -CCTTATAGG GGAGAC-GAC ATGCAACCAG CCTGAACTGA C---CTCGGG GG-------T G--TTATAGC CCACTTCGTA ATACAACCAG CTGGGACTGA C---TCCGGG ---A----GT G--TTATAGC CCTCTGTGTA ATACAGCGAG TCCCGGGTGA TC--TTCGGA A------TGA -CCTTATAGG GGGGGC-GTA GTATGGCTAG TCTAGACTGA TC--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCCGGACTGA TC--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCCGGACTGA CC--TTCGGG G----A--GA G-CTTATAGG GTAGAC-GAC ATGCAGCCAG CCTGAACTGA CC--TTCGGG GT------GA -CCTTATAGG GGAGGC-GCA ATGCAACCAG CCCGGACTGA CT--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCCGGACTGA CT--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCCGGACTGA CT--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCTGGACTGA CT--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCTGGACTGA CC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATGCAACCAG CCTGGACTGA CC--TTTGTG -T---A--GG -CCATATAGG GGAGAC-GTC ATGCGGTTAG CCTGGACTGA CC--TTCGGG GT------GA -CCTTATAGG GGAGGC-GCA ATGCAACCAG CCCGGACTGA CGCCTTCGGG GG-----TG- GACTTATAGC CCAGGGTGTC ATGCGGCCAC CCGGGACTGA TCT-TCCGGG GG-A-A--GT ---TTATAGG --AAGGTGTA ATACGGCCAG CTGGGACTGA TCCCTTCGGG GG-A-A--GT G--TTATAGC CTAGGGTGTA ATACGGCCAG CTGGGACTGA CC--TTCGGG -TT-----GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG A-CTTATAGG GGAGGC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGCC-AC ATACCACCAG CCTGGACTGA CC--TTCGGG -TT-----G- -CCATATAGG G-AGAC-GTC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA CC--TTCGGG -TT-----GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA CC--TTCGGG -TT-----GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA CC--TTCGGG -----AT-GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA CC--TTCGGG -TT-----GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA CC--TTCGGG GT------GG -CCTTATAGG GGAGAC-GCA ATGCGACCAG CCCGGACCGA ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? CT--TTCGGG G----A--GT G--TTATAGG GCAGGT-GGA ATGCAACCAG CCTGAACTGA TC--TTCGGG G----A--GT G--TTATAGG GCAGGT-GGA ATGCAACCAG CCTGAACTGA TC--TTCGGG G----A--GT G--TTATAGG GCAGGT-GGA ATGCAACCAG CCTGAACTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTTCGCGC- TTT----GCT AGGATGCTGG CGTAATGGCC GT-AAGC-GG CCCGTCTTGA GGTTCGCGC- TCT----GCT AGGATGCTGG CGTAATGGCC GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATAGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CGTAATGGTT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA T-T----GCT AGGATGCTGG CGTAAGGGCT GT--AGC-GG -CCGTCTTGA GGTCCGCGCA TTT--ATGCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TTT--ATGCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TTT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TTTTT-TGCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TTC--GTGCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCC-CGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TCT----GCT AGGATGCTGG CGTAATGGCT GTCAAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CAAAATGGTC GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CGTAATGGTC GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TTT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CATAATAGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AA-CGGG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TT-----GCT AGGATGCTGG CGTAATGGCT G-CAAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGAACGCGCT TC---G-GCG AGGATGATGG CGTAATGGTT GTC-AGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CGTAATGGTT GTCAAGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CGTAATGGTT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGAGCA TCT----GCT AGGA-GCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTG- CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GG-CCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCC AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTAAAG CCCGGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAA CCCGTGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAA CCCGTGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGGGAC CAAGGAGTC- TAACATCTAT GCGAGTGTTA GGGTGTCAAA CCCTTACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC C-----GT-- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCAGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCAGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCAGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAC GCGAGTGTTC GGGTGTCAAA CCCGTGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTC GGGTGTCAAA CCCCTACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGGGCGCA AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGGGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGGGAC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTC GGGTGTCAAA CCCTTGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTA GGGTGTCAAA CCCTTACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTA GGGTGTCAAA CCCTTACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTAAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGGGCGCG ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG CAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCGC -----AAGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACC-G CA---A-GGT GCACCATC-G ACCGATCCTG TAATGAAAGT AAACGGAGG- TGGGAACCCT TT----GGGT GCACCACC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGAGAACCCG CA---AGGGT GCATCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCT TT----GGGT GCACCATCCG ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TT---A-GGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TT---A-GGT GCACCATC-G ACCGATCCTG CAATGAAAGT GAACGGAGG- TGGGATCCCG CA---AGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TT---A-GGT GCACCATC-G ACCGATCCTG TAATAAAAGT GAACGGAGG- TGGGAACCTT TTT----GGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT AAACGTAGG- TGGGAACCTT TT---A-GGT GCACCATC-G ACCGATCTTG CAATGAAAGT GAACGGAGG- TGGGAACC-G CA---A-GGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGGG TGGGAACCTT TC---G???? ?????????? ?????????? TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGACCCCT TTT--AGGGT GCACCATC-G ACCGATCCTG CAATAAACGT GAACGGAGG- TGGGAACCCT CTTTGGGGGT GCACCATC-G ACCGATCCTG CAATGAAAGT GAACGGAGG- TGGGAACCCT TTT---GGGT GCACCATC-G ACCGATCCTG GAATGAAAGT GAACGGAGG- TAGGAAGGCT TA---AGCCT GCACTATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGAGAACCCG CA---AAGGT GCATCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGAGAACCCG CA---AGGGT GCATCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG CAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGC GCACCATC-G ACCGATCCTG ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG AAGTTTACGG ATGGATTTGA GTATGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTTTTCGG ATGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCGT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCGTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCGTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA -GGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTCCGCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGGATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCGTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCA?? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAGGC CAGAGGAAAC TCTGGTGGAG GCT??????? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCT??????? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG?? ?????????? ?????????? ?????????? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGCGTATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAA?? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAA??? TGCAAATCGA TCGTCAAATT TGGGC????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGA? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGA? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAG?? ?????? TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAG?? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G????????? ?????? TGCAAATCGA TCGTCAAATT TGCGTATAGG GGCGAAAG?? ?????? TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG stephaneguindon-phyml-76a39c8/examples/phyrex/000077500000000000000000000000001501136442400215375ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/examples/phyrex/flu.xml000066400000000000000000000216331501136442400230540ustar00rootroot00000000000000 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 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 stephaneguindon-phyml-76a39c8/examples/phyrex/h1n1.nxs000066400000000000000000002112461501136442400230460ustar00rootroot00000000000000#NEXUS BEGIN DATA; DIMENSIONS NTAX=36 NCHAR=1434; FORMAT DATATYPE=DNA INTERLEAVE; MATRIX CY130177|South_Carolina|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647978|Idaho|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648268|New_Mexico|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648064|North_Carolina|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647995|New_Hampshire|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648000|Colorado|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648133|Florida|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648145|Georgia|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648155|Vermont|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAACCT KF648158|Utah|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648159|Louisiana|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648008|Rhode_Island|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648011|New_York|12_13|H1N1 ---------ATGAATCCAAA CCGAAAGATAATAACCATTG GTTCGGTCTGCATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647921|Maryland|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647926|Missouri|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647928|Texas|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647936|Wyoming|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCCAACTTAATATT ACAAATTGGAAACATAATCT KF648197|Indiana|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAATATAACCT KF648228|Mississippi|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648239|Tennessee|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648034|Arizona|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648037|Kentucky|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648038|Kansas|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647919|Alabama|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647931|Wisconsin|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647932|Pennsylvania|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647958|Nebraska|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647971|Oklahoma|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647902|Iowa|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648002|Minnesota|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648040|New_Jersey|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648101|Ohio|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648260|Washington|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT CY170697|California|12_13|H1N1 GAGTTTAAAATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT CY168881|Massachusetts|12_13|H1N1 GAGTTTAAAATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT CY171161|Illinois|12_13|H1N1 GAGTTTAAAATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGATCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT CY130177|South_Carolina|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTAGGAATCAAAA TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647978|Idaho|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648268|New_Mexico|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648064|North_Carolina|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647995|New_Hampshire|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648000|Colorado|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGAAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTACGAA AACAACACTTGGGTAAATCA KF648133|Florida|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648145|Georgia|12_13|H1N1 CAATATGGGTTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648155|Vermont|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648158|Utah|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648159|Louisiana|12_13|H1N1 CAATATGGGTTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648008|Rhode_Island|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648011|New_York|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647921|Maryland|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647926|Missouri|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647928|Texas|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAA TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647936|Wyoming|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTATGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648197|Indiana|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648228|Mississippi|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648239|Tennessee|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648034|Arizona|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648037|Kentucky|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648038|Kansas|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647919|Alabama|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647931|Wisconsin|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647932|Pennsylvania|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647958|Nebraska|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647971|Oklahoma|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647902|Iowa|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648002|Minnesota|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648040|New_Jersey|12_13|H1N1 CAATATGGGTTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAACGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648101|Ohio|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648260|Washington|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA CY170697|California|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA CY168881|Massachusetts|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA CY171161|Illinois|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA CY130177|South_Carolina|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647978|Idaho|12_13|H1N1 GACATATGTTAACATCAGCA ATACCAACTTTGCTGTTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648268|New_Mexico|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648064|North_Carolina|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647995|New_Hampshire|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648000|Colorado|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648133|Florida|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648145|Georgia|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648155|Vermont|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648158|Utah|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648159|Louisiana|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648008|Rhode_Island|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648011|New_York|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647921|Maryland|12_13|H1N1 GACATATGTTAACATCAGTA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647926|Missouri|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAATTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647928|Texas|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647936|Wyoming|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648197|Indiana|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648228|Mississippi|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648239|Tennessee|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648034|Arizona|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648037|Kentucky|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648038|Kansas|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647919|Alabama|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647931|Wisconsin|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647932|Pennsylvania|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647958|Nebraska|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647971|Oklahoma|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGCCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647902|Iowa|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648002|Minnesota|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648040|New_Jersey|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGTGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648101|Ohio|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGCCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648260|Washington|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG CY170697|California|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGCCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG CY168881|Massachusetts|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG CY171161|Illinois|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCAGCTGGA CAGTCAGTGGTTTCTGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGGTGG CY130177|South_Carolina|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTATAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647978|Idaho|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648268|New_Mexico|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648064|North_Carolina|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647995|New_Hampshire|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648000|Colorado|12_13|H1N1 GCTATATACAGCAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648133|Florida|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648145|Georgia|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648155|Vermont|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648158|Utah|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648159|Louisiana|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648008|Rhode_Island|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648011|New_York|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647921|Maryland|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647926|Missouri|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647928|Texas|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTATAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647936|Wyoming|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTATAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648197|Indiana|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648228|Mississippi|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648239|Tennessee|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648034|Arizona|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648037|Kentucky|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648038|Kansas|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647919|Alabama|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647931|Wisconsin|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647932|Pennsylvania|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647958|Nebraska|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647971|Oklahoma|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647902|Iowa|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648002|Minnesota|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648040|New_Jersey|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648101|Ohio|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648260|Washington|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA CY170697|California|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA CY168881|Massachusetts|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA CY171161|Illinois|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTATAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA CY130177|South_Carolina|12_13|H1N1 CCTTCTTCTTGACCCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647978|Idaho|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648268|New_Mexico|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648064|North_Carolina|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647995|New_Hampshire|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCATTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648000|Colorado|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648133|Florida|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648145|Georgia|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648155|Vermont|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648158|Utah|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648159|Louisiana|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648008|Rhode_Island|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648011|New_York|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAGG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647921|Maryland|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647926|Missouri|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647928|Texas|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC TTAATGAGCTGTCCTATTGG KF647936|Wyoming|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648197|Indiana|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648228|Mississippi|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648239|Tennessee|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648034|Arizona|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648037|Kentucky|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648038|Kansas|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCTTATTGG KF647919|Alabama|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647931|Wisconsin|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647932|Pennsylvania|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647958|Nebraska|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647971|Oklahoma|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647902|Iowa|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648002|Minnesota|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648040|New_Jersey|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648101|Ohio|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648260|Washington|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG CY170697|California|12_13|H1N1 CCTTTTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG CY168881|Massachusetts|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG CY171161|Illinois|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG CY130177|South_Carolina|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647978|Idaho|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648268|New_Mexico|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648064|North_Carolina|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647995|New_Hampshire|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648000|Colorado|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATTAATTGGC TAACAATTGGAATTTCTGGC KF648133|Florida|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648145|Georgia|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648155|Vermont|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648158|Utah|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648159|Louisiana|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648008|Rhode_Island|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648011|New_York|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647921|Maryland|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647926|Missouri|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647928|Texas|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647936|Wyoming|12_13|H1N1 TGAAGTTCCCTCCCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648197|Indiana|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648228|Mississippi|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648239|Tennessee|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648034|Arizona|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648037|Kentucky|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648038|Kansas|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647919|Alabama|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647931|Wisconsin|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647932|Pennsylvania|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647958|Nebraska|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647971|Oklahoma|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647902|Iowa|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648002|Minnesota|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648040|New_Jersey|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648101|Ohio|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648260|Washington|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC CY170697|California|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC CY168881|Massachusetts|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC CY171161|Illinois|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC CY130177|South_Carolina|12_13|H1N1 CCAGACAATGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAATAATATATT GAGAACACAAGAATCTGAAT KF647978|Idaho|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACGATATATT GAGAACACAAGAGTCTGAAT KF648268|New_Mexico|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATAGT GAGAACACAAGAGTCTGAAT KF648064|North_Carolina|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647995|New_Hampshire|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648000|Colorado|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAATCTGAAT KF648133|Florida|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648145|Georgia|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGRAAAATAATATATT GAGAACACAAGAGTCTGAAT KF648155|Vermont|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF648158|Utah|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648159|Louisiana|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648008|Rhode_Island|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648011|New_York|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647921|Maryland|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647926|Missouri|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647928|Texas|12_13|H1N1 CCAGACAATGGGGCAGTTGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647936|Wyoming|12_13|H1N1 CCAGACAATGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAATAATATATT GAGAACACAAGAATCTGAAT KF648197|Indiana|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF648228|Mississippi|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648239|Tennessee|12_13|H1N1 CCAGACAGTGGGGCAGTTGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648034|Arizona|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648037|Kentucky|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF648038|Kansas|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF647919|Alabama|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647931|Wisconsin|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647932|Pennsylvania|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF647958|Nebraska|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF647971|Oklahoma|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACGATATATT GAGAACACAAGAGTCTGAAT KF647902|Iowa|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648002|Minnesota|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648040|New_Jersey|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648101|Ohio|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACGATATATT GAGAACACAAGAGTCTGAAT KF648260|Washington|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT CY170697|California|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACGATATATT GAGAACACAAGAGTCTGAAT CY168881|Massachusetts|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT CY171161|Illinois|12_13|H1N1 CCAGACAATGGGGCAGTGGC TGTGTTAAAGTACAACGGCG TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT CY130177|South_Carolina|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647978|Idaho|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648268|New_Mexico|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648064|North_Carolina|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647995|New_Hampshire|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648000|Colorado|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648133|Florida|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648145|Georgia|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF648155|Vermont|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF648158|Utah|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648159|Louisiana|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648008|Rhode_Island|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648011|New_York|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647921|Maryland|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647926|Missouri|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647928|Texas|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAAA ATAGAAAAGGGAAAGATAGT KF647936|Wyoming|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648197|Indiana|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF648228|Mississippi|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648239|Tennessee|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648034|Arizona|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648037|Kentucky|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF648038|Kansas|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF647919|Alabama|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647931|Wisconsin|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647932|Pennsylvania|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF647958|Nebraska|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF647971|Oklahoma|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647902|Iowa|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648002|Minnesota|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648040|New_Jersey|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648101|Ohio|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648260|Washington|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT CY170697|California|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACTGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT CY168881|Massachusetts|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT CY171161|Illinois|12_13|H1N1 GTGCATGTGTAAATGGTTCA TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT CY130177|South_Carolina|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647978|Idaho|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648268|New_Mexico|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTACCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648064|North_Carolina|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647995|New_Hampshire|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648000|Colorado|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648133|Florida|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648145|Georgia|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648155|Vermont|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCATATGTG TGTGCAGGGATAACTGGCAT KF648158|Utah|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648159|Louisiana|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648008|Rhode_Island|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAATTGGCAT KF648011|New_York|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCAAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647921|Maryland|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647926|Missouri|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647928|Texas|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647936|Wyoming|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648197|Indiana|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648228|Mississippi|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648239|Tennessee|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648034|Arizona|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648037|Kentucky|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648038|Kansas|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647919|Alabama|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647931|Wisconsin|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647932|Pennsylvania|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647958|Nebraska|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647971|Oklahoma|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647902|Iowa|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648002|Minnesota|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648040|New_Jersey|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648101|Ohio|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648260|Washington|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT CY170697|California|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT CY168881|Massachusetts|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAATTGGCAT CY171161|Illinois|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT CY130177|South_Carolina|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCCAATGATA KF647978|Idaho|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648268|New_Mexico|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648064|North_Carolina|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647995|New_Hampshire|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648000|Colorado|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648133|Florida|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648145|Georgia|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648155|Vermont|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648158|Utah|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648159|Louisiana|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648008|Rhode_Island|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648011|New_York|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGAAAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647921|Maryland|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647926|Missouri|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647928|Texas|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647936|Wyoming|12_13|H1N1 GGCTCGAATCGACCGTGGGT TTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGTCCTAATGATA KF648197|Indiana|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648228|Mississippi|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648239|Tennessee|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATAAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648034|Arizona|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648037|Kentucky|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648038|Kansas|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF647919|Alabama|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647931|Wisconsin|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647932|Pennsylvania|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF647958|Nebraska|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF647971|Oklahoma|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647902|Iowa|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAATCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648002|Minnesota|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATR TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648040|New_Jersey|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648101|Ohio|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648260|Washington|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA CY170697|California|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA CY168881|Massachusetts|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA CY171161|Illinois|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA CY130177|South_Carolina|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647978|Idaho|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648268|New_Mexico|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648064|North_Carolina|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647995|New_Hampshire|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648000|Colorado|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648133|Florida|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648145|Georgia|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648155|Vermont|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648158|Utah|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648159|Louisiana|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648008|Rhode_Island|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648011|New_York|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647921|Maryland|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647926|Missouri|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647928|Texas|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTGTCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647936|Wyoming|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648197|Indiana|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648228|Mississippi|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648239|Tennessee|12_13|H1N1 AGACAGGTAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648034|Arizona|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTCTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648037|Kentucky|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648038|Kansas|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647919|Alabama|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTCTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647931|Wisconsin|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647932|Pennsylvania|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647958|Nebraska|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647971|Oklahoma|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647902|Iowa|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648002|Minnesota|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648040|New_Jersey|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648101|Ohio|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648260|Washington|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG CY170697|California|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG CY168881|Massachusetts|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG CY171161|Illinois|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG CY130177|South_Carolina|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AACGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647978|Idaho|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648268|New_Mexico|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648064|North_Carolina|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647995|New_Hampshire|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648000|Colorado|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648133|Florida|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648145|Georgia|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648155|Vermont|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648158|Utah|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648159|Louisiana|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCG AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648008|Rhode_Island|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648011|New_York|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647921|Maryland|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647926|Missouri|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647928|Texas|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AACGGATGGACTGGGACAGA CAATAGCTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647936|Wyoming|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AACGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648197|Indiana|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648228|Mississippi|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATGAAT KF648239|Tennessee|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648034|Arizona|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648037|Kentucky|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648038|Kansas|12_13|H1N1 CATTGGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647919|Alabama|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647931|Wisconsin|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647932|Pennsylvania|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647958|Nebraska|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647971|Oklahoma|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647902|Iowa|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648002|Minnesota|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648040|New_Jersey|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCG AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648101|Ohio|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648260|Washington|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT CY170697|California|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT CY168881|Massachusetts|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT CY171161|Illinois|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AACGGATGGACTGGGACAGA CAATAACTTCTCAACAAAGC AAGATATCGTAGGAATAAAT CY130177|South_Carolina|12_13|H1N1 GAGTGGTCAGGATACAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGACGAC KF647978|Idaho|12_13|H1N1 GAGTGGACAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAATTAATCAGAGGGCGAC KF648268|New_Mexico|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648064|North_Carolina|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647995|New_Hampshire|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648000|Colorado|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648133|Florida|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648145|Georgia|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648155|Vermont|12_13|H1N1 GAATGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648158|Utah|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648159|Louisiana|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648008|Rhode_Island|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648011|New_York|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647921|Maryland|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647926|Missouri|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647928|Texas|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGACTGT ATAAGACCTTGTTTCTGGGT TGAACTAATCAGAGGGCGAC KF647936|Wyoming|12_13|H1N1 GAGTGGTCAGGATACAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGACGAC KF648197|Indiana|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648228|Mississippi|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648239|Tennessee|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648034|Arizona|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648037|Kentucky|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648038|Kansas|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647919|Alabama|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647931|Wisconsin|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAATTAATCAGAGGGCGAC KF647932|Pennsylvania|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647958|Nebraska|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647971|Oklahoma|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647902|Iowa|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648002|Minnesota|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648040|New_Jersey|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648101|Ohio|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648260|Washington|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC CY170697|California|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC CY168881|Massachusetts|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC CY171161|Illinois|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGAGAC CY130177|South_Carolina|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647978|Idaho|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648268|New_Mexico|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648064|North_Carolina|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647995|New_Hampshire|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648000|Colorado|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648133|Florida|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648145|Georgia|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648155|Vermont|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648158|Utah|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648159|Louisiana|12_13|H1N1 CCGAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648008|Rhode_Island|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648011|New_York|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647921|Maryland|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647926|Missouri|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647928|Texas|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG GCACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647936|Wyoming|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC TTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648197|Indiana|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648228|Mississippi|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648239|Tennessee|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648034|Arizona|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648037|Kentucky|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648038|Kansas|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647919|Alabama|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647931|Wisconsin|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647932|Pennsylvania|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647958|Nebraska|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCCTGG CCAGACGGTGCTGAGTTGCC KF647971|Oklahoma|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647902|Iowa|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648002|Minnesota|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648040|New_Jersey|12_13|H1N1 CCGAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTTGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648101|Ohio|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648260|Washington|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC CY170697|California|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC CY168881|Massachusetts|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC CY171161|Illinois|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC CY130177|South_Carolina|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647978|Idaho|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648268|New_Mexico|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648064|North_Carolina|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647995|New_Hampshire|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648000|Colorado|12_13|H1N1 ATTTGCCATTGACAAGTAA- -------------- KF648133|Florida|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648145|Georgia|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648155|Vermont|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648158|Utah|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648159|Louisiana|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648008|Rhode_Island|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648011|New_York|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647921|Maryland|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647926|Missouri|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647928|Texas|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647936|Wyoming|12_13|H1N1 ATTTATCATTGACAAGTAA- -------------- KF648197|Indiana|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648228|Mississippi|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648239|Tennessee|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648034|Arizona|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648037|Kentucky|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648038|Kansas|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647919|Alabama|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647931|Wisconsin|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647932|Pennsylvania|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647958|Nebraska|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647971|Oklahoma|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647902|Iowa|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648002|Minnesota|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648040|New_Jersey|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648101|Ohio|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648260|Washington|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- CY170697|California|12_13|H1N1 ATTTACCATTGACAAGTAAT TTGTTCA------- CY168881|Massachusetts|12_13|H1N1 ATTTACCATTGACAAGTAAT TTGTTCAAAAAACT CY171161|Illinois|12_13|H1N1 ATTTACCATTGACAATTAAT TTGTTCAAAAAACT ; END; stephaneguindon-phyml-76a39c8/examples/phyrex/usa_coord.txt000066400000000000000000000033701501136442400242610ustar00rootroot00000000000000# state.name lon lat |SouthWest| -122 25 |NorthEast| -66 49 |Alabama| -86.902298 32.3182314 |Alaska| -149.4936733 64.2008413 |Arizona| -111.0937311 34.0489281 |Arkansas| -91.8318334 35.20105 |California| -119.4179324 36.778261 |Colorado| -105.7820674 39.5500507 |Connecticut| -73.087749 41.6032207 |Delaware| -75.5276699 38.9108325 |Florida| -81.5157535 27.6648274 |Georgia| -82.9000751 32.1656221 |Hawaii| -155.5827818 19.8967662 |Idaho| -114.7420408 44.0682019 |Illinois| -89.3985283 40.6331249 |Indiana| -86.1349019 40.2671941 |Iowa| -93.097702 41.8780025 |Kansas| -98.4842465 39.011902 |Kentucky| -84.2700179 37.8393332 |Louisiana| -91.9623327 30.9842977 |Maine| -69.4454689 45.253783 |Maryland| -76.6412712 39.0457549 |Massachusetts| -71.3824374 42.4072107 |Michigan| -85.6023643 44.3148443 |Minnesota| -94.6858998 46.729553 |Mississippi| -89.3985283 32.3546679 |Missouri| -91.8318334 37.9642529 |Montana| -110.3625658 46.8796822 |Nebraska| -99.9018131 41.4925374 |Nevada| -116.419389 38.8026097 |New_Hampshire| -71.5723953 43.1938516 |New_Jersey| -74.4056612 40.0583238 |New_Mexico| -105.8700901 34.5199402 |New_York| -74.0059413 40.7127837 |North_Carolina| -79.0192997 35.7595731 |North_Dakota| -101.0020119 47.5514926 |Ohio| -82.907123 40.4172871 |Oklahoma| -97.5164276 35.4675602 |Oregon| -120.5542012 43.8041334 |Pennsylvania| -77.1945247 41.2033216 |Rhode_Island| -71.4774291 41.5800945 |South_Carolina| -81.1637245 33.836081 |South_Dakota| -99.9018131 43.9695148 |Tennessee| -86.5804473 35.5174913 |Texas| -99.9018131 31.9685988 |Utah| -111.0937311 39.3209801 |Vermont| -72.5778415 44.5588028 |Virginia| -78.6568942 37.4315734 |Washington| -77.0368707 38.9071923 |West_Virginia| -80.4549026 38.5976262 |Wisconsin| -88.7878678 43.7844397 |Wyoming| -107.2902839 43.0759678 stephaneguindon-phyml-76a39c8/examples/phytime/000077500000000000000000000000001501136442400216775ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/examples/phytime/dating_example.xml000066400000000000000000000043101501136442400254000ustar00rootroot00000000000000 40 60 50 200 stephaneguindon-phyml-76a39c8/examples/phytime/seq.txt000066400000000000000000003035131501136442400232350ustar00rootroot0000000000000022 4533 Nymphaeales_Cabomba tcaaagattaagccatgcatgtgtaagtatgaacaagttcagaccgtgaaactgcgaatggctcattaaatcagttataatttgtttgatggtact-tactactcggataaccgtagtaaagctagagctaatacgtgcaccaaaccccgac-ttctggaaggggcgcatttattagataaaaggccgatgcgggctt-tgcccgatttattggtgattcatgataactcgacggatcgcacggccctcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtagtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaatacataacaataccgggctc-tttgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggttggtccggccggtccgcctcc--ggtgtgcaccggtcgtctcgtcccttctaccggcgtcgcgttcctggccttaactggccgggtcgtgccttcggtgctgttactttgaagaaattagagtgctcaaagcaagcttacgctgtgcatacattagcatgggataacatcacaggatttcggtcctattgtgttggcctttgggatcggagtaatgattaagagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggcggatgttgctcttaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgtggaggt-acccttccacggccagcttcttagacggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtt-tatagccttggccgacaggtccgggtaatcttgg-aaactacatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgtgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgggggcggtccgccgcctacgacgtcgcgagaagttcattgaaccttatcattgagarg-----------------------------------------------------------------------------------------------------aattaatgtgacttgtgaggtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacagatgggctgaggagaggaatggaagtgattgacacaggagctgctctaagtgttccagtaggtggagccactctaggacgaattttcaatgttcttggagaacccgttgataatttaggtcctgtagatactcgcacaacatcccccattcatagatccgcacccgcttttatacagttagataccaaattatcaatctttgaaacggggataaaagtagtggaccttttagcgccttatcgacgtgggggaaaaatcggattatttgggggagccggagtgggtaaaacagtactcatcatggaattaatcaacaacattgccaaagctcatgggggtgtatccgtattcggcggagtaggagaacgcactcgtgagggaaatgatctttacatggaaatgaaagaatccggggtgattaatgaagaaaatattgcagaatctaaagtagctctagtatatggacagatgaatgaaccgccgggagctcgtatgagagtcggtttgactgccctaaccatggcggaatatttccgtgatgttaatgaacaagacgtccttctatttatcgacaatatctttcgcttcgtacaagcggggtcagaagtatctgccttattaggtagaatgccttccgccgtgggttatcagcctacccttagtacagaaatgggttctttgcaagaaagaattacttctacaaaagagggatccataacttccattcaagcagtttatgtacccgcggacgatttgactgatcctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagaggattagctgccaaaggtatctatccagcagtggatcctttagattcaacgtcaactatgctccaacctcggatcgttggcgaagaacattacgaaacagcgcaaagagttaagcaaactttacaacgttacaaagaacttcaggacattatagcgattcttggactggacgaattatctgaagaggatcgtttaaccgtagcaagagcgcgaaaaattgaacgttttctatcacaacccttcttcgtagcggaagtatttacaggttctccagggaaatatgttggtctcgcagaaacaattagggggtttcaactgatcctttccggagaatttgatagttttcctgagcaggccttttatttggtaggtaatatcgatgaagctacctctaaggctattaacttagaagtcgagagaagtgttggattcaaagctggtgttaaagattacagattgacttattacactcctgagtatgaaacccttgctactgatatcttggcagcattccgagtaactcctcaacctggagttccacctgaggaagcaggagctgcggtggctgccgaatcttccactggtacatggacaactgtgtggaccgatggacttaccagcctcgatcgttacaaaggacgatgctaccacatcgagccagttgctggggaggaaaatcaatatattgcttatgtagcttaccctttggatctttttgaagaaggttctgttactaacatgtttacttccattgtgggcaatgtatttggattcaaagccctacgagctctacgcttggaggatctgagaattcctcctgcttattctaaaactttccagggcccacctcatggaatccaagttgagagagataaattgaacaagtatggtcgtcccctattgggatgtactattaaaccaaaattggggttatccgcaaaaaactatggtagagcagtttatgagtgtctacgtggtggacttgattttaccaaggatgatgagaacgtaaactcccagccgtttatgcgttggagagatcgtttcttattttgcgccgaagctatttataaagcacaggccgaaacaggtgaaattaaaggacattacttgaatgctactgcaggtacatctgaagaaatgatgaaaagagcagcatgcgcccgagagttgggagttcctatcgtcatgcatgactacttaacagggggattcactgcaaatactagcttgtctcattattgccgagacaatggcctacttcttcacatccaccgcgcaatgcatgcagttattgatagacagaagaatcatggtattcacttccgtgtactagctaaagcgttgcgtatgtctgggggggatcatattcactctggtaccgtagtaggtaaactggaaggggaacgagatgtcactttgggctttgttgatttactacgtgatgattttattgaaaaagaccggagtcgcggtatttatttcactcaagattgggtatctatgcctggtgttttgcccgtggcttcaggcggtattcacgtttggcatatgcctgccctgaccgagatatttggggatgattccgtgctacagttcgg--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Amborella tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtacc-tgctactcggataaccgtagtaattctagagctaatacgtgcaagaaatcccgac-ctctggaagggatgcatttattagataaaaggccagcgcgggctt-tgcccgatgctttggtgaatcatgataactcgacggatcgcacggccattgtgctggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggataggggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-caagagtctggtaattggaatgagtacaatctaaaccccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggctgggccgaccggtccgccttcacggtgtgcaccggccgtcccgtcccttcacccggcgatgcgttcctggccttaactggccgggtcgtgcctccggcaccgttactttgaagaaattagagtgctcaaagcaagcctacgctctgaatacattagcatgggataacatcacaggatttcggtcctattgtgttggccttcgggatcggagtaatgattaagagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctcttaggactccgtcggcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgtggaggt--atcctccacggccagcttcttagagggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagta-tatagccttggccgacaggcccgggtaatctgtc-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacggaggcggtccgccgctggcgacgtcgcgagaagtccactgaaccttatcatttagaggaaggtcattggtccggtactggatgtagcctttcccccgggcaagatgcccaatatttacaactctntggtagttaaaggtcgagatactgccggtcagcaaattaatgtgacttgtgaggtacaacaattattaggaaataatcgagttagaacggtagctatgagtgctacagatggtctaatgagaggaatggaagtgattgacacgggagctccttaagtgttcccggttggcgaagctactctcggacgaattttcaacgttcttggagaaccagttgataatttaggtcctgtagatactcgcacaacatctcctattcatagatctgcgcctgcctttatacagttagataccaaattatcaatctttgaaacaggcattaaagtggtggatcttttagctccttatcgtcgtggaggaaaaatcgggctattcgggggagccggagtgggtaaaacagtactcatcatggaattgatcaataacattgccaaagctcacggaggtgtatctgtatttggcggagtaggagaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatccggagtgattaatgaacaaaatattgcagaatcaaaagtcgctctagtctatggtcagatgaatgaaccgccgggagctcggatgagagttgttttaactgccctaacaatggcggaatatttccgtgatgttaatgagcaagacgtacttctatttattgacaatatctctcgcttcgttcaagcaggatcagaagtctctgccttattaggcagaatgccttctgccgtgggttatcaacctacccttagtacagaaatgggttctttgcaagaaagaattacttctactaaagagggatccataacttccattcaagcagtttatgtacctgcagacgatttgaccgaccctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagaggattagccgccaaaggtatctatccagcagtagatcctttagattcaacgtcaactatgctccaacctcggatcgttggcgaggaacattacgaaactgcgcaaagagttaagcaaactttacaacgttacaaagaacttcaagacattatagctattcttggaccagatgaattatccgaagaggatcgtttaaccgtagcaagagcacgaaaaattgagcgtttcttatcacaacccttcttcgtagcagaggtatttactggttctccaggaaaatatgttggtctcgcagaaacaattagggggtttcaactgatcctttccggagaattagatggtcttcccgaacaggctttttatctggtaggtaacatcgatgaagctaccgcgaaggctattaacttagaagtagagag--gcgctggattcaaagccggtgttaaagattacagattgacttattatactcctgactatgaaaccctagctactgatatcttggcagcattccgagtaactcctcaacctggagttccacctgaggaagcaggagctgcagtagctgccgaatcttccactggtacatggacaactgtgtggaccgatggacttaccagccttgatcgttacaaaggtcgatgctaccacatcgaacccgttgctggggaacaaaatcaatatattgcttatgtagcttatcctttggacctttttgaggaaggttctgttactaacatgtttacttccatcgtaggtaatgtatttgggttcaaagccctacgagctctacgtctagaggatctgcgaattcctcctgcttattccaaaagtttccaaggcccacctcatggcatccaagtcgagagagataaattgaacaagtatggtcgtcccctattaggatgtactattaaaccaaaattggggttatctgccaaaaactacggtagagcggtttatgaatgtctccgtggtgggcttgattttaccaaggatgatgagaatgtgaactcccaaccatttatgcgttggagggaccgtttcttattttgtgccgaagctctttataaagcacaggcagaaacaggtgaaatcaaaggacattacttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggccgtatttgccagagaattgggagttcctatcgtaatgcatgactacttaacaggaggattcactgcaaatactagtttggcccattattgccgagacaatggcctacttcttcacattcatcgcgcaatgcatgcagttattgatagacaaaggaatcatggtatacactttcgtgtactagctaaagcattgcgtatgtctggtggggatcatattcacgctggtaccgtagtaggtaaactggaaggggaacgggatgtcactttgggttttgttgatctactacgtgatgattttattgaaaaagaccgaagtcgcggtatttatttcactcaagattgggtatctatgccaggtgttctgcccgtggcttcaggtggtattcacgtttggcatatgcctgccctgaccgagatctttggggatgattccgtattacagttcggcggaggaactctgggacacccttggggaaatgcacccggtgcagtagctaatcgggtggctttagaagcgtgcgtacaagctcgtaatgagggacgtgatcttgctcgtgaaggtaatgaagttatccgtgaagctagcaggtggagcccagaactagctgctgcttgtgaggtatggaaggagatcaaattcgaattcgaagcaatggatgt Austrobaileyales_Austrobaileya tcaaagattaagccatgcatgtgtaagtatgaaccaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatc-tcctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-tttgggaaggggcgcatttattagataaaaggccgatnncggctc-tgcccgatgctccggtgattcatgataactcgacggatcgcacggccttcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctactatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-ttcgagtctggtaattggaatgagtacaatctaaaccccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggtcgggtcggccggtccgcctttc-ggtgtgcaccggtcgtcttgacccttctaccggcgatgcgctcctggccttaattggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcccaagctctgcatacattagcatgggataacatcacaggatttcggtcctattttgttggccttcgggatcggagtaatgattaatagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgcttttaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgtggaggc-gaccctccacggccagcttcttagagggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtt-cctagccctggccgacaggcccgggtaatcttgt-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacnngggcggttcgccacccgcgacgtcgcgagaagtccactgaaccttatcatttagaggaaggtcattggtccggtactggaagtagcctttccccccggcaagatgcctaatatttacaacttcttggtagttaagggtcaagatactgtcggtcagccaattaatgtgacttgtgaggtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacggatggtctgatgagaggaatggaagtaattgatacgggagctcctctaagtgttccagtcggtggagctactctgggacgaattttcaacgttcttggggaacctgttgataatttaggtcctgtagatactcgcacaacatctcccattcatagacctgcgcctgcctttatacagttagataccaaattatcaatctttgaaacagggattaaagtggtggatcttttagctccttatcgccgtggaggaaaaatcggactattcgggggagccggggtgggtaaaacagtactcatcatggaattgatcaacaacattgccaaagctcatggaggtgtatccgtatctggcggagtaggcgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatccggagtgattaatgaacaaaatattgcagaatccaaagtagctctagtctatggtcagatgaatgaaccgccgggagctcgtatgagagttggtttgactgccctaaccatggcagaatatttccgggatgttaatgaacaagacgtacttctatttatcgacaatatctcccgcttcgttcaagcaggatcagaagtatctgccttattaggcagaatgccttccgccgtaggttatcagcctacccttagtacagaaatgggttctttgcaagaaagaattacttccaccaaagagggatctataacttccattcaagcagtttatgtacctgcggacgatttgaccgaccctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagagggttagctgccaaaggtatctatccagcagtggatcctttagattcaacgtcaactatgctccaacctcggatcgttggcgaggaacattatgaaactgcacaaagagttaagcaaacttcacaacgttacaaagaacttcaggacattatagctatccttgggttggacgaattatccgaagaagatcgtttaaccgtagcaagagcacgcaaaattgagcgtttcttatcacaacccttcttcgtagcagaagtatttactggttctccagggaaatatgttggtctcgcagaaacaattagggggtttcaactgatcctttccggagaattagatggtcttcccgagcaggccttttatttggtaggtaacatcgatgaagctaccgcgaaggctatgaacttagaagttgagag--gtgttggattcaaggctggtgttaaagattacagattgacttattatactcctgactatgaaactaaaatgactgatatcttggcagcattccgagtaactcctcaacccggagttccacctgaggaagcgggggctgcggtagctgcagaatcttctactggtacatggacaactgtgtggaccgatggacttaccagcctcgatcgttacaaaggtcgatgctaccacatcgagcctgttgctggggaggaaaatcaatatattgcttatgtagcttaccctttagacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttgggttcaaagccctacgagctctgcgtctggaagatctgcgaattcctcctgcttattccaaaactttccaaggcccgcctcatggcatccaagttgagagagataaattgaacaagtatgggcgtcccctattgggatgtactattaaaccaaaattaggtttatctgccaagaactacggtagagcggtttatgaatgtctccgcggtggacttgattttaccaaggatgatgagaacgtgaactcccaaccgtttatgcgttggagggaccgtttcgtattttgtgccgaagaagtttataaagcgcaggcagaaacaggtgaaatcaaaggacattacttgaatgctaccgcaggtacatgcgaagaaatgatcaaaagggccgtatttgccagagaattgggagttcctatcgtaacgcatgactacttaacagggggattcactgcaaatactagcttggctcattattgccgagacaacggcctacttcttcacatccatcgcgcaatgcatgcagttattgatagacagaggaatcatggtatacactttcgtgtactagctaaagcgttgcgtatgtctggtggagatcatgttcactctggtaccgtagtaggcaaactggaaggggaacgggacgtcactttgggttttgttgatttactacgtgatgattttattgaaaaagaccgaagtcgcggtatttattttactcaagattgggtatctatgccaggtgttttacccgtggcttcaggaggtattcacgtttggcatatgcctgccctgaccgagatctttggggatgattccgtactacagttcggtggaggaactttagggcacccttggggaaatgcacctgatgcagtagccaatcgggtggctttagaagcgtgtgtacaagctcggaatgagggacgtgatcttgctcgtgaaggtaatgaggttatccgtgaagcgagcaaatggagccctgaactagctgctgcttgtgaggtatggaaggagatcaaattcgaattcgaagcaatggatgt Austrobaileyales_Schisandra tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtacc-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttttggaagggatgcatttattagataaaaggccgacgcgggcta-tgcccgatgctccggtgattcatgataactcgacggatcgcacggccttagtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctactatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-tttgagtctggtaattggaatgagtacaatctaaaccccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggttgggccggccggtccgccttcc-ggtgtgcaccggtcgtcttgacccttctaccggcgatgcgctcctggtcttaactggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgtatacattagcatgggataacatcacaggatttcggtcctattttgttggccttcgggatcggagtaatgattaatagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttggcaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgcttttaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcngcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgtggaggt-gaccctccacggccagcttcttagagggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-catagccttggccgacaggcccgggtaatcttgt-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgggggcggttc----------------------------------------------------tcattggcccggtactggatgtagcttttcccccgggcaagatgcctaatattaacaactctttgntcgttaaaggtcgagatactgttggtcagcaaattaatgtgacttgtgangtacaacaattattaggaaataatcgagttagagctgtagctatgagtgctacggatggtctgatgagaggaatggaagtgattgatacgggagctcctctaagtgttccagttggtggatccactctcggacgcattttcaacgttcttggagagcctgttgataatttaggtcccgtggatactcgcacaacatctcctattcatagatctgcgcctgcctttatacagttagataccaaattatcaatctttgaaacagggattaaagtggtggatcttttagctccctatcgccgtggagggaaaatcggactattcgggggagccggggtgggtaaaacagtactgatcatggaattgatcaacaacattgccaaagctcatgggggtgtatctgtatttggtggagtaggtgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatccggagtgattaatgaacaaaatattgcagaatcaaaagtggctctagtctacggtcagatgaatgaaccgcccggagctcgtatgagagttggtttgactgccctaaccatggcggaatatttccgggatgttaatgaacaagacgtacttctatttatcgacaatatctcccgcttcgtccaagcaggatcagaagtatctgccttattaggtagaatgccttctgccgtgggttatcagcctacccttagtacagaaatgggttctttgcaagaaagaattacttctaccaaagagggatctataacttccattcaagcagtttatgtacctgcagatgatttgaccgaccctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagagggttagctgccaaaggtatctatccagcagtggatcctttagattcaacgtcaactatgctccaacctaggatcgttggcgaagagcattatgaaactgcgcaaagagttaagcaaacttcacaacgttacaaagaacttcaggacattatagctatccttgggttggacgaattatccgaagaggatcgtttaaccgtagcaagagcacgaaaaattgagcgtttcttatcacaacccttcttcgtagcagaagtatttactggttctcccgggaaatatgttggtctcgcagaaaccattagggggtttcaactgatcctttccggagaattagatggtcttcccgagcaggccttttatttggtaggtaacatcgatgaagctaccgcgaaggctatgaacttagaagtagagag--gtgttggattcaaggctggtgttaaagattacagattgacttattatactcctgaatatgaaacgaaagatactgatatcttggcagcattccgagtaactcctcaacccggagttccgcccgaggaagcgggagctgcggtagctgcggaatcttctactggtacctggactactgtgtggactgatggacttaccagcctcgatcgttataaagggcgatgctaccacattgagcccgttgctggggaggaaaatcaatatattgcttatgtagcttaccctttagacctttttgaagaaggctctgttactaacatgtttacttctattgtgggtaatgtatttgggttcaaagccctacgagctctgcgtctggaagatttgcgaattcctcctgcttattccaaaactttccaaggcccacctcatggcatccaagttgagagagataaattgaacaagtatggtcgtcccctattgggatgtactattaaaccaaaattagggttatctgccaagaactacggtagagcggtttatgaatgtctccgcggtggacttgattttaccaaggatgatgagaacgtgaactcccaaccgtttatgcgttggagggaccgtttcttattttgtgccgaagctctttataaagcgcaggccgaaacaggtgaaattaaaggacattacttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggctgtatttgccagagaattgggagttcctatcgtaatgcatgactacttaacagggggattcactgcaaatactagcttggctcattattgccgagacaacggcctacttcttcacatccatcgcgcaatgcatgcagttattgatagacagaggaatcatggtatccactttcgtgtactagctaaagcgttgcgtatgtctggtggagatcatattcactctggtaccgtagtaggtaaactggaaggggaacgggacgtcactttgggttttgttgatttactacgtgatgattttattgaaaaagaccgaagtcgcggcatttatttcactcaagattgggtatctatgccaggtgttctgcccgtggcttcagggggtattcacgtttggcatatgcctgccctgaccgagatctttggggatgattccgtactacagttcggtggaggaactttaggacacccttggggaaatgcgcctggtgcagtagctaatcgtgtggctttagaggcgtgtgtacaagctcgtaatgaggggcgtgatcttgctcgtgaaggtaatgaagttatccgtgaagctagcaaatggagccctgaactagctgctgcttgtgaggtctggaaggagatcaaattcgaattcgaagcaatggatgt Oxalidales_Davidsonia tcaaagattaanccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatt-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ctctggaagggatgcatttattagataaaaggtcgacgcgggctt-tgcccgttgcttcggtgattcatgataactcgacggatcgcacggccatcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-atcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggttgggtcggccggtccgcctc-a-ggtgtgcaccggccggctygtcccttctgccggcgatgcgctcctggccttaattggccgggtcgtgcctccggcgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctggatacattagcatgggataacatcataggattccggtcctattgtgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctttaaggactccgccggcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggt-gaccctccgcggccagcttcttagagggactatggccgctcaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgtgggcggttcgccgccggcgacgtcgcgagaagtccactgaaccttatcatttagaggaagg--------------------------------------------------------------------------------------------------------------------------------------------------------gtagctatgagtgctacagatggtctaatgagaggaatggaagtgattgacacgggagctcctctaagtgttccagttggcggagcgactctaggacgaattttcaacgtacttggagagcctattgataatttaggtcctgtagatactcgcacaacatctcctattcatagatctgcgcccgcctttatacagttagatacaaaattatctatttttgaaacaggaattaaagtagtagatcttttagccccttatcgccgtggtggaaaaatcggactattcgggggagctggagtaggtaaaacagtgctcattatggaattaatcaacaatattgccaaagctcatggaggtgtatccgtatttggcggagtcggtgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatctggagtaattaatgaagaaaatattgcggaatcaaaagtggctctagtctacggtcagatgaatgaaccgccgggggctcgtatgagagttggtttgactgccctaactatggcggaatatttccgagatgttaatgaacaagacgtacttctctttatcgacaatatcttccgtttcgtccaagcgggatccgaagtatccgccttattgggtagaatgccttctgctgtgggttatcaacccacccttagtaccgaaatgggttctttacaagaaagaattacttctaccaaagaagggtccataacttctattcaagcagtttatgtacctgcggacgatttgaccgaccctgctccggccacgacatttgcacatttagatgctactactgtactatcaagaggattagctgccaaaggtatctacccagcagtagatcctttagattcaacgtcaactatgctccaacctcgaattgttggtgaggaacattatgaaactgcgcaaagagttaaacaaactttacaacgttacaaagaacttcaggacattatagctatccttgggttggacgaattatccgaagaggatcgcttacccgtagcaagagcacgaaaaattgagcgtttcttatcacaaccctttttcgtagcagaagtatttacgggttctccggggaaatatgttggtctagcagaaacaattagagggtttaaattgatcctttccggagaattagacggtcttcctgaacaggccttttatttggtaggtaacatcgatgaagct-------------------------------------------------------------------------------atactcctgactatgaaaccaaagatactgatatcttggcagcattccgngtatctcctcttcctggagttccgcctgaggaagccgggcgagcggtagctgctgaatcttctactggtacatggacaactgtctggaccgacgggcttaccagtcttgatcgttacaaaggacgatgctacgacatcgagcctgttgcgggagaagaaaatcaatatattgnttatgtagcttaccccttagacctttttgaagaaggttctgttactaacatgtttacttccattgtaggtaatgtgtttgggttcaaggcgctgcgggctctacgtctggaggatttgcgaatccctactgcttatgttaaaactttccaaggtccgcctcatggtatccaagttgagagagataaattgaacaagtatggccgccccctattgggatgtactattaaacctaaattggggttatccgctaagaattatggtagggcagtttatgaatgtctccgcggtggacttgattttaccaaagatgatgaaaacgtgaactcccaaccatttatgngttggagagaccgtttcttatttttggccgaagcactttataaagcacaggccgaaacgggcgaaatcaaagggcattacttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggctgtatttgctagagaattgggagttcccatcgtaatgcatgactacttaacaggaggattcactgcaaatactagcttggctgattattgccgcgataatggtctacttcttcacatccatcgtgcaatgcatgccgttnttgatngacagaagaatnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnntgtctggtggagatcatatncatgccggtaccgtngtcggcnaacttgaaccccaaagagacatcactttnggctttgttgatttactacgtgatgattttattgaaaaagatcgaagccgcggtatttntttcactcaagattgggtctctctaccnggcgttctgcccgtngcttcaggaggtattcatgtttggcatatnccggctttgaccgagatctttggagatgattccnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnccgtngctaatcgagtagctctngaagcatgtgtacaagctcgtaatgaggggcgtgatcttgctcgtgagggtaatgaaattatccntnaggctagcaaatggagtccnnnnnnnnnnnctgcttgtgaagtatggaaggagatcaaatttgaattccnnnnnatggatac Celastales_Lepuropetalon tcaaagattaagccatgcatgtgcaagtatgaacgaattcaaactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatc-tactactcggataaccgtagtaattctagagctaatacgtgcaacatatcccgac-ttccggaagggatgcatttattagagaaaaggtcaacgcttgct--cgctcgttgctcagatgattcatgataactcgacggatcgcatggccattgtgctggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtaacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctaacaaggggaggtagtgacaataaataacaataccgggctctcaagagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttgtannttgggttgggtcgaccggtccgcttca--ggtgagcaccatcagtcctgtccttattgccggtgatgcgctcctagccttaattggttgggtcgtccctctggtgctgttactttgaagaaattagagtgctcaaagcccgcctacgctctggatacattagcatgggataacgtcataggatttcgatcctatttagttgg-cttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagagatcagcggatgttgctcttaggactccgctggcatcttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagnaaggattgacagattgagagctctttcttgattcnatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaaatagctacgcggaggg-ttccctctgcggccagcttcttagagggac-acggccgcttaggtcgaaggagtttgaggcaataacagctgtgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tataaccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcag--catcaactcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgttggcggttccctgctggcgatgtcgcgagaagtccactgaaccttatcatttagaggaagg---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ctgtagatacccgtacaacatctcctattcatagatcagcgcccgcctttatacagttagacacaaaattatccatttttgaaacaggaattaaagttgtagaccttttagctccttatcgccgtggaggtaaaatagggctattcgggggggctggagtgggtaaaacagtactaattatggaattgatcaacaacattgccaaagctcatggaggtgtatccgtatttggcggagtgggtgaacgtactcgtgaaggaaatgacctttacatggaaatgaaagagtccggagtaattaatgaacaaaatattgcagaatcaaaagtggctctagtctatggccagatgaatgaaccgccgggagctcgtatgcgagttggtttgaccgccctaactatggccgaatattttcgagatgttaatgaacaagacgtacttctttttatcgacaatatattccgtttcgtccaagcgggatctgaagtatccgccttattgggtagaatgccctccgctgtgggttatcaacccacccttagtactgaaatgggttctttacaagaaagaattacttctaccaaaaaagggtccataacttctattcaagctgtttatgtaccggcagacgatttgactgaccctgctccggccacgacatttgcgcatttagatgccactactgtattatcgcgaggactagctgccaagggtatctacccagcagtagatcctttagattcaacgtcaactatgcttcaaccccgcattgttggtgaagaacattatgaaaccgcgcaaagagtgaagcaaactttacaacgttacaaagaacttcaggacattatagctatcctggggttggacgaattgtccgaagaggaccgcttaaccgtagcaagggcacgaaaaatcgagcgtttcttatcacaaccctttttcgtagcagaagtatttacgggttctccggggaaatatgttggtctagcagaaactattagagggtttaaattgatcctttcgggggaattagatggtcttcctgagcaggcsttttatttggtaggtaacattgatgaggctactgcgaaggctacgaattt----------------gttggattcaaggctggcgttaaagattataaattgacttattatactcctgactatgaaaccaaagatactgatatcttggcagcatttcgaatgactcctcaacctggagttccgcctgaagaagctggagctgcggtagctgctgaatcttctactggtacctggacaactgtgtggaccgatggacttaccagtcttgatcgttacaaaggacgatgctaccacatcgagcccgtggctggagaagacaatcaatatattgcttatgtagcttatcctttagacctttttgaagaaggttctgttactaatatgtttacttctattgtgggtaatgtttttgggttcaaagccctgcgcgctctacgtctggaagatttgcgaatcccccctgcttattctaaaactttccaaggcccgccgcatggcatccaagttgagagagataaattgaacaagtatggacgccctctattgggctgtactattaaacctaaattgggattatccgctaagaattatggtagagccgtttatgaatgtctacgcggtggacttgattttaccaaagatgatgagaacgtaaactcccaaccatttatgcgttggagagaccgtttcttattttgcgctgaagccatttttaaagcacaagctgaaacaggtgaaatcaaaggacattacttgaatgctactgcgggtacgtgcgaagaaatgatcaaacgggctgtatttgccagagaactaggagtccctatcgtaatgcacgactacttaacggggggattcactgcaaatactaccttggctcattattgccgagataatggtttacttcttcacatccaccgtgcaatgcatgcagttattgatagacagaaaaatcatggtatacactttcgtgtactagcgaaggccctacgtatgtctggtggagaccatattcatgctggtaccgtagtaggtaaacttgaaggcgaaagagatatcactctaggctttgttgatttattacgcgatgattttattgaaaaagatcgaagccgcggtatttatttcactcaagattgggtctctcttccaggtgttctgcccgtggcttccggaggtattcacgtttggcatatgcctgctctgaccgagatctttggtgatgattccgtactacaattcggtggaggaactttagggcatccttggggaaatgcgccaggtgctgtagcgaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgaaggtaatgaaattatccgcgaggcctgcaaatggagtcctgagttagctgctgcttgtgaagtatggaaggagatcaaatttgaattcgaagcaatggatac Celastales_Plagiopteron tcaaagattaagccatgcatgtctaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtat--tactactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggatgcatttattggataaaaggtcaacgcgggctc-tgcccgttgctctgttgattcatgataacttgacggatcgcacggccatcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtagtgacgggtaacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-tgcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggttgggtcgagtggtccgccat-t-ggtgtgcacctttcgtcccgtcccttctgccggcgatgcgctcctggccttaactggccgggtcgttcctccggcgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctggatacattagcatgggataacatcataggatttcggtcctattctgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcagcggatgttgcttttaggactccgctggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcggagga-atccctccgcggccagcttcttagagggactacggccgcttaggccgaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggcctgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgtgggcggtttactgccgacaacgtcgcgagaagtccactgaaccttatcatttagaggaaggtcattggtccagtactggatgtagctttttccccgggcaagatgcctaatatttacaacgctctagtggttaagggtcgagatacgtccggtcacacaattaatgtgatttgcgaagtacagcaattattaggaaataaccaagttcgggctgtagctatgagtgctacagatggtctaatgagagggatggacgtgattgacacgggagctcctctaagtgttccagtcggcggagcgactctcggacgaattttcaacgtacttggtgagcctgttgataatttaggtcctgtagatactcgtacaacctctcctattcataaatcagcacccgcctttatacagttagagacaaaattgtctatttttgaaacaggaattaaagtagtagaccttttagctccttatcgccgtggaggaaaaatcggactattcgggggggctggagtgggtaaaacggtcctaattatggaattgatcaacaacattgccaaagctcatggaggtgtatccgtctttggcggagtgggtgaacgtacgcgcgaaggaaatgatctttacatggaaatgaaagaatctggagtaattaatgaacaaaatattgcagaatcaaaagtggctttagtttatggccagatgaatgaaccgccaggagctcgtatgagagttggtttraccgctctaactatggcggaatattttcgagatgttaatgaacaagacgtacttctatttatcgacaacatcttccgtttcgtccaagctggatccgaagtatccgccttattggggagaatgccttccgctgtgggttatcaacccacccttagtactgaaatgggtgctttacaagaaagaattacttctaccaaaaaagggtccataacttctattcaagctgtttatgtaccagcggatgatttgactgaccctgctccggccacgacctttgcacacttagatgctactactgtactatcacgaggactagctgccaagggtatctacccggcagtagatcctttagattcaacgtcaactatgctacaacctcgaattgttggtgaggagcattatgaaactgcgcaaagagtgaagcaaactttacaacgttacaaagagcttcaggacattatagctatcctggggttggacgaattgtccgaagaggaccgcttaaccgtagcaagagcacgaaaaatagagcgtttcttatcacaacccttttttgtcgccgaagtttttaccggttctccggggaaatatgtcggtctagcagaaacaattagagggtttaaattgatcctttccggagaattagatggtcttcctgagcaggccttttatttggtaggtaacatcgatgaagccactactaaggctacgaatttagaaatggag--nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnntgatcgttttaaaggacgatgctaccacatcgagcccgttgctggaggagaaaatcaatatattgcttatgtagcttactccttagaccttttcgaagaaggttctgttactaacatggttacttccattgtgggtaatgttcttgggttcaaagccctgcgcgctctacgtctggaggatttgcgagtcccccctgcttattctaaaacttttcaaggcccgccgcatggtatcccagttgagagagataaattgaacaagtatggacgccctctattgggatgtactatttaacctaaattgggattatctgctaagaattatggtagagcggtttatgaatgtctccgcggtggacttgattttacccaagatgatgagaacgtaaactcccaaccatttatgcgttggagagaacgtctcttaatttgtgccgaggcgctttataaagcacaggctgaaacaggtgaaatcaaagggcattacttgaatgctactgccggtacatgtgaagaaatgatcaaaagggctgtatttgctagagaactgggcgtacctatcgtaatgcatgactacttaacggggggattcactgcaaatactagcttggctcattattgccgagataatggtttacttcttcacatacaacgtgcaatgcatgcagttattgatagacagaaaaatcatggtatgcactttcgtgtactaggcgaggccctacgtatgtctggtggagaccatattcatgccggtaccgtagtaggtaaacttgagggtgaaagagatatcactttaggctttgttgatttattacgtgatgattttattgaaaaagaccgaagccgcggtatttatttcactcaagattgggtctctctaccaggtgttcttgctgtggcttccggaggtattcacgtttggcatatgcctgctctgaccgagatctttggtgatgattccgtactacaattcggtggaggaactttagggcatccttggggaaatgcaactggtgctgtagctaatcgagtagctctagaagcatgtgttacagctcgtaatgagggacgtgatcttgctcgtgaaggtaatgaaattatccgcgaggctagcaaatggagtcctgaactagctgctgcttgtgaagtatggaaggagatccaaattgaattcgcagcaatggatac Malpighiales_Populus tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatt-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggacgcatttattagataaaaggtcgacgcgggctc-tgcccgttgctctgatgattcatgataactcgacggatcgcacggccatcgtgctggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-ttcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggactttgggttgggtcggccggtccgcctc-a-ggtgtgcaccggtcgcctcgtccyttctaccggcgatgcgctcctggccttaactggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctggatacattagcatgggataacatcataggatttcgatcctattgtgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggattggcggatgttgcttctaggactccgccagcaccttatgagaaatcaaagtttttgggttctggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggt-gaccctccgcggccagcttcttagagggactatggccttccaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgtgggcggttcgccgccggcgacgtcgcgagaagtccactgaaccttatcatttagaggaaggtcattggcccagtgctagatgtagtttttcccccgggcaagatgcctaatatttacaacgctctggtagttaagggtcgagatactgtcagtcaacaaattaatgtcacttgtgaagtacagcaattattaggaaataatcgagttcgagctgtagctatgagtgctacagagggtctaatgagaggaatggaagtgattgacacgggagctcccctaagtgttccagtcggcggggcgactctaggacgaattttcaacgtgcttggagaacctgttgatgatttacgtcctgtagatactgggacaacatcccctattcatagatctgcgcctgcctttatacagttagatacaaaattatctatttttgaaacaggaattaaagtcgtagatcttttagccccttatcgccgtggaggaaaaatcggactatttgggggcgctggagtaggtaaaacagtactaattatggaattaatcaacaacattgcgaaagctcatgggggtgtatccgtatttggcggagtaggtgaacgtactcgtgaaggaaacgatctttacatggaaatgaaagaatccggagtaattaatgaagaaaatattgcagaatcaaaagtggctctagtttatggtcagatgaacgaaccaccgggagctcgtatgagagttggtttgactgccctaactatggcggaatatttccgagatgttaatgaacaagacgtacttctatttatcgacaatatctttcgtttcgtccaagcaggatccgaagtatccgccttattgggtagaatgccctctgctgtgggttatcaacccacccttagtaccgaaatgggtactttacaagaaagaattacttctaccaaagaagggtccataacttctattcaagcagtttatgtacctgcggacgatttaaccgaccctgctcctgccacgacatttgcgcatttagatgctactactgtactatcaagaggattagctgctaaaggtatctatccagcagtcgaccctttagattcaacatcaactatgctccaacctcagatcgttggtgaggaacattatgaaactgcgcaaagagttaagcaaactttacaacgttacaaagaacttcaagacattatagctatccttgggttggacgaattatccgaagaggatcgcttaactgtagcaagagcacgaaaaattgagcgtttcttatcacaaccctttttcgtagccgaagtatttaccggttccccgggaaaatatgtcggtctagcagaaacaattagagggtttaaattgatcctttccggagaattagatagtcttcctgagcaggccttttatttggtaggtaacattgatgaagctactgcgaaggctacgaacttagaaatggagaaaggtgttggattcaaggctggtgttaaagagtataaattgaattattatactcctgaatatgaaaccaaagatactgatatcttggcagcattccgagtaactcctcaacctggagttccgcccgaggaagcaggggccgcagtagctgctgaatcttctactggtacatggacaactgtgtggaccgacgggcttaccagtcttgatcgttataaaggacgatgctacgacatcgagcccgttgctggagaagaaaatcaatttattgcttatgtagcttaccccttagacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttgggttcaaagccctacgcgctctacgtctggaggatttgcgaattcctcctgcttatactaagacttttcaaggcccacctcatggtatccaagttgaaagagataaattgaacaagtatggtcgccccctattgggatgtactattaaacctaaattggggttatccgctaagaattacggtagagcagtttatgaatgtctccgcggtggacttgattttaccaaagatgatgagaacgtgaactcccaaccatttatgcgttggagagaccgtttcttattttgtgccgaagcactttataaagcacagactgaaacaggtgaaatcaaagggcattatttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggctatatttgccagagaattgggagttcctatcgtaatgcatgactacttaacagggggattcaccgcaaacactagtttggctcattattgccgagataatggtttacttcttcacatccatcgcgcaatgcatgcagttattgatagacagaaaaatcatggtatacactttcgtgtactagctaaggcattacgtatgtctggtggagatcatattcactctggtaccgtagtaggtaaacttgaaggggaaagagacataactttgggttttgttgatttactacgtgatgattttgttgaaaaagatcgaagccgcggtatttatttcactcaagattgggtctctctaccgggtgttctgcccgtggcttcggggggtattcacgtttggcatatgcctgctctgaccgagatctttggagatgattccgtactncaattcggtggaggaactttagggcacccttggggaaatgcacctggtgctgtagctaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgagggtaatgaaattatccgtgaagctagcaaatggagccctgaactagctgctgcttgtgaagtatggaaggagattaaatttgaattcgaagcaatggatac Malpighiales_Linum tcaaagattaagccatgcatgtgtgagtatgaacaaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtacc-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttttggaaggggcgcatttattagataaaaggtcaacgcgggctc-tgctcgttgttttgatgattcatgataactcgacggatcgcaaggccttcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-attgagtctggtaattggaatgagtacaatctaaaccccttaacgagtacccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggttgggtcggccggtccgctcac--ggtgtgcaccggccgtcttgtcccttctgccggcgatgcgctcctggtcttaattggccgggtcgtgcctccggcgcagttactttgaagaaattagagtgctcaaagcaagcctacgctctgaatacattagcatgggataacatcacaggatttcggtcctattgtgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctttttggactccgccggcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggc--accctccgtggccagcttcttagagggactatggccttttaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggtctgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattattggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggattgcggcgacgtgggtggttcgctgcccgcgacgtcgcgagaagttcnctgaaccttatc-------------tcatcngnccggtactagatgtagcttttcccccggggaagatgcctaatatttacaatgctctcctagttaagggtcaagaccccgccggtcaacaaattaatgtgacttgtgaagtacagcaattattaggaaataatcgagttcgggctgtagctatgagtgctacagatggtttaatgagaggaatggaagtgattgacacgggaactcctctaagtgttccagtcggcggagcaactctaggacgaattttcaacgtgcttggagaacctattgatgatttaggtccggtagatactcgcacaacatcccctattcatagagctgcacccgcctttatacagttagatacaaaattatctatttttgaaacaggaattaaagtagtagatcttttagccccttatcgtcgtggtggaaaaatcggattattcgggggagctggggtaggtaaaacagtactaattatggaattaattaacaacattgcgaaagctcatgggggtgtatccgtctttggcggagtaggcgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatccggtgtaattaatgaagaaaatattgcagaatccaaagtagctctagtctatggtcagatgaacgaaccgccgggagctcgtatgagagttggattgactgccctaaccatggcagaatatttccgagatgttaatgagcaagatgtacttctatttattgacaatatcttccgtttcgtccaagccggatccgaagtatccgctctattgggtagaatgccttccgctgtgggttatcaacccacccttagtaccgaaatgggttctttacaagaaagaattacttctaccaaagaagggtcgataacttccattcaagcggtttatgtacctgcagatgatttgactgaccctgctcctgccacgacatttgcacatttagatgctactactgtactatcaagaggattagccgctaaagggatctatcctgcagtagatcctttagattcaacatccactatgctccaacctcagatcgttggtgaggaacattatgaaactgcacaaagagttaagcaaactttacaacgttacaaagaactccaggacattatagccatcctggggttggacgaattatccgaagaggatcg-ttaactgtagcaagagcacgaaaaattgagcgtttcttatcacaaccctttttcgtagcagaagtatttacgggttctccgggaaaatatgtcggtctagcagaaactataagagggtttaaattgatcctttccggagaattagatagtcttcctgagcaggccttttatttggtaggtaatattgatgaagctactgcgaaggctacgaacttagaaatggagaa--gtgttggattccaggctggtgttaaagattataaattaacttattatactcctgaatatgaaaccaaagatactgatatcttggcagcattccgagtaactcctcaaccaggagttccgcctgaggaagcgggggctgcggtagctgctgaatcttctactggtacgtggacaactgtgtggaccgatgggcttaccagtcttgatcgttataaaggacgatgctaccacattgaacccgttcccggagaagaaagtcaatttattgcttatgtagcgtaccccttagacctttttgaagaaggttctgttactaacatgtttacttccattgtaggtaatgtatttgggttcaaagccctgcgcgccctacgtctggaggatttgcgaatccctcctgcttattctaaaactttccaaggcccgcctcacgggattcaagttgagagagataaattgaacaagtatggtcgccccctattgggatgtactattaaaccgaaactgggcttatccgctaagaattatggtagagctgtttatgaatgtcttcgtggtggacttgattttaccaaagatgatgaaaacgtgaactcccaaccatttatgcgttggagagaccgtttcttattttgtgccgaagctatttttaaatcacaggccgaaacaggggaaatcaaagggcattatttgaatgctaccgcgggtacatgtgaagaaatgatcaaaagggctgtatttgccagagagttgggagttcctatcgtaatgcacgactacttaacagggggattcaccgctaatactagtttggctcattattgccgagataatggtttacttcttcacatccaccgtgcaatgcatgcagttattgatagacagaaaaatcatggtatacactttcgtgtactagctaaagcgttacgtatgtctggtggagatcatattcactcaggtaccgtagtaggtaaacttgaaggggaaagagatatcactttgggctttgttgatttactgcgtgatgattttgttgaaaaagatagaagccgtggtatttatttcactcaagattgggtctctctaccaggcgtcttacccgtagcttcggggggtattcacgtttggcatatgcctgctctgacagagatctttggagatgattccgtattacaatttggcggtggaactttgggtcacccttggggaaatgcacctggtgccgtagctaatcgagtagctctagaagcatgtgtacaagctcggaatgagggacgtgatcttgctcgtgagggtaatgaaattattcgtgaggctagcaaatggagtcctgaattggctgctgcttgtga------------------------------------------ Nymphaeales_Barclaya tcaaagattaagccatgcatgtgtaagtatgaactatttcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtact-tgctactcggataaccgtagtaaagctagagctaatacgtgcaccacaccccgac-ttctggaagggacgcatttattagataaaaggccgacgcgggctc-tgcccgatgttttggtgattcatgataactcgacggatcgcacggcctttgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctaccatggtagtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaatacataacaataccgggctc-ttcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggactttgggttgggccgaccggtccgcctct--ggtgtgcaccggtcgtctcgtcccttctgccggcgatgcgctcctggccttaactggccgggtcgtgcctccggcgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgcatacattagcatgggataacatcacaggatttcggtcctattgtgttggccttcgggatcggagtaatgattaagagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggcggatgttgcttttaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcggaggt-acccctccgcggccagcttcttagagggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtt-tatagccttggccgacaggcccgggtaatcttgg-aaactacatcgtgatggggatagatcattgcaattgttggtcttaaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacggaggcggttcgccgcttgcgacgtcgcgagaagttcattgaaccttatcatt----------tcattggtccggtactggatgtagcttttcccccggggaagatgcctaatatttacaactctttggtagttaagggtcgagataccacaggtcaggaaattaatgtgacttgtgaggtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacagatgggctgatgagaggaatggaagtgattgacacgggagctcctctaagtgttccagtcggtggagccactctaggacgaattttcaatgttcttggagaacctgttgataatttgggtcctgtagatactcgtacaacatctcctattcatagacccgcacccgcttttatacaactagatacaaaattatcaatctttgaaacgggcattaaagtggtggatcttttagccccttatcggcgtgggggaaaaataggactattcgggggagccggagtgggtaaaacagtactcatcatggaattaatcaacaacattgccaaagctcatgggggtgtatccgtattcggcggagtaggagaacgcactcgtgaaggaaatgatctttacatggaaatgaaagaatccggggtgattaatgaagaaaatattgcagaatccaaagtagctctagtatatgggcagatgaatgaaccgccgggagctcgtatgagagtcggtttgactgccctaaccatggcggaatatttccgtgatgttaatcaacaagacgtacttctatttattgacaatatctttcgcttcgtccaagcggggtcagaagtatccgccttattaggtagaatgccttccgccgtgggttatcagcctacccttagtacagaaatgggttctttgcaagaaagaattacttctactaaagagggatctataacttccattcaagcagtttatgtacctgcggatgatttgactgatcctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagaggattagctgccaaaggtatctatccagcagtagatcctttagattcaacgtcaactatgctccaacctcggatcgttggcgaagaacattacgaaactgcgcaaagagttaaacaaacttta--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------aagtgttggattcaaagctggtgttaaagattacagattgacttattacactcctgattatgaaacccttgctactgatatcttggcagcattccgagtaactcctcaacctggagttccgcctgaggaagcaggagctgcggtggctgccgaatcttccactggtacatggacaactgtgtggaccgatggacttaccagccttgatcgttacaaaggacgatgctaccacatcgagccagttgctggggaggaaaatcaatatattgcttatgtagcttaccctttggacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttgggttcaaagccctacgagctctacgtctggaggatctgagaattcctcctgcttattctaaaactttccagggcccacctcatggaatccaagttgagagagataaattgaacaagtatggtcgtcccctattgggatgtacaattaaaccaaaattggggttatccgcaaagaactatgggagagcggtttatgagtgtctccgtggtggacttgattttaccaaggatgatgagaacgtgaactcccaaccgtttatgcgttggagagaccgtttcttattttgcgccgaagctatttataaagcgcaggccgaaacaggtgaaattaaaggacattacttgaatgctactgcgggtacatccgaagaaatgatcaaaagggcggtatgtgcccgagagttgggagttcctatcgtaatgcatgactacttaacagggggattcaccgcaaatactagcttggctcattattgccgagacaatggcctacttcttcacatccaccgcgcaatgcatgcagttattgatagacagaggaatcatggtattcactttcgtgtactagctaaagcgttgcgtatgtctgggggggatcatattcactctggtaccgtagtaggtaaactggaaggggagcgagatgtcactttgggctttgttgatttactacgtgatgattttattgaaaaagaccggagtcgcggtatttatttcactcaagattgggtatctatgccaggtgttctgcccgtggcttcagggggtattcacgtttggcatatgcctgccctgaccgatatatttggggatgattccgtgctacagttcgg--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Gymno_Ginkgo tcaaagattaagccatgcatgtgtaagtatgaactctttcagactgtgaaactgcgaatggctcattaaatcagttatagtttctttgatggtacc-tactactcggataaccgtagtaattctagagctaatacgtgcaccaaatcccgac-ttctggaagggacgcatttattagataaaaggccgacgcgggc---cgcccgctgcttcggtgattcatgataactcgacggatcgcacggccctggtgccggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggccgggtcggccggtccgccttttcggtgtgcaccggccgctccgtcccttctgccggcggcgcgctcctggccttaattggctgggtcgcggctccggcgccgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacattagcatggaataacgcgataggagtctggtcctattgtgttggccttcgggaccggagtaatgattaatagggacggtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggcggatgttgctttaaggactccgccggcaccttgtgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggt-tg-ccttcgtggccagcttcttagagggactatggcccttcaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagt--ctatacctgggccgagaggcccgggaaatctgc-caaatttcatcgtgatggggatagatcattgcaattattgatcttaaacgaggaattcctagtaagcgcgagtcatcaactcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatgatccggtgaagtgttcggatcgcgccgacgacggcggttcgccgccggcgacgtcgcgagaagttcattgaaccttatcatttagaggaaggtcattggcccggtactggatgtaacttttcccccgggcaatatgcctaatattttcaattctttgatagtgaagggtcaagatacagctggtcaggaaattcatgttacttgtgaggtacaacaattattaggaaataatagagttagagctgtagctatgaatgctacagatggtctgatgagaggaatgaaagtgattgacacaggagctcctctgagtgttccagttggtggagctactcttggacgaattttcaatgttcttggagaacctgtcgataatttaggtcctgtagatgctcgcacaacatcccctattcatagacctgctcctgcctttacgcagttggataccaaattatcaatcttcgaaacaggcattaaagtggtggatcttttagctccttatcgacgtggaggaaagatcggactattcgggggagctggagtgggtaaaacagtactcatcatggagttaatcaacaacattgctaaggctcatggaggtgtatctgtatttggcggagtaggggaacgtactcgtgaagggaatgatctttacgtggaaatgaaagaatcaggagtaattaatgagcaaaacatctcagaatcaaaagtagctctggtctatggtcagatgaatgaaccaccaggagctcgtatgagagttggtttaactgccttaaccatggctgaatattcccgagatgtcaatgagcaagacgtactcttatttatcgacaatatcttccgctttgtccaagcaggatcagaagtatccgccttattaggtagaatgccttctgctgtgggttatcagccaactcttagcacggaaatgggttctttgcaagagagaattacttctactaaagagggatctataacctccattcaagcagtttatgtacctgcggacgatttgaccgaccctgctcctgctacgacatttgcacatttagatgctactaccgtactatcgagaggattagcttccaaaggtatctatccagcagtagatcctttagattcaacgtcgactatgctccaaccttggattgtgggcgaggaacattacgaaaccgcacaaggagttaagcaaacttcacaacgttataaagaacttcaagacattatagctattcttggactggacgaattatcagaagaagatcgtttaaccgtagcaagagcacgaaaaattgaacgttttttatcacaaccctttttcgtagcagaggtcttcaccggttccccgggcaaatatgtcagtctcgtagaaacaattagaggttttaaaatgatcctttctggagaattagatggtctccccgaacaggctttttatttggtaggtaacattgatgaagctaccgcgaaggctatgaacttcaaagtggagagaagtgtcggatttaaagctggtgttaaagattacagattgacttattatactcctgaatatcaaaccaaagatactgatatcttggcagcattccgagtaactcctcaacctggagtgccacctgaggaagcgggagctgcagtagctgccgaatcttccactggtacatggaccactgtttggaccgatggacttaccagtcttgatcgttacaagggaagatgctatgacatcgagcccgttcctggggaggaaaatcaatttattgcctatgtagcttaccctttggatcttttcgaggaaggttctgttactaacctgttcacttccattgtagggaatgtatttggattcaaagccctacgagctctacgtctggaagatctgcgaattcctcctgcttattccaaaacttgccagggtccacctcatggtatccaagttgnaagggataaattgaataaatatggccgtcccctattgggatgtactatcaagccaaaattgggtttatctgccaaaaattatggtagagcagtttacgaatgtcttcgtggtggacttgattttactaaagatgatgagaacgtaaattcccaaccattcatgcgctggagagatcgtttcttgttttgtgcagaagcaatttataaagctcagaccgagacgggtgaaattaagggacattacttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggcagtatttgccagagaattgggagttcctatcgtcatgcatgactatctgacgggaggttttactgcaaatactagcttggctcattattgccgagacaatggcctacttcttcacattcaccgcgcaatgcatgcagttattgacagacaaagaaatcatggtatgcatttccgtgtactanntaaagcattgcgtatgtctggtggagatcatattcacgccggtactgtagtaggtaaacttgaaggagaacgagaagtcactctgggttttgttgatctactgcgtgatgattttattgaaaaagaccgaagtcgtggtatttatttcactcaagattgggtatctatgccaggtgttctgcccgtagcttcagggggtattcacgtttggcatatgcctgctctgaccgagatctttggggatgattctgtactacagtttggtgggggaactttgggacacccttggggnnnnncacctggnnntgtagctaattgngtnnnnctagaagcttgtgtacaagctcgtaatgaaggacgtgatcttgctcgtgaaggtaatgaagtgatccgtgaagctagtaaatnnnnnnn---------------------------------------------------------n----- Gymno_Ephedra tcaaagattaagccatgcatgtctaagtatgaactaattcaaacggtgaaactgcggatggctcattaaatcagttatagtttctttgatggtacc-tactactcggataaccgtagtaattctagagctaatacgtgcagcaaatcccgac-ctctggaagggatgcatttattagataaaaggccgacgcgggc---tgcccgcttgttcggtgaatcatgataacttgtcggatcgcaaggcctcagtgccggcgacgcttcattcaaatttctgccctatcaactttcgacggtaggatagaggcctaccgtggttgtgacgggtgacggggaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgatacggggaggtagtgacaataaataacaataccgggctc-attgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggtcggcatggtcggtccgccttttcggtgtgcatcggccatcccgatccttctgtcggcggcgtgctcctggccttaactggctgggtcacggctccgacgcagttactttgaaaaaattagagtgctcaaagcaagcctatgctctgaatacattagcatggaataacgcgataggatttcggtcctgttgtgttggccttcgggaccggagtaatgattaatagggactgtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaactactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgcttttaggactccgccggcaccttccgagaaatcagagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgacccaacacgggaaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagtgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgtcgagg--atccctcggcggacagcttcttagagggactatggccgtttagaccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgcattcagcgagct-cattccctggtccgaaaggcccggggaatcttgt-aaaatgcatcgtgatggggatagatctttgcaattatcggtcttgaacgaggaattcctagtaagcgcgagtcattagctcgtgctgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaacgatccggtgaaatgttcggatcgcggcgacggcgacggtccgccgtgcccgacgtcgcgagaagttcattgaaccttatcgtttagaggaaggtnattggtccggnactggatgtatcctntccctctggggntatacanaatatttacaattctttgatngtgaaaggtcnanatannnccgnnnnggnnattaatattacttgtgaggnacaacanttattgggagacantacagtnagagctgtagatatgagcgcgacagacggtntgatgagaggantgaaantnattganacaggagctcntctaagagtacccntcggtnnaatgactcngggacgaatnttntanntttttggagaacnngttgataatttaggtcttatagacacacgtacaacatttcctattcatcgacccgcccctgccttttcacaattagatattaatttggcaatttttgaaacaggcattaaagtcgtggaccttttagcaccttaccgacgtggtggcaaaattggtctctttgggggagcaggagtgggtaaaacagtgctaattatggagttaatcaataacatagctaaagctcatggtggtgtttccgtttttggtggcgtaggagaacgtactcgtgaaggaaatgatctttacatggaaatgaaggaatccggagtaatcaatgaaaaaaatataatagaatccaaagtagctctggtctatggtcaaatgaatgaaccaccaggagctcgtatgagagttggtttaaccgccctaactatggcagaatatttccgagatgtgaacgaacaagatgtacttttatttatagataatattttccgctttgttcaagctggatctgaagtatccgctctattgggcagaatgccctctgctgtaggttatcaaccaacccttagtacagaaatgggttctttgcaagagagaataacttctactaaaaaggggtctataacctctatccaagcagtttatgtacctgcggacgacttgactgatcccgctcctgctacaacattcgcacatttggatgctactactgtactttctagaggattagctgccaaaggaatctacccagcagttgacccattagattccacatctactatgcttcaacctaggattgtaggtgaaaaacattatgaaattgcacaagaagtgaaacaaaccttgcaacgttacaaagaacttcaagatattatagctattcttggactagatgaattatcagaagaagaccgattaactgtagccagagcacgaaaaattgaacgttttttatcacagcccttttttgtagcagaggtttttacgggttccccagggaaatatgttagtcttattgaaacaacaagaggttttcaaatgattcttgccggagatttagatggtctccctgaacaatccttttacttgattggtaatatcgatgaagttataaaatgataagagaaatccgaaanaagtaa---cgatggatttaaagctggtgttaaagattatagattaacttattatactccagagtatcagactaaggacactgatatcttggcagcattccgagtaactcctcaacccggagtaccgcccgaggaagcaggctgggcggtagctgctgaatcttctacaggtacatggaccacagtttggactgatggtcttactagtcttgatcgttacaaaggacgatgctgtgatatcgaacctgttccgggagaagacaatcaatattttgcttatgtagcatatcctttggacctttttgaagaaggttctgttactaacatgtttacttctattgtggggaatgtttttggttttaaagccctacgcgctctacgcctagaagatttgcgaattcctactgcttatattcaaacatttcaaggtccacctcatgggatccaagtagagagagataaattaaacaaatacggacgtcctttgttgggatgtaccatcaaacctaaattaggtctatctgctaaaaactatggtagagcagtttatgaatgtcttcgtggcggactagattttactaaagatgatgaaaatgtaaattctcgagcctttatgcgttggagagatcgctttgttttttgcgcggaagctatttataaagcacaagctgaaacaggtgaaattaagggacattacttaaatgctacgtcgggtacatgtgaagaaatgataaaaagagcagtattcgcaagagaattaggggttccgattgttatgcatgattatttaacaggaggtttcactgcaaataccactttagctcattattgccgagataatggcttacttcttcatattcatcgtgcaatgcatgcagttattgatagacaaaaaaatcatggtatgcacttccgtgtactggctaaagcattacgaatgtccggtggagatcatattcatgccggtactgtcgtaggtaaacttgaaggagaacgagaaattactttaggttttgtggatttacttcgtgatgactttattgaaaaagatcgaagtcgtggtatttatttcacgcaagattgggtatctatgccaggtgttctgcctgttgcttcaggaggtattcacgtttggcatatgcctgctttgactgagatctttggagatgacgctgtattacaatttggtggaggaaccttaggacatccttggggaaatgctcccggtgccgtagctaatcgggttgctttagaagcttgtgtccaagctcgtaatgaaggacgtgatcttgctcgtgaggggaatgaagtaattcgtgaagcttgcaagtggagtcctgaactagctgctgcttgtgaagtatggaaagaaatcaagtttgatgctacagtggat----- Marattia ----agattaagccatgcatgtgtaagtataaactctcttgtactgtgaaactgcgaatggctcattaaatcagttatagtttctttgatggtaccttactactcggataaccgtagtaattctagagctaatacgtgcaccgactcccgactttccggaagggacgcatttattagataaaaggccgatgcgggc-t-tgcccggtgac-tggcgaatcatgataacttcccgaatcgcacggccctggcgccggcgatgtttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcccgacacggggaggtagtgacaataaataacaatactgggcttttacaagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgctgcagttaaaaagctcgtagttggatctcggggcggggcgagcggtccgccccttcggtgtgcactggtcgcccgtccttttctgtcggggacgcgctccttgccttcgctggccgggacgcggattcggcgatgttactttgaaaaaattagagtgctcaaagcaagcctatgctctgaatacattagcatggaataacgtgataggactctggtcctattgtgttggtcttcgggaccggagtaatgattaatagggatggttgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaactactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatttgcggatgttacttcgatgactccgccagcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagtgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagttacgcgaagga-tcctcttcgtggccaacttcttagagggactatggccgtctaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgaattcaacgagtt-taacacctgggccgagaggcccgggtaatcttctgaaatttcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgctgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagttttcggatcgcggcgacgccggcggttcgccgccggcgacgttgtgagaagttcattaaaccttatcat------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------tcctgtcggtgaaattactcttggacgaatttttaatgttcttggagaaccagttgataatttaggacctgtcgatattggcacaacatcacctattcacaaatctgctcctgcttttacacaactagatactaaactatctatatttgaaacgggaattaaagtagtagatcttttagctccttatcgtcgtggaggaaaaattggattattcggaggagccggagtgggaaaaacagttcttattatggaattgattaataacattgccaaagctcatggaggtgtatcagtatctggtggcgtaggagaacggacccgtgaaggtaatgatctctacatggaaatgaaagaatcaaaggtaattaatcaagaaaacatttcagaatcaaaagtagctttggtatatggtcagatgaatgaaccaccaggagctcgtatgagagtcggtttaacagctccgacaatggctgaatatttcagagatgttaataaacaagatgtactattattcattgacaatatatttcgctttgttcaagcaggatcagaggtttccgctttattgggtagaatgccttctgctgtaggttatcaaccaacccttgctacagaaatgggttccttacaggaaaggattacttccactaaagaaggttctataacttccattcaagcagtttatgtaccggcagacgatttgactgatccggctcctgctacaacatttgcacattcagatgcgactactgtattatccaggggattagcagccaaaggcatttacccggctgtagatcccttagattcaacttcgactatgctacaaccctggattgtgggtgaagagcattatgagaccgcacagggggtgaaacaaactttacaacgttataaagaacttcaagatattatagctattcttggactggatgaattatcggaagaagaccgtttaacagtggctagagcacgaaaaattgaacgcttcttatcacaaccatttttcgtagcagaagtatttactggttctccaggaaaatatgttagtctgatagaaacaattaagggatttcaaatgattctttccggagaattagatagccttcctgaacaagctttttatttggtaggcaatatcgatgaagcgaccgcaaaggctgcaactttgcaagtggagaa----------------------------------------------tatactcctcagtatgagactaaggatactgatatcctggcagcattccgaatgactcctcaacctggagtaccgcctgaagaagcgggagctgcagtagctgccgaatcttctaccggtacttggactactgtatggacggatgggcttactagccttgatcgttacaaaggtcgatgctatgatatcgaacccgttgctggcgaagaaaatcaatatattgcttatgtagcttatcctttggatctattcgaagaaggttctgtcaccaatatgtttacctctatcgtaggtaacgtatttggattcaaagctttacgagctttacgattagaggacttaagaattcctcctgcttattcgaagaccttcctaggtccgcctcacggtatccaagttgaaagagataaattaaacaagtatggtcgtccactactaggatgtactatcaaaccaaaattaggtttatctgctaaaaactatggtagagctgtttatgaatgtcttcgtggtggacttgatttcacaaaagatgatgagaacgtaaattctcaaccatttatgcgttggagagatcgtttcttattcgtagcagaagctctttttaagtcccaagctgagacaggcgaagtaaaagggcactacttaaatgctactgcaggtacgtgtgaagaaatgatgaaaagagcaatctttgctagagaattgggcgcacccattgttatgcacgattatctgacaggaggatttactgcaaatacctcattggctcattattgtagagataatggtcttcttcttcatattcaccgtgcaatgcatgctgttattgacagacaacgaaatcacggtatacatttccgtgtattagctaaagcattgcgtatgtccggtggagatcatattcatgctggtacggtagtaggtaaacttgaaggagaacgtgaagtaactttaggctttgttgattcacttcgtgatgactatatcgaaaaagatcgaagtcgtggtatctatttcacccaggattgggtatctatgccgggtgtattccctgtagcttcaggtggtattcatgtttggcatatgcctgctctaactgagatttttggagatgattccgtattacaatttggtggaggaactctaggacacccttgggggaatgcacctggtgcagtagctaatcgagttgcttcagaggc---------------t-------------------------------------------------------------------------------------------------------------------------------- Angiopteris ----agattaagccatgcatgtgtaagtataaactctcttgtactgtgaaactgcgaatggctcattaaatcagttatagtttctttgatggtaccttactactcggataaccgtagtaattctagagctaatacgtgcaccgactcccgac-tcctggaagggacgcatttattagataaaaggccgatgcgggctt-tgcccggtgac-tggcgaatcatgataacttcccgaatcgcacggccctggcgccggcgatgtttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcccgacacggggaggtagtgacaataaataacaatactgggctt-tacaagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgctgcagttaaaaagctcgtagttggatctcggggcggggcgagcggtctgcctcctcggtgtgcactggtcgctccgtcctttctgtcggggacgcgctccttgcctttgctggccgggacgcggattcggcgatgttactttgaaaaaattagagtgctcaaagcaagcctatgctctgaatacattaacatggaataacgtgataggaccctggtcctattgtgttggtcttcgggaccggggtaatgattaatagggatggttgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaactactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatttgcggatgttacttcgatgactccgccagcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgacccaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagtgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagttacgcgaagga-tcctcttcgtggccaacttcttagagggactatggccgtctaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgaattcaacgagtt-taacacctgggccgagaggtccgggtaatcttctgaaatttcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgctgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagttttcggatcgcggcgacgccggcggtccgccgccggcgacgttgtgagaagttcattaaaccttatcat------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------tcctgtcggtgaagttactctcggacgaatttttaatgttcttggagaaccagttgataatttaggacctgtcgatgctggcacaacatcacctattcacaaatctgctcctgctttcacacaattagatacgaaactatctatatttgaaacgggaattaaagtagtagatctttcagctccttatcgtcgtggaggaaaaattggattattcggaggggccggagtgggaaaaacagttcttattatggaattgattaataacattgccaaagctcatggaggtgtatcagtttttggtggcgtaggagaacggacccgtgaaggtaatgatctttacatggaaatgaaagaatcaaaggtgattaatcaagaaaacatttcagaatcgaaagtagctttggtatatggtcagatgaatgaaccaccaggagctcgtatgagagtcggtttaacagctctgacaatggctgaatattttcgagatgttaataaacaagatgtactattattcattgacaatatatttcgctttgttcaagcaggttcagaggtttccgcttcatcaggtagaatgccttctgctgtgggttatcaaccaacccttgctacagaaatgggttccttacaagaaaggattacttccacaaaagaaggttctataacttccattcaagcagtttatgtaccggcagacgatttgactgatccggctcctgctacaacatttgcacattcagatgcgactactgtactatccagaggattagcagccaaaggcatctacccggctgtagatcctttagattcaacttcaactatgctacaaccctggattgtgggtgaagaacattatgagaccgcacaaggggtgaaacaaactttacaacgttataaagaacttcaagatattatagcgattcttggactggatgaattatcagaagaggaccgtttaacagtggctagagcacgaaaaattgaacgcttcttgtcacaaccatttttcgtagcagaagtatttactggttctccagggaaatatgttagtctgatagaaacaattaagggatttcaaatgattctttccggagaattagatagccttcctgaacaagctttttatttggtaggcaatattgatgaagcgaccgcaaaggctgcaactttgcaagtggagaa----------------------------------------------tacactcctgagtatgagactaaggatactgatatcctggcagcattccgaatgactcctcaacctggagtaccgcctgaagaagcgggagctgcagtagctgccgaatcttctaccggtacttggactactgtatggacagatgggcttactagccttgatcgttacaaaggtcgatgctatgatatcgaacctgttgctggcgaagaaaatcaatatattgcttatgtagcttatcctttggatctattcgaagaaggttctgtcaccaatatgtttacctctatcgtaggtaacgtattcggattcaaagctttacgagctttgcgattagaggacttaagagttcctcctgcttattcgaaaactttccaaggtccgcctcacggtatccaagctgaaagagataaattaaacaagtatggtcgtccactactaggatgtactatcaaaccaaaattaggtttatctgctaaaaactatggtagagctgtttatgaatgtcttcgtggtggacttgattttacgaaagatgatgagaacgtcaattctcaaccatttatgcgttggagagatcgtttcttattcgtagcagaagctctttttaagtctcaagctgagacaggcgaagtaaaagggcactacttaaatgctactgcaggtacgtgtgaagaaatgatgaaaagagcaatctttgctagagaattgggcgcacccattgtcatgcacgactatctgacaggaggatttactgcaaatacttcattggctcattattgtagagataatggtcttcttcttcatattcaccgtgcaatgcatgctgttattgacagacaacgaaatcacggtatgcatttccgtgtattagctaaagctttgcgtatgtccggtggagatcatgttcacgccggtacggtagtgggtaaacttgagggagaacgtgaagtaactttaggcttcgttgattcacttcgtgatgactatatcgaaaaagatcgaagtcgtggtatctatttcactcaggattgggtatctatgccgggtgtattccccgtagcttcaggtggtattcatgtctggcatatgcctgctctaactgagattttcggagatgattctgtattacaatttggtggaggaactctaggacacccttgggggaatgcacctggtgcagtagctaatcgagttgcttcagaggc---------------t-------------------------------------------------------------------------------------------------------------------------------- Ophioglossum ----agattaagccatgcatgtgtaagtataaactctcttgtactgtgaaactgcgaatggctcattaaatcagttatagtttctttgatggtaccttactactcggataaccgtagtaattctagagctaatacgtgcaccgactcccgac-ttccggaagggacgcatttattagataaaaggccgatgcgggc-t-tgcccggtgatgcggtgactcatgataactgtgcggatcgcacggcccttgcgccggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcccgacacggggaggtagtgacaataaataacaataccgggcttttacaagtctggtaattggaatgagtacaatctaaacaccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatctcggggcggggcgggcggtccgcccctcgggtgtgcactgcgcgctccgccctttctgccggggacgcgctcctggccttaggtggctgggacgcggattcggcgatgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacgttagcatggaataacgcgacaggactctggtcctattgtgttggtcttcgggaccggagtaatgattaatagggacggttgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaactactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggcggatgttacttcgatgactccgccagcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagtgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagttacgcgaagct-cagccttcgcggcgaacttcttagagggactgtggccgtctaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgaattcaacgagtc-cgccgcctgggccgagaggcccgggtaatcttctgaaatttcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgctgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagttttcggatcgcggcgacgccggcggtccgtccgccgcgacgttgtgagaagttcattaaaccttaccat------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------tcccgttggtgaatccactcttggacgaatatttaatgttctaggagaacctgtcgatgagttgggtcccgtagatgctgacgaaacatctcctattcacaaacctgctcctgctttcacacagttggataccaaattatccatatttgaaaccgggattaaagtggtggatctcttagctccttatcgtcgtggtggaaaaatcggattgtttgggggagccggagttggaaaaacggttcttatcatggaattgattaacaacattgctaaagcccacggaggtgtatctgtatttggtggggtaggggaacgtacacgcgaaggaaatgatctctatatggaaatgaaagaatcaaaagttattaatgaacagaatgtctcggaatcaaaagtagctctggtatatggtcaaatgaatgaatcgcccggagctcgtatgagggttggtttaaccgcgttaacaatggccgagtattttcgggatgttaataaacaagatgtactcctatctattgataatattttccgtttcgtacaagcaggatccgaggtttctgccttattggggagaatgccctccgctgtaggttaccaaccgactcttagtacagagatgggttccttacaagaaaggatcacttctaccaaggaaggatccataacttccattcaagcggtttatgtacctgccgacgatttgactgacccagcccctgccacaacatttgcacatctagatgctaccactgttctctcaagaggattagctgcgaagggtatttatccggccgtggatccactagattcaacttcaaccatgttacaacccttgattgtgggtgaggaacattataagactgcgcagggagttaaacagactctgcaacgttataaggaactccaagacattatagctattctcggactggatgaattatcggaagaggaccgtttaacggtagctagagcacgaaagattgaacgtttcttatcacagcctttctttgtagcagaagtattcacgggctctccgggcaaatatgttagtctcgtaaaaacaatcaaaggtttccaaatgattctttccggagaattagacaaccttcccgaacaagctttttattcagtgggtgacatcgatgaagcagctgcaaaagctgcaatttcgcaagcggggaa----------------------------------------------tacactcccgattatgagcctaaggataccgatatcctagcagcctttcgaatgactccccaacctggagtgccggccgaggaagcaggagctgcagtagctgctgaatcctccacgggtacgtggactaccgtatggaccgatgggcttaccagtctcgatcgttacaaaggtcgatgctatgaaatcgaacctgttgctggggaggaagatcaatacattgcttatgtagcgtatcccttagacctttttgaagaaggttccgtcaccaacatgttcacctccattgtaggtaacgtattcggattcaaggcattgaaagctctacggttggaggatttacgagttcctcctgcttattctaagactttcatgggccctccccacggtatccaagtcgaaagggataaattaaacaaatatggtcgtcccttactggggtgtaccatcaaacccaaattgggattatctgccaagaattatggtagagccgtttatgaatgcttacgcggtgggctcgacttcaccaaagatgatgaaaacgtaaattctcaaccatttatgcgttggagagatcgtttcgtatttgtggcggaagctcttttcaaatctcaggcggaaacgggagagattaaggggcattacttaaatgctaccgcaggtaattgtgatgaaatgatgaaaagagcagtatttgctcgagaattgggagtacccattgtcatgcacgattatttgacgggaggatttactgcaaatactaccttagcttcctactgccgagacaatggtttgctccttcacattcaccgtgcaatgcatgctgttatcgataggcaaaaaaatcacggtatgcacttccgtgtattggccaaagcattgcgcatgtctggcggggatcacattcatgccggtaccgtggttggtaaactcgagggcgaacgcgagatcactttaggtttcgttgatctacttcgtgacgattatattgataaagatcgaagtcgaggtatctatttcacccaggattgggtatccatgccgggtgtatttcctgtagcttcgggaggtattcacgtttggcatatgcctgctctaaccgagatcttcggggatgattccgtacttcaatttggtggggggactctgggacacccatggggtaatgcacccggtgcagtagctaatcgagtcgctctggaagc---------------t-------------------------------------------------------------------------------------------------------------------------------- Fagales_Juglans tcnaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatc-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggatgcatttattagataaaaggtcgacgcgggctt-tgcccgttgctctgatgattcatgataactcgacggatcgcacggccatcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgattgtaggatagaggcctacaatggtggtgacgggtaacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctcttacgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggttgggcagagcggtccgcccc-t-ggtgtgcaccggtctgctcgtcccttctaccggcgatgcgctcctggccttaactggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgtatacattagcatgggataacatcataggatttcggtcctattgtgttggccttcgggatcggagtaatgattaacaggaacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctttaaggactccgccggcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtncatgnccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggt-gaccttccgcggccagcttcttagagggactatggccgcttaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtt-tatagccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgaggcgatgtgggcggttcgctgccggcaacgtcgcgagaagtccactgnaccttatcatntagngg----ttattggtccggtactggatgtatcttttccccccggcaaaatgcctaatatttacaacgctctagtagttaagggtcgagatactaccggtcaacaaattaatgtgacttgtgaagtacagcaattattaggaaataatcgcgttagagctgtagctatgagtgctacagatggtctaatgagaggaatggaagtgattgacacgggagcttctttaagcgttccagtcggcggagcaactctaggacgaattttcaacgtgcttggagagcctgttgacaatttaggtcctgtagatactcgcacaacatctcctattcatagatctgcgcctgcctttatacagttagatacaaaattatctatttttgaaacaggaattaaagtagtagatcttttagctccttatcgccgtggaggaaaaataggactattcgggggagctggagtgggtaaaacagtactcattatggaattgatcaacaacattgccaaagctcatgggggtgtatccgtatttggcggagtaggtgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatctggagtaattaatgaacaaaatattgcagaatcaaaagtggctctagtatatggtcagatgaatgaaccgcctggagctcgtatgagagttggtttaactgccctaactatggcagaatatttccgagatgttaatgaacaagacgtacttctatttatcgacaatatcttccggttcgtccaagcaggatccgaagtatctgccttattgggtcgaatgccttccgctgtgggttatcaacccactcttagtaccgaaatgggttctttacaagaaagaattacttctaccaaagcgggatccataacctctattcaagcagtttatgtacctgcagacgatttgaccgatcctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagaggattagctgccaaaggtatctatccagcagtagatcctttagattcaacgtcaacgatgctccaacctcggatcgttggtgaagaacattatgaaactgcgcaaagagttaaacaaactttacagcggtataaagaacttcaggacattatagctattcttggattggacgagttatcagaagaggatcgcttaaccgtagcaagagcacgaaaaattgagcgtttcttatcacaaccttttttcgtagcagaagtatttacgggttccccgggaaaatatgtcggtttagccgaaaccattagagggtttcaattgatcctttccggagaattagacggtcttcctgagcaggctttttatttggtaggtaacattgatgaagctactgcgaaggctacaaacttagaaatggagagaagtgttggattcaaagctggtgttaaagattataaattgacttattatactcctgaatatcaaaccaaagatactgatatcttggcagcgttccgagtaagccctcaacctggagttccgcctgaggaagcaggggcagcagtagctgctgaatcttctactggtacatggacaactgtgtggaccgatgggcttactagtcttgatcgttacaaaggacgatgctaccacatcgagccagttgctggagaagaaaatcaatttattgcttatgtagcttaccccttagacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttggattcaaggccctgcgcgctctacgtctggaggatttgcgaatccctcctgcttattctaaaactttccaaggcccgcctcatggaatccaagttgagagagataaattaaacaagtatggccgccctctattgggatgtactattaaacctaaattgggattatccgctaagaattacggtagagcagtttatgaatgtctccgcggtgggcttgattttaccaaagatgatgagaacgtgaattcccaaccatttatgcgttggagagaccgtttcctattttgtgccgaagcaatttataaagcgcaggctgaaaccggtgaaatcaaagggcattacttgaatgctactgcaggtacatgcgaagaaatgatcaaaagggctgtatttgccagagaattgggagttcctatcgtaatgcatgactacttaaccgggggatttactgcaaatactagcttggctcattattgccgagataatggtctacttcttcacatccatcgtgcaatgcatgcagttattgatagacagaagaatcatggtatacactttcgtgtactagctaaagcgttacgtatgtctggtggagatcatattcacgctggtaccgtagtaggtaaacttgaaggggaaagagaaatcactttaggctttgttgatttactacgtgatgattttgttgaaaaagatcgaagccgcggtatttatttcactcaagattgggtctctctacctggtgttctgcccgtggcttcagggggtattcacgtttggcatatgcctgctctgaccgaaatctttggagatgattccgtactacaattcggtggaggaactttagggcacccttggggaaatgcacccggtgccgtagctaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgagggtaatgaaattattcgtgaggctagtaaatggagtcctgagctagcggctgcttgtgaagtatggaaggagatcaaatttgaattcccagcaatggatac Rosales_Morus tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtact-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggatgcatttattagataaaaggtcgac---ggctc-tgcccgttgctctgatgattcatgataactcgacggatcgcacggccattgtgccggtgacgcatnattcaaatatctgccctatcaactttcgatggtaggatagtggcctactatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-tacgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggttgggttgatcggtccgcctc-c-ggtgtgcaccggtcgactcgtcccttctgccggcgatgcgctcctggccttaattggccgggtcgtgcctccggcgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgtatacattagcatgggataacatcataggatttcggtcctattctgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaacagtttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgcttttaggactctgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctat-cggagga-taccctccgcggccagcttcttagagggactatggccgcttaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgataggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgaggcgacatgggcggttcgctgcctgtgacgttgcgagaagtccactgaaccttatcatttngaggaaggtcattggtccggtactagatgtagcttttcccccgggcaagatgcctaatatttacaacgctctggtagttwaaggtcgagatactgttggtcaacaaattaatgtgacttgtgaagtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacagatggtctaatgagaggaatggaagtgattgacacaggagctcctataagtgttccagtcggcggagcgacgctaggacgaattttcaacgtgcttggagagcccattgataatttaggtcctgtagatactcgcacaacatctcctattcatagatctgcgcctgcctttatacaattagatacaaanttatctatttttgaaacaggaattaaagtagtagatcttttagccccttatcgtcgtggaggaaaaataggactattcgggggggctggagtaggtaaaactgtactcattatggaattgatcaacaacattgccaaagctcatggaggtgtatccgtatttggcggagtaggtgagcgtacccgtgaaggaaatgatctttacatggaaatgaaagaatccggcgtaattaatgaacaaaatattgcagaatcaaaagtggctctagtctacggtcagatgaatgaaccgccgggggctcgtatgagagttggtttaactgccctaactatggcggagtattttagagatgttaatgaacaagacgtacttctatttatcgacaatatctttcgttttgtccaagcgggatccgaagtatccgccttattgggtagaatgccttctgctgtgggttatcaacccactcttagtaccgaaatgggttctttacaagaaagaattacttctaccaaagaggggtccataacttctattcaagcagtttatgtacctgcggacgatttgaccgatccagctccggccacgacatttgcacatttagatgctactaccgtactatcaagaggattggccgccaaaggcatctatccagcagtagatcctttagattcaacgtcaactatgctccaacctcggattgttggtgaagaacattatgaaactgcccaaagagttaaacaaactttacaacgttacaaagaacttcaggacattatagctatccttgggttggacgaattatccgaagaagatcgcttaaccgtagcaagagcacgaaaaattgagcgtttcctgtcacaacctttttttgtagcagaagtatttaccggttccccagggaaatatgttggtctagcagaaacaattagagggtttaaattgatcctttctggagaattagatggtcttcctgaacaggctttttatttggtaggtaacattgatgaagctactgcgaaggc-------------------------gttggattcaaagctggtgttaaagattataaattgacttattatactcctgactatgaaaccaaagatactgatatcttggcagcatttcgagtaactcctcaacctggagttccacctgaagaagcaggggcagcggtagctgctgaatcttctactggtacatggacaactgtatggactgacgggcttactagtcttgatcgttacaaaggtcgatgctaccacatcgagcccgttgctggagaagaaagtcaatttattgcttatgtagcttaccccttagacctttttgaagagggttctgttactaacatgtttacttccattgtaggtaatgtgtttgggttcaaggccctgcgcgctctacgtctggaggatttgcgaatccctactgcttatgttaaaactttccaaggcccgcctcatgggatccaagttgagagagataaattgaacaagtatggccgccccctattgggatgtactattaaacctaaattggggttatccgctaagaattacggtagagcagtttatgaatgtctccgcggtggacttgattttaccaaagatgatgagaatgttaattcccaaccatttatgcgttggagagaccgtttcttattttgtgccgaagcaatttataaagcacaggctgaaacaggtgaaatcaaagggcattacttgaacgctactgcaggtacatgcgaagatatgatgaaaagagctgtatttgccagagaattgggggttcctatcgtaatgcatgattacttaacagggggattcactgcaaatactagcttggctcattattgccgagataatggtttacttcttcacatccaccgtgcaatgcatgcagttattgatagacagaagaatcatggtatgcactttcgtgtactagctaaagcgttacgtatgtctggtggagatcatatacacgctggtaccgtagtaggtaaacttgagggggaaagggagatcactttaggctttgttgatttactacgtgatgattttgttgaaaaagatcgaagccgcggtatttatttcactcaagattgggtctctatgccaggtgttttgcctgtagcttcagggggtattcacgtttggcatatgcctgctctgaccgagatctttggagatgattctgtactacaatttggcggcggaactttaggacacccttggggaaatgcacctggtgccgtagctaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgagggtaatgaaattattcgcgaggctagtaaatggagtcctgaactagctgctgcttgtgaagtatggaaggagatcaaatttgaatt--------------- Rosales_Humulus tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatc-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggatgcatttattagataaaaggtcgacgcgggctc-tgcccgttgctctgatgattcatgataactcgacggatcgcacggccttcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctactatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-tacgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggttgggtcgatcggtccgcctc-c-ggtgtgcaccggtcggctcgtcccttctaccggcgatgcgctcctggccttaattggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgtatacattagcatgggataacatcataggatttcggtcctattctgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggattggcggatgttgcttttaggactccgccagcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggagga-tttcctccgcggccagcttcttagagggactatggccgcttaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgaggcgacgtgggcggttcgctgcccgcgacgtagcgagaagtccactgaaccttatcatttagaggaaggtcattggtccggtactggatgtagcttttccgccggggaaaatgcctaatatttacaatgctctggtagttaagggtcgagatactgttggtcaacaaattaatgtgacttgtgaagtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacagatggtctaatgagaggaatggacgtgattgacacaggagctcctttaagtgttccagtcggcggagcgacactaggacgaattttcaacgtacttggggagcccgttgataatttaggtccggtagatactcgcacaacatctcctattcatagatctgcacctgcctttatacaattagatacaaaattatcgatttttgaaacaggaattaaagtagtagatcttttagccccttatcgccgtggaggaaaaataggactcttcgggggtgctggagtaggtaaaacagtactcattatggaattgatcaacaacattgccaaagctcatgggggcgtatccgtatttggcggagtaggtgaacgtacccgtgaaggaaatgatctttacatggaaatgaaagaatctggcgtaattaatgaacaaaatattgccgaatcaaaagtggctctagtctatggtcagatgaatgaaccaccaggggctcgtatgagagttggtttaactgctctaactatggcggagtatttccgagatgttaatgaacaagacgtacttctatttatcgacaatatctttcgttttgtccaagcaggatccgaagtatccgccttattaggcagaatgccttccgctgtgggttatcaacccactcttagtactgaaatgggttctttacaagaaagaattacttctaccaaagaggggtccataacttctattcaagcagtttatgtacccgcggacgatttgaccgatccagctccggccacgacatttgcacatttagatgcgactaccgtactatcaagaggattggccgccaaaggcatctatccagcagtagatcctttagattcaacgtcaacgatgctccaacctcggattgttggtgaagaacattatgaaactgcgcaaagagttaaagaaactttacaacgttacaaagaacttcaggacattatagctattcttgggttggacgaattatccgaagacgatcgcttaaccgtagcaagagcacgaaaaattgagcgtttcttgtcacaaccttttttcgtagcagaagtatttacaggttccccggggaaatatgttggtctagcagaaacaattaaagggtttaaattgattctttctggagaattagatggtcttcctgaacaggctttttatttggtaggtaacattgatgaagctactgcgaaggctacgaacttagaaatggagaaaagtgttggattcaaagctggtgttaaagattataaattgacttattacactccggactatgaaaccaaagatactgatatcttggcagcatttcgagtaactcctcaacctggagttccccctgaagaagctggggctgcggtagctgctgaatcttctactggtacatggacaactgtatggactgacgggcttaccagccttgatcgctacaaaggtcgatgctaccacatcgagcccgttgctggagaagaaaatcaatatattgcttatgtagcttatcctttagacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttgggttcaaagccctgcgcgctctacgtctggaagatttgagaatccctacttcttatactaaaactttccaaggtccgcctcatgggatccaagttgagagagataaattgaacaagtatggccgcccactattgggatgtactattaaacctaaattggggttatccgctaagaattacggtagagcagtttatgaatgtcttcgtggtggacttgattttaccaaagatgatgagaacgtgaattcccaaccatttatgcgttggagagaccgtttcttattttgtgcagaagcaatttataaatcacagtctgaaacaggggaaatcaaaggacattacttgaatgctactgcaggtacatgtgaagaaatgatgaaaagggctgtatttgccagagaattgggagttcctattgtaatgcatgattacttaacaggaggattcactgcaaatactagcctggctcattattgtcgagataatggtctacttcttcacatccaccgtgcaatgcatgcagttattgatagacaaaagaatcatggtatacactttcgtgtactagctaaagcgttacgtatgtctggtggagatcatatccatgcgggtactgtagtaggtaaacttgaaggggaaagagaaatcactttaggctttgttgatttactacgtgatgattttattgaaaaagatcgaagccgtggtatttatttcactcaagattgggtctctctaccaggtgttctgcccgtggcttcagggggtattcacgtttggcatatgcccgctttgaccgagatctttggagatgattccgtactacaatttggtggaggaactttaggacatccttggggaaatgcacccggtgctgtcgctaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgagggtaatgaaattattcgtgaggcttgtaaatggagtcctgaactagctgctgcttgtgaagtttggaaggaaatcaaatttgaatttgaagcaatggatac Gymno_Cycas tcaaagattaagccatgcatgtgttggtatgaactatgtcggactgtgaaactgcgaatggctcattaaatcagttatagtttatttgatggattcatgttactcggataaccgtagtaattctagagctaatacgtgtaccaaatcctgac-ttttggaagggaggcatctattagataaaaggccgatgcgggctc-tcgccggtcgttcggtgattcatgataactcgacggatcgcatggccctagtgccggcgacgtttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatttaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggacggcccgaccggtctgcctttc-ggtgtgcatcgatcgtttcgtcctttttgtcggcggcgcgttcctggacttagttgcctgggttgcggctctggcgttgttactttgaaaaaattagagtgctcaaggcaagcccacgctctgaatacattagcatggaataacacgataggattctggtcctattacgttggccttcgggaccggagtaatgattaatagggacagtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggtggatgttgctctaaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcagaggg-tttcctttgcggccagcttcttagagggactatggccgttcaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tataaccttggccgagaggttggggtaatctgtggaaatttcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcaacacgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatgatccggtgaagtgttcggatcgcggcgacgacggcggtttgctgctgccgacgtcgcgagaagttcattgaaccttattatttagaggaagg-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------tccggttggtggagctactctcggacgaattttcaatgttattggagaacctgtcgataatttaggtcctgtagatgctcgcacaacatctcctattcatagacccgctcctgcctttatacagttggatacaaagttatcaatcttcgaaacaggcattaaagtggtggatcttttagctccttaccgccgtggaggaaaaataggactattcgggggagctggggtaggtaaaacagtgctcatcatggaattaatcaacaatattgctaaggctcatggaggtgtatctgtatttggcggagtaggagaacgcacccgtgagggaaatgatctttacgttgaaatgaaagaatcgggagtaattaatgaacaagatatctcgggatcgaaagtagctctggtctatggccagatgaatgaaccaccaggagctcgtatgagagttgggttaaccgccctaaccatggctgaatatttccgagatgtcaatgagcaagacgtacttttatttatcgacaatatcttccgttttgtccaagcgggatcagaagtatctgcattattaggcagaatgccttccgctgtgggttatcagccaactcttagtacagaaatgggttctttgcaggaaagaattacttctaccaaagagggatctataacctccattcaagcagtttatgtacctgcagacgatttgaccgaccccgctcctgctacaacatttgcacatttagatgctactaccgtattatcgagaggattagctgccaaaggcatctatccagcagtagatcctttagattcaacatcgaccatgctccaaccttggatcgtgggcgaagaacattatgaaactgcacaaggagtcaagcaaactttacagcgttataaagaacttcaagacattatagctattcttggactggacgaattatcagaagaagatcgtttaaccgtagcaagagcacgaaagattgaacgtttcttatcacaacccttttttgtagcagaggtattcactggttccccgggtaaatatgtcggtctcgtagaaacaattagaggttttaaaatgatcctttccggagaattagatggtcttcccgaacaggccttttatttggtgggtaacattgatga----------------------------------ag----gttggatttaaagctggtgttaaagattacagattaacttattacactcctgaatatcaaaccaaagataccgatatcttggcagcgttccgagtaactcctcaacctggagtgccgcctgaggaagcgggagctgcagtagccgctgaatcttccactggtacatggaccactgtttggaccgatggacttaccagtctcgatcgttacaaggggcgatgctatgacatcgagcccgttcctggggagaaaaatcaatttattgcctatgtagcttaccccttagacctctttgaagaaggttctgttactaacatgttcacttccattgtaggtaatgtatttggattcaaagccctacgagctctacgcctagaagatttgcgagttcctcctgcttattccaaaactttccaaggtccacctcatggtatccaagttgaaagagataaattaaacaaatatggccgtcctctattgggatgtactattaaacccaaattgggtttatctgccaaaaactatggtagagcagtttatgaatgtcttcgtggtggacttgattttaccaaagatgatgagaacgtaaattcccaaccatttatgcgctggagagatcgtttctgcttctgtgcagaagcaatttataaagctcaggctgagacgggtgaaattaagggacattacttgaatgctactgcaggtacatgcgaagaaatgatcaaaagggcagtatttgccagagaattgggggttcctatcgtcatgcatgactacctgacgggaggatttactgcaaataccagcttggctcattattgccgagacaatggcctacttcttcacattcaccgcgcaatgcatgcagttattgacagacaaagaaatcatggtatgcacttccgtgtgctagctaaagcattgcgaatgtccggtggagatcatattcacggcggtactgtagtaggtaaacttgaaggagaacgagacgtaactttgggttttgttgatctactgcgtgacgattttattgaaagagaccgaagtcgtggtatttatttcacccaagattgggtatctatgccaggtgttctgcccgtagcttcggggggtattcacgtttggcatatgcctgctctaaccgagatctttggggatgattccgtactacagttcggtgggggaactttgggacacccttggggaaatgcacctggtgcagtagcgaatcgagttgccttagaagcttgtgtacaagctcgtaatgaaggacgtgatcttgctcgtgaaggtaatgaagtgatccgcgaagctagtaaatggagtcc---------------------------------------------------------c----- Gymno_Araucaria tcaaagattaagccatgcatgtctaagtatgaactatttcagactgtgaaactgcggatggctcattaaatcagttatagtttctttgatggtaccttgctactcggataaccgtagtaattctagagctaatacgtgcaccaagtcccaac-tttcggaagggatgcatttattagataaaaggccggcgcgggctt-cggcccgcgttccggtgattcatgataactcgacggatcgcacggcccttgtgccggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatctaaaccccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggtcgtcacggtcggtccgccttcttggtgtgcaccggccctcacgtcccttctgccggcggcgtgttcctgtccttaactggttgggtcgcggcaccggcgctgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacattagcatggaataacgtgataggagtctggtcctattccgttggccttcgggaccggagtaatgattaatagggactgtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatggaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctctaaggactccgccagcaccttctgagaaatcagagtgtttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgacagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgataacgaacgagacctcagcctgctaactagctacgcggaggt-tccccttcgcggccagcttcttagagggactatggccgtttaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgcaatcaacgagctttctgccctggttcgataggcccgggaaatcttgtgaaattgcatcgtgatggggatagaccattgcaattattgatcttcaacgaggaattcctagtaaacgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttccgatcgcgacgacgatggcggtcctctgccggcgacgtcgcgagaagttcattgaaccttatcatttagaggaagg-----------------------------------------------------------------------------------------------------------------------------------------------gttagagctgtagctatgagtgctacagatggtttgatgagaggaatgaaagtgtttgatacaggagctcctctgagtgttccagttggtggagctactctcggacgaatttttaatgttcttggagaacctgtcgatgatttaggtcctgtagatgctcgcgcaaaatcccctattcatagagctgctcctgcctttacacagttggataccaaattttcaatttttgaaacaggcattaaagtagtggatcttttagctccttatcgccgcgggggaaaaataggattatttgggggagctggagtgggtaaaacagtactcattatggagttaatcaacaacattgctaaggctcatgggggtgtatctgtatttagcggggtaggagagcgtacccgtgaaggaaatgatctttatatggaaatgaaagaatcgggagtcattcaggaacaaaatatctcagaatccaaagtagctctggtctatggtcagatgaacgaaccaccaggagctcgtatgagagtcgggttaactgctttaacgatggcggaatatttccgagatgtaaataagcaagatgtactattatttattgacaatatcttccgctttgtccaagcaggatcagaggtatccgccttattaggaagaatgccttctgctgtgggttatcagccgactcttggcacggaaatgggttgtttgcaagagagaataacttctaccaaagagggatctataacctccattcaagcagtttatgtacctgcggacgacttgactgatcctgctcctgctacaacatttgcacatttagacgctactaccgtgctatcacgaggattagctgccaagggtatctatccagcggtagatcctttagattcaacatcaactatgctccaaccttcgatcgttggcgaagaacattatgaaattgcacaaggagttaaacaaactttgcaacgttataaggaacttcaagacattatagctattcttggactggacgaattatcagaagaggatcgtttaacagtagcaagagcacgaaaaattgaacgtttcttgtcacaaccctttttcgtagcagaggtattcactggttccccgggtaaatatgttagtctcacagaaacaattagaggctttcaaatgattctttccggagaattagacggtctccctgaacagtctttttatttggtgggtaacattgatga----------------------------------ag----gttggatttaaagctggtgttagagattatagattaacttattatactccggaatatcagacccttgatacggatatcttggcagcattccgagtcactcctcaacccggagtgccccccgaggaagcaggagcagcagtagcggctgaatcttctaccggtacatggacaactgtttggaccgatggacttaccagtcttgatcgttacaaggggcgatgctatggcatcgagcctgttcctggagaggaaactcaatttattgcctatgtagcttaccccttagacctttttgaagaaggttctgttaccaacctgttcacttccattgtaggtaatgtatttggattcaaagccctacgggctctacgtctggaagatctgcgaattcctcctgcttattccaaaactttccaaggtccaccccatggtattcaagttgaaagagataaattaaacaaatatggccgtcccttgttggggtgtactatcaaaccaaaattgggtctatctgccaaaaattatggtagagcagtttacgaatgtctccgcggtggacttgattttaccaaggatgacgagaacgtgaattcccaaccattcatgcgctggagagatcgttttgtcttttgtgcagaagcaatttataaagctcaggcggagacgggtgaaattaaggggcattacttgaatgctactgcaggtacatgtgaagaaatgatgaaaagagtaagtttcgcctatgaattgggagttcccatcgtcatgcatgactatctgacgggaggttttacggcaaatacttcgttggctcattattgccgagatcatggcctacttcttcatattcaccgcgcaatgcatgcagttattgacagacaaaaaattcatggtatgcactttcgtgtgctggctaaagcattgcgtatgtctggcggagatcatgttcacgctggtactgtagtaggtaaacttgaaggtgaacgagaagttactttaggttttgttgatttactacgtgatgattttattgaaaaagaccgaagtcgtggtatttattttactcaagattgggtatctatgccaggtgttttgcctgtagcttcagggggtattcacgtttggcatatgcctgctctgaccgagatctttggggatgattctgtattacagtttggtgggggaactttgggacacccttggggaaatgcacctggtgcagtagctaatcgggtcgctttagaagcttgtgtacaagctcgtaatgaaggacgtgatcttgctcgtgaaggtaatgaaattatccgtgaagcagctaaatggagtcc---------------------------------------------------------t----- Gymno_Sciadopitys tcaaagattaagccatgcatgtctaagtatgaactatttcaaactgtgaaactgcggatggctcattaaatcagttatagtttctttgatggtaccttactactcggataaccgtagtaattctagagctaatacgtgcaccaactcccgac-ttctggaagggacgcatttattagatacaaggccggcgcgggc-t-tgcccgctactccggtgattcatgataactcgacggatcgcacggccctggtgccggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggccgttacggtcggtccgcctactcggtgtgcactggccatgacgtcccttctgccggcggcgtgctcctggccttagttgactgggtcgcggttccggcgccgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacattagcatggaataacgcgataggagtctggtcctgttccgttggccttcgggaccggagtaatgattaatagggactgtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatggaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctctaaggactccgccagcaccttctgagaaatcagagtgtttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcggaggt-tctccttcgcggccagcttcttagagggactatggccgtttaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgcaaccaacgagttctttgccctggttcgaaaggcccgggaaatcttgccaaattgcatcgtgatggggatagaccattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatgatccggtgaagtgttcagatcgcgccgacggcggcggttctctgccggcgacgtcgcgagaagttcattgaaccttatcatttagaggaagg-----------------------------------------------------------------------------------------------------------------------------------------------gttagagctgtagctatgagtgctacagatggtttgaaaagaggaatgagagtgattgatacaggagctcctcttagtgttcctgtcggtgaagctactctcggaagaatttttaatgttcttggagaacctgtcgatgatttaggtcctgtagatactcctaaaacatctcccattcatagatctgctcctgcttttacacagttggataccagattttcaattttcgaaacaggcattaaagtagtggatcttttagctccttaccgtcgtgggggaaaaattgggctatttgggggagcaggagtgggtaaaacagtactgattatggagttaatcaacaacattgctaaggctcatgggggtgtatctgtatttggtggagtaggagagcgtacccgtgaaggaaatgatctttacaaggaaatgaaagaatcgggagtaattaatgaacaaaatatctcagaatccaaagtagctctggtctatggtcagatgaatgaaccaccaggagctcgtatgagagtcgggttaactgccctaactatggctgaatatttcagagatgttaataagcaaaacgtactattatttattgataatatcttccgctttgtccaagcagggtcagaggtatctgccttattaggcagaatgccttccgccgttggttatcaaccaactcttagtacggaaatgggttctttgcaagagagaatcacctctaccaaagatggatctataacttccatccaagcagtttatgtacctgcagacgacttgaccgaccctgctcctgctacaacatttgcacatttagatgctactaccgtactatcgagaggattagctgccaagggcatctatccagcggtcgaccctttagattcaacgtcgactatgctccaaccttcgatcgtgggcaaagaacattatgaaactgcacaaggggttaagcaaacttt--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------g----gttggattcaaagctggtgttaaagattacagattaacttattatacccctgaatatcagaccaaagacactgatatcttggcagcattccgagtcactcctcaacccggagtgcctcctgaggaggcaggannngcagtagctgccgaatcttccactggtacatggaccactgtttggaccgatggactcaccagtcttgatcgttacaaggggcgatgctatgacatcgagcccgttcctggagaggaaagtcaatttattgcctatgtagcttatcccttagatctttttgaggaaggttctgttactaacatgttcacttctattgtaggtaatgtatttggattcaaagccctacgggctctacgtctggaagatctgcgaattcctcctgcttattcaaaaactttccaaggtccgccccatggtatccaagttgaaagagataaattaaacaaatatggtcgccctttattggggtgtactatcaaaccaaaatgtggcctatctgccaaaaattatggcagagcagtttacgaatgtcttcgcggtggacttgattttaccaaagatgatgagaacgtgaattcccaaccattcatgcgctggagagaccgtttttgcttttgtgctgaagcaatttataaagctcaagctgaaacgggtgaaattaagggacattatttgaatgctactgcaggtacatgtgaagaaatgatcaaaagagcagtattcgccagagaattgggagtccccatagtcatgcatgactatctgacgggaggttttacggcaaatacttcgttgtctcattattgccgagacaacggcctacttcttcacattcaccgcgcgatgcatgcagttattgacagacaaagaaatcatggtatgcatttccgtgtgctggctaaagcactacgtatgtctggtggagatcatattcacgctggtactgtagtaggtaaacttgaaggagaacgagaagtcactttgggttttgttgatttactgcgtgatgattttattgaaaaagatcgaagccgtggtatttatttcactcaagattgggtatctatgccaggtgttttgcctgtggcttcagggggtattcacgtttggcatatgcctgctctgactgagatctttggggacgattctgtattacagttcggtgggggaactttggggcatccgtggggaaatgcgcctggtgcagtagctaatcgagtcgctttagaagcttgtgtacaagctcgtaatgaaggacgcgatcttgctcgtgaaggtaatgaagtgatccgtgaagcttgtaaatggagtcc---------------------------------------------------------t----- Gymno_Juniperus tcaaagattaagccatgcatgtctaagtatgaactatttcagactgtgaaactgcggatggctcattaaatcagttatagtttctttgatggtactttgctactcggataaccgtagtaattctagagctaatacgtgcaccaaatcccgac-tcttggaagggatgcatttattagataaaaggccggcgcgggc-t-cgcccgctattccggtgattcatgataactcgacggatcgcacggcctttgtgctggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggtcgtcacggtcggtccgcctttttggtgtgcactggccctcacgtcccttctgccggcggcgtgttcctggccttaattggctgggtcgcggttccggcgccgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacattagcatggaataacgcgataggagtctggtcctgttccgttggccttcgggaccggagtaatgattaatagggactgtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatggaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctctaaggactccgccagcaccttctgagaaatcagagtgtttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcggaggt-tccccttcgcggccagcttcttagagggactatggccttctaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgcaaccaacgagtttctctccctggcccgaaaggtttgggaaatcttgccaaattgcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatgatccggtgaagtgttcggatcgcggcgacgacggcggtt-cctgtcggcgacgtcgcgagaagttcattgaaccttatcatttagaggaagg-----------------------------------------------------------------------------------------------------------------------------------------------gttagagctgtcgctatgagtgctacagacggtttgatgagaggaatgaaagtaattgatacaggagggccacttagtgttccagttggtgaaactactctcgggagaatttttaatgttcttggggaacccgttgataacttaggtcctgtagatgctctcacaagatctcctattcatagatctgctcccgcctttacacagttggataccaaattttcaatctttgaaacaggcattaaagtagtggatcttttagctccttatcgccgtggggggaaaattggattattcgggggagctggagtgggtaaaacagtgttgattatggaattaatcaacaacattgctaaggctcatggaggggtttctgtgtttggtggagtaggagaacgtacccgtgaaggaaatgatctttacaaggaaatgaaagaatcgggagtcattaatgaacaaaatatatccgaatccaaagtagctctggtctatggtcagatgaatgaaccaccaggagctcgtatgagagtaggtttaactgctttaactatggctgaatatttccgagatgtcaataaacaagatgtacttctatttattgacaatatcttccgctttgtccaagcaggatcagaggtatccgcattattaggcagaatgccttccgcagtgggttatcagcccactcttagcacggaaatgggttctttacaagagagaataacttctacgaaagaaggatctataacctccattcaagcagtttatgtacctgcagatgacttgactgatcccgctcctgctacaacatttgcacatttagatgctactactgtactatcgagaggattagctgccaaaggcatctatccagcggtagatccgctggattccacgtcaactatgctccaaccttcgatcgtaggcgaacaacattatgaaactgcgcaaggagttaaacaaactttgcaacgttataaggaacttcaagatattatagctattcttggattagatgaattatcagaagatgatcgtttacttgtagcaagagcaagaaaaattgaacggtttttgtcacaacccttttttgtagcagaggtattcaccggttcccccggtaaatatgttagtctaatagagacaattagaggttttcaaatgatcctttccggagaattagatgctctacccgagcagtctttttatttggtgggtaacattgatga----------------------------------ag-------------aaagcgggtgttaaagattacagattaacttattatactccggaatatcagaccaaagatactgatatcttggcagcattccgagtcactcctcaacctggagtgccccccgaagaagcgggagcagcggtagctgccgaatcttccactggtacgtggaccactgtttggaccgatggacttaccagtcttgatcgctacaaggggcgatgctatgatattgaacccgttcctggagaagaaactcaatttattgcctatgtagcttaccctttagacctttttgaagaaggctctgtgactaacctgtttacttctattgtaggtaatgtatttggattcaaagctttacgggctvtacgtctggaagatttacgaattcctcctgcttattcaaaaacttttcaaggcccdccacatggtattcaagtagaaagagataaattaaacaaatatggtcgtcctttattgggatgtactatcaaaccaaaattgggtctatctgmcaagaattatggtagagcggtttatgaatgtctccgtggtggacttgattttaccaaggatgatgaaaacgtgaattcccagccatttatgcgctggagagatcgtttctgcttttgtgcagaagcactttataaagctcaggctgagacgggtgagattaagggacattacctgaatgcnactgcaggtacatgtgaagaaatgattaaaagagcagtattcgccagagaattgggagttcctatagtcatgcatgactatctgactggaggttttacggcaaatacttcgttggctcattattgccgagataacggcctacttcttcacattcaccgcgcaatgcacgcagttattgacagacaaagaaatcatggtatgcacttccgtgtactggctaaagcactacgtatgtctggtggagatcatattcatgctggtactgtagtaggtaaacttgaaggagaacgagaagtcactttgggttttgttgatctattgcgtgatgattttattgaaaaagaccgaagtcgtggtatttatttcactcaagattgggtctctatgccgggtgtcctgcctgtagcttcaggaggtattcacgtttggcatatgcctgctctgaccgagatctttggagatgattccgtattacagtttggtggagggactttggggcacccttggggaaatgcacctggtgcagtggctaatcgggtcgctttagaagcttgtgtacaagctcgtaatgaaggacgtgatcttgcgcgtgaagg--------------------------------------------------------------------------------------------------- stephaneguindon-phyml-76a39c8/examples/proteic000066400000000000000000000626061501136442400216220ustar00rootroot0000000000000037 547 tax1 ALSDPSKLES DKDLRIDITP DKENKTLTIR DTGIGMTKAD LVNNLGTIAR SGTKQFMEAL tax2 SLSDPSKLDT GKDLRIDIIP DKENKTLTIQ DTGIGMTKAD LVNNLGTIAR SGTKQFMEAL tax3 SLTDASVLES KTELEIKIIP DKTAKTLTLI DSGIGMTKTD MVKNLGTIAR SGTKNFMEQL tax4 SLTDKSKLDA QPELFIRIIP DKATNTLTLI DSGIGMTKSD LVNNLATIGR SGTKDFMEAL tax5 SLTDKSKLDA QPELFIRLVP DKASKTLSII DSGVGMTKSD LVNNLGTIAR SGTKEFMEAL tax6 SLTDKSKLDG QPELFIHIIP DKANNTLTII DSGIGMTKAD LVNNLGTIAR SGTKEFMEAL tax7 SLSDKSILDT EAAMEIRIIA DKEAKTLTLQ DTGVGMTKGD LVNNLGMIAN SGTKSYMEAL tax8 SLTDSSVLDN EPKLEIRILT DKNNKSLTLI DTGIGMTKDD LIQNLGTIAK SGTKSFMEAL tax9 SLTDKSKLDA QPELFIHIVP DKASNTLSII DSGIGMTKSD LVNNLGTIAR SGTKEFMEAL tax10 SLTDKSKLDG QPELFIHIIP DKTNNTLTII DSGIGMTKAD LVNNLGTIAR SGTKEFMEAL tax11 SLTDKSKLDG QPELFIHIIP DKTNNTLTII DSGIGMTKAD LVNNLGTIAR SGTKEFMEAL tax12 SLTDKSKLDG QPELFIHIIP DKTNNTLTII DSGIGMTKAD LVNNLGTIAR SGTKEFMEAL tax13 SLTDKSKLDA QPELFIRLVP DKTNKTLSII DSGVGMAKAD LVNNLGTIAR SGTKEFMEAL tax14 SLTDPSVLGE SPRLCIRVVP DKENKTLTVE DNGIGMTKAD LVNNLGTIAR SGTKAFMEAL tax15 SLTDPSVLGD ATRLCVRVVP DKENKTLTVE DNGIGMTKAD LVNNLGTIAR SGTKAFMEAL tax16 SLTNQSVLGD EPHLRIRVIP DRVNKTLTVE DSGIGMTKAD LVNNLGTIAR SGTKSFMEAL tax17 SLTNQAVLGD ESHLRIRVVP DKANKTLTVE DTGIGMTKAE LVNNLGTIAR SGTKAFMEAL tax18 ALTEPSELDT GKELFIKITP NKEEKTLTIM DTGIGMTKAD LVNNLGTIAK SGTKAFMEAL tax19 ALTEPAELET GKELYIKITP NKADKTLTIM DTGIGMTKAD LVNNLGTIAK SGTKAFMEAL tax20 SLTDPTKLDS GKDLKIDIIP NVQERTLTLI DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax21 SLTDPSKLDS GKELHINIIP NKQDRTLTIV DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax22 SLTDPTKLDS GKELFIKIIP NKEAGTLTLI DTGIGMTKAD LVNNLGTIAK SGTKAFMEAL tax23 SLTDPSKLDS GKELYIKLIP NKTAGTLTII DTGIGMTKSD LVNNLGTIAK SGTKAFMEAL tax24 SLTDPTKLDN GKELKIDVIP NVEERTLTLI DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax25 SLTDPSKLDS GKELKIDIIP NPQEATLTLV DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax26 SLTDPSKLDS GKELHINLIP SKQDRTLTIV DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax27 SLTDPSKLDS GKELKIDIIP NPQERTLTLV DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax28 VCSDPSKPGL QDHSSIDIIP DKANKTLTIR DTGIGMTKAD LVNNLGTIAR SGTKQFMEAL tax29 ALSDPSQLES EPELFIRITP HKDQKVLEIR DSGIGMTKAD LVNNLGTIAK SGTKSFMEAL tax30 ALSDPSQLES EPELFIRIIP QKDQKVLEIR DSGIGMTKAD LVNNLGTIAK SGTKSFMEAL tax31 SLSDPHALDA EKDLFIRITP DKENKILSIR DTGIGMTKND LINNLGVIAK SGTKQFMEAA tax32 SLSDPKQLET EPDLFIRITP KPEQKVLEIR DSGIGMTKAE LINNLGTIAK SGTKAFMEAL tax33 AIKDPKQVED FPEYQISLSA DKTNKTLTIE DTGIGMTKTD LINNLGTIAK SGTKAFMEAI tax34 SITDTQKLSA EPEFFIRIIP DKTNNTLTIE DSGIGMTKND LINNLGTIAR SGTKAFMEAI tax35 SITDSEKAKL EPNFRIRIIP DKANNTLTLW DTGIGMTKKE LINNLGTIAK SGTKAFMEAL tax36 AITEPEKLKT KPELFIRLIP DKANNTLTIE NSGIGMTKAD LVNNLGTIAR SGTKAFMEAL tax37 AIKDPKQIED QPDYYIRLYA DKNNNTLTIE DSGIGMTKAD LVNNLGTIAK SGTRAFMEAL TSMIGQFGVG FYSAYLVADK VTVISKSNDD QYIWESNAGG TFKVTDGRAI GRMILHLDEQ TSMIGQFGVG FYSAYLVADR VTVVSKNNDD QYIWESSAGG TFNISDGPSI GRIILHLDEQ QSMIGQFGVG FYSAYLVADT VIVHSKNNDD QYVWESSAGG EFTIADTEPL GRIVLHMEDQ ASMIGQFGVG FYSAYLVAER VIVTSKHNDD QHVWESQAGG SFTVTDGEPL GRITLYLDDQ ASMIGQFGVG FYSAYLVADR VMVTTKHNDD QYVWESQAGG SFTVTDGEQL GRITLFLDDQ ASMIGQFGVG FYSAYLVAEK VVVTTKHNDD QYVWESQAGG SFTVTDGENL GRMVLYLEDQ SSMIGQFGVG FYSAYLAADN VVVHTKHNDD QYVWESSAGG SFTIRKGPAL TRVVLHLDDQ QSMIGQFGVG FYSAYLVADR VVVETKNNND QYIWESSAGG SFTINDITDL ARITLFLDDQ ASMIGQFGVG FYSAYLVAER VVVTTKHNDD QYVWESQAGG SFTVTDGEQL GRITLYLDDQ ASMIGQFGVG FYSAYLVADK VVVTTKHNDD QYVWESQAGG SFTVTDGEAL GRMVLYLEDQ ASMIGQFGVG FYSAYLVADK VVVTTKHNDD QYVWESQAGG SFTVTDGETL GRMVLYLEDQ ASMIGQFGVG FYSAYLVADK VVVTTKHNDD QYVWESQAGG SFTVTDGEAL GRMILYLEDQ QSMIGQFGVG FYSAYLVAEK VIVTTKHNDD QYIWESQAGG SFTVTDGEQL GRITLFLEDQ ESMIGQFGVG FYSAYLVADR VTVTSKNNSD SYVWESSACG TFTITTESDM KRITLHLEDQ ESMIGQFGVG FYSAYLVADR VTVTSKNNSD VYVWESSAGG TFTITAESDM KLITLHLEDQ ESMIGQFGVG FYSAYLVADR VTVVSKNNED AYTWESSAGG TFTVTTDCDL KRIVLHLEDQ ESMIGQFGVG FYSAYLVADR VTVVSKNNDD AYTWESSAGG TFTVTTDCDL KRIVLHLEDQ QSMIGQFGVG FYSAFLVADK VVVTSKNNDD SYQWESSAGG SFVVRFDPEV TRIVMHIEDQ QSMIGQFGVG FYSAFLVADK VVVASKHNDD CYQWESSAGG SFIIRVDPEL TRITLYIEDQ QSMIGQFGVG FYSAYLVAEK VTVITKHNDD QYAWESSAGG SFTVKDGEPI GRVILHLEDQ QSMIGQFGVG FYTAYLVAEK VTVITKHNDD QYAWESSAGG SFTVRDGEPM GRVILHLEDQ QSMIGQFGVG FYSAYLVADK VVVTSKNNDD QYVWESSAGG SFTVRDGEPL GRIVLHIEDQ QSMIGQFGVG FYSAYLVADK VTVTSKNNDD QYVWESSAGG SFTVRDSEPL GRIVLYIEDQ QSMIGQFGVG FYSAYLVAER VTVITKHNDD QYIWESSAGG SFTVKDGEPM LRVILHMEDQ QSMIGQFGVG FYSAYLVAEK VVVITKHNDD QYAWESSAGG SFTVRDGEPI GRVILHLEDQ QSMIGQFGVG FYSAYLVAEK VTVITKHNDD QYAWESSAGG SFTVRDGEPM GRVILHLEDQ QSMIGQFGVG FYSAYLVAEK VVVITKHNDD QYAWESSAGG SFTVRDGEPI GRVILHLEDQ TSMIGQFGVG FYSAYLVADR VTVVSKHNDD QYIWESSAGG TFTIRDGEPL AKIILHLEEQ SSMIGQFGVG FYSLFLVADH VQVVSKHNDD QYIWESNAGG KFTVTDNERL GRLRLFLEDQ SSMIGQFGVG FYSLFLVADH VQVISKHNDD QYVWESNAGG KFTVTDNERL GRLRLFLEDQ ASMIGQFGVG FYSAYLVADK VQVVSKHNDD QYIWESSAGG SFTVTDGPRL LRIRLFMEDQ SSMIGQFGVG FYSLFLVADR VQVISKSNDD QYIWESNAGG SFTVTDNERI GRLRLFLDDQ QSMIGQFGVG FYSAYLVADK VTVVSKNNND QYVWESNASG HFTVTDEDQL KRLILHLDDQ QSMIGQFGVG FYSAYLVADH VVVISKNNDD QYVWESAAGG SFTVTDNEKL GRIILHLEDQ SSMIGQFGVG FYSAYLVAEK VEVISKSNDD QWRWESSAGG TFTVVDNPEK LRIILHMNDN QSMIGQFGVG FYSAYLVADS VTVVSKHNDD QYVWESAAGG SFTVQDYEPL GRIILHLEDQ QSMIGQFGVG FYSAYLVADK VTVVSKNNAD QYVWESTASG HFTVKDHEPL KRLILHLEDQ TEYLNESKIK EVVKKQSEFI FYPIYLHVLK EEKEVPDAKK TKKIKENKIE EEELNKTKPI TDYLNESKIK EVIKKHSEFI SYPIYLHVQK EEVEVPDKPK TKKVKEVKTE EEELNKQKPI LDYLDETKIK NLVKKHSEFI QYPISLLTIK EDEETTAEKE KKKVKVQEKE WDVLNKTKPL LEYLEERRLK DLVKKHSEFI SYPISLWTEK TEKEISDEKK KKKIKEVSHE WNLINKQKPI LEYLEERRLK DLVKKHSEFI SYPIYLWTEK TEKEISDSKK KKKVKEVSHE WVQINKQKPI LEYLEERRLK DLIKKHSEFI SYPISLWVEK TEKEISDEKK KKKVKEVSNE WSLVNKQKPI QEWLEERRIK DLVKKHSEFI QYPIKLWVEK EEKEVEVKKK TKKIKEKEHE WQLLNKNKPI LEYLEERRLK DLVKKHSEFI QYPINLWVEK EEKEVDAEKK KKKIKEISHE WQFLNKNKPI LEYLEERRLK DLIKKHSEFI SYPISLWTEK TEKEISDEKK KKKIKEVSHE WSLVNKQKPI MEYIEERRLK DLVKKHSEFI SMGISLWIEK TEKEISDEKK KKKIKEVSHE WDLVNKQKPI LEYLEERRLK DLVKKHSEFI SYPISLWIEK TEKEISDEKK KKKIKEVSHE WDLVNKQKPI MEYIEERRLK DLVKKHSEFI SYPISLWIEK TEKEISDEKK KKKIKEVTHE WDLVNKQKPI LEYLEERRIK DLVKKHSEFI SYPIYLWTEK TEKEISDGKK KKKIKEVSHE WQLINKQKPI MEYLEPRRLK ELIKKHSEFI GYDIELMVEK TEKEVTDKKK TKKVKEVTKE YEVQNKHKPL LEYLEARRLK ELIKKHSEFI GYDIELMVEK TEKEVTDKKK TKKVKEVTKE YEVQNKHKPL QEYLEERRLK DLIKKHSEFI GYDIELMVEN TEKEVTDKKK TKKVKEVKQE FVVQNKHKPL QEYLEERRLK DLIKKHSEFI GYDIELMVEK AEKEVTDKKK TKKVKEVTQE FVVQNKHKPL IDFLEERKIK EIVKKHSQFI GYPIKLVVEK EEKEVEDKKK TKKIKEKYFE DEELNKTKPI TDYLEERRIK EIVKKHSQFI GYPIKLTVEK EDKEVSDDKK KKKIKEKYHE DEELNKTKPI TEYIEEKRVK EVVKKHSQFI GYPITLYVEK EDKEISDKKK KKKIKEKYID QEELNKTKPI TEYMEERRIK EIVKKHSQFI GYPITLFVEK EDKEVSDKKK KKKIKEKYID QEELNKTKPI LEYLEESKIK QIVNKHSQFI GYPIKLLVEK EEKEVSDDKK KKTVKVKYTE DEELNKTKPI TDYLEESKIK EIVNKHSQFI GYPIKLLVEK EEKEVSDAKK KKTIKEKYTE DEELNKTKPI TEYVEEKRVK EVVKKHSQFI GYPITLFVEK EEKEISDKKK TKKIKEKYID QEELNKTKPI TEYLEERRVK EVVKKHSQFI GYPITLYLEK EEKEISDKKK TKKIKEKYID QEELNKTKPI TEYLEERRIK EIVKKHSQFI GYPITLFVEK EDKEVSDKKK KKKIKEKYID QEELNKTKPI TEYLEERRVK EVVKKHSQFI GYPITLYLEK EEKEISDKKK TKKIKEKYID QEELNKTKPI LDYLNESRIK EVVKKHSEFI SYPIYLHVQI SEVTEEGRRR SRTIKETRSE EEELNKQKPI LEYLEEKRII EVVKKHSEFV AYPIQLVVTK EEKEVPEEKK TKKIKEEVTE TEELNKTKPL LEYLEEKRIK EVVKKHSEFV AYPIQLVVTK EEKEVPEEKK TKTVKEEVTE TEELNKTKPL LQYLEEKTIK DTVKKHSEFI SYPIQLVVTR EEKEVPEKKE KKKVKETTTE TEELNKTKPI LEYLEEKRIK EVIKRHSEFV AYPIQLVVTK EEKEVPIKPK TKKVKEEVQE IEELNKTKPL SEYLEERRLK ELVKKHSEFI SFPIRLSVEK TETEVTDEKK KRKVTNVTRE WEMLNKQKPI LEYLEEKRIK DLVKKHSEFI SFPIKLYCER QEKEITAEKR KKKIHTVEHE WEELNKQKPL LEFLEERRIK DLIKKHSEFI AFPIELQVEK TEKEETDDKK KKKVKVVHTE FEEQNKNKPL GEYLEERRLK DLVKKHSEFI SFPIELAVEK TEREVTETGK TKKVQEVTRE WEQLNKQKPL TEYLEERRLK ELVKKHSEFI SFPISLSVEK TETEVTDKKK KRKVTNVTRE WEMLNKQKPI WTRNPADITQ EEYASFYKTN DWEDHLAVKH FSVEGQLEFR AILFVPKRAP FDLFETKTKN WTRNPQDITQ EEYAAFYKSN DWEDHLAVKH FSVEGQLEFK AILFVPKRAP FDLFETKTKN WTRNPSDVTK EEYNSFYKSN DWEEPLAVKH FSVEGQLEFK AILFVPKKAP FDLFESKKAN WMRKPEEITK DEFAAFFKTN DWEEHLGVKH FSVEGQLEFK AVLFVPKRAP FDLFDTRKLN WLRKPEEITR DEYASFYKTN DWEDHLAVKH FSVEGQLEFK AILFVPRRAP FDLFDTRKLN WMRKPEEITK EEYAAFYKTN DWEEHLAVKH FSVEGQLEFK AVLFVPKRAP FDLFDTKKPN WTRKPEEVTK EEYASFYKTN DWEEHLTVKH FSLEGQLEFR AILFCPKRAP FDLFEPRKLN WTRKPEEISK EEYSSFYKSN DWEDHLAVKH FSVEGQLEFK ALLFVPKRAP FDLFEPRKNN WMRKPEEITK EEYAAFYKTN DWEEHLAVKH FSVEGQLEFK AVLFVPKRAP FDLFDTRKLN WMRKPEEINK EEYAAFYKSN DWDKDLAVKH FSVEGQLEFK AILFVPKRRP FDLLYTKKPN WMRKPEEINK EEYAAFYKSN DWEEHLAVKH FSVEGQLEFK AILFVPKRAP FDLFDTKKPN WMRKPEEINK EEYAAFYKSN DWEEHLAVKH FSVEGQLEFK AILFVPKRAP FDLFDTKKPN WLRKPEEITK EEYASFYKTN DWEDHLAVKH FSVEGQLEFK AILFVPKRAP FDLFDTRKMN WTRDPKDVTK EEYAAFYKSN DWEDPRATKH FSVEGQLEFR SIMFVPKRAP FDMFEPNKRN WTRDPKDVTK EEYAAFYKSN DWEDPPATKH FSVEGQLEFR AIMFVPKRAP FDMLEPNKRN WTRDPKDVTK EEYASFYKSN DWEEQLSTKH FSVEGQLEFR AILFLPKRAP FDMFEPNKRN WTRDPKDVTK EEYAAFYKSN DWEEPLSTKH FSVEGQLEFR AILFVPKRAP FDMFEPSKRN WTRNPDDISN EEYAEFYKSN DWEDHLAVKH FSVEGQLEFR ALLFVPQRAP FDLFENKSKN WTRNPDDISN EEYAEFYKSN DWEDHLAVKH FSVEGQLEFR ALLFVPQRAP FDLFENKTKN WTRNPDDISN EEYGEFYKTN DWEDHLAVKH FSVEGQLEFR ALLFIPRRAP FDLFENKKKN WTRNPDDITN EEYGEFYKTN DWEEHLAVKH FSVEGQLEFR ALLFVPRRAP FDLFENRKKN WTRNADDISQ EEYGEFYKTN DWEDHLAVKH FSVEGQLDFR ALLFVPRRMP FDLFENKKKN WTRNPDDISQ EEYGEFYKTN DWEDHLAVKH FSVEGQLEFR ALLFIPRRTP FDLFENQKRN WTRNPDDITM EEYGEFYKTN DWEEHLAVKH FSVEGQLEFR ALLFIPRRAP FDLFENKKKN WTRNPDDITQ EEYGEFYKTN DWEDHLAVKH FSVEGQLEFR ALLFIPRRAP FDLFENKKKN WTRNPDDITN EEYGEFYKTN DWEEHLAVKH FSVEGQLEFR ALLFVPRRAP FDLFENRKKN WTRNPDDITQ EEYGEFYKTN DWEDHLAVKH FSVEGQLEFR ALLFIPRRAP FDLFENKKKN WTRNPQDITQ EEYAAFYKSN DWEDHLAVKH FSVEGQLEFR AILFVPKRAP FDLFETKTKS WTRNPSDITQ EEYNAFYKSN DWEDPLAVKH FSVEGQLEFR AILFVPKRAP FDAFESKKKS WTRNPSDITQ DEYNAFYKSN DWEDPLAVKH FSVEGQLEFR AILFVPKRAP FDAFESKKKN WTRNPSEVTK EEYASFYKTN DWEDHLAVKH FSVEGQLEFR AILFVPRRAP MDLFEAKKKN WTRNPSDITQ EEYNAFYKSN DWEDPLYVKH FSVEGQLEFR AILFIPKRAP FDLFESKKKN WMRLPTEVTN EEYASFYKSN DWEDHLAVKH FSVEGQLEFK AILFVPKRAP FDMFENRKKN WMRKPEEVTN EEYASFYKTN DWEDHLAVKH FSVEGQLEFK ALLFIPKRAP FDMFENRKRN WMRKPEEITK EEYVNFYKTN DWEEHQAVKQ FSVEGQLEFR AILFIPKRAP FDLFETKKKN WMRKPEEVTE EEYASFYKSN DWEEHLAVKH FSVEGQLEFK ALLFVPKRAP FDLFETRKRN WMRLPSEVTN EEYAAFYKTN DWEDHLAVKH FSVEGQLEFK ALLFVPRRAP FDMFESRKKN NIKLYVRRVF ITDDATDLIP EWLSFIKGVV DSEDLPLGLS RETLQQNKIM KVIKNIVKKT NIKLYVRRVF ITDDATDLIP EWLSFVKGVV DSEDLPLNLS RETLQQNKIM KVIKNIVKKA NIKLYVKRVF IMDNCADIIP EYLNFVRGIV DSEDLPLNIS RETLQQNKIL TVIKNLVKKC NIKLYVRRVF IMDNCEELIP EWLSFVKGIV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEELIP EWLGFVKGVV DSDDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCDELIP EYLSFVKGIV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVKRVF IMDNCEDIIP EYLNFVKGVV DSEDLPLNLS REMLQQNKIL KVIKNLVKKC NIKLYVKRVF IMDNCDEIIP EYLNFIKGVV DSEDLPLNIS RETLQQNKVV KVIKNIVKKC NIKLYVRRVF IMDNCEELIP EWLSFVKGIV DSEDLPLNIS REMLQQNKIL KVIKNLVKKC NISLYVRRVF IMTYCEDIIP EYLGFVKGIV DSEDLPLNIS RETLQQNKIS MVIKNLVKKC NIKLYVRRVF IMDNCEDIIP EYLGFVKGIV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEDIIP DYLGFVKGIV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEELIP EYLGFVKGVV DSDDLPLNIS REMLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEDLCP DWLGFVKGVV DSEDLPLNIS RENLQQNKIL KVIKNIVKKC NIKLYVRRVF IMDNCEDLCP DWLGFVKGVV DSEDLPLNIS RENLQQNKIL KVIKNIVKKC NIKLYVRRVF IMDNCEDLCP EWLGFLRGVV DSEDLPLNIS RENLQQNKIL KVIKNIVKKA NIKLYVRRVF IMDNCEDLCP EWLAFVRGVV DSEDLPLNIS RENLQQNKIL KVIKNIVKKA SIKLYVRRVF IMENCEELMP EYLNFIKGVV DSEDLPLNIS REMLQQSKIL KVIKNLVKKC AIKLYVRRVF IMENCDELMP EYLNFIKGVV DSEDLPLNIS REMLQQSKIL KVIKNLVKKC NIKLYVRRVF IMDNCEELIP EYLNFIRGVV DSEDLPLNIS REMLQQSKIL KVIKNIVKKC NIKLYVRRVF IMDNCEELFP EYLNFIRGVV DSEDLPLNIS REILQQSKIL KVIKNLVRKC NIKLYVRRVF IMDNCEELIP DYLNFMKGVV DSEDLPLNIS REMLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEDLIP EYLNFMKGVV DSEDLPLNIS REMLQQNKVL KVIKNLVKKT NIKLYVRRVF IMDSCEELIP EYLNFVRGVV DSEDLPLNIS REMLQQSKIL KVIKNIVKKC NIKLYVRRVF IMDSCDDLIP EYLNFIRGVV DSEDLPLNIS REMLQQSKIL KVIKNIVKKC NIKLYVRRVF IMDNCEELIP EYLNFIRGVV DSEDLPLNIS REMLQQSKIL KVIKNLVKKC NIKLYVRRVF IMDSCDELIP EYLNFIRGVV DSEDLPLNIS REMLQQSKIL KVIKNIVKKC NIKLYVRRVF ITEHATDLVP EWLSFIKGVV DSEDLPLNLS RETLQQNKIM KVIKNIVKKS NSKLYVRRVF ITDDAEELIP EWLSFVKGVV DSEDLPLNLS REMLQQNKIL KVIKNISKKM NIKLYVRRVF ITDDAEELIP EWLSFIKGVV DSEDLPLNLS REMLQQNKIL KVIKNIVKKM NIKLYVRRVF ITDDCEELIP EWLGFIKGVV DSEDLPLNLS REMLQQNKIM KVIKNLVRRC NIKLYVRRVF ITDEAEDLIP EWLSFVKGVV DSEDLPLNLS REMLQQNKIM KVIKNIVKKL NIKLYVRRVF IMDDCDELIP EWLGFVKGVV DSEDLPLNIS REVLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDDCEEIIP EWLNFVKGVV DSEDLPLNIS RESLQQNKIL KVIKNLIKKC NIKLYVRRVF IMDDCEELIP EYLNFIKGVV DSEDLPLNIS REFLQHNKIL KVIKNIVKKC NIKLYVRRVF IMDDCEDIIP EWLNFVKGVV DSEDLPLNIS RESLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDDCEELIP EWLSFVKGVV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC LELFNEIAED REQFKFYSAF SKNIKLGVHE DAQNRPALAK LLRYNSTTTS LTDYVTRMPE LELFTEIAED KEQFKFYTAF SKNIKLGIHE DSQNRNTLAK LLRFNSTQTS LSDYVTRMPE IELFNEIAEN SEDYKFYEAF SKNLKLGVHE DSQNREKFAD LLRYQTSLVT LKEYVGRMKE IELFFEIAEN KEDYKFYEAF SKNLKLGVHE DSTNRTKLAE LLRYHSTLTS LKDYVTRMKE IEMFFEIAEN KDDYKFYDAF SKNIKLGIHE DSQNRAKLAD LLRYHSTTTS LKDYVTRMKE VELFFEIAEN KEDYKFYEAF SKNLKLGIHE DSQNRAKFAE LLRYHSTMTS LKDYVTRMKE MDMFAEAAEN KEDYVFYEQF SKNLKLGIHE DAQNREKLAE LLRYNTTLTS LKEYVSRMKE LELFLEISEN KDDVIFYDQY SKNIKLGIHE DSQNRSKLAD LLRYKSTTTT LKEYVSRMKE VELFFEIAEN KEDYKFYEAF SKNLKLGIHE DSTNRNKIAE LLRYHSTLTS LKDYVTRMKE LELFFEIAEN KEDYKFYEAF SKNLKPGIHE DSKIRTKIAE LLRYHSTLTS LKDYVTRMKE LELFFEIAEN KEDYKFYEAF SKNLKLGIHE DSQNRTKIAE LLRYHSTLTS LKDYVTRMKE LELFFEIAEN KEDYKFYEAF SKNLKLGIHE DSQNRTKIAE LLRYHSTLTS LKDYVTRMKE IEMFNEIAEN KDDYKFYEAF SKNLKLGIHE DSQNRAKLAD LLRYYSTLTS LKDYVTRMKE LEMFDEVAEN KEDYQFYEQF GKNIKLGIHQ DTANRKKLME FVRFYSSMTT LKDYVTRMKA LEMFEEVAEN KEDYQFYEQF GKNIKLGIHE DTANRKKLME LLRFYSTMTT LKDYVTRMKA LELFEELAGN KEDYKFYEQF SKNVKLGIHE DSTNRKKLME LLRFHSSMTT LKDYVTRMKE LELFEEIAEN KEDYKFYEQF GKNVKLGIHE DSANRKKLME LLRFHSSMTT LKDYVTRMKE MELIDEVAED KDNFKFYEQF GKNLKLGIHE DSTNRKKLSD FLRYSTSPTS LKEYVSRMKE LELFDEIAED KDNFKFYEQF SKNIKLGIHE DSTNRKKLSE FLRFYTSMTS LKDYVSRMKE LELFAELAED KDNYKFYDAF SKNLKLGIHE DCQNRKKLSE LLRYQSSMTS LTEYVSRMKE LELFHELAED KENYKFYEQF SKNIKLGIHE DSQNRKKLSE LLRYYTSMVS LKDYCTRMKE MELFEELAED KETYKFYDQF SKNLKLGVHE DSQNRQKLAD LLRFNTSYCS LNDYVGRMKE MELIEELTED KENYKFYDQF SKNLKLGVHE DSNNRAKLAD FLRFHTSFCS LADYVSRMKD MELFGELAED RENYKFYDGF SKNLKLGIHE DSQNRKKLSE LLRYHSSLTS LTEYLTRMKD LELFSELAED KENYKFYEAF SKNLKLGIHE DSTNRRRLSE LLRYHTSMTS LSEYVSRMKE LELFTELAED KENYKFYEQF SKNIKLGIHE DSQNRKKLSE LLRYYTSMVS LKDYCTRMKE LELFSELAED KENYKFYEAF SKNLKLGIHE DSTNRRRLSE LLRYHTSMTS LSEYVSRMKE IELFNEIAED KEQFKFYSAF SKNIKLGIHE DAQNRSALAK LLRFHSTMTS LSDYVARMPE IETFNEISED QEQFQFYTAF SKNIKLGIHE DAQNRQALAK LLRFYSTMTS LSDYVTRMPE IETFNEISED QEQFQFYTAF SKNIKLGIHE DAQNRQSLAK LLRFYSTMTS LSDYVTRMPE LDMFNEIAED KENFTFYDAF SKNLKLGIHE DAANRPALAK LLRYNSLLIS LEDYITKMPE IEAFNEIAED SEQFKFYSAF SKNIKLGVHE DTQNRAALAK LLRYNSTLTS LTDYVTRMPE LELFSELTEK KEDFKFYEQF SKNLKLGIHE DNTNRNKISE LLRYETSAIS LKEYVDRMKP LDMFSELAEN KENYKFYEQF SKNLKLGIHE DNANRTKITE LLRFQTSMIG LKEYVDRMKE LDLIQEVADN EEDFKFYEQF GKNLKLGIHE DSANREKLSS FLRYHSSLTT LKDYVSRMKE LEMFAEIEEK KENYKFYEQF SKNLKLGIHE DSANRAKIAE LLRFHSSMVS FKEYVDRMKE LELFNELTEK KEDFKFYEQF SKNLKLGIHE DNANRSKIAE LLRFETTLVS LKEYVDRMKS HHKTIYYITG ESLKAVQKSP FLDTLKEKNF EVLFLVDPND EYAMTQLKEF DGKKLVDITK HQKNMYYITG ESIKAVSKSP FLDSLKEKGF EVLFLVDPID EYAMTQLKEF EGKKLVDITK GQNEIYYITG ESKKAVENSP FIEGLKKKNL EVIYMCDPID EYAVQQLKEY DGKKLVSITK GQNDIYYITG ESKKAVENSP FLEKLKKKGY EVLYMVDAID EYSIGQLKEF EGKKLVSATK GQKDIYYITG ESRKAVENSP FLERLKKKGY EVLFMVDAID EYAVGQLKEY DGKKLVSATK GQNDIYYITG ESKKAVENSP FLEKLKKKGY EVLYMVDAID EYSIGQLKEF EGKKLVSATK GQKNIYYITG ASKKAVENAP FLEKLKKKGF EVIYMTEPID EYCVQQLKEY DGKKLVCTTK NQNQIYYITG ESQKSVENSP FLEKLKQKGF EVLFMIEPID EYCVQQLKEY EGKKLVCATK GQNDIYYITG ESKKAVENSP FLEKLKKKGY EVLYMVDAID EYAVGQLKEF EGKKLVSATK GQNDIFYITG ESKKAVENSP FLEKLKKKGI EVLYMVDAID EYAIGQLKEF EGKKLVSATK GQNDIFYITG ESKKAVENSP FLEKLKKKGI EVLYMVDAID EYAIGQLKEF EGKKLVSATK GQNEIFYITG ESKKAVENSP FLEKLKKKGY EVLYMVDAID EYAIGQLKEF EGKKLVSATK GQKDIYYITG ESKKAVENSP FLERLKKKGY EVLFMVDAID EYAVGQLKEY DGKKLVSATK GQKSIYYITG DSKKKLESSP FIEQAKRRGL EVLFMTEPID EYVMQQVKDF EDKKFACLTK EQNSIYYITG DSKKKLESSP FIEQAKRRGF EVLFMTEPYD EYVMQQVKDF EDKKFACLTK GQKCIYYVTG DSKKKLETSP FIEQARRRGM EVLFMTDPID EYVMQQVKDF EDKKFACLTK GQKCIYYVTG DSKKKLETSP FIEQARRRGF EVLFMTEPID EYVMQQVKDF EDKKFACLTK NQTQIYYITG ESKDVVAASA FVERVKSRGF EVLYMCDPID EYCVQQLKEY DGKKLVSVTK NQKQIYFITG ESREAVASSA FVERVKRRGF EVIYMTDPID EYCVQQLKEY DGKKLVSVTK NQKSIYYITG ESKDQVAHSA FVERVCKRGF EVLYMTEPID EYCVQQLKDF DGKSLVSVTK NQKHIYFITG ETKDQVANSA FVERLRKHGL EVIYMIEPID EYCVQQLKEF EGKTLVSVTK NQTQIYFITG ESIEQVKNSA FVERVKKRGF EVIYMTEAID EYVIQQLKEY KGKQLVCVTK NQKHVYFITG ESKDQVSNSA FVERVKARGF EVVYMTEPID EYVIQHLKEY KGKQLVSVTK NQKSIYYITG ESKDQVANSA FVERVRKRGF EVLYMTEPID EYCVQQLKEF DGKTLVSVTK TQKSIYYITG ESKEQVANSA FVERVRKRGF EVVYMTEPID EYCVQQLKEF DGKSLVSVTK NQKHIYFITG ETKDQVANSA FVERLRKHGL EVIYMIEPID EYCVQQLKEF EGKTLVSVTK TQKSIYYITG ESKEQVANSA FVERVRKRGF EVVYMTEPID EYCVQQLKEF DGKSLVSVTK HQKNIYYITG ESIKAVSKSP FLDALKEKGF EVLFLVDPID EYAMTQLKEF EGKKLVDITK HQKNIYYITG ESIKAVEKSP FLDALKAKNF EVLFMVDPID EYAMTQLKEF EDKKLVDITK HQKNIYYITG ESIKAVEKSP FLDALKAKNF EVLFMVDPID EYAMTQLKEF EDKKLVDITK HQKNIYFITG ESKQAVENSP FLEIFRAKKF DVLFMVDPID EYAVTQLKEF EGKKLVNITK HQKNIYYITG ESLKAVEKSP FLDALKAKNF EVLFLTDPID EYAFTQLKEF EGKTLVDITK EQKYIYYITG ESKQSVANSP FLECLRSRGI EVIYMTDPID EYAVQQIKEF EGKKLKCCTK NQKDIYYITG ESINAVSNSP FLEALTKKGF EVIYMVDPID EYAVQQLKDF DGKKLKCCTK GQKDIFFITG ESRAAVAASP FVESLRKRGY EVLYMVDPID EYVIQQLKEY DGKKLKNCSK GQKDIYYITG ESRQTVANSP FLEKLTKKGY EVLYMTDPID EYAVQQLKEF DNHKLRCCTK DQKYVYYITG ESKQSVASSP FLETLRSRDY EVLYMTDPID EYAVQQIKEF EGKKLKCCTK DFELEETEEE KKDREAEEKE YEGLAKSLEN ILGDKVEKVV VSHKLIGSPC AIRTGQFGWS DFELEETEEE KKQREAEEKE YDGLAKALKN VLGDKVEKVV VSHKLVGAPC AIRTGQFGWS ELKLDETEDE KKKAEQDKAA NEELLKQVKD VLGDKVEKVV LSTRLANSPC VLVTSEYGWS ELKLDDSEEE KKRKEELKEK FEGLCKVIKE VLGDRVEKVI VSDRVVDSPC CLVTGEYGWT ELKLDDEDDE EKKREERKKR FEELCKVIKD ILGDRVEKVV VSDRIVDSPC CLVTGEYGWT ELKLDESEDE KKKQEELKEK FEGLCKVMKD VLGDKVEKVI VSDRVVDSPC CLVTGEYGWT EMQLEESEEE KAAREAEAKA CETLCEVIKE NLGEKVEKVV VSDRLADSPC ILVTGEYGWS ELDLGDSEND KKVKENEKEQ FDELCKVIKE TLNDKVEKVV ISDRLSDSPC ILVTGEYGWS ELKLDESEDE KKRKEELKEK FEGLCKVIKE VLGDKVEKVV VSDRVVDSPC CLVTGEYGWT ELKLDETEDE KKKKEELNEK FEGLCKVIKD VLGDKVEKVI VSDRVLDSPC CLVTGEYGWT ELKLDETEDE KKKKEELKEK FEGLCKVIKD VLGDKVEKVI VSDRVVDSPC CLVTGEYGWT ELKLEETDDE KKKKEELKEK FEGLCKVIKD VLGDKVEKVI VSDRVVDSPC CLVTGEYGWT ELKLEDDDEE EKKKREEKKS FENLCKIIKD ILGDKVEKVV VSDRIVDSPC CLVTGEYGWT EVHFEESEEE KQQREEEKAA CEKLCKTMKE VLGDKVEKVI VSECLSTSPC ILVTSEFGWS EVHFEESEEE KRQREEEKAT CEKLCKTMKE VLGDKVEKVT VSERLSTSPC ILVTSEFGWS EVHFEETEEE KKQREEEKAS YERLCKAMKE VLGDKVEKVV VSDRLATSPC ILVTSEFGWS EVHFEETEEE KKQREEEKTA YERLCKAMKD VLGDKVEKVV VSERLATSPC ILVTSEFGWS ELELPETEEE KKKFEEDKVA YENLCKVIKD ILEKKVEKVG VSNRLVSSPC CIVTSEYGWS ELELPESEEE KKKFEEDKVK FENLCKVMKD ILEKKVEKVA VSNRLVSSPC CIVTSEYGWS ELELPEDEDE KKKMEEDKAK FENLCKLMKE ILDKKVEKVT VSNRLVSSPC CIVTSTYGWT ELELPEDEEE KKKQEEKKTK FENLCKIMKD ILEKKVEKVV VSNRLVTSPC CIVTSTYGWT ELELPEDEAE KKKREEDKAK FENLCKVMKS VLESKVEKVV VSNRLVDSPC CIVTSQYGWS ELELPEDESE KKKREEDKAK FESLCKLMKS ILDNKVEKVV VSNRLVDSPC CIVTSQFGWS ELELPEDEEE KKKMDEDKTK FENLCKLMKE ILDKKVEKVT VSNRLVSSPC CIVTSTYGWT ELELPEDEEE KKKMEESKAR FENLCKLMKE ILDKKVEKVT ISNRLVSSPC CIVTSTYGWT ELELPEDEEE KKKQEEKKTK FENLCKIMKD ILEKKVEKVV VSNRLVTSPC CIVTSTYGWT ELELPEDEEE KKKMEESKAK FENLCKLMKE ILDKKVEKVT ISNRLVSSPC CIVTSTYGWT DFELEETEEE KKQREQEEKE YEDLCKALKN ILGDKVEKVV VSHKLVGSPC AIRTGQFGWS DFDLEETEEE KSTREKEIKE FEPLTKALKD ILGDQVEKVV VSYKLVDAPA AIRTGQFGWS DFELEESDEE KAAREKEIKE YEPLTKALKD ILGDQVEKVV VSYKLVDAPA AIRTGQFGWS DLELEETDEE KAAREKLEKE YEEFAKQLKT ILGDKVEKVV VSNKIVGSPC LLTTGQYGWS DFELEETDEE KAEREKEIKE YEPLTKALKE ILGDQVEKVV VSYKLLDAPA AIRTGQFGWS ELELEDTEEE RKNFETLEKE MEPLCRLIKE ILHDKVEKVV CGKRFTESPC ALVTSEFGWS ELDIDDSEEA KKDFETLKAE YEGLCKVIKD VLHEKVEKVV VGQRITDSPC VLVTSEFGWS ELELEQTEDE KKKFEEKKAA YEPLCKQIKE VLGDKVEKVV VGQRLDESPC VLVTGEYGWS ELEIDESEEE KKKFEELKAE FEPLLKLIKE VLHDKVDKVV LSNRITDSPC VLVTTEFGWS ELDLDEGEDE KKSFEALKEE MEPLCKHIKE VLHDKVEKVV CGTRFTDSPC ALVTSEFGWS ANMERIMKAQ ALRDTSMSSR RSSRPTENRT VKSITQLLFE TSLLSGFTIE EPSFAGRIHK ANMERIMKAQ ALRDTSMSSY MSSKPKENKT VKSIVQLLFE TSLLSGFTIE EPAFAERIHK ANMERIMKAQ ALRDSSMSSY MSSKPRDSKT FKDFVYLLYE TALLSGFSLD EPSFASRIHR ANMERIMKAQ ALRDTSMGGY MSSKAEENKS VKDLVMLLFE NSLLSGFSLD DPNFGTRIHR ANMERIMKAQ ALRDSSMSAY MSSKGEENKS VKDLVLLLFE TALLSGFSLD DPNFAARIHR ANMERIMKAQ ALRDSSMAGY MSSKSDENKS VKDLVLLLFE TALLSGFSLE EPNFGNRIHR ANMERIMSSQ ALRDNSLSTY MSSRSRETKT VKDLVSLLFD TAMLSGFSLE EPHFAGRIQR ANMERIMKAQ ALRDSSLSTY MSSRSNENKT VKDLVNLLFD TSLLSGFSLD EPHFAERIHR ANMERIMKAQ ALRDSSMAGY MSSKAEENKS VKDLVLLLFE TALLSGFSLD DPNFGSRIHR ANMERIMKAQ ALRDSSMGGY MSSKLDENKS VKDLVLLLFE TALLSGFSLD EPNFGSRIHR ANMERIMKAQ ALRDSSMAGY MSSKSDENKS VKDLVLLLFE TALLSGFSLD EPNFGSRIHR ANMERIMKAQ ALKDSNTGGY MSSKSDENKS VKDLVLLLFE TALLSGFSLD EPNFGSRIHR ANMERIMKAQ ALRDSSMSSY MSSKGEENKS VKDLVLLLFE TALLSGFSLD DPNFGARIHR AHMEQIMRNQ ALRDSSMAQY MMSKPKENKA VKDLVFLLFD TSLLSGFQLE DPTYAERINR AHMEQMMRNQ ALRDSSMAQY MMSKPKENKA VKDLVFLLFD TSLLSGFQLE DPTYAERINR AHMEQIMRNQ ALRDSSMSAY MMRKAKENKA AKDLIFLLFD TSLLSGFTLD DPTYADRIHR AHMEQIMRNQ ALRDSSMSAY MMSKPKENKA VKDLVYLLFD TALLSGFTLD DPTYAERIHR ANMERIMKAQ ALRDSSTMGY MAAKAKTNKT VKDLVVLLFE TALLSGFSLE EPQHASRIYR ANMERIMKAQ ALRDSSTMGY MAAKSKANKT VKDLVVLLFE TALLSGFSLE DPQHASRIYR ANMERIMKAQ ALRDNSTMGY MMANPETNKA VKDLVILLFE TALLSGFSLD DPQHSNRIYR ANMERIIKAQ ALRDNSTMGY MAAKSETNKS VKDLVILLYE TALLSGFSLE DPQHANRIYR ANMERIMKAQ ALRDSSAMGY MAGKAETNKA VKDLVILLFE TALLSGFSLD EPGHAARIYR ANMERIMKAQ ALRDTATMGY MAGKPETNKA VKDLVILLFE TSLLSGFSLD SPQHASRIYR ANMERIMKAQ ALRDNSTMGY MMAKPETNKA VKDLVILLFE TALLSGFSLD DPQHSNRIYR ANMERIMKAQ ALRDNSTMGY MMAKPETNKA VKDLVVLLFE TALSLASHFR RPKHSNRIYR ANMERIMKAQ ALRDNSTMGY MAAKSETNKS VKDLVILLYE TALLSGFSLE DPQHANRIYR ANMERIMKAQ ALRDNSTMGY MMAKPETNKA VKDLVVLLFE TALLSGFSLE DPQHSNRIYR ANMERIMKAQ ALRDTSMSSY MSSKPKENKT VKSIVQLLYE TSLLSGFTID EPALPRGIHK ANMERIMKAQ ALRDTTMSSY TSSKPKEEKT VKDLTTLLFD TALLSGFTLD EPSFAHRINR ANMERIMKAQ ALRDTTMSSY MSSKPKEEKT VKDLTTLLFD TALLSGFTLD EPSFAHRINR ANMERIMKAQ ALRDTSMSAY MSSRPAEERS VKDLATILYE TALLSGFTLD DPSYAQRINR ANMERIMKAQ ALRDSSMSSY MSSKPKEQKT VKDLTKLLYE TALLSGFSLD EPTFASRINR ANMERIMKAQ ALRDSSFGSF MISKSKESKT LKDLVWLLYD TAMLSGFNLD DPTFGGRIYR ANMERIMKAQ ALRDNSMTSY MLSKPSASKT VKDLIWLLFD TSLLSGFALE EPTFSKRIHR ANMERIMKAQ ALRDASMSTY MISKAQEAKT VKDLIWLLFE TSLLSGFSLD DPSFANRIHR ANMERIMKAQ ALRDNSMTSY MVSKSIESKT VKDLIWLLYD TALLSGFSLE EPTFAARIHR ANMERIMKAQ ALRDSSITSY MLSKSKETKT VKDLVWLLYD TALLSGFNLD EPTFGNRIYR LVSLGLN LVALGLN MIKLGLS MLKLGLS MLKLGLN MLKLGLS MLMLGLQ MIKLGLS MLKLGLS MLKLGLS MLKLGLS MLKLGLS MLKLGLS MIKLGLS MIKLGLS MIKLGLS MIKLGLS MIKLGLD MIKLGLD MIKLGLG MIKLGLG MVKLGLG MIKLGLG MIKLGLG MIKLGLG MIKLGLG MIKLGLG LVSLGQN LIALGLN LIALGLN LISLGLS LISLGLN MIKLGLS MIKLGLS MIKLGLQ MIKLGLS MIKLGLS stephaneguindon-phyml-76a39c8/src/000077500000000000000000000000001501136442400171715ustar00rootroot00000000000000stephaneguindon-phyml-76a39c8/src/Makefile000066400000000000000000001326201501136442400206350ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.5 from Makefile.am. # src/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # EXTRA_DIST = doc bin examples am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/phyml pkgincludedir = $(includedir)/phyml pkglibdir = $(libdir)/phyml pkglibexecdir = $(libexecdir)/phyml am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = aarch64-apple-darwin24.3.0 host_triplet = aarch64-apple-darwin24.3.0 #bin_PROGRAMS = phyml$(EXEEXT) ##bin_PROGRAMS = date$(EXEEXT) ##bin_PROGRAMS = phyrexsim$(EXEEXT) ##bin_PROGRAMS = phyrex$(EXEEXT) ##bin_PROGRAMS = evolve$(EXEEXT) ##bin_PROGRAMS = test$(EXEEXT) ##bin_PROGRAMS = phyml-windows$(EXEEXT) bin_PROGRAMS = phyml-mpi$(EXEEXT) #bin_PROGRAMS = rf$(EXEEXT) #bin_PROGRAMS = phytime$(EXEEXT) #bin_PROGRAMS = phyml$(EXEEXT) subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__date_SOURCES_DIST = main.c utilities.c utilities.h optimiz.c \ optimiz.h lk.c lk.h bionj.c bionj.h models.c models.h free.c \ free.h help.c help.h simu.c simu.h eigen.c eigen.h pars.c \ pars.h alrt.c alrt.h interface.c interface.h cl.c cl.h spr.c \ spr.h draw.c draw.h stats.c stats.h rates.c rates.h mcmc.c \ mcmc.h times.c times.h mg.c mg.h io.c io.h make.c make.h \ nexus.c nexus.h init.c init.h xml.c xml.h tbe.c tbe.h mixt.c \ mixt.h date.c date.h ##am_date_OBJECTS = main.$(OBJEXT) \ ## utilities.$(OBJEXT) \ ## optimiz.$(OBJEXT) \ ## lk.$(OBJEXT) \ ## bionj.$(OBJEXT) \ ## models.$(OBJEXT) \ ## free.$(OBJEXT) \ ## help.$(OBJEXT) \ ## simu.$(OBJEXT) \ ## eigen.$(OBJEXT) \ ## pars.$(OBJEXT) \ ## alrt.$(OBJEXT) \ ## interface.$(OBJEXT) \ ## cl.$(OBJEXT) \ ## spr.$(OBJEXT) \ ## draw.$(OBJEXT) \ ## stats.$(OBJEXT) \ ## rates.$(OBJEXT) \ ## mcmc.$(OBJEXT) \ ## times.$(OBJEXT) \ ## mg.$(OBJEXT) \ ## io.$(OBJEXT) \ ## make.$(OBJEXT) \ ## nexus.$(OBJEXT) \ ## init.$(OBJEXT) \ ## xml.$(OBJEXT) \ ## tbe.$(OBJEXT) \ ## mixt.$(OBJEXT) \ ## date.$(OBJEXT) date_OBJECTS = $(am_date_OBJECTS) date_LDADD = $(LDADD) am__evolve_SOURCES_DIST = main.c utilities.c utilities.h optimiz.c \ optimiz.h lk.c lk.h bionj.c bionj.h models.c models.h free.c \ free.h help.c help.h simu.c simu.h eigen.c eigen.h pars.c \ pars.h alrt.c alrt.h interface.c interface.h cl.c cl.h spr.c \ spr.h draw.c draw.h tbe.c tbe.h stats.c stats.h rates.c \ rates.h mcmc.c mcmc.h times.c times.h mg.c mg.h io.c io.h \ make.c make.h nexus.c nexus.h init.c init.h xml.c xml.h mixt.c \ mixt.h ancestral.c ancestral.h date.c date.h cv.c cv.h m4.c \ m4.h evolve.c evolve.h ##am_evolve_OBJECTS = main.$(OBJEXT) \ ## utilities.$(OBJEXT) \ ## optimiz.$(OBJEXT) \ ## lk.$(OBJEXT) \ ## bionj.$(OBJEXT) \ ## models.$(OBJEXT) \ ## free.$(OBJEXT) \ ## help.$(OBJEXT) \ ## simu.$(OBJEXT) \ ## eigen.$(OBJEXT) \ ## pars.$(OBJEXT) \ ## alrt.$(OBJEXT) \ ## interface.$(OBJEXT) \ ## cl.$(OBJEXT) \ ## spr.$(OBJEXT) \ ## draw.$(OBJEXT) \ ## tbe.$(OBJEXT) \ ## stats.$(OBJEXT) \ ## rates.$(OBJEXT) \ ## mcmc.$(OBJEXT) \ ## times.$(OBJEXT) \ ## mg.$(OBJEXT) \ ## io.$(OBJEXT) \ ## make.$(OBJEXT) \ ## nexus.$(OBJEXT) \ ## init.$(OBJEXT) \ ## xml.$(OBJEXT) \ ## mixt.$(OBJEXT) \ ## ancestral.$(OBJEXT) \ ## date.$(OBJEXT) \ ## cv.$(OBJEXT) \ ## m4.$(OBJEXT) \ ## evolve.$(OBJEXT) evolve_OBJECTS = $(am_evolve_OBJECTS) evolve_LDADD = $(LDADD) am__phyml_SOURCES_DIST = main.c utilities.c utilities.h optimiz.c \ optimiz.h lk.c lk.h bionj.c bionj.h models.c models.h free.c \ free.h help.c help.h simu.c simu.h eigen.c eigen.h pars.c \ pars.h alrt.c alrt.h interface.c interface.h cl.c cl.h spr.c \ spr.h draw.c draw.h stats.c stats.h io.c io.h make.c make.h \ nexus.c nexus.h init.c init.h xml.c xml.h sse.c sse.h avx.c \ avx.h tbe.c tbe.h ancestral.c ancestral.h mixt.c mixt.h \ evolve.c evolve.h rates.c rates.h date.c date.h times.c \ times.h m4.c m4.h cv.c cv.h #am_phyml_OBJECTS = main.$(OBJEXT) \ # utilities.$(OBJEXT) \ # optimiz.$(OBJEXT) \ # lk.$(OBJEXT) \ # bionj.$(OBJEXT) \ # models.$(OBJEXT) \ # free.$(OBJEXT) \ # help.$(OBJEXT) \ # simu.$(OBJEXT) \ # eigen.$(OBJEXT) \ # pars.$(OBJEXT) \ # alrt.$(OBJEXT) \ # interface.$(OBJEXT) \ # cl.$(OBJEXT) \ # spr.$(OBJEXT) \ # draw.$(OBJEXT) \ # stats.$(OBJEXT) \ # io.$(OBJEXT) \ # make.$(OBJEXT) \ # nexus.$(OBJEXT) \ # init.$(OBJEXT) \ # xml.$(OBJEXT) \ # sse.$(OBJEXT) \ # avx.$(OBJEXT) \ # tbe.$(OBJEXT) \ # ancestral.$(OBJEXT) \ # mixt.$(OBJEXT) \ # evolve.$(OBJEXT) \ # rates.$(OBJEXT) \ # date.$(OBJEXT) \ # times.$(OBJEXT) \ # m4.$(OBJEXT) \ # cv.$(OBJEXT) phyml_OBJECTS = $(am_phyml_OBJECTS) phyml_LDADD = $(LDADD) am__phyml_mpi_SOURCES_DIST = main.c utilities.c utilities.h optimiz.c \ optimiz.h lk.c lk.h bionj.c bionj.h models.c models.h free.c \ free.h help.c help.h simu.c simu.h eigen.c eigen.h pars.c \ pars.h alrt.c alrt.h interface.c interface.h cl.c cl.h spr.c \ spr.h draw.c draw.h stats.c stats.h io.c io.h make.c make.h \ nexus.c nexus.h init.c init.h xml.c xml.h mixt.c mixt.h tbe.c \ tbe.h sse.c sse.h avx.c avx.h m4.c m4.h ancestral.c \ ancestral.h rates.c rates.h date.c date.h times.c times.h cv.c \ cv.h evolve.c evolve.h mpi_boot.c mpi_boot.h am_phyml_mpi_OBJECTS = main.$(OBJEXT) \ utilities.$(OBJEXT) \ optimiz.$(OBJEXT) \ lk.$(OBJEXT) \ bionj.$(OBJEXT) \ models.$(OBJEXT) \ free.$(OBJEXT) \ help.$(OBJEXT) \ simu.$(OBJEXT) \ eigen.$(OBJEXT) \ pars.$(OBJEXT) \ alrt.$(OBJEXT) \ interface.$(OBJEXT) \ cl.$(OBJEXT) \ spr.$(OBJEXT) \ draw.$(OBJEXT) \ stats.$(OBJEXT) \ io.$(OBJEXT) \ make.$(OBJEXT) \ nexus.$(OBJEXT) \ init.$(OBJEXT) \ xml.$(OBJEXT) \ mixt.$(OBJEXT) \ tbe.$(OBJEXT) \ sse.$(OBJEXT) \ avx.$(OBJEXT) \ m4.$(OBJEXT) \ ancestral.$(OBJEXT) \ rates.$(OBJEXT) \ date.$(OBJEXT) \ times.$(OBJEXT) \ cv.$(OBJEXT) \ evolve.$(OBJEXT) \ mpi_boot.$(OBJEXT) phyml_mpi_OBJECTS = $(am_phyml_mpi_OBJECTS) phyml_mpi_LDADD = $(LDADD) am__phyml_windows_SOURCES_DIST = main.c utilities.c utilities.h \ optimiz.c optimiz.h lk.c lk.h bionj.c bionj.h models.c \ models.h free.c free.h help.c help.h simu.c simu.h eigen.c \ eigen.h pars.c pars.h alrt.c alrt.h interface.c interface.h \ cl.c cl.h spr.c spr.h draw.c draw.h tbe.c tbe.h stats.c \ stats.h rates.c rates.h mcmc.c mcmc.h times.c times.h mg.c \ mg.h io.c io.h make.c make.h nexus.c nexus.h init.c init.h \ xml.c xml.h mixt.c mixt.h sse.c sse.h avx.c avx.h ancestral.c \ ancestral.h date.c date.h ##am_phyml_windows_OBJECTS = main.$(OBJEXT) \ ## utilities.$(OBJEXT) \ ## optimiz.$(OBJEXT) \ ## lk.$(OBJEXT) \ ## bionj.$(OBJEXT) \ ## models.$(OBJEXT) \ ## free.$(OBJEXT) \ ## help.$(OBJEXT) \ ## simu.$(OBJEXT) \ ## eigen.$(OBJEXT) \ ## pars.$(OBJEXT) \ ## alrt.$(OBJEXT) \ ## interface.$(OBJEXT) \ ## cl.$(OBJEXT) \ ## spr.$(OBJEXT) \ ## draw.$(OBJEXT) \ ## tbe.$(OBJEXT) \ ## stats.$(OBJEXT) \ ## rates.$(OBJEXT) \ ## mcmc.$(OBJEXT) \ ## times.$(OBJEXT) \ ## mg.$(OBJEXT) \ ## io.$(OBJEXT) \ ## make.$(OBJEXT) \ ## nexus.$(OBJEXT) \ ## init.$(OBJEXT) \ ## xml.$(OBJEXT) \ ## mixt.$(OBJEXT) \ ## sse.$(OBJEXT) \ ## avx.$(OBJEXT) \ ## ancestral.$(OBJEXT) \ ## date.$(OBJEXT) phyml_windows_OBJECTS = $(am_phyml_windows_OBJECTS) phyml_windows_LDADD = $(LDADD) am__phyrex_SOURCES_DIST = main.c utilities.c utilities.h optimiz.c \ optimiz.h lk.c lk.h bionj.c bionj.h models.c models.h free.c \ free.h help.c help.h simu.c simu.h eigen.c eigen.h pars.c \ pars.h alrt.c alrt.h interface.c interface.h cl.c cl.h spr.c \ spr.h draw.c draw.h stats.c stats.h rates.c rates.h times.c \ times.h mcmc.c mcmc.h io.c io.h make.c make.h nexus.c nexus.h \ init.c init.h xml.c xml.h mixt.c mixt.h date.c date.h tbe.c \ tbe.h sse.c sse.h avx.c avx.h ancestral.c ancestral.h phyrex.c \ phyrex.h location.c location.h slfv.c slfv.h rw.c rw.h rrw.c \ rrw.h ibm.c ibm.h iwn.c iwn.h iou.c iou.h m4.c m4.h evolve.c \ evolve.h cv.c cv.h velocity.c velocity.h ##am_phyrex_OBJECTS = main.$(OBJEXT) \ ## utilities.$(OBJEXT) \ ## optimiz.$(OBJEXT) \ ## lk.$(OBJEXT) \ ## bionj.$(OBJEXT) \ ## models.$(OBJEXT) \ ## free.$(OBJEXT) \ ## help.$(OBJEXT) \ ## simu.$(OBJEXT) \ ## eigen.$(OBJEXT) \ ## pars.$(OBJEXT) \ ## alrt.$(OBJEXT) \ ## interface.$(OBJEXT) \ ## cl.$(OBJEXT) \ ## spr.$(OBJEXT) \ ## draw.$(OBJEXT) \ ## stats.$(OBJEXT) \ ## rates.$(OBJEXT) \ ## times.$(OBJEXT) \ ## mcmc.$(OBJEXT) \ ## io.$(OBJEXT) \ ## make.$(OBJEXT) \ ## nexus.$(OBJEXT) \ ## init.$(OBJEXT) \ ## xml.$(OBJEXT) \ ## mixt.$(OBJEXT) \ ## date.$(OBJEXT) \ ## tbe.$(OBJEXT) \ ## sse.$(OBJEXT) \ ## avx.$(OBJEXT) \ ## ancestral.$(OBJEXT) \ ## phyrex.$(OBJEXT) \ ## location.$(OBJEXT) \ ## slfv.$(OBJEXT) \ ## rw.$(OBJEXT) \ ## rrw.$(OBJEXT) \ ## ibm.$(OBJEXT) \ ## iwn.$(OBJEXT) \ ## iou.$(OBJEXT) \ ## m4.$(OBJEXT) \ ## evolve.$(OBJEXT) \ ## cv.$(OBJEXT) \ ## velocity.$(OBJEXT) phyrex_OBJECTS = $(am_phyrex_OBJECTS) phyrex_LDADD = $(LDADD) am__phyrexsim_SOURCES_DIST = main.c utilities.c utilities.h optimiz.c \ optimiz.h lk.c lk.h bionj.c bionj.h models.c models.h free.c \ free.h help.c help.h simu.c simu.h eigen.c eigen.h pars.c \ pars.h alrt.c alrt.h interface.c interface.h cl.c cl.h spr.c \ spr.h draw.c draw.h stats.c stats.h rates.c rates.h times.c \ times.h mcmc.c mcmc.h io.c io.h make.c make.h nexus.c nexus.h \ init.c init.h xml.c xml.h mixt.c mixt.h date.c date.h tbe.c \ tbe.h sse.c sse.h avx.c avx.h ancestral.c ancestral.h phyrex.c \ phyrex.h location.c location.h slfv.c slfv.h rw.c rw.h rrw.c \ rrw.h ibm.c ibm.h iwn.c iwn.h iou.c iou.h velocity.c \ velocity.h ##am_phyrexsim_OBJECTS = main.$(OBJEXT) \ ## utilities.$(OBJEXT) \ ## optimiz.$(OBJEXT) \ ## lk.$(OBJEXT) \ ## bionj.$(OBJEXT) \ ## models.$(OBJEXT) \ ## free.$(OBJEXT) \ ## help.$(OBJEXT) \ ## simu.$(OBJEXT) \ ## eigen.$(OBJEXT) \ ## pars.$(OBJEXT) \ ## alrt.$(OBJEXT) \ ## interface.$(OBJEXT) \ ## cl.$(OBJEXT) \ ## spr.$(OBJEXT) \ ## draw.$(OBJEXT) \ ## stats.$(OBJEXT) \ ## rates.$(OBJEXT) \ ## times.$(OBJEXT) \ ## mcmc.$(OBJEXT) \ ## io.$(OBJEXT) \ ## make.$(OBJEXT) \ ## nexus.$(OBJEXT) \ ## init.$(OBJEXT) \ ## xml.$(OBJEXT) \ ## mixt.$(OBJEXT) \ ## date.$(OBJEXT) \ ## tbe.$(OBJEXT) \ ## sse.$(OBJEXT) \ ## avx.$(OBJEXT) \ ## ancestral.$(OBJEXT) \ ## phyrex.$(OBJEXT) \ ## location.$(OBJEXT) \ ## slfv.$(OBJEXT) \ ## rw.$(OBJEXT) \ ## rrw.$(OBJEXT) \ ## ibm.$(OBJEXT) \ ## iwn.$(OBJEXT) \ ## iou.$(OBJEXT) \ ## velocity.$(OBJEXT) phyrexsim_OBJECTS = $(am_phyrexsim_OBJECTS) phyrexsim_LDADD = $(LDADD) am__phytime_SOURCES_DIST = main.c utilities.c utilities.h optimiz.c \ optimiz.h lk.c lk.h bionj.c bionj.h models.c models.h free.c \ free.h help.c help.h simu.c simu.h eigen.c eigen.h pars.c \ pars.h alrt.c alrt.h interface.c interface.h cl.c cl.h spr.c \ spr.h times.c times.h draw.c draw.h rates.c rates.h mcmc.c \ mcmc.h stats.c stats.h mg.c mg.h io.c io.h make.c make.h \ mixt.c mixt.h init.c init.h nexus.c nexus.h date.c date.h \ tbe.c tbe.h sse.c sse.h avx.c avx.h ancestral.c ancestral.h \ xml.c xml.h #am_phytime_OBJECTS = main.$(OBJEXT) \ # utilities.$(OBJEXT) optimiz.$(OBJEXT) \ # lk.$(OBJEXT) bionj.$(OBJEXT) \ # models.$(OBJEXT) free.$(OBJEXT) \ # help.$(OBJEXT) simu.$(OBJEXT) \ # eigen.$(OBJEXT) pars.$(OBJEXT) \ # alrt.$(OBJEXT) interface.$(OBJEXT) \ # cl.$(OBJEXT) spr.$(OBJEXT) times.$(OBJEXT) \ # draw.$(OBJEXT) rates.$(OBJEXT) \ # mcmc.$(OBJEXT) stats.$(OBJEXT) mg.$(OBJEXT) \ # io.$(OBJEXT) make.$(OBJEXT) mixt.$(OBJEXT) \ # init.$(OBJEXT) nexus.$(OBJEXT) \ # date.$(OBJEXT) tbe.$(OBJEXT) sse.$(OBJEXT) \ # avx.$(OBJEXT) ancestral.$(OBJEXT) \ # xml.$(OBJEXT) phytime_OBJECTS = $(am_phytime_OBJECTS) phytime_LDADD = $(LDADD) am__rf_SOURCES_DIST = main.c utilities.c utilities.h optimiz.c \ optimiz.h lk.c lk.h bionj.c bionj.h models.c models.h free.c \ free.h help.c help.h simu.c simu.h eigen.c eigen.h pars.c \ pars.h alrt.c alrt.h interface.c interface.h cl.c cl.h spr.c \ spr.h draw.c draw.h stats.c stats.h mg.c mg.h io.c io.h make.c \ make.h nexus.c nexus.h init.c init.h xml.c xml.h mixt.c mixt.h \ tbe.c tbe.h cv.c cv.h ancestral.c ancestral.h m4.c m4.h \ evolve.c evolve.h times.c times.h date.c date.h rates.c \ rates.h sse.c sse.h avx.c avx.h #am_rf_OBJECTS = main.$(OBJEXT) \ # utilities.$(OBJEXT) \ # optimiz.$(OBJEXT) \ # lk.$(OBJEXT) bionj.$(OBJEXT) \ # models.$(OBJEXT) \ # free.$(OBJEXT) \ # help.$(OBJEXT) \ # simu.$(OBJEXT) \ # eigen.$(OBJEXT) \ # pars.$(OBJEXT) \ # alrt.$(OBJEXT) \ # interface.$(OBJEXT) \ # cl.$(OBJEXT) spr.$(OBJEXT) \ # draw.$(OBJEXT) \ # stats.$(OBJEXT) mg.$(OBJEXT) \ # io.$(OBJEXT) make.$(OBJEXT) \ # nexus.$(OBJEXT) \ # init.$(OBJEXT) xml.$(OBJEXT) \ # mixt.$(OBJEXT) tbe.$(OBJEXT) \ # cv.$(OBJEXT) \ # ancestral.$(OBJEXT) \ # m4.$(OBJEXT) \ # evolve.$(OBJEXT) \ # times.$(OBJEXT) \ # date.$(OBJEXT) \ # rates.$(OBJEXT) \ # sse.$(OBJEXT) avx.$(OBJEXT) rf_OBJECTS = $(am_rf_OBJECTS) rf_LDADD = $(LDADD) am__test_SOURCES_DIST = main.c utilities.c utilities.h optimiz.c \ optimiz.h lk.c lk.h bionj.c bionj.h models.c models.h free.c \ free.h help.c help.h simu.c simu.h eigen.c eigen.h pars.c \ pars.h alrt.c alrt.h interface.c interface.h cl.c cl.h spr.c \ spr.h draw.c draw.h tbe.c tbe.h stats.c stats.h rates.c \ rates.h mcmc.c mcmc.h times.c times.h mg.c mg.h io.c io.h \ make.c make.h nexus.c nexus.h init.c init.h xml.c xml.h mixt.c \ mixt.h sse.c sse.h avx.c avx.h ancestral.c ancestral.h \ phyrex.c phyrex.h location.c location.h velocity.c velocity.h \ rrw.c rrw.h slfv.c slfv.h rw.c rw.h iou.c iou.h iwn.c iwn.h \ ibm.c ibm.h date.c date.h ##am_test_OBJECTS = main.$(OBJEXT) \ ## utilities.$(OBJEXT) \ ## optimiz.$(OBJEXT) \ ## lk.$(OBJEXT) \ ## bionj.$(OBJEXT) \ ## models.$(OBJEXT) \ ## free.$(OBJEXT) \ ## help.$(OBJEXT) \ ## simu.$(OBJEXT) \ ## eigen.$(OBJEXT) \ ## pars.$(OBJEXT) \ ## alrt.$(OBJEXT) \ ## interface.$(OBJEXT) \ ## cl.$(OBJEXT) \ ## spr.$(OBJEXT) \ ## draw.$(OBJEXT) \ ## tbe.$(OBJEXT) \ ## stats.$(OBJEXT) \ ## rates.$(OBJEXT) \ ## mcmc.$(OBJEXT) \ ## times.$(OBJEXT) \ ## mg.$(OBJEXT) \ ## io.$(OBJEXT) \ ## make.$(OBJEXT) \ ## nexus.$(OBJEXT) \ ## init.$(OBJEXT) \ ## xml.$(OBJEXT) \ ## mixt.$(OBJEXT) \ ## sse.$(OBJEXT) \ ## avx.$(OBJEXT) \ ## ancestral.$(OBJEXT) \ ## phyrex.$(OBJEXT) \ ## location.$(OBJEXT) \ ## velocity.$(OBJEXT) \ ## rrw.$(OBJEXT) \ ## slfv.$(OBJEXT) \ ## rw.$(OBJEXT) \ ## iou.$(OBJEXT) \ ## iwn.$(OBJEXT) \ ## ibm.$(OBJEXT) \ ## date.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_LDADD = $(LDADD) AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/alrt.Po ./$(DEPDIR)/ancestral.Po \ ./$(DEPDIR)/avx.Po ./$(DEPDIR)/bionj.Po ./$(DEPDIR)/cl.Po \ ./$(DEPDIR)/cv.Po ./$(DEPDIR)/date.Po ./$(DEPDIR)/draw.Po \ ./$(DEPDIR)/eigen.Po ./$(DEPDIR)/evolve.Po ./$(DEPDIR)/free.Po \ ./$(DEPDIR)/help.Po ./$(DEPDIR)/ibm.Po ./$(DEPDIR)/init.Po \ ./$(DEPDIR)/interface.Po ./$(DEPDIR)/io.Po ./$(DEPDIR)/iou.Po \ ./$(DEPDIR)/iwn.Po ./$(DEPDIR)/lk.Po ./$(DEPDIR)/location.Po \ ./$(DEPDIR)/m4.Po ./$(DEPDIR)/main.Po ./$(DEPDIR)/make.Po \ ./$(DEPDIR)/mcmc.Po ./$(DEPDIR)/mg.Po ./$(DEPDIR)/mixt.Po \ ./$(DEPDIR)/models.Po ./$(DEPDIR)/mpi_boot.Po \ ./$(DEPDIR)/nexus.Po ./$(DEPDIR)/optimiz.Po \ ./$(DEPDIR)/pars.Po ./$(DEPDIR)/phyrex.Po ./$(DEPDIR)/rates.Po \ ./$(DEPDIR)/rrw.Po ./$(DEPDIR)/rw.Po ./$(DEPDIR)/simu.Po \ ./$(DEPDIR)/slfv.Po ./$(DEPDIR)/spr.Po ./$(DEPDIR)/sse.Po \ ./$(DEPDIR)/stats.Po ./$(DEPDIR)/tbe.Po ./$(DEPDIR)/times.Po \ ./$(DEPDIR)/utilities.Po ./$(DEPDIR)/velocity.Po \ ./$(DEPDIR)/xml.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(date_SOURCES) $(evolve_SOURCES) $(phyml_SOURCES) \ $(phyml_mpi_SOURCES) $(phyml_windows_SOURCES) \ $(phyrex_SOURCES) $(phyrexsim_SOURCES) $(phytime_SOURCES) \ $(rf_SOURCES) $(test_SOURCES) DIST_SOURCES = $(am__date_SOURCES_DIST) $(am__evolve_SOURCES_DIST) \ $(am__phyml_SOURCES_DIST) $(am__phyml_mpi_SOURCES_DIST) \ $(am__phyml_windows_SOURCES_DIST) $(am__phyrex_SOURCES_DIST) \ $(am__phyrexsim_SOURCES_DIST) $(am__phytime_SOURCES_DIST) \ $(am__rf_SOURCES_DIST) $(am__test_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = ${SHELL} '/Users/guindon/phyml/missing' aclocal-1.16 AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AUTOCONF = ${SHELL} '/Users/guindon/phyml/missing' autoconf AUTOHEADER = ${SHELL} '/Users/guindon/phyml/missing' autoheader AUTOMAKE = ${SHELL} '/Users/guindon/phyml/missing' automake-1.16 AWK = awk CC = mpicc CCDEPMODE = depmode=gcc3 CFLAGS = -std=gnu99 -O3 -fomit-frame-pointer -funroll-loops -Wall -Winline -finline -march=native CPPFLAGS = CSCOPE = cscope CTAGS = ctags CYGPATH_W = echo DEFS = $(REVISION) DEPDIR = .deps ECHO_C = \c ECHO_N = ECHO_T = EGREP = /usr/bin/grep -E ETAGS = etags EXEEXT = GREP = /usr/bin/grep INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s LATEX = latex LDFLAGS = LIBOBJS = LIBS = -lm LTLIBOBJS = MAKEINFO = ${SHELL} '/Users/guindon/phyml/missing' makeinfo MKDIR_P = .././install-sh -c -d OBJEXT = o PACKAGE = phyml PACKAGE_BUGREPORT = stephane.guindon@lirmm.fr PACKAGE_NAME = PhyML PACKAGE_STRING = PhyML 3.3.20250429 PACKAGE_TARNAME = phyml PACKAGE_URL = PACKAGE_VERSION = 3.3.20250429 PATH_SEPARATOR = : PDFLATEX = pdflatex SET_MAKE = SHELL = /bin/sh STRIP = VERSION = 3.3.20250429 abs_builddir = /Users/guindon/phyml/src abs_srcdir = /Users/guindon/phyml/src abs_top_builddir = /Users/guindon/phyml abs_top_srcdir = /Users/guindon/phyml ac_ct_CC = gcc am__include = include am__leading_dot = . am__quote = am__tar = $${TAR-tar} chof - "$$tardir" am__untar = $${TAR-tar} xf - bindir = ${exec_prefix}/bin build = aarch64-apple-darwin24.3.0 build_alias = build_cpu = aarch64 build_os = darwin24.3.0 build_vendor = apple builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} host = aarch64-apple-darwin24.3.0 host_alias = host_cpu = aarch64 host_os = darwin24.3.0 host_vendor = apple htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info install_sh = ${SHELL} /Users/guindon/phyml/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} runstatedir = ${localstatedir}/run sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . sysconfdir = ${prefix}/etc target_alias = top_build_prefix = ../ top_builddir = .. top_srcdir = .. #PROG = PHYML ##PROG = DATE ##PROG = PHYREXSIM ##PROG = PHYREX ##PROG = EVOLVE ##PROG = TEST ##PROG = PHYML PROG = PHYML #PROG = RF #PROG = PHYTIME #PROG = PHYML #phytime_SOURCES = main.c \ #utilities.c utilities.h\ #optimiz.c optimiz.h\ #lk.c lk.h\ #bionj.c bionj.h\ #models.c models.h\ #free.c free.h\ #help.c help.h\ #simu.c simu.h\ #eigen.c eigen.h\ #pars.c pars.h\ #alrt.c alrt.h\ #interface.c interface.h\ #cl.c cl.h\ #spr.c spr.h\ #times.c times.h\ #draw.c draw.h\ #rates.c rates.h\ #mcmc.c mcmc.h\ #stats.c stats.h\ #mg.c mg.h\ #io.c io.h\ #make.c make.h\ #mixt.c mixt.h\ #init.c init.h\ #nexus.c nexus.h\ #date.c date.h\ #tbe.c tbe.h\ #sse.c sse.h\ #avx.c avx.h\ #ancestral.c ancestral.h\ #xml.c xml.h # phytime_LDADD = -lm # if WANT_RWRAP # lib_LTLIBRARIES = librwrap.la # librwrap_la_SOURCES = main.c \ # utilities.c utilities.h\ # optimiz.c optimiz.h\ # lk.c lk.h\ # bionj.c bionj.h\ # models.c models.h\ # free.c free.h\ # help.c help.h\ # simu.c simu.h\ # eigen.c eigen.h\ # pars.c pars.h\ # alrt.c alrt.h\ # interface.c interface.h\ # cl.c cl.h\ # spr.c spr.h\ # draw.c draw.h\ # stats.c stats.h\ # rates.c rates.h\ # mcmc.c mcmc.h\ # times.c times.h\ # tiporder.c tiporder.h\ # mg.c mg.h\ # io.c io.h\ # make.c make.h\ # nexus.c nexus.h\ # init.c init.h\ # xml.c xml.h\ # mixt.c mixt.h\ # rwrapper.c rwrapper.h # librwrap_la_LIBADD = -lm # librwrap_la_LDFLAGS = -I/usr/share/R/include -shared -module -flat_namespace # librwrap_la_CFLAGS=-std=gnu99 -fPIC -Wl,-z,defs # else #rf_SOURCES = main.c \ #utilities.c utilities.h\ #optimiz.c optimiz.h\ #lk.c lk.h\ #bionj.c bionj.h\ #models.c models.h\ #free.c free.h\ #help.c help.h\ #simu.c simu.h\ #eigen.c eigen.h\ #pars.c pars.h\ #alrt.c alrt.h\ #interface.c interface.h\ #cl.c cl.h\ #spr.c spr.h\ #draw.c draw.h\ #stats.c stats.h\ #mg.c mg.h\ #io.c io.h\ #make.c make.h\ #nexus.c nexus.h\ #init.c init.h\ #xml.c xml.h\ #mixt.c mixt.h\ #tbe.c tbe.h \ #cv.c cv.h\ #ancestral.c ancestral.h\ #m4.c m4.h\ #evolve.c evolve.h\ #times.c times.h\ #date.c date.h\ #rates.c rates.h\ #sse.c sse.h\ #avx.c avx.h # rf_LDADD = -lm phyml_mpi_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ tbe.c tbe.h \ sse.c sse.h\ avx.c avx.h\ m4.c m4.h\ ancestral.c ancestral.h\ rates.c rates.h\ date.c date.h\ times.c times.h\ cv.c cv.h\ evolve.c evolve.h\ mpi_boot.c mpi_boot.h # phyml_mpi_LDADD = -lm ##phyml_windows_SOURCES = main.c \ ##utilities.c utilities.h\ ##optimiz.c optimiz.h\ ##lk.c lk.h\ ##bionj.c bionj.h\ ##models.c models.h\ ##free.c free.h\ ##help.c help.h\ ##simu.c simu.h\ ##eigen.c eigen.h\ ##pars.c pars.h\ ##alrt.c alrt.h\ ##interface.c interface.h\ ##cl.c cl.h\ ##spr.c spr.h\ ##draw.c draw.h\ ##tbe.c tbe.h \ ##stats.c stats.h\ ##rates.c rates.h\ ##mcmc.c mcmc.h\ ##times.c times.h\ ##mg.c mg.h\ ##io.c io.h\ ##make.c make.h\ ##nexus.c nexus.h\ ##init.c init.h\ ##xml.c xml.h\ ##mixt.c mixt.h\ ##sse.c sse.h\ ##avx.c avx.h\ ##ancestral.c ancestral.h\ ##date.c date.h # phyml_windows_LDADD = -lm ##test_SOURCES = main.c \ ##utilities.c utilities.h\ ##optimiz.c optimiz.h\ ##lk.c lk.h\ ##bionj.c bionj.h\ ##models.c models.h\ ##free.c free.h\ ##help.c help.h\ ##simu.c simu.h\ ##eigen.c eigen.h\ ##pars.c pars.h\ ##alrt.c alrt.h\ ##interface.c interface.h\ ##cl.c cl.h\ ##spr.c spr.h\ ##draw.c draw.h\ ##tbe.c tbe.h \ ##stats.c stats.h\ ##rates.c rates.h\ ##mcmc.c mcmc.h\ ##times.c times.h\ ##mg.c mg.h\ ##io.c io.h\ ##make.c make.h\ ##nexus.c nexus.h\ ##init.c init.h\ ##xml.c xml.h\ ##mixt.c mixt.h\ ##sse.c sse.h\ ##avx.c avx.h\ ##ancestral.c ancestral.h\ ##phyrex.c phyrex.h\ ##location.c location.h\ ##velocity.c velocity.h\ ##rrw.c rrw.h\ ##slfv.c slfv.h\ ##rw.c rw.h\ ##iou.c iou.h\ ##iwn.c iwn.h\ ##ibm.c ibm.h\ ##date.c date.h # test_LDADD = -lm ##evolve_SOURCES = main.c\ ##utilities.c utilities.h\ ##optimiz.c optimiz.h\ ##lk.c lk.h\ ##bionj.c bionj.h\ ##models.c models.h\ ##free.c free.h\ ##help.c help.h\ ##simu.c simu.h\ ##eigen.c eigen.h\ ##pars.c pars.h\ ##alrt.c alrt.h\ ##interface.c interface.h\ ##cl.c cl.h\ ##spr.c spr.h\ ##draw.c draw.h\ ##tbe.c tbe.h \ ##stats.c stats.h\ ##rates.c rates.h\ ##mcmc.c mcmc.h\ ##times.c times.h\ ##mg.c mg.h\ ##io.c io.h\ ##make.c make.h\ ##nexus.c nexus.h\ ##init.c init.h\ ##xml.c xml.h\ ##mixt.c mixt.h\ ##ancestral.c ancestral.h\ ##date.c date.h\ ##cv.c cv.h\ ##m4.c m4.h\ ##evolve.c evolve.h # evolve_LDADD = -lm ##phyrex_SOURCES = main.c\ ##utilities.c utilities.h\ ##optimiz.c optimiz.h\ ##lk.c lk.h\ ##bionj.c bionj.h\ ##models.c models.h\ ##free.c free.h\ ##help.c help.h\ ##simu.c simu.h\ ##eigen.c eigen.h\ ##pars.c pars.h\ ##alrt.c alrt.h\ ##interface.c interface.h\ ##cl.c cl.h\ ##spr.c spr.h\ ##draw.c draw.h\ ##stats.c stats.h\ ##rates.c rates.h\ ##times.c times.h\ ##mcmc.c mcmc.h\ ##io.c io.h\ ##make.c make.h\ ##nexus.c nexus.h\ ##init.c init.h\ ##xml.c xml.h\ ##mixt.c mixt.h\ ##date.c date.h\ ##tbe.c tbe.h \ ##sse.c sse.h\ ##avx.c avx.h\ ##ancestral.c ancestral.h\ ##phyrex.c phyrex.h\ ##location.c location.h\ ##slfv.c slfv.h\ ##rw.c rw.h\ ##rrw.c rrw.h\ ##ibm.c ibm.h\ ##iwn.c iwn.h\ ##iou.c iou.h\ ##m4.c m4.h\ ##evolve.c evolve.h\ ##cv.c cv.h\ ##velocity.c velocity.h # phyrex_LDADD = -lm ##phyrexsim_SOURCES = main.c\ ##utilities.c utilities.h\ ##optimiz.c optimiz.h\ ##lk.c lk.h\ ##bionj.c bionj.h\ ##models.c models.h\ ##free.c free.h\ ##help.c help.h\ ##simu.c simu.h\ ##eigen.c eigen.h\ ##pars.c pars.h\ ##alrt.c alrt.h\ ##interface.c interface.h\ ##cl.c cl.h\ ##spr.c spr.h\ ##draw.c draw.h\ ##stats.c stats.h\ ##rates.c rates.h\ ##times.c times.h\ ##mcmc.c mcmc.h\ ##io.c io.h\ ##make.c make.h\ ##nexus.c nexus.h\ ##init.c init.h\ ##xml.c xml.h\ ##mixt.c mixt.h\ ##date.c date.h\ ##tbe.c tbe.h \ ##sse.c sse.h\ ##avx.c avx.h\ ##ancestral.c ancestral.h\ ##phyrex.c phyrex.h\ ##location.c location.h\ ##slfv.c slfv.h\ ##rw.c rw.h\ ##rrw.c rrw.h\ ##ibm.c ibm.h\ ##iwn.c iwn.h\ ##iou.c iou.h\ ##velocity.c velocity.h # phyrexsim_LDADD = -lm ##date_SOURCES = main.c \ ##utilities.c utilities.h\ ##optimiz.c optimiz.h\ ##lk.c lk.h\ ##bionj.c bionj.h\ ##models.c models.h\ ##free.c free.h\ ##help.c help.h\ ##simu.c simu.h\ ##eigen.c eigen.h\ ##pars.c pars.h\ ##alrt.c alrt.h\ ##interface.c interface.h\ ##cl.c cl.h\ ##spr.c spr.h\ ##draw.c draw.h\ ##stats.c stats.h\ ##rates.c rates.h\ ##mcmc.c mcmc.h\ ##times.c times.h\ ##mg.c mg.h\ ##io.c io.h\ ##make.c make.h\ ##nexus.c nexus.h\ ##init.c init.h\ ##xml.c xml.h\ ##tbe.c tbe.h \ ##mixt.c mixt.h\ ##date.c date.h # date_LDADD = -lm #phyml_SOURCES = main.c \ #utilities.c utilities.h\ #optimiz.c optimiz.h\ #lk.c lk.h\ #bionj.c bionj.h\ #models.c models.h\ #free.c free.h\ #help.c help.h\ #simu.c simu.h\ #eigen.c eigen.h\ #pars.c pars.h\ #alrt.c alrt.h\ #interface.c interface.h\ #cl.c cl.h\ #spr.c spr.h\ #draw.c draw.h\ #stats.c stats.h\ #io.c io.h\ #make.c make.h\ #nexus.c nexus.h\ #init.c init.h\ #xml.c xml.h\ #sse.c sse.h\ #avx.c avx.h\ #tbe.c tbe.h \ #ancestral.c ancestral.h \ #mixt.c mixt.h \ #evolve.c evolve.h\ #rates.c rates.h\ #date.c date.h\ #times.c times.h\ #m4.c m4.h\ #cv.c cv.h all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) date$(EXEEXT): $(date_OBJECTS) $(date_DEPENDENCIES) $(EXTRA_date_DEPENDENCIES) @rm -f date$(EXEEXT) $(AM_V_CCLD)$(LINK) $(date_OBJECTS) $(date_LDADD) $(LIBS) evolve$(EXEEXT): $(evolve_OBJECTS) $(evolve_DEPENDENCIES) $(EXTRA_evolve_DEPENDENCIES) @rm -f evolve$(EXEEXT) $(AM_V_CCLD)$(LINK) $(evolve_OBJECTS) $(evolve_LDADD) $(LIBS) phyml$(EXEEXT): $(phyml_OBJECTS) $(phyml_DEPENDENCIES) $(EXTRA_phyml_DEPENDENCIES) @rm -f phyml$(EXEEXT) $(AM_V_CCLD)$(LINK) $(phyml_OBJECTS) $(phyml_LDADD) $(LIBS) phyml-mpi$(EXEEXT): $(phyml_mpi_OBJECTS) $(phyml_mpi_DEPENDENCIES) $(EXTRA_phyml_mpi_DEPENDENCIES) @rm -f phyml-mpi$(EXEEXT) $(AM_V_CCLD)$(LINK) $(phyml_mpi_OBJECTS) $(phyml_mpi_LDADD) $(LIBS) phyml-windows$(EXEEXT): $(phyml_windows_OBJECTS) $(phyml_windows_DEPENDENCIES) $(EXTRA_phyml_windows_DEPENDENCIES) @rm -f phyml-windows$(EXEEXT) $(AM_V_CCLD)$(LINK) $(phyml_windows_OBJECTS) $(phyml_windows_LDADD) $(LIBS) phyrex$(EXEEXT): $(phyrex_OBJECTS) $(phyrex_DEPENDENCIES) $(EXTRA_phyrex_DEPENDENCIES) @rm -f phyrex$(EXEEXT) $(AM_V_CCLD)$(LINK) $(phyrex_OBJECTS) $(phyrex_LDADD) $(LIBS) phyrexsim$(EXEEXT): $(phyrexsim_OBJECTS) $(phyrexsim_DEPENDENCIES) $(EXTRA_phyrexsim_DEPENDENCIES) @rm -f phyrexsim$(EXEEXT) $(AM_V_CCLD)$(LINK) $(phyrexsim_OBJECTS) $(phyrexsim_LDADD) $(LIBS) phytime$(EXEEXT): $(phytime_OBJECTS) $(phytime_DEPENDENCIES) $(EXTRA_phytime_DEPENDENCIES) @rm -f phytime$(EXEEXT) $(AM_V_CCLD)$(LINK) $(phytime_OBJECTS) $(phytime_LDADD) $(LIBS) rf$(EXEEXT): $(rf_OBJECTS) $(rf_DEPENDENCIES) $(EXTRA_rf_DEPENDENCIES) @rm -f rf$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rf_OBJECTS) $(rf_LDADD) $(LIBS) test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c include ./$(DEPDIR)/alrt.Po # am--include-marker include ./$(DEPDIR)/ancestral.Po # am--include-marker include ./$(DEPDIR)/avx.Po # am--include-marker include ./$(DEPDIR)/bionj.Po # am--include-marker include ./$(DEPDIR)/cl.Po # am--include-marker include ./$(DEPDIR)/cv.Po # am--include-marker include ./$(DEPDIR)/date.Po # am--include-marker include ./$(DEPDIR)/draw.Po # am--include-marker include ./$(DEPDIR)/eigen.Po # am--include-marker include ./$(DEPDIR)/evolve.Po # am--include-marker include ./$(DEPDIR)/free.Po # am--include-marker include ./$(DEPDIR)/help.Po # am--include-marker include ./$(DEPDIR)/ibm.Po # am--include-marker include ./$(DEPDIR)/init.Po # am--include-marker include ./$(DEPDIR)/interface.Po # am--include-marker include ./$(DEPDIR)/io.Po # am--include-marker include ./$(DEPDIR)/iou.Po # am--include-marker include ./$(DEPDIR)/iwn.Po # am--include-marker include ./$(DEPDIR)/lk.Po # am--include-marker include ./$(DEPDIR)/location.Po # am--include-marker include ./$(DEPDIR)/m4.Po # am--include-marker include ./$(DEPDIR)/main.Po # am--include-marker include ./$(DEPDIR)/make.Po # am--include-marker include ./$(DEPDIR)/mcmc.Po # am--include-marker include ./$(DEPDIR)/mg.Po # am--include-marker include ./$(DEPDIR)/mixt.Po # am--include-marker include ./$(DEPDIR)/models.Po # am--include-marker include ./$(DEPDIR)/mpi_boot.Po # am--include-marker include ./$(DEPDIR)/nexus.Po # am--include-marker include ./$(DEPDIR)/optimiz.Po # am--include-marker include ./$(DEPDIR)/pars.Po # am--include-marker include ./$(DEPDIR)/phyrex.Po # am--include-marker include ./$(DEPDIR)/rates.Po # am--include-marker include ./$(DEPDIR)/rrw.Po # am--include-marker include ./$(DEPDIR)/rw.Po # am--include-marker include ./$(DEPDIR)/simu.Po # am--include-marker include ./$(DEPDIR)/slfv.Po # am--include-marker include ./$(DEPDIR)/spr.Po # am--include-marker include ./$(DEPDIR)/sse.Po # am--include-marker include ./$(DEPDIR)/stats.Po # am--include-marker include ./$(DEPDIR)/tbe.Po # am--include-marker include ./$(DEPDIR)/times.Po # am--include-marker include ./$(DEPDIR)/utilities.Po # am--include-marker include ./$(DEPDIR)/velocity.Po # am--include-marker include ./$(DEPDIR)/xml.Po # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CC)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ # $(AM_V_CC_no)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CC)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ # $(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/alrt.Po -rm -f ./$(DEPDIR)/ancestral.Po -rm -f ./$(DEPDIR)/avx.Po -rm -f ./$(DEPDIR)/bionj.Po -rm -f ./$(DEPDIR)/cl.Po -rm -f ./$(DEPDIR)/cv.Po -rm -f ./$(DEPDIR)/date.Po -rm -f ./$(DEPDIR)/draw.Po -rm -f ./$(DEPDIR)/eigen.Po -rm -f ./$(DEPDIR)/evolve.Po -rm -f ./$(DEPDIR)/free.Po -rm -f ./$(DEPDIR)/help.Po -rm -f ./$(DEPDIR)/ibm.Po -rm -f ./$(DEPDIR)/init.Po -rm -f ./$(DEPDIR)/interface.Po -rm -f ./$(DEPDIR)/io.Po -rm -f ./$(DEPDIR)/iou.Po -rm -f ./$(DEPDIR)/iwn.Po -rm -f ./$(DEPDIR)/lk.Po -rm -f ./$(DEPDIR)/location.Po -rm -f ./$(DEPDIR)/m4.Po -rm -f ./$(DEPDIR)/main.Po -rm -f ./$(DEPDIR)/make.Po -rm -f ./$(DEPDIR)/mcmc.Po -rm -f ./$(DEPDIR)/mg.Po -rm -f ./$(DEPDIR)/mixt.Po -rm -f ./$(DEPDIR)/models.Po -rm -f ./$(DEPDIR)/mpi_boot.Po -rm -f ./$(DEPDIR)/nexus.Po -rm -f ./$(DEPDIR)/optimiz.Po -rm -f ./$(DEPDIR)/pars.Po -rm -f ./$(DEPDIR)/phyrex.Po -rm -f ./$(DEPDIR)/rates.Po -rm -f ./$(DEPDIR)/rrw.Po -rm -f ./$(DEPDIR)/rw.Po -rm -f ./$(DEPDIR)/simu.Po -rm -f ./$(DEPDIR)/slfv.Po -rm -f ./$(DEPDIR)/spr.Po -rm -f ./$(DEPDIR)/sse.Po -rm -f ./$(DEPDIR)/stats.Po -rm -f ./$(DEPDIR)/tbe.Po -rm -f ./$(DEPDIR)/times.Po -rm -f ./$(DEPDIR)/utilities.Po -rm -f ./$(DEPDIR)/velocity.Po -rm -f ./$(DEPDIR)/xml.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/alrt.Po -rm -f ./$(DEPDIR)/ancestral.Po -rm -f ./$(DEPDIR)/avx.Po -rm -f ./$(DEPDIR)/bionj.Po -rm -f ./$(DEPDIR)/cl.Po -rm -f ./$(DEPDIR)/cv.Po -rm -f ./$(DEPDIR)/date.Po -rm -f ./$(DEPDIR)/draw.Po -rm -f ./$(DEPDIR)/eigen.Po -rm -f ./$(DEPDIR)/evolve.Po -rm -f ./$(DEPDIR)/free.Po -rm -f ./$(DEPDIR)/help.Po -rm -f ./$(DEPDIR)/ibm.Po -rm -f ./$(DEPDIR)/init.Po -rm -f ./$(DEPDIR)/interface.Po -rm -f ./$(DEPDIR)/io.Po -rm -f ./$(DEPDIR)/iou.Po -rm -f ./$(DEPDIR)/iwn.Po -rm -f ./$(DEPDIR)/lk.Po -rm -f ./$(DEPDIR)/location.Po -rm -f ./$(DEPDIR)/m4.Po -rm -f ./$(DEPDIR)/main.Po -rm -f ./$(DEPDIR)/make.Po -rm -f ./$(DEPDIR)/mcmc.Po -rm -f ./$(DEPDIR)/mg.Po -rm -f ./$(DEPDIR)/mixt.Po -rm -f ./$(DEPDIR)/models.Po -rm -f ./$(DEPDIR)/mpi_boot.Po -rm -f ./$(DEPDIR)/nexus.Po -rm -f ./$(DEPDIR)/optimiz.Po -rm -f ./$(DEPDIR)/pars.Po -rm -f ./$(DEPDIR)/phyrex.Po -rm -f ./$(DEPDIR)/rates.Po -rm -f ./$(DEPDIR)/rrw.Po -rm -f ./$(DEPDIR)/rw.Po -rm -f ./$(DEPDIR)/simu.Po -rm -f ./$(DEPDIR)/slfv.Po -rm -f ./$(DEPDIR)/spr.Po -rm -f ./$(DEPDIR)/sse.Po -rm -f ./$(DEPDIR)/stats.Po -rm -f ./$(DEPDIR)/tbe.Po -rm -f ./$(DEPDIR)/times.Po -rm -f ./$(DEPDIR)/utilities.Po -rm -f ./$(DEPDIR)/velocity.Po -rm -f ./$(DEPDIR)/xml.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile # phyml_LDADD = -lm all-am: intro $(bin_PROGRAMS) @echo "" @echo "Done." intro: @echo "" @echo "" @echo ".: Building [$(bin_PROGRAMS)]. Version $(VERSION) :." @echo "" @echo "" # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: stephaneguindon-phyml-76a39c8/src/Makefile.am000066400000000000000000000172651501136442400212400ustar00rootroot00000000000000# EXTRA_DIST = doc bin examples DEFS = $(REVISION) if WANT_PHYML bin_PROGRAMS = phyml PROG = PHYML else if WANT_PHYTIME bin_PROGRAMS = phytime PROG = PHYTIME else if WANT_RF bin_PROGRAMS = rf PROG = RF else if WANT_MPI bin_PROGRAMS = phyml-mpi PROG = PHYML else if WANT_WIN bin_PROGRAMS = phyml-windows PROG = PHYML else if WANT_TEST bin_PROGRAMS = test PROG = TEST else if WANT_EVOLVE bin_PROGRAMS = evolve PROG = EVOLVE else if WANT_PHYREX bin_PROGRAMS = phyrex PROG = PHYREX else if WANT_PHYREXSIM bin_PROGRAMS = phyrexsim PROG = PHYREXSIM else if WANT_DATE bin_PROGRAMS = date PROG = DATE else bin_PROGRAMS = phyml PROG = PHYML endif endif endif endif endif endif endif endif endif endif if WANT_PHYTIME phytime_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ times.c times.h\ draw.c draw.h\ rates.c rates.h\ mcmc.c mcmc.h\ stats.c stats.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ mixt.c mixt.h\ init.c init.h\ nexus.c nexus.h\ date.c date.h\ tbe.c tbe.h\ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ xml.c xml.h # phytime_LDADD = -lm else # if WANT_RWRAP # lib_LTLIBRARIES = librwrap.la # librwrap_la_SOURCES = main.c \ # utilities.c utilities.h\ # optimiz.c optimiz.h\ # lk.c lk.h\ # bionj.c bionj.h\ # models.c models.h\ # free.c free.h\ # help.c help.h\ # simu.c simu.h\ # eigen.c eigen.h\ # pars.c pars.h\ # alrt.c alrt.h\ # interface.c interface.h\ # cl.c cl.h\ # spr.c spr.h\ # draw.c draw.h\ # stats.c stats.h\ # rates.c rates.h\ # mcmc.c mcmc.h\ # times.c times.h\ # tiporder.c tiporder.h\ # mg.c mg.h\ # io.c io.h\ # make.c make.h\ # nexus.c nexus.h\ # init.c init.h\ # xml.c xml.h\ # mixt.c mixt.h\ # rwrapper.c rwrapper.h # librwrap_la_LIBADD = -lm # librwrap_la_LDFLAGS = -I/usr/share/R/include -shared -module -flat_namespace # librwrap_la_CFLAGS=-std=gnu99 -fPIC -Wl,-z,defs # else if WANT_RF rf_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ tbe.c tbe.h \ cv.c cv.h\ ancestral.c ancestral.h\ m4.c m4.h\ evolve.c evolve.h\ times.c times.h\ date.c date.h\ rates.c rates.h\ sse.c sse.h\ avx.c avx.h # rf_LDADD = -lm else if WANT_MPI phyml_mpi_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ tbe.c tbe.h \ sse.c sse.h\ avx.c avx.h\ m4.c m4.h\ ancestral.c ancestral.h\ rates.c rates.h\ date.c date.h\ times.c times.h\ cv.c cv.h\ evolve.c evolve.h\ mpi_boot.c mpi_boot.h # phyml_mpi_LDADD = -lm else if WANT_WIN phyml_windows_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ tbe.c tbe.h \ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ date.c date.h # phyml_windows_LDADD = -lm else if WANT_TEST test_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ tbe.c tbe.h \ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ phyrex.c phyrex.h\ location.c location.h\ velocity.c velocity.h\ rrw.c rrw.h\ slfv.c slfv.h\ rw.c rw.h\ iou.c iou.h\ iwn.c iwn.h\ ibm.c ibm.h\ date.c date.h # test_LDADD = -lm else if WANT_EVOLVE evolve_SOURCES = main.c\ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ tbe.c tbe.h \ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ ancestral.c ancestral.h\ date.c date.h\ cv.c cv.h\ m4.c m4.h\ evolve.c evolve.h # evolve_LDADD = -lm else if WANT_PHYREX phyrex_SOURCES = main.c\ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ rates.c rates.h\ times.c times.h\ mcmc.c mcmc.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ date.c date.h\ tbe.c tbe.h \ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ phyrex.c phyrex.h\ location.c location.h\ slfv.c slfv.h\ rw.c rw.h\ rrw.c rrw.h\ ibm.c ibm.h\ iwn.c iwn.h\ iou.c iou.h\ m4.c m4.h\ evolve.c evolve.h\ cv.c cv.h\ velocity.c velocity.h # phyrex_LDADD = -lm else if WANT_PHYREXSIM phyrexsim_SOURCES = main.c\ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ rates.c rates.h\ times.c times.h\ mcmc.c mcmc.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ date.c date.h\ tbe.c tbe.h \ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ phyrex.c phyrex.h\ location.c location.h\ slfv.c slfv.h\ rw.c rw.h\ rrw.c rrw.h\ ibm.c ibm.h\ iwn.c iwn.h\ iou.c iou.h\ velocity.c velocity.h # phyrexsim_LDADD = -lm else if WANT_DATE date_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ tbe.c tbe.h \ mixt.c mixt.h\ date.c date.h # date_LDADD = -lm else phyml_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ sse.c sse.h\ avx.c avx.h\ tbe.c tbe.h \ ancestral.c ancestral.h \ mixt.c mixt.h \ evolve.c evolve.h\ rates.c rates.h\ date.c date.h\ times.c times.h\ m4.c m4.h\ cv.c cv.h # phyml_LDADD = -lm endif endif endif endif endif endif endif endif endif all-am: intro $(bin_PROGRAMS) @echo "" @echo "Done." intro: @echo "" @echo "" @echo ".: Building [$(bin_PROGRAMS)]. Version $(VERSION) :." @echo "" @echo "" stephaneguindon-phyml-76a39c8/src/alrt.c000066400000000000000000001134021501136442400203000ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Implementation of aLRT branch tests, and 5-branchs NNI research optimization. Authors : Jean-Francois Dufayard & Stephane Guindon. */ #include "alrt.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* * Check every testable branch of the tree, * check for NNIs, optimizing 5 branches, * param tree : the tree to check */ int Check_NNI_Five_Branches(t_tree *tree) { int best_edge; phydbl best_gain; int best_config; int i; int better_found; /* = 1 if a phylogeny with greater likelihood than current one was found */ int result; phydbl init_lnL; init_lnL = UNLIKELY; better_found = YES; //While there is at least one NNI to do... while(better_found == YES) { Update_Dirs(tree); //Interface output if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf("\n\n. Checking for NNIs, optimizing five branches...\n"); better_found = 0; result = -1; best_edge = -1; best_gain = tree->mod->s_opt->min_diff_lk_local; best_config = -1; MIXT_Set_Alias_Subpatt(YES,tree); Set_Both_Sides(YES,tree); init_lnL = Lk(NULL,tree); MIXT_Set_Alias_Subpatt(NO,tree); // For every branch for(i=0;i<2*tree->n_otu-3;++i) { //if this branch is not terminal if((!tree->a_edges[i]->left->tax) && (!tree->a_edges[i]->rght->tax)) { result = -1; //Try every NNIs for the tested branch result = NNI_Neigh_BL(tree->a_edges[i],tree); //Look for possible NNI to do, and check if it is the best one switch(result) { case 1 : /* lk1 > lk0 > lk2 */ { if((tree->a_edges[i]->nni->lk0 - tree->a_edges[i]->nni->lk1) < best_gain) { better_found = YES; best_edge = i; best_gain = tree->a_edges[i]->nni->lk0-tree->a_edges[i]->nni->lk1; best_config = 1; } break; } case 2 : /* lk2 > lk0 > lk1 */ { if((tree->a_edges[i]->nni->lk0 - tree->a_edges[i]->nni->lk2) < best_gain) { better_found = YES; best_edge = i; best_gain = tree->a_edges[i]->nni->lk0-tree->a_edges[i]->nni->lk2; best_config = 2; } break; } case 3 : /* lk1 > lk2 > lk0 */ { if((tree->a_edges[i]->nni->lk2 - tree->a_edges[i]->nni->lk1) < best_gain) { better_found = YES; best_edge = i; best_gain = tree->a_edges[i]->nni->lk2-tree->a_edges[i]->nni->lk1; best_config = 1; } break; } case 4 : /* lk2 > lk1 > lk0 */ { if((tree->a_edges[i]->nni->lk1 - tree->a_edges[i]->nni->lk2) < best_gain) { better_found = YES; best_edge = i; best_gain = tree->a_edges[i]->nni->lk1-tree->a_edges[i]->nni->lk2; best_config = 2; } break; } default : /* lk2 = lk1 = lk0 */ { if(best_gain > .0) best_gain = .0; break; } } } } if((tree->c_lnL < init_lnL - tree->mod->s_opt->min_diff_lk_local) || (tree->c_lnL > init_lnL + tree->mod->s_opt->min_diff_lk_local)) { PhyML_Fprintf(stderr,"\n\n== tree->c_lnL = %f init_lnL = %f.",tree->c_lnL,init_lnL); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n\n.\n",__FILE__,__LINE__); Warn_And_Exit("\n"); } //Don't do any NNI if the user doesn't want to optimize topology if(!tree->mod->s_opt->opt_topo) better_found = NO; /* if(FABS(best_gain) <= tree->mod->s_opt->min_diff_lk_move) better_found = 0; */ //If there is one swap to do, make the best one. if(better_found) { Make_Target_Swap(tree,tree->a_edges[best_edge],best_config); MIXT_Set_Alias_Subpatt(YES,tree); Lk(NULL,tree); MIXT_Set_Alias_Subpatt(YES,tree); if(tree->c_lnL < init_lnL) { PhyML_Fprintf(stderr,"\n\n== tree->c_lnL = %f init_lnL = %f.",tree->c_lnL,init_lnL); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n\n.\n",__FILE__,__LINE__); Exit("\n"); } if(tree->verbose > VL0 && tree->io->quiet == NO) Print_Lk(tree,"[Topology ]"); if(FABS(tree->c_lnL - init_lnL) < tree->mod->s_opt->min_diff_lk_move) return 0; return 1; } } return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Compute aLRT supports */ void aLRT(t_tree *tree) { int i; char *method; // Print_All_Edge_Likelihoods(tree); Unscale_Br_Len_Multiplier_Tree(tree); Br_Len_Not_Involving_Invar(tree); // Print_All_Edge_Likelihoods(tree); /* aLRT support will label each internal branch */ tree->io->print_support_val = YES; /* The topology will not be modified when assessing the branch support. We make sure that it will not be modified afterwards by locking the topology */ method = (char *)mCalloc(100,sizeof(char)); switch(tree->io->ratio_test) { case ALRTCHI2: { strcpy(method,"aLRT"); break; } case MINALRTCHI2SH: { strcpy(method,"aLRT"); break; } case ALRTSTAT: { strcpy(method,"aLRT"); break; } case SH: { strcpy(method,"SH"); break; } case ABAYES: { strcpy(method,"aBayes"); break; } default : return; } if(tree->io->quiet == NO) PhyML_Printf("\n\n. Calculating fast branch supports (using '%s').",method); Free(method); MIXT_Set_Alias_Subpatt(YES,tree); Set_Both_Sides(YES,tree); // Print_All_Edge_Likelihoods(tree); Lk(NULL,tree); // Print_All_Edge_Likelihoods(tree); MIXT_Set_Alias_Subpatt(NO,tree); Update_Dirs(tree); for(i=0;i<2*tree->n_otu-3;++i) { if((!tree->a_edges[i]->left->tax) && (!tree->a_edges[i]->rght->tax)) { /* Compute likelihoods for each of the three configuration */ NNI_Neigh_BL(tree->a_edges[i],tree); /* Compute the corresponding statistical support */ Compute_Likelihood_Ratio_Test(tree->a_edges[i],tree); } } tree->lock_topo = YES; Br_Len_Involving_Invar(tree); Rescale_Br_Len_Multiplier_Tree(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* * Launch one branch testing, * analyse the result * and convert supports as wished by the user. * param tree : the tree to check * param tested_t_edge : the tested t_edge of the tree * param old_loglk : the initial likelihood, before any aLRT analysis * param isBoot : 1 if used from the procedure, 0 if not * return an integer, informative to analyse the results and potential NNIs to do */ int Compute_Likelihood_Ratio_Test(t_edge *tested_edge, t_tree *tree) { int result=0; tested_edge->ratio_test = 0.0; tested_edge->alrt_statistic = -1.0; if((tested_edge->nni->lk0 > tested_edge->nni->lk1) && (tested_edge->nni->lk0 > tested_edge->nni->lk2)) { if(tested_edge->nni->lk1 < tested_edge->nni->lk2) { //lk0 > lk2 > lk1 tested_edge->alrt_statistic = 2*(tested_edge->nni->lk0 - tested_edge->nni->lk2); } else { //lk0 > lk1 >= lk2 tested_edge->alrt_statistic = 2*(tested_edge->nni->lk0 - tested_edge->nni->lk1); } if (tested_edge->alrt_statistic < 0.0) { tested_edge->alrt_statistic = 0.0; tested_edge->ratio_test = 0.0; } else { //aLRT statistic is valid, compute the branch support if (tree->io->ratio_test == ALRTCHI2) { tested_edge->ratio_test = Statistics_To_Probabilities(tested_edge->alrt_statistic); } else if(tree->io->ratio_test == MINALRTCHI2SH) { phydbl sh_support; phydbl param_support; sh_support = Statistics_To_SH(tree); param_support = Statistics_To_Probabilities(tested_edge->alrt_statistic); if(sh_support < param_support) tested_edge->ratio_test = sh_support; else tested_edge->ratio_test = param_support; } else if(tree->io->ratio_test == ALRTSTAT) { tested_edge->ratio_test=tested_edge->alrt_statistic; } else if(tree->io->ratio_test == SH) { tested_edge->ratio_test = Statistics_To_SH(tree); } else if(tree->io->ratio_test == ABAYES) { phydbl Kp0,Kp1,Kp2,logK; logK = 1. - MAX(MAX(tested_edge->nni->lk0,tested_edge->nni->lk1),tested_edge->nni->lk2); Kp0 = exp(tested_edge->nni->lk0+logK); Kp1 = exp(tested_edge->nni->lk1+logK); Kp2 = exp(tested_edge->nni->lk2+logK); tested_edge->ratio_test = Kp0/(Kp0+Kp1+Kp2); } } } //statistic is not valid, give the negative statistics if wished, or a zero support. else if((tested_edge->nni->lk1 > tested_edge->nni->lk0) && (tested_edge->nni->lk1 > tested_edge->nni->lk2)) { /* tested_edge->ratio_test = 2*(tested_edge->nni->lk0-tested_edge->nni->lk1); */ tested_edge->ratio_test = 0.0; if(tree->io->ratio_test > 1) tested_edge->alrt_statistic = 0.0; } else if((tested_edge->nni->lk2 > tested_edge->nni->lk0) && (tested_edge->nni->lk2 > tested_edge->nni->lk1)) { /* tested_edge->ratio_test = 2*(tested_edge->nni->lk0-tested_edge->nni->lk2); */ tested_edge->ratio_test = 0.0; if(tree->io->ratio_test > 1) tested_edge->alrt_statistic = 0.0; } else // lk0 ~ lk1 ~ lk2 { tested_edge->ratio_test = 0.0; if(tree->io->ratio_test > 1) tested_edge->ratio_test = 0.0; } return result; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* * Test the 3 NNI positions for one branch. * param tree : the tree to check * param tested_t_edge : the tested t_edge of the tree * param old_loglk : the initial likelihood, before any aLRT analysis * param isBoot : 1 if used from the Bootstrap procedure, 0 if not */ int NNI_Neigh_BL(t_edge *b_fcus, t_tree *tree) { /*! syntax : (node) [edge] (left_1) . .(right_1) \ (left) (right) / \._____________./ / [b_fcus] \ / \ (left_2) . .(right_2) */ int site; t_node *v1,*v2,*v3,*v4; t_edge *e1,*e2,*e3,*e4; scalar_dbl *len_e1,*len_e2,*len_e3,*len_e4; scalar_dbl *var_e1,*var_e2,*var_e3,*var_e4; phydbl lk0, lk1, lk2; scalar_dbl *l_init,*v_init; phydbl lk_init, lk_temp; int i; int result; void *buff; result = 0; /*! Initialization */ l_init = Duplicate_Scalar_Dbl(b_fcus->l); v_init = Duplicate_Scalar_Dbl(b_fcus->l_var); lk_init = tree->c_lnL; lk_temp = UNLIKELY; lk0 = lk1 = lk2 = UNLIKELY; v1 = v2 = v3 = v4 = NULL; Init_NNI_Score(0.0,b_fcus,tree); /*! vertices */ v1 = b_fcus->left->v[b_fcus->l_v1]; v2 = b_fcus->left->v[b_fcus->l_v2]; v3 = b_fcus->rght->v[b_fcus->r_v1]; v4 = b_fcus->rght->v[b_fcus->r_v2]; if(v1->num < v2->num) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Exit(""); } if(v3->num < v4->num) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Exit(""); } /*! edges */ e1 = b_fcus->left->b[b_fcus->l_v1]; e2 = b_fcus->left->b[b_fcus->l_v2]; e3 = b_fcus->rght->b[b_fcus->r_v1]; e4 = b_fcus->rght->b[b_fcus->r_v2]; /*! record initial branch lengths */ len_e1 = Duplicate_Scalar_Dbl(e1->l); len_e2 = Duplicate_Scalar_Dbl(e2->l); len_e3 = Duplicate_Scalar_Dbl(e3->l); len_e4 = Duplicate_Scalar_Dbl(e4->l); var_e1 = Duplicate_Scalar_Dbl(e1->l_var); var_e2 = Duplicate_Scalar_Dbl(e2->l_var); var_e3 = Duplicate_Scalar_Dbl(e3->l_var); var_e4 = Duplicate_Scalar_Dbl(e4->l_var); /*! Optimize branch lengths and update likelihoods for the original configuration. */ do { lk0 = lk_temp; for(i=0;i<3;i++) //a branch has three nodes if(b_fcus->left->v[i] != b_fcus->rght) //Only consider left_1 and left_2 { Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->left->b[i]->l->v),b_fcus->left->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) //Only consider right_1 and right_2 { Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->rght->b[i]->l->v),b_fcus->rght->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); if(lk_temp < lk0 - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. lk_temp = %f lk0 = %f\n",lk_temp,lk0); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Exit("\n"); } } while(fabs(lk_temp-lk0) > tree->mod->s_opt->min_diff_lk_global); //until no significative improvement is detected lk0 = tree->c_lnL; buff = (t_tree *)tree; do { for(site=0;sitedata->n_pattern;site++) tree->log_lks_aLRT[0][site] = tree->c_lnL_sorted[site]; tree = tree->next_mixt; } while(tree); tree = (t_tree *)buff; /*! Go back to initial branch lengths */ Copy_Scalar_Dbl(len_e1,e1->l); Copy_Scalar_Dbl(len_e2,e2->l); Copy_Scalar_Dbl(len_e3,e3->l); Copy_Scalar_Dbl(len_e4,e4->l); Copy_Scalar_Dbl(l_init,b_fcus->l); Copy_Scalar_Dbl(var_e1,e1->l_var); Copy_Scalar_Dbl(var_e2,e2->l_var); Copy_Scalar_Dbl(var_e3,e3->l_var); Copy_Scalar_Dbl(var_e4,e4->l_var); Copy_Scalar_Dbl(v_init,b_fcus->l_var); Update_PMat_At_Given_Edge(e1,tree); Update_PMat_At_Given_Edge(e2,tree); Update_PMat_At_Given_Edge(e3,tree); Update_PMat_At_Given_Edge(e4,tree); Update_PMat_At_Given_Edge(b_fcus,tree); /* Sanity check */ MIXT_Set_Alias_Subpatt(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Lk(b_fcus,tree); MIXT_Set_Alias_Subpatt(NO,tree); if((lk_temp > lk_init + tree->mod->s_opt->min_diff_lk_local) || (lk_temp < lk_init - tree->mod->s_opt->min_diff_lk_local)) { PhyML_Fprintf(stderr,"\n. lk_temp = %f lk_init = %f",lk_temp,lk_init); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } /*! Do first possible swap */ Swap(v2,b_fcus->left,b_fcus->rght,v3,tree); MIXT_Set_Alias_Subpatt(YES,tree); Set_Both_Sides(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->left); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk1 = Lk(b_fcus,tree); MIXT_Set_Alias_Subpatt(NO,tree); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); /*! Optimize branch lengths and update likelihoods */ lk_temp = UNLIKELY; do { lk1 = lk_temp; for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) { Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->left->b[i]->l->v),b_fcus->left->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) { Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->rght->b[i]->l->v),b_fcus->rght->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); if(lk_temp < lk1 - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. lk_temp = %f lk1 = %f\n",lk_temp,lk1); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Exit(""); } } while(FABS(lk_temp-lk1) > tree->mod->s_opt->min_diff_lk_global); /*! until no significative improvement is detected */ lk1 = tree->c_lnL; /*! record likelihood of each site, in order to compute branch supports */ buff = (t_tree *)tree; do { for(site=0;sitedata->n_pattern;site++) tree->log_lks_aLRT[1][site]= tree->c_lnL_sorted[site]; tree = tree->next_mixt; } while(tree); tree = (t_tree *)buff; Swap(v3,b_fcus->left,b_fcus->rght,v2,tree); /*! Go back to initial branch lengths */ Copy_Scalar_Dbl(len_e1,e1->l); Copy_Scalar_Dbl(len_e2,e2->l); Copy_Scalar_Dbl(len_e3,e3->l); Copy_Scalar_Dbl(len_e4,e4->l); Copy_Scalar_Dbl(l_init,b_fcus->l); Copy_Scalar_Dbl(var_e1,e1->l_var); Copy_Scalar_Dbl(var_e2,e2->l_var); Copy_Scalar_Dbl(var_e3,e3->l_var); Copy_Scalar_Dbl(var_e4,e4->l_var); Copy_Scalar_Dbl(v_init,b_fcus->l_var); Update_PMat_At_Given_Edge(e1,tree); Update_PMat_At_Given_Edge(e2,tree); Update_PMat_At_Given_Edge(e3,tree); Update_PMat_At_Given_Edge(e4,tree); Update_PMat_At_Given_Edge(b_fcus,tree); /* Sanity check */ MIXT_Set_Alias_Subpatt(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); Update_Partial_Lk(tree,b_fcus,b_fcus->left); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Lk(b_fcus,tree); MIXT_Set_Alias_Subpatt(NO,tree); if((lk_temp > lk_init + tree->mod->s_opt->min_diff_lk_local) || (lk_temp < lk_init - tree->mod->s_opt->min_diff_lk_local)) { PhyML_Fprintf(stderr,"\n== lk_temp = %f lk_init = %f",lk_temp,lk_init); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } /*! do the second possible swap */ Swap(v2,b_fcus->left,b_fcus->rght,v4,tree); Set_Both_Sides(YES,tree); MIXT_Set_Alias_Subpatt(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->left); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk2 = Lk(b_fcus,tree); MIXT_Set_Alias_Subpatt(NO,tree); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); /*! Optimize branch lengths and update likelihoods */ lk_temp = UNLIKELY; do { lk2 = lk_temp; for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) { Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->left->b[i]->l->v),b_fcus->left->b[i],tree); if(lk_temp < lk2 - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n== l: %f var:%f",b_fcus->left->b[i]->l->v,b_fcus->left->b[i]->l_var->v); PhyML_Fprintf(stderr,"\n== lk_temp = %f lk2 = %f",lk_temp,lk2); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d",__FILE__,__LINE__); Exit("\n"); } } Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); if(lk_temp < lk2 - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n== l: %f var:%f",b_fcus->l->v,b_fcus->l_var->v); PhyML_Fprintf(stderr,"\n== lk_temp = %f lk2 = %f",lk_temp,lk2); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d",__FILE__,__LINE__); Exit("\n"); } for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) { Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->rght->b[i]->l->v),b_fcus->rght->b[i],tree); if(lk_temp < lk2 - tree->mod->s_opt->min_diff_lk_local) { Set_Both_Sides(YES,tree); Lk(b_fcus,tree); Check_Lk_At_Given_Edge(YES,tree); PhyML_Fprintf(stderr,"\n== l: %f var:%f",b_fcus->rght->b[i]->l->v,b_fcus->rght->b[i]->l_var->v); PhyML_Fprintf(stderr,"\n== lk_temp = %f lk2 = %f",lk_temp,lk2); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d",__FILE__,__LINE__); Exit("\n"); } } Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); } while(FABS(lk_temp-lk2) > tree->mod->s_opt->min_diff_lk_global); //until no significative improvement is detected lk2 = tree->c_lnL; /*! save likelihood of each sites, in order to compute branch supports */ buff = (t_tree *)tree; do { for(site=0;sitedata->n_pattern;site++) tree->log_lks_aLRT[2][site]= tree->c_lnL_sorted[site]; tree = tree->next_mixt; } while(tree); tree = (t_tree *)buff; /*! undo the swap */ Swap(v4,b_fcus->left,b_fcus->rght,v2,tree); /***********/ /*! restore the initial branch length values */ Copy_Scalar_Dbl(len_e1,e1->l); Copy_Scalar_Dbl(len_e2,e2->l); Copy_Scalar_Dbl(len_e3,e3->l); Copy_Scalar_Dbl(len_e4,e4->l); Copy_Scalar_Dbl(l_init,b_fcus->l); Copy_Scalar_Dbl(var_e1,e1->l_var); Copy_Scalar_Dbl(var_e2,e2->l_var); Copy_Scalar_Dbl(var_e3,e3->l_var); Copy_Scalar_Dbl(var_e4,e4->l_var); Copy_Scalar_Dbl(v_init,b_fcus->l_var); /*! recompute likelihoods */ Update_PMat_At_Given_Edge(e1,tree); Update_PMat_At_Given_Edge(e2,tree); Update_PMat_At_Given_Edge(e3,tree); Update_PMat_At_Given_Edge(e4,tree); Update_PMat_At_Given_Edge(b_fcus,tree); MIXT_Set_Alias_Subpatt(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->left); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); MIXT_Set_Alias_Subpatt(NO,tree); lk_temp = Lk(b_fcus,tree); if((lk_temp > lk_init + tree->mod->s_opt->min_diff_lk_local) || (lk_temp < lk_init - tree->mod->s_opt->min_diff_lk_local)) { PhyML_Fprintf(stderr,"\n== lk_temp = %f lk_init = %f",lk_temp,lk_init); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } //save likelihoods in NNI structures b_fcus->nni->lk0 = lk0; b_fcus->nni->lk1 = lk1; b_fcus->nni->lk2 = lk2; b_fcus->nni->score = lk0 - MAX(lk1,lk2); if((b_fcus->nni->score < tree->mod->s_opt->min_diff_lk_local) && (b_fcus->nni->score > -tree->mod->s_opt->min_diff_lk_local)) { b_fcus->nni->score = .0; b_fcus->nni->lk1 = b_fcus->nni->lk2 = b_fcus->nni->lk0; } if((b_fcus->nni->lk1 > b_fcus->nni->lk0) && (b_fcus->nni->lk1 > b_fcus->nni->lk2)) { if(b_fcus->nni->lk0 > b_fcus->nni->lk2) result = 1; //lk1 > lk0 > lk2 else result = 3; //lk1 > lk2 > lk0 } else if((b_fcus->nni->lk2 > b_fcus->nni->lk0) && (b_fcus->nni->lk2 > b_fcus->nni->lk1)) { if(b_fcus->nni->lk0 > b_fcus->nni->lk1) result = 2; //lk2 > lk0 > lk1 else result = 4; //lk2 > lk1 > lk0 } Free_Scalar_Dbl(len_e1); Free_Scalar_Dbl(len_e2); Free_Scalar_Dbl(len_e3); Free_Scalar_Dbl(len_e4); Free_Scalar_Dbl(l_init); Free_Scalar_Dbl(var_e1); Free_Scalar_Dbl(var_e2); Free_Scalar_Dbl(var_e3); Free_Scalar_Dbl(var_e4); Free_Scalar_Dbl(v_init); return result; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* * Make one target swap, optimizing five branches. * param tree : the tree to check * param tested_t_edge : the swaping t_edge of the tree * param swapToDo : 1 or 2, to select the first or the second swap to do */ void Make_Target_Swap(t_tree *tree, t_edge *b_fcus, int swaptodo) { t_node *v1,*v2,*v3,*v4; phydbl lktodo; phydbl lk_init, lk_temp; int i; if(swaptodo < 0) { PhyML_Fprintf(stderr,"\n== Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } //Initialization lk_init = tree->c_lnL; b_fcus->nni->score = .0; lktodo = UNLIKELY; v1 = v2 = v3 = v4 = NULL; v1 = b_fcus->left->v[b_fcus->l_v1]; v2 = b_fcus->left->v[b_fcus->l_v2]; v3 = b_fcus->rght->v[b_fcus->r_v1]; v4 = b_fcus->rght->v[b_fcus->r_v2]; if(v1->num < v2->num) { PhyML_Fprintf(stderr,"\n== Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } if(v3->num < v4->num) { PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } /***********/ //make the selected swap if(swaptodo==1) { Swap(v2,b_fcus->left,b_fcus->rght,v3,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) Swap(v3,b_fcus->left,b_fcus->rght,v2,tree); } else { Swap(v2,b_fcus->left,b_fcus->rght,v4,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) Swap(v4,b_fcus->left,b_fcus->rght,v2,tree); } MIXT_Set_Alias_Subpatt(YES,tree); Set_Both_Sides(YES,tree); lktodo = Update_Lk_At_Given_Edge(b_fcus,tree); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); MIXT_Set_Alias_Subpatt(NO,tree); //Optimize branch lengths and update likelihoods lk_temp = UNLIKELY; do { lktodo = lk_temp; for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) { Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->left->b[i]->l->v),b_fcus->left->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) { Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->rght->b[i]->l->v),b_fcus->rght->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->rght); if(lk_temp < lktodo - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n== Edge %3d lk_temp = %f lktodo = %f\n",b_fcus->num,lk_temp,lktodo); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } } while(FABS(lk_temp-lktodo) > tree->mod->s_opt->min_diff_lk_global); //until no significative improvement is detected /* PhyML_Printf("\n.<< [%3d] l=%f lk_init=%f tree->c_lnL=%f score=%12f v1=%3d v2=%3d v3=%3d v4=%3d >>", */ /* b_fcus->num, */ /* b_fcus->l->v, */ /* lk_init, */ /* tree->c_lnL, */ /* lk_init-tree->c_lnL, */ /* v1->num,v2->num,v3->num,v4->num); */ if(tree->c_lnL < lk_init - tree->mod->s_opt->min_diff_lk_global) { PhyML_Fprintf(stderr,"\n== [%3d] v1=%d v2=%d v3=%d v4=%d",b_fcus->num,v1->num,v2->num,v3->num,v4->num); PhyML_Fprintf(stderr,"\n== tree->c_lnL = %f lk_init = %f\n",tree->c_lnL,lk_init); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /** * Convert an aLRT statistic to a non-parametric support * param in: the statistic */ phydbl Statistics_To_Probabilities(phydbl in) { phydbl rough_value=0.0; phydbl a=0.0; phydbl b=0.0; phydbl fa=0.0; phydbl fb=0.0; if(in>=0.000000393 && in<0.00000157) { a=0.000000393; b=0.00000157; fa=0.0005; fb=0.001; } else if(in>=0.00000157 && in<0.0000393) { a=0.00000157; b=0.0000393; fa=0.001; fb=0.005; } else if(in>=0.0000393 && in<0.000157) { a=0.0000393; b=0.000157; fa=0.005; fb=0.01; } else if(in>=0.000157 && in<0.000982) { a=0.000157; b=0.000982; fa=0.01; fb=0.025; } else if(in>=0.000982 && in<0.00393) { a=0.000982; b=0.00393; fa=0.025; fb=0.05; } else if(in>=0.00393 && in<0.0158) { a=0.00393; b=0.0158; fa=0.05; fb=0.1; } else if(in>=0.0158 && in<0.0642) { a=0.0158; b=0.0642; fa=0.1; fb=0.2; } else if(in>=0.0642 && in<0.148) { a=0.0642; b=0.148; fa=0.2; fb=0.3; } else if(in>=0.148 && in<0.275) { a=0.148; b=0.275; fa=0.3; fb=0.4; } else if(in>=0.275 && in<0.455) { a=0.275; b=0.455; fa=0.4; fb=0.5; } else if(in>=0.455 && in<0.708) { a=0.455; b=0.708; fa=0.5; fb=0.6; } else if(in>=0.708 && in<1.074) { a=0.708; b=1.074; fa=0.6; fb=0.7; } else if(in>=1.074 && in<1.642) { a=1.074; b=1.642; fa=0.7; fb=0.8; } else if(in>=1.642 && in<2.706) { a=1.642; b=2.706; fa=0.8; fb=0.9; } else if(in>=2.706 && in<3.841) { a=2.706; b=3.841; fa=0.9; fb=0.95; } else if(in>=3.841 && in<5.024) { a=3.841; b=5.024; fa=0.95; fb=0.975; } else if(in>=5.024 && in<6.635) { a=5.024; b=6.635; fa=0.975; fb=0.99; } else if(in>=6.635 && in<7.879) { a=6.635; b=7.879; fa=0.99; fb=0.995; } else if(in>=7.879 && in<10.828) { a=7.879; b=10.828; fa=0.995; fb=0.999; } else if(in>=10.828 && in<12.116) { a=10.828; b=12.116; fa=0.999; fb=0.9995; } if (in>=12.116) { rough_value=0.9999; } else if(in<0.000000393) { rough_value=0.0001; } else { rough_value=(b-in)/(b-a)*fa + (in - a)/(b-a)*fb; } rough_value=rough_value+(1.0-rough_value)/2.0; rough_value=rough_value*rough_value*rough_value; return rough_value; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /** * deprecated * Compute a RELL support, using the latest tested branch * param tree: the tested tree */ phydbl Statistics_to_RELL(t_tree *tree) { int i; int occurence = 10000; phydbl nb = 0.0; phydbl res, *pi; int site; phydbl lk0 = 0.0; phydbl lk1 = 0.0; phydbl lk2 = 0.0; int position = -1; t_tree *buff_tree; int *samples; /*! 1000 times */ for (i = 0; i < occurence; i++) { lk0 = 0.0; lk1 = 0.0; lk2 = 0.0; /*! Shuffle the data and increment the support, if needed */ buff_tree = tree; do { pi = (phydbl *)mCalloc(tree->data->n_pattern, sizeof(phydbl)); for (site = 0; site < tree->data->n_pattern; site++) pi[site] = tree->data->wght[site] / (phydbl)tree->data->init_len; samples = Sample_n_i_With_Proba_pi(pi, tree->data->n_pattern, tree->data->init_len); for (site = 0; site < tree->data->init_len; ++site) { position = samples[site]; lk0 += tree->log_lks_aLRT[0][position]; lk1 += tree->log_lks_aLRT[1][position]; lk2 += tree->log_lks_aLRT[2][position]; } if (lk0 >= lk1 && lk0 >= lk2) nb++; tree = tree->next_mixt; Free(samples); Free(pi); } while (tree); tree = buff_tree; } res = nb / (phydbl)occurence; return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Compute a SH-like support, using the latest tested branch param tree: the tested tree */ phydbl Statistics_To_SH(t_tree *tree) { int i; int occurence=10000; phydbl nb=0.0; phydbl res; int site; phydbl lk0=0.0; phydbl lk1=0.0; phydbl lk2=0.0; phydbl c0=0.0; phydbl c1=0.0; phydbl c2=0.0; int position=-1; phydbl delta_local=-1.; phydbl delta=0.0; t_tree *buff_tree; phydbl *pi; int* samples; /*! Compute the total log-lk of each NNI position */ buff_tree = tree; do { For(site, tree->data->n_pattern) { c0+=tree->log_lks_aLRT[0][site] * tree->data->wght[site]; c1+=tree->log_lks_aLRT[1][site] * tree->data->wght[site]; c2+=tree->log_lks_aLRT[2][site] * tree->data->wght[site]; } tree = tree->next_mixt; } while(tree); tree = buff_tree; if (c0>=c1 && c0>=c2) { if (c1>=c2) { delta=c0-c1; } else { delta=c0-c2; } } else if(c1>=c0 && c1>=c2) { if (c0>=c2) { delta=c1-c0; } else { delta=c1-c2; } } else { if (c1>=c0) { delta=c2-c1; } else { delta=c2-c0; } } /*! 1000 times */ for(i=0;idata->n_pattern,sizeof(phydbl)); for(site=0;sitedata->n_pattern;site++) pi[site] = tree->data->wght[site] / (phydbl)tree->data->init_len; samples = Sample_n_i_With_Proba_pi(pi,tree->data->n_pattern,tree->data->init_len); /*! Shuffle the data */ For(site, tree->data->init_len) { position = samples[site]; lk0+=tree->log_lks_aLRT[0][position]; lk1+=tree->log_lks_aLRT[1][position]; lk2+=tree->log_lks_aLRT[2][position]; } tree = tree->next_mixt; Free(samples); Free(pi); } while(tree); tree = buff_tree; /*! return to null hypothesis */ lk0=lk0-c0; lk1=lk1-c1; lk2=lk2-c2; /*! compute results and increment if needed */ delta_local=0.0; if (lk0>=lk1 && lk0>=lk2) { if (lk1>=lk2) { delta_local=lk0-lk1; } else { delta_local=lk0-lk2; } } else if(lk1>=lk0 && lk1>=lk2) { if (lk0>=lk2) { delta_local=lk1-lk0; } else { delta_local=lk1-lk2; } } else { if (lk1>=lk0) { delta_local=lk2-lk1; } else { delta_local=lk2-lk0; } } if (delta>(delta_local+0.1)) { nb++; } } res= nb/occurence; return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /** * deprecated * Compute one side likelihood * param b_fcus : concerned edge * param tree : b_fcus tree * param exclude : side to exclude for computation */ phydbl Update_Lk_At_Given_Edge_Excluding(t_edge *b_fcus, t_tree *tree, t_node *exclude) { if((!b_fcus->left->tax) && (exclude == NULL || exclude != b_fcus->left)) Update_Partial_Lk(tree,b_fcus,b_fcus->left); if((!b_fcus->rght->tax) && (exclude == NULL || exclude != b_fcus->rght)) Update_Partial_Lk(tree,b_fcus,b_fcus->rght); tree->c_lnL = Lk(b_fcus,tree); return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/alrt.h000066400000000000000000000016631501136442400203120ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef ALRT_H #define ALRT_H #include "utilities.h" #include "lk.h" #include "optimiz.h" #include "models.h" #include "free.h" #include "simu.h" void aLRT(t_tree *tree); int Check_NNI_Five_Branches(t_tree *tree); int Compute_Likelihood_Ratio_Test(t_edge *tested_edge, t_tree *tree); int NNI_Neigh_BL(t_edge *b_fcus, t_tree *tree); void Make_Target_Swap(t_tree *tree, t_edge *b_fcus, int swaptodo); phydbl Statistics_To_Probabilities(phydbl in); phydbl Statistics_To_RELL(t_tree *tree); phydbl Statistics_To_SH(t_tree *tree); phydbl Update_Lk_At_Given_Edge_Excluding(t_edge *b_fcus, t_tree *tree, t_node *exclude); #endif stephaneguindon-phyml-76a39c8/src/ancestral.c000066400000000000000000001060431501136442400213150ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "ancestral.h" void Sample_Ancestral_Seq(int fullmutmap, int fromprior, t_tree *tree) { int rate_cat; int i,j,k,l; phydbl *probs; phydbl sum; int n_mut; FILE *fp; phydbl *muttime; int *muttype,*muttax; char *s,*mut_string; int *ordering; if(tree->is_mixt_tree == YES) { MIXT_Sample_Ancestral_Seq(fullmutmap,fromprior,tree); return; } probs = (phydbl *)mCalloc(tree->mod->ras->n_catg,sizeof(phydbl)); muttime = (phydbl *)mCalloc((2*tree->n_otu-3)*5, // At most 5 mutations per branch on average sizeof(phydbl)); muttype = (int *)mCalloc((2*tree->n_otu-3)*5, // At most 5 mutations per branch on average sizeof(int)); muttax = (int *)mCalloc((2*tree->n_otu-3)*5, // At most 5 mutations per branch on average sizeof(int)); ordering = (int *)mCalloc((2*tree->n_otu-3)*5, // At most 5 mutations per branch on average sizeof(int)); s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO) { tree->a_nodes[i]->c_seq_anc = (align *)mCalloc(1,sizeof(align));; tree->a_nodes[i]->c_seq_anc->state = (char *)mCalloc(tree->data->n_pattern,sizeof(char)); } /* Update P(D_x|X=i) for each state i and node X */ Set_Both_Sides(YES,tree); Lk(NULL,tree); for(i=0;idata->n_pattern;++i) { /* Sample the rate class from its posterior density */ for(j=0;jmod->ras->n_catg;j++) { if(fromprior == NO) probs[j] = tree->unscaled_site_lk_cat[i*tree->mod->ras->n_catg+j]* tree->mod->ras->gamma_r_proba->v[j]; else probs[j] = tree->mod->ras->gamma_r_proba->v[j]; } /* Scale probas. */ sum = .0; for(j=0;jmod->ras->n_catg;j++) sum += probs[j]; for(j=0;jmod->ras->n_catg;j++) probs[j]/=sum; rate_cat = Sample_i_With_Proba_pi(probs,tree->mod->ras->n_catg); n_mut = 0; if(tree->n_root != NULL) { Sample_Ancestral_Seq_Pre(tree->n_root,tree->n_root->v[1],tree->n_root->b[1], i,rate_cat, muttype,muttime,muttax,&n_mut, fullmutmap,fromprior,tree); Sample_Ancestral_Seq_Pre(tree->n_root,tree->n_root->v[2],tree->n_root->b[2], i,rate_cat, muttype,muttime,muttax,&n_mut, fullmutmap,fromprior,tree); } else { Sample_Ancestral_Seq_Pre(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree->a_nodes[0]->b[0], i,rate_cat, muttype,muttime,muttax,&n_mut, fullmutmap,fromprior,tree); } for(j=0;j muttime[j]) ordering[k]++; else ordering[j]++; } } strcpy(s,"mutmap."); sprintf(s+strlen(s),"%d.",tree->io->r_seed); sprintf(s+strlen(s),"%d",i); fp = fopen(s,"a"); PhyML_Fprintf(fp,"\n-1 -1 -1.0 -1 %d",tree->mixt_tree ? tree->mixt_tree->mcmc->run : tree->mcmc->run); Reverse_Muttime(muttime,n_mut,tree); for(j=0;jdata->init_len;l++) if(tree->data->sitepatt[l] == i) break; mut_string = Mutation_Id(muttype[k],tree); PhyML_Fprintf(fp,"\n%4d %s %g %4d %s",j,mut_string,muttime[k],l,tree->a_nodes[muttax[k]]->name); Free(mut_string); break; } } } for(j=0;j> a: %d d: %d b->left: %d b->rght: %d",a?a->num:-1,d?d->num:-1,b?b->left->num:-1,b?b->rght->num:-1); */ ns = tree->mod->ns; probs = (phydbl *)mCalloc(ns,sizeof(phydbl)); if(a->tax == TRUE) // Sample state at tip if observed state is ambiguous { assert(b); if(a == b->left) for(i=0;ip_lk_tip_l[site*ns+i]; else for(i=0;ip_lk_tip_r[site*ns+i]; for(i=0;imod->e_frq->pi->v[i]; sum = 0.0; for(i=0;in_root) { sa = Sample_Ancestral_Seq_Core(NULL,tree->n_root,NULL,r_cat,site,tree); } else { sa = Assign_State(a->c_seq_anc->state + site, tree->mod->io->datatype, tree->mod->io->state_len); } sd = Sample_Ancestral_Seq_Core(a,d,b,r_cat,site,tree); if(fullmutmap == YES) Map_Mutations(a,d,sa,sd,b,site,r_cat,muttype,muttime,muttax,n_mut,tree); if(d->tax) return; else { for(i=0;i<3;++i) { if(d->v[i] != a && d->b[i] != tree->e_root) { Sample_Ancestral_Seq_Pre(d,d->v[i],d->b[i],site,r_cat,muttype,muttime,muttax,n_mut,fullmutmap,fromprior,tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Sample_Ancestral_Seq_Core(t_node *a, t_node *d, t_edge *b, int r_cat, int site, t_tree *tree) { int i,j; int ns; ns = tree->mod->ns; int dim1 = tree->mod->ras->n_catg * ns; int dim2 = ns; int dim3 = ns * ns; phydbl *probs,*Pij,sum; int state; probs = (phydbl *)mCalloc(ns,sizeof(phydbl)); state = -1; if(d->tax == YES) { assert(b); if(d == b->left) for(i=0;ip_lk_tip_l[site*ns+i]; else if(d == b->rght) for(i=0;ip_lk_tip_r[site*ns+i]; else assert(FALSE); for(i=0;imod->e_frq->pi->v[i]; sum = 0.0; for(i=0;in_root); phydbl r,l; Update_PMat_At_Given_Edge(tree->n_root->b[1],tree); Update_PMat_At_Given_Edge(tree->n_root->b[2],tree); for(i=0;ie_root->left == tree->n_root->v[1]) Pij = tree->n_root->b[1]->Pij_rr; else Pij = tree->n_root->b[2]->Pij_rr; l = 0.0; for(j=0;je_root->left->tax == NO) l += tree->e_root->p_lk_left[site*dim1+r_cat*dim2+j] * Pij[r_cat*dim3+i*dim2+j]; else l += tree->e_root->p_lk_tip_l[site*dim2+j] * Pij[r_cat*dim3+i*dim2+j]; } if(tree->e_root->rght == tree->n_root->v[1]) Pij = tree->n_root->b[1]->Pij_rr; else Pij = tree->n_root->b[2]->Pij_rr; r = 0.0; for(j=0;je_root->rght->tax == NO) r += tree->e_root->p_lk_rght[site*dim1+r_cat*dim2+j] * Pij[r_cat*dim3+i*dim2+j]; else r += tree->e_root->p_lk_tip_r[site*dim2+j] * Pij[r_cat*dim3+i*dim2+j]; } probs[i] = r*l*tree->mod->e_frq->pi->v[i]; } sum = 0.0; for(i=0;ic_seq_anc->state[site] = Reciproc_Assign_State(state,tree->io->datatype); } else { assert(b); // State (already) sampled at node a state = Assign_State(a->c_seq_anc->state + site, tree->mod->io->datatype, tree->mod->io->state_len); Pij = b->Pij_rr; for(i=0;ileft) probs[i] = b->p_lk_left[site*dim1+r_cat*dim2+i] * Pij[r_cat*dim3+state*dim2+i]; else if(d == b->rght) probs[i] = b->p_lk_rght[site*dim1+r_cat*dim2+i] * Pij[r_cat*dim3+state*dim2+i]; else assert(FALSE); } sum = 0.0; for(i=0;ic_seq_anc->state[site] = Reciproc_Assign_State(state,tree->io->datatype); } } Free(probs); return state; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Map_Mutations(t_node *a, t_node *d, int sa, int sd, t_edge *b, int site, int rcat, int *muttype, phydbl *muttime, int *muttax, int *n_mut, t_tree *tree) { int i,j; phydbl *probs,*all_probs; int slast,snew; // Last state visited phydbl tlast; phydbl *Q; phydbl u,sum; int *mut; // Array of mutations int thismut; int n_mut_branch; int n_iter; int first_mut; phydbl T; int ns,tax_idx; phydbl rr; ns = tree->mod->ns; all_probs = (phydbl *)mCalloc(ns*ns,sizeof(phydbl)); mut = (int *)mCalloc(ns*ns,sizeof(int)); // Site relative rate rr = tree->mod->ras->gamma_rr->v[rcat]; // Rate matrix Q = tree->mod->r_mat->qmat->v; // Length of the 'time' interval considered. T = 0.0; #ifdef PHYTIME T = tree->rates->cur_l[d->num]*rr; #else T = b->l->v*rr; #endif /* PhyML_Printf("\n. Mutmap: a:%d d:%d ta:%G td:%G cr:%G rr:%G l:%G", */ /* a?a->num:-1,d?d->num:-1, */ /* tree->times->nd_t[a->num], */ /* tree->times->nd_t[d->num], */ /* cr,rr, */ /* fabs(tree->times->nd_t[a->num]-tree->times->nd_t[d->num])*cr*rr); */ // Matrix of change probabilities for(i=0;ii)=0.0; all_probs[i*ns+i] = 0.0; // Normalise so that \sum_j p(i->j) = 1.0; sum = 0; for(j=0;j sample a new mutation event if(tlast < T) { first_mut = NO; n_mut_branch++; if(n_mut_branch > 5 && n_mut_branch%10 == 0) PhyML_Printf("\n. # of mutations on edge %d (length: %g) exceeds 5 (%d) ! The program will probably crash soon...:(", b->num, tree->rates ? tree->rates->cur_l[d->num] : b->l->v, n_mut_branch); snew = Sample_i_With_Proba_pi(probs,ns); // Record mutation type mut[slast*ns+snew]++; // Record mutation type in the site mutation array thismut = slast*ns+snew; muttype[(*n_mut)+n_mut_branch-1] = thismut; // Record time of mutation muttime[(*n_mut)+n_mut_branch-1] = tlast; #ifdef PHYTIME // Transform into time in calendar units muttime[(*n_mut)+n_mut_branch-1] /= tree->rates->cur_l[d->num]; muttime[(*n_mut)+n_mut_branch-1] *= fabs(tree->times->nd_t[a->num]-tree->times->nd_t[d->num]); #endif tax_idx = -1; Random_Tax_Idx(a,d,&tax_idx,tree); muttax[(*n_mut)+n_mut_branch-1] = tax_idx; // Update the last state slast = snew; } else { if(slast == sd) break; else { // Restart from the beginning for(i=0;i 0) */ /* { */ /* thismut = MIN(i,j) * ns + MAX(i,j) - (MIN(i,j)+1+(int)POW(MIN(i,j)+1,2))/2; */ /* if(tree->mixt_tree != NULL) */ /* tree->mixt_tree->mutmap[thismut*(tree->n_pattern)*(2*tree->n_otu-3) + b->num*(tree->n_pattern) + site]++; */ /* else */ /* tree->mutmap[thismut*(tree->n_pattern)*(2*tree->n_otu-3) + b->num*(tree->n_pattern) + site]++; */ /* } */ /* } */ /* } */ Free(all_probs); Free(mut); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Ancestral_Sequences(t_tree *tree, int print) { int i; if(print == YES) { PhyML_Printf("\n\n. Estimating ancestral sequences..."); strcpy(tree->io->out_ancestral_seq_file,tree->io->out_file); strcat(tree->io->out_ancestral_seq_file,"_phyml_ancestral_"); if(tree->io->append_run_ID) { strcat(tree->io->out_ancestral_seq_file,tree->io->run_id_string); strcat(tree->io->out_ancestral_seq_file,"_"); } strcat(tree->io->out_ancestral_seq_file,"seq.txt"); tree->io->fp_out_ancestral_seq = Openfile(tree->io->out_ancestral_seq_file,1); strcpy(tree->io->out_ancestral_tree_file,tree->io->out_file); strcat(tree->io->out_ancestral_tree_file,"_phyml_ancestral_"); if(tree->io->append_run_ID) { strcat(tree->io->out_ancestral_tree_file,tree->io->run_id_string); strcat(tree->io->out_ancestral_tree_file,"_"); } strcat(tree->io->out_ancestral_tree_file,"tree.txt"); tree->io->fp_out_ancestral_tree = Openfile(tree->io->out_ancestral_tree_file,1); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n\n\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Printing marginal probabilities of ancestral sequences at each site"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. of the alignment and each node of the tree. The tree in Newick format"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. with internal nodes labels corresponding to those given below can be"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. found in the file '%s'.",tree->io->out_ancestral_tree_file); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Ancestral reconstruction is conducted based on the \"Minimum Posterior Expected"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Error\" (MPEE) criterion, which accomodates for uncertainty in the selection of "); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. ancestral character states."); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Recommended citation:"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Oliva A., Pulicani S., Lefort V., Brehelin L., Gascuel O. and S. Guindon,"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. \"Accounting for ambiguity in ancestral sequence reconstruction\","); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Bioinformatics, Volume 35, Issue 21, 1 November 2019."); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"Site\tNodeLabel\t"); for(i=0;imod->ns;i++) PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"%10c\t",Reciproc_Assign_State(i,tree->io->datatype)); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"MPEE\t"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); short int bck_support = tree->io->print_support_val; tree->io->print_node_num = YES; tree->io->print_support_val = NO; char *s = Write_Tree(tree); PhyML_Fprintf(tree->io->fp_out_ancestral_tree,"%s",s); tree->io->print_node_num = NO; tree->io->print_support_val = bck_support; Free(s); fclose(tree->io->fp_out_ancestral_tree); } for(i=0;i<2*tree->n_otu-2;i++) if(tree->a_nodes[i]->tax == NO) Ancestral_Sequences_One_Node(tree->a_nodes[i],tree,print); if(tree->n_root) Ancestral_Sequences_One_Node(tree->n_root,tree,print); fclose(tree->io->fp_out_ancestral_seq); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Ancestral_Sequences_One_Node(t_node *d, t_tree *tree, int print) { if(d->tax) return; else { if(tree->is_mixt_tree) { MIXT_Ancestral_Sequences_One_Node(d,tree,print); } else { t_node *v0,*v1,*v2; // three neighbours of d t_edge *b0,*b1,*b2; int i,j; int catg; phydbl p0, p1, p2; phydbl *p; int site,csite; phydbl *p_lk0, *p_lk1, *p_lk2; int *sum_scale0, *sum_scale1, *sum_scale2; phydbl sum_probas; phydbl *Pij0, *Pij1, *Pij2; phydbl inc,sum_scale; FILE *fp; unsigned const int ncatg = tree->mod->ras->n_catg; unsigned const int ns = tree->mod->ns; unsigned const int nsns = ns*ns; unsigned const int ncatgns = ns*ncatg; if(tree->scaling_method == SCALE_RATE_SPECIFIC) { PhyML_Fprintf(stderr,"\n. Likelihood rescaling method not compatible with the calculation of ancestral state probabilities."); Exit("\n"); } if(!d) return; fp = tree->io->fp_out_ancestral_seq; assert(fp != NULL); p = (phydbl *)mCalloc(ns,sizeof(phydbl)); for(site=0;sitedata->init_len;site++) // For each site in the current partition element { csite = tree->data->sitepatt[site]; for(i=0;iv[0]; v1 = d->v[1]; v2 = d->v[2]; b0 = d->b[0]; b1 = d->b[1]; b2 = d->b[2]; Pij0 = b0->Pij_rr; Pij1 = b1->Pij_rr; Pij2 = b2->Pij_rr; sum_scale = 0.0; if(v0 == b0->left) { p_lk0 = b0->p_lk_left; sum_scale0 = b0->sum_scale_left; } else { p_lk0 = b0->p_lk_rght; sum_scale0 = b0->sum_scale_rght; } if(v1 == b1->left) { p_lk1 = b1->p_lk_left; sum_scale1 = b1->sum_scale_left; } else { p_lk1 = b1->p_lk_rght; sum_scale1 = b1->sum_scale_rght; } if(v2 == b2->left) { p_lk2 = b2->p_lk_left; sum_scale2 = b2->sum_scale_left; } else { p_lk2 = b2->p_lk_rght; sum_scale2 = b2->sum_scale_rght; } for(catg=0;catgtax) { for(j=0;jb[0]->p_lk_tip_r[csite*ns+j] * Pij0[catg*nsns+i*ns+j]; if(isinf(p0) || isnan(p0)) { PhyML_Fprintf(stderr,"\n. p0: %G v0->b[0]->p_lk_tip_r[csite*ns+j]: %G Pij0[catg*nsns+i*ns+j]: %G\n", p0, v0->b[0]->p_lk_tip_r[csite*ns+j], Pij0[catg*nsns+i*ns+j]); Exit("\n"); } } } else { for(j=0;jtax) { for(j=0;jb[0]->p_lk_tip_r[csite*ns+j] * Pij1[catg*nsns+i*ns+j]; if(isinf(p1) || isnan(p1)) { PhyML_Fprintf(stderr,"\n. p1: %G v1->b[0]->p_lk_tip_r[csite*ns+j]: %G Pij1[catg*nsns+i*ns+j]: %G\n", p1, v1->b[0]->p_lk_tip_r[csite*ns+j], Pij1[catg*nsns+i*ns+j]); Exit("\n"); } } } else { for(j=0;jtax) { for(j=0;jb[0]->p_lk_tip_r[csite*ns+j] * Pij2[catg*nsns+i*ns+j]; } } else { for(j=0;jmod->e_frq->pi->v[i] * tree->mod->ras->gamma_r_proba->v[catg]; p[i] += inc; if(isinf(p[i]) || isnan(p[i])) { PhyML_Fprintf(stderr,"\n. site: %4d p0: %G p1: %G p2: %G tree->mod->e_frq->pi->v[i]: %G tree->cur_site_lk[csite]: %G tree->mod->ras->gamma_r_proba->v[catg]: %G tree->c_lnL_sorted[csite]: %G", csite, p0,p1,p2, tree->mod->e_frq->pi->v[i] , tree->cur_site_lk[csite] , tree->mod->ras->gamma_r_proba->v[catg], tree->c_lnL_sorted[csite]); Exit("\n"); } } /* printf("\n. site: %d || %d %d %d", */ /* csite, */ /* v0->tax ? -1 : sum_scale0[csite*ncatg+catg], */ /* v1->tax ? -1 : sum_scale1[csite*ncatg+catg], */ /* v2->tax ? -1 : sum_scale2[csite*ncatg+catg]); */ } if(tree->mod->ras->invar == YES) { int num_prec_issue = NO; phydbl inv_site_lk = Invariant_Lk(sum_scale,csite,&num_prec_issue,tree); switch(num_prec_issue) { case YES : { assert(isinf(inv_site_lk)); inv_site_lk = Invariant_Lk(0,csite,&num_prec_issue,tree); for(i=0;imod->ras->pinvar->v * tree->mod->e_frq->pi->v[i]; break; } case NO : { for(i=0;imod->ras->pinvar->v) + inv_site_lk * tree->mod->ras->pinvar->v * tree->mod->e_frq->pi->v[i]; break; } } } for(i=0;ic_lnL_sorted[csite]; for(i=0;inum); for(i=0;i highest_count) { highest_count = count[i]; highest_count_idx = i; } } most_frequent_state = best_state[highest_count_idx]; Free(alpha); Free(best_state); Free(idx); Free(count); return(most_frequent_state); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int MPEE_Score(const phydbl *alpha, int *idx, const phydbl *p, const int ns) { unsigned int i; phydbl *mpee_score,*cdf_sorted; int min_idx,res; phydbl a,b; phydbl min; mpee_score = (phydbl *)mCalloc(ns,sizeof(phydbl)); cdf_sorted = (phydbl *)mCalloc(ns,sizeof(phydbl)); cdf_sorted[0] = p[idx[0]]; for(i=1;i #ifndef ANCESTRAL_H #define ANCESTRAL_H #include "utilities.h" void Sample_Ancestral_Seq(int fullmutmap, int fromprior, t_tree *tree); void Sample_Ancestral_Seq_Pre(t_node *a, t_node *d, t_edge *b, int site, int r_cat, int *muttype, phydbl *muttime, int *muttax, int *n_mut, int fullmutmap, int fromprior, t_tree *tree); int Sample_Ancestral_Seq_Core(t_node *a, t_node *d, t_edge *b, int r_cat, int site, t_tree *tree); void Map_Mutations(t_node *a, t_node *d, int sa, int sd, t_edge *b, int site, int rcat, int *muttype, phydbl *muttime, int *muttax, int *n_mut, t_tree *tree); void Ancestral_Sequences(t_tree *tree, int print); void Ancestral_Sequences_One_Node(t_node *d, t_tree *tree, int print); int MPEE_Score(const phydbl *alpha, int *idx, const phydbl *p, const int ns); int MPEE_Infer(const phydbl *p, const int ns); void Reverse_Muttime(phydbl *muttime, int n_mut, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/avx.c000066400000000000000000000502241501136442400201360ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "assert.h" #include "avx.h" #if ((defined(__AVX__) || defined(__AVX2__)) && !defined(DISABLE_NATIVE)) ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void AVX_Update_Eigen_Lr(t_edge *b, t_tree *tree) { unsigned int site,catg; unsigned int i,j; unsigned const int npattern = tree->data->n_pattern; unsigned const int ncatg = tree->mod->ras->n_catg; unsigned const int ns = tree->mod->ns; unsigned const int sz = (int)BYTE_ALIGN / 8; unsigned const int nblocks = ns / sz; unsigned const int ncatgns = ncatg*ns; const phydbl *p_lk_left,*p_lk_rght,*pi; phydbl *dot_prod,*p_lk_left_pi; phydbl *l_ev,*r_ev; __m256d *_l_ev,*_r_ev,*_prod_left,*_prod_rght; p_lk_left_pi = tree->p_lk_left_pi; l_ev = tree->l_ev; _l_ev = tree->_l_ev; _r_ev = tree->_r_ev; _prod_left = tree->_prod_left; _prod_rght = tree->_prod_rght; assert(sz == 4); assert(tree->update_eigen_lr == YES); r_ev = tree->mod->eigen->r_e_vect; /* Copy transpose of matrix of left eigen vectors */ for(i=0;imod->eigen->l_e_vect[j*ns+i]; /* Load into AVX registers */ for(i=0;ileft->tax ? b->p_lk_tip_l : b->p_lk_left; p_lk_rght = b->rght->tax ? b->p_lk_tip_r : b->p_lk_rght; pi = tree->mod->e_frq->pi->v; dot_prod = tree->dot_prod; for(site=0;sitedata->wght[site] > SMALL) { for(catg=0;catgleft->tax == NO) p_lk_left += ns; if(b->rght->tax == NO) p_lk_rght += ns; } if(b->left->tax == YES) p_lk_left += ns; if(b->rght->tax == YES) p_lk_rght += ns; } else { if(b->left->tax == YES) p_lk_left += ns; else p_lk_left += ncatgns; if(b->rght->tax == YES) p_lk_rght += ns; else p_lk_rght += ncatgns; dot_prod += ncatgns; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl AVX_Lk_Core_One_Class_No_Eigen_Lr(const phydbl *p_lk_left, const phydbl *p_lk_rght, const phydbl *Pij, const phydbl *tPij, const phydbl *pi, const int ns, const int ambiguity_check, const int observed_state) { const unsigned int sz = (int)BYTE_ALIGN / 8; const unsigned nblocks = ns/sz; if(nblocks == 1) { __m256d _plk_r,_plk_l; if(ambiguity_check == NO) // tip case. { Pij += observed_state*ns; _plk_r = _mm256_mul_pd(_mm256_load_pd(Pij),_mm256_load_pd(p_lk_left)); return pi[observed_state] * AVX_Vect_Norm(_plk_r); } else { unsigned int i; __m256d _pijplk,_pij; _plk_r = _mm256_mul_pd(_mm256_load_pd(p_lk_rght),_mm256_load_pd(pi)); _pijplk = _mm256_setzero_pd(); for(i=0;idata->n_pattern; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int ncatgns = ncatg * ns; const unsigned int nsns = ns * ns; const unsigned int sz = (int)BYTE_ALIGN / 8; const unsigned nblocks = ns/sz; __m256d *_tPij1,*_tPij2,*_pmat1plk1,*_pmat2plk2,*_plk0; _tPij1 = tree->_tPij1; _tPij2 = tree->_tPij2; _pmat1plk1 = tree->_pmat1plk1; _pmat2plk2 = tree->_pmat2plk2; _plk0 = tree->_plk0; sum_scale_v1_val = 0; sum_scale_v2_val = 0; n_v1 = n_v2 = NULL; plk0 = plk1 = plk2 = NULL; Pij1 = Pij2 = NULL; tPij1 = tPij2 = NULL; sum_scale_v1 = sum_scale_v2 = NULL; p_lk_loc = NULL; state_v1 = state_v2 = -1; Set_All_Partial_Lk(&n_v1,&n_v2, &plk0,&sum_scale,&p_lk_loc, &Pij1,&tPij1,&plk1,&sum_scale_v1, &Pij2,&tPij2,&plk2,&sum_scale_v2, d,b,tree); /* PhyML_Printf("\n. b: %d b->left:%d b->rght:%d d:%d [%p,%p]", */ /* b->num, */ /* b->left->num, */ /* b->rght->num, */ /* d->num, */ /* plk0, */ /* b->p_lk_rght); */ // Copy transpose of transition matrices into AVX registers for(i=0;imod->augmented == YES) { PhyML_Printf("\n== AVX version of the Update_Partial_Lk function does not"); PhyML_Printf("\n== allow augmented data."); assert(FALSE); } /* For every site in the alignment */ for(site=0;sitedata->wght[site] > SMALL) { state_v1 = state_v2 = -1; ambiguity_check_v1 = ambiguity_check_v2 = YES; if(n_v1 && n_v1->tax) { ambiguity_check_v1 = n_v1->c_seq->is_ambigu[site]; if(ambiguity_check_v1 == NO) state_v1 = n_v1->c_seq->d_state[site]; } if(n_v2 && n_v2->tax) { ambiguity_check_v2 = n_v2->c_seq->is_ambigu[site]; if(ambiguity_check_v2 == NO) state_v2 = n_v2->c_seq->d_state[site]; } for(catg=0;catgtax) ? 0 : ns; plk2 += (n_v2->tax) ? 0 : ns; } _tPij1 -= ncatg * nsns / sz; _tPij2 -= ncatg * nsns / sz; plk1 += (n_v1->tax) ? ns : 0; plk2 += (n_v2->tax) ? ns : 0; if(tree->scaling_method == SCALE_FAST) { sum_scale_v1_val = (sum_scale_v1)?(sum_scale_v1[site]):(0); sum_scale_v2_val = (sum_scale_v2)?(sum_scale_v2[site]):(0); sum_scale[site] = sum_scale_v1_val + sum_scale_v2_val; if(sum_scale[site] >= 1024) { /* plk0 -= ncatgns; */ /* plk1 -= (n_v1->tax) ? ns : ncatgns; */ /* plk2 -= (n_v2->tax) ? ns : ncatgns; */ /* PhyML_Fprintf(stderr,"\n. PARTIAL site: %d plk0: %p [%g %g %g %g] plk1: %p [%g %g %g %g] plk2: %p [%g %g %g %g]", */ /* site, */ /* plk0, */ /* plk0[0], */ /* plk0[1], */ /* plk0[2], */ /* plk0[3], */ /* plk1, */ /* plk1[0], */ /* plk1[1], */ /* plk1[2], */ /* plk1[3], */ /* plk2, */ /* plk2[0], */ /* plk2[1], */ /* plk2[2], */ /* plk2[3] */ /* ); */ /* PhyML_Fprintf(stderr,"\n. PARTIAL site: %d d: %d n_v1: %d n_v2: %d",site,d->num,n_v1->num,n_v2->num); */ /* PhyML_Fprintf(stderr,"\n. PARTIAL site: %d sum n: %d sum n_v1: %d sum n_v2: %d",site,sum_scale[site],sum_scale_v1_val,sum_scale_v2_val); */ /* plk0 += ncatgns; */ /* plk1 += (n_v1->tax) ? ns : ncatgns; */ /* plk2 += (n_v2->tax) ? ns : ncatgns; */ /* Exit("\n"); */ } plk0 -= ncatgns; largest_p_lk = -BIG; for(i=0;i largest_p_lk) largest_p_lk = plk0[i]; if(largest_p_lk < INV_TWO_TO_THE_LARGE && tree->mod->augmented == NO && tree->apply_lk_scaling == YES) { for(i=0;itax) ? ns : ncatgns; plk2 += (n_v2->tax) ? ns : ncatgns; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void AVX_Partial_Lk_Exex(const __m256d *_tPij1, const int state1, const __m256d *_tPij2, const int state2, const int ns, __m256d *plk0) { unsigned const int sz = (int)BYTE_ALIGN / 8; unsigned const int nblocks = ns / sz; unsigned int i; _tPij1 = _tPij1 + state1 * nblocks; _tPij2 = _tPij2 + state2 * nblocks; for(i=0;i plk0: %f",x[i]); */ /* _mm256_store_pd(x,_tPij1[0]); */ /* for(int i=0;i<4;++i) PhyML_Printf("\n> Pij1: %f",x[i]); */ /* _mm256_store_pd(x,_tPij2[0]); */ /* for(int i=0;i<4;++i) PhyML_Printf("\n> Pij2: %f",x[i]); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void AVX_Partial_Lk_Exin(const __m256d *_tPij1, const int state1, const __m256d *_tPij2, const phydbl *_plk2, __m256d *_pmat2plk2, const int ns, __m256d *_plk0) { unsigned const int sz = (int)BYTE_ALIGN / 8; unsigned const int nblocks = ns / sz; unsigned int i; _tPij1 = _tPij1 + state1 * nblocks; AVX_Matrix_Vect_Prod(_tPij2,_plk2,ns,_pmat2plk2); for(i=0;i 1.0 || plk1[i] < 1.0 || plk2[i] > 1.0 || plk2[i] < 1.0) break; if(i != ns) { AVX_Matrix_Vect_Prod(_tPij1,plk1,ns,_pmat1plk1); AVX_Matrix_Vect_Prod(_tPij2,plk2,ns,_pmat2plk2); for(i=0;i #ifndef AVX_H #define AVX_H #include "utilities.h" #include "optimiz.h" #include "models.h" #include "free.h" #include "times.h" #include "mixt.h" #if (defined(__AVX__) || defined(__AVX2__)) void AVX_Update_Partial_Lk(t_tree *tree,t_edge *b_fcus,t_node *n); void AVX_Update_Eigen_Lr(t_edge *b, t_tree *tree); phydbl AVX_Lk_Core_One_Class_Eigen_Lr(const phydbl *dot_prod, const phydbl *expl, const unsigned int ns); void AVX_Lk_dLk_Core_One_Class_Eigen_Lr(const phydbl *dot_prod, const phydbl *expl, const unsigned int ns, phydbl *lk, phydbl *dlk); phydbl AVX_Lk_Core_One_Class_No_Eigen_Lr(const phydbl *p_lk_left, const phydbl *p_lk_rght, const phydbl *Pij, const phydbl *tPij, const phydbl *pi, const int ns, const int ambiguity_check, const int observed_state); phydbl AVX_Vect_Norm(__m256d _z); phydbl AVX_Lk_Core(int state, int ambiguity_check, t_edge *b, t_tree *tree); phydbl AVX_Lk_Core_Nucl(int state, int ambiguity_check, t_edge *b, t_tree *tree); phydbl AVX_Lk_Core_AA(int state, int ambiguity_check, t_edge *b, t_tree *tree); void AVX_Partial_Lk_Exex(const __m256d *_tPij1, const int state1, const __m256d *_tPij2, const int state2, const int ns, __m256d *plk0); void AVX_Partial_Lk_Exin(const __m256d *_tPij1, const int state1, const __m256d *_tPij2, const phydbl *_plk2, __m256d *_pmat2plk2, const int ns, __m256d *_plk0); void AVX_Partial_Lk_Inin(const __m256d *_tPij1, const phydbl *plk1, __m256d *_pmat1plk1, const __m256d *_tPij2, const phydbl *plk2, __m256d *_pmat2plk2, const int ns, __m256d *_plk0); void AVX_Matrix_Vect_Prod(const __m256d *_m_transpose, const phydbl *_v, const int ns, __m256d *res); __m256d AVX_Horizontal_Add(const __m256d x[4]); phydbl AVX_Lk_Core_One_Class_No_Eigen_Lr_Block(const phydbl *p_lk_left, const phydbl *p_lk_rght, const phydbl *Pij, const phydbl *tPij, const phydbl *pi, const int ns, const int ambiguity_check, const int observed_state); phydbl AVX_Lk_Core_One_Class_No_Eigen_Lr_No_Block(const phydbl *p_lk_left, const phydbl *p_lk_rght, const phydbl *Pij, const phydbl *tPij, const phydbl *pi, const int ns, const int ambiguity_check, const int observed_state); #endif #endif stephaneguindon-phyml-76a39c8/src/beagle_utils.c000066400000000000000000000416571501136442400220110ustar00rootroot00000000000000/* * author: Imran Fanaswala */ #ifndef BEAGLE_UTILS_CPP #define BEAGLE_UTILS_CPP #include #include "beagle_utils.h" #define CLEAN_BEAGLE_API /* Attempting to remove unnecessary communication with BEAGLE device */ double* int_to_double(const int* src, int num_elems) { double* dest = (double*)malloc(num_elems*sizeof(double)); if (NULL==dest) Warn_And_Exit("\n. Couldn't allocate memory.\n"); int i; for(i=0; ilength; i++) { fprintf(stdout, "\t\tResource %i:\n\t\tName : %s\n", i, rList->list[i].name); fprintf(stdout, "\t\t\tDesc : %s\n", rList->list[i].description); fprintf(stdout, "\t\t\tFlags:"); print_beagle_flags(rList->list[i].supportFlags); fprintf(stdout, "\n"); } fflush(stdout); } void print_beagle_instance_details(BeagleInstanceDetails *inst) { int rNumber = inst->resourceNumber; fprintf(stdout, "\tUsing resource %i:\n", rNumber); fprintf(stdout, "\t\tRsrc Name : %s\n", inst->resourceName); fprintf(stdout, "\t\tImpl Name : %s\n", inst->implName); fprintf(stdout, "\t\tImpl Desc : %s\n", inst->implDescription); fprintf(stdout, "\t\tFlags:"); fflush(stdout); print_beagle_flags(inst->flags); fflush(stdout); } int create_beagle_instance(t_tree *tree, int quiet, option* io) { if(UNINITIALIZED != tree->b_inst){ // fprintf(stdout,"\n\tWARNING: Creating a BEAGLE instance on a tree with an existing BEAGLE instance:%d\n",tree->b_inst); } if(!quiet){ // print_beagle_resource_list(); } int i; BeagleInstanceDetails inst_d; int num_rate_catg = tree->mod->ras->n_catg; int num_branches = 2*tree->n_otu-1; //rooted tree //Recall that in PhyML, each edge has a "left" and "right" partial vectors. Therefore, //in BEAGLE we have 2*num_branches number of partials. //BEAGLE's partials buffer = [ tax1, tax2, ..., taxN, b1Left, b2Left, b3Left,...,bMLeft, b1Rght, b2Rght, b3Rght,...,bMRght] (N taxa, M branches) int num_partials = 2*(tree->n_otu + num_branches); /* TODO: This does not seem correct; suspect poor indexing elsewhere */ /* In update_operations, indexes range from 0 to almost 2 (n_otu + num_branches), but not all integers are used */ int resourceList[1]; resourceList[0] = io->beagle_resource; // DUMP_I(tree->n_otu, num_rate_catg, num_partials, num_branches, tree->mod->ns, tree->n_pattern, tree->mod->whichmodel); int beagle_inst = beagleCreateInstance( tree->n_otu, /**< Number of tip data elements (input) */ num_partials, /**< Number of partial buffer (input) */ /* PhyML uses partials */ 0, /**< Number of compact state representation buffers to create (input) */ tree->mod->ns, /**< Number of states in the continuous-time Markov chain (input) */ tree->data->n_pattern, /**< Number of site patterns to be handled by the instance (input) */ 1, /**< Number of rate matrix eigen-decomposition,state freqs, and category weight buffers*/ num_branches, /**< Number of rate matrix buffers (input) */ num_rate_catg, /**< Number of rate categories (input) */ -1, /**< Number of scaling buffers. Unused because we use SCALING_ALWAYS */ resourceList, /**< List of potential resource on which this instance is allowed (input, NULL implies no restriction */ 1, /**< Length of resourceList list (input) */ BEAGLE_FLAG_FRAMEWORK_CPU | BEAGLE_FLAG_PROCESSOR_CPU | BEAGLE_FLAG_SCALING_ALWAYS | BEAGLE_FLAG_EIGEN_REAL | ((sizeof(float)==sizeof(phydbl)) ? BEAGLE_FLAG_PRECISION_SINGLE:BEAGLE_FLAG_PRECISION_DOUBLE), 0, /**< Bit-flags indicating required implementation characteristics, see BeagleFlags (input) */ &inst_d); if (beagle_inst < 0){ fprintf(stderr, "beagleCreateInstance() failed:%i\n\n",beagle_inst); return beagle_inst; } if(!quiet){ fprintf(stdout, "\n\tUnique BEAGLE instance id:%i\n", beagle_inst); print_beagle_instance_details(&inst_d); } //Set the tips for(i=0; i<2*tree->n_otu-1; ++i) //taxa+internal nodes { // Print_Tip_Partials(tree, tree->a_nodes[i]); if(tree->a_nodes[i]->tax) { assert(tree->a_nodes[i]->c_seq->len == tree->data->n_pattern); // number of compacts sites == number of distinct site patterns double* tip = short_to_double(tree->a_nodes[i]->b[0]->p_lk_tip_r, tree->data->n_pattern*tree->mod->ns); //The tip states are stored on the branch leading to the tip //Recall we store tip partials on the branch leading to the tip, rather than the tip itself. int ret = beagleSetTipPartials(beagle_inst, tree->a_nodes[i]->b[0]->p_lk_tip_idx, tip); if(ret<0){ fprintf(stderr, "beagleSetTipPartials() on instance %i failed:%i\n\n",beagle_inst,ret); Free(tip); return ret; } Free(tip); } } //Set the pattern weights double* pwts = int_to_double(tree->data->wght,tree->data->n_pattern); //BTW, These weights are absolute counts, and not freqs int ret = beagleSetPatternWeights(beagle_inst, pwts); if(ret<0){ fprintf(stderr, "beagleSetPatternWeights() on instance %i failed:%i\n\n",beagle_inst,ret); Free(pwts); return ret; } Free(pwts); tree->mod->b_inst=beagle_inst; update_beagle_ras(tree->mod); update_beagle_efrqs(tree->mod); return beagle_inst; } /* Update partial likelihood on edge b on the side of b where node d lies. */ void update_beagle_partials(t_tree* tree, t_edge* b, t_node* d) { /* | |<- b | d / \ b1 / \ b2 / \ n_v1 n_v2 */ if(d->tax) //Partial likelihoods are only calculated on internal nodes { PhyML_Printf("\n== t_node %d is a leaf...",d->num); PhyML_Printf("\n== Err. in file %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit("\n"); } //Determine d's "left" and "right" neighbors. t_node *n_v1, *n_v2;//d's "left" and "right" neighbor nodes phydbl *p_lk,*p_lk_v1,*p_lk_v2; phydbl *Pij1,*Pij2; int *sum_scale, *sum_scale_v1, *sum_scale_v2; int *p_lk_loc; int dest_p_idx, child1_p_idx, child2_p_idx, Pij1_idx, Pij2_idx; n_v1 = n_v2 = NULL; p_lk = p_lk_v1 = p_lk_v2 = NULL; Pij1 = Pij2 = NULL; sum_scale_v1 = sum_scale_v2 = NULL; p_lk_loc = NULL; dest_p_idx = child1_p_idx = child2_p_idx = Pij1_idx = Pij2_idx = UNINITIALIZED; Set_All_P_Lk(&n_v1,&n_v2, &p_lk,&sum_scale,&p_lk_loc, &Pij1,&p_lk_v1,&sum_scale_v1, &Pij2,&p_lk_v2,&sum_scale_v2, d,b,tree, &dest_p_idx, &child1_p_idx, &child2_p_idx, &Pij1_idx, &Pij2_idx); // fprintf(stdout, "\nUpdating partials on Branch %d (on the side where Node %d lies)\n",b->num,d->num);fflush(stdout); // double* p_lk_v1_b = (double*)malloc(tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern*sizeof(double));if(NULL==p_lk_v1_b) Warn_And_Exit("Couldnt allocate memory"); // beagleGetPartials(tree->b_inst, child1_p_idx, BEAGLE_OP_NONE, (double*)p_lk_v1_b); // double* p_lk_v2_b = (double*)malloc(tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern*sizeof(double));if(NULL==p_lk_v2_b) Warn_And_Exit("Couldnt allocate memory"); // beagleGetPartials(tree->b_inst, child2_p_idx, BEAGLE_OP_NONE, (double*)p_lk_v2_b); // fprintf(stdout, "Left partials :");fflush(stdout); // Dump_Arr_D(p_lk_v1_b, tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern); // fprintf(stdout, "Right partials:");fflush(stdout); // Dump_Arr_D(p_lk_v2_b, tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern); // Free(p_lk_v1_b); // Free(p_lk_v2_b); //Create the corresponding BEAGLE operation // fprintf(stderr,"%d, %d, %d, ", dest_p_idx, child1_p_idx, child2_p_idx); BeagleOperation operations[1] = {{dest_p_idx, BEAGLE_OP_NONE, BEAGLE_OP_NONE, child1_p_idx, Pij1_idx, child2_p_idx, Pij2_idx}}; //Compute the partials int ret = beagleUpdatePartials(tree->b_inst, operations, 1, BEAGLE_OP_NONE); if(ret<0){ fprintf(stderr, "beagleUpdatePartials() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } //Load the computed/updated partial partials #ifndef CLEAN_BEAGLE_API ret = beagleGetPartials(tree->b_inst, dest_p_idx, BEAGLE_OP_NONE, (double*)p_lk); if(ret<0){ fprintf(stderr, "beagleGetPartials() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } #endif // fprintf(stdout, "Updated partials:");fflush(stdout); // Dump_Arr_D(p_lk, tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern); } int finalize_beagle_instance(t_tree *tree) { if(tree->b_inst >= 0) { int ret = beagleFinalizeInstance(tree->b_inst); if(ret<0) fprintf(stderr, "\nFailed to finalize BEAGLE instance %i: %i\n\n", tree->b_inst, ret); return ret; } return 0; } void update_beagle_ras(t_mod* mod) { assert(UNINITIALIZED != mod->b_inst); int ret=-1; if((sizeof(float)==sizeof(phydbl))) //Do we need to convert? { double* catg_rates = float_to_double(mod->ras->gamma_rr->v, mod->ras->n_catg); ret = beagleSetCategoryRates(mod->b_inst, catg_rates); Free(catg_rates); if(ret<0){ fprintf(stderr, "beagleSetCategoryRates() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } double* catg_wts = float_to_double(mod->ras->gamma_r_proba->v, mod->ras->n_catg); if(!mod->optimizing_topology) { ret = beagleSetCategoryWeights(mod->b_inst, 0, catg_wts); Free(catg_wts); if(ret<0){ fprintf(stderr, "beagleSetCategoryWeights() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } } } else { ret = beagleSetCategoryRates(mod->b_inst, mod->ras->gamma_rr->v); if(ret<0){ fprintf(stderr, "beagleSetCategoryRates() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } if(!mod->optimizing_topology) { ret = beagleSetCategoryWeights(mod->b_inst, 0, mod->ras->gamma_r_proba->v); if(ret<0){ fprintf(stderr, "beagleSetCategoryWeights() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } } } } void update_beagle_efrqs(t_mod* mod) { assert(UNINITIALIZED != mod->b_inst); int ret=-1; if((sizeof(float)==sizeof(phydbl))) { double* efrqs = float_to_double(mod->e_frq->pi->v, mod->ns); ret = beagleSetStateFrequencies(mod->b_inst, 0, efrqs); Free(efrqs); } else { ret = beagleSetStateFrequencies(mod->b_inst, 0, mod->e_frq->pi->v); } if(ret<0){ fprintf(stderr, "beagleSetStateFrequencies() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } } void calc_edgelks_beagle(t_edge *b, t_tree *tree) { assert(UNINITIALIZED != tree->b_inst); //Compute the edge likelihood int parents[1] = {b->p_lk_left_idx}; int children[1] = {b->rght->tax?b->p_lk_tip_idx:b->p_lk_rght_idx}; int pmats[1] = {b->Pij_rr_idx}; int other[1] = {0};//Category Weights and State Frequencies both have a single buffer, hence they are both indexed at 0 double lnL[1] = {UNINITIALIZED}; // DUMP_I(parents[0], children[0], pmats[0], b->num, b->rght->tax); int ret=beagleCalculateEdgeLogLikelihoods(tree->b_inst, parents, children, pmats, NULL, NULL, other, other, NULL, 1, lnL, NULL, NULL); int i; if(ret<0){ fprintf(stderr, "beagleCalculateEdgeLogLikelihoods() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } tree->c_lnL = sizeof(phydbl)==sizeof(float)?(float)lnL[0]:lnL[0]; //Retrieve the site likelihoods that were computed during the previous edge likelihood computation ret = beagleGetSiteLogLikelihoods(tree->b_inst,tree->cur_site_lk);//TODO: Handle when cur_site_lk is float if(ret<0){ fprintf(stderr, "beagleGetSiteLogLikelihoods() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } //Transform for(i=0;idata->n_pattern;++i) tree->cur_site_lk[i]=exp(tree->cur_site_lk[i]); } void update_beagle_eigen(t_mod* mod) { assert(UNINITIALIZED != mod->b_inst); int whichmodel = mod->whichmodel; //We use Eigen Decomposition only for GTR models and AA datasets if((mod->io->datatype == AA || whichmodel==GTR || whichmodel==CUSTOM) && mod->use_m4mod == NO) { //Beagle expects untransformed eigen-values (i.e. recall e_val is exp() scaled, so we undo that) phydbl* evals = (phydbl*)malloc(mod->ns * sizeof(phydbl)); int i; for(i=0;ins;++i) evals[i]=log(mod->eigen->e_val[i]); int ret=-1; if((sizeof(float)==sizeof(phydbl)))//Need to convert to doubles? { double* eigen_vects = float_to_double(mod->eigen->r_e_vect, mod->eigen->size*mod->eigen->size); double* eigen_vects_inv = float_to_double(mod->eigen->l_e_vect, mod->eigen->size*mod->eigen->size); double* eigen_vals = float_to_double(evals,mod->eigen->size); ret = beagleSetEigenDecomposition(mod->b_inst,0,eigen_vects,eigen_vects_inv,eigen_vals); Free(eigen_vects);Free(eigen_vects_inv);Free(eigen_vals); } else { ret = beagleSetEigenDecomposition(mod->b_inst,0,mod->eigen->r_e_vect,mod->eigen->l_e_vect,evals); } if(ret<0){ fprintf(stderr, "beagleSetEigenDecomposition() on instance %i failed:%i\n\n",mod->b_inst,ret); Free(evals); Exit(""); } Free(evals); } } #endif // BEAGLE_UTILS_CPP stephaneguindon-phyml-76a39c8/src/beagle_utils.h000066400000000000000000000066111501136442400220050ustar00rootroot00000000000000/* * author: Imran Fanaswala */ #ifndef BEAGLE_UTILS_H #define BEAGLE_UTILS_H #include "assert.h" #include "libhmsbeagle/beagle.h" #include "utilities.h" #define UNINITIALIZED -42 /* BEAGLE is a library that abstracts the core computations common to most phylogenetic packages. The following paragraphs serve as a "design document" for the implementation details of how BEAGLE has been integrated with PhyML. The reader is expected to be familiar with phylogenetics, skimmed the BEAGLE API, and seen a couple of its examples. PARTIAL LIKELIHOODS: - For each internal edge, PhyML maintains a vector of partials that lie to the "right" and "left", to faciliate both post-order and pre-order tree traversal. Therefore each t_edge has a `p_lk_right` and `p_lk_left` field - PhyML represents a tip as a vector of partials (where one bit is "1", and the rest are "0"). Therefore, a t_edge connected to a tip has `p_lk_tip` field. Also by convention, the tip always lies to the right of the edge its connected to. In other words, if b->right->tax is True, then b->p_lk_tip holds the tip partials. - Therefore for BEAGLE, we allocate N+(2*num_edges) partial buffers. - Recall that BEAGLE requires each partial buffer to be uniquely indexed. Thus each edge also has an additional `p_lk_rght_idx` and `p_lk_left_idx` field. These fields are used to create a BeagleOperation struct during the call to beagleUpdatePartials(). - In PhyML, Update_P_Lk() updates the partials for a specific edge lieing along a specific "direction". The "direction" depends on which tree-traversal is being employed. In other words, the tree-traversal dictates whether we are computing "up"/"right" or "down"/"left" partials relative to the t_node*. Specifically, Set_All_P_Lk() handles the nitty gritty of determining whether we are computing "right" or "left" partials. Therefore this function has been modified to also set the appropriate BEAGLE indices. P-MATS and EDGELIKELIHOODS: - (1) Observe that PhyML does eigen decomposition for only GTR and AA models and thus the P-matrix is computed using Beagle. This implies the usage of SetEigenDecomposition() and UpdateTransitionMatricies() calls. - (2) On the other hand, in case of simpler models (JC69, F81, etc), the P-Matrix is explicitly set in BEAGLE thus implying the usage of SetTransitionMatrix(). - The choice between (1) and (2) is made in Update_PMat_At_Given_Edge(). BTW, upon reading Update_PMat_At_Given_Edge(), it may appear that the P-Matrix is being computed in PhyML *and* in BEAGLE; afterall because PMat() function in all cases. However, when BEAGLE is enabled, observe that in PMat() essentially does nothing. - Lk_Core() computes the edgelikelihoods, and calc_edgelks_beagle() is the corresponding BEAGLE function that does the same. */ #define TODO_BEAGLE "TODO. This codepath has not been implemented in PhyML-X, please post your usecase on the PhyML discussion list" int create_beagle_instance(t_tree* tree, int quiet, option* io); int finalize_beagle_instance(t_tree* tree); void update_beagle_partials(t_tree* tree, t_edge* b, t_node* d); void update_beagle_ras(t_mod* mod); void update_beagle_efrqs(t_mod* mod); void update_beagle_eigen(t_mod* mod); void calc_edgelks_beagle(t_edge* b, t_tree* tree); double* int_to_double(const int* src, int num_elems); double* short_to_double(const short* src, int num_elems); double* float_to_double(const phydbl *src, int num_elems); #endif // BEAGLE_UTILS_H stephaneguindon-phyml-76a39c8/src/bionj.c000066400000000000000000000254741501136442400204520ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* The code below is an implementation of the building tree algorithm described in "BIONJ: an improved version of the NJ algorithm based on a simple model of sequence data." (1997) O. Gascuel. Mol Biol Evol. 14:685-95. */ #include "bionj.h" void Bionj(matrix *mat) { int x,y,i; phydbl vxy,lx,ly,lamda,score; Clean_Tree_Connections(mat->tree); for(i=0;itree->n_otu;i++) mat->tip_node[i] = mat->tree->a_nodes[i]; mat->tree->num_curr_branch_available = mat->tree->n_otu; while(mat->r > 3) { x = y = 0; vxy = .0; score = .0; Compute_Sx(mat); Best_Pair(mat,&x,&y,&score); vxy=BioNJ_Variance(mat,x,y); lx=Br_Length(mat,x,y); ly=Br_Length(mat,y,x); lamda=Lamda(mat,x,y,vxy); Update_Mat(mat,x,y,lx,ly,vxy,lamda); Update_Tree(mat,x,y,lx,ly,score); } Finish(mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Finish(matrix *mat) { phydbl dxy,dxz,dyz; int x,y,z; t_node *nx,*ny,*nz,*new; int i; dxy = dxz = dyz = -1.; x = y = z = -1; for(i=0;in_otu;i++) { if(mat->on_off[i]) { if(x < 0) x=i; else if(y < 0) y = i; else if(z < 0) z = i; } } dxy = Dist(mat,x,y); dxz = Dist(mat,x,z); dyz = Dist(mat,y,z); nx = mat->tip_node[x]; ny = mat->tip_node[y]; nz = mat->tip_node[z]; new = mat->tree->a_nodes[mat->curr_int]; new->num = mat->curr_int; new->v[0] = nx; new->v[1] = ny; new->v[2] = nz; nx->v[0] = new; ny->v[0] = new; nz->v[0] = new; if(nx->tax) Connect_One_Edge_To_Two_Nodes(new,nx,mat->tree->a_edges[nx->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,nx,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); if(ny->tax) Connect_One_Edge_To_Two_Nodes(new,ny,mat->tree->a_edges[ny->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,ny,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); if(nz->tax) Connect_One_Edge_To_Two_Nodes(new,nz,mat->tree->a_edges[nz->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,nz,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); nx->b[0]->l->v = .5*(dxy-dyz+dxz); ny->b[0]->l->v = .5*(dyz-dxz+dxy); nz->b[0]->l->v = .5*(dxz-dxy+dyz); new->b[0]->l->v = nx->b[0]->l->v; new->b[1]->l->v = ny->b[0]->l->v; new->b[2]->l->v = nz->b[0]->l->v; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Mat(matrix *mat, int x, int y, phydbl lx, phydbl ly, phydbl vxy, phydbl lamda) { int i; int a,b; a = b = -1; for(i=0;in_otu;i++) { if((mat->on_off[i]) && (i != x) && (i != y)) { if(x > i) { a=x; b=i; } else { a=i; b=x; } mat->dist[a][b]=Dist_Red(mat,x,lx,y,ly,i,lamda); mat->dist[b][a]=Var_Red(mat,x,y,i,lamda,vxy); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Tree(matrix *mat, int x, int y, phydbl lx, phydbl ly, phydbl score) { t_node *new, *nx, *ny; nx = mat->tip_node[x]; ny = mat->tip_node[y]; new = mat->tree->a_nodes[mat->curr_int]; nx->v[0] = new; ny->v[0] = new; new->v[1] = nx; new->v[2] = ny; new->num = mat->curr_int; if(nx->tax) Connect_One_Edge_To_Two_Nodes(new,nx,mat->tree->a_edges[nx->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,nx,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); if(ny->tax) Connect_One_Edge_To_Two_Nodes(new,ny,mat->tree->a_edges[ny->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,ny,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); nx->b[0]->l->v = lx; ny->b[0]->l->v = ly; new->b[1]->l->v = lx; new->b[2]->l->v = ly; new->score[0] = score; nx->b[0]->l->v = lx; ny->b[0]->l->v = ly; mat->tip_node[x] = new; mat->on_off[y] = 0; mat->curr_int++; mat->r--; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Best_Pair(matrix *mat, int *x, int *y,phydbl *score) { int i,j/* ,n_ties */; phydbl Qmin,Qmin2; phydbl *t_Qij; /* int *ties; */ t_Qij = (phydbl *)mCalloc(mat->n_otu * mat->n_otu,sizeof(phydbl )); /* ties = (int *)mCalloc(mat->n_otu * mat->n_otu,sizeof(int )); */ Qmin = 1.e+10; for(i=0;in_otu;i++) { if(mat->on_off[i]) { for(j=0;jon_off[j]) { t_Qij[mat->n_otu*i+j] = Q_Agglo(mat,i,j); if(t_Qij[mat->n_otu*i+j] < Qmin - 1.E-05) { *x = i; *y = j; Qmin = t_Qij[mat->n_otu*i+j]; } } } } } /* n_ties = 0; */ /* for(i=0;in_otu;i++) */ /* { */ /* if(mat->on_off[i]) */ /* { */ /* for(j=0;jon_off[j]) */ /* { */ /* if((t_Qij[mat->n_otu*i+j] < Qmin + 1.E-05) && (t_Qij[mat->n_otu*i+j] > Qmin - 1.E-05)) */ /* { */ /* ties[n_ties] = mat->n_otu*i+j; */ /* n_ties++; */ /* } */ /* } */ /* } */ /* } */ /* } */ /* if(!n_ties) */ /* { */ /* PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ /* /\* Useful if some pairwise distances are null *\/ */ /* if(n_ties > 1) */ /* { */ /* int cand; */ /* *x = *y = -1; */ /* cand = (int)RINT(rand()/(phydbl)(RAND_MAX) * (n_ties-1)); */ /* *x = (int)(ties[cand] / mat->n_otu); */ /* *y = (int)(ties[cand] % mat->n_otu); */ /* } */ Qmin2 = 1e+10; for(i=0;in_otu;i++) { if((i != *y) && (i != *x) && (t_Qij[mat->n_otu*(*x)+i] < Qmin2)) Qmin2 = t_Qij[mat->n_otu*(*x)+i]; } for(i=0;in_otu;i++) { if((i != *y) && (i != *x) && (t_Qij[mat->n_otu*i+(*y)] < Qmin2)) Qmin2 = t_Qij[mat->n_otu*i+(*y)]; } *score = FABS(Qmin2 - Qmin)/FABS(Qmin); Free(t_Qij); /* Free(ties); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Compute_Sx(matrix *mat) { int i,j; for(i=0;in_otu;i++) { mat->dist[i][i] = .0; if(mat->on_off[i]) { for(j=0;jn_otu;j++) { if((i != j) && (mat->on_off[j])) { mat->dist[i][i] += Dist(mat,i,j); } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Sum_S(matrix *mat, int i) { return mat->dist[i][i]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Dist(matrix *mat, int x, int y) { if(x > y) return(mat->dist[x][y]); else return(mat->dist[y][x]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl BioNJ_Variance(matrix *mat, int x, int y) { if(x > y) { return(mat->dist[y][x]); } else { return(mat->dist[x][y]); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Br_Length(matrix *mat, int x, int y) { return .5*(Dist(mat,x,y)+ (Sum_S(mat,x)-Sum_S(mat,y))/(phydbl)(mat->r-2.)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Dist_Red(matrix *mat, int x, phydbl lx, int y, phydbl ly, int i, phydbl lamda) { phydbl Dui; Dui=lamda*(Dist(mat,x,i)-lx) +(1.-lamda)*(Dist(mat,y,i)-ly); return(Dui); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Var_Red(matrix *mat, int x, int y, int i, phydbl lamda, phydbl vxy) { phydbl Vui; Vui=lamda*(BioNJ_Variance(mat,x,i)) +(1.-lamda)*(BioNJ_Variance(mat,y,i)) -lamda*(1.-lamda)*vxy; return(Vui); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lamda(matrix *mat, int x, int y, phydbl vxy) { phydbl lamda=0.0; int i; if(mat->method == 0) /* NJ (Saitou & Nei, 1987) */ lamda = 0.5; else /* BioNJ (Gascuel, 1997) */ { if(vxy < SMALL && vxy > -SMALL) lamda=0.5; else { for(i=0;in_otu;i++) { if((x != i) && (y != i) && (mat->on_off[i])) lamda = lamda + BioNJ_Variance(mat,y,i) - BioNJ_Variance(mat,x,i); } lamda = 0.5 + lamda/(2.*(mat->r-2)*vxy); } if(lamda > 1.0) lamda = 0.5;/*1.0;*/ else if(lamda < 0.0) lamda = 0.5;/*0.0;*/ } return(lamda); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Q_Agglo(matrix *mat, int x, int y) { phydbl Qxy; Qxy = .0; Qxy=(mat->r-2.)*Dist(mat,x,y)-Sum_S(mat,x)-Sum_S(mat,y); return(Qxy); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Bionj_Br_Length(matrix *mat) { int x; x = Bionj_Br_Length_Post(mat->tree->a_nodes[0], mat->tree->a_nodes[0]->v[0], mat); mat->tree->a_nodes[0]->b[0]->l->v = Dist(mat,0,x); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Bionj_Br_Length_Post(t_node *a, t_node *d, matrix *mat) { int i; if(d->tax) { return d->num; } else { int d_v1, d_v2; phydbl lx, ly, vxy,lamda; int x,y; d_v1 = d_v2 = -1; for(i=0;i<3;i++) if(d->v[i] != a) {(d_v1 < 0)?(d_v1 = i):(d_v2 = i);} x = Bionj_Br_Length_Post(d,d->v[d_v1],mat); y = Bionj_Br_Length_Post(d,d->v[d_v2],mat); vxy = .0; Compute_Sx(mat); vxy=BioNJ_Variance(mat,(x),(y)); lx=Br_Length(mat,(x),(y)); ly=Br_Length(mat,(y),(x)); lamda=Lamda(mat,(x),(y),vxy); Update_Mat(mat,(x),(y),lx,ly,vxy,lamda); d->b[d_v1]->l->v = lx; d->b[d_v2]->l->v = ly; mat->on_off[y] = 0; mat->r--; return x; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/bionj.h000066400000000000000000000024561501136442400204520ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef NJ_H #define NJ_H #include "utilities.h" #include "optimiz.h" #include "free.h" void Bionj(matrix *mat); void Finish(matrix *mat); void Compute_Sx(matrix *mat); phydbl Sum_S(matrix *mat, int i); phydbl Dist(matrix *mat, int x, int y); phydbl Q_Agglo(matrix *mat, int x, int y); phydbl BioNJ_Variance(matrix *mat, int x, int y); phydbl Br_Length(matrix *mat, int x, int y); void Update_Dist(matrix *mat, int x, int y); phydbl Lamda(matrix *mat, int x, int y, phydbl vxy); void Best_Pair(matrix *mat, int *x, int *y, phydbl *score); phydbl Var_Red(matrix *mat, int x, int y, int i, phydbl lamda, phydbl vxy); void Update_Tree(matrix *mat, int x, int y, phydbl lx, phydbl ly, phydbl score); void Update_Mat(matrix *mat, int x, int y, phydbl lx, phydbl ly, phydbl vxy, phydbl lamda); phydbl Dist_Red(matrix *mat, int x, phydbl lx, int y, phydbl ly, int i, phydbl lamda); int Bionj_Br_Length_Post(t_node *a, t_node *d, matrix *mat); void Bionj_Br_Length(matrix *mat); #endif stephaneguindon-phyml-76a39c8/src/checkpoint.c000066400000000000000000000021311501136442400214610ustar00rootroot00000000000000#include "checkpoint.h" void CHECK_Main(int argc,char **argv) { // Up to you Salva... } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/checkpoint.h000066400000000000000000000002101501136442400214620ustar00rootroot00000000000000#include #ifndef CHECKPOINT_H #define CHECKPOINT_H #include "utilities.h" void CHECK_Main(int argc, char **argv); #endif stephaneguindon-phyml-76a39c8/src/cl.c000066400000000000000000001500361501136442400177400ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "cl.h" /*********************************************************/ /** * Fill the Option fields, with the argc array */ int Read_Command_Line(option *io, int argc, char **argv) { int c; int idx; int i; int writemode; short int opt_m; writemode = WRITE; opt_m = 0; if (argc == 1) Exit("\n. No argument was passed to the program. Please check the " "documentation. \n"); PhyML_Printf("", writemode); struct option longopts[] = { {"n_rgrft", required_argument, NULL, 0}, {"n_globl", required_argument, NULL, 1}, {"max_dist", required_argument, NULL, 2}, {"n_optim", required_argument, NULL, 3}, {"n_best", required_argument, NULL, 4}, {"model", required_argument, NULL, 5}, {"search", required_argument, NULL, 6}, {"datatype", required_argument, NULL, 7}, {"multiple", required_argument, NULL, 8}, {"input", required_argument, NULL, 9}, {"bootstrap", required_argument, NULL, 10}, {"ts/tv", required_argument, NULL, 11}, {"nclasses", required_argument, NULL, 12}, {"pinv", required_argument, NULL, 13}, {"alpha", required_argument, NULL, 14}, {"inputtree", required_argument, NULL, 15}, {"min_diff_lk_local", required_argument, NULL, 16}, {"min_diff_lk_global", required_argument, NULL, 17}, {"steph_spr", no_argument, NULL, 18}, {"brent_it_max", required_argument, NULL, 19}, {"rand_start", no_argument, NULL, 20}, {"n_rand_starts", required_argument, NULL, 21}, {"sequential", no_argument, NULL, 22}, {"inside_opt", no_argument, NULL, 23}, {"p_moves", required_argument, NULL, 24}, {"fast_nni", no_argument, NULL, 25}, {"g_pars", no_argument, NULL, 26}, {"r_seed", required_argument, NULL, 27}, {"collapse_boot", required_argument, NULL, 28}, {"random_boot", required_argument, NULL, 29}, {"print_trace", no_argument, NULL, 30}, {"print_site_lnl", no_argument, NULL, 31}, {"print_site_lk", no_argument, NULL, 31}, {"cov", no_argument, NULL, 32}, {"cov_delta", required_argument, NULL, 33}, {"cov_alpha", required_argument, NULL, 34}, {"cov_ncats", required_argument, NULL, 35}, {"ps", no_argument, NULL, 36}, {"cov_free", no_argument, NULL, 37}, {"no_gap", no_argument, NULL, 38}, {"n_rr_branch", required_argument, NULL, 39}, {"append", no_argument, NULL, 40}, {"no_five_branch", no_argument, NULL, 41}, {"pars_thresh", required_argument, NULL, 42}, {"min_diff_lk_move", required_argument, NULL, 43}, {"hybrid", no_argument, NULL, 44}, {"use_median", no_argument, NULL, 45}, {"run_id", required_argument, NULL, 46}, {"pars", no_argument, NULL, 47}, {"quiet", no_argument, NULL, 48}, {"version", no_argument, NULL, 49}, {"calibration_file", required_argument, NULL, 50}, {"calibration", required_argument, NULL, 50}, {"clade_file", required_argument, NULL, 50}, {"boot_progress_every", required_argument, NULL, 51}, {"aa_rate_file", required_argument, NULL, 52}, {"chain_len", required_argument, NULL, 53}, {"sample_freq", required_argument, NULL, 54}, {"burnin", required_argument, NULL, 55}, {"no_memory_check", no_argument, NULL, 56}, {"no_colalias", no_argument, NULL, 57}, {"alias_subpatt", no_argument, NULL, 58}, {"no_sequences", no_argument, NULL, 59}, {"prior", no_argument, NULL, 59}, {"fastlk", no_argument, NULL, 60}, {"free_rates", no_argument, NULL, 61}, {"freerates", no_argument, NULL, 61}, {"freerate", no_argument, NULL, 61}, {"free_rate", no_argument, NULL, 61}, {"is", no_argument, NULL, 62}, // no 63 since it corresponds to character '?' {"rate_model", required_argument, NULL, 64}, {"ratemodel", required_argument, NULL, 64}, {"log_l", no_argument, NULL, 65}, {"gamma_lens", no_argument, NULL, 66}, {"il", no_argument, NULL, 66}, {"codpos", required_argument, NULL, 67}, {"constraint_file", required_argument, NULL, 68}, {"constraint_tree", required_argument, NULL, 68}, {"help", no_argument, NULL, 69}, {"mutmap", no_argument, NULL, 70}, {"parvals", required_argument, NULL, 71}, {"constrained_lens", no_argument, NULL, 72}, {"xml", required_argument, NULL, 73}, {"l_var", required_argument, NULL, 74}, #ifdef BEAGLE {"beagle_resource", required_argument, NULL, 75}, #endif {"ancestral", no_argument, NULL, 76}, {"anc", no_argument, NULL, 76}, {"coord_file", required_argument, NULL, 77}, {"json_trace", no_argument, NULL, 78}, {"weights", required_argument, NULL, 79}, {"tbe", no_argument, NULL, 80}, {"leave_duplicates", no_argument, NULL, 81}, {"precision", required_argument, NULL, 82}, {"l_min", required_argument, NULL, 83}, {"print_mat_and_exit", no_argument, NULL, 84}, {"seq_len", required_argument, NULL, 85}, {"n_otu", required_argument, NULL, 86}, {0, 0, 0, 0}}; io->datatype = UNDEFINED; idx = -1; // Find out about the data type first... do { c = getopt_long(argc, argv, "qi:d:t:m:b:n:f:zk:v:c:a:u:ho:s:x:g:l:ep", longopts, &idx); switch (c) { case 'd': case 7: { if (!strcmp(optarg, "nt")) { io->datatype = NT; } else if (!strcmp(optarg, "aa")) { io->datatype = AA; } else if ((!strcmp(optarg, "generic")) || (!strcmp(optarg, "gen"))) { io->datatype = GENERIC; } break; } } } while (c != -1); // "Rewind" getopt_long optind = 1; #ifndef PHYML int open_ps_file = 0; #endif idx = -1; do { c = getopt_long(argc, argv, "qi:d:t:m:b:n:f:zk:v:c:a:u:ho:s:x:g:l:ep", longopts, &idx); switch (c) { case 86: { int n_otu; n_otu = atoi(optarg); if (n_otu >= 3) io->n_otu = n_otu; else assert(false); break; } case 85: { int len; len = atoi(optarg); if (len >= 0) io->init_len = len; else assert(false); break; } case 84: { io->print_mat_and_exit = YES; break; } case 83: { io->mod->l_min = String_To_Dbl(optarg); break; } case 82: { if ((!atoi(optarg)) || (atoi(optarg) < 1) || (atoi(optarg) > DECIMAL_DIG - 3)) { PhyML_Printf("\n. The number of digits must be [1 - %d]\n", DECIMAL_DIG - 3); Exit("\n"); } else { io->precision = atoi(optarg); } break; } case 81: { io->leave_duplicates = YES; break; } case 80: { io->do_tbe = YES; io->do_boot = NO; io->do_alrt = NO; break; } case 79: { io->has_io_weights = YES; strcpy(io->weight_file, optarg); break; } case 78: { io->print_json_trace = YES; break; } case 77: { char *tmp; tmp = (char *)mCalloc(T_MAX_FILE, sizeof(char)); if (strlen(optarg) > T_MAX_FILE - 11) { char choix; strcpy(tmp, "\n. The file name'"); strcat(tmp, optarg); strcat(tmp, "' is too long.\n"); PhyML_Printf("%s", tmp); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else if (!Filexists(optarg)) { char choix; strcpy(tmp, "\n. The file '"); strcat(tmp, optarg); strcat(tmp, "' doesn't exist.\n"); PhyML_Printf("%s", tmp); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else { strcpy(io->in_coord_file, optarg); io->fp_in_coord = Openfile(io->in_coord_file, READ); } Free(tmp); break; } case 76: { io->ancestral = YES; break; } #ifdef BEAGLE case 75: { io->beagle_resource = (int)atoi(optarg); break; } #endif case 74: { io->mod->l_var_sigma->v = String_To_Dbl(optarg); break; } case 73: { strcpy(io->in_xml_file, optarg); io->fp_in_xml = Openfile(io->in_xml_file, READ); #ifdef INVITEE Free_Optimiz(io->mod->s_opt); Free_Model_Basic(io->mod); Free_Input(io); PhyTime_XML(optarg); return 0; #elif defined(PHYML) Free_Optimiz(io->mod->s_opt); Free_Model_Basic(io->mod); Free_Input(io); io = PhyML_XML(optarg); Free(io); return 0; #elif defined(PHYTIME) Free_Optimiz(io->mod->s_opt); Free_Model_Basic(io->mod); Free_Input(io); DATE_XML(optarg); return 0; #elif defined(PHYREX) Free_Optimiz(io->mod->s_opt); Free_Model_Basic(io->mod); Free_Input(io); PHYREX_XML(optarg); return 0; #endif #ifdef TEST return 1; #endif break; } case 72: { io->mod->s_opt->constrained_br_len = YES; break; } case 71: { io->mcmc->in_fp_par = fopen(optarg, "r"); io->mcmc->randomize = NO; break; } case 70: { io->mutmap = YES; break; } case 68: { char *tmp; tmp = (char *)mCalloc(T_MAX_FILE, sizeof(char)); if (strlen(optarg) > T_MAX_FILE - 11) { char choix; strcpy(tmp, "\n. The file name'"); strcat(tmp, optarg); strcat(tmp, "' is too long.\n"); PhyML_Printf("%s", tmp); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else if (!Filexists(optarg)) { char choix; strcpy(tmp, "\n. The file '"); strcat(tmp, optarg); strcat(tmp, "' doesn't exist.\n"); PhyML_Printf("%s", tmp); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else { strcpy(io->in_constraint_tree_file, optarg); io->fp_in_constraint_tree = Openfile(io->in_constraint_tree_file, 0); } Free(tmp); break; } case 67: { phydbl pos; pos = atof(optarg); io->codpos = (int)pos; if (io->codpos < 1 || io->codpos > 3) { char choix; PhyML_Printf("\n. Coding position must be set to 1, 2 or 3.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } break; break; } case 66: { io->mod->gamma_mgf_bl = YES; io->mod->s_opt->opt_gamma_br_len = YES; break; } case 65: { io->mod->log_l = YES; break; } case 64: { char *s; int i; s = (char *)mCalloc(T_MAX_NAME, sizeof(char)); i = 0; while (optarg[i++]) s[i] = tolower(optarg[i]); if (!strcmp(optarg, "gbd")) io->rates->model_id = THORNE; else if (!strcmp(optarg, "autocorrelated")) io->rates->model_id = THORNE; else if (!strcmp(optarg, "autocorr")) io->rates->model_id = THORNE; else if (!strcmp(optarg, "geom")) io->rates->model_id = GUINDON; else if (!strcmp(optarg, "integrated")) io->rates->model_id = GUINDON; else if (!strcmp(optarg, "uncorrelated")) io->rates->model_id = LOGNORMAL; else if (!strcmp(optarg, "uncorr")) io->rates->model_id = LOGNORMAL; else if (!strcmp(optarg, "lognorm")) io->rates->model_id = LOGNORMAL; else if (!strcmp(optarg, "clock")) io->rates->model_id = STRICTCLOCK; else if (!strcmp(optarg, "strictclock")) io->rates->model_id = STRICTCLOCK; else if (!strcmp(optarg, "strict_clock")) io->rates->model_id = STRICTCLOCK; else { PhyML_Printf("\n. rate_model should be 'autocorrelated', " "'uncorrelated', 'integrated' or 'clock'."); Exit("\n"); } Free(s); break; } case 62: { io->mcmc->is = YES; break; } case 61: { io->mod->ras->free_mixt_rates = YES; io->mod->s_opt->opt_free_mixt_rates = YES; break; } case 60: { io->lk_approx = NORMAL; break; } case 59: { break; } case 58: { io->do_alias_subpatt = YES; break; } case 57: { io->colalias = NO; break; } case 56: { io->mem_question = NO; break; } case 55: { phydbl len; len = atof(optarg); io->mcmc->chain_len_burnin = (int)len; if (io->mcmc->chain_len_burnin < 1) { char choix; PhyML_Printf( "\n. chain_len_burnin must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } break; } case 54: { phydbl len; len = atof(optarg); io->mcmc->sample_interval = (int)len; if (io->mcmc->sample_interval < 1) { char choix; PhyML_Printf( "\n. sample_interval must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } break; } case 53: { phydbl len; len = atof(optarg); io->mcmc->chain_len = (int)len; if (io->mcmc->chain_len < 1) { char choix; PhyML_Printf("\n. chain_len must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } break; } case 52: { char *s; s = (char *)mCalloc(T_MAX_FILE, sizeof(char)); strcpy(s, optarg); io->mod->fp_aa_rate_mat = Openfile(s, 0); strcpy(io->mod->aa_rate_mat_file->s, s); Free(s); break; } case 51: { io->boot_prog_every = atoi(optarg); if (io->boot_prog_every < 1) { char choix; PhyML_Printf( "\n. boot_progress_every must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } break; } case 50: { strcpy(io->clade_list_file, optarg); break; } case 49: { PhyML_Printf("\n. This is PhyML version %s.\n\n", VERSION); Exit(""); break; } case 48: { io->quiet = 1; break; } case 'p': case 47: { io->in_tree = 1; break; } case 46: { if (strlen(optarg) > 0) { io->append_run_ID = YES; strcpy(io->run_id_string, optarg); } break; } case 45: { io->mod->ras->gamma_median = 1; break; } case 44: { io->mod->s_opt->hybrid_thresh = 0; break; } case 43: { io->mod->s_opt->min_diff_lk_move = atof(optarg); if (io->mod->s_opt->min_diff_lk_move < 0) { char choix; PhyML_Printf("\n. Min_diff_lk_move must be a double greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } break; } case 42: { io->mod->s_opt->pars_thresh = (int)atoi(optarg); if (io->mod->s_opt->pars_thresh < 0) { PhyML_Printf( "\n. The parsimony threshold must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); Exit("\n"); } break; } case 41: { io->mod->s_opt->opt_five_branch = 0; break; } case 40: { writemode = APPEND; break; } case 39: { break; } case 38: { io->rm_ambigu = 1; break; } case 37: { io->mod->m4mod->use_cov_alpha = NO; io->mod->m4mod->use_cov_free = YES; break; } case 36: { #ifndef PHYML open_ps_file = 1; #endif break; } case 35: { #ifdef M4 io->mod->m4mod->n_h = (int)atoi(optarg); if (io->mod->m4mod->n_h < 1) { char choix; PhyML_Printf("\n. The number of classes must be greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } #endif break; } case 34: { #ifdef M4 io->mod->m4mod->use_cov_alpha = YES; io->mod->m4mod->use_cov_free = NO; if (!strcmp(optarg, "e") || !strcmp(optarg, "E") || !strcmp(optarg, "estimated") || !strcmp(optarg, "ESTIMATED")) { io->mod->s_opt->opt_cov_alpha = YES; io->mod->m4mod->alpha = 1.0; } else { io->mod->m4mod->alpha = (phydbl)atof(optarg); if (io->mod->m4mod->alpha < 1.E-5) { char choix; PhyML_Printf("\n. The value of alpha must be greater than 1.E-5.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } } #endif break; } case 33: { #ifdef M4 if (!strcmp(optarg, "e") || !strcmp(optarg, "E") || !strcmp(optarg, "estimated") || !strcmp(optarg, "ESTIMATED")) { io->mod->s_opt->opt_cov_delta = YES; io->mod->m4mod->delta = 1.0; } else { io->mod->m4mod->delta = (phydbl)atof(optarg); if (atof(optarg) < 1.E-10) { char choix; PhyML_Printf("\n. The value of delta must be larger than 1.E-10.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } } #endif break; } case 32: { io->mod->use_m4mod = YES; break; } case 31: { io->print_site_lnl = YES; break; } case 30: { io->print_trace = YES; break; } case 29: { io->random_boot_seq_order = (int)atoi(optarg); break; } case 28: { io->collapse_boot = (int)atoi(optarg); break; } case 27: { io->r_seed = (int)atoi(optarg); break; } case 26: { io->mod->s_opt->general_pars = YES; break; } case 25: { io->mod->s_opt->fast_nni = YES; break; } case 24: { io->mod->s_opt->p_moves_to_examine = (phydbl)atof(optarg); break; } case 23: { io->mod->s_opt->wim_inside_opt = 1; break; } case 0: { io->mod->s_opt->wim_n_rgrft = atoi(optarg); break; } case 1: { io->mod->s_opt->wim_n_globl = atoi(optarg); break; } case 2: { io->mod->s_opt->wim_max_dist = atoi(optarg); break; } case 3: { io->mod->s_opt->wim_n_optim = atoi(optarg); break; } case 4: { io->mod->s_opt->wim_n_best = atoi(optarg); break; } case 16: { io->mod->s_opt->min_diff_lk_local = atof(optarg); break; } case 17: { io->mod->s_opt->min_diff_lk_global = atof(optarg); break; } case 18: { io->mod->s_opt->steph_spr = NO; io->mod->s_opt->greedy = YES; break; } case 19: { io->mod->s_opt->brent_it_max = atoi(optarg); break; } case 20: { io->mod->s_opt->random_input_tree = YES; break; } case 21: { io->mod->s_opt->random_input_tree = YES; io->mod->s_opt->n_rand_starts = atoi(optarg); if (io->mod->s_opt->n_rand_starts < 1) Exit("\n. Number of random starting trees must be > 0.\n\n"); } case 's': case 6: { if ((!strcmp(optarg, "spr")) || (!strcmp(optarg, "SPR"))) { io->mod->s_opt->topo_search = SPR_MOVE; io->mod->s_opt->greedy = (io->mod->s_opt->steph_spr) ? (0) : (1); } else if ((!strcmp(optarg, "nni")) || (!strcmp(optarg, "NNI"))) { PhyML_Printf("\n. The NNI option is deprecated. PhyML now uses a mix " "of SPRs and NNIs."); io->mod->s_opt->topo_search = NNI_MOVE; io->mod->s_opt->random_input_tree = 0; } else if ((!strcmp(optarg, "best")) || (!strcmp(optarg, "BEST"))) { PhyML_Printf("\n. The BEST option is deprecated. PhyML now uses a mix " "of SPRs and NNIs."); io->mod->s_opt->topo_search = BEST_OF_NNI_AND_SPR; io->mod->s_opt->greedy = (io->mod->s_opt->steph_spr) ? (0) : (1); } break; } case 'd': case 7: { if (!strcmp(optarg, "nt")) { io->datatype = NT; io->mod->ns = 4; #ifdef M4 io->mod->m4mod->n_o = 4; #endif if ((io->mod->whichmodel == LG) || (io->mod->whichmodel == WAG) || (io->mod->whichmodel == DAYHOFF) || (io->mod->whichmodel == JTT) || (io->mod->whichmodel == BLOSUM62) || (io->mod->whichmodel == MTREV) || (io->mod->whichmodel == RTREV) || (io->mod->whichmodel == CPREV) || (io->mod->whichmodel == DCMUT) || (io->mod->whichmodel == VT) || (io->mod->whichmodel == MTMAM) || (io->mod->whichmodel == MTART) || (io->mod->whichmodel == HIVW) || (io->mod->whichmodel == HIVB) || (io->mod->whichmodel == AB) || (io->mod->whichmodel == CUSTOMAA)) { io->mod->whichmodel = HKY85; strcpy(io->mod->modelname->s, "HKY85\0"); } } else if (!strcmp(optarg, "aa")) { io->datatype = AA; io->mod->kappa->optimize = NO; io->mod->ns = 20; #ifdef M4 io->mod->m4mod->n_o = 20; #endif if ((io->mod->whichmodel == JC69) || (io->mod->whichmodel == K80) || (io->mod->whichmodel == F81) || (io->mod->whichmodel == HKY85) || (io->mod->whichmodel == F84) || (io->mod->whichmodel == TN93) || (io->mod->whichmodel == GTR) || (io->mod->whichmodel == CUSTOM)) { io->mod->whichmodel = LG; strcpy(io->mod->modelname->s, "LG\0"); } } else if ((!strcmp(optarg, "generic")) || (!strcmp(optarg, "gen"))) { io->datatype = GENERIC; } else { char choix; PhyML_Printf("\n. Unknown argument to -d option: please use `nt' for " "DNA or `aa' for Amino-Acids\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } break; } case 'm': case 5: { opt_m = 1; if (!isalpha(optarg[0])) { // Custom model for DNA sequences, e.g., 000000 (or 111111, etc) // is JC69 if (strchr(optarg, ',') == NULL) { strcpy(io->mod->custom_mod_string->s, optarg); if (strlen(io->mod->custom_mod_string->s) != 6) { Warn_And_Exit( "\n. The custom model string should be of length 6.\n"); } io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = CUSTOM; strcpy(io->mod->modelname->s, "custom"); io->mod->kappa->optimize = NO; io->mod->r_mat->optimize = YES; } else // GTR model with user defined relative rates { phydbl v; int n_rr; const char *d = ","; char *tok = strtok(optarg, d); io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = GTR; io->mod->r_mat->optimize = NO; n_rr = 0; while (tok && n_rr < 6) { v = strtod(tok, NULL); if (v != 0) { io->mod->r_mat->rr->v[n_rr] = v; io->mod->r_mat->rr_val->v[n_rr] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", tok); Exit("\n"); } tok = strtok(NULL, d); n_rr++; } assert(n_rr <= 6); } } else { char *s = To_Upper_String(optarg); if (strcmp(s, "JC69") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = JC69; } else if (strcmp(s, "K80") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = K80; } else if (strcmp(s, "F81") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = F81; } else if (strcmp(s, "HKY85") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = HKY85; } else if (strcmp(s, "F84") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = F84; } else if (strcmp(s, "TN93") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = TN93; } else if (strncmp(s, "GTR", 3) == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = GTR; } else if (strcmp(s, "DAYHOFF") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = DAYHOFF; } else if (strcmp(s, "JTT") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = JTT; } else if (strcmp(s, "MTREV") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = MTREV; } else if (strcmp(s, "LG") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = LG; } else if (strcmp(s, "WAG") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = WAG; } else if (strcmp(s, "DCMUT") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = DCMUT; } else if (strcmp(s, "RTREV") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = RTREV; } else if (strcmp(s, "CPREV") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = CPREV; } else if (strcmp(s, "VT") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = VT; } else if (strcmp(s, "BLOSUM62") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = BLOSUM62; } else if (strcmp(s, "MTMAM") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = MTMAM; } else if (strcmp(s, "MTART") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = MTART; } else if (strcmp(s, "HIVW") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = HIVW; } else if (strcmp(s, "HIVB") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = HIVB; } else if (strcmp(s, "AB") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = AB; } else if (strcmp(s, "CUSTOM") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = CUSTOMAA; } else if (strcmp(s, "FLU") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = FLU; } else { PhyML_Printf("\n. The model name is incorrect. Please see the " "documentation.\n"); Exit("\n"); } Free(s); } Set_Model_Name(io->mod); if (io->mod->r_mat == NULL) { io->mod->r_mat = (t_rmat *)Make_Rmat(io->mod->ns); Init_Rmat(io->mod->r_mat); Make_Custom_Model(io->mod); } if (io->mod->whichmodel == GTR) io->mod->r_mat->optimize = YES; break; } case 'a': case 14: { if ((strcmp(optarg, "e") == 0) || (strcmp(optarg, "E") == 0) || (strcmp(optarg, "estimated") == 0) || (strcmp(optarg, "ESTIMATED") == 0)) { io->mod->ras->alpha->optimize = YES; } else if (atof(optarg) < 1.E-10) { char choix; PhyML_Printf("\n. Alpha must be > 1.E-10.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else { io->mod->ras->alpha->v = (phydbl)atof(optarg); io->mod->ras->alpha->optimize = NO; } break; } case 'b': case 10: { if ((int)String_To_Dbl(optarg) < -5) { char choix; PhyML_Printf("\n. Branch test value must be a positive integer for " "bootstrap, or between -1 and -4 for aLRT branch test\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else { if ((int)String_To_Dbl(optarg) > 0) { io->do_alrt = NO; io->ratio_test = 0; io->n_boot_replicates = (int)atoi(optarg); io->print_boot_trees = YES; if (io->n_data_sets > 1) { char choix; PhyML_Printf("\n. Bootstrap option is not allowed with multiple " "data sets\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } } else if (atoi(optarg) == 0) { io->do_alrt = NO; io->do_tbe = NO; io->do_boot = NO; io->ratio_test = 0; } else { io->do_alrt = YES; io->do_tbe = NO; io->do_boot = NO; io->ratio_test = -(int)atoi(optarg); } } break; } case 'c': case 12: { if ((!atoi(optarg)) || (atoi(optarg) < 0)) { char choix; PhyML_Printf("\n. Unknown argument to -c option: the number of rate " "categories must be a positive integer\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else { io->mod->ras->n_catg = atoi(optarg); if (io->mod->ras->n_catg < 1) { PhyML_Printf( "\n. The number of rate categories must be a positive integer\n"); Exit("\n"); } } break; } case 'f': { // Won't work if ns is not set beforehand, i.e., if -d comes after -f // in the command line io->mod->e_frq = (t_efrq *)Make_Efrq(io->mod->ns); Init_Efrq(NULL, io->mod->e_frq); if (!strcmp(optarg, "e")) // empirical state frequencies { io->mod->e_frq->type = EMPIRICAL; io->mod->e_frq->pi->optimize = NO; io->mod->e_frq->pi_unscaled->optimize = NO; } else if (!strcmp(optarg, "o")) // ML estimation { io->mod->e_frq->type = ML; io->mod->e_frq->pi->optimize = YES; io->mod->e_frq->pi_unscaled->optimize = YES; } else if (!strcmp(optarg, "m")) // Given by the model { assert(io->datatype != UNDEFINED); if (io->datatype == AA) { io->mod->e_frq->type = MODEL; io->mod->e_frq->pi->optimize = NO; io->mod->e_frq->pi_unscaled->optimize = NO; } else if (io->datatype == NT) { io->mod->e_frq->type = ML; io->mod->e_frq->pi->optimize = YES; io->mod->e_frq->pi_unscaled->optimize = YES; } } else if (!isalpha(optarg[0])) { phydbl sum; if (io->datatype == NT) { double val1, val2, val3, val4; io->mod->e_frq->type = USER; io->mod->e_frq->pi->optimize = NO; io->mod->e_frq->pi_unscaled->optimize = NO; sscanf(optarg, "%lf,%lf,%lf,%lf", &val1, &val2, &val3, &val4); io->mod->e_frq->user_b_freq->v[0] = (phydbl)val1; io->mod->e_frq->user_b_freq->v[1] = (phydbl)val2; io->mod->e_frq->user_b_freq->v[2] = (phydbl)val3; io->mod->e_frq->user_b_freq->v[3] = (phydbl)val4; sum = (io->mod->e_frq->user_b_freq->v[0] + io->mod->e_frq->user_b_freq->v[1] + io->mod->e_frq->user_b_freq->v[2] + io->mod->e_frq->user_b_freq->v[3]); io->mod->e_frq->user_b_freq->v[0] /= sum; io->mod->e_frq->user_b_freq->v[1] /= sum; io->mod->e_frq->user_b_freq->v[2] /= sum; io->mod->e_frq->user_b_freq->v[3] /= sum; if (io->mod->e_frq->user_b_freq->v[0] < .0 || io->mod->e_frq->user_b_freq->v[1] < .0 || io->mod->e_frq->user_b_freq->v[2] < .0 || io->mod->e_frq->user_b_freq->v[3] < .0 || io->mod->e_frq->user_b_freq->v[0] > 1. || io->mod->e_frq->user_b_freq->v[1] > 1. || io->mod->e_frq->user_b_freq->v[2] > 1. || io->mod->e_frq->user_b_freq->v[3] > 1.) { Warn_And_Exit("\n. Invalid base frequencies.\n"); } } else { double val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12, val13, val14, val15, val16, val17, val18, val19, val20; io->mod->e_frq->type = USER; io->mod->e_frq->pi->optimize = NO; io->mod->e_frq->pi_unscaled->optimize = NO; sscanf(optarg, "%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%" "lf,%lf,%lf,%lf,%lf,%lf", &val1, &val2, &val3, &val4, &val5, &val6, &val7, &val8, &val9, &val10, &val11, &val12, &val13, &val14, &val15, &val16, &val17, &val18, &val19, &val20); io->mod->e_frq->user_b_freq->v[0] = (phydbl)val1; io->mod->e_frq->user_b_freq->v[1] = (phydbl)val2; io->mod->e_frq->user_b_freq->v[2] = (phydbl)val3; io->mod->e_frq->user_b_freq->v[3] = (phydbl)val4; io->mod->e_frq->user_b_freq->v[4] = (phydbl)val5; io->mod->e_frq->user_b_freq->v[5] = (phydbl)val6; io->mod->e_frq->user_b_freq->v[6] = (phydbl)val7; io->mod->e_frq->user_b_freq->v[7] = (phydbl)val8; io->mod->e_frq->user_b_freq->v[8] = (phydbl)val9; io->mod->e_frq->user_b_freq->v[9] = (phydbl)val10; io->mod->e_frq->user_b_freq->v[10] = (phydbl)val11; io->mod->e_frq->user_b_freq->v[11] = (phydbl)val12; io->mod->e_frq->user_b_freq->v[12] = (phydbl)val13; io->mod->e_frq->user_b_freq->v[13] = (phydbl)val14; io->mod->e_frq->user_b_freq->v[14] = (phydbl)val15; io->mod->e_frq->user_b_freq->v[15] = (phydbl)val16; io->mod->e_frq->user_b_freq->v[16] = (phydbl)val17; io->mod->e_frq->user_b_freq->v[17] = (phydbl)val18; io->mod->e_frq->user_b_freq->v[18] = (phydbl)val19; io->mod->e_frq->user_b_freq->v[19] = (phydbl)val20; sum = .0; for (int i = 0; i < 20; ++i) sum += io->mod->e_frq->user_b_freq->v[i]; for (int i = 0; i < 20; ++i) io->mod->e_frq->user_b_freq->v[i] /= sum; for (int i = 0; i < 20; ++i) if (io->mod->e_frq->user_b_freq->v[i] > 1. || io->mod->e_frq->user_b_freq->v[i] < 0.) { Warn_And_Exit("\n. Invalid user-defined amino-acid frequencies"); } } } break; } case 'h': case 69: { Usage(); break; } case 'i': case 9: { char *tmp; tmp = (char *)mCalloc(T_MAX_FILE, sizeof(char)); if (strlen(optarg) > T_MAX_FILE - 16) { char choix; strcpy(tmp, "\n. The file name'"); strcat(tmp, optarg); strcat(tmp, "' is too long.\n"); PhyML_Printf("%s", tmp); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else if (!Filexists(optarg)) { char choix; strcpy(tmp, "\n. The file '"); strcat(tmp, optarg); strcat(tmp, "' does not exist.\n"); PhyML_Printf("%s", tmp); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else { strcpy(io->in_align_file, optarg); io->fp_in_align = Openfile(io->in_align_file, 0); strcpy(io->out_file, optarg); strcpy(io->out_tree_file, optarg); #ifdef PHYML strcat(io->out_tree_file, "_phyml_tree"); #elif M4 strcat(io->out_tree_file, "_m4_tree"); #elif PHYREX strcat(io->out_tree_file, "_phyrex_tree"); #endif strcpy(io->out_stats_file, optarg); #ifdef PHYML strcat(io->out_stats_file, "_phyml_stats"); #elif M4 strcat(io->out_stats_file, "_m4_stats"); #elif PHYREX strcat(io->out_stats_file, "_phyrex_stats"); #endif #ifdef PHYREX strcpy(io->out_summary_file, optarg); strcat(io->out_summary_file, "_phyrex_summary"); #endif } Free(tmp); break; } case 't': case 11: { if (opt_m == 0) { PhyML_Fprintf( stderr, "\n. Please use the -m option before -t in the command line."); Exit("\n"); } if ((io->mod->whichmodel != JC69) && (io->mod->whichmodel != F81) && (io->mod->whichmodel != GTR)) { if ((strcmp(optarg, "e") == 0) || (strcmp(optarg, "E") == 0) || (strcmp(optarg, "estimated") == 0) || (strcmp(optarg, "ESTIMATED") == 0)) { io->mod->kappa->v = 4.0; io->mod->kappa->optimize = YES; if (io->mod->whichmodel == TN93) { io->mod->lambda->optimize = YES; } } else { io->mod->kappa->optimize = NO; io->mod->lambda->optimize = NO; // Added the 2 TsTv ratios for TN93 // lambda is the ratio of both TsTv ratios // kappa is the mean of both TsTv ratios if (io->mod->whichmodel == TN93) { double TsTvPur, TsTvPyr; TsTvPur = TsTvPyr = -1.; if (!isalpha(optarg[0])) { sscanf(optarg, "%lf,%lf", &TsTvPur, &TsTvPyr); } else { PhyML_Fprintf(stderr, "\n. The TN93 model requires two ts/tv ratios.\n"); Exit("\n"); } if ((TsTvPur < .0) || (TsTvPyr < .0)) { PhyML_Fprintf(stderr, "\n. ts/tv for purines: %f", TsTvPur); PhyML_Fprintf(stderr, "\n. ts/tv for pyrimidines: %f", TsTvPyr); PhyML_Fprintf(stderr, "\n. The TN93 model requires two ts/tv ratios"); PhyML_Fprintf(stderr, "\n. The command-line option should look " "as follows: ... -t 3.5,4.3 ... "); PhyML_Fprintf(stderr, "\n. The ts/tv ratio must be a positive number.\n"); Exit("\n"); } io->mod->lambda->v = (phydbl)(TsTvPur / TsTvPyr); io->mod->kappa->v = (phydbl)((TsTvPur + TsTvPyr) / 2.); } else { // -- End TN93 rates for purines & pyrimidines if (atof(optarg) < .0) { char choix; PhyML_Printf("\n. The ts/tv ratio must be a positive number\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else { io->mod->kappa->v = (phydbl)atof(optarg); } } } } break; } case 'n': case 8: { if ((!atoi(optarg)) || (atoi(optarg) < 0)) { char choix; PhyML_Printf( "\n. The number of alignments must be a positive integer\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else io->n_data_sets = atoi(optarg); break; } case 'q': case 22: { io->interleaved = NO; break; } case 'u': case 15: { char *tmp; tmp = (char *)mCalloc(T_MAX_FILE, sizeof(char)); if (strlen(optarg) > T_MAX_FILE - 11) { char choix; strcpy(tmp, "\n. The file name'"); strcat(tmp, optarg); strcat(tmp, "' is too long.\n"); PhyML_Printf("%s", tmp); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else if (!Filexists(optarg)) { char choix; strcpy(tmp, "\n. The file '"); strcat(tmp, optarg); strcat(tmp, "' doesn't exist.\n"); PhyML_Printf("%s", tmp); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else { strcpy(io->in_tree_file, optarg); io->in_tree = 2; io->fp_in_tree = Openfile(io->in_tree_file, READ); } Free(tmp); break; } case 'v': case 13: { if ((strcmp(optarg, "e") == 0) || (strcmp(optarg, "E") == 0) || (strcmp(optarg, "estimated") == 0) || (strcmp(optarg, "ESTIMATED") == 0)) { io->mod->ras->pinvar->optimize = YES; io->mod->ras->pinvar->optimize = YES; io->mod->ras->invar = YES; } else if ((atof(optarg) < 0.0) || (atof(optarg) > 1.0)) { char choix; PhyML_Printf("\n. The proportion of invariable site must be a number " "between 0.0 and 1.0\n"); PhyML_Printf("\n. Type any key to exit."); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } else { io->mod->ras->pinvar->v = (phydbl)atof(optarg); if (io->mod->ras->pinvar->v > 0.0 + SMALL) io->mod->ras->invar = YES; else io->mod->ras->invar = NO; io->mod->ras->pinvar->optimize = NO; io->mod->ras->pinvar->optimize = NO; } break; } case 'o': { if (!strcmp(optarg, "tlr")) { io->mod->s_opt->opt_topo = YES; io->mod->s_opt->opt_bl_one_by_one = YES; io->mod->s_opt->opt_subst_param = YES; } else if (!strcmp(optarg, "tl")) { io->mod->s_opt->opt_topo = YES; io->mod->s_opt->opt_bl_one_by_one = YES; io->mod->s_opt->opt_subst_param = NO; } else if (!strcmp(optarg, "t")) { Warn_And_Exit("\n. You can't optimize the topology without adjusting " "branch length too...\n"); } else if (!strcmp(optarg, "lr")) { io->mod->s_opt->opt_topo = NO; io->mod->s_opt->opt_bl_one_by_one = YES; io->mod->s_opt->opt_subst_param = YES; } else if (!strcmp(optarg, "l")) { io->mod->s_opt->opt_topo = NO; io->mod->s_opt->opt_bl_one_by_one = YES; io->mod->s_opt->opt_subst_param = NO; } else if (!strcmp(optarg, "r")) { io->mod->s_opt->opt_topo = NO; io->mod->s_opt->opt_bl_one_by_one = NO; io->mod->s_opt->opt_subst_param = YES; } else if (!strcmp(optarg, "none") || !strcmp(optarg, "n")) { io->mod->s_opt->opt_topo = NO; io->mod->s_opt->opt_bl_one_by_one = NO; io->mod->s_opt->opt_subst_param = NO; } else { char choix; PhyML_Printf("\n. The optimization parameter must be 'tlr' or 'tl' or " "'lr' or 'l' or 'r' or 'n'."); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } break; } case '?': { Exit("\n"); break; } case -1: { break; } default: { Usage(); break; } } } while (c != -1); /* if((io->mod->whichmodel == K80) || (io->mod->whichmodel == JC69)) */ /* { */ /* if(io->mod->s_opt->opt_state_freq) */ /* { */ /* char c; */ /* PhyML_Printf("\n. WARNING: nucleotide frequencies must be set to 1/4 * with this model.\n"); */ /* PhyML_Printf("\n. Type the enter key to resume the analysis.\n"); */ /* scanf("%c",&c); */ /* } */ /* io->mod->s_opt->opt_state_freq = 0; */ /* } */ if (io->mod->s_opt->constrained_br_len == YES) io->mod->s_opt->opt_topo = NO; if (io->do_tbe == YES) { io->do_alrt = NO; io->do_boot = NO; } else { if (io->do_alrt == NO && io->n_boot_replicates > 0) io->do_boot = YES; } #ifndef PHYML if ((open_ps_file) || (io->m4_model == YES)) { strcpy(io->out_ps_file, io->in_align_file); strcat(io->out_ps_file, "_mc_tree.ps"); io->fp_out_ps = Openfile(io->out_ps_file, WRITE); } #endif if (io->datatype == UNDEFINED) io->datatype = NT; if ((io->datatype == NT) && (io->mod->whichmodel > 10)) { char choix; PhyML_Printf("\n. Err.: model incompatible with the data type. Please use " "JC69, K80, F81, HKY, F84, TN93 or GTR\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Warn_And_Exit("\n"); } else if ((io->datatype == AA) && (io->mod->whichmodel < 11)) { char choix; PhyML_Printf("\n. Err.: model incompatible with the data type. Please use " "LG, Dayhoff, JTT, MtREV, WAG, DCMut, RtREV, CpREV, VT, " "Blosum62, MtMam, MtArt, HIVw, HIVb or AB.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } if (io->mod->m4mod != NULL && io->mod->m4mod->alpha->optimize == NO) { io->mod->m4mod->use_cov_alpha = NO; io->mod->m4mod->use_cov_free = YES; } if (io->print_site_lnl && io->fp_in_align != NULL) { strcpy(io->out_lk_file, io->in_align_file); strcat(io->out_lk_file, "_phyml_lk"); if (io->append_run_ID) { strcat(io->out_lk_file, "_"); strcat(io->out_lk_file, io->run_id_string); } strcat(io->out_lk_file, ".txt"); io->fp_out_lk = Openfile(io->out_lk_file, 1); } if (io->print_trace && io->fp_in_align != NULL) { strcpy(io->out_trace_file, io->in_align_file); strcat(io->out_trace_file, "_phyml_trace"); if (io->append_run_ID) { strcat(io->out_trace_file, "_"); strcat(io->out_trace_file, io->run_id_string); } strcat(io->out_trace_file, ".txt"); io->fp_out_trace = Openfile(io->out_trace_file, WRITE); } if (io->print_json_trace && io->fp_in_align != NULL) { strcpy(io->out_json_trace_file, io->in_align_file); strcat(io->out_json_trace_file, "_phyml_trace"); if (io->append_run_ID) { strcat(io->out_json_trace_file, "_"); strcat(io->out_json_trace_file, io->run_id_string); } strcat(io->out_json_trace_file, ".json"); io->fp_out_json_trace = Openfile(io->out_json_trace_file, READWRITE); } if (io->mod->s_opt->random_input_tree && io->fp_in_align != NULL) { strcpy(io->out_trees_file, io->in_align_file); strcat(io->out_trees_file, "_phyml_rand_trees"); if (io->append_run_ID) { strcat(io->out_trees_file, "_"); strcat(io->out_trees_file, io->run_id_string); } strcat(io->out_trees_file, ".txt"); io->fp_out_trees = Openfile(io->out_trees_file, 1); } if ((io->print_boot_trees) && (io->do_boot == YES || io->do_tbe == YES) && (io->fp_in_align != NULL)) { strcpy(io->out_boot_tree_file, io->in_align_file); strcat(io->out_boot_tree_file, "_phyml_boot_trees"); if (io->append_run_ID) { strcat(io->out_boot_tree_file, "_"); strcat(io->out_boot_tree_file, io->run_id_string); } strcat(io->out_boot_tree_file, ".txt"); io->fp_out_boot_tree = Openfile(io->out_boot_tree_file, 1); strcpy(io->out_boot_stats_file, io->in_align_file); strcat(io->out_boot_stats_file, "_phyml_boot_stats"); if (io->append_run_ID) { strcat(io->out_boot_stats_file, "_"); strcat(io->out_boot_stats_file, io->run_id_string); } strcat(io->out_boot_stats_file, ".txt"); io->fp_out_boot_stats = Openfile(io->out_boot_stats_file, 1); } if (io->append_run_ID && io->fp_in_align != NULL) { strcat(io->out_tree_file, "_"); strcat(io->out_stats_file, "_"); strcat(io->out_tree_file, io->run_id_string); strcat(io->out_stats_file, io->run_id_string); } if (io->fp_in_align != NULL) { strcat(io->out_tree_file, ".txt"); strcat(io->out_stats_file, ".txt"); } #ifdef PHYREX strcat(io->out_summary_file, ".txt"); #endif if (io->mod->ras->n_catg == 1) io->mod->ras->alpha->optimize = NO; if (io->mod->s_opt->opt_subst_param == NO) { io->mod->ras->alpha->optimize = NO; io->mod->kappa->optimize = NO; io->mod->lambda->optimize = NO; io->mod->ras->pinvar->optimize = NO; io->mod->r_mat->optimize = NO; io->mod->ras->alpha->optimize = NO; io->mod->kappa->optimize = NO; io->mod->lambda->optimize = NO; io->mod->ras->pinvar->optimize = NO; } if (io->mod->whichmodel != K80 && io->mod->whichmodel != HKY85 && io->mod->whichmodel != F84 && io->mod->whichmodel != TN93) { io->mod->kappa->optimize = NO; } if (io->datatype == AA && io->mod->whichmodel == CUSTOMAA && !io->mod->fp_aa_rate_mat) { PhyML_Printf( "\n. Custom model option with amino-acid requires you to specify a " "rate matrix file through the '--aa_rate_file' option.\n"); Exit("\n"); } #if !defined(PHYTIME) && !defined(TEST) && !defined(EVOLVE) // Make sure you don't erase the input file... if (!strcmp(io->out_tree_file, io->in_align_file) || !strcmp(io->out_stats_file, io->in_align_file)) { PhyML_Fprintf(stderr, "\n. The alignment file '%s' does not seem to exist...", io->in_align_file); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } if (io->fp_in_align != NULL) { io->fp_out_tree = Openfile(io->out_tree_file, writemode); io->fp_out_stats = Openfile(io->out_stats_file, writemode); } #endif #if defined(PHYREX) if (io->fp_in_align != NULL) io->fp_out_summary = Openfile(io->out_summary_file, writemode); #endif if (io->quiet == NO) { PhyML_Printf("\n\n. Command line: "); for (i = 0; i < argc; i++) PhyML_Printf("%s ", argv[i]); } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/cl.h000066400000000000000000000011311501136442400177340ustar00rootroot00000000000000 /* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef CL_H #define CL_H #include #include #include "utilities.h" #include "help.h" #include "models.h" #include "free.h" #include "interface.h" #include "invitee.h" #include "date.h" int Read_Command_Line(option *input, int argc, char **argv); #endif stephaneguindon-phyml-76a39c8/src/cv.c000066400000000000000000000371171501136442400177560ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "cv.h" // Routine for cross validation. phydbl *CV_Tip_Cv(t_tree *tree) { t_edge *b; int obs_d_state, ambiguity_check; char obs_state; int ns, nsncatg, n_otu; phydbl *p_lk_left, *Pij, *state_probs_all_sites, *weights; phydbl sum; short int *truth; if (tree->is_mixt_tree == YES) { MIXT_Cv(tree); return (NULL); } Set_Both_Sides(YES, tree); Lk(NULL, tree); b = NULL; p_lk_left = NULL; state_probs_all_sites = (phydbl *)mCalloc( tree->data->n_pattern * tree->n_otu * tree->mod->ns, sizeof(phydbl)); truth = (short int *)mCalloc(tree->data->n_pattern * tree->n_otu * tree->mod->ns, sizeof(phydbl)); weights = (phydbl *)mCalloc(tree->data->n_pattern * tree->n_otu, sizeof(phydbl)); ns = tree->mod->ns; nsncatg = ns * tree->mod->ras->n_catg; n_otu = tree->n_otu; for (int tax_id = 0; tax_id < tree->n_otu; ++tax_id) { b = tree->a_nodes[tax_id]->b[0]; p_lk_left = b->p_lk_left; Pij = b->Pij_rr; for (int site = 0; site < tree->data->n_pattern; ++site) { if (tree->data->wght[site] > SMALL) { ambiguity_check = tree->a_nodes[tax_id]->c_seq->is_ambigu[site]; if (ambiguity_check == NO) { obs_state = tree->a_nodes[tax_id]->c_seq->state[site]; obs_d_state = tree->a_nodes[tax_id]->c_seq->d_state[site]; tree->a_nodes[tax_id]->c_seq->is_ambigu[site] = YES; tree->a_nodes[tax_id]->c_seq->state[site] = '?'; tree->a_nodes[tax_id]->c_seq->d_state[site] = -1; Init_Partial_Lk_Tips_Double_One_Character(tax_id, site, tree); Br_Len_Opt(&(b->l->v), b, tree); // Optimize_Br_Len_Serie(1000,tree); // Optimiz_All_Free_Param(tree,NO); for (int tip_state = 0; tip_state < ns; ++tip_state) { state_probs_all_sites[site * ns * n_otu + tax_id * ns + tip_state] = 0.0; for (int int_state = 0; int_state < ns; ++int_state) { for (int catg = 0; catg < tree->mod->ras->n_catg; ++catg) { state_probs_all_sites[site * ns * n_otu + tax_id * ns + tip_state] += tree->mod->ras->gamma_r_proba->v[catg] * tree->mod->e_frq->pi->v[tip_state] * Pij[catg * ns * ns + tip_state * ns + int_state] * p_lk_left[catg * ns + int_state]; } } } sum = 0.0; for (int state = 0; state < ns; ++state) sum += state_probs_all_sites[site * ns * n_otu + tax_id * ns + state]; for (int state = 0; state < ns; ++state) state_probs_all_sites[site * ns * n_otu + tax_id * ns + state] /= sum; for (int state = 0; state < ns; ++state) truth[site * ns * n_otu + tax_id * ns + state] = 0; truth[site * ns * n_otu + tax_id * ns + obs_d_state] = 1; PhyML_Printf("\n###%s,%s,%d,%g", tree->mod->modelname->s, tree->a_nodes[tax_id]->name, site, log(state_probs_all_sites[site * ns * n_otu + tax_id * ns + obs_d_state])); tree->a_nodes[tax_id]->c_seq->state[site] = obs_state; tree->a_nodes[tax_id]->c_seq->d_state[site] = obs_d_state; tree->a_nodes[tax_id]->c_seq->is_ambigu[site] = NO; Init_Partial_Lk_Tips_Double_One_Character(tax_id, site, tree); } } p_lk_left += nsncatg; } } for (int tax_id = 0; tax_id < tree->n_otu; ++tax_id) for (int site = 0; site < tree->data->n_pattern; ++site) weights[site * tree->n_otu + tax_id] = tree->data->wght[site]; // for (int tax_id = 0; tax_id < tree->n_otu; ++tax_id) // for (int site = 0; site < tree->n_pattern; ++site) // for (int state = 0; state < tree->mod->ns; ++state) // { // PhyML_Printf("\n. CV tax: %s site: %d state: %d prob: %f truth: %d weight: %f", // tree->a_nodes[tax_id]->name, site, state, // state_probs_all_sites[site * tree->n_otu * tree->mod->ns + // tax_id * tree->mod->ns + state], // truth[site * tree->n_otu * tree->mod->ns + // tax_id * tree->mod->ns + state], // weights[site * tree->n_otu + tax_id]); // } ROC(state_probs_all_sites, truth, ns, tree->n_otu * tree->data->n_pattern, weights, tree->mod->modelname->s,NULL); Free(weights); return (state_probs_all_sites); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Mask positions uniformly at random (more than one position may // be masked at any given site) void CV_Hide_Align_At_Random_Pos(calign *data, phydbl mask_prob) { phydbl u; data->n_masked = 0; for (int site = 0; site < data->n_pattern; ++site) { for (int tax_id = 0; tax_id < data->n_otu; ++tax_id) { u = Uni(); if (!(u > mask_prob)) { data->c_seq[tax_id]->state[site] = '?'; data->c_seq[tax_id]->d_state[site] = -1; data->c_seq[tax_id]->is_ambigu[site] = YES; if (data->n_masked == 0) data->masked_pos = (int *)mCalloc(1, sizeof(int)); else data->masked_pos = (int *)mRealloc(data->masked_pos, data->n_masked + 1, sizeof(int)); data->masked_pos[data->n_masked] = tax_id * data->n_pattern + site; data->n_masked++; } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Mask exactly one position per site void CV_Hide_Align_At_Random_One_Per_Site(calign *data) { int tax_id; data->n_masked = 0; for (int site = 0; site < data->n_pattern; ++site) { tax_id = Rand_Int(0, data->n_otu - 1); data->c_seq[tax_id]->state[site] = '?'; data->c_seq[tax_id]->d_state[site] = -1; data->c_seq[tax_id]->is_ambigu[site] = YES; if (data->n_masked == 0) data->masked_pos = (int *)mCalloc(1, sizeof(int)); else data->masked_pos = (int *)mRealloc(data->masked_pos, data->n_masked + 1, sizeof(int)); data->masked_pos[data->n_masked] = tax_id * data->n_pattern + site; data->n_masked++; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void CV_Hide_Align_At_Random_Col(calign *data, phydbl mask_prob) { phydbl u; data->n_masked = 0; for (int site = 0; site < data->n_pattern; ++site) { u = Uni(); if (!(u > mask_prob)) { for (int tax_id = 0; tax_id < data->n_otu; ++tax_id) { data->c_seq[tax_id]->state[site] = '?'; data->c_seq[tax_id]->d_state[site] = -1; data->c_seq[tax_id]->is_ambigu[site] = YES; } assert(data->n_masked >= 0); if (data->n_masked == 0) { data->masked_pos = (int *)mCalloc(1, sizeof(int)); } else { data->masked_pos = (int *)mRealloc(data->masked_pos, data->n_masked + 1, sizeof(int)); } data->masked_pos[data->n_masked] = site; data->n_masked++; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void CV_Hide_Align_At_Given_Pos(calign *data, int tax_id, int site) { data->c_seq[tax_id]->state[site] = '?'; data->c_seq[tax_id]->d_state[site] = -1; data->c_seq[tax_id]->is_ambigu[site] = YES; assert(data->n_masked >= 0); if (data->n_masked == 0) data->masked_pos = (int *)mCalloc(1, sizeof(int)); else data->masked_pos = (int *)mRealloc(data->masked_pos, data->n_masked + 1, sizeof(int)); data->masked_pos[data->n_masked] = tax_id * data->n_pattern + site; data->n_masked++; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void CV_State_Probs_At_Hidden_Positions(phydbl **state_probs, short int **truth, phydbl **site_loglk, phydbl **weights, int *n_prob_vectors, t_tree *tree) { int tax_id, site; for (int m = 0; m < tree->data->n_masked; ++m) { tax_id = floor((phydbl)tree->data->masked_pos[m] / tree->data->n_pattern); site = tree->data->masked_pos[m] - tax_id * tree->data->n_pattern; CV_State_Probs_Core(state_probs, truth, site_loglk, weights, n_prob_vectors, tax_id, site, tree->data->c_seq[tax_id]->d_state[site], tree->data->wght[site], tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void CV_State_Probs_Core(phydbl **state_probs, short int **truth, phydbl **site_loglk, phydbl **weights, int *n_prob_vectors, int tax_id, int site, int true_d_state, phydbl patt_weight, t_tree *tree) { int ns; phydbl *Pij, *p_lk_left, sum; t_tree *ori_tree; ori_tree = tree; ns = tree->mod->ns; assert(*n_prob_vectors >= 0); if (*n_prob_vectors == 0) { (*state_probs) = (phydbl *)mCalloc(ns, sizeof(phydbl)); (*site_loglk) = (phydbl *)mCalloc(1, sizeof(phydbl)); (*truth) = (short int *)mCalloc(ns, sizeof(short int)); (*weights) = (phydbl *)mCalloc(1, sizeof(phydbl)); } else { (*state_probs) = (phydbl *)mRealloc( *state_probs, (*n_prob_vectors + 1) * ns, sizeof(phydbl)); (*site_loglk) = (phydbl *)mRealloc(*site_loglk, *n_prob_vectors + 1, sizeof(phydbl)); (*truth) = (short int *)mRealloc(*truth, (*n_prob_vectors + 1) * ns, sizeof(short int)); (*weights) = (phydbl *)mRealloc(*weights, *n_prob_vectors + 1, sizeof(phydbl)); } for (int tip_state = 0; tip_state < ns; ++tip_state) (*truth)[*n_prob_vectors * ns + tip_state] = 0; assert(true_d_state >= 0); (*truth)[*n_prob_vectors * ns + true_d_state] = 1; (*weights)[*n_prob_vectors] = patt_weight; (*site_loglk)[*n_prob_vectors] = tree->c_lnL_sorted[site]; if (tree->is_mixt_tree == YES) { phydbl r_mat_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(tree->next->mod->r_mat_weight); phydbl e_frq_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(tree->next->mod->e_frq_weight); phydbl sum_probas = MIXT_Get_Sum_Of_Probas_Across_Mixtures( r_mat_weight_sum, e_frq_weight_sum, tree); for (int tip_state = 0; tip_state < ns; ++tip_state) (*state_probs)[*n_prob_vectors * ns + tip_state] = 0.0; tree = tree->next; do { Pij = tree->a_nodes[tax_id]->b[0]->Pij_rr; p_lk_left = tree->a_nodes[tax_id]->b[0]->p_lk_left + site * ns; // PhyML_Printf("\n. site: %d ncatg: %d p: %f rr: %f truth: %d p_lk_left: %g %g %g %g Pij: %f %f %f %f", // site, // tree->mixt_tree->mod->ras->n_catg, // tree->mixt_tree->mod->ras->gamma_r_proba // ->v[tree->mod->ras->parent_class_number], // tree->mixt_tree->mod->ras->gamma_rr // ->v[tree->mod->ras->parent_class_number], // tree->data->c_seq[tax_id]->d_state[site], // p_lk_left[0], p_lk_left[1], // p_lk_left[2], p_lk_left[3], // Pij[tree->data->c_seq[tax_id]->d_state[site] * ns + 0], // Pij[tree->data->c_seq[tax_id]->d_state[site] * ns + 1], // Pij[tree->data->c_seq[tax_id]->d_state[site] * ns + 2], // Pij[tree->data->c_seq[tax_id]->d_state[site] * ns + 3]); for (int tip_state = 0; tip_state < ns; ++tip_state) { for (int int_state = 0; int_state < ns; ++int_state) { (*state_probs)[*n_prob_vectors * ns + tip_state] += tree->mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number] * tree->mod->r_mat_weight->v / r_mat_weight_sum * tree->mod->e_frq_weight->v / e_frq_weight_sum / sum_probas * tree->mod->e_frq->pi->v[tip_state] * Pij[tip_state * ns + int_state] * p_lk_left[int_state]; } } tree = tree->next; } while (tree != NULL && tree->is_mixt_tree == NO); // We only consider one partition element here. // Calls to this function are required for every // partition element. tree = ori_tree; } else { Pij = tree->a_nodes[tax_id]->b[0]->Pij_rr; p_lk_left = tree->a_nodes[tax_id]->b[0]->p_lk_left + site * ns * tree->mod->ras->n_catg; for (int tip_state = 0; tip_state < ns; ++tip_state) (*state_probs)[*n_prob_vectors * ns + tip_state] = 0.0; for (int tip_state = 0; tip_state < ns; ++tip_state) { for (int int_state = 0; int_state < ns; ++int_state) { for (int catg = 0; catg < tree->mod->ras->n_catg; ++catg) { (*state_probs)[*n_prob_vectors * ns + tip_state] += tree->mod->ras->gamma_r_proba->v[catg] * tree->mod->e_frq->pi->v[tip_state] * Pij[catg * ns * ns + tip_state * ns + int_state] * p_lk_left[catg * ns + int_state]; } } } } sum = 0.0; for (int tip_state = 0; tip_state < ns; ++tip_state) sum += (*state_probs)[*n_prob_vectors * ns + tip_state]; // PhyML_Printf("\n>>> sum: %f", sum); for (int tip_state = 0; tip_state < ns; ++tip_state) (*state_probs)[*n_prob_vectors * ns + tip_state] /= sum; // PhyML_Printf("\n>>> state_probs: %f %f %f %f truth: %d", // (*state_probs)[*n_prob_vectors * ns + 0], // (*state_probs)[*n_prob_vectors * ns + 1], // (*state_probs)[*n_prob_vectors * ns + 2], // (*state_probs)[*n_prob_vectors * ns + 3], // tree->data->c_seq[tax_id]->d_state[site]); *n_prob_vectors += 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void CV_Score_At_Hidden_Cols(phydbl **site_loglk, phydbl **weights, int *n_prob_vectors, t_tree *tree) { int site; for (int m = 0; m < tree->data->n_masked; ++m) { site = tree->data->masked_pos[m]; // PhyML_Printf("\n. CV prob @ site %d", site); assert(*n_prob_vectors >= 0); if (*n_prob_vectors == 0) { (*site_loglk) = (phydbl *)mCalloc(1, sizeof(phydbl)); (*weights) = (phydbl *)mCalloc(1, sizeof(phydbl)); } else { (*site_loglk) = (phydbl *)mRealloc(*site_loglk, *n_prob_vectors + 1, sizeof(phydbl)); (*weights) = (phydbl *)mRealloc(*weights, *n_prob_vectors + 1, sizeof(phydbl)); } (*site_loglk)[*n_prob_vectors] = tree->c_lnL_sorted[site]; (*weights)[*n_prob_vectors] = tree->data->wght[site]; // PhyML_Printf(" lnL: %15g w: %12f #: %d site: %d", (*site_loglk)[*n_prob_vectors], // (*weights)[*n_prob_vectors],*n_prob_vectors,site); (*n_prob_vectors)++; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/cv.h000066400000000000000000000024451501136442400177570ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef CV_H #define CV_H #include "utilities.h" phydbl *CV_Tip_Cv(t_tree *tree); void CV_State_Probs_At_Hidden_Positions(phydbl **state_probs, short int **truth, phydbl **site_loglk, phydbl **weights, int *n_prob_vectors, t_tree *tree); void CV_Hide_Align_At_Random_Pos(calign *data, phydbl mask_prob); void CV_Hide_Align_At_Random_Col(calign *data, phydbl mask_prob); void CV_Hide_Align_At_Given_Pos(calign *data, int tax_id, int site); void CV_Hide_Align_At_Random_One_Per_Site(calign *data); void CV_State_Probs_Core(phydbl **state_probs, short int **truth, phydbl **site_loglk, phydbl **weights, int *n_prob_vectors, int tax_id, int site, int true_d_state, phydbl patt_weight, t_tree *tree); void CV_Score_At_Hidden_Cols(phydbl **site_loglk, phydbl **weights, int *n_prob_vectors, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/date.c000066400000000000000000001403571501136442400202640ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines for molecular dating */ #include "date.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) int DATE_Main(int argc, char **argv) { option *io; io = Get_Input(argc,argv); Free(io); return(0); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) void DATE_XML(char *xml_filename) { FILE *fp_xml_in; xml_node *xnd,*xroot; t_tree *mixt_tree,*tree; phydbl *res; int seed; char *dum_string; mixt_tree = XML_Process_Base(xml_filename); assert(mixt_tree); mixt_tree->rates = RATES_Make_Rate_Struct(mixt_tree->n_otu); RATES_Init_Rate_Struct(mixt_tree->rates,NULL,mixt_tree->n_otu); mixt_tree->times = TIMES_Make_Time_Struct(mixt_tree->n_otu); TIMES_Init_Time_Struct(mixt_tree->times,NULL,mixt_tree->n_otu); tree = mixt_tree; do { // All rate stuctures point to the same object tree->rates = mixt_tree->rates; tree = tree->next; } while(tree); fp_xml_in = fopen(xml_filename,"r"); if(!fp_xml_in) { PhyML_Fprintf(stderr,"\n. Could not find the XML file '%s'.\n",xml_filename); Exit("\n"); } /* xroot = XML_Load_File(fp_xml_in); */ xroot = mixt_tree->xml_root; if(xroot == NULL) { PhyML_Fprintf(stderr,"\n. Encountered an issue while loading the XML file.\n"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } xnd = XML_Search_Node_Name("phytime",NO,xroot); if(xnd == NULL) { PhyML_Fprintf(stderr,"\n. Cound not find the \"root\" of the XML file (it should have \'phytime\' as tag name).\n"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } dum_string = XML_Get_Attribute_Value(xnd,"mcmc.chain.len"); if(dum_string != NULL) mixt_tree->io->mcmc->chain_len = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.sample.every"); if(dum_string != NULL) mixt_tree->io->mcmc->sample_interval = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.print.every"); if(dum_string != NULL) mixt_tree->io->mcmc->print_every = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.burnin"); if(dum_string != NULL) mixt_tree->io->mcmc->chain_len_burnin = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"ignore.sequences"); if(dum_string != NULL) mixt_tree->eval_alnL = NO; dum_string = XML_Get_Attribute_Value(xnd,"ignore.seq"); if(dum_string != NULL) mixt_tree->eval_alnL = NO; dum_string = XML_Get_Attribute_Value(xnd,"ignore.data"); if(dum_string != NULL) mixt_tree->eval_alnL = NO; dum_string = XML_Get_Attribute_Value(xnd,"mutmap"); if(dum_string != NULL) { int select = XML_Validate_Attr_Int(dum_string,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->io->mutmap = YES; else mixt_tree->io->mutmap = NO; } // Looking for XML node with rate-across-lineage info xnd = XML_Search_Node_Name("lineagerates",YES,xroot); if(xnd == NULL) { PhyML_Fprintf(stdout,"\n. The model of rate variation across lineages is not specified."); PhyML_Fprintf(stdout,"\n. Using the geometric Brownian model (see Guindon, 2012, Syst. Biol.).\n"); mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"geometric Brownian"); } else { char *model_name; model_name = XML_Get_Attribute_Value(xnd,"model"); if(model_name == NULL) { PhyML_Fprintf(stderr,"\n. Please specify a model of rate variation across lineages,"); PhyML_Fprintf(stderr,"\n. e.g., ."); PhyML_Fprintf(stderr,"\n. See the manual for more options."); assert(FALSE); } else { if(!strcmp(model_name,"geometricbrownian")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"integrated"); } else if(!strcmp(model_name,"geometric")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"integrated"); } else if(!strcmp(model_name,"integrated")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"integrated"); } else if(!strcmp(model_name,"geo")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"integrated"); } else if(!strcmp(model_name,"lognormal")) { mixt_tree->rates->model_id = LOGNORMAL; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"lognormal (uncorrelated)"); } else if(!strcmp(model_name,"normal")) { mixt_tree->rates->model_id = LOGNORMAL; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"lognormal (uncorrelated)"); } else if(!strcmp(model_name,"strictclock")) { mixt_tree->rates->model_id = STRICTCLOCK; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"strict clock"); } else if(!strcmp(model_name,"clock")) { mixt_tree->rates->model_id = STRICTCLOCK; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"strict clock"); } else if(!strcmp(model_name,"thorne")) { mixt_tree->rates->model_id = THORNE; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"autocorrelated"); } else if(!strcmp(model_name,"autocorrelated")) { mixt_tree->rates->model_id = THORNE; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"autocorrelated"); } else if(!strcmp(model_name,"autocorr")) { mixt_tree->rates->model_id = THORNE; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"autocorrelated"); } else { assert(FALSE); } } } // Looking for XML node with rate-across-lineage info xnd = XML_Search_Node_Name("clockrate",YES,xroot); if(xnd != NULL) { char *clock_r; clock_r = XML_Get_Attribute_Value(xnd,"value"); if(clock_r == NULL) clock_r = XML_Get_Attribute_Value(xnd,"clock.val"); if(clock_r == NULL) clock_r = XML_Get_Attribute_Value(xnd,"val"); if(clock_r != NULL) { mixt_tree->rates->clock_r = String_To_Dbl(clock_r); for(int i=0;i<2*mixt_tree->n_otu-1;++i) { mixt_tree->rates->br_r[i] = mixt_tree->rates->clock_r; mixt_tree->rates->nd_r[i] = mixt_tree->rates->clock_r; } } char *opt_clock; opt_clock = XML_Get_Attribute_Value(xnd,"optimise.clock"); if(opt_clock == NULL) opt_clock = XML_Get_Attribute_Value(xnd,"optimize.clock"); if(opt_clock == NULL) opt_clock = XML_Get_Attribute_Value(xnd,"optimize.rate"); if(opt_clock == NULL) opt_clock = XML_Get_Attribute_Value(xnd,"opt.clock"); if(opt_clock != NULL) { int select = XML_Validate_Attr_Int(opt_clock,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->mod->s_opt->opt_clock_r = YES; else mixt_tree->mod->s_opt->opt_clock_r = NO; } } // Looking for calibration info xnd = XML_Search_Node_Name("calibration",YES,xroot); if(xnd == NULL) { PhyML_Fprintf(stderr,"\n. No calibration information seems to be provided."); PhyML_Fprintf(stderr,"\n. Please amend your XML file. \n"); assert(FALSE); } else { assert(xnd->child); if(XML_Search_Node_Name("upper",NO,xnd->child) == NULL && XML_Search_Node_Name("lower",NO,xnd->child) == NULL) { PhyML_Fprintf(stderr,"\n. There is no calibration information provided. \n"); PhyML_Fprintf(stderr,"\n. Please check your data. \n"); assert(FALSE); } } /* MIXT_Check_Model_Validity(mixt_tree); */ /* MIXT_Init_Model(mixt_tree); */ /* Print_Data_Structure(NO,stdout,mixt_tree); */ /* tree = MIXT_Starting_Tree(mixt_tree); */ /* Copy_Tree(tree,mixt_tree); */ /* Free_Tree(tree); */ /* MIXT_Connect_Cseqs_To_Nodes(mixt_tree); */ /* MIXT_Init_T_Beg(mixt_tree); */ /* MIXT_Chain_Edges(mixt_tree); */ /* MIXT_Chain_Nodes(mixt_tree); */ /* MIXT_Make_Tree_For_Pars(mixt_tree); */ /* MIXT_Make_Tree_For_Lk(mixt_tree); */ /* MIXT_Make_Spr(mixt_tree); */ /* MIXT_Chain_All(mixt_tree); */ /* Add_Root(mixt_tree->a_edges[0],mixt_tree); */ /* MIXT_Check_Edge_Lens_In_All_Elem(mixt_tree); */ /* MIXT_Turn_Branches_OnOff_In_All_Elem(ON,mixt_tree); */ /* MIXT_Check_Invar_Struct_In_Each_Partition_Elem(mixt_tree); */ /* MIXT_Check_RAS_Struct_In_Each_Partition_Elem(mixt_tree); */ /* XML_Read_Calibration(xroot,mixt_tree); */ /* MIXT_Chain_Cal(mixt_tree); */ seed = (mixt_tree->io->r_seed < 0)?(time(NULL)):(mixt_tree->io->r_seed); srand(seed); mixt_tree->io->r_seed = seed; MIXT_Check_Model_Validity(mixt_tree); MIXT_Chain_Models(mixt_tree); Init_Model(mixt_tree->mod->io->cdata,mixt_tree->mod,mixt_tree->mod->io); Set_Model_Parameters(mixt_tree->mod); Print_Data_Structure(NO,stdout,mixt_tree); tree = MIXT_Starting_Tree(mixt_tree); Add_Root(tree->a_edges[0],tree); Copy_Tree(tree,mixt_tree); Free_Tree(tree); Copy_Tree(mixt_tree,mixt_tree->next); Connect_CSeqs_To_Nodes(mixt_tree->mod->io->cdata,mixt_tree->mod->io,mixt_tree); Init_T_Beg(mixt_tree); Make_Tree_For_Lk(mixt_tree); Make_Tree_For_Pars(mixt_tree); Make_Spr(mixt_tree); MIXT_Chain_All(mixt_tree); MIXT_Check_Edge_Lens_In_All_Elem(mixt_tree); MIXT_Turn_Branches_OnOff_In_All_Elem(ON,mixt_tree); MIXT_Check_Invar_Struct_In_Each_Partition_Elem(mixt_tree); MIXT_Check_RAS_Struct_In_Each_Partition_Elem(mixt_tree); XML_Read_Calibration(xroot,mixt_tree); MIXT_Chain_Cal(mixt_tree); res = DATE_MCMC(mixt_tree); // Cleaning up... RATES_Free_Rates(mixt_tree->rates); RATES_Free_Rates(mixt_tree->aux_tree[0]->rates); TIMES_Free_Times(mixt_tree->times); TIMES_Free_Times(mixt_tree->aux_tree[0]->times); MCMC_Free_MCMC(mixt_tree->mcmc); MCMC_Free_MCMC(mixt_tree->aux_tree[0]->mcmc); Free_Mmod(mixt_tree->mmod); Free_Spr_List_One_Edge(mixt_tree); Free_Tree_Pars(mixt_tree); Free_Tree_Lk(mixt_tree); if(mixt_tree->io->fp_out_trees) fclose(mixt_tree->io->fp_out_trees); if(mixt_tree->io->fp_out_tree) fclose(mixt_tree->io->fp_out_tree); if(mixt_tree->io->fp_out_stats) fclose(mixt_tree->io->fp_out_stats); if(mixt_tree->io->fp_out_json_trace) fclose(mixt_tree->io->fp_out_json_trace); Free_Input(mixt_tree->io); tree = mixt_tree; do { Free_Calign(tree->data); tree = tree->next_mixt; } while(tree); tree = mixt_tree; do { Free_Optimiz(tree->mod->s_opt); tree = tree->next; } while(tree); Free_Model_Complete(mixt_tree->mod); Free_Model_Basic(mixt_tree->mod); Free_Tree(mixt_tree->aux_tree[0]); Free(mixt_tree->aux_tree); Free_Tree(mixt_tree); Free(res); XML_Free_XML_Tree(xroot); fclose(fp_xml_in); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update t_prior_min and t_prior_max on a given ranked tree // given (primary and secondary) calibration information. // Make sure secondary and primary calibration are up-to-date void DATE_Update_T_Prior_MinMax(t_tree *tree) { int i,j; for(i=0;i<2*tree->n_otu-1;++i) // All nodes { tree->times->t_prior_max[i] = +INFINITY; tree->times->t_prior_min[i] = -INFINITY; if(tree->a_nodes[i]->n_cal > 0) // Primary calibration found on that node { for(j=0;ja_nodes[i]->n_cal;++j) { tree->times->t_prior_max[i] = MIN(tree->times->t_prior_max[i],tree->a_nodes[i]->cal[j]->upper); tree->times->t_prior_min[i] = MAX(tree->times->t_prior_min[i],tree->a_nodes[i]->cal[j]->lower); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DATE_Assign_Primary_Calibration(t_tree *tree) { int i,j,idx,node_num; t_clad *clade; t_cal *cal; clade = NULL; cal = NULL; for(i=0;itimes->n_cal;++i) { cal = tree->times->a_cal[i]; if(cal->clade_list != NULL) { clade = cal->clade_list[cal->current_clade_idx]; clade->target_nd = NULL; } } for(i=0;i<2*tree->n_otu-1;++i) for(j=0;ja_nodes[i]->cal[j] = NULL; tree->a_nodes[i]->n_cal = 0; } for(i=0;itimes->n_cal;++i) { cal = tree->times->a_cal[i]; if(cal->clade_list != NULL) { clade = cal->clade_list[cal->current_clade_idx]; node_num = Find_Clade(clade->tax_list, clade->n_tax, tree); clade->target_nd = tree->a_nodes[node_num]; idx = tree->a_nodes[node_num]->n_cal; tree->a_nodes[node_num]->cal[idx] = tree->times->a_cal[i]; tree->a_nodes[node_num]->n_cal++; if(tree->a_nodes[node_num]->n_cal == MAX_N_CAL) { PhyML_Fprintf(stderr,"\n. A node cannot have more than %d calibration",MAX_N_CAL); PhyML_Fprintf(stderr,"\n. constraints attached to it. Feel free to increase the"); PhyML_Fprintf(stderr,"\n. value of the variable MAX_N_CAL in utilities.h if"); PhyML_Fprintf(stderr,"\n. necessary."); Exit("\n"); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Return splitted calibration intervals. Make sure all primary // and secondary calibration intervals are up-to-date. phydbl *DATE_Splitted_Calibration(t_tree *tree) { phydbl *minmax,*splitted_cal,buff; int i,len,done; // One t_prior_min and one t_prior_max per internal nodes except root, so // 2 x # of internal nodes boundaries in total at most. minmax = (phydbl *)mCalloc(2*(tree->n_otu-2),sizeof(phydbl)); For(i,2*(tree->n_otu-2)) minmax[i] = +INFINITY; splitted_cal = (phydbl *)mCalloc((int)(4*tree->n_otu-10),sizeof(phydbl)); len = 0; for(i = tree->n_otu; i < 2*tree->n_otu-1; i++) { if(tree->a_nodes[i] != tree->n_root) { minmax[len] = MAX(tree->times->t_prior_min[i],tree->times->nd_t[tree->n_root->num]); minmax[len+1] = tree->times->t_prior_max[i]; len+=2; } } // Bubble sort of all these times in increasing order do { done = YES; for(i=0;i minmax[i+1]) { buff = minmax[i]; minmax[i] = minmax[i+1]; minmax[i+1] = buff; done = NO; } } } while(done == NO); for(i=0;i minmax[i+1])); // Remove ties for(i=0;i minmax[i+1]) { buff = minmax[i]; minmax[i] = minmax[i+1]; minmax[i+1] = buff; done = NO; } } } while(done == NO); splitted_cal[0] = minmax[0]; len = 1; for(i = 1; i < 2*(tree->n_otu-2); i++) { splitted_cal[len] = minmax[i]; if(len+1 < 4*tree->n_otu-10) splitted_cal[len+1] = minmax[i]; len+=2; } /* For(i,4*tree->n_otu-10) PhyML_Printf("\n. split -- %3d %12f",i,splitted_cal[i]); */ Free(minmax); return splitted_cal; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl DATE_J_Sum_Product(t_tree *tree) { phydbl prod, total,*splitted_cal; int fact,idx,ans,rk; DATE_Assign_Primary_Calibration(tree); DATE_Update_T_Prior_MinMax(tree); splitted_cal = DATE_Splitted_Calibration(tree); ans = 0; total = 0.0; idx = 0; rk = 1; do { prod = 1.0; fact = 1; ans = DATE_J_Sum_Product_Pre(tree->a_nodes[tree->times->t_rank[rk]], // Oldest node after root (as rk=1) idx, -1, prod,fact,&total,splitted_cal,rk,tree); idx+=2; } while(ans != 1); Free(splitted_cal); return(total); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int DATE_J_Sum_Product_Pre(t_node *d, int split_idx_d, int split_idx_a, phydbl prod, int fact, phydbl *total, phydbl *splitted_cal, int rk, t_tree *tree) { int ans,idx; ans = DATE_Is_Split_Accessible(d,split_idx_d,splitted_cal,tree); switch(ans) { case 1 : // split interval is younger than t_prior_max. No need to go further. { return ans; break; } case 0 : // split interval is within [t_prior_min,t_prior_max] { int local_ans; // Calculate J for this time interval prod *= DATE_J(tree->times->birth_rate, tree->times->death_rate, FABS(splitted_cal[split_idx_d+1]), FABS(splitted_cal[split_idx_d])); // Remove factorial term from current product prod *= fact; if(split_idx_d == split_idx_a) fact++; else fact = 1; prod /= fact; if(tree->times->t_rank[tree->n_otu-2] == d->num) // Youngest internal node { (*total) += prod; return 0; } idx = split_idx_d; do { local_ans = DATE_J_Sum_Product_Pre(tree->a_nodes[tree->times->t_rank[rk+1]], idx, split_idx_d, prod,fact,total,splitted_cal,rk+1,tree); idx+=2; } while(local_ans == 0); break; } case -1 : // split interval is older than t_prior_min. Move forward. { int local_ans; // Advance to younger split intervals and stop once you're in idx = split_idx_d+2; do { local_ans = DATE_J_Sum_Product_Pre(d, idx, idx+1, prod,fact,total,splitted_cal,rk,tree); idx+=2; } while(local_ans == -1); break; } } return ans; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int DATE_Is_Split_Accessible(t_node *d, int which, phydbl *splitted_cal, t_tree *tree) { phydbl eps; assert(d->tax == NO); eps = FABS(tree->times->t_prior_min[d->num]) / 1.E+6; assert(eps > MDBL_MIN); // Upper and lower bound of splitted calibration interval are equal to zero if(Are_Equal(splitted_cal[which],0.0,eps) && Are_Equal(splitted_cal[which+1],0.0,eps)) return +1; if(Are_Equal(tree->times->t_prior_min[d->num],splitted_cal[which],eps) || Are_Equal(tree->times->t_prior_max[d->num],splitted_cal[which+1],eps) || (tree->times->t_prior_min[d->num] < splitted_cal[which] && tree->times->t_prior_max[d->num] > splitted_cal[which+1])) return 0; // splitted interval is within [t_prior_min,t_prior_max] else if(Are_Equal(tree->times->t_prior_max[d->num],splitted_cal[which],eps) || splitted_cal[which] > tree->times->t_prior_max[d->num]) return +1; // splitted interval is younger than [t_prior_min,t_prior_max] else if(Are_Equal(tree->times->t_prior_min[d->num],splitted_cal[which+1],eps) || splitted_cal[which+1] < tree->times->t_prior_min[d->num]) return -1; // splitted interval is older than [t_prior_min,t_prior_max] else { PhyML_Printf("\n. d->num: %d d->tax: %d",d->num,d->tax); PhyML_Printf("\n. t_prior_min: %f t_prior_max: %f", tree->times->t_prior_min[d->num], tree->times->t_prior_max[d->num]); PhyML_Printf("\n. splitted_cal_min: %f splitted_cal_max: %f", splitted_cal[which], splitted_cal[which+1]); PhyML_Printf("\n"); assert(FALSE); // splitted interval cannot be partially overlapping [t_prior_min,t_prior_max] } return(0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl DATE_J(phydbl birth_r, phydbl death_r, phydbl t_min, phydbl t_pls) { phydbl d,b,J; assert(t_pls > t_min); d = death_r; b = birth_r; J = (b-d)*(exp(t_min*d+t_pls*b) - exp(t_min*b+t_pls*d)); J /= ((b*exp(t_min*b)-d*exp(t_min*d)) * (b*exp(t_pls*b)-d*exp(t_pls*d))); /* printf(" J : %f",J); */ return(J); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int DATE_Check_Calibration_Constraints(t_tree *tree) { int i,j; phydbl lower,upper; lower = upper = -1.; For(i,2*tree->n_otu-1) { if(tree->a_nodes[i]->n_cal > 1) { lower = tree->a_nodes[i]->cal[0]->lower; upper = tree->a_nodes[i]->cal[0]->upper; for(j=1; j < tree->a_nodes[i]->n_cal; j++) { lower = MAX(lower,tree->a_nodes[i]->cal[j]->lower); upper = MIN(upper,tree->a_nodes[i]->cal[j]->upper); if(upper < lower) { /* PhyML_Printf("\n. Inconsistency detected on node %d",i); */ return 0; } } } } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Check that time constraints are satisfied. Note: it is a // requirement to verify that the age of the root node is also // within correct boundaries int DATE_Check_Time_Constraints(t_tree *tree) { for(int i=0;i<2*tree->n_otu-1;++i) { if(tree->a_nodes[i]->tax == NO) { if(tree->times->nd_t[i] > tree->times->t_prior_max[i] || tree->times->nd_t[i] < tree->times->t_prior_min[i]) { /* PhyML_Printf("\n!!! Node %d t: %f min:%f max:%f", */ /* i, */ /* tree->times->nd_t[i], */ /* tree->times->t_prior_min[i], */ /* tree->times->t_prior_max[i]); */ return 0; } } } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) phydbl *DATE_MCMC(t_tree *tree) { t_mcmc *mcmc; char *s_tree; int move, n_vars, i, j, adjust_len; phydbl u; phydbl *res; FILE *fp_stats,*fp_tree; int t_beg; t_beg = (int)time(NULL); fp_stats = tree->io->fp_out_stats; fp_tree = tree->io->fp_out_tree; if(tree->io->mutmap == YES) Make_MutMap(tree); TIMES_Randomize_Tree_With_Time_Constraints(tree->times->a_cal[0],tree); MIXT_Propagate_Tree_Update(tree); mcmc = MCMC_Make_MCMC_Struct(); tree->mcmc = mcmc; MCMC_Init_MCMC_Struct(NULL,NULL,mcmc); MCMC_Complete_MCMC(mcmc,tree); MCMC_Randomize_Birth(tree); MCMC_Randomize_Death(tree); MCMC_Randomize_Clock_Rate(tree); MCMC_Randomize_Rate_Across_Sites(tree); MCMC_Randomize_Rates(tree); n_vars = 10; adjust_len = tree->io->mcmc->chain_len_burnin; mcmc->sample_interval = tree->io->mcmc->sample_interval; mcmc->print_every = tree->io->mcmc->print_every; mcmc->chain_len = tree->io->mcmc->chain_len; mcmc->chain_len_burnin = tree->io->mcmc->chain_len_burnin; tree->rates->bl_from_rt = YES; res = (phydbl *)mCalloc(tree->mcmc->chain_len / tree->mcmc->sample_interval * n_vars,sizeof(phydbl)); Set_Both_Sides(YES,tree); Set_Update_Eigen(YES,tree->mod); Lk(NULL,tree); Set_Update_Eigen(NO,tree->mod); RATES_Lk(tree); DATE_Assign_Primary_Calibration(tree); TIMES_Lk(tree); /* Time_To_Branch(tree); */ /* tree->bl_ndigits = 1; */ /* printf("\n. Random init tree: %s",Write_Tree(tree)); */ /* tree->bl_ndigits = 7; */ RATES_Update_Edge_Lengths(tree); PhyML_Printf("\n. AVX enabled: %s", #if defined(__AVX__) "yes" #else "no" #endif ); PhyML_Printf("\n. SSE enabled: %s", #if defined(__SSE3__) "yes" #else "no" #endif ); PhyML_Printf("\n\n. Seed: %d",tree->io->r_seed); PhyML_Printf("\n. Ignore sequences: %s",tree->eval_alnL == YES ? "no" : "yes"); PhyML_Printf("\n. Model of variation of rates across lineages: %s",tree->rates->model_name); PhyML_Printf("\n. log(Pr(Seq|Tree)) = %f",tree->c_lnL); PhyML_Printf("\n. log(Pr(Tree)) = %f",tree->times->c_lnL); tree->aux_tree = (t_tree **)mCalloc(1,sizeof(t_tree *)); tree->aux_tree[0] = Make_Tree_From_Scratch(tree->n_otu,tree->data); tree->aux_tree[0]->mod = tree->mod; Copy_Tree(tree,tree->aux_tree[0]); tree->aux_tree[0]->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->aux_tree[0]->rates,NULL,tree->n_otu); RATES_Copy_Rate_Struct(tree->rates,tree->aux_tree[0]->rates,tree->n_otu); tree->aux_tree[0]->rates->model_id = LOGNORMAL; tree->aux_tree[0]->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->aux_tree[0]->times,NULL,tree->n_otu); TIMES_Copy_Time_Struct(tree->times,tree->aux_tree[0]->times,tree->n_otu); RATES_Duplicate_Calib_Struct(tree,tree->aux_tree[0]); MIXT_Chain_Cal(tree->aux_tree[0]); DATE_Assign_Primary_Calibration(tree->aux_tree[0]); TIMES_Randomize_Tree_With_Time_Constraints(tree->aux_tree[0]->times->a_cal[0],tree->aux_tree[0]); TIMES_Lk(tree->aux_tree[0]); PhyML_Printf("\n. log(Pr(extra tree)) = %f",tree->aux_tree[0]->times->c_lnL); mcmc = MCMC_Make_MCMC_Struct(); tree->aux_tree[0]->mcmc = mcmc; MCMC_Init_MCMC_Struct(NULL,NULL,mcmc); MCMC_Complete_MCMC(mcmc,tree->aux_tree[0]); PhyML_Fprintf(fp_stats,"\n%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t", "sample", "lnL(posterior)", "lnL(seq)", "lnL(times)", "lnL(rates)", "birth", "death", "clock", "root", "tstv", "nu"); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp_stats,"rr%d\t",i); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp_stats,"pr%d\t",i); for(i=0;itimes->n_cal;++i) { t_cal *cal = tree->times->a_cal[i]; for(j=0;jclade_list_size;++j) { t_clad *clade = cal->clade_list[j]; PhyML_Fprintf(fp_stats,"t(calib:%s_clade:%s)\t",cal->id,clade->id); } } for(i=0;itimes->n_cal;++i) { t_cal *cal = tree->times->a_cal[i]; PhyML_Fprintf(fp_stats,"clade(calib:%s)\t",cal->id); } if(tree->rates->model_id == THORNE || tree->rates->model_id == LOGNORMAL || tree->rates->model_id == STRICTCLOCK) for(i=0;i<2*tree->n_otu-2;++i) PhyML_Fprintf(fp_stats,"br%d\t",i); else for(i=0;i<2*tree->n_otu-1;++i) PhyML_Fprintf(fp_stats,"nr%d\t",i); for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO) PhyML_Fprintf(fp_stats,"t%d\t",i); PhyML_Fprintf(fp_stats,"accRT\t"); PhyML_Fprintf(fp_stats,"tuneRT\t"); PhyML_Fprintf(fp_stats,"accT\t"); PhyML_Fprintf(fp_stats,"tuneT\t"); PhyML_Fprintf(fp_stats,"accClock\t"); PhyML_Fprintf(fp_stats,"tuneClock\t"); PhyML_Fprintf(fp_stats,"accTCr\t"); PhyML_Fprintf(fp_stats,"tuneTCr\t"); PhyML_Fprintf(fp_stats,"accTreeRates\t"); PhyML_Fprintf(fp_stats,"tuneTreeRates\t"); PhyML_Fprintf(fp_stats,"accSprW\t"); PhyML_Fprintf(fp_stats,"tuneSprW\t"); PhyML_Fprintf(fp_stats,"accSpr\t"); PhyML_Fprintf(fp_stats,"tuneSpr\t"); PhyML_Fprintf(fp_stats,"accSprLoc\t"); PhyML_Fprintf(fp_stats,"tuneSprLoc\t"); fflush(NULL); PhyML_Printf("\n\n"); PhyML_Printf("\n. MCMC settings. Chain length: %g steps.",(phydbl)tree->mcmc->chain_len); PhyML_Printf("\n. MCMC settings. Burnin: %g steps.",(phydbl)tree->mcmc->chain_len_burnin); PhyML_Printf("\n. MCMC settings. Sample every %g steps.",(phydbl)tree->mcmc->sample_interval); PhyML_Printf("\n. MCMC settings. Print out every %g steps.",(phydbl)tree->mcmc->print_every); PhyML_Printf("\n\n"); for(i=0;imcmc->n_moves;i++) tree->mcmc->start_ess[i] = YES; Set_Both_Sides(NO,tree); tree->mcmc->always_yes = NO; move = -1; // Get in the range of sensible values for clock_r i = 0; do { MCMC_Clock_R(tree); } while(i++ < 100); do { if(tree->mcmc->run > adjust_len) for(i=0;imcmc->n_moves;i++) tree->mcmc->adjust_tuning[i] = NO; if(tree->c_lnL < UNLIKELY + 0.1 && tree->eval_alnL == YES) { PhyML_Printf("\n. Move '%s' failed\n",tree->mcmc->move_name[move]); assert(FALSE); } u = Uni(); for(move=0;movemcmc->n_moves;move++) if(tree->mcmc->move_weight[move] > u-1.E-10) break; assert(!(move == tree->mcmc->n_moves)); if(!strcmp(tree->mcmc->move_name[move],"clock")) MCMC_Clock_R(tree); else if(!strcmp(tree->mcmc->move_name[move],"birth_rate")) MCMC_Birth_Rate(tree); else if(!strcmp(tree->mcmc->move_name[move],"death_rate")) MCMC_Death_Rate(tree); else if(!strcmp(tree->mcmc->move_name[move],"birth_death_updown")) MCMC_Birth_Death_Updown(tree); else if(!strcmp(tree->mcmc->move_name[move],"tree_height")) MCMC_Tree_Height(tree); else if(!strcmp(tree->mcmc->move_name[move],"times")) MCMC_Times_All(tree); else if(!strcmp(tree->mcmc->move_name[move],"times_and_rates")) MCMC_Times_And_Rates_All(tree); else if(!strcmp(tree->mcmc->move_name[move],"spr")) MCMC_Prune_Regraft(tree); else if(!strcmp(tree->mcmc->move_name[move],"spr_local")) MCMC_Prune_Regraft_Local(tree); else if(!strcmp(tree->mcmc->move_name[move],"spr_weighted")) MCMC_Prune_Regraft_Weighted(tree); else if(!strcmp(tree->mcmc->move_name[move],"updown_t_cr")) MCMC_Updown_T_Cr(tree); else if(!strcmp(tree->mcmc->move_name[move],"kappa")) MCMC_Kappa(tree); else if(!strcmp(tree->mcmc->move_name[move],"ras")) MCMC_Rate_Across_Sites(tree); else if(!strcmp(tree->mcmc->move_name[move],"nu")) MCMC_Nu(tree); else if(!strcmp(tree->mcmc->move_name[move],"subtree_height")) MCMC_Subtree_Height(tree); else if(!strcmp(tree->mcmc->move_name[move],"time_slice")) MCMC_Time_Slice(tree); else if(!strcmp(tree->mcmc->move_name[move],"br_rate")) MCMC_Rates_All(tree); else if(!strcmp(tree->mcmc->move_name[move],"tree_rates")) MCMC_Tree_Rates(tree); else if(!strcmp(tree->mcmc->move_name[move],"clade_change")) MCMC_Clade_Change(tree); else continue; phydbl cur_lk = tree->c_lnL; phydbl new_lk = Lk(NULL,tree); if(Are_Equal(cur_lk,new_lk,1.E-5) == NO) { PhyML_Printf("\n. move: %s",tree->mcmc->move_name[move]); PhyML_Printf("\n. new: %f cur: %f",new_lk,cur_lk); assert(FALSE); } if(!RATES_Check_Edge_Length_Consistency(tree)) { PhyML_Fprintf(stderr,"\n. Issue detected by RATES_Check_Edge_Length_Consistency(tree)."); PhyML_Fprintf(stderr,"\n. Move: %s",tree->mcmc->move_name[move]); if(tree->eval_alnL == YES) assert(FALSE); } if(!TIMES_Check_Node_Height_Ordering(tree)) { PhyML_Fprintf(stderr,"\n. Issue detected by TIMES_Check_Node_Height_Ordering(tree)."); PhyML_Fprintf(stderr,"\n. Move: %s",tree->mcmc->move_name[move]); assert(FALSE); } if(!(tree->times->c_lnL > UNLIKELY)) { PhyML_Fprintf(stderr,"\n. move: %s",tree->mcmc->move_name[move]); PhyML_Fprintf(stderr,"\n. glnL=%f",tree->times->c_lnL); assert(FALSE); } (void)signal(SIGINT,MCMC_Terminate); if(!(tree->mcmc->run%tree->mcmc->print_every)) { phydbl mean_r,post; mean_r = RATES_Average_Substitution_Rate(tree); post = Get_Lk(tree) + tree->times->c_lnL + tree->rates->c_lnL; if(tree->mcmc->run < adjust_len) PhyML_Printf("\nx"); else PhyML_Printf("\n."); PhyML_Printf(" %10d lnL: [%12.2f -- %12.2f -- %12.2f -- %12.2f] root age: %12f [time: %7d sec] clock: %15f %20s", tree->mcmc->run, post, Get_Lk(tree), tree->times->c_lnL, tree->rates->c_lnL, fabs(tree->times->nd_t[tree->n_root->num]), (int)time(NULL) - t_beg, mean_r, tree->mcmc->move_name[move]); } if(!(tree->mcmc->run%tree->mcmc->sample_interval)) { phydbl mean_r,post; mean_r = RATES_Average_Substitution_Rate(tree); post = Get_Lk(tree) + tree->times->c_lnL + tree->rates->c_lnL; PhyML_Fprintf(fp_stats,"\n%6d\t%9.1f\t%9.1f\t%9.1f\t%9.1f\t%12G\t%12G\t%12G\t%12G\t%12G\t%12G\t", tree->mcmc->run, post, Get_Lk(tree), tree->times->c_lnL, tree->rates->c_lnL, tree->times->birth_rate, tree->times->death_rate, mean_r, fabs(tree->times->nd_t[tree->n_root->num]), tree->next->mod->kappa->v, tree->rates->nu); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp_stats,"%G\t",tree->mod->ras->gamma_rr->v[i]); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp_stats,"%G\t",tree->mod->ras->gamma_r_proba->v[i]); for(i=0;itimes->n_cal;i++) { t_cal *cal = tree->times->a_cal[i]; for(j=0;jclade_list_size;++j) { t_clad *clade = cal->clade_list[j]; PhyML_Fprintf(fp_stats,"%G\t",fabs(tree->times->nd_t[clade->target_nd->num])); } } for(i=0;itimes->n_cal;++i) { t_cal *cal = tree->times->a_cal[i]; PhyML_Fprintf(fp_stats,"%d\t",cal->current_clade_idx); /* PhyML_Fprintf(fp_stats,"%s\t",cal->clade_list[cal->current_clade_idx]->id); */ } if(tree->rates->model_id == THORNE || tree->rates->model_id == LOGNORMAL || tree->rates->model_id == STRICTCLOCK) for(i=0;i<2*tree->n_otu-2;++i) PhyML_Fprintf(fp_stats,"%G\t",tree->rates->br_r[i]); else for(i=0;i<2*tree->n_otu-1;++i) PhyML_Fprintf(fp_stats,"%G\t",tree->rates->nd_r[i]); for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO) PhyML_Fprintf(fp_stats,"%G\t",fabs(tree->times->nd_t[i])); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_times_and_rates_root]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_times_and_rates_root]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_root_time]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_root_time]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_clock_r]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_clock_r]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_updown_t_cr]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_updown_t_cr]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_tree_rates]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_tree_rates]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_spr_weighted]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_spr_weighted]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_spr]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_spr]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_spr_local]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_spr_local]); if(tree->mcmc->sample_num == 0) { PhyML_Fprintf(fp_tree,"\n#NEXUS"); PhyML_Fprintf(fp_tree,"\nBEGIN TREES;"); } else { fseek(fp_tree,-5,SEEK_CUR); } TIMES_Time_To_Bl(tree); tree->bl_ndigits = 3; /* RATES_Update_Edge_Lengths(tree); */ s_tree = Write_Tree(tree); tree->bl_ndigits = 7; PhyML_Fprintf(fp_tree,"\ntree %d [&lnP=%f] = [&R] %s",tree->mcmc->sample_num,tree->c_lnL,s_tree); Free(s_tree); PhyML_Fprintf(fp_tree,"\nEND;"); fflush(NULL); RATES_Update_Edge_Lengths(tree); if(tree->mcmc->run > tree->mcmc->chain_len_burnin && tree->io->mutmap == YES) Sample_Ancestral_Seq(YES,NO,tree); tree->mcmc->sample_num++; } tree->mcmc->run++; MCMC_Get_Acc_Rates(tree->mcmc); } while(tree->mcmc->run < tree->mcmc->chain_len); return(res); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update the list of nodes that are younger than lim void DATE_List_Of_Nodes_Younger_Than(t_node *a, t_node *d, phydbl lim, t_ll **list, t_tree *tree) { if(tree->times->nd_t[d->num] > lim) Push_Bottom_Linked_List(d,list,YES); if(d->tax == YES) return; else { int i; if(d == tree->n_root) { DATE_List_Of_Nodes_Younger_Than(d,d->v[1],lim,list,tree); DATE_List_Of_Nodes_Younger_Than(d,d->v[2],lim,list,tree); } else { for(i=0;i<3;i++) if(d->v[i] != a && d->b[i] != tree->e_root) DATE_List_Of_Nodes_Younger_Than(d,d->v[i],lim,list,tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update the list of nodes that are younger than lim with direct ancestors // not younger than lim void DATE_List_Of_Nodes_And_Ancestors_Younger_Than(t_node *a, t_node *d, phydbl lim, t_ll **list, t_tree *tree) { if(tree->times->nd_t[d->num] > lim && a != NULL && tree->times->nd_t[a->num] > lim) Push_Bottom_Linked_List(d,list,YES); if(d->tax == YES) return; else { int i; if(d == tree->n_root) { DATE_List_Of_Nodes_And_Ancestors_Younger_Than(d,d->v[1],lim,list,tree); DATE_List_Of_Nodes_And_Ancestors_Younger_Than(d,d->v[2],lim,list,tree); } else { for(i=0;i<3;i++) if(d->v[i] != a && d->b[i] != tree->e_root) DATE_List_Of_Nodes_And_Ancestors_Younger_Than(d,d->v[i],lim,list,tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // List of valid regraft nodes, taking into account calibration // constraints. The subtree (defined by prune and prune_daughter // will be re-attached *on top of* one of the nodes in this list // (as opposed to *on one of the sister edges below*). t_ll *DATE_List_Of_Regraft_Nodes(t_node *prune, t_node *prune_daughter, phydbl *t_min, phydbl *t_max, int verbose, t_tree *tree) { t_node *n,*m; int i,j; t_ll *out,*in,*ll; int is_clade_affected; t_clad *clade; t_cal *cal; cal = NULL; clade = NULL; n = NULL; m = NULL; *t_min = -INFINITY; in = NULL; out = NULL; is_clade_affected = NO; // Find the oldest LCA of calibrated sets among the nodes between // prune and root. These clades might see the position of their // LCA change. if(prune != tree->n_root) { n = prune; while(n) { for(i=0;itimes->n_cal;++i) { // That node is the LCA of calibration a_cal[i] cal = tree->times->a_cal[i]; clade = cal->clade_list[cal->current_clade_idx]; if(n == clade->target_nd) { is_clade_affected = NO; for(j=0;jn_tax;++j) { m = clade->tip_list[j]; do { if(m == prune_daughter) { is_clade_affected = YES; break; } m = m->anc; } while(m); if(is_clade_affected == YES) break; } // Maximum of the lower bounds for calibration intervals /* if(is_clade_affected == YES) *t_min = MAX(*t_min,tree->times->a_cal[i]->lower); */ if(is_clade_affected == YES) *t_min = MAX(*t_min,tree->times->t_prior_min[n->num]); } } n = n->anc; } } // Find the oldest internal node within intervals defined by // calibrations affected by the pruning. n = prune_daughter; while(n->anc && !(tree->times->nd_t[n->anc->num] < *t_min)) { n = n->anc; assert(n); } if(verbose) { PhyML_Printf("\n. Apical: %d @ time %f min: %f",n->num,tree->times->nd_t[n->num],*t_min); fflush(NULL); } // List all nodes younger than this apical node DATE_List_Of_Nodes_Younger_Than(n->anc,n,-INFINITY,&in,tree); assert(in != NULL); if(verbose) { ll = in->head; t_node *x; do { x = (t_node *)ll->v; PhyML_Printf("\nx Inlist %d @ %f",x->num,tree->times->nd_t[x->num]); ll = ll->next; } while(ll != NULL); } // Remove from that list the nodes that are too young to be suitable regraft points. n = prune_daughter; out = NULL; while(n) { for(i=0;itimes->n_cal;i++) { cal = tree->times->a_cal[i]; clade = cal->clade_list[cal->current_clade_idx]; if(n->anc && n->anc == clade->target_nd) { for(j=0;jn_tax;++j) { m = clade->tip_list[j]; do { if(m == prune_daughter) break; if(m == prune) break; m = m->anc; } while(m); if(m == prune) break; // Prune-regraft anywhere below calibrated node will not change that node. } if(m != prune) { for(j=0;j<3;++j) { if(n->anc->v[j] != n->anc->anc && n->anc->b[j] != tree->e_root && n->anc->v[j] != n) { DATE_List_Of_Nodes_And_Ancestors_Younger_Than(n->anc, n->anc->v[j], tree->times->a_cal[i]->upper, &out, tree); break; } } } } } n = n->anc; } // Remove nodes that are `strictly' younger than prune_daughter DATE_List_Of_Nodes_And_Ancestors_Younger_Than(tree->n_root,tree->n_root->v[1],tree->times->nd_t[prune_daughter->num],&out,tree); DATE_List_Of_Nodes_And_Ancestors_Younger_Than(tree->n_root,tree->n_root->v[2],tree->times->nd_t[prune_daughter->num],&out,tree); // Remove nodes that are below prune_daughter (prune_daughter included) DATE_List_Of_Nodes_Younger_Than(prune,prune_daughter,-INFINITY,&out,tree); // Add prune node to the list of node that can't be targeted for regraft Push_Bottom_Linked_List(prune,&out,YES); // Add root node as one cannot regraft above it /* Push_Bottom_Linked_List(tree->n_root,&out); */ if(verbose) { printf("\nx outlist: %p",(void *)out); fflush(NULL); ll = out->head; do { t_node *x = (t_node *)ll->v; PhyML_Printf("\nx Outlist %d @ %f",x->num,tree->times->nd_t[x->num]); ll = ll->next; } while(ll != NULL); } /* Print_List(in); */ ll = out->head; do { if(verbose) { t_node *x = (t_node *)ll->v; printf("\nx Remove %d",x->num); } Remove_From_Linked_List(NULL,ll->v,&in); if(verbose) PhyML_Printf("\n. List in (in->head:%p in->tail:%p):",in?in->head:NULL,in?in->tail:NULL); /* Print_List(in); */ ll = ll->next; } while(ll != NULL); Free_Linked_List(out); if(verbose) { ll = in->head; do { t_node *x; x = (t_node *)ll->v; printf("\n. In1: %d",x->num); fflush(NULL); ll = ll->next; } while(ll != NULL); } return(in); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl DATE_Lk_Calib(t_tree *tree) { phydbl lnL; int i; t_cal *cal; lnL = 0.0; for(i=0;itimes->n_cal;++i) { cal = tree->times->a_cal[i]; lnL += LOG(cal->alpha_proba_list[cal->current_clade_idx]); } return lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/date.h000066400000000000000000000033341501136442400202620ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef DATE_H #define DATE_H #include "utilities.h" int DATE_Main(int argc, char **argv); void DATE_XML(char *xml_filename); void DATE_Update_Secondary_Cal(t_tree *tree); void DATE_Update_Secondary_Cal_Post(t_node *a, t_node *d, t_tree *tree); void DATE_Update_Secondary_Cal_Pre(t_node *a, t_node *d, t_tree *tree); phydbl *DATE_Splitted_Calibration(t_tree *tree); void DATE_Assign_Primary_Calibration(t_tree *tree); void DATE_Update_T_Prior_MinMax(t_tree *tree); phydbl DATE_J(phydbl birth_r, phydbl death_r, phydbl t_min, phydbl t_pls); int DATE_Is_Split_Accessible(t_node *d, int which, phydbl *splitted_cal, t_tree *tree); phydbl *DATE_Splitted_Calibration(t_tree *tree); phydbl DATE_J_Sum_Product(t_tree *tree); int DATE_J_Sum_Product_Pre(t_node *d, int split_idx_d, int split_idx_a, phydbl prod, int fact, phydbl *total, phydbl *splitted_cal, int rk, t_tree *tree); void DATE_Chain_Cal(t_tree *mixt_tree); int DATE_Check_Calibration_Constraints(t_tree *tree); int DATE_Check_Time_Constraints(t_tree *tree); phydbl *DATE_MCMC(t_tree *tree); void DATE_List_Of_Nodes_Younger_Than(t_node *a, t_node *d, phydbl lim, t_ll **list, t_tree *tree); void DATE_List_Of_Nodes_And_Ancestors_Younger_Than(t_node *a, t_node *d, phydbl lim, t_ll **list, t_tree *tree); t_ll *DATE_List_Of_Regraft_Nodes(t_node *prune, t_node *prune_daughter, phydbl *t_min, phydbl *t_max, int verbose, t_tree *tree); phydbl DATE_Lk_Calib(t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/draw.c000066400000000000000000000501761501136442400203030ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "draw.h" void DR_Draw_Tree(char *file_name, t_tree *tree) { FILE *ps_tree; ps_tree = (FILE *)fopen(file_name,"w"); DR_Print_Postscript_Header(1,ps_tree); tree->ps_tree = DR_Make_Tdraw_Struct(tree); DR_Init_Tdraw_Struct(tree->ps_tree); DR_Get_Tree_Box_Width(tree->ps_tree,tree); Dist_To_Root(tree); tree->ps_tree->max_dist_to_root = DR_Get_Max_Dist_To_Root(tree); DR_Get_X_Coord(NO,tree->ps_tree,tree); DR_Get_Y_Coord(NO,tree->ps_tree,tree); DR_Print_Tree_Postscript(1,NO,ps_tree,tree); DR_Print_Postscript_EOF(ps_tree); fclose(ps_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Tree_Coord(t_tree *tree) { DR_Init_Tdraw_Struct(tree->ps_tree); DR_Get_Tree_Box_Width(tree->ps_tree,tree); if(!tree->n_root) { PhyML_Printf("\n. Adding root before rendering the tree."); Add_Root(tree->a_edges[0],tree); } Dist_To_Root(tree); tree->ps_tree->max_dist_to_root = DR_Get_Max_Dist_To_Root(tree); DR_Get_X_Coord(NO,tree->ps_tree,tree); DR_Get_Y_Coord(NO,tree->ps_tree,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Print_Postscript_Header(int n_pages, FILE *fp) { if(!fp) { PhyML_Printf("\n== Failed to open the postscript file."); PhyML_Printf("\n== Did you forget the '--ps' option ?."); Exit("\n"); } PhyML_Fprintf(fp,"%%!PS-Adobe-3.0\n"); PhyML_Fprintf(fp,"%%%%BoundingBox: 0 0 595.28 841.89\n"); PhyML_Fprintf(fp,"%%%%DocumentFonts: Times-Roman Times-Roman\n"); PhyML_Fprintf(fp,"%%%%Creator: Stephane Guindon\n"); PhyML_Fprintf(fp,"%%%%Title: tree\n"); PhyML_Fprintf(fp,"%%%%EndComments\n"); PhyML_Fprintf(fp,"%%%%Pages: %d\n",n_pages); PhyML_Fprintf(fp,"/lt {lineto} bind def\n"); PhyML_Fprintf(fp,"/mt {moveto} bind def\n"); PhyML_Fprintf(fp,"/sc {setrgbcolor} bind def\n"); PhyML_Fprintf(fp,"/ct {curveto} bind def\n"); PhyML_Fprintf(fp,"/np {newpath} bind def\n"); PhyML_Fprintf(fp,"/cp {closepath} bind def\n"); PhyML_Fprintf(fp,"/gs {gsave} bind def\n"); PhyML_Fprintf(fp,"/gr {grestore} bind def\n"); PhyML_Fprintf(fp,"/Times-Roman findfont\n"); PhyML_Fprintf(fp,"12 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"/clipbox\n"); PhyML_Fprintf(fp,"{\n"); PhyML_Fprintf(fp,"newpath\n"); PhyML_Fprintf(fp,"20 20 mt\n"); PhyML_Fprintf(fp,"580 20 lt\n"); PhyML_Fprintf(fp,"580 820 lt\n"); PhyML_Fprintf(fp,"20 820 lt\n"); PhyML_Fprintf(fp,"20 20 lt\n"); PhyML_Fprintf(fp,"closepath\n"); PhyML_Fprintf(fp,"clip\n"); PhyML_Fprintf(fp,"} bind def\n"); /* PhyML_Fprintf(fp,"gs\n"); */ /* PhyML_Fprintf(fp,"newpath\n"); */ /* PhyML_Fprintf(fp,"20 20 mt\n"); */ /* PhyML_Fprintf(fp,"580 20 lt\n"); */ /* PhyML_Fprintf(fp,"580 820 lt\n"); */ /* PhyML_Fprintf(fp,"20 820 lt\n"); */ /* PhyML_Fprintf(fp,"20 20 lt\n"); */ /* PhyML_Fprintf(fp,"closepath\n"); */ /* PhyML_Fprintf(fp,"stroke\n"); */ /* PhyML_Fprintf(fp,"gr\n"); */ /* PhyML_Fprintf(fp,"0 0 0 sc\n"); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Print_Postscript_EOF(FILE *fp) { PhyML_Fprintf(fp,"%%%%Trailer\n"); PhyML_Fprintf(fp,"%%%%EOF\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Print_Tree_Postscript(int page_num, int render_name, FILE *fp, t_tree *tree) { tdraw *draw; t_node *n_root; draw = tree->ps_tree; /* DR_Get_Tree_Coord(tree); */ n_root = tree->n_root; /* PhyML_Fprintf(fp,"%%%%Page: %d %d\n",page_num,page_num); */ /* PhyML_Fprintf(fp,"0.001 setlinewidth\n"); */ /* PhyML_Fprintf(fp,"0.5 0.5 0.4 sc\n"); */ /* PhyML_Fprintf(fp,"0 0 0 sc\n"); */ /* PhyML_Fprintf(fp,"clipbox\n"); */ /* PhyML_Fprintf(fp,"stroke\n"); */ PhyML_Fprintf(fp,"20 20 translate\n"); PhyML_Fprintf(fp,"newpath\n"); draw->ycoord[n_root->num] = (draw->ycoord[n_root->v[2]->num] + draw->ycoord[n_root->v[1]->num])/2. + 20; draw->xcoord[n_root->num] = 0.0; DR_Print_Tree_Postscript_Pre(n_root,n_root->v[2],n_root->b[2],render_name,fp,draw,tree); DR_Print_Tree_Postscript_Pre(n_root,n_root->v[1],n_root->b[1],render_name,fp,draw,tree); PhyML_Fprintf(fp,"closepath\n"); PhyML_Fprintf(fp,"0 0 translate\n"); PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"showpage\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Print_Tree_Postscript_Pre(t_node *a, t_node *d, t_edge *b, int render_name, FILE *fp, tdraw *w, t_tree *tree) { int i; phydbl R, G, B; R = G = B = 0.0; PhyML_Fprintf(fp,"gs\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[a->num],w->ycoord[a->num]); /* PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[a->num],w->ycoord[d->num]); */ /* PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[d->num],w->ycoord[d->num]); */ phydbl min,max,step,val; min = 0.0; max = 5.; step = (max-min)/13.; /* val = tree->rates->mean_r[d->num] / (phydbl)(tree->mcmc->run/tree->mcmc->sample_interval+1.); */ /* val = tree->rates->mean_r[d->num]; */ /* val = tree->times->has_survived[d->num]; */ /* if(val > 0.5) {R=1.; G=.0; B=0.;} */ /* val = tree->geo->ldscape[tree->geo->idx_loc[d->num]*tree->geo->n_dim+0] + 2.5; */ val = tree->geo->coord_loc[tree->geo->idx_loc[d->num]]->lonlat[0] + 2.5; /* val = 0.; */ if(val <= min+1.*step) {R=.0; G=1.; B=1.;} else if(val > min+1.*step && val <= min+2.*step) {R=.0; G=1.; B=.8;} else if(val > min+2.*step && val <= min+3.*step) {R=.0; G=1.; B=.5;} else if(val > min+3.*step && val <= min+4.*step) {R=.0; G=1.; B=.3;} else if(val > min+4.*step && val <= min+5.*step) {R=.0; G=1.; B=.0;} else if(val > min+5.*step && val <= min+6.*step) {R=.25; G=1.; B=0.;} else if(val > min+6.*step && val <= min+7.*step) {R=.5; G=1.; B=0.;} else if(val > min+7.*step && val <= min+8.*step) {R=.75; G=1.; B=.0;} else if(val > min+8.*step && val <= min+9.*step) {R=1.; G=1.; B=.0;} else if(val > min+9.*step && val <= min+10.*step) {R=1.; G=.75; B=.0;} else if(val > min+10.*step && val <= min+11.*step) {R=1.; G=.5; B=.0;} else if(val > min+11.*step && val <= min+12.*step) {R=1.; G=.25; B=.0;} else if(val > min+12.*step) {R=1.; G=.0; B=0.;} /* R = 0.; G = 0.; B = 0.; */ PhyML_Fprintf(fp,"2 setlinewidth\n"); /* PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[a->num],w->ycoord[d->num]); */ /* PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[d->num],w->ycoord[d->num]); */ phydbl xa = w->xcoord[a->num]; phydbl xd = MIN(w->xcoord[a->num] + 5,w->xcoord[d->num]); phydbl ya = w->ycoord[a->num]; phydbl yd = w->ycoord[d->num]; PhyML_Fprintf(fp,"%.1f %.1f %.1f %.1f %.1f %.1f ct\n", xa + (xd-xa)/2.,(ya+yd)/2., xd - (xd-xa)/5.,yd, xd,yd); PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[d->num],w->ycoord[d->num]); /* PhyML_Fprintf(fp,"%.1f %.1f %.1f %.1f %.1f %.1f ct\n", */ /* w->xcoord[a->num], */ /* w->ycoord[d->num], */ /* w->xcoord[d->num], */ /* w->ycoord[d->num], */ /* w->xcoord[d->num], */ /* w->ycoord[d->num]); */ if(tree->rates && tree->times->has_survived[d->num] == YES) { PhyML_Fprintf(fp," /Helvetica findfont 16 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num]-5,w->ycoord[d->num]); PhyML_Fprintf(fp,"0 0 0 sc\n"); PhyML_Fprintf(fp,"(*) show \n"); } PhyML_Fprintf(fp,"%f %f %f sc\n",R,G,B); if(d->tax) { PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"0 setgray\n"); PhyML_Fprintf(fp,"2 setlinewidth\n"); PhyML_Fprintf(fp,"np %.1f %.1f 1 0 360 arc cp\n",w->xcoord[d->num],w->ycoord[d->num]); PhyML_Fprintf(fp,"%.1f %.1f %.1f sc fill\n",R,G,B); /* PhyML_Fprintf(fp,"%f setgray fill\n",greylevel); */ PhyML_Fprintf(fp,"0 0 0 sc\n"); PhyML_Fprintf(fp," /Helvetica findfont 10 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num]+2,w->ycoord[d->num]-6); /* PhyML_Fprintf(fp,"(%d) show \n",d->num); */ /* PhyML_Fprintf(fp,"(%s) show \n",d->name); */ PhyML_Fprintf(fp," /Helvetica findfont 14 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num] - (w->xcoord[d->num] - w->xcoord[a->num])/2.,w->ycoord[d->num]); PhyML_Fprintf(fp," /Helvetica findfont 10 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); #if (defined GEO) /* PhyML_Fprintf(fp,"([%4.4f,%4.4f]) show \n", */ /* tree->geo->ldscape[tree->geo->loc[d->num]*tree->geo->n_dim+0], */ /* tree->geo->ldscape[tree->geo->loc[d->num]*tree->geo->n_dim+1]); */ #endif /* PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num]+5,w->ycoord[d->num]); */ /* PhyML_Fprintf(fp,"(%.10s) show \n",d->name); */ /* if(render_name) */ /* { */ /* if(tree->io->long_tax_names) */ /* PhyML_Fprintf(fp,"(%s) show \n",tree->io->long_tax_names[d->num]); */ /* else */ /* PhyML_Fprintf(fp,"(%s) show \n",d->name); */ /* } */ PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"gr\n"); PhyML_Fprintf(fp,"0 0 0 sc\n"); return; } else { PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"0 setgray\n"); PhyML_Fprintf(fp,"2 setlinewidth\n"); PhyML_Fprintf(fp,"np %.1f %.1f 1 0 360 arc cp\n",w->xcoord[d->num],w->ycoord[d->num]); PhyML_Fprintf(fp,"%.1f %.1f %.1f sc fill\n",R,G,B); /* PhyML_Fprintf(fp,"%f setgray fill\n",greylevel); */ PhyML_Fprintf(fp,"0 0 0 sc\n"); PhyML_Fprintf(fp," /Helvetica findfont 10 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num]+2,w->ycoord[d->num]); /* PhyML_Fprintf(fp,"(%d) show \n",b->num); */ PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num],w->ycoord[d->num]); PhyML_Fprintf(fp," /Helvetica findfont 14 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num] - (w->xcoord[d->num] - w->xcoord[a->num])/2.,w->ycoord[d->num]); PhyML_Fprintf(fp," /Helvetica findfont 10 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); #if (defined GEO) /* PhyML_Fprintf(fp,"([%4.4f,%4.4f]) show \n", */ /* tree->geo->ldscape[tree->geo->loc[d->num]*tree->geo->n_dim+0], */ /* tree->geo->ldscape[tree->geo->loc[d->num]*tree->geo->n_dim+1]); */ #endif PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"gr\n"); PhyML_Fprintf(fp,"0 0 0 sc\n"); for(i=0;i<3;i++) if(d->v[i] != a && d->b[i] != tree->e_root) DR_Print_Tree_Postscript_Pre(d,d->v[i],d->b[i],render_name,fp,w,tree); } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_X_Coord_Pre(t_node *a, t_node *d, t_edge *b, tdraw *w, int fixed_tips, t_tree *tree) { int i; if(!(d->tax && fixed_tips == YES)) w->xcoord[d->num] = d->dist_to_root * (phydbl)w->tree_box_width/w->max_dist_to_root; if(d->tax) return; else { for(i=0;i<3;i++) if((d->v[i] != a) && (d->b[i] != tree->e_root)) DR_Get_X_Coord_Pre(d,d->v[i],d->b[i],w,fixed_tips,tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_X_Coord(int fixed_tips, tdraw *w, t_tree *tree) { if(!(tree->n_root->v[2]->tax && fixed_tips == YES)) w->xcoord[tree->n_root->v[2]->num] = tree->n_root->v[2]->dist_to_root * (phydbl)w->tree_box_width/w->max_dist_to_root; if(!(tree->n_root->v[1]->tax && fixed_tips == YES)) w->xcoord[tree->n_root->v[1]->num] = tree->n_root->v[1]->dist_to_root * (phydbl)w->tree_box_width/w->max_dist_to_root; DR_Get_X_Coord_Pre(tree->n_root,tree->n_root->v[2],NULL,w,fixed_tips,tree); DR_Get_X_Coord_Pre(tree->n_root,tree->n_root->v[1],NULL,w,fixed_tips,tree); w->xcoord[tree->n_root->num] = 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Y_Coord(int fixed_tips, tdraw *w, t_tree *tree) { int next_y_slot; next_y_slot = 0; DR_Get_Y_Coord_Post(tree->n_root,tree->n_root->v[2],NULL,&next_y_slot,fixed_tips,w,tree); DR_Get_Y_Coord_Post(tree->n_root,tree->n_root->v[1],NULL,&next_y_slot,fixed_tips,w,tree); w->ycoord[tree->n_root->num] = (int)((w->ycoord[tree->n_root->v[2]->num] + w->ycoord[tree->n_root->v[2]->num]) / 2.) + 20; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Y_Coord_Post(t_node *a, t_node *d, t_edge *b, int *next_y_slot, int fixed_tips, tdraw *w, t_tree *tree) { int i; if(d->tax) { if(!fixed_tips) { /* w->ycoord[d->num] = *next_y_slot + (int)(w->page_height / (2.*tree->n_otu)); */ w->ycoord[d->num] = *next_y_slot + 20; (*next_y_slot) += (int)(w->page_height / (tree->n_otu-1)); printf("\n. %s %f",d->name,w->ycoord[d->num]); } } else { int d1, d2; d1 = d2 = -1; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { DR_Get_Y_Coord_Post(d,d->v[i],d->b[i],next_y_slot,fixed_tips,w,tree); if(d1<0) d1 = i; else d2 = i; } } w->ycoord[d->num] = (w->ycoord[d->v[d1]->num] + w->ycoord[d->v[d2]->num])/2.; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// tdraw *DR_Make_Tdraw_Struct(t_tree *tree) { tdraw *w; w = (tdraw *)mCalloc(1,sizeof(tdraw)); w->xcoord = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->ycoord = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->xcoord_s = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->ycoord_s = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->cdf_mat = (int *)mCalloc((2*tree->n_otu-2)*(2*tree->n_otu-2),sizeof(int)); w->cdf_mat_x = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->cdf_mat_y = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); return w; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Init_Tdraw_Struct(tdraw *w) { w->page_width = 580-20; w->page_height = 820-20; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Tree_Box_Width(tdraw *w, t_tree *tree) { int i; int max_name_len, curr_len; max_name_len = curr_len = 0; for(i=0;in_otu;i++) { curr_len = (int)strlen(tree->a_nodes[i]->name); if(curr_len > max_name_len) max_name_len = curr_len; } w->tree_box_width = w->page_width - max_name_len * 8.66667; /* w->tree_box_width = w->page_width - max_name_len * 10.; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl DR_Get_Max_Dist_To_Root(t_tree *tree) { phydbl mx; int i; mx = .0; for(i=0;in_otu;i++) { if(tree->a_nodes[i]->dist_to_root > mx) { mx = tree->a_nodes[i]->dist_to_root; } } return mx; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Tree_Coord_Scaled(tdraw *w, t_tree *tree) { int i; int max_x,min_x; int max_y,min_y; max_x = -INT_MAX; min_x = INT_MAX; For(i,2*tree->n_otu-1) { if(w->xcoord[i] > max_x) max_x = w->xcoord[i]; if(w->xcoord[i] < min_x) min_x = w->xcoord[i]; } max_y = -INT_MAX; min_y = INT_MAX; For(i,2*tree->n_otu-1) { if(w->ycoord[i] > max_y) max_y = w->ycoord[i]; if(w->ycoord[i] < min_y) min_y = w->ycoord[i]; } For(i,2*tree->n_otu-1) { w->xcoord_s[i] = (phydbl)(w->xcoord[i] - min_x) / (max_x - min_x); w->ycoord_s[i] = (phydbl)(w->ycoord[i] - min_y) / (max_y - min_y); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Cdf_Mat(t_tree *tree) { int i,j,k; phydbl min_x,max_x,y; phydbl x_mat,y_mat; t_node *d, *a; phydbl eps; eps = 1.E-6; For(i,2*tree->n_otu-1) tree->ps_tree->cdf_mat_x[i] = tree->ps_tree->xcoord_s[i]; For(i,2*tree->n_otu-1) tree->ps_tree->cdf_mat_y[i] = tree->ps_tree->ycoord_s[i]; Qksort(tree->ps_tree->cdf_mat_x,NULL,0,2*tree->n_otu-2); Qksort(tree->ps_tree->cdf_mat_y,NULL,0,2*tree->n_otu-2); For(i,2*tree->n_otu-2) /* x coordinates */ { For(j,2*tree->n_otu-2) /* y coordinates */ { For(k,2*tree->n_otu-2) /* all nodes in the tree */ { d = tree->a_nodes[k]; a = tree->a_nodes[k]->anc; min_x = tree->ps_tree->xcoord_s[a->num]; max_x = tree->ps_tree->xcoord_s[d->num]; y = tree->ps_tree->ycoord_s[d->num]; x_mat = tree->ps_tree->cdf_mat_x[i]; y_mat = tree->ps_tree->cdf_mat_y[j]; /* printf("\n. x_mat=%.1f ymat=%.1f min=%.1f max=%.1f y=%.1f", */ /* x_mat,y_mat,min_x,max_x,y); */ if((min_x < x_mat + eps) && (max_x > x_mat) && (y > y_mat)) { tree->ps_tree->cdf_mat[j*(2*tree->n_otu-2)+i] += 1; /* PhyML_Printf("\n. Add 1 to [%.1f,%.1f]", */ /* tree->ps_tree->cdf_mat_x[i], */ /* tree->ps_tree->cdf_mat_y[j]); */ } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Draw_Tree(FILE *fp, t_tree *tree) { int i; t_dsk *disk; disk = tree->young_disk; do disk = disk->prev; while(disk->prev); PhyML_Fprintf(fp,"plot(c(%f,%f),c(%f,%f),type=\"n\");", tree->mmod->lim_do->lonlat[0], tree->mmod->lim_up->lonlat[0], tree->young_disk->time, disk->time); disk = tree->young_disk; for(i=0;in_ldsk_a;++i) PhyML_Fprintf(fp,"\n segments(%f,%f,%f,%f);", disk->ldsk_a[i]->coord->lonlat[0], disk->time, disk->ldsk_a[i]->prev->coord->lonlat[0], disk->ldsk_a[i]->prev->disk->time); disk = disk->prev; do { if(disk->ldsk != NULL) { PhyML_Fprintf(fp,"\n segments(%f,%f,%f,%f);", disk->ldsk->coord->lonlat[0], disk->time, disk->ldsk->prev->coord->lonlat[0], disk->ldsk->prev->disk->time); } disk = disk->prev; } while(disk->prev); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/draw.h000066400000000000000000000023421501136442400203000ustar00rootroot00000000000000#include #ifndef DRAW_H #define DRAW_H #include "utilities.h" void DR_Dist_To_Root_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void DR_Dist_To_Root(t_node *n_root, t_tree *tree); void DR_Get_X_Coord_Pre(t_node *a, t_node *d, t_edge *b, tdraw *w, int fixed_tips, t_tree *tree); void DR_Get_X_Coord(int fixed_tips, tdraw *w, t_tree *tree); tdraw *DR_Make_Tdraw_Struct(t_tree *tree); void DR_Init_Tdraw_Struct(tdraw *d); void DR_Get_Tree_Box_Width(tdraw *w, t_tree *tree); void DR_Get_Y_Coord_Post(t_node *a, t_node *d, t_edge *b, int *next_y_slot, int fixed_tips, tdraw *w, t_tree *tree); void DR_Get_Y_Coord(int fixed_tips, tdraw *w, t_tree *tree); void DR_Get_Tree_Coord(t_tree *tree); phydbl DR_Get_Max_Dist_To_Root(t_tree *tree); void DR_Print_Tree_Postscript(int tree_num, int render_name,FILE *fp, t_tree *tree); void DR_Print_Tree_Postscript_Pre(t_node *a, t_node *d, t_edge *b, int render_name, FILE *fp, tdraw *w, t_tree *tree); void DR_Print_Postscript_EOF(FILE *fp); void DR_Print_Postscript_Header(int n_pages, FILE *fp); void DR_Get_Tree_Coord_Scaled(tdraw *w, t_tree *tree); void DR_Get_Cdf_Mat(t_tree *tree); void DR_Draw_Tree(char *file_name, t_tree *tree); void PHYREX_Draw_Tree(FILE *fp, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/eigen.c000066400000000000000000000621301501136442400204260ustar00rootroot00000000000000/*********************************************************** * This eigen() routine works for eigenvalue/vector analysis * for real general square matrix A * A will be destroyed * rr,ri are vectors containing eigenvalues * vr,vi are matrices containing (right) real and imaginary eigenvectors * * A * [vr+vi*i] = [vr+vi*i] * diag{rr+ri*i} * * Algorithm: Handbook for Automatic Computation, vol 2 * by Wilkinson and Reinsch, 1971 * most of source codes were taken from a public domain * solftware called MATCALC. * Credits: to the authors of MATCALC * * return -1 not converged * 0 no complex eigenvalues/vectors * 1 complex eigenvalues/vectors * Tianlin Wang at University of Illinois * Thu May 6 15:22:31 CDT 1993 ***************************************************************/ #include "eigen.h" #define BASE 2 /* base of floating point arithmetic */ /* no. of digits to the base BASE in the fraction */ #define DIGITS 40 /* #define DIGITS 53 */ #define MAXITER 10000 /* max2. no. of iterations to converge */ #define pos(i,j,n) ((i)*(n)+(j)) /* rr/vr : real parts of eigen values/vectors */ /* ri/vi : imaginary part s of eigen values/vectors */ int Eigen(int job, phydbl *A, int n, phydbl *rr, phydbl *ri, phydbl *vr, phydbl *vi, phydbl *work) { /* job=0: eigen values only 1: both eigen values and eigen vectors phydbl w[n*2]: work space */ int low,hi,i,j,k, it, istate=0; phydbl tiny, t; for(i=0;itiny) istate=1; } return (istate) ; } /* complex functions */ complex compl (phydbl re,phydbl im) { complex r; r.re = re; r.im = im; return(r); } complex _conj (complex a) { a.im = -a.im; return(a); } complex cplus (complex a, complex b) { complex c; c.re = a.re+b.re; c.im = a.im+b.im; return (c); } complex cminus (complex a, complex b) { complex c; c.re = a.re-b.re; c.im = a.im-b.im; return (c); } complex cby (complex a, complex b) { complex c; c.re = a.re*b.re-a.im*b.im ; c.im = a.re*b.im+a.im*b.re ; return (c); } complex cdiv (complex a,complex b) { phydbl ratio, den; complex c; if (fabs(b.re) <= fabs(b.im)) { ratio = b.re / b.im; den = b.im * (1 + ratio * ratio); c.re = (a.re * ratio + a.im) / den; c.im = (a.im * ratio - a.re) / den; } else { ratio = b.im / b.re; den = b.re * (1 + ratio * ratio); c.re = (a.re + a.im * ratio) / den; c.im = (a.im - a.re * ratio) / den; } return(c); } /* complex local_cexp (complex a) */ /* { */ /* complex c; */ /* c.re = exp(a.re); */ /* if (fabs(a.im)==0) c.im = 0; */ /* else { c.im = c.re*sin(a.im); c.re*=cos(a.im); } */ /* return (c); */ /* } */ complex cfactor (complex x, phydbl a) { complex c; c.re = a*x.re; c.im = a*x.im; return (c); } int cxtoy (complex *x, complex *y, int n) { int i; For (i,n) y[i]=x[i]; return (0); } int cmatby (complex *a, complex *b, complex *c, int n,int m,int k) /* a[n*m], b[m*k], c[n*k] ...... c = a*b */ { int i,j,i1; complex t; For (i,n) for(j=0;j=n */ int i,j,k, *irow=(int*) space; phydbl xmaxsize, ee=1e-20; complex t,t1; for(i=0;i=0; i--) { if (irow[i] == i) continue; for(j=0;j= 0; k--) { for (j = k; j >= 0; j--) { for (i = 0; i <= k; i++) { if (i != j && fabs(mat[pos(j,i,n)]) > SMALL) break; } if (i > k) { scale[k] = j; if (j != k) { for (i = 0; i <= k; i++) { c = mat[pos(i,j,n)]; mat[pos(i,j,n)] = mat[pos(i,k,n)]; mat[pos(i,k,n)] = c; } for (i = 0; i < n; i++) { c = mat[pos(j,i,n)]; mat[pos(j,i,n)] = mat[pos(k,i,n)]; mat[pos(k,i,n)] = c; } } break; } } if (j < 0) break; } /* search for columns isolating an eigenvalue and push them left */ for (l = 0; l <= k; l++) { for (j = l; j <= k; j++) { for (i = l; i <= k; i++) { if (i != j && fabs(mat[pos(i,j,n)]) > SMALL) break; } if (i > k) { scale[l] = j; if (j != l) { for (i = 0; i <= k; i++) { c = mat[pos(i,j,n)]; mat[pos(i,j,n)] = mat[pos(i,l,n)]; mat[pos(i,l,n)] = c; } for (i = l; i < n; i++) { c = mat[pos(j,i,n)]; mat[pos(j,i,n)] = mat[pos(l,i,n)]; mat[pos(l,i,n)] = c; } } break; } } if (j > k) break; } *hi = k; *low = l; /* balance the submatrix in rows l through k */ for (i = l; i <= k; i++) { scale[i] = 1; } do { for (done = 1,i = l; i <= k; i++) { for (c = 0,r = 0,j = l; j <= k; j++) { if (j != i) { c += fabs(mat[pos(j,i,n)]); r += fabs(mat[pos(i,j,n)]); } } /* if (c != 0 && r != 0) { */ if ((fabs(c) > SMALL || fabs(c) < -SMALL) && (fabs(r) > SMALL || fabs(r) < -SMALL)) { g = r / BASE; f = 1; s = c + r; while (c < g) { f *= BASE; c *= BASE * BASE; } g = r * BASE; while (c >= g) { f /= BASE; c /= BASE * BASE; } if ((c + r) / f < 0.95 * s) { done = 0; g = 1 / f; scale[i] *= f; for (j = l; j < n; j++) { mat[pos(i,j,n)] *= g; } for (j = 0; j <= k; j++) { mat[pos(j,i,n)] *= f; } } } } } while (!done); } /* * Transform back eigenvectors of a balanced matrix * into the eigenvectors of the original matrix */ void unbalance(int n,phydbl *vr,phydbl *vi, int low, int hi, phydbl *scale) { int i,j,k; phydbl tmp; for (i = low; i <= hi; i++) { for (j = 0; j < n; j++) { vr[pos(i,j,n)] *= scale[i]; vi[pos(i,j,n)] *= scale[i]; } } for (i = low - 1; i >= 0; i--) { if ((k = (int)scale[i]) != i) { for (j = 0; j < n; j++) { tmp = vr[pos(i,j,n)]; vr[pos(i,j,n)] = vr[pos(k,j,n)]; vr[pos(k,j,n)] = tmp; tmp = vi[pos(i,j,n)]; vi[pos(i,j,n)] = vi[pos(k,j,n)]; vi[pos(k,j,n)] = tmp; } } } for (i = hi + 1; i < n; i++) { if ((k = (int)scale[i]) != i) { for (j = 0; j < n; j++) { tmp = vr[pos(i,j,n)]; vr[pos(i,j,n)] = vr[pos(k,j,n)]; vr[pos(k,j,n)] = tmp; tmp = vi[pos(i,j,n)]; vi[pos(i,j,n)] = vi[pos(k,j,n)]; vi[pos(k,j,n)] = tmp; } } } } /* * Reduce the submatrix in rows and columns low through hi of real matrix mat to * Hessenberg form by elementary similarity transformations */ void elemhess(int job,phydbl *mat,int n,int low,int hi, phydbl *vr, phydbl *vi, int *work) { /* work[n] */ unsigned int i,j,m; phydbl x,y; for (m = low + 1; m < hi; m++) { for (x = 0,i = m,j = m; j <= hi; j++) { if(fabs(mat[pos(j,m-1,n)]) > fabs(x)) { x = mat[pos(j,m-1,n)]; i = j; } } if ((work[m] = i) != m) { for (j = m - 1; j < n; j++) { y = mat[pos(i,j,n)]; mat[pos(i,j,n)] = mat[pos(m,j,n)]; mat[pos(m,j,n)] = y; } for (j = 0; j <= hi; j++) { y = mat[pos(j,i,n)]; mat[pos(j,i,n)] = mat[pos(j,m,n)]; mat[pos(j,m,n)] = y; } } if (fabs(x) > SMALL) { for (i = m + 1; i <= hi; i++) { if (fabs(y = mat[pos(i,m-1,n)]) > SMALL) { y = mat[pos(i,m-1,n)] = y / x; for (j = m; j < n; j++) { mat[pos(i,j,n)] -= y * mat[pos(m,j,n)]; } for (j = 0; j <= hi; j++) { mat[pos(j,m,n)] += y * mat[pos(j,i,n)]; } } } } } if (job) { for (i=0; i low; m--) { for (i = m + 1; i <= hi; i++) { vr[pos(i,m,n)] = mat[pos(i,m-1,n)]; } if ((i = work[m]) != m) { for (j = m; j <= hi; j++) { vr[pos(m,j,n)] = vr[pos(i,j,n)]; vr[pos(i,j,n)] = 0.0; } vr[pos(i,m,n)] = 1.0; } } } } /* * Calculate eigenvalues and eigenvectors of a real upper Hessenberg matrix * Return 1 if converges successfully and 0 otherwise */ int realeig(int job,phydbl *mat,int n,int low, int hi, phydbl *valr, phydbl *vali, phydbl *vr,phydbl *vi) { complex v; phydbl p=.0,q=.0,r=.0,s=.0,t,w,x,y,z=0,ra,sa,norm,eps; int niter,en,i,j,k,l,m; phydbl precision = POW((phydbl)BASE,(phydbl)(1-(int)DIGITS)); // Won't pass testiphy... /* phydbl precision = SMALL; */ eps = precision; for (i=0; i hi) valr[i] = mat[pos(i,i,n)]; } t = 0; en = hi; while (en >= low) { niter = 0; for (;;) { /* look for single small subdiagonal element */ for (l = en; l > low; l--) { s = fabs(mat[pos(l-1,l-1,n)]) + fabs(mat[pos(l,l,n)]); if (fabs(s) < SMALL) s = norm; if (fabs(mat[pos(l,l-1,n)]) <= eps * s) break; } /* form shift */ x = mat[pos(en,en,n)]; if (l == en) { /* one root found */ valr[en] = x + t; if (job) mat[pos(en,en,n)] = x + t; en--; break; } y = mat[pos(en-1,en-1,n)]; w = mat[pos(en,en-1,n)] * mat[pos(en-1,en,n)]; if (l == en - 1) { /* two roots found */ p = (y - x) / 2; q = p * p + w; z = SQRT(fabs(q)); x += t; if (job) { mat[pos(en,en,n)] = x; mat[pos(en-1,en-1,n)] = y + t; } if (q < 0) { /* complex pair */ valr[en-1] = x+p; vali[en-1] = z; valr[en] = x+p; vali[en] = -z; } else { /* real pair */ z = (p < 0) ? p - z : p + z; valr[en-1] = x + z; valr[en] = (fabs(z) < SMALL) ? x + z : x - w / z; if (job) { x = mat[pos(en,en-1,n)]; s = fabs(x) + fabs(z); p = x / s; q = z / s; r = SQRT(p*p+q*q); p /= r; q /= r; for (j = en - 1; j < n; j++) { z = mat[pos(en-1,j,n)]; mat[pos(en-1,j,n)] = q * z + p * mat[pos(en,j,n)]; mat[pos(en,j,n)] = q * mat[pos(en,j,n)] - p*z; } for (i = 0; i <= en; i++) { z = mat[pos(i,en-1,n)]; mat[pos(i,en-1,n)] = q * z + p * mat[pos(i,en,n)]; mat[pos(i,en,n)] = q * mat[pos(i,en,n)] - p*z; } for (i = low; i <= hi; i++) { z = vr[pos(i,en-1,n)]; vr[pos(i,en-1,n)] = q*z + p*vr[pos(i,en,n)]; vr[pos(i,en,n)] = q*vr[pos(i,en,n)] - p*z; } } } en -= 2; break; } if (niter == MAXITER) return(-1); if (niter != 0 && niter % 10 == 0) { t += x; for (i = low; i <= en; i++) mat[pos(i,i,n)] -= x; s = fabs(mat[pos(en,en-1,n)]) + fabs(mat[pos(en-1,en-2,n)]); x = y = 0.75 * s; w = -0.4375 * s * s; } niter++; /* look for two consecutive small subdiagonal elements */ for (m = en - 2; m >= l; m--) { z = mat[pos(m,m,n)]; r = x - z; s = y - z; p = (r * s - w) / mat[pos(m+1,m,n)] + mat[pos(m,m+1,n)]; q = mat[pos(m+1,m+1,n)] - z - r - s; r = mat[pos(m+2,m+1,n)]; s = fabs(p) + fabs(q) + fabs(r); p /= s; q /= s; r /= s; if (m == l || fabs(mat[pos(m,m-1,n)]) * (fabs(q)+fabs(r)) <= eps * (fabs(mat[pos(m-1,m-1,n)]) + fabs(z) + fabs(mat[pos(m+1,m+1,n)])) * fabs(p)) break; } for (i = m + 2; i <= en; i++) mat[pos(i,i-2,n)] = 0; for (i = m + 3; i <= en; i++) mat[pos(i,i-3,n)] = 0; /* phydbl QR step involving rows l to en and columns m to en */ for (k = m; k < en; k++) { if (k != m) { p = mat[pos(k,k-1,n)]; q = mat[pos(k+1,k-1,n)]; r = (k == en - 1) ? 0 : mat[pos(k+2,k-1,n)]; if (fabs(x = fabs(p) + fabs(q) + fabs(r)) < SMALL) continue; p /= x; q /= x; r /= x; } s = SQRT(p*p+q*q+r*r); if (p < 0) s = -s; if (k != m) { mat[pos(k,k-1,n)] = -s * x; } else if (l != m) { mat[pos(k,k-1,n)] = -mat[pos(k,k-1,n)]; } p += s; x = p / s; y = q / s; z = r / s; q /= p; r /= p; /* row modification */ for (j = k; j <= (!job ? en : n-1); j++){ p = mat[pos(k,j,n)] + q * mat[pos(k+1,j,n)]; if (k != en - 1) { p += r * mat[pos(k+2,j,n)]; mat[pos(k+2,j,n)] -= p * z; } mat[pos(k+1,j,n)] -= p * y; mat[pos(k,j,n)] -= p * x; } j = MIN(en,k+3); /* column modification */ for (i = (!job ? l : 0); i <= j; i++) { p = x * mat[pos(i,k,n)] + y * mat[pos(i,k+1,n)]; if (k != en - 1) { p += z * mat[pos(i,k+2,n)]; mat[pos(i,k+2,n)] -= p*r; } mat[pos(i,k+1,n)] -= p*q; mat[pos(i,k,n)] -= p; } if (job) { /* accumulate transformations */ for (i = low; i <= hi; i++) { p = x * vr[pos(i,k,n)] + y * vr[pos(i,k+1,n)]; if (k != en - 1) { p += z * vr[pos(i,k+2,n)]; vr[pos(i,k+2,n)] -= p*r; } vr[pos(i,k+1,n)] -= p*q; vr[pos(i,k,n)] -= p; } } } } } if (!job) return(0); if (fabs(norm) > SMALL) { /* back substitute to find vectors of upper triangular form */ for (en = n-1; en >= 0; en--) { p = valr[en]; if ((q = vali[en]) < 0) { /* complex vector */ m = en - 1; if (fabs(mat[pos(en,en-1,n)]) > fabs(mat[pos(en-1,en,n)])) { mat[pos(en-1,en-1,n)] = q / mat[pos(en,en-1,n)]; mat[pos(en-1,en,n)] = (p - mat[pos(en,en,n)]) / mat[pos(en,en-1,n)]; } else { v = cdiv(compl(0.0,-mat[pos(en-1,en,n)]), compl(mat[pos(en-1,en-1,n)]-p,q)); mat[pos(en-1,en-1,n)] = v.re; mat[pos(en-1,en,n)] = v.im; } mat[pos(en,en-1,n)] = 0; mat[pos(en,en,n)] = 1; for (i = en - 2; i >= 0; i--) { w = mat[pos(i,i,n)] - p; ra = 0; sa = mat[pos(i,en,n)]; for (j = m; j < en; j++) { ra += mat[pos(i,j,n)] * mat[pos(j,en-1,n)]; sa += mat[pos(i,j,n)] * mat[pos(j,en,n)]; } if (vali[i] < 0) { z = w; r = ra; s = sa; } else { m = i; if (fabs(vali[i]) < SMALL) { v = cdiv(compl(-ra,-sa),compl(w,q)); mat[pos(i,en-1,n)] = v.re; mat[pos(i,en,n)] = v.im; } else { /* solve complex equations */ x = mat[pos(i,i+1,n)]; y = mat[pos(i+1,i,n)]; v.re = (valr[i]- p)*(valr[i]-p) + vali[i]*vali[i] - q*q; v.im = (valr[i] - p)*2*q; if (fabs(v.re) + fabs(v.im) < SMALL) { v.re = eps * norm * (fabs(w) + fabs(q) + fabs(x) + fabs(y) + fabs(z)); } v = cdiv(compl(x*r-z*ra+q*sa,x*s-z*sa-q*ra),v); mat[pos(i,en-1,n)] = v.re; mat[pos(i,en,n)] = v.im; if (fabs(x) > fabs(z) + fabs(q)) { mat[pos(i+1,en-1,n)] = (-ra - w * mat[pos(i,en-1,n)] + q * mat[pos(i,en,n)]) / x; mat[pos(i+1,en,n)] = (-sa - w * mat[pos(i,en,n)] - q * mat[pos(i,en-1,n)]) / x; } else { v = cdiv(compl(-r-y*mat[pos(i,en-1,n)], -s-y*mat[pos(i,en,n)]),compl(z,q)); mat[pos(i+1,en-1,n)] = v.re; mat[pos(i+1,en,n)] = v.im; } } } } } else if (fabs(q) < SMALL) { /* real vector */ m = en; mat[pos(en,en,n)] = 1; for (i = en - 1; i >= 0; i--) { w = mat[pos(i,i,n)] - p; r = mat[pos(i,en,n)]; for (j = m; j < en; j++) { r += mat[pos(i,j,n)] * mat[pos(j,en,n)]; } if (vali[i] < 0) { z = w; s = r; } else { m = i; if (fabs(vali[i]) < SMALL) { if (fabs(t = w) < SMALL) t = eps * norm; mat[pos(i,en,n)] = -r / t; } else { /* solve real equations */ x = mat[pos(i,i+1,n)]; y = mat[pos(i+1,i,n)]; q = (valr[i] - p) * (valr[i] - p) + vali[i]*vali[i]; t = (x * s - z * r) / q; mat[pos(i,en,n)] = t; if (fabs(x) <= fabs(z)) { mat[pos(i+1,en,n)] = (-s - y * t) / z; } else { mat[pos(i+1,en,n)] = (-r - w * t) / x; } } } } } } /* vectors of isolated roots */ for (i = 0; i < n; i++) { if (i < low || i > hi) { for (j = i; j < n; j++) { vr[pos(i,j,n)] = mat[pos(i,j,n)]; } } } /* multiply by transformation matrix */ for (j = n-1; j >= low; j--) { m = MIN(j,hi); for (i = low; i <= hi; i++) { for (z = 0,k = low; k <= m; k++) { z += vr[pos(i,k,n)] * mat[pos(k,j,n)]; } vr[pos(i,j,n)] = z; } } } /* rearrange complex eigenvectors */ for (j = 0; j < n; j++) { if (fabs(vali[j]) > SMALL) { for (i = 0; i < n; i++) { vi[pos(i,j,n)] = vr[pos(i,j+1,n)]; vr[pos(i,j+1,n)] = vr[pos(i,j,n)]; vi[pos(i,j+1,n)] = -vi[pos(i,j,n)]; } j++; } } return(0); } #define LUDCMP_TINY 1.0e-20; int ludcmp(phydbl **a, int n, phydbl *d) { int i,imax,j,k; phydbl big,dum,sum,temp; phydbl *vv; imax = 0; vv = (phydbl *)mCalloc(n,sizeof(phydbl)); *d=1.0; for (i=0;i big) big=temp; if (fabs(big) < SMALL) Exit("\n. Singular matrix in routine LUDCMP"); vv[i]=1.0/big; } for (j=0;j= big) { big=dum; imax=i; } } if (j != imax) { for (k=0;k big) big=temp; if (fabs(big) < SMALL) Exit("\n. Singular matrix in routine LUDCMP"); vv[i]=1.0/big; } for (j=0;j= big) { big=dum; imax=i; } } if (j != imax) { for (k=0;k #ifndef EIGEN_H #define EIGEN_H #include "utilities.h" #include "free.h" #ifdef RWRAPPER #include #endif int ludcmp_1D(phydbl *a, int n, phydbl *d); void det_1D(phydbl *a, int n, phydbl *d); int Eigen(int job, phydbl *A, int n, phydbl *rr, phydbl *ri, phydbl *vr, phydbl *vi, phydbl *w); void balance(phydbl *mat, int n, int *low, int *hi, phydbl *scale); void unbalance(int n, phydbl *vr, phydbl *vi, int low, int hi, phydbl *scale); int realeig(int job, phydbl *mat, int n,int low, int hi, phydbl *valr, phydbl *vali, phydbl *vr, phydbl *vi); void elemhess(int job, phydbl *mat, int n, int low, int hi, phydbl *vr, phydbl *vi, int *work); int ludcmp(phydbl **a, int n, phydbl *d); void det(phydbl **a, int n, phydbl *d); /* complex functions */ typedef struct { phydbl re, im; } complex; #define csize(a) (FABS(a.re)+FABS(a.im)) complex compl (phydbl re,phydbl im); complex _conj (complex a); complex cplus (complex a, complex b); complex cminus (complex a, complex b); complex cby (complex a, complex b); complex cdiv (complex a,complex b); /* complex local_cexp (complex a); */ complex cfactor (complex x, phydbl a); int cxtoy (complex *x, complex *y, int n); int cmatby (complex *a, complex *b, complex *c, int n,int m,int k); int cmatout (FILE * fout, complex *x, int n, int m); int cmatinv( complex *x, int n, int m, phydbl *space); phydbl *Cholesky_Decomp(phydbl *A, int dim); #endif stephaneguindon-phyml-76a39c8/src/evolve.c000066400000000000000000001335131501136442400206430ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "evolve.h" int EVOLVE_Main(int argc, char **argv) { option *io; t_tree *tree; calign *cdata; char *dum; FILE *fp; int r_seed; dum = (char *)mCalloc(100, sizeof(char)); io = NULL; io = (option *)Get_Input(argc, argv); if (!io) return (0); else if (io->use_xml == YES) { Free(io); return (0); } r_seed = (io->r_seed < 0) ? (time(NULL)) : (io->r_seed); srand(r_seed); io->r_seed = r_seed; io->data = Make_Empty_Alignment(io); Make_Model_Complete(io->mod); Set_Model_Name(io->mod); Print_Settings(io); io->colalias = NO; cdata = Compact_Data(io->data, io); Free_Seq(io->data, io->n_otu); tree = Make_Tree_From_Scratch(io->n_otu, cdata); Connect_CSeqs_To_Nodes(cdata, io, tree); tree->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->rates, io->rates, tree->n_otu); tree->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->times, io->times, tree->n_otu); tree->data = cdata; tree->mod = io->mod; tree->io = io; tree->times->scaled_pop_size = 1.E+3; tree->times->neff_growth = 0.5; EVOLVE_Coalescent(tree); Init_Model(tree->data, tree->mod, io); Set_Model_Parameters(tree->mod); Set_Model_Name(tree->mod); Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Make_Spr(tree); sprintf(dum, "%s%d%s", "./", io->r_seed, "_evolve_stats.txt"); fp = Openfile(dum, WRITE); EVOLVE_Seq(tree->data, tree->mod, fp, tree); fclose(fp); sprintf(dum, "%s%d%s", "./", io->r_seed, "_evolve_data.txt"); fp = Openfile(dum, WRITE); Print_CSeq(fp, NO, tree->data, tree); fclose(fp); sprintf(dum, "%s%d%s", "./", io->r_seed, "_evolve_tree.txt"); fp = Openfile(dum, WRITE); PhyML_Fprintf(fp, "%s\n", Write_Tree(tree)); fclose(fp); // Write XML configuration file for downstream PhyML analyses xml_node *root, *nd, *ndnd, *ndndnd; char *model, *cv_type; model = (char *)mCalloc(100, sizeof(char)); cv_type = (char *)mCalloc(100, sizeof(char)); strcpy(model, "noras"); strcpy(cv_type, "kfold.pos"); root = XML_Make_Node("phyml"); XML_Init_Node(NULL, root, "phyml"); sprintf(dum, "%s_%s",model, cv_type); root->attr = XML_Make_Attribute(NULL, "run.id",dum); sprintf(dum, "%d", io->r_seed); XML_Add_Attribute(root, "output.file",dum); XML_Add_Attribute(root, "cv.type",cv_type); nd = XML_Add_Node(root, "topology"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "T1"); XML_Add_Attribute(ndnd, "init.tree", "BioNJ"); nd = XML_Add_Node(root, "ratematrices"); nd->attr = XML_Make_Attribute(NULL, "id", "RM1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "M1"); XML_Add_Attribute(ndnd, "model", "HKY85"); // XML_Add_Attribute(ndnd, "optimise.rr","yes"); XML_Add_Attribute(ndnd, "optimise.tstv", "yes"); nd = XML_Add_Node(root, "siterates"); nd->attr = XML_Make_Attribute(NULL, "id", "SR1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R1"); XML_Add_Attribute(ndnd, "init.value", "1.0"); ndnd = XML_Add_Node(nd, "weights"); ndnd->attr = XML_Make_Attribute(NULL, "id", "D1"); XML_Add_Attribute(ndnd, "family", "freerates"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R1"); XML_Add_Attribute(ndndnd, "value", "1.0"); nd = XML_Add_Node(root, "equfreqs"); nd->attr = XML_Make_Attribute(NULL, "id", "EF1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "F1"); XML_Add_Attribute(ndnd, "optimise.freqs", "no"); nd = XML_Add_Node(root, "branchlengths"); nd->attr = XML_Make_Attribute(NULL, "id", "BL1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "L1"); XML_Add_Attribute(ndnd, "optimise.lens", "yes"); nd = XML_Add_Node(root, "partitionelem"); nd->attr = XML_Make_Attribute(NULL, "id", "partition1"); dum = (char *)mCalloc(100, sizeof(char)); sprintf(dum, "%s%d%s", "./", io->r_seed, "_evolve_data.txt"); XML_Add_Attribute(nd, "file.name", dum); XML_Add_Attribute(nd, "data.type", "nt"); XML_Add_Attribute(nd, "interleaved", "no"); // ndnd = XML_Add_Node(nd, "mixtureelem"); // ndnd->attr = XML_Make_Attribute(NULL, "list", "T1,T1,T1"); // ndnd = XML_Add_Node(nd, "mixtureelem"); // ndnd->attr = XML_Make_Attribute(NULL, "list", "M1,M1,M1"); // ndnd = XML_Add_Node(nd, "mixtureelem"); // ndnd->attr = XML_Make_Attribute(NULL, "list", "F1,F1,F1"); // ndnd = XML_Add_Node(nd, "mixtureelem"); // ndnd->attr = XML_Make_Attribute(NULL, "list", "R1,R2,R3"); // ndnd = XML_Add_Node(nd, "mixtureelem"); // ndnd->attr = XML_Make_Attribute(NULL, "list", "L1,L1,L1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "T1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "M1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "F1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "R1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "L1"); sprintf(dum, "%s%d_%s_%s_%s", "./",io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model,"noras"); strcpy(cv_type, "kfold.col"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance" , NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./",io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "noras"); strcpy(cv_type, "maxfold"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "dg4"); strcpy(cv_type, "kfold.pos"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); nd = XML_Search_Node_Name("siterates", NO, root); XML_Prune_XML_Tree(nd); XML_Free_XML_Tree(nd); nd = XML_Add_Node(root, "siterates"); nd->attr = XML_Make_Attribute(NULL, "id", "SR1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R1"); XML_Add_Attribute(ndnd, "init.value", "1.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R2"); XML_Add_Attribute(ndnd, "init.value", "1.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R3"); XML_Add_Attribute(ndnd, "init.value", "1.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R4"); XML_Add_Attribute(ndnd, "init.value", "1.0"); ndnd = XML_Add_Node(nd, "weights"); ndnd->attr = XML_Make_Attribute(NULL, "id", "D1"); XML_Add_Attribute(ndnd, "family", "gamma"); XML_Add_Attribute(ndnd, "optimise.alpha", "yes"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R1"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R2"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R3"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R4"); XML_Add_Attribute(ndndnd, "value", "1.0"); nd = XML_Search_Node_Name("partitionelem", NO, root); XML_Prune_XML_Tree(nd); XML_Free_XML_Tree(nd); nd = XML_Add_Node(root, "partitionelem"); nd->attr = XML_Make_Attribute(NULL, "id", "partition1"); dum = (char *)mCalloc(100, sizeof(char)); sprintf(dum, "%s%d%s", "./", io->r_seed, "_evolve_data.txt"); XML_Add_Attribute(nd, "file.name", dum); XML_Add_Attribute(nd, "data.type", "nt"); XML_Add_Attribute(nd, "interleaved", "no"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "T1,T1,T1,T1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "M1,M1,M1,M1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "F1,F1,F1,F1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "R1,R2,R3,R4"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "L1,L1,L1,L1"); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "dg4"); strcpy(cv_type, "kfold.col"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "dg4"); strcpy(cv_type, "maxfold"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "dg4i"); strcpy(cv_type, "kfold.pos"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id",dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); nd = XML_Search_Node_Name("siterates", NO, root); XML_Prune_XML_Tree(nd); XML_Free_XML_Tree(nd); nd = XML_Add_Node(root, "siterates"); nd->attr = XML_Make_Attribute(NULL, "id", "SR1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R1"); XML_Add_Attribute(ndnd, "init.value", "0.0"); XML_Add_Attribute(ndnd, "value", "0.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R2"); XML_Add_Attribute(ndnd, "init.value", "2.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R3"); XML_Add_Attribute(ndnd, "init.value", "3.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R4"); XML_Add_Attribute(ndnd, "init.value", "4.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R5"); XML_Add_Attribute(ndnd, "init.value", "5.0"); ndnd = XML_Add_Node(nd, "weights"); ndnd->attr = XML_Make_Attribute(NULL, "id", "D1"); XML_Add_Attribute(ndnd, "family", "gamma+inv"); XML_Add_Attribute(ndnd, "optimise.alpha", "yes"); XML_Add_Attribute(ndnd, "optimise.pinv", "yes"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R1"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R2"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R3"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R4"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R5"); XML_Add_Attribute(ndndnd, "value", "1.0"); nd = XML_Search_Node_Name("partitionelem", NO, root); XML_Prune_XML_Tree(nd); XML_Free_XML_Tree(nd); nd = XML_Add_Node(root, "partitionelem"); nd->attr = XML_Make_Attribute(NULL, "id", "partition1"); dum = (char *)mCalloc(100, sizeof(char)); sprintf(dum, "%s%d%s", "./", io->r_seed, "_evolve_data.txt"); XML_Add_Attribute(nd, "file.name", dum); XML_Add_Attribute(nd, "data.type", "nt"); XML_Add_Attribute(nd, "interleaved", "no"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "T1,T1,T1,T1,T1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "M1,M1,M1,M1,M1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "F1,F1,F1,F1,F1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "R1,R2,R3,R4,R5"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "L1,L1,L1,L1,L1"); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "dg4i"); strcpy(cv_type, "kfold.col"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "dg4i"); strcpy(cv_type, "maxfold"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "fr3"); strcpy(cv_type, "kfold.pos"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); nd = XML_Search_Node_Name("siterates", NO, root); XML_Prune_XML_Tree(nd); XML_Free_XML_Tree(nd); nd = XML_Add_Node(root, "siterates"); nd->attr = XML_Make_Attribute(NULL, "id", "SR1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R1"); XML_Add_Attribute(ndnd, "init.value", "1.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R2"); XML_Add_Attribute(ndnd, "init.value", "2.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R3"); XML_Add_Attribute(ndnd, "init.value", "3.0"); ndnd = XML_Add_Node(nd, "weights"); ndnd->attr = XML_Make_Attribute(NULL, "id", "D1"); XML_Add_Attribute(ndnd, "family", "freerates"); XML_Add_Attribute(ndnd, "optimise.freerates", "yes"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R1"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R2"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R3"); XML_Add_Attribute(ndndnd, "value", "1.0"); nd = XML_Search_Node_Name("partitionelem", NO, root); XML_Prune_XML_Tree(nd); XML_Free_XML_Tree(nd); nd = XML_Add_Node(root, "partitionelem"); nd->attr = XML_Make_Attribute(NULL, "id", "partition1"); dum = (char *)mCalloc(100, sizeof(char)); sprintf(dum, "%s%d%s", "./", io->r_seed, "_evolve_data.txt"); XML_Add_Attribute(nd, "file.name", dum); XML_Add_Attribute(nd, "data.type", "nt"); XML_Add_Attribute(nd, "interleaved", "no"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "T1,T1,T1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "M1,M1,M1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "F1,F1,F1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "R1,R2,R3"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "L1,L1,L1"); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "fr3"); strcpy(cv_type, "kfold.col"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "fr3"); strcpy(cv_type, "maxfold"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "fr8"); strcpy(cv_type, "kfold.pos"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); nd = XML_Search_Node_Name("siterates", NO, root); XML_Prune_XML_Tree(nd); XML_Free_XML_Tree(nd); nd = XML_Add_Node(root, "siterates"); nd->attr = XML_Make_Attribute(NULL, "id", "SR1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R1"); XML_Add_Attribute(ndnd, "init.value", "1.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R2"); XML_Add_Attribute(ndnd, "init.value", "2.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R3"); XML_Add_Attribute(ndnd, "init.value", "3.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R4"); XML_Add_Attribute(ndnd, "init.value", "4.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R5"); XML_Add_Attribute(ndnd, "init.value", "5.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R6"); XML_Add_Attribute(ndnd, "init.value", "6.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R7"); XML_Add_Attribute(ndnd, "init.value", "7.0"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R8"); XML_Add_Attribute(ndnd, "init.value", "8.0"); ndnd = XML_Add_Node(nd, "weights"); ndnd->attr = XML_Make_Attribute(NULL, "id", "D1"); XML_Add_Attribute(ndnd, "family", "freerates"); XML_Add_Attribute(ndnd, "optimise.freerates", "yes"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R1"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R2"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R3"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R4"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R5"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R6"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R7"); XML_Add_Attribute(ndndnd, "value", "1.0"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R8"); XML_Add_Attribute(ndndnd, "value", "1.0"); nd = XML_Search_Node_Name("partitionelem",NO,root); XML_Prune_XML_Tree(nd); XML_Free_XML_Tree(nd); nd = XML_Add_Node(root, "partitionelem"); nd->attr = XML_Make_Attribute(NULL, "id", "partition1"); dum = (char *)mCalloc(100, sizeof(char)); sprintf(dum, "%s%d%s", "./", io->r_seed, "_evolve_data.txt"); XML_Add_Attribute(nd, "file.name", dum); XML_Add_Attribute(nd, "data.type", "nt"); XML_Add_Attribute(nd, "interleaved", "no"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "T1,T1,T1,T1,T1,T1,T1,T1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "M1,M1,M1,M1,M1,M1,M1,M1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "F1,F1,F1,F1,F1,F1,F1,F1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "R1,R2,R3,R4,R5,R6,R7,R8"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "L1,L1,L1,L1,L1,L1,L1,L1"); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "fr8"); strcpy(cv_type, "kfold.col"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); /// /// strcpy(model, "fr8"); strcpy(cv_type, "maxfold"); sprintf(dum, "%s_%s", model, cv_type); XML_Set_Attribute_Value(root, "run.id", dum); sprintf(dum, "%d", io->r_seed); XML_Set_Attribute_Value(root, "output.file", dum); XML_Set_Attribute_Value(root, "cv.type", cv_type); // nd = XML_Search_Node_Name("ratematrices", NO, root); // ndnd = XML_Search_Node_Name("instance", NO, nd); // XML_Set_Attribute_Value(ndnd, "model", model); sprintf(dum, "%s%d_%s_%s_%s", "./", io->r_seed, model, cv_type, "evolve_config.xml"); fp = Openfile(dum, WRITE); XML_Write_XML_Graph(fp, root); fclose(fp); Free(dum); return (-1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void EVOLVE_Coalescent(t_tree *tree) { t_node *n, *new_n, **avail; int n_lineages, idx_ancestor, *rand_idx, idx_edge; short int no_tip_left; phydbl Ne, dt; phydbl T; Ne = tree->times->scaled_pop_size; avail = (t_node **)mCalloc(tree->n_otu, sizeof(t_node *)); if (Ne > tree->times->scaled_pop_size_max || Ne < tree->times->scaled_pop_size_min) assert(FALSE); Get_Node_Ranks_From_Tip_Times(tree); n = tree->a_nodes[0]; while (n->rk_next) n = n->rk_next; for (int i = 0; i < tree->n_otu; ++i) avail[i] = NULL; avail[0] = n; avail[1] = n->rk_prev; // PhyML_Printf("\n. n->time = %f n->rk_prev->time: %f", // tree->times->nd_t[n->num], tree->times->nd_t[n->rk_prev->num]); idx_ancestor = tree->n_otu; idx_edge = 0; new_n = NULL; n = n->rk_prev; n_lineages = 2; no_tip_left = FALSE; T = tree->times->nd_t[n->num]; do { dt = Rexp(Bico(n_lineages, 2) / Ne); T = T - dt; // PhyML_Printf("\n. T: %f", T); if (n->rk_prev == NULL) no_tip_left = TRUE; if (n->rk_prev != NULL && T < tree->times->nd_t[n->rk_prev->num]) { T = tree->times->nd_t[n->rk_prev->num]; if (n->rk_prev->tax == YES) n = n->rk_prev; avail[n_lineages] = n; n_lineages++; // PhyML_Printf("\n. Found tip %s at time %f", n->name, // tree->times->nd_t[n->num]); } else { new_n = tree->a_nodes[idx_ancestor]; tree->times->nd_t[idx_ancestor] = T; idx_ancestor++; rand_idx = Permutate(n_lineages); avail[rand_idx[0]]->v[0] = new_n; avail[rand_idx[1]]->v[0] = new_n; new_n->v[1] = avail[rand_idx[0]]; new_n->v[2] = avail[rand_idx[1]]; avail[rand_idx[0]] = new_n; avail[rand_idx[1]] = avail[n_lineages - 1]; avail[n_lineages - 1] = NULL; Connect_One_Edge_To_Two_Nodes(new_n, new_n->v[1], tree->a_edges[idx_edge], tree); Connect_One_Edge_To_Two_Nodes(new_n, new_n->v[2], tree->a_edges[idx_edge + 1], tree); // PhyML_Printf("\n. Added coalescent node %d at time %f descendants %d %d // # lineages: %d", // idx_ancestor - 1, tree->times->nd_t[idx_ancestor - 1], // new_n->v[1]->num, // new_n->v[2]->num, // n_lineages); n_lineages--; idx_edge += 2; Free(rand_idx); // for(int i=0; i < n_lineages; ++i) PhyML_Printf("\n. Avail: // %d",avail[i]->num); } } while (n_lineages > 1 || no_tip_left == FALSE); tree->n_root = new_n; tree->n_root->v[1]->v[0] = tree->n_root->v[2]; tree->n_root->v[2]->v[0] = tree->n_root->v[1]; Connect_One_Edge_To_Two_Nodes(tree->n_root->v[1], tree->n_root->v[2], tree->a_edges[idx_edge], tree); tree->e_root = tree->a_edges[idx_edge]; // Transform of times for exponentially growning or declining pop size phydbl g = tree->times->neff_growth; for (int i = 0; i < 2 * tree->n_otu - 1; ++i) { tree->times->nd_t[i] = -((1. / g) * log(1. + g * -tree->times->nd_t[i])); assert(!isnan(tree->times->nd_t[i])); } Update_Ancestors(tree->n_root, tree->n_root->v[2], tree->n_root->b[2], tree); Update_Ancestors(tree->n_root, tree->n_root->v[1], tree->n_root->b[1], tree); RATES_Fill_Lca_Table(tree); phydbl L = TIMES_Tree_Length(tree); tree->rates->bl_from_rt = YES; tree->rates->clock_r = 0.1 / L * (2 * tree->n_otu - 2); // tree->rates->clock_r = 0.01 / L * (2 * tree->n_otu - 2); tree->rates->model_id = GAMMA; for (int i = 0; i < 2 * tree->n_otu - 1; ++i) tree->rates->br_r[i] = Rgamma(1., 1.); RATES_Update_Edge_Lengths(tree); Free(avail); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void EVOLVE_Seq(calign *data, t_mod *mod, FILE *fp_stats, t_tree *tree) { int root_state, root_rate_class; int site, n_otu, ns; phydbl *orig_l, *weights; phydbl r_mult, sum; phydbl *state_probs_one_site, *state_probs_all_sites; int switch_to_yes; short int *truth; orig_l = (phydbl *)mCalloc(2 * tree->n_otu - 1, sizeof(phydbl)); for (int i = 0; i < 2 * tree->n_otu - 1; ++i) orig_l[i] = tree->a_edges[i]->l->v; data->n_otu = tree->n_otu; data->io = tree->io; n_otu = tree->n_otu; ns = tree->mod->ns; state_probs_all_sites = (phydbl *)mCalloc(ns * n_otu * data->init_len, sizeof(phydbl)); truth = (short int *)mCalloc(ns * n_otu * data->init_len, sizeof(short int)); weights = (phydbl *)mCalloc(n_otu * data->init_len, sizeof(phydbl)); for (int i = 0; i < n_otu * data->init_len; ++i) weights[i] = 1.; if (mod->use_m4mod) tree->print_labels = YES; Set_Br_Len_Var(NULL, tree); switch_to_yes = NO; if (tree->mod->gamma_mgf_bl == YES) switch_to_yes = YES; Set_Update_Eigen(YES, mod); if (!Set_Model_Parameters(mod)) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (tree->mod->whichmodel == GTR) { for (int i = 0; i < mod->ns; ++i) tree->mod->e_frq->pi_unscaled->v[i] = Uni(); sum = 0.0; for (int i = 0; i < mod->ns; ++i) sum += tree->mod->e_frq->pi_unscaled->v[i]; for (int i = 0; i < mod->ns; ++i) tree->mod->e_frq->pi->v[i] = tree->mod->e_frq->pi_unscaled->v[i] / sum; tree->mod->r_mat->rr_val->v[AC] = log(Uni() * (2. - .5) + .5); tree->mod->r_mat->rr_val->v[AG] = log(Uni() * (8. - 2.) + 2.); tree->mod->r_mat->rr_val->v[AT] = log(Uni() * (2. - .5) + .5); tree->mod->r_mat->rr_val->v[CG] = log(Uni() * (2. - .5) + .5); tree->mod->r_mat->rr_val->v[CT] = log(Uni() * (8. - 2.) + 2.); tree->mod->r_mat->rr_val->v[GT] = log(Uni() * (2. - .5) + .5); tree->mod->r_mat->n_diff_rr = 6; tree->mod->whichmodel = GTR; tree->mod->update_eigen = YES; Update_Eigen(tree->mod); } else if (tree->mod->whichmodel == HKY85) { for (int i = 0; i < mod->ns; ++i) tree->mod->e_frq->pi_unscaled->v[i] = Uni(); sum = 0.0; for (int i = 0; i < mod->ns; ++i) sum += tree->mod->e_frq->pi_unscaled->v[i]; for (int i = 0; i < mod->ns; ++i) tree->mod->e_frq->pi->v[i] = tree->mod->e_frq->pi_unscaled->v[i] / sum; tree->mod->kappa->v = Uni() * (8. - 2.) + 2.; tree->mod->custom_mod_string->s[0] = '0'; tree->mod->custom_mod_string->s[1] = '1'; tree->mod->custom_mod_string->s[2] = '2'; tree->mod->custom_mod_string->s[3] = '3'; tree->mod->custom_mod_string->s[4] = '4'; tree->mod->custom_mod_string->s[5] = '5'; Translate_Custom_Mod_String(tree->mod); tree->mod->r_mat->rr_val->v[AC] = log(1.0); tree->mod->r_mat->rr_val->v[AG] = log(tree->mod->kappa->v); tree->mod->r_mat->rr_val->v[AT] = log(1.0); tree->mod->r_mat->rr_val->v[CG] = log(1.0); tree->mod->r_mat->rr_val->v[CT] = log(tree->mod->kappa->v); tree->mod->r_mat->rr_val->v[GT] = log(1.0); tree->mod->r_mat->n_diff_rr = 6; tree->mod->whichmodel = GTR; tree->mod->update_eigen = YES; Update_Eigen(tree->mod); } else if (tree->mod->whichmodel == K80) { for (int i = 0; i < mod->ns; ++i) tree->mod->e_frq->pi_unscaled->v[i] = 1.0; sum = 0.0; for (int i = 0; i < mod->ns; ++i) sum += tree->mod->e_frq->pi_unscaled->v[i]; for (int i = 0; i < mod->ns; ++i) tree->mod->e_frq->pi->v[i] = tree->mod->e_frq->pi_unscaled->v[i] / sum; tree->mod->kappa->v = Uni() * (8. - 2.) + 2.; tree->mod->custom_mod_string->s[0] = '0'; tree->mod->custom_mod_string->s[1] = '1'; tree->mod->custom_mod_string->s[2] = '2'; tree->mod->custom_mod_string->s[3] = '3'; tree->mod->custom_mod_string->s[4] = '4'; tree->mod->custom_mod_string->s[5] = '5'; Translate_Custom_Mod_String(tree->mod); tree->mod->r_mat->rr_val->v[AC] = log(1.0); tree->mod->r_mat->rr_val->v[AG] = log(tree->mod->kappa->v); tree->mod->r_mat->rr_val->v[AT] = log(1.0); tree->mod->r_mat->rr_val->v[CG] = log(1.0); tree->mod->r_mat->rr_val->v[CT] = log(tree->mod->kappa->v); tree->mod->r_mat->rr_val->v[GT] = log(1.0); tree->mod->r_mat->n_diff_rr = 6; tree->mod->whichmodel = GTR; tree->mod->update_eigen = YES; Update_Eigen(tree->mod); } else if (tree->mod->whichmodel == JC69) { for (int i = 0; i < mod->ns; ++i) tree->mod->e_frq->pi_unscaled->v[i] = 1.0; sum = 0.0; for (int i = 0; i < mod->ns; ++i) sum += tree->mod->e_frq->pi_unscaled->v[i]; for (int i = 0; i < mod->ns; ++i) tree->mod->e_frq->pi->v[i] = tree->mod->e_frq->pi_unscaled->v[i] / sum; tree->mod->custom_mod_string->s[0] = '0'; tree->mod->custom_mod_string->s[1] = '1'; tree->mod->custom_mod_string->s[2] = '2'; tree->mod->custom_mod_string->s[3] = '3'; tree->mod->custom_mod_string->s[4] = '4'; tree->mod->custom_mod_string->s[5] = '5'; Translate_Custom_Mod_String(tree->mod); tree->mod->r_mat->rr_val->v[AC] = log(1.0); tree->mod->r_mat->rr_val->v[AG] = log(1.0); tree->mod->r_mat->rr_val->v[AT] = log(1.0); tree->mod->r_mat->rr_val->v[CG] = log(1.0); tree->mod->r_mat->rr_val->v[CT] = log(1.0); tree->mod->r_mat->rr_val->v[GT] = log(1.0); tree->mod->r_mat->n_diff_rr = 6; tree->mod->whichmodel = GTR; tree->mod->update_eigen = YES; Update_Eigen(tree->mod); } PhyML_Fprintf(fp_stats ? fp_stats : stdout, "\n. pi: %7f %7f %7f %7f rr: %7f %7f %7f %7f %7f %7f", mod->e_frq->pi->v[0], mod->e_frq->pi->v[1], mod->e_frq->pi->v[2], mod->e_frq->pi->v[3], mod->r_mat->rr->v[AC], mod->r_mat->rr->v[AG], mod->r_mat->rr->v[AT], mod->r_mat->rr->v[CG], mod->r_mat->rr->v[CT], mod->r_mat->rr->v[GT]); for (site = 0; site < data->init_len; ++site) { /* Pick the rate class */ root_state = root_rate_class = 0; // Continuous gamma distribution // phydbl shape, scale, var, mean; // // var = 1.E-6; // var = 1; // mean = 1.0; // shape = mean * mean / var; // scale = var / mean; // r_mult = Rgamma(shape, scale); // // Discrete gamma distribution // phydbl *ui,*xi,alpha; // int n_classes; // n_classes = 4; // alpha = 1.0; // ui = (phydbl *)mCalloc(n_classes, sizeof(phydbl)); // xi = (phydbl *)mCalloc(n_classes,sizeof(phydbl)); // DiscreteGamma(ui, xi, alpha, alpha, n_classes, NO); // r_mult = xi[EVOLVE_Pick_State(n_classes, ui)]; // Free(ui); // Free(xi); // Discrete gamma distribution + invariants // phydbl *ui, *xi, alpha, pinv, u; // int n_classes; // n_classes = 4; // alpha = 1.0; // pinv = 0.1; // u = Uni(); // if (u < pinv) // r_mult = 0.0; // else // { // ui = (phydbl *)mCalloc(n_classes, sizeof(phydbl)); // xi = (phydbl *)mCalloc(n_classes, sizeof(phydbl)); // DiscreteGamma(ui, xi, alpha, alpha, n_classes, NO); // r_mult = xi[EVOLVE_Pick_State(n_classes, ui)]; // Free(ui); // Free(xi); // } // FreeRates 8 classes, bimodal distribution phydbl *ui,*xi,sumu,sumux; int n_classes; n_classes = 8; // Unscaled frequencies ui = (phydbl *)mCalloc(n_classes,sizeof(phydbl)); // Unscaled relative rates xi = (phydbl *)mCalloc(n_classes, sizeof(phydbl)); // for (int i = 0; i < n_classes; ++i) ui[i] = 1.0; // for (int i = 0; i < n_classes; ++i) xi[i] = (phydbl)(i+1.); // ui[1] = 2.; // ui[4] = 2.; ui[0] = 1.0; xi[0] = 0.0; ui[1] = 2.0; xi[1] = 0.3; ui[2] = 3.0; xi[2] = 0.5; ui[3] = 1.0; xi[3] = 1.2; ui[4] = 1.0; xi[4] = 1.5; ui[5] = 2.0; xi[5] = 3.0; ui[6] = 0.5; xi[6] = 5.0; ui[7] = 0.5; xi[7] = 8.0; sumu = .0; for (int i = 0; i < n_classes; ++i) sumu += ui[i]; sumux = .0; for (int i = 0; i < n_classes; ++i) sumux += ui[i]*xi[i]; for (int i = 0; i < n_classes; ++i) xi[i] *= (sumu/sumux); for (int i = 0; i < n_classes; ++i) ui[i] *= (1.0/sumu); r_mult = xi[Sample_i_With_Proba_pi(ui,n_classes)]; Free(xi); Free(ui); PhyML_Fprintf(fp_stats ? fp_stats : stdout, "site %d r_mult %f\n", site, r_mult); // RAS : all edges multiplied by gamma distributed scaling factor for (int i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l->v = orig_l[i] * r_mult; for (int i = 0; i < 2 * tree->n_otu - 1; ++i) Update_PMat_At_Given_Edge(tree->a_edges[i], tree); // Pick the root nucleotide/aa root_state = EVOLVE_Pick_State(mod->ns, mod->e_frq->pi->v); tree->a_nodes[0]->c_seq->state[site] = Reciproc_Assign_State(root_state, tree->io->datatype); tree->a_nodes[0]->c_seq->d_state[site] = root_state; // PhyML_Printf("\n. root_state: %d root_rate_class: %d [%f %f %f %f]", // root_state, // root_rate_class, // mod->e_frq->pi->v[0], // mod->e_frq->pi->v[1], // mod->e_frq->pi->v[2], // mod->e_frq->pi->v[3]); /* Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* tree->a_nodes[0] is considered as the root t_node */ EVOLVE_Seq_Recur(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree->a_nodes[0]->b[0], root_state, root_rate_class, site, data, mod, tree); data->wght[site] = 1; state_probs_one_site = EVOLVE_Site_Lk(site, root_rate_class, data, tree); for (int tax_id = 0; tax_id < n_otu; ++tax_id) { for (int state = 0; state < ns; ++state) { state_probs_all_sites[site * n_otu * ns + tax_id * ns + state] = state_probs_one_site[tax_id * ns + state]; truth[site * n_otu * ns + tax_id * ns + state] = 0; } truth[site * n_otu * ns + tax_id * ns + tree->a_nodes[tax_id]->c_seq->d_state[site]] = 1; } Free(state_probs_one_site); } data->n_pattern = data->init_len; /* Print_CSeq(stdout,NO,data); */ for (int i = 0; i < 2 * tree->n_otu - 3; ++i) tree->a_edges[i]->l->v = orig_l[i]; Free(orig_l); ROC(state_probs_all_sites, truth, ns, n_otu * data->init_len, weights, "SIM",fp_stats ? fp_stats : stdout); Free(state_probs_all_sites); Free(truth); Free(weights); if (switch_to_yes == YES) tree->mod->gamma_mgf_bl = YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int EVOLVE_Pick_State(int n, phydbl *prob) { // int pos; // phydbl uni; // do // { // pos = rand(); // pos = (pos % n); // uni = (phydbl)rand(); // uni /= (phydbl)RAND_MAX; // if (uni < prob[pos]) break; // } while (1); // return (int)pos; return((int)Sample_i_With_Proba_pi(prob, n)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void EVOLVE_Seq_Recur(t_node *a, t_node *d, t_edge *b, int a_state, int r_class, int site_num, calign *gen_data, t_mod *mod, t_tree *tree) { int d_state; int dim1, dim2; dim1 = tree->mod->ns * tree->mod->ns; dim2 = tree->mod->ns; // PhyML_Printf("\n## L:%G r_class: %d %G %G %G %G", // b->l->v, // r_class, // b->Pij_rr[r_class * dim1 + a_state * dim2 + 0], // b->Pij_rr[r_class * dim1 + a_state * dim2 + 1], // b->Pij_rr[r_class * dim1 + a_state * dim2 + 2], // b->Pij_rr[r_class * dim1 + a_state * dim2 + 3]); d_state = EVOLVE_Pick_State(mod->ns, b->Pij_rr + r_class * dim1 + a_state * dim2); // PhyML_Printf("\n>> %c->%c L:%G %G %G %G %G", // Reciproc_Assign_State(a_state, mod->io->datatype), // Reciproc_Assign_State(d_state, mod->io->datatype), // b->l->v, // b->Pij_rr[r_class * dim1 + a_state * dim2 + 0], // b->Pij_rr[r_class * dim1 + a_state * dim2 + 1], // b->Pij_rr[r_class * dim1 + a_state * dim2 + 2], // b->Pij_rr[r_class * dim1 + a_state * dim2 + 3]); if (d->tax) { d->c_seq->state[site_num] = Reciproc_Assign_State(d_state, tree->io->datatype); d->c_seq->d_state[site_num] = d_state; return; } else { int i; for (i = 0; i < 3; i++) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { EVOLVE_Seq_Recur(d, d->v[i], d->b[i], d_state, r_class, site_num, gen_data, mod, tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Evaluate likelihood at site_idx of data under the very same model // that was used to generate that site, i.e., the same set of // transition probability matrices. phydbl *EVOLVE_Site_Lk(int site_idx, int rate_class, calign *data, t_tree *tree) { int ori_len, ns, n_otu; align **dum_data; calign *ori_data; t_edge *b; phydbl *Pij, *p_lk_left, sum, *state_probs; ori_len = tree->io->init_len; tree->io->init_len = 1; ns = tree->mod->ns; ori_data = tree->data; n_otu = tree->n_otu; state_probs = (phydbl *)mCalloc(ns * n_otu, sizeof(phydbl)); dum_data = Make_Empty_Alignment(tree->io); for (int i = 0; i < tree->n_otu; ++i) { dum_data[i]->state[0] = data->c_seq[i]->state[site_idx]; strcpy(dum_data[i]->name, data->c_seq[i]->name); } tree->data = Compact_Data(dum_data, tree->io); Free_Seq(dum_data, tree->n_otu); Connect_CSeqs_To_Nodes(tree->data, tree->io, tree); for (int i = 0; i < tree->n_otu; ++i) Init_Partial_Lk_Tips_Double_One_Character(i, 0, tree); Post_Order_Lk(tree->n_root, tree->n_root->v[1], tree); Post_Order_Lk(tree->n_root, tree->n_root->v[2], tree); Pre_Order_Lk(tree->n_root, tree->n_root->v[2], tree); Pre_Order_Lk(tree->n_root, tree->n_root->v[1], tree); for (int tax_id = 0; tax_id < tree->n_otu; ++tax_id) { b = tree->a_nodes[tax_id]->b[0]; p_lk_left = b->p_lk_left; Pij = b->Pij_rr; for (int tip_state = 0; tip_state < ns; ++tip_state) { state_probs[tax_id * ns + tip_state] = 0.0; for (int int_state = 0; int_state < ns; ++int_state) { state_probs[tax_id * ns + tip_state] += tree->mod->ras->gamma_r_proba->v[rate_class] * tree->mod->e_frq->pi->v[tip_state] * Pij[rate_class * ns * ns + tip_state * ns + int_state] * p_lk_left[rate_class * ns + int_state]; } } sum = 0.0; for (int state = 0; state < ns; ++state) sum += state_probs[tax_id * ns + state]; for (int state = 0; state < ns; ++state) state_probs[tax_id * ns + state] /= sum; // for (int state = 0; state < ns; ++state) // PhyML_Printf("\n. Site: %4d tax: %20s state: %3d prob: %15G // obs_state: %3d", // site_idx, // data->c_seq[tax_id]->name, // state, // state_prob[tax_id * ns + state], // tree->a_nodes[tax_id]->c_seq->d_state[0]); // PhyML_Printf("\n###%s,%s,%d,%g,%g", tree->mod->modelname->s, // tree->a_nodes[tax_id]->name, site_idx, // log(state_probs[tax_id * ns + // tree->a_nodes[tax_id]->c_seq->d_state[0]]), // tree->a_nodes[tax_id]->b[0]->l->v); } tree->io->init_len = ori_len; Free_Actual_CSeq(tree->data); tree->data = ori_data; Connect_CSeqs_To_Nodes(tree->data, tree->io, tree); return (state_probs); } stephaneguindon-phyml-76a39c8/src/evolve.h000066400000000000000000000014271501136442400206460ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef EVOLVE_H #define EVOLVE_H #include "utilities.h" int EVOLVE_Main(int argc, char **argv); void EVOLVE_Coalescent(t_tree *tree); void EVOLVE_Seq(calign *data, t_mod *mod, FILE *fp, t_tree *tree); int EVOLVE_Pick_State(int n,phydbl *prob); void EVOLVE_Seq_Recur(t_node *a,t_node *d,t_edge *b,int a_state,int r_class,int site_num,calign *gen_data,t_mod *mod,t_tree *tree); phydbl *EVOLVE_Site_Lk(int site_idx, int rate_class, calign *data, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/free.c000066400000000000000000001132521501136442400202620ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "free.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Clade(t_clad *this) { Free(this); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_All_Nodes_Light(t_tree *tree) { if(tree->a_nodes != NULL) { for(int i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i] != NULL) Free_Node(tree->a_nodes[i]); Free(tree->a_nodes); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_All_Edges_Light(t_tree *tree) { if(tree->a_edges != NULL) { for(int i=0;i<2*tree->n_otu-1;++i) if(tree->a_edges[i] != NULL) Free_Edge(tree->a_edges[i]); Free(tree->a_edges); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_All_Edges_Lens(t_tree *tree) { if(tree->a_edges != NULL) { for(int i=0;i<2*tree->n_otu-1;++i) if(tree->a_edges[i] != NULL) Free_Edge_Length(tree->a_edges[i]); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Length(t_edge *b) { if(b->l != NULL) Free_Scalar_Dbl(b->l); if(b->l_old != NULL) Free_Scalar_Dbl(b->l_old); if(b->l_var != NULL) Free_Scalar_Dbl(b->l_var); if(b->l_var_old != NULL) Free_Scalar_Dbl(b->l_var_old); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge(t_edge *b) { Free_Label(b->label); Free_Edge_Core(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Core(t_edge *b) { Free(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Node(t_node *n) { Free(n->b); Free(n->v); Free(n->score); Free(n->s_ingrp); Free(n->s_outgrp); Free(n->cal); Free_Label(n->label); if(n->c_seq_anc != NULL) { Free(n->c_seq_anc->state); Free(n->c_seq_anc); } if(n->ori_name) { Free(n->ori_name); n->ori_name = NULL; } Free(n); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_M4_Mod(m4 *mod) { for (int i = 0; i < mod->n_h; i++) Free(mod->o_mats[i]); Free(mod->o_mats); Free(mod->o_rr->v); Free(mod->o_rr); Free(mod->h_rr); Free(mod->h_mat); Free(mod->o_fq); Free(mod->h_fq->v); Free(mod->h_fq); Free(mod->h_fq_unscaled->v); Free(mod->h_fq_unscaled); Free(mod->multipl_unscaled->v); Free(mod->multipl_unscaled); Free(mod->multipl->v); Free(mod->multipl); Free_Scalar_Dbl(mod->delta); Free_Scalar_Dbl(mod->alpha); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Mat(matrix *mat) { int i; for(i=0;in_otu;i++) { Free(mat->P[i]); Free(mat->Q[i]); Free(mat->dist[i]); Free(mat->name[i]); } Free(mat->P); Free(mat->Q); Free(mat->dist); Free(mat->name); Free(mat->tip_node); Free(mat->on_off); Free(mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Partial_Lk(phydbl *p_lk, int len, int n_catg) { Free(p_lk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree(t_tree *tree) { if(tree->is_mixt_tree == YES) { MIXT_Free_Tree(tree); } else { if(tree->mat) Free_Mat(tree->mat); if(tree->t_dir) Free(tree->t_dir); if(tree->short_l) Free(tree->short_l); if(tree->mutmap) Free(tree->mutmap); Free_Bip(tree); Free(tree->curr_path); Free_All_Edges_Lens(tree); Free_All_Edges_Light(tree); Free_All_Nodes_Light(tree); Free(tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Bip(t_tree *tree) { int i,j; if(tree->has_bip) { For(i,2*tree->n_otu-2) { Free(tree->a_nodes[i]->bip_size); for(j=0;j<3;j++) Free(tree->a_nodes[i]->bip_node[j]); Free(tree->a_nodes[i]->bip_node); } } tree->has_bip = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Calign(calign *data) { int i; if(data->io_wght) Free_Scalar_Dbl(data->io_wght); Free(data->invar); Free(data->wght); Free(data->ambigu); Free(data->obs_state_frq); Free(data->sitepatt); if (data->masked_pos) Free(data->masked_pos); for (i = 0; i < data->n_otu; i++) { Free(data->c_seq[i]->name); if (data->c_seq[i]->state) { Free(data->c_seq[i]->state); Free(data->c_seq[i]->d_state); if (data->c_seq[i]->is_ambigu) Free(data->c_seq[i]->is_ambigu); } Free(data->c_seq[i]); } for(i=0;in_rm;i++) { Free(data->c_seq_rm[i]->name); if(data->c_seq_rm[i]->state) { Free(data->c_seq_rm[i]->state); Free(data->c_seq_rm[i]->d_state); if(data->c_seq_rm[i]->is_ambigu) Free(data->c_seq_rm[i]->is_ambigu); } Free(data->c_seq_rm[i]); } if(data->c_seq_rm != NULL) Free(data->c_seq_rm); if(data->c_seq != NULL) Free(data->c_seq); Free(data); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Seq(align **d, int n_otu) { int i; for(i=0;iname); Free(d[i]->state); Free(d[i]->d_state); if(d[i]->is_ambigu) Free(d[i]->is_ambigu); Free(d[i]); } Free(d); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_All(align **d, calign *cdata, t_tree *tree) { Free_Calign(cdata); Free_Seq(d,tree->n_otu); Free_Tree(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_SubTree(t_edge *b_fcus, t_node *a, t_node *d, t_tree *tree) { int i; if(d->tax) return; else { for(i=0;i<3;i++) { if(d->v[i] != a) { Free_SubTree(d->b[i],d,d->v[i],tree); Free_Edge(d->b[i]); Free_Node(d->v[i]); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree_Ins_Tar(t_tree *tree) { return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree_Pars(t_tree *tree) { int i; Free(tree->step_mat); Free(tree->site_pars); for(i=0;i<2*tree->n_otu-3;++i) Free_Edge_Pars(tree->a_edges[i]); if(tree->n_root) { Free_Edge_Pars_Left(tree->n_root->b[1]); Free_Edge_Pars_Left(tree->n_root->b[2]); } else { Free_Edge_Pars(tree->a_edges[2*tree->n_otu-3]); Free_Edge_Pars(tree->a_edges[2*tree->n_otu-2]); } if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Tree_Pars,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Pars_Left(t_edge *b) { if(b->pars_l) Free(b->pars_l); if(b->ui_l) Free(b->ui_l); if(b->p_pars_l) Free(b->p_pars_l); if(b->n_diff_states_l) Free(b->n_diff_states_l); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Pars_Rght(t_edge *b) { if(b->pars_r) Free(b->pars_r); if(b->ui_r) Free(b->ui_r); if(b->p_pars_r) Free(b->p_pars_r); if(b->n_diff_states_r) Free(b->n_diff_states_r); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Pars(t_edge *b) { Free_Edge_Pars_Left(b); Free_Edge_Pars_Rght(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree_Lk(t_tree *tree) { int i; Free(tree->big_lk_array); Free(tree->c_lnL_sorted); Free(tree->cur_site_lk); Free(tree->old_site_lk); Free(tree->site_lk_cat); Free(tree->fact_sum_scale); Free(tree->unscaled_site_lk_cat); Free(tree->expl); for(i=0;i<3;i++) Free(tree->log_lks_aLRT[i]); Free(tree->log_lks_aLRT); for(i=0;i<2*tree->n_otu-1;++i) Free_NNI(tree->a_edges[i]->nni); for(i=0;i<2*tree->n_otu-3;++i) Free_Edge_Lk(tree->a_edges[i]); for(i=0;i<2*tree->n_otu-3;++i) Free_Edge_Loc(tree->a_edges[i]); if(tree->is_mixt_tree == NO) { Free(tree->dot_prod); Free(tree->p_lk_left_pi); Free(tree->l_ev); #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) Free(tree->_tPij1); Free(tree->_tPij2); Free(tree->_pmat1plk1); Free(tree->_pmat2plk2); Free(tree->_plk0); Free(tree->_l_ev); Free(tree->_r_ev); Free(tree->_prod_left); Free(tree->_prod_rght); #endif Free(tree->div_post_pred_extra_0); Free(tree->sum_scale_cat_extra_0); Free(tree->sum_scale_extra_0); Free(tree->patt_id_extra_0); Free(tree->p_lk_extra_0); Free(tree->p_lk_tip_extra_0); Free(tree->div_post_pred_extra_1); Free(tree->sum_scale_cat_extra_1); Free(tree->sum_scale_extra_1); Free(tree->patt_id_extra_1); Free(tree->p_lk_extra_1); Free(tree->p_lk_tip_extra_1); if(tree->n_root != NULL) { Free_Edge_Lk_Left(tree->n_root->b[1]); Free_Edge_Lk_Left(tree->n_root->b[2]); Free_Edge_Loc_Left(tree->n_root->b[1]); Free_Edge_Loc_Left(tree->n_root->b[2]); } else { Free_Edge_Lk(tree->a_edges[2*tree->n_otu-3]); Free_Edge_Lk(tree->a_edges[2*tree->n_otu-2]); Free_Edge_Loc(tree->a_edges[2*tree->n_otu-3]); Free_Edge_Loc(tree->a_edges[2*tree->n_otu-2]); } } if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Tree_Lk,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Node_Lk(t_node *n) { /* Free(n->n_ex_nodes); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Extra_Edge_Lk(t_tree *tree) { if(tree->div_post_pred_extra_0) Free(tree->div_post_pred_extra_0); if(tree->sum_scale_cat_extra_0) Free(tree->sum_scale_cat_extra_0); if(tree->sum_scale_extra_0) Free(tree->sum_scale_extra_0); if(tree->p_lk_extra_0) Free(tree->p_lk_extra_0); if(tree->p_lk_tip_extra_0) Free(tree->p_lk_tip_extra_0); if(tree->patt_id_extra_0) Free(tree->patt_id_extra_0); if(tree->div_post_pred_extra_1) Free(tree->div_post_pred_extra_1); if(tree->sum_scale_cat_extra_1) Free(tree->sum_scale_cat_extra_1); if(tree->sum_scale_extra_1) Free(tree->sum_scale_extra_1); if(tree->p_lk_extra_1) Free(tree->p_lk_extra_1); if(tree->p_lk_tip_extra_1) Free(tree->p_lk_tip_extra_1); if(tree->patt_id_extra_1) Free(tree->patt_id_extra_1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Lk_Rght(t_edge *b) { assert(b); Free(b->div_post_pred_rght); if(b->p_lk_rght) { if(b->sum_scale_rght) Free(b->sum_scale_rght); } if(b->p_lk_tip_r) Free(b->p_lk_tip_r); if(b->sum_scale_rght_cat) Free(b->sum_scale_rght_cat); if(b->patt_id_rght) Free(b->patt_id_rght); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Lk_Left(t_edge *b) { Free(b->div_post_pred_left); if(b->p_lk_left) { if(b->sum_scale_left) Free(b->sum_scale_left); } if(b->p_lk_tip_l) Free(b->p_lk_tip_l); if(b->sum_scale_left_cat) Free(b->sum_scale_left_cat); if(b->patt_id_left) Free(b->patt_id_left); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Lk(t_edge *b) { Free_Edge_Lk_Left(b); Free_Edge_Lk_Rght(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Loc_Rght(t_edge *b) { if(b->p_lk_loc_rght) Free(b->p_lk_loc_rght); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Loc_Left(t_edge *b) { if(b->p_lk_loc_left) Free(b->p_lk_loc_left); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Loc(t_edge *b) { Free_Edge_Loc_Left(b); Free_Edge_Loc_Rght(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Model_Complete(t_mod *mixt_mod) { Free_Eigen(mixt_mod->eigen); Free_Rmat(mixt_mod->r_mat); Free_Efrq(mixt_mod->e_frq); Free_Vect_Dbl(mixt_mod->Pij_rr); mixt_mod->r_mat = NULL; mixt_mod->e_frq = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Rmat_Weights(t_mod *mixt_mod) { t_mod *mod; mod = mixt_mod; do { Free(mod->r_mat_weight); mod = mod->next_mixt; } while(mod); if(mixt_mod->next) Free_Scalar_Dbl(mixt_mod->next->r_mat_weight); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Efrq_Weights(t_mod *mixt_mod) { t_mod *mod; mod = mixt_mod; do { Free(mod->e_frq_weight); mod = mod->next_mixt; } while(mod); if(mixt_mod->next) Free_Scalar_Dbl(mixt_mod->next->e_frq_weight); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Model_Basic(t_mod *mixt_mod) { t_mod *mod; Free_RAS(mixt_mod->ras); Free_Scalar_Dbl(mixt_mod->mr); Free_Scalar_Dbl(mixt_mod->kappa); Free_Scalar_Dbl(mixt_mod->lambda); Free_Scalar_Dbl(mixt_mod->br_len_mult); Free_Scalar_Dbl(mixt_mod->br_len_mult_unscaled); Free_Scalar_Dbl(mixt_mod->l_var_sigma); Free_Rmat_Weights(mixt_mod); Free_Efrq_Weights(mixt_mod); Free_String(mixt_mod->modelname); Free_String(mixt_mod->custom_mod_string); Free_String(mixt_mod->aa_rate_mat_file); mod = mixt_mod; do { if(mod->next) { mod = mod->next; Free(mod->prev); } else { Free(mod); break; } } while(mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Vect_Dbl(vect_dbl *v) { vect_dbl *next; assert(v); next = v->next; do { Free(v->v); Free(v); v = next; if(v) next = v->next; } while(v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Vect_Int(vect_int *v) { vect_int *next; assert(v); next = v->next; do { Free(v->v); Free(v); v = next; if(v) next = v->next; } while(v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Scalar_Dbl(scalar_dbl *v) { scalar_dbl *next; assert(v); next = v->next; do { Free(v); v = next; if(v) next = v->next; } while(v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Scalar_Int(scalar_int *v) { scalar_int *next; assert(v); next = v->next; do { Free(v); v = next; if(v) next = v->next; } while(v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Linked_List(t_ll *t) { t_ll *next,*ll; if(t == NULL) return; ll = t->head; next = ll->next; do { /* t_node *n = ll->v; */ /* printf("\n. free node %d",n?n->num:-1); */ /* printf(" ll: %p",ll); */ /* printf(" hd: %p",ll?ll->head:NULL); fflush(NULL); */ Free(ll); ll = next; if(ll) next = ll->next; } while(ll); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_String(t_string *ts) { t_string *next; next = ts->next; do { Free(ts->s); Free(ts); ts = next; if(ts) next = ts->next; } while(ts); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Custom_Model(t_mod *mod) { } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Efrq(t_efrq *e_frq) { Free(e_frq->pi->v); Free(e_frq->pi); Free(e_frq->pi_unscaled->v); Free(e_frq->pi_unscaled); Free(e_frq->user_b_freq->v); Free(e_frq->user_b_freq); if(e_frq->next) Free_Efrq(e_frq->next); Free(e_frq); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Rmat(t_rmat *r_mat) { Free(r_mat->rr->v); Free(r_mat->rr); Free(r_mat->rr_num->v); Free(r_mat->rr_val->v); Free(r_mat->rr_val); Free(r_mat->n_rr_per_cat->v); Free(r_mat->n_rr_per_cat); Free(r_mat->rr_num); Free(r_mat->qmat->v); Free(r_mat->qmat); Free(r_mat->qmat_buff->v); Free(r_mat->qmat_buff); if(r_mat->next) Free_Rmat(r_mat->next); Free(r_mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_RAS(t_ras *ras) { if(ras->gamma_r_proba->v) { Free(ras->gamma_r_proba->v); Free(ras->gamma_r_proba_unscaled->v); Free(ras->gamma_rr->v); Free(ras->gamma_rr_unscaled->v); } Free(ras->gamma_r_proba); Free(ras->skip_rate_cat); Free(ras->gamma_r_proba_unscaled); Free(ras->gamma_rr); Free(ras->gamma_rr_unscaled); Free_Scalar_Dbl(ras->pinvar); Free_Scalar_Dbl(ras->alpha); Free_Scalar_Dbl(ras->free_rate_mr); if(ras->next) Free_RAS(ras->next); Free(ras); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Model(t_mod *mod) { Free_Custom_Model(mod); Free_Model_Complete(mod); Free_Model_Basic(mod); /* Free(mod); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free(void *p) { #if (defined(__AVX__) || defined(__SSE3__)) #ifndef WIN32 free(p); #else _aligned_free(p); #endif #else free(p); #endif p = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Input(option *io) { int i; do { RATES_Free_Rates(io->rates); TIMES_Free_Times(io->times); MCMC_Free_MCMC(io->mcmc); Free(io->in_align_file); Free(io->in_tree_file); Free(io->in_constraint_tree_file); Free(io->in_coord_file); Free(io->in_xml_file); Free(io->out_file); Free(io->out_tree_file); Free(io->out_trees_file); Free(io->out_boot_tree_file); Free(io->out_boot_stats_file); Free(io->out_stats_file); Free(io->weight_file); Free(io->out_lk_file); Free(io->out_summary_file); Free(io->out_ps_file); Free(io->out_trace_file); Free(io->out_json_trace_file); Free(io->out_ancestral_seq_file); Free(io->out_ancestral_tree_file); Free(io->nt_or_cd); Free(io->run_id_string); Free(io->clade_list_file); for(i=0;ialphabet[i]); Free(io->alphabet); if(io->short_tax_names) { for(i=0;isize_tax_names;i++) { Free(io->short_tax_names[i]); Free(io->long_tax_names[i]); } Free(io->long_tax_names); Free(io->short_tax_names); } Free_Tree_List(io->treelist); if(io->lon) Free(io->lon); if(io->lat) Free(io->lat); if(io->next) { io = io->next; Free(io->prev); } else { Free(io); break; } }while(1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree_List(t_treelist *list) { Free(list->tree); Free(list); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_St(supert_tree *st) { int i; For(i,2*st->tree->n_otu-1) Free_NNI(st->tree->a_edges[i]->nni); for(i=0;in_part;i++) Free(st->match_st_node_in_gt[i]); Free(st->match_st_node_in_gt); Free_Tree(st->tree); Free(st); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Eigen(eigen *eigen_struct) { Free(eigen_struct->space_int); Free(eigen_struct->space); Free(eigen_struct->e_val); Free(eigen_struct->e_val_im); Free(eigen_struct->r_e_vect_im); Free(eigen_struct->l_e_vect); Free(eigen_struct->r_e_vect); Free(eigen_struct->dum); Free(eigen_struct->q); if(eigen_struct->next) Free_Eigen(eigen_struct->next); Free(eigen_struct); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_One_Spr(t_spr *this_spr) { Free(this_spr->path); if(this_spr->l0) Free_Scalar_Dbl(this_spr->l0); if(this_spr->l1) Free_Scalar_Dbl(this_spr->l1); if(this_spr->l2) Free_Scalar_Dbl(this_spr->l2); if(this_spr->v0) Free_Scalar_Dbl(this_spr->v0); if(this_spr->v1) Free_Scalar_Dbl(this_spr->v1); if(this_spr->v2) Free_Scalar_Dbl(this_spr->v2); if(this_spr->init_target_l) Free_Scalar_Dbl(this_spr->init_target_l); if(this_spr->init_target_v) Free_Scalar_Dbl(this_spr->init_target_v); Free(this_spr); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Spr_List_One_Edge(t_tree *tree) { int i; for(i=0;isize_spr_list_one_edge+1;++i) Free_One_Spr(tree->spr_list_one_edge[i]); if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Spr_List_One_Edge,tree); Free(tree->spr_list_one_edge); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Spr_List_All_Edge(t_tree *tree) { int i; for(i=0;isize_spr_list_all_edge+1;++i) Free_One_Spr(tree->spr_list_all_edge[i]); if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Spr_List_All_Edge,tree); Free(tree->spr_list_all_edge); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Best_Spr(t_tree *tree) { Free_One_Spr(tree->best_spr); if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Best_Spr,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Actual_CSeq(calign *data) { int i; for(i=0;in_otu;i++) { Free(data->c_seq[i]->state); Free(data->c_seq[i]->d_state); data->c_seq[i]->state = NULL; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Prefix_Tree(pnode *n, int size) { int i; for(i=0;inext[i]) { Free_Prefix_Tree(n->next[i],size); } } Free_Pnode(n); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Pnode(pnode *n) { Free(n->next); Free(n); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Optimiz(t_opt *s_opt) { Free(s_opt); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Nexus(option *io) { int i,j; for(i=0;inex_com_list[i]->nparm) Free_Nexus_Parm(io->nex_com_list[i]->parm[j]); Free(io->nex_com_list[i]->parm); Free(io->nex_com_list[i]->name); Free(io->nex_com_list[i]); } Free(io->nex_com_list); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Nexus_Com(nexcom **com) { int i; for(i=0;iparm); Free(com[i]->name); Free(com[i]); } Free(com); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Nexus_Parm(nexparm *parm) { Free(parm->value); Free(parm->name); Free(parm); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Free_XML_Tree(xml_node *node) { xml_node *n; if (!node) return; n = NULL; if (node->child) n = node->child->next; while(n != NULL) { XML_Free_XML_Tree(n); n = n->next; } if (node->child) XML_Free_XML_Tree(node->child); XML_Free_XML_Node(node); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Prune_XML_Tree(xml_node *node) { if (node->parent) { xml_node *p, *n; p = node->parent; n = NULL; if (p->child == node) { p->child = node->next; p->child->prev = NULL; } else { n = p->child; while (n->next && n->next != node) n = n->next; assert(n->next); n->next = n->next->next; if(n->next) n->next->prev = n; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Free_XML_Node(xml_node *node) { Free(node->id); Free(node->name); Free(node->value); XML_Free_XML_Ds(node->ds); XML_Free_XML_Attr(node->attr); Free(node); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Free_XML_Attr(xml_attr *attr) { if(attr) { Free(attr->name); Free(attr->value); if(attr->next) XML_Free_XML_Attr(attr->next); Free(attr); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Free_XML_Ds(t_ds *ds) { if(ds->next) XML_Free_XML_Ds(ds->next); Free(ds); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Free_MCMC(t_mcmc *mcmc) { int i; Free(mcmc->move_type); Free(mcmc->adjust_tuning); Free(mcmc->out_filename); Free(mcmc->move_weight); Free(mcmc->move_prob); Free(mcmc->acc_move); Free(mcmc->run_move); Free(mcmc->prev_acc_move); Free(mcmc->prev_run_move); Free(mcmc->acc_rate); Free(mcmc->tune_move); for(i=0;in_moves;i++) Free(mcmc->move_name[i]); Free(mcmc->move_name); Free(mcmc->ess_run); Free(mcmc->start_ess); Free(mcmc->ess); Free(mcmc->sampled_val); Free(mcmc->mode); Free(mcmc); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Free_Times(t_time *times) { Free(times->buff_t); Free(times->nd_t); Free(times->true_t); Free(times->t_prior); Free(times->t_mean); Free(times->t_prior_min); Free(times->t_prior_max); Free(times->t_floor); Free(times->t_has_prior); Free(times->t_rank); Free(times->mean_t); Free(times->t_prior_min_ori); Free(times->t_prior_max_ori); Free(times->times_partial_proba); Free(times->calib_prob); Free(times->numb_calib_chosen); for(int i=0;in_cal;i++) Free_Calib(times->a_cal[i]); Free(times->a_cal); Free(times->n_jps); Free(times->t_jps); Free(times->time_slice_lims); Free(times->n_time_slice_spans); Free(times->curr_slice); Free(times->has_survived); Free(times); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RATES_Free_Rates(t_rate *rates) { if(rates->is_allocated == YES) { Free(rates->nd_r); Free(rates->br_r); Free(rates->buff_nd_r); Free(rates->buff_br_r); Free(rates->true_r); Free(rates->dens); Free(rates->triplet); Free(rates->cond_var); Free(rates->invcov); Free(rates->ml_l); Free(rates->cur_l); Free(rates->u_ml_l); Free(rates->u_cur_l); Free(rates->cov_r); Free(rates->lca); Free(rates->trip_cond_cov); Free(rates->trip_reg_coeff); Free(rates->_2n_vect1); Free(rates->_2n_vect2); Free(rates->_2n_vect3); Free(rates->_2n_vect4); Free(rates->_2n_vect5); Free(rates->_2n2n_vect1); Free(rates->_2n2n_vect2); Free(rates->cov_l); Free(rates->mean_l); Free(rates->mean_r); Free(rates->grad_l); Free(rates->reg_coeff); Free(rates->br_do_updt); Free(rates->cur_gamma_prior_mean); Free(rates->cur_gamma_prior_var); Free(rates->n_tips_below); Free(rates->model_name); } Free(rates); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Calib(t_cal *cal) { if(!cal) return; else { int i; for(i=0;iclade_list_size;i++) Free(cal->clade_list[i]); Free(cal->clade_list); Free(cal->id); Free(cal->alpha_proba_list); Free(cal); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Free_Geo(t_geo *t) { int i; Free(t->f_mat); Free(t->r_mat); Free(t->occup); Free(t->idx_loc); Free(t->sorted_nd); Free(t->cov); Free(t->idx_loc_beneath); for(i=0;ildscape_sz;i++) Free_Geo_Coord(t->coord_loc[i]); Free(t->coord_loc); Free(t); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Free_Geo_Veloc(t_geo_veloc *t) { Free(t->cpy->deriv); Free(t->cpy->id); Free(t->cpy); Free(t->deriv); Free(t->id); Free(t); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Free_Geo_Coord(t_geo_coord *t) { Free(t->cpy->lonlat); Free(t->cpy->id); Free(t->cpy); Free(t->lonlat); Free(t->id); Free(t); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Free_Disk(t_dsk *t) { Free_Geo_Coord(t->centr); Free(t->ldsk_a); Free(t->id); Free(t); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Free_Ldisk(t_ldsk *t) { if(t == NULL) return; else { Free(t->next); Free_Geo_Coord(t->coord); Free_Geo_Veloc(t->veloc); if(t->cpy_coord) Free_Geo_Coord(t->cpy_coord); Free(t); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Free_Ldsk_Struct(t_tree *tree) { t_dsk *disk,*next; int i; assert(tree); assert(tree->n_root); assert(tree->n_root->ldsk); assert(tree->n_root->ldsk->disk); disk = tree->n_root->ldsk->disk; do { if(disk->ldsk) PHYREX_Free_Ldisk(disk->ldsk); next = disk->next; PHYREX_Free_Disk(disk); disk = next; } while(disk); for(i=0;in_otu;++i) PHYREX_Free_Ldisk(tree->a_nodes[i]->ldsk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Poly(t_poly *p) { int i; for(i=0;in_poly_vert;i++) Free_Geo_Coord(p->poly_vert[i]); Free(p->poly_vert); Free(p); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Mmod(t_phyrex_mod *mmod) { if(mmod == NULL) return; Free_Geo_Coord(mmod->lim_up); Free_Geo_Coord(mmod->lim_do); Free(mmod->sigsq_scale); Free(mmod->sigsq); Free(mmod->ou_mu); Free(mmod->rw_root_mean); Free(mmod->rw_root_var); Free(mmod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void JSON_Free_Array(json_a *a) { if(a->object) JSON_Free_Object(a->object); Free(a); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void JSON_Free_Object(json_o *o) { if(o->kv) JSON_Free_KeyVal(o->kv); if(o->next) JSON_Free_Object(o->next); Free(o); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void JSON_Free_KeyVal(json_kv *kv) { if(kv->key) Free(kv->key); if(kv->value) Free(kv->value); if(kv->object) JSON_Free_Object(kv->object); if(kv->array) JSON_Free_Array(kv->array); if(kv->next) JSON_Free_KeyVal(kv->next); Free(kv); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_NNI(t_nni *t) { if(t->init_l) Free_Scalar_Dbl(t->init_l); if(t->init_v) Free_Scalar_Dbl(t->init_v); if(t->best_l) Free_Scalar_Dbl(t->best_l); if(t->best_v) Free_Scalar_Dbl(t->best_v); if(t->l0) Free_Scalar_Dbl(t->l0); if(t->v0) Free_Scalar_Dbl(t->v0); if(t->l1) Free_Scalar_Dbl(t->l1); if(t->v1) Free_Scalar_Dbl(t->v1); if(t->l2) Free_Scalar_Dbl(t->l2); if(t->v2) Free_Scalar_Dbl(t->v2); Free(t); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Matrices used in transfer bootstrap computation (tbe.c) */ void Free_TBE_Matrices(int n_otu, short unsigned*** i_matrix, short unsigned*** c_matrix, short unsigned*** hamming, short unsigned** min_dist, short unsigned** min_dist_edge, int** cluster_sizes){ int i; int nb_edges = 2*n_otu-3; for (i=0; in_otu-1;++i) if(tree->a_nodes[i] != NULL) { Free_Label(tree->a_nodes[i]->label); tree->a_nodes[i]->label = NULL; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Label(t_label *lab) { if(lab == NULL) return; Free(lab->key); Free(lab->val); if(lab->next != NULL) Free_Label(lab->next); Free(lab); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Contrasts(t_ctrst *ctrst) { Free(ctrst->x); Free(ctrst->tprime); Free(ctrst); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Contmod(t_contmod *contmod) { Free(contmod->mu_down); Free(contmod->var_down); Free(contmod->logrem_down); Free(contmod->mu_up); Free(contmod->var_up); Free(contmod->logrem_up); Free(contmod->lnL_up); Free(contmod->lnL_down); Free(contmod->lnL); Free(contmod->obs_var); Free(contmod->both_sides); Free(contmod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/free.h000066400000000000000000000070241501136442400202660ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef FREE_H #define FREE_H #include "utilities.h" void Free_All_Nodes_Light(t_tree *tree); void Free_All_Edges_Light(t_tree *tree); void Free_Mat(matrix *mat); void Free_Partial_Lk(phydbl *p_lk,int len,int n_catg); void Free_Tree(t_tree *tree); void Free_Bip(t_tree *tree); void Free_Edge(t_edge *b); void Free_Node(t_node *n); void Free_Calign(calign *data); void Free_Seq(align **d,int n_otu); void Free_All(align **d,calign *cdata,t_tree *tree); void Free_SubTree(t_edge *b_fcus,t_node *a,t_node *d,t_tree *tree); void Free_Tree_Ins_Tar(t_tree *tree); void Free_Tree_Pars(t_tree *tree); void Free_Edge_Pars(t_edge *b); void Free_Edge_Pars_Left(t_edge *b); void Free_Edge_Pars_Rght(t_edge *b); void Free_Tree_Lk(t_tree *tree); void Free_Node_Lk(t_node *n); void Free_Edge_Lk(t_edge *b); void Free_Model_Complete(t_mod *mod); void Free_Model_Basic(t_mod *mod); void Free_Custom_Model(t_mod *mod); void Free_Efrq(t_efrq *e_frq); void Free_Rmat(t_rmat *r_mat); void Free_Model(t_mod *mod); void Free(void *p); void Free_Input(option *io); void Free_Tree_List(t_treelist *list); void Free_St(supert_tree *st); void Free_Eigen(eigen *eigen_struct); void Free_One_Spr(t_spr *this_spr); void Free_Spr_List_One_Edge(t_tree *tree); void Free_Spr_List_All_Edge(t_tree *mixt_tree); void Free_Actual_CSeq(calign *data); void Free_Prefix_Tree(pnode *n,int size); void Free_Pnode(pnode *n); void Free_Optimiz(t_opt *s_opt); void Free_Nexus(option *io); void Free_Nexus_Com(nexcom **com); void Free_Nexus_Parm(nexparm *parm); void Free_RAS(t_ras *ras); void XML_Free_XML_Tree(xml_node *node); void XML_Free_XML_Node(xml_node *node); void XML_Free_XML_Attr(xml_attr *attr); void XML_Free_XML_Ds(t_ds *ds); void Free_String(t_string *ts); void Free_Vect_Dbl(vect_dbl *v); void Free_Vect_Int(vect_int *v); void Free_Scalar_Dbl(scalar_dbl *v); void Free_Scalar_Int(scalar_int *v); void Free_Edge_Core(t_edge *b); void Free_Rates(t_rate *rates); void Free_Calib(t_cal *cal); void Free_Edge_Lk_Left(t_edge *b); void Free_Edge_Lk_Rght(t_edge *b); void Free_Geo(t_geo *t); void Free_Geo_Coord(t_geo_coord *t); void PHYREX_Free_Disk(t_dsk *t); void PHYREX_Free_Ldisk(t_ldsk *t); void PHYREX_Free_Ldsk_Struct(t_tree *tree); void Free_Poly(t_poly *p); void Free_Mmod(t_phyrex_mod *mmod); void Free_Efrq_Weights(t_mod *mixt_mod); void Free_Rmat_Weights(t_mod *mixt_mod); void JSON_Free_KeyVal(json_kv *kv); void JSON_Free_Object(json_o *o); void JSON_Free_Array(json_a *a); void Free_Edge_Loc_Rght(t_edge *b); void Free_Edge_Loc_Left(t_edge *b); void Free_Edge_Loc(t_edge *b); void Free_NNI(t_nni *t); void Free_Linked_List(t_ll *t); void Free_TBE_Matrices(int n_otu, short unsigned*** i_matrix, short unsigned*** c_matrix, short unsigned*** hamming, short unsigned** min_dist, short unsigned** min_dist_edge, int** cluster_sizes); void Free_Extra_Edge_Lk(t_tree *tree); void Free_Edge_Length(t_edge *b); void Free_Clade(t_clad *this); void Free_Label(t_label *lab); void Free_Contrasts(t_ctrst *ctrst); void TIMES_Free_Times(t_time *times); void Free_Best_Spr(t_tree *tree); void Free_All_Edges_Light(t_tree *tree); void Free_All_Edges_Lens(t_tree *tree); void Free_Contmod(t_contmod *contmod); void Free_Geo_Veloc(t_geo_veloc *t); void Free_All_Node_Labels(t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/geo.c000066400000000000000000001664061501136442400201240ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "geo.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int GEO_Main(int argc, char **argv) { /* GEO_Simulate_Estimate(argc,argv); */ GEO_Estimate(argc,argv); return(1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int GEO_Estimate(int argc, char **argv) { t_geo *t; int seed; FILE *fp; t_tree *tree; phydbl *ldscp; int *loc_hash; int i,j; phydbl *probs; phydbl sum; // geo ./ban seed = getpid(); /* seed = 28224; */ /* seed = 21249; */ /* seed = 21596; */ printf("\n. Seed = %d",seed); srand(seed); t = GEO_Make_Geo_Basic(); GEO_Init_Geo_Struct(t); fp = Openfile(argv[1],0); /* Open tree file */ tree = Read_Tree_File_Phylip(fp); /* Read it */ Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); tree->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->rates,NULL,tree->n_otu); tree->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->times,NULL,tree->n_otu); Branch_To_Time(tree); tree->geo = t; GEO_Read_In_Landscape(argv[2],t,&ldscp,&loc_hash,tree); GEO_Make_Geo_Complete(t->ldscape_sz,t->n_dim,tree->n_otu,t); j = 0; for(i=0;ildscape_sz;i++) { t->coord_loc[i]->lonlat[0] = ldscp[j]; t->coord_loc[i]->lonlat[1] = ldscp[j+1]; PhyML_Printf("\n. Location %d: %13f %13f",i+1,t->coord_loc[i]->lonlat[0],t->coord_loc[i]->lonlat[1]); j+=2; } for(i=0;in_otu;i++) t->idx_loc[i] = loc_hash[i]; t->cov[0*t->n_dim+0] = t->sigma; t->cov[1*t->n_dim+1] = t->sigma; t->cov[0*t->n_dim+1] = 0.0; t->cov[1*t->n_dim+0] = 0.0; GEO_Get_Sigma_Max(t); t->max_sigma = t->sigma_thresh * 2.; PhyML_Printf("\n. Sigma max: %f",t->sigma_thresh); GEO_Get_Locations_Beneath(t,tree); probs = (phydbl *)mCalloc(tree->geo->ldscape_sz,sizeof(phydbl)); sum = 0.0; for(i=0;igeo->ldscape_sz;i++) sum += tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]; for(i=0;igeo->ldscape_sz;i++) probs[i] = tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]/sum; tree->geo->idx_loc[tree->n_root->num] = Sample_i_With_Proba_pi(probs,tree->geo->ldscape_sz); Free(probs); GEO_Randomize_Locations(tree->n_root,t,tree); GEO_Update_Occup(t,tree); GEO_Lk(t,tree); PhyML_Printf("\n. Init loglk: %f",tree->geo->c_lnL); /* DR_Draw_Tree("essai.ps",tree); */ GEO_MCMC(tree); fclose(fp); Free(ldscp); Free(loc_hash); return(1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int GEO_Simulate_Estimate(int argc, char **argv) { t_geo *t; int n_tax; t_tree *tree,*ori_tree; int seed; phydbl *res; FILE *fp; int pid; char *s; int rand_loc; phydbl *probs,sum; int i; phydbl mantel_p_val; phydbl rf; s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); strcpy(s,"geo.out"); pid = getpid(); sprintf(s+strlen(s),".%d",pid); fp = fopen(s,"w"); seed = getpid(); /* seed = 15520; */ /* seed = 5023; */ printf("\n. Seed = %d",seed); srand(seed); t = GEO_Make_Geo_Basic(); GEO_Init_Geo_Struct(t); /* t->tau = 3.0; */ /* t->lbda = 0.02; */ /* t->sigma = 10.; */ t->ldscape_sz = (int)atoi(argv[1]); t->n_dim = 2; n_tax = (int)atoi(argv[2]); GEO_Make_Geo_Complete(t->ldscape_sz,t->n_dim,n_tax,t); t->cov[0*t->n_dim+0] = t->sigma; t->cov[1*t->n_dim+1] = t->sigma; t->cov[0*t->n_dim+1] = 0.0; t->cov[1*t->n_dim+0] = 0.0; GEO_Simulate_Coordinates(t->ldscape_sz,t); GEO_Get_Sigma_Max(t); t->max_sigma = t->sigma_thresh * 2.; PhyML_Printf("\n. sigma max: %f threshold: %f",t->max_sigma,t->sigma_thresh); /* t->tau = Uni()*(t->max_tau/100.-t->min_tau*10.) + t->min_tau*10.; */ /* t->lbda = exp(Uni()*(log(t->max_lbda/100.)-log(t->min_lbda*10.)) + log(t->min_lbda*10.)); */ /* t->sigma = Uni()*(t->max_sigma-t->min_sigma) + t->min_sigma; */ t->lbda = 1.; t->sigma = 0.3; t->tau = 1.; PhyML_Fprintf(fp,"\n# SigmaTrue\t SigmaThresh\t LbdaTrue\t TauTrue\txTrue\t yTrue\t xRand\t yRand\t RF\t Sigma5\t Sigma50\t Sigma95\t ProbSigmaInfThresh\t Lbda5\t Lbda50\t Lbda95\t ProbLbdaInf1\t Tau5\t Tau50\t Tau95\t X5\t X50\t X95\t Y5\t Y50\t Y95\t RandX5\t RandX50\t RandX95\t RandY5\t RandY50\t RandY95\t Mantel\t"); PhyML_Fprintf(fp,"\n"); tree = GEO_Simulate(t,n_tax); ori_tree = Make_Tree_From_Scratch(tree->n_otu,NULL); Copy_Tree(tree,ori_tree); Random_SPRs_On_Rooted_Tree(tree); Free_Bip(ori_tree); Alloc_Bip(ori_tree); Get_Bip(ori_tree->a_nodes[0],ori_tree->a_nodes[0]->v[0],ori_tree); Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); Match_Tip_Numbers(tree,ori_tree); rf = (phydbl)Compare_Bip(ori_tree,tree,NO,TREE_COMP_RF_PLAIN)/(tree->n_otu-3); PhyML_Printf("\n. rf: %f",rf); phydbl scale; scale = exp(Rnorm(0,0.2)); PhyML_Printf("\n. Scale: %f",scale); For(i,2*tree->n_otu-1) tree->times->nd_t[i] *= scale; phydbl *tree_dist,*geo_dist; int j; Time_To_Branch(tree); tree_dist = Dist_Btw_Tips(tree); geo_dist = (phydbl *)mCalloc(tree->n_otu*tree->n_otu,sizeof(phydbl)); for(i=0;in_otu;i++) { for(j=0;jn_otu;j++) { /* geo_dist[i*tree->n_otu+j] = */ /* FABS(t->ldscape[t->idx_loc[i]*t->n_dim+0] - */ /* t->ldscape[t->idx_loc[j]*t->n_dim+0])+ */ /* FABS(t->ldscape[t->idx_loc[i]*t->n_dim+1] - */ /* t->ldscape[t->idx_loc[j]*t->n_dim+1]); */ geo_dist[i*tree->n_otu+j] = FABS(t->coord_loc[t->idx_loc[i]]->lonlat[0] - t->coord_loc[t->idx_loc[j]]->lonlat[0])+ FABS(t->coord_loc[t->idx_loc[i]]->lonlat[1] - t->coord_loc[t->idx_loc[j]]->lonlat[1]); } } printf("\n. tau: %f lbda: %f sigma: %f",t->tau,t->lbda,t->sigma); mantel_p_val = Mantel(tree_dist,geo_dist,tree->n_otu,tree->n_otu); printf("\n. Mantel test p-value: %f",mantel_p_val); Free(tree_dist); Free(geo_dist); rand_loc = Rand_Int(0,t->ldscape_sz-1); PhyML_Printf("\n. sigma: %f\t lbda: %f\t tau:%f\t x:%f\t y:%f rand.x:%f\t rand.y:%f\t", t->sigma, t->lbda, t->tau, /* t->ldscape[t->idx_loc[tree->n_root->num]*t->n_dim+0], */ /* t->ldscape[t->idx_loc[tree->n_root->num]*t->n_dim+1], */ /* t->ldscape[rand_loc*t->n_dim+0], */ /* t->ldscape[rand_loc*t->n_dim+1]); */ t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[0], t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[1], t->coord_loc[rand_loc]->lonlat[0], t->coord_loc[rand_loc]->lonlat[1]); PhyML_Fprintf(fp,"%f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t", t->sigma, t->sigma_thresh, t->lbda, t->tau, t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[0], t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[1], t->coord_loc[rand_loc]->lonlat[0], t->coord_loc[rand_loc]->lonlat[1], rf); GEO_Get_Locations_Beneath(t,tree); probs = (phydbl *)mCalloc(tree->geo->ldscape_sz,sizeof(phydbl)); sum = 0.0; for(i=0;igeo->ldscape_sz;i++) sum += tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]; for(i=0;igeo->ldscape_sz;i++) probs[i] = tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]/sum; tree->geo->idx_loc[tree->n_root->num] = Sample_i_With_Proba_pi(probs,tree->geo->ldscape_sz); Free(probs); GEO_Randomize_Locations(tree->n_root,tree->geo,tree); GEO_Update_Occup(t,tree); GEO_Lk(t,tree); PhyML_Printf("\n. Init loglk: %f",tree->geo->c_lnL); res = GEO_MCMC(tree); PhyML_Fprintf(fp,"%f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f \n", /* Sigma5 */ Quantile(res+0*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* Sigma50*/ Quantile(res+0*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* Sigma95*/ Quantile(res+0*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* ProbInfThesh */ Prob(res+0*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval,t->sigma_thresh), /* Lbda5 */ Quantile(res+1*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* Lbda50 */ Quantile(res+1*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* Lbda95 */ Quantile(res+1*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* ProbInf1 */ Prob(res+1*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval,1.0), /* Tau5 */ Quantile(res+2*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* Tau50 */ Quantile(res+2*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* Tau 95 */ Quantile(res+2*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* X5 */ Quantile(res+4*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* X50 */ Quantile(res+4*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* X95 */ Quantile(res+4*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* Y5 */ Quantile(res+5*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* Y50 */ Quantile(res+5*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* Y95 */ Quantile(res+5*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* RandX5 */ Quantile(res+6*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* RandX50*/ Quantile(res+6*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* RandX95*/ Quantile(res+6*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* RandY5 */ Quantile(res+7*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* RandY50*/ Quantile(res+7*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* RandY95*/ Quantile(res+7*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), mantel_p_val ); fflush(NULL); Free(s); Free(res); fclose(fp); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl *GEO_MCMC(t_tree *tree) { phydbl *res; int n_vars; int rand_loc; t_geo *t; t = tree->geo; tree->mcmc = MCMC_Make_MCMC_Struct(); MCMC_Complete_MCMC(tree->mcmc,tree); tree->mcmc->io = NULL; tree->mcmc->is = NO; tree->mcmc->run = 0; tree->mcmc->sample_interval = 1E+3; tree->mcmc->chain_len = 1E+6; tree->mcmc->chain_len_burnin = 1E+5; tree->mcmc->randomize = YES; tree->mcmc->norm_freq = 1E+3; tree->mcmc->max_tune = 1.E+20; tree->mcmc->min_tune = 1.E-10; tree->mcmc->print_every = 2; tree->mcmc->is_burnin = NO; tree->mcmc->nd_t_digits = 1; t->tau = 1.0; t->lbda = 1.0; t->sigma = 1.0; t->dum = 1.0; tree->mcmc->chain_len = 1.E+8; tree->mcmc->sample_interval = 50; MCMC_Complete_MCMC(tree->mcmc,tree); GEO_Update_Occup(t,tree); GEO_Lk(t,tree); tree->mcmc->start_ess[tree->mcmc->num_move_geo_sigma] = YES; tree->mcmc->start_ess[tree->mcmc->num_move_geo_lambda] = YES; tree->mcmc->start_ess[tree->mcmc->num_move_geo_tau] = YES; tree->mcmc->start_ess[tree->mcmc->num_move_geo_dum] = YES; n_vars = 10; res = (phydbl *)mCalloc(tree->mcmc->chain_len / tree->mcmc->sample_interval * n_vars,sizeof(phydbl)); PhyML_Printf("\n. Run Sigma [ESS] Lambda [ESS] Tau [ESS] Dummy [ESS] LogLk"); tree->mcmc->run = 0; do { MCMC_GEO_Lbda(tree); MCMC_GEO_Tau(tree); /* MCMC_Geo_Dum(tree); */ MCMC_GEO_Loc(tree); t->update_fmat = YES; MCMC_GEO_Sigma(tree); t->update_fmat = NO; /* t->update_fmat = YES; */ /* MCMC_Geo_Updown_Lbda_Sigma(tree); */ /* t->update_fmat = NO; */ /* MCMC_Geo_Updown_Tau_Lbda(tree); */ /* MCMC_Geo_Updown_Tau_Lbda(tree); */ /* MCMC_Geo_Updown_Tau_Lbda(tree); */ /* printf("\n"); */ /* int i; */ /* For(i,2*tree->n_otu-1) */ /* { */ /* if(tree->a_nodes[i]->tax == NO) */ /* { */ /* printf("%2d ",tree->geo->idx_loc[i]); */ /* } */ /* } */ if(tree->mcmc->run%tree->mcmc->sample_interval == 0) { MCMC_Copy_To_New_Param_Val(tree->mcmc,tree); MCMC_Update_Effective_Sample_Size(tree->mcmc->num_move_geo_lambda,tree->mcmc,tree); MCMC_Update_Effective_Sample_Size(tree->mcmc->num_move_geo_sigma,tree->mcmc,tree); MCMC_Update_Effective_Sample_Size(tree->mcmc->num_move_geo_tau,tree->mcmc,tree); /* printf("\n. lbda:%f,%f tau:%f,%f sigma:%f,%f", */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_geo_lambda], */ /* tree->mcmc->tune_move[tree->mcmc->num_move_geo_lambda], */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_geo_tau], */ /* tree->mcmc->tune_move[tree->mcmc->num_move_geo_tau], */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_geo_sigma], */ /* tree->mcmc->tune_move[tree->mcmc->num_move_geo_sigma]); */ PhyML_Printf("\n. %6d %12f %4.0f %12f %4.0f %12f %4.0f %12f %4.0f %12f", tree->mcmc->run, t->sigma, tree->mcmc->ess[tree->mcmc->num_move_geo_sigma], t->lbda, tree->mcmc->ess[tree->mcmc->num_move_geo_lambda], t->tau, tree->mcmc->ess[tree->mcmc->num_move_geo_tau], t->dum, tree->mcmc->ess[tree->mcmc->num_move_geo_dum], t->c_lnL); /* PhyML_Printf("\n%12f %12f %12f %12f", */ /* t->sigma, */ /* t->lbda, */ /* t->tau, */ /* t->dum); */ rand_loc = Rand_Int(0,t->ldscape_sz-1); res[0 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->sigma; res[1 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->lbda; res[2 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->tau; res[3 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->c_lnL; /* res[4 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->ldscape[t->idx_loc[tree->n_root->num]*t->n_dim+0]; */ /* res[5 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->ldscape[t->idx_loc[tree->n_root->num]*t->n_dim+1]; */ res[4 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[0]; res[5 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[1]; /* res[6 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->ldscape[rand_loc*t->n_dim+0]; */ /* res[7 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->ldscape[rand_loc*t->n_dim+1]; */ res[6 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->coord_loc[rand_loc]->lonlat[0]; res[7 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->coord_loc[rand_loc]->lonlat[1]; } tree->mcmc->run++; if(tree->mcmc->ess[tree->mcmc->num_move_geo_sigma] > 200.) tree->mcmc->adjust_tuning[tree->mcmc->num_move_geo_sigma] = NO; if(tree->mcmc->ess[tree->mcmc->num_move_geo_tau] > 200.) tree->mcmc->adjust_tuning[tree->mcmc->num_move_geo_tau] = NO; if(tree->mcmc->ess[tree->mcmc->num_move_geo_lambda]> 200.) tree->mcmc->adjust_tuning[tree->mcmc->num_move_geo_lambda] = NO; MCMC_Get_Acc_Rates(tree->mcmc); if(tree->mcmc->ess[tree->mcmc->num_move_geo_sigma] > 1000. && tree->mcmc->ess[tree->mcmc->num_move_geo_tau] > 1000. && tree->mcmc->ess[tree->mcmc->num_move_geo_lambda]> 1000.) break; } while(tree->mcmc->run < tree->mcmc->chain_len); return(res); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update F matrix. Assume a diagonal covariance matrix. void GEO_Update_Fmat(t_geo *t) { phydbl *loc1, *loc2; int i,j,k; int err; phydbl lognloc; for(i=0;in_dim;i++) t->cov[i*t->n_dim+i] = t->sigma; // Diagonal covariance matrix. Same variance in every direction lognloc = log(t->ldscape_sz); // Fill in F matrix; for(i=0;ildscape_sz;i++) { loc1 = t->coord_loc[i]->lonlat; for(j=i;jldscape_sz;j++) { loc2 = t->coord_loc[j]->lonlat; t->f_mat[i*t->ldscape_sz+j] = .0; // Calculate log(f(l_i,l_j)) - log(f(l_i,l_i) - log(m) for(k=0;kn_dim;k++) t->f_mat[i*t->ldscape_sz+j] += Log_Dnorm(loc2[k],loc1[k],t->cov[k*t->n_dim+k],&err); t->f_mat[i*t->ldscape_sz+j] -= lognloc; for(k=0;kn_dim;k++) t->f_mat[i*t->ldscape_sz+j] -= Log_Dnorm(loc1[k],loc1[k],t->cov[k*t->n_dim+k],&err); // Take the exponential t->f_mat[i*t->ldscape_sz+j] = exp(t->f_mat[i*t->ldscape_sz+j]); // Matrix is symmetric t->f_mat[j*t->ldscape_sz+i] = t->f_mat[i*t->ldscape_sz+j]; /* printf("\n. f[%d,%d] = %f (1:[%f;%f] 2:[%f;%f]) sigma=%f",i,j,t->f_mat[i*t->ldscape_sz+j],loc1[0],loc1[1],loc2[0],loc2[1],SQRT(t->cov[0*t->n_dim+0])); */ } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Sort node heights from oldest to youngest age. void GEO_Update_Sorted_Nd(t_geo *t, t_tree *tree) { int i; int swap; t_node *buff; buff = NULL; For(i,2*tree->n_otu-1) t->sorted_nd[i] = tree->a_nodes[i]; // Bubble sort of the node heights do { swap = NO; For(i,2*tree->n_otu-2) { if(tree->times->nd_t[t->sorted_nd[i+1]->num] < tree->times->nd_t[t->sorted_nd[i]->num]) { buff = t->sorted_nd[i]; t->sorted_nd[i] = t->sorted_nd[i+1]; t->sorted_nd[i+1] = buff; swap = YES; } } } while(swap == YES); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update the set of vectors of occupation along the tree void GEO_Update_Occup(t_geo *t, t_tree *tree) { int i,j; t_node *v1, *v2; GEO_Update_Sorted_Nd(t,tree); For(i,t->ldscape_sz*(2*tree->n_otu-1)) t->occup[i] = 0; t->occup[tree->n_root->num*t->ldscape_sz + t->idx_loc[tree->n_root->num]] = 1; for(i=1;i<2*tree->n_otu-1;i++) { for(j=0;jldscape_sz;j++) { t->occup[t->sorted_nd[i]->num*t->ldscape_sz + j] = t->occup[t->sorted_nd[i-1]->num*t->ldscape_sz + j]; } if(t->sorted_nd[i-1]->tax == NO) { v1 = v2 = NULL; if(t->sorted_nd[i-1] == tree->n_root) { v1 = tree->n_root->v[1]; v2 = tree->n_root->v[2]; } else { for(j=0;j<3;j++) { if(t->sorted_nd[i-1]->v[j] != t->sorted_nd[i-1]->anc && t->sorted_nd[i-1]->b[j] != tree->e_root) { if(!v1) v1 = t->sorted_nd[i-1]->v[j]; else v2 = t->sorted_nd[i-1]->v[j]; } } } if(t->idx_loc[v1->num] != t->idx_loc[t->sorted_nd[i-1]->num]) { t->occup[t->sorted_nd[i]->num * t->ldscape_sz + t->idx_loc[v1->num]]++; } else { t->occup[t->sorted_nd[i]->num * t->ldscape_sz + t->idx_loc[v2->num]]++; } } } /* printf("\n"); */ /* For(i,2*tree->n_otu-1) */ /* { */ /* printf("\n. Node %3d: ",t->sorted_nd[i]->num); */ /* for(j=0;jldscape_sz;j++) */ /* { */ /* /\* printf("%3d [%12f;%12f] ", *\/ */ /* /\* t->occup[t->sorted_nd[i]->num*t->ldscape_sz + j], *\/ */ /* /\* t->ldscape[j*t->n_dim+0],t->ldscape[j*t->n_dim+1]); *\/ */ /* /\* printf("%3d ", *\/ */ /* /\* t->occup[t->sorted_nd[i]->num*t->ldscape_sz + j]); *\/ */ /* } */ /* } */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Calculate R mat at node n void GEO_Update_Rmat(t_node *n, t_geo *t, t_tree *tree) { int i,j; phydbl lbda_j; for(i=0;ildscape_sz;i++) { for(j=0;jldscape_sz;j++) { lbda_j = ((t->occup[n->num*t->ldscape_sz + j]==0) ? (1.0) : (t->lbda)); t->r_mat[i*t->ldscape_sz+j] = t->f_mat[i*t->ldscape_sz+j] * lbda_j * t->tau * t->dum; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl GEO_Lk(t_geo *t, t_tree *tree) { int i,j; phydbl loglk; phydbl R; int dep,arr; // departure and arrival location indices; t_node *curr_n,*prev_n,*v1,*v2; phydbl sum; GEO_Update_Occup(t,tree); // Same here. if(t->update_fmat == YES) GEO_Update_Fmat(t); prev_n = NULL; curr_n = NULL; loglk = .0; for(i=1;in_otu-1;i++) // Consider all the time slices, from oldest to youngest. // Start at first node below root { prev_n = t->sorted_nd[i-1]; // node just above curr_n = t->sorted_nd[i]; // current node GEO_Update_Rmat(curr_n,t,tree); // NOTE: don't need to do that every time. Add check later. R = GEO_Total_Migration_Rate(curr_n,t); // Total migration rate calculated at node n /* if(i < 2) */ /* { */ /* printf("\n. t0: %f t1: %f R: %f tau: %f sigma: %f lbda: %f x1: %f y1: %f x2: %f y2: %f log0: %d loc1: %d rij: %G fij: %G", */ /* tree->times->nd_t[t->sorted_nd[i-1]->num], */ /* tree->times->nd_t[t->sorted_nd[i]->num], */ /* R, */ /* t->tau, */ /* t->lbda, */ /* t->sigma, */ /* t->ldscape[t->idx_loc[tree->geo->sorted_nd[i-1]->num]*t->n_dim+0], */ /* t->ldscape[t->idx_loc[tree->geo->sorted_nd[i-1]->num]*t->n_dim+1], */ /* t->ldscape[t->idx_loc[tree->geo->sorted_nd[i]->num]*t->n_dim+0], */ /* t->ldscape[t->idx_loc[tree->geo->sorted_nd[i]->num]*t->n_dim+1], */ /* t->idx_loc[tree->geo->sorted_nd[i-1]->num], */ /* t->idx_loc[tree->geo->sorted_nd[i]->num], */ /* t->r_mat[t->idx_loc[tree->geo->sorted_nd[i-1]->num] * t->ldscape_sz + t->idx_loc[tree->geo->sorted_nd[i]->num]], */ /* t->f_mat[t->idx_loc[tree->geo->sorted_nd[i-1]->num] * t->ldscape_sz + t->idx_loc[tree->geo->sorted_nd[i]->num]] */ /* ); */ /* printf("\n >> "); */ /* int j; */ /* for(j=0;jldscape_sz;j++) */ /* if(t->occup[t->sorted_nd[i]->num * t->ldscape_sz + j] > 0) */ /* printf("%f %f -- ", */ /* t->ldscape[j*t->n_dim+0], */ /* t->ldscape[j*t->n_dim+1]); */ /* } */ /* printf("\n. %d %d (%d) %f %p %p \n",i,curr_n->num,curr_n->tax,tree->times->nd_t[curr_n->num],curr_n->v[1],curr_n->v[2]); */ v1 = v2 = NULL; for(j=0;j<3;j++) if(curr_n->v[j] != curr_n->anc && curr_n->b[j] != tree->e_root) { if(!v1) v1 = curr_n->v[j]; else v2 = curr_n->v[j]; } dep = t->idx_loc[curr_n->num]; // departure location arr = // arrival location (t->idx_loc[v1->num] == t->idx_loc[curr_n->num] ? t->idx_loc[v2->num] : t->idx_loc[v1->num]); /* printf("\n%f\t%f", */ /* t->ldscape[arr*t->n_dim+0]-t->ldscape[dep*t->n_dim+0], */ /* t->ldscape[arr*t->n_dim+1]-t->ldscape[dep*t->n_dim+1]); */ loglk -= R * FABS(tree->times->nd_t[curr_n->num] - tree->times->nd_t[prev_n->num]); loglk += log(t->r_mat[dep * t->ldscape_sz + arr]); /* printf("\n <> %d %f %f %d %d v1:%d v2:%d anc:%d %d %d %d", */ /* curr_n->num, */ /* R * FABS(tree->times->nd_t[curr_n->num] - tree->times->nd_t[prev_n->num]), */ /* log(t->r_mat[dep * t->ldscape_sz + arr]), */ /* dep,arr,v1->num,v2->num,curr_n->anc->num,curr_n->v[0]->num,curr_n->v[1]->num,curr_n->v[2]->num); */ /* if(i<2) */ /* { */ /* printf("\n. R = %f r_mat = %f f_mat = %f dt = %f loglk = %f", */ /* R, */ /* t->r_mat[dep * t->ldscape_sz + arr], */ /* t->f_mat[dep * t->ldscape_sz + arr], */ /* FABS(t->sorted_nd[i] - t->sorted_nd[i-1]),loglk); */ /* Exit("\n"); */ /* } */ } // Likelihood for the first 'slice' (i.e., the part just below the root down to // the next node) GEO_Update_Rmat(tree->n_root,t,tree); loglk -= log(t->ldscape_sz); dep = t->idx_loc[tree->n_root->num]; arr = (t->idx_loc[tree->n_root->num] != t->idx_loc[tree->n_root->v[1]->num] ? t->idx_loc[tree->n_root->v[1]->num] : t->idx_loc[tree->n_root->v[2]->num]); /* printf("\n %f %f",t->ldscape[dep],t->ldscape[arr]); */ loglk += log(t->r_mat[dep * t->ldscape_sz + arr]); sum = .0; for(i=0;ildscape_sz;i++) sum += t->r_mat[dep * t->ldscape_sz + i]; loglk -= log(sum); tree->geo->c_lnL = loglk; return loglk; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Init_Tloc_Tips(t_geo *t, t_tree *tree) { int i; // TO DO for(i=0;in_otu;i++) { t->idx_loc[i] = i; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Do not forget to call GEO_Update_Rmat (with node n) before calling this function phydbl GEO_Total_Migration_Rate(t_node *n, t_geo *t) { phydbl R; int i,j; R = .0; for(i=0;ildscape_sz;i++) { for(j=0;jldscape_sz;j++) { R += t->r_mat[i * t->ldscape_sz + j] * t->occup[n->num * t->ldscape_sz + i]; } } return R; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Find the arrival location for the migration leaving from n int GEO_Get_Arrival_Location(t_node *n, t_geo *t, t_tree *tree) { int i; t_node *v1, *v2; // the two daughters of n v1 = v2 = NULL; for(i=0;i<3;i++) { if(n->v[i] && n->v[i] != n->anc) { if(!v1) v1 = n->v[i]; else v2 = n->v[i]; } } if(t->idx_loc[v1->num] == t->idx_loc[v2->num]) // Migrated to the same location as that of n { if(t->idx_loc[n->num] != t->idx_loc[v1->num]) { PhyML_Printf("\n== Error detected in location labeling."); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } else return t->idx_loc[n->num]; } else // Migrated to a different spot { if((t->idx_loc[v1->num] != t->idx_loc[n->num]) && (t->idx_loc[v2->num] != t->idx_loc[n->num])) { PhyML_Printf("\n== Error detected in location labeling."); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } else { if(t->idx_loc[v1->num] == t->idx_loc[n->num]) return t->idx_loc[v2->num]; // v2 gets the new location, v1 inheritates from n else return t->idx_loc[v1->num]; // v1 gets the new location, v2 inheritates from n } } return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *GEO_Simulate(t_geo *t, int n_otu) { t_tree *tree; int n_branching_nodes; t_node **branching_nodes; // vector of nodes available for branching out phydbl *p_branch; // p_branch[i]: proba that the i-th node in branching_nodes branches out (p_x vector in the article) phydbl *p_mig; // p_branch[i]: proba of migrating to location i from the location of the edge branching out (q_i vector in the article) int hit; phydbl time; int dep, arr; int i,j; phydbl sum; phydbl R; int *occup; // occupation vector. Updated as we move down the tree int nd_idx; t_node *buff_nd; phydbl buff_t; int buff_l; int swap; tree = Make_Tree_From_Scratch(n_otu,NULL); tree->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->rates,NULL,tree->n_otu); tree->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->times,NULL,tree->n_otu); tree->n_root = tree->a_nodes[2*tree->n_otu-2]; // Set the root node to the last element in the list of nodes tree->geo = t; For(i,2*tree->n_otu-2) tree->times->nd_t[i] = -1.; occup = (int *)mCalloc(t->ldscape_sz,sizeof(int)); GEO_Update_Fmat(t); branching_nodes = (t_node **)mCalloc(tree->n_otu,sizeof(t_node *)); branching_nodes[0] = tree->n_root; n_branching_nodes = 1; nd_idx = 0; p_branch = (phydbl *)mCalloc(tree->n_otu,sizeof(phydbl )); p_branch[0] = 1.0; p_mig = (phydbl *)mCalloc(t->ldscape_sz,sizeof(phydbl )); time = 0.0; // Time at the root node (this will be changed afterward) // Sample a location uniformly for the root t->idx_loc[tree->n_root->num] = Rand_Int(0,t->ldscape_sz-1); // Update the occupancy vector occup[t->idx_loc[tree->n_root->num]] = 1; dep = arr = -1; // total migration rate R = 0.0; for(i=0;ildscape_sz;i++) { R += t->f_mat[t->idx_loc[tree->n_root->num]*t->ldscape_sz+i] * ((occup[i] == 0) ? (1.0) : (t->lbda)) * t->tau * t->dum; } do { // Select the node that branches out hit = Sample_i_With_Proba_pi(p_branch,n_branching_nodes); /* printf("\n. [%d] Select node %d (location %d)",n_branching_nodes,branching_nodes[hit]->num,t->idx_loc[branching_nodes[hit]->num]); */ // Set the time for the branching node tree->times->nd_t[branching_nodes[hit]->num] = time; /* printf("\n. Set its time to %f",time); */ // Select the destination location dep = t->idx_loc[branching_nodes[hit]->num]; // Departure point sum = .0; for(i=0;ildscape_sz;i++) // Total rate of migration out of departure point { p_mig[i] = t->f_mat[dep*t->ldscape_sz+i] * ((occup[i] == 0) ? (1.0) : (t->lbda)) * t->tau * t->dum; sum += p_mig[i]; } for(i=0;ildscape_sz;i++) p_mig[i] /= sum; arr = Sample_i_With_Proba_pi(p_mig,t->ldscape_sz); /* printf("\n. Migrate from %d [%5.2f,%5.2f] to %d [%5.2f,%5.2f]", */ /* dep, */ /* t->ldscape[dep*t->n_dim+0], */ /* t->ldscape[dep*t->n_dim+1], */ /* arr, */ /* t->ldscape[arr*t->n_dim+0], */ /* t->ldscape[arr*t->n_dim+1]); */ /* printf("\n%f\t%f", */ /* t->ldscape[arr*t->n_dim+0]-t->ldscape[dep*t->n_dim+0], */ /* t->ldscape[arr*t->n_dim+1]-t->ldscape[dep*t->n_dim+1]); */ // Update vector of occupation occup[arr]++; /* printf("\n. Remove %d. Add %d and %d",branching_nodes[hit]->num,tree->a_nodes[nd_idx]->num,tree->a_nodes[nd_idx+1]->num); */ // Connect two new nodes to the node undergoing a branching event tree->a_nodes[nd_idx]->v[0] = branching_nodes[hit]; tree->a_nodes[nd_idx+1]->v[0] = branching_nodes[hit]; branching_nodes[hit]->v[1] = tree->a_nodes[nd_idx]; branching_nodes[hit]->v[2] = tree->a_nodes[nd_idx+1]; // update branching_nodes vector. Element 'hit' is being replaced so that the corresponding node can no longer branch out branching_nodes[hit] = tree->a_nodes[nd_idx]; branching_nodes[n_branching_nodes] = tree->a_nodes[nd_idx+1]; // Update t_loc vector. t->idx_loc[tree->a_nodes[nd_idx]->num] = dep; t->idx_loc[tree->a_nodes[nd_idx+1]->num] = arr; // Update total migration rate R = .0; for(i=0;ildscape_sz;i++) { if(occup[i] > 0) { for(j=0;jldscape_sz;j++) { R += occup[i] * t->f_mat[i*t->ldscape_sz+j] * ((occup[j] == 0) ? (1.0) : (t->lbda)) * t->tau * t->dum; } } } // Set the time until next branching event time = time + Rexp(R); // Update p_branch vector For(i,n_branching_nodes+1) { dep = t->idx_loc[branching_nodes[i]->num]; p_branch[i] = 0.0; for(j=0;jldscape_sz;j++) { p_branch[i] += t->f_mat[dep*t->ldscape_sz+j] * ((occup[j] == 0) ? (1.0) : (t->lbda)) * t->tau * t->dum / R; /* printf("\n. %f %f %f %f", */ /* R, */ /* t->f_mat[dep*t->ldscape_sz+j], */ /* ((occup[j]>0) ? (t->lbda) : (1.0)), */ /* t->tau); */ } /* printf("\n. %f ",p_branch[i]); */ } // Increase the number of branching nodes by one (you just added 2 new and removed 1 old) n_branching_nodes++; nd_idx += 2; } while(n_branching_nodes < n_otu); // Set the times at the tips For(i,2*tree->n_otu-1) if(tree->times->nd_t[i] < 0.0) tree->times->nd_t[i] = time; // Reverse time scale For(i,2*tree->n_otu-1) tree->times->nd_t[i] -= time; /* For(i,2*tree->n_otu-1) tree->times->nd_t[i] = FABS(tree->times->nd_t[i]); */ // Bubble sort to put all the tips at the top of the tree->a_nodes array do { swap = NO; For(i,2*tree->n_otu-2) { if(!tree->a_nodes[i+1]->v[1] && tree->a_nodes[i]->v[1]) { buff_nd = tree->a_nodes[i+1]; tree->a_nodes[i+1] = tree->a_nodes[i]; tree->a_nodes[i] = buff_nd; buff_t = tree->times->nd_t[i+1]; tree->times->nd_t[i+1] = tree->times->nd_t[i]; tree->times->nd_t[i] = buff_t; buff_l = t->idx_loc[i+1]; t->idx_loc[i+1] = t->idx_loc[i]; t->idx_loc[i] = buff_l; swap = YES; } } } while(swap == YES); // The rest below is just bookeeping... For(i,2*tree->n_otu-1) tree->a_nodes[i]->num = i; For(i,2*tree->n_otu-1) { if(i < tree->n_otu) tree->a_nodes[i]->tax = YES; else tree->a_nodes[i]->tax = NO; } /* printf("\n++++++++++++++++++\n"); */ /* For(i,2*tree->n_otu-1) */ /* { */ /* printf("\n. Node %3d [%p] anc:%3d v1:%3d v2:%3d time: %f", */ /* tree->a_nodes[i]->num, */ /* (void *)tree->a_nodes[i], */ /* tree->a_nodes[i]->v[0] ? tree->a_nodes[i]->v[0]->num : -1, */ /* tree->a_nodes[i]->v[1] ? tree->a_nodes[i]->v[1]->num : -1, */ /* tree->a_nodes[i]->v[2] ? tree->a_nodes[i]->v[2]->num : -1, */ /* tree->times->nd_t[i]); */ /* } */ for(i=0;in_otu;i++) { if(!tree->a_nodes[i]->name) tree->a_nodes[i]->name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); strcpy(tree->a_nodes[i]->name,"x"); sprintf(tree->a_nodes[i]->name+1,"%d",i); } tree->n_root->v[1]->v[0] = tree->n_root->v[2]; tree->n_root->v[2]->v[0] = tree->n_root->v[1]; tree->num_curr_branch_available = 0; Connect_Edges_To_Nodes_Recur(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); tree->e_root = tree->n_root->v[1]->b[0]; For(i,2*tree->n_otu-3) { tree->a_edges[i]->l->v = FABS(tree->times->nd_t[tree->a_edges[i]->left->num] - tree->times->nd_t[tree->a_edges[i]->rght->num]); } tree->e_root->l->v = FABS(tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]) + FABS(tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]); tree->n_root->l[1] = FABS(tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]); tree->n_root->l[2] = FABS(tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]); tree->n_root_pos = FABS(tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]) / tree->e_root->l->v; /* printf("\n. %s ",Write_Tree(tree)); */ DR_Draw_Tree("essai.ps",tree); /* for(i=0;in_otu;i++) */ /* printf("\n. %4s %4d [%5.2f %5.2f]",tree->a_nodes[i]->name, */ /* t->idx_loc[i], */ /* t->ldscape[t->idx_loc[i]*t->n_dim+0], */ /* t->ldscape[t->idx_loc[i]*t->n_dim+1]); */ Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); Free(branching_nodes); Free(p_branch); Free(p_mig); return(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Simualte n coordinates (in 2D) void GEO_Simulate_Coordinates(int n, t_geo *t) { int i; phydbl width; width = 5.; for(i=0;ildscape[i*t->n_dim+0] = -width/2. + Uni()*width; */ /* t->ldscape[i*t->n_dim+1] = width/2.; */ t->coord_loc[i]->lonlat[0] = -width/2. + Uni()*width; t->coord_loc[i]->lonlat[1] = width/2.; } /* t->ldscape[0*t->n_dim+0] = 0.0; */ /* t->ldscape[0*t->n_dim+1] = 0.0; */ /* t->ldscape[1*t->n_dim+0] = 0.1; */ /* t->ldscape[1*t->n_dim+1] = 0.1; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Optimize_Sigma(t_geo *t, t_tree *tree) { Generic_Brent_Lk(&(t->sigma), t->min_sigma, t->max_sigma, 1.E-5, 1000, NO, GEO_Wrap_Lk,NULL,tree,NULL,NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Optimize_Lambda(t_geo *t, t_tree *tree) { Generic_Brent_Lk(&(t->lbda), t->min_lbda, t->max_lbda, 1.E-5, 1000, NO, GEO_Wrap_Lk,NULL,tree,NULL,NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Optimize_Tau(t_geo *t, t_tree *tree) { Generic_Brent_Lk(&(t->tau), t->min_tau, t->max_tau, 1.E-5, 1000, NO, GEO_Wrap_Lk,NULL,tree,NULL,NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl GEO_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { return GEO_Lk(tree->geo,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Init_Geo_Struct(t_geo *t) { t->c_lnL = UNLIKELY; t->sigma = 1.0; t->min_sigma = 1.E-3; t->max_sigma = 1.E+3; t->sigma_thresh = t->max_sigma; t->lbda = 1.0; t->min_lbda = 1.E-3; t->max_lbda = 1.E+3; t->tau = 1.0; t->min_tau = 1.E-3; t->max_tau = 1.E+3; t->dum = 1.0; t->min_dum = 1.E-3; t->max_dum = 1.E+3; t->n_dim = 2; t->ldscape_sz = 1; t->update_fmat = YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Randomize_Locations(t_node *n, t_geo *t, t_tree *tree) { if(n->tax == YES) return; else { t_node *v1, *v2; int i; phydbl *probs; // vector of probability of picking each location phydbl sum; phydbl u; probs = (phydbl *)mCalloc(t->ldscape_sz,sizeof(phydbl)); v1 = v2 = NULL; for(i=0;i<3;i++) { if(n->v[i] != n->anc && n->b[i] != tree->e_root) { if(!v1) v1 = n->v[i]; else v2 = n->v[i]; } } if(v1->tax && v2->tax) { Free(probs); return; } else if(v1->tax && !v2->tax && t->idx_loc[v1->num] != t->idx_loc[n->num]) { t->idx_loc[v2->num] = t->idx_loc[n->num]; } else if(v2->tax && !v1->tax && t->idx_loc[v2->num] != t->idx_loc[n->num]) { t->idx_loc[v1->num] = t->idx_loc[n->num]; } else if(v1->tax && !v2->tax && t->idx_loc[v1->num] == t->idx_loc[n->num]) { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v2->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v2->num * t->ldscape_sz + i]/sum; t->idx_loc[v2->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); } else if(v2->tax && !v1->tax && t->idx_loc[v2->num] == t->idx_loc[n->num]) { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v1->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v1->num * t->ldscape_sz + i]/sum; t->idx_loc[v1->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); } else { int n_v1, n_v2; phydbl p; n_v1 = t->idx_loc_beneath[v1->num * t->ldscape_sz + t->idx_loc[n->num]]; n_v2 = t->idx_loc_beneath[v2->num * t->ldscape_sz + t->idx_loc[n->num]]; if(n_v1 + n_v2 < 1) { PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } p = n_v1 / (n_v1 + n_v2); u = Uni(); if(u < p) { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v2->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v2->num * t->ldscape_sz + i]/sum; t->idx_loc[v2->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); t->idx_loc[v1->num] = t->idx_loc[n->num]; } else { if(t->idx_loc_beneath[v2->num * t->ldscape_sz + t->idx_loc[n->num]] > 0) { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v1->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v1->num * t->ldscape_sz + i]/sum; t->idx_loc[v1->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); t->idx_loc[v2->num] = t->idx_loc[n->num]; } else { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v2->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v2->num * t->ldscape_sz + i]/sum; t->idx_loc[v2->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); t->idx_loc[v1->num] = t->idx_loc[n->num]; } } if(t->idx_loc[v1->num] != t->idx_loc[n->num] && t->idx_loc[v2->num] != t->idx_loc[n->num]) { PhyML_Printf("\n. %d %d %d",t->idx_loc[v1->num],t->idx_loc[v2->num],t->idx_loc[n->num]); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } if(t->idx_loc_beneath[v1->num * t->ldscape_sz + t->idx_loc[v1->num]] < 1) { PhyML_Printf("\n. %d %d %d",t->idx_loc[v1->num],t->idx_loc[v2->num],t->idx_loc[n->num]); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } if(t->idx_loc_beneath[v2->num * t->ldscape_sz + t->idx_loc[v2->num]] < 1) { PhyML_Printf("\n. %d %d %d",t->idx_loc[v1->num],t->idx_loc[v2->num],t->idx_loc[n->num]); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } } Free(probs); for(i=0;i<3;i++) if(n->v[i] != n->anc && n->b[i] != tree->e_root) GEO_Randomize_Locations(n->v[i],t,tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Get_Locations_Beneath(t_geo *t, t_tree *tree) { int i; GEO_Get_Locations_Beneath_Post(tree->n_root,tree->n_root->v[1],t,tree); GEO_Get_Locations_Beneath_Post(tree->n_root,tree->n_root->v[2],t,tree); for(i=0;ildscape_sz;i++) { t->idx_loc_beneath[tree->n_root->num*t->ldscape_sz+i] = t->idx_loc_beneath[tree->n_root->v[1]->num*t->ldscape_sz+i] + t->idx_loc_beneath[tree->n_root->v[2]->num*t->ldscape_sz+i]; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Get_Locations_Beneath_Post(t_node *a, t_node *d, t_geo *t, t_tree *tree) { if(d->tax) { t->idx_loc_beneath[d->num*t->ldscape_sz+t->idx_loc[d->num]] = 1; return; } else { int i; t_node *v1, *v2; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { GEO_Get_Locations_Beneath_Post(d,d->v[i],t,tree); } } v1 = v2 = NULL; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { if(!v1) v1 = d->v[i]; else v2 = d->v[i]; } } for(i=0;ildscape_sz;i++) { t->idx_loc_beneath[ d->num*t->ldscape_sz+i] = t->idx_loc_beneath[v1->num*t->ldscape_sz+i] + t->idx_loc_beneath[v2->num*t->ldscape_sz+i] ; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Get_Sigma_Max(t_geo *t) { int i,j; phydbl mean_dist,inv_mean_dist; phydbl sigma_a, sigma_b, sigma_c; phydbl overlap_a, overlap_b, overlap_c; phydbl d_intersect; phydbl overlap_target; phydbl eps; int n_iter,n_iter_max; eps = 1.E-6; overlap_target = 0.95; n_iter_max = 100; mean_dist = -1.; inv_mean_dist = -1.; for(i=0;ildscape_sz-1;i++) { for(j=i+1;jldscape_sz;j++) { /* dist = POW(t->ldscape[i*t->n_dim+0] - t->ldscape[j*t->n_dim+0],1); */ /* if(dist > mean_dist) mean_dist = dist; */ /* dist = POW(t->ldscape[i*t->n_dim+1] - t->ldscape[j*t->n_dim+1],1); */ /* if(dist > mean_dist) mean_dist = dist; */ /* mean_dist += FABS(t->ldscape[i*t->n_dim+0] - t->ldscape[j*t->n_dim+0]); */ /* mean_dist += FABS(t->ldscape[i*t->n_dim+1] - t->ldscape[j*t->n_dim+1]); */ mean_dist += FABS(t->coord_loc[i]->lonlat[0] - t->coord_loc[j]->lonlat[0]); mean_dist += FABS(t->coord_loc[i]->lonlat[1] - t->coord_loc[j]->lonlat[1]); } } mean_dist /= t->ldscape_sz*(t->ldscape_sz-1)/2.; inv_mean_dist = 1./mean_dist; PhyML_Printf("\n. Mean distance between locations: %f",mean_dist); sigma_a = t->min_sigma; sigma_b = 1.0; sigma_c = t->max_sigma; /* sigma_a = t->min_sigma; sigma_b = 1.0; sigma_c = 10.; */ n_iter = 0; do { d_intersect = Inverse_Truncated_Normal(inv_mean_dist,0.0,sigma_a,0.0,mean_dist); overlap_a = (Pnorm(mean_dist,0.0,sigma_a) - Pnorm(d_intersect,0.0,sigma_a))/ (Pnorm(mean_dist,0.0,sigma_a) - Pnorm(0.0,0.0,sigma_a)) + d_intersect / mean_dist; /* printf("\n. inter: %f %f [%f]",d_intersect,mean_dist,d_intersect / mean_dist); */ d_intersect = Inverse_Truncated_Normal(inv_mean_dist,0.0,sigma_b,0.0,mean_dist); overlap_b = (Pnorm(mean_dist,0.0,sigma_b) - Pnorm(d_intersect,0.0,sigma_b))/ (Pnorm(mean_dist,0.0,sigma_b) - Pnorm(0.0,0.0,sigma_b)) + d_intersect / mean_dist; /* printf("\n. inter: %f %f [%f]",d_intersect,mean_dist,d_intersect / mean_dist); */ d_intersect = Inverse_Truncated_Normal(inv_mean_dist,0.0,sigma_c,0.0,mean_dist); overlap_c = (Pnorm(mean_dist,0.0,sigma_c) - Pnorm(d_intersect,0.0,sigma_c))/ (Pnorm(mean_dist,0.0,sigma_c) - Pnorm(0.0,0.0,sigma_c)) + d_intersect / mean_dist; /* printf("\n. inter: %f %f [%f]",d_intersect,mean_dist,d_intersect / mean_dist); */ /* printf("\n. sigma_a:%f overlap_a:%f sigma_b:%f overlap_b:%f sigma_c:%f overlap_c:%f", */ /* sigma_a,overlap_a, */ /* sigma_b,overlap_b, */ /* sigma_c,overlap_c); */ if(overlap_target > overlap_a && overlap_target < overlap_b) { sigma_c = sigma_b; sigma_b = sigma_a + (sigma_c - sigma_a)/2.; } else if(overlap_target > overlap_b && overlap_target < overlap_c) { sigma_a = sigma_b; sigma_b = sigma_a + (sigma_c - sigma_a)/2.; } else if(overlap_target < overlap_a) { sigma_a /= 2.; } else if(overlap_target > overlap_c) { sigma_c *= 2.; } n_iter++; } while(sigma_c - sigma_a > eps && n_iter < n_iter_max); /* if(sigma_c - sigma_a > eps) */ /* { */ /* PhyML_Printf("\n== Error detected in getting maximum value of sigma."); */ /* PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); */ /* Exit("\n"); */ /* } */ /* else */ /* { */ /* PhyML_Printf("\n== Threshold for sigma: %f",sigma_b); */ /* } */ t->sigma_thresh = sigma_b; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Geo_Updown_Tau_Lbda(t_tree *tree) { phydbl K,mult,u,alpha,ratio; phydbl cur_lnL,new_lnL; phydbl cur_tau,new_tau; phydbl cur_lbda,new_lbda; K = tree->mcmc->tune_move[tree->mcmc->num_move_geo_updown_tau_lbda]; cur_lnL = tree->geo->c_lnL; new_lnL = tree->geo->c_lnL; cur_tau = tree->geo->tau; new_tau = tree->geo->tau; cur_lbda = tree->geo->lbda; new_lbda = tree->geo->lbda; u = Uni(); mult = exp(K*(u-0.5)); /* Multiply tau by K */ new_tau = cur_tau * K; /* Divide lbda by same amount */ new_lbda = cur_lbda / K; if( new_lbda < tree->geo->min_lbda || new_lbda > tree->geo->max_lbda || new_tau < tree->geo->min_tau || new_tau > tree->geo->max_tau ) { tree->mcmc->run_move[tree->mcmc->num_move_geo_updown_tau_lbda]++; return; } tree->geo->tau = new_tau; tree->geo->lbda = new_lbda; if(tree->eval_alnL) new_lnL = GEO_Lk(tree->geo,tree); ratio = 0.0; /* Proposal ratio: 2n-2=> number of multiplications, 1=>number of divisions */ ratio += 0.0*log(mult); /* (1-1)*log(mult); */ /* Likelihood density ratio */ ratio += (new_lnL - cur_lnL); /* printf("\n. new_tau: %f new_lbda:%f cur_lnL:%f new_lnL:%f",new_tau,new_lbda,cur_lnL,new_lnL); */ ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); if(u > alpha) /* Reject */ { tree->geo->tau = cur_tau; tree->geo->lbda = cur_lbda; tree->geo->c_lnL = cur_lnL; } else { tree->mcmc->acc_move[tree->mcmc->num_move_geo_updown_tau_lbda]++; } tree->mcmc->run_move[tree->mcmc->num_move_geo_updown_tau_lbda]++; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Geo_Updown_Lbda_Sigma(t_tree *tree) { phydbl K,mult,u,alpha,ratio; phydbl cur_lnL,new_lnL; phydbl cur_lbda,new_lbda; phydbl cur_sigma,new_sigma; K = tree->mcmc->tune_move[tree->mcmc->num_move_geo_updown_lbda_sigma]; cur_lnL = tree->geo->c_lnL; new_lnL = tree->geo->c_lnL; cur_lbda = tree->geo->lbda; new_lbda = tree->geo->lbda; cur_sigma = tree->geo->sigma; new_sigma = tree->geo->sigma; u = Uni(); mult = exp(K*(u-0.5)); /* Multiply lbda by K */ new_lbda = cur_lbda * K; /* Divide sigma by same amount */ new_sigma = cur_sigma / K; if( new_sigma < tree->geo->min_sigma || new_sigma > tree->geo->max_sigma || new_lbda < tree->geo->min_lbda || new_lbda > tree->geo->max_lbda ) { tree->mcmc->run_move[tree->mcmc->num_move_geo_updown_lbda_sigma]++; return; } tree->geo->lbda = new_lbda; tree->geo->sigma = new_sigma; if(tree->eval_alnL) new_lnL = GEO_Lk(tree->geo,tree); ratio = 0.0; /* Proposal ratio: 2n-2=> number of multiplications, 1=>number of divisions */ ratio += 0.0*log(mult); /* (1-1)*log(mult); */ /* Likelihood density ratio */ ratio += (new_lnL - cur_lnL); /* printf("\n. new_lbda: %f new_sigma:%f cur_lnL:%f new_lnL:%f",new_lbda,new_sigma,cur_lnL,new_lnL); */ ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); if(u > alpha) /* Reject */ { tree->geo->lbda = cur_lbda; tree->geo->sigma = cur_sigma; tree->geo->c_lnL = cur_lnL; } else { tree->mcmc->acc_move[tree->mcmc->num_move_geo_updown_lbda_sigma]++; } tree->mcmc->run_move[tree->mcmc->num_move_geo_updown_lbda_sigma]++; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Read_In_Landscape(char *file_name, t_geo *t, phydbl **ldscape, int **loc_hash, t_tree *tree) { FILE *fp; char *s; phydbl longitude, lattitude; int tax,loc; PhyML_Printf("\n"); PhyML_Printf("\n. Reading landscape file '%s'.\n",file_name); s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); (*ldscape) = (phydbl *)mCalloc(10*t->n_dim,sizeof(phydbl)); (*loc_hash) = (int *)mCalloc(tree->n_otu,sizeof(int)); fp = Openfile(file_name,0); tax = loc = -1; t->ldscape_sz = 0; do { if(fscanf(fp,"%s",s) == EOF) break; if(strlen(s) > 0) for(tax=0;taxn_otu;tax++) if(!strcmp(tree->a_nodes[tax]->name,s)) break; if(tax == tree->n_otu) { PhyML_Printf("\n== Could not find a taxon with name '%s' in the tree provided.",s); /* PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); */ /* Exit("\n"); */ continue; } /* sscanf(line+pos,"%lf %lf",&longitude,&lattitude); */ if(fscanf(fp,"%lf",&longitude) == EOF) break; if(fscanf(fp,"%lf",&lattitude) == EOF) break; /* printf("\n. s: %s %f %f",s,longitude,lattitude); */ for(loc=0;locldscape_sz;loc++) { if(FABS(longitude-(*ldscape)[loc*t->n_dim+0]) < 1.E-10 && FABS(lattitude-(*ldscape)[loc*t->n_dim+1]) < 1.E-10) { break; } } if(loc == t->ldscape_sz) { t->ldscape_sz++; (*ldscape)[(t->ldscape_sz-1)*t->n_dim+0] = longitude; (*ldscape)[(t->ldscape_sz-1)*t->n_dim+1] = lattitude; if(!(t->ldscape_sz%10)) { (*ldscape) = (phydbl *)mRealloc((*ldscape),(t->ldscape_sz+10)*t->n_dim,sizeof(phydbl)); } } (*loc_hash)[tax] = loc; } while(1); for(tax=0;taxn_otu;tax++) PhyML_Printf("\n. Taxon %30s, longitude: %12f, lattitude: %12f [%4d]", tree->a_nodes[tax]->name, (*ldscape)[(*loc_hash)[tax]*t->n_dim+0], (*ldscape)[(*loc_hash)[tax]*t->n_dim+1], (*loc_hash)[tax]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/geo.h000066400000000000000000000034011501136442400201120ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef GEO_H #define GEO_H #include "utilities.h" int GEO_Main(int argc, char **argv); void Free_Geo(t_geo *t); void GEO_Update_Fmat(t_geo *t); void GEO_Update_Sorted_Nd(t_geo *t,t_tree *tree); void GEO_Update_Occup(t_geo *t,t_tree *tree); void GEO_Update_Rmat(t_node *n,t_geo *t,t_tree *tree); phydbl GEO_Lk(t_geo *t,t_tree *tree); void GEO_Init_Tloc_Tips(t_geo *t,t_tree *tree); phydbl GEO_Total_Migration_Rate(t_node *n,t_geo *t); int GEO_Get_Arrival_Location(t_node *n,t_geo *t,t_tree *tree); void GEO_Simulate_Coordinates(int n, t_geo *t); t_tree *GEO_Simulate(t_geo *t, int n_otu); void GEO_Optimize_Sigma(t_geo *t, t_tree *tree); phydbl GEO_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree); void GEO_Optimize_Lambda(t_geo *t, t_tree *tree); void GEO_Init_Geo_Struct(t_geo *t); void GEO_Optimize_Tau(t_geo *t, t_tree *tree); void GEO_Get_Locations_Beneath(t_geo *t, t_tree *tree); void GEO_Get_Locations_Beneath_Post(t_node *a, t_node *d, t_geo *t, t_tree *tree); void GEO_Randomize_Locations_Pre(t_node *n, t_geo *t, t_tree *tree); void GEO_Randomize_Locations(t_node *n, t_geo *t, t_tree *tree); void GEO_Get_Sigma_Max(t_geo *t); void MCMC_Geo_Updown_Tau_Lbda(t_tree *tree); void MCMC_Geo_Updown_Lbda_Sigma(t_tree *tree); int GEO_Simulate_Estimate(int argc, char **argv); void GEO_Read_In_Landscape(char *file_name, t_geo *t, phydbl **ldscape, int **loc_hash, t_tree *tree); int GEO_Estimate(int argc, char **argv); phydbl *GEO_MCMC(t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/help.c000066400000000000000000000374311501136442400202750ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "help.h" /* int T_MAX_FILE; */ /* phydbl SMALL; */ /* phydbl UNLIKELY; */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Usage(void) { char *BOLD=(char *)mCalloc(10,sizeof(char)); char *FLAT=(char *)mCalloc(10,sizeof(char)); char *LINE=(char *)mCalloc(10,sizeof(char)); char *cha; cha = getenv("OS"); if(cha!=NULL) { strcpy(BOLD, ""); strcpy(FLAT, ""); strcpy(LINE, ""); } else { strcpy(BOLD, "\033[00;01m"); strcpy(FLAT, "\033[00;00m"); strcpy(LINE, "\033[00;04m"); } #ifdef PHYML PhyML_Printf("%sNAME\n" "%s\t- PhyML %s - \n\n" "%s\t\''A simple, fast, and accurate algorithm to estimate\n" "%s\tlarge phylogenies by maximum likelihood\''\n\n" "%s\tStephane Guindon and Olivier Gascuel,\n" "%s\tSystematic Biology 52(5):696-704, 2003.\n\n" "%s\tPlease cite this paper if you use this software in your publications.\n",BOLD,FLAT,VERSION,FLAT,FLAT,FLAT,FLAT,FLAT); #endif #ifdef PHYTIME PhyML_Printf("%sNAME\n" "%s\t- PhyTime %s - \n\n" "%s\t'Bayesian estimation of divergence times from large sequence alignments.'\n" "%s\tStephane Guindon,\n" "%s\tMolecular Biology and Evolution 27(8):1768-81, 2010.\n\n" "%s\tPlease cite this paper if you use this software in your publications.\n",BOLD,FLAT,VERSION,FLAT,FLAT,FLAT,FLAT,FLAT); #endif #ifdef PHYML PhyML_Printf("%s\nSYNOPSIS:\n\n" "%s\tphyml %s[command args]\n",BOLD,BOLD,BOLD); #endif #ifdef PHYTIME PhyML_Printf("%s\nSYNOPSIS:\n\n" "%s\tphytime %s[command args]\n",BOLD,BOLD,BOLD); #endif #ifdef PHYML PhyML_Printf("%s\n\tAll the options below are optional (except '%s-i%s' if you want to use the command-line interface).\n\n",FLAT,BOLD,FLAT); #endif #ifdef PHYTIME PhyML_Printf("%s\n\tAll the options below are optional except '%s-i%s','%s-u%s' and '%s--calibration%s'.\n\n",FLAT,BOLD,FLAT,BOLD,FLAT,BOLD,FLAT); #endif PhyML_Printf("%s\nCommand options:\n%s",BOLD,FLAT); PhyML_Printf("\n\t%s-i (or --input) %sseq_file_name%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sseq_file_name%s is the name of the nucleotide or amino-acid sequence file in PHYLIP format.\n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-d (or --datatype) ""%sdata_type%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sdata_type%s is 'nt' for nucleotide (default), 'aa' for amino-acid sequences, or 'generic',\n",LINE,FLAT); PhyML_Printf("\t\t(use NEXUS file format and the 'symbols' parameter here).\n"); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-q (or --sequential)\n",BOLD); PhyML_Printf("%s\t\tChanges interleaved format (default) to sequential format.\n",FLAT); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t-n (or --multiple) ""%snb_data_sets%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%snb_data_sets%s is an integer corresponding to the number of data sets to analyse.\n",LINE,FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t-p (or --pars)%s\n",BOLD,FLAT); PhyML_Printf("%s\t\tUse a minimum parsimony starting tree. This option is taken into account when the '-u' option\n",FLAT); PhyML_Printf("%s\t\tis absent and when tree topology modifications are to be done.\n",FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t-b (or --bootstrap) %sint%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sint%s > 0: %sint%s is the number of bootstrap replicates.\n",LINE,FLAT,LINE,FLAT); PhyML_Printf("\t\t%sint%s = 0: neither approximate likelihood ratio test nor bootstrap values are computed.\n",LINE,FLAT); PhyML_Printf("\t\t%sint%s = -1: approximate likelihood ratio test returning aLRT statistics.\n",LINE,FLAT); PhyML_Printf("\t\t%sint%s = -2: approximate likelihood ratio test returning Chi2-based parametric branch supports.\n",LINE,FLAT); /* PhyML_Printf("\t\t%sint%s = -3 : minimum of Chi2-based parametric and SH-like branch supports.\n",LINE,FLAT); */ PhyML_Printf("\t\t%sint%s = -4: SH-like branch supports alone.\n",LINE,FLAT); PhyML_Printf("\t\t%sint%s = -5: (default) approximate Bayes branch supports.\n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--tbe%s\n",BOLD,FLAT); PhyML_Printf("\t\tComputes TBE instead of FBP (standard) bootstrap support\n"); PhyML_Printf("\t\tHas no effect with -b <= 0\n"); #endif PhyML_Printf("%s\n\t-m (or --model) %smodel%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tmodel%s : substitution model name.\n",FLAT); PhyML_Printf("\t\t%s- %sNucleotide%s-based models : %sHKY85%s (default) | %sJC69%s | %sK80%s | %sF81%s | %sF84%s \n", FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\t\t %sTN93%s | %sGTR%s | %scustom (*)%s\n", LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\t\t(*) : for the custom option, a string of six digits identifies the model. For instance, 000000\n"); PhyML_Printf("\t\t corresponds to F81 (or JC69 provided the distribution of nucleotide frequencies is uniform).\n"); PhyML_Printf("\t\t 012345 corresponds to GTR. This option can be used for encoding any model that is a nested within GTR.\n"); PhyML_Printf("\n"); PhyML_Printf("\t\t%s- %sAmino-acid%s based models : %sLG%s (default) | %sWAG%s | %sJTT%s | %sMtREV%s | %sDayhoff%s | %sDCMut%s \n",FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\t\t %sRtREV%s | %sCpREV%s | %sVT%s | %sAB%s | %sBlosum62%s | %sMtMam%s | %sMtArt%s\n", LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\t\t %sHIVw%s | %sHIVb%s | %scustom%s\n", LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--aa_rate_file %sfilename%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sfilename%s is the name of the file that provides the amino acid substitution rate matrix in PAML format.\n",LINE,FLAT); PhyML_Printf("\t\tIt is compulsory to use this option when analysing amino acid sequences with the `custom' model.\n"); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t-f %se%s, %sm%s, %so%s or %sfA,fC,fG,fT%s\n",BOLD,LINE,BOLD,LINE,BOLD,LINE,FLAT); PhyML_Printf("\t\t%se%s : the character frequencies are determined by counting the number of amino-acids \n",LINE,FLAT); PhyML_Printf("\t\t or nucleotides from the sequence alignment. \n"); PhyML_Printf("\n"); PhyML_Printf("\t\t%sm%s : the character frequencies are determined as follows : \n",LINE,FLAT); PhyML_Printf("%s\t\t- %sNucleotide%s sequences: the equilibrium base frequencies are optimized using maximum likelihood.\n",FLAT,LINE,FLAT); PhyML_Printf("%s\t\t- %sAmino-acid%s sequences: the equilibrium amino-acid frequencies are estimated using\n" "\t\t the frequencies defined by the substitution model.\n",FLAT,LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("\t\t%so%s : the character frequencies (amino-acids or nucleotides) are optimized using maximum likelihood \n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("\t\t%sf1,f2,...,fn%s. For nucleotide data, n=4 and f1, f2, f3 and f4 are floating numbers that \n",LINE,FLAT); PhyML_Printf("\t\t correspond to the frequencies of A, C, G and T respectively (WARNING: do not use any blank space between\n"); PhyML_Printf("\t\t your values of nucleotide frequencies, only commas!)\n"); PhyML_Printf("\t\t The same option can be used to specify user-defined amino-acid frequencies in the following order:\n"); PhyML_Printf("\t\t Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr Val\n"); PhyML_Printf("\n"); #endif #ifdef PHYTIME PhyML_Printf("%s\n\t--calibration %sfilename%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sfilename%s is the name of the calibration file that provides a priori defined boundaries for node ages.\n",LINE,FLAT); PhyML_Printf("\t\tPlease read the manual for more information about the format of this file.\n"); PhyML_Printf("\n"); #endif PhyML_Printf("%s\n\t-t (or --ts/tv) %sts/tv_ratio%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tts/tv_ratio%s : transition/transversion ratio. DNA sequences only.\n",FLAT); PhyML_Printf("\t\tCan be a fixed positive value (ex:4.0) or %se%s to get the maximum likelihood estimate.\n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-v (or --pinv) %sprop_invar%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tprop_invar%s : proportion of invariable sites.\n",FLAT); PhyML_Printf("\t\tCan be a fixed value in the [0,1] range or %se%s to get the maximum likelihood estimate.\n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-c (or --nclasses) %snb_subst_cat%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tnb_subst_cat%s : number of relative substitution rate categories. Default : %snb_subst_cat%s=4.\n", FLAT,LINE,FLAT); PhyML_Printf("\t\tMust be a positive integer.\n"); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--freerates (or --free_rates or --freerate or --free_rate)\n",BOLD); PhyML_Printf("\t\t%s FreeRate model of substitution rate variation across sites.\n",FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-a (or --alpha) %sgamma%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tgamma%s : distribution of the gamma distribution shape parameter.\n",FLAT); PhyML_Printf("\t\tCan be a fixed positive value or %se%s to get the maximum likelihood estimate.\n",LINE,FLAT); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t-s (or --search) %smove%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t Deprecated option.\n"); PhyML_Printf("\t\tTree topology search operation option.\n"); PhyML_Printf("\t\tCan be either %sNNI%s (default, fast) or %sSPR%s (a bit slower than NNI) or %sBEST%s (best of NNI and SPR search).\n",LINE,FLAT,LINE,FLAT,LINE,FLAT); PhyML_Printf("\n"); #endif PhyML_Printf("%s\n\t-u (or --inputtree) %suser_tree_file%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tuser_tree_file%s : starting tree filename. The tree must be in Newick format.\n",FLAT); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t-o %sparams%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tThis option focuses on specific parameter optimisation.\n"); PhyML_Printf("\t\t%sparams%s=tlr : tree topology (t), branch length (l) and rate parameters (r) are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=tl : tree topology and branch length are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=lr : branch length and rate parameters are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=l : branch length are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=r : rate parameters are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=n : no parameter is optimised.\n",LINE,FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--rand_start%s\n",BOLD,FLAT); PhyML_Printf("\t\tThis option sets the initial tree to random.\n"); PhyML_Printf("\t\tIt is only valid if SPR searches are to be performed.\n"); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--n_rand_starts %snum%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tnum%s is the number of initial random trees to be used.\n",FLAT); PhyML_Printf("\t\tIt is only valid if SPR searches are to be performed.\n"); PhyML_Printf("\n"); #endif PhyML_Printf("%s\n\t--r_seed %snum%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tnum%s is the seed used to initiate the random number generator.\n",FLAT); PhyML_Printf("\t\tMust be an integer.\n"); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t--print_site_lnl%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sPrint the likelihood for each site in file *_phyml_lk.txt.\n",FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--print_trace%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sPrint each phylogeny explored during the tree search process\n",FLAT); PhyML_Printf("\t\t%sin file *_phyml_trace.txt.\n",FLAT); PhyML_Printf("\n"); #endif PhyML_Printf("%s\n\t--run_id %sID_string%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sAppend the string %sID_string%s at the end of each PhyML output file.\n",FLAT,LINE,FLAT); PhyML_Printf("\t\t%sThis option may be useful when running simulations involving PhyML.\n",FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--quiet%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sNo interactive question (for running in batch mode) and quiet output.\n",FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--no_memory_check%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sNo interactive question for memory usage (for running in batch mode). Normal output otherwise.\n",FLAT); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t--leave_duplicates%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sPhyML removes duplicate sequences by default. Use this option to leave them in.\n",FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--alias_subpatt%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sSite aliasing is generalized at the subtree level. Sometimes lead to faster calculations.\n",FLAT); PhyML_Printf("\t\t%sSee Kosakovsky Pond SL, Muse SV, Sytematic Biology (2004) for an example.\n",FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--boot_progress_display %snum%s (default=20)\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%snum%s is the frequency at which the bootstrap progress bar will be updated.\n",LINE,FLAT); PhyML_Printf("\t\tMust be an integer.\n"); PhyML_Printf("\n"); #endif #ifdef PHYTIME PhyML_Printf("%s\n\t--chain_len %snum%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%snum%s is the number of generations or runs of the Markov Chain Monte Carlo. Set to 1E+6 by default. \n",LINE,FLAT); PhyML_Printf("\t\tMust be an integer.\n"); PhyML_Printf("\n"); #endif /* #ifdef PHYTIME */ /* PhyML_Printf("%s\n\t--burnin %snum%s\n",BOLD,LINE,FLAT); */ /* PhyML_Printf("\t\t%snum%s is the number of generations of runs of the Markov Chain Monte Carlo during the 'burnin' period.\n",LINE,FLAT); */ /* PhyML_Printf("\t\t%sSet to 1E+5 by default. Must be an integer. \n",FLAT); */ /* PhyML_Printf("\n"); */ /* #endif */ #ifdef PHYTIME PhyML_Printf("%s\n\t--sample_freq %snum%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tThe chain is sampled every %snum%s generations. Set to 1E+3 by default. \n",LINE,FLAT); PhyML_Printf("\t\tMust be an integer.\n"); PhyML_Printf("\n"); #endif #ifdef PHYTIME PhyML_Printf("%s\n\t--no_sequences%s\n",BOLD,FLAT); PhyML_Printf("\t\tUse this option to run the sampler without sequence data.\n"); PhyML_Printf("\n"); #endif #ifdef PHYTIME PhyML_Printf("%s\n\t--fastlk%s\n",BOLD,FLAT); PhyML_Printf("\t\tUse the multivariate normal approximation to the likelihood and speed up calculations\n"); PhyML_Printf("\n"); #endif #ifdef PHYML PhyML_Printf("%sPHYLIP-LIKE INTERFACE\n""%s\n\tYou can also use PhyML with no argument, in this case change the value of\n",BOLD,FLAT); PhyML_Printf("%s\ta parameter by typing its corresponding character as shown on screen.\n\n",FLAT); #endif #ifdef PHYML PhyML_Printf("%sEXAMPLES\n\n" "%s\tDNA interleaved sequence file, default parameters : ""%s ./phyml -i seqs1" "%s\n\tAA interleaved sequence file, default parameters : ""%s ./phyml -i seqs2 -d aa" "%s\n\tAA sequential sequence file, with customization : ""%s ./phyml -i seqs3 -q -d aa -m JTT -c 4 -a e%s\n",BOLD,FLAT,BOLD,FLAT,BOLD,FLAT,BOLD,FLAT); #endif Exit(""); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/help.h000066400000000000000000000007411501136442400202740ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef OPTIONS_H #define OPTIONS_H #include "utilities.h" #include "cl.h" #include "models.h" #include "free.h" #include "interface.h" void Usage(void); #endif stephaneguindon-phyml-76a39c8/src/ibm.c000066400000000000000000000700721501136442400201120ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "ibm.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// short int IBM_Is_Ibm(t_phyrex_mod *mod) { if(mod->model_id == IBM || mod->model_id == RIBM) return(YES); return(NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IBM_Prior(t_tree *tree) { tree->mmod->c_lnP = RW_Prior(tree); return(tree->mmod->c_lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IBM_Velocity_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree) { assert(d != tree->n_root); return(d->anc->ldsk->veloc->deriv[dim]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IBM_Velocity_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl dt,logvar,eps; eps = 0.0; assert(d != tree->n_root); dt = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num]+eps); logvar = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[d->num]) + log(tree->mmod->sigsq_scale_norm_fact) + log(dt); return(exp(logvar)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IBM_Location_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl dt, loc_beg, veloc_beg, veloc_end, eps; assert(d != tree->n_root); eps = 0.0; dt = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num] + eps); loc_beg = d->anc->ldsk->coord->lonlat[dim]; veloc_beg = d->anc->ldsk->veloc->deriv[dim]; veloc_end = d->ldsk->veloc->deriv[dim]; return(loc_beg + .5*dt*(veloc_beg + veloc_end)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Variance of location at the end of the edge, given velocities at both extremities */ phydbl IBM_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl logvar,eps; eps = 0.0; assert(d != tree->n_root); logvar = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[d->num]) + log(tree->mmod->sigsq_scale_norm_fact) + 3.*log(fabs(tree->times->nd_t[d->num]-tree->times->nd_t[d->anc->num]+eps)) - LOG12; return(exp(logvar)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IBM_Integrated_Location_Down(phydbl son_a, phydbl son_b, phydbl son_mu_down, phydbl son_var_down, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl son_logrem, phydbl bro_logrem, phydbl *mean, phydbl *var, phydbl *logrem) { RW_Integrated_Lk_Down(son_a, son_b, son_mu_down, son_var_down, son_var, bro_a, bro_b, bro_mu_down, bro_var_down, bro_var, son_logrem, bro_logrem, mean, var, logrem); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IBM_Integrated_Location_Up(phydbl dad_mu_up, phydbl dad_var_up, phydbl dad_logrem_up, phydbl son_a, phydbl son_b, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl bro_logrem_down, phydbl *mean, phydbl *var, phydbl *logrem) { RW_Integrated_Lk_Up(dad_mu_up, dad_var_up, dad_logrem_up, son_a, son_b, son_var, bro_a, bro_b, bro_mu_down, bro_var_down, bro_var, bro_logrem_down, mean, var, logrem); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* DEPRECATED CODE BELOW */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IBM_Sample_Velocities_And_Locations(int *node_order, int n_nodes, t_tree *tree) { phydbl log_hr; int i,j,idx; RRW_Update_Normalization_Factor(tree); log_hr = 0.0; for(j=0;jmmod->n_dim;++i) { log_hr += IBM_Velocity_One_Node(tree->a_nodes[idx],YES,i,tree); log_hr += IBM_Location_One_Node(tree->a_nodes[idx],YES,i,tree); } } return(log_hr); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IBM_Velocities_Conditional(short int sample, int *node_order, short int dim, t_tree *tree) { int j,idx; phydbl log_hr; log_hr = 0.0; idx = -1; for(j=0;j<2*tree->n_otu-1;++j) { idx = (node_order != NULL) ? node_order[j] : j; log_hr += IBM_Velocity_One_Node(tree->a_nodes[idx],sample,dim,tree); } return(log_hr); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IBM_Velocity_One_Node(t_node *n, short int sample, short int dim, t_tree *tree) { /* w | | z / \ / \ u v The x's are the locations. The y's the velocities */ t_node *z,*u,*v; int k; phydbl mean,var,dt,zi; phydbl xu,xv,xz,xw; phydbl yu,yv,yw; phydbl tu,tv,tz; phydbl muu,muv,muz; phydbl sigsqu,sigsqv,sigsqz; phydbl log_hr; short int diru; int err; err = NO; mean = var = -1.; xu = xv = xz = xw = -1.; yu = yv = yw = -1.; tu = tv = tz = -1.; muu = muv = muz = -1.; sigsqu = sigsqv = sigsqz = -1.; diru = -1; log_hr = 0.0; z = n; u = v = NULL; /* for(dim=0;dimmmod->n_dim;++dim) */ { if(n->tax == NO && n != tree->n_root) /* Internal node that is not root node */ { xz = n->ldsk->coord->lonlat[dim]; diru = -1.; for(k=0;k<3;++k) { if(n->v[k] != n->anc && n->b[k] != tree->e_root) { if(diru < 0) { diru = k; u = n->v[k]; xu = n->v[k]->ldsk->coord->lonlat[dim]; yu = n->v[k]->ldsk->veloc->deriv[dim]; tu = fabs(tree->times->nd_t[n->v[k]->num] - tree->times->nd_t[n->num]); } else { v = n->v[k]; xv = n->v[k]->ldsk->coord->lonlat[dim]; yv = n->v[k]->ldsk->veloc->deriv[dim]; tv = fabs(tree->times->nd_t[n->v[k]->num] - tree->times->nd_t[n->num]); } } else if(n->v[k] == n->anc) { xw = n->v[k]->ldsk->coord->lonlat[dim]; yw = n->v[k]->ldsk->veloc->deriv[dim]; tz = fabs(tree->times->nd_t[n->v[k]->num] - tree->times->nd_t[n->num]); } else if(n->b[k] == tree->e_root) { xw = tree->n_root->ldsk->coord->lonlat[dim]; yw = tree->n_root->ldsk->veloc->deriv[dim]; tz = fabs(tree->times->nd_t[tree->n_root->num] - tree->times->nd_t[n->num]); } } assert(tu > 0.); assert(tv > 0.); assert(tz > 0.); muu = 3.*(xu-xz)/(2.*tu) - yu/2.; sigsqu = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[u->num]) + log(tree->mmod->sigsq_scale_norm_fact) + log(tu)- LOG4; sigsqu = exp(sigsqu); muv = 3.*(xv-xz)/(2.*tv) - yv/2.; sigsqv = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[v->num]) + log(tree->mmod->sigsq_scale_norm_fact) + log(tv)- LOG4; sigsqv = exp(sigsqv); muz = 3.*(xz-xw)/(2.*tz) - yw/2.; sigsqz = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[z->num]) + log(tree->mmod->sigsq_scale_norm_fact) + log(tz)- LOG4; sigsqz = exp(sigsqz); assert(sigsqu > 0.0); assert(sigsqv > 0.0); assert(sigsqz > 0.0); var = 1./sigsqu + 1./sigsqv + 1./sigsqz; var = 1./var; mean = (muu/sigsqu + muv/sigsqv + muz/sigsqz)*var; /* PhyML_Printf("\n. VIT Node %d xu: %f yu: %f tu: %f xv: %f yv: %f tv: %f -- muu: %f sigsqu: %f | muv: %f sigsqv: %f | mean: %f var: %f [sigsq: %f]", */ /* n->num, */ /* xu,yu,tu, */ /* xv,yv,tv, */ /* muu,sigsqu, */ /* muv,sigsqv, */ /* mean,var, */ /* tree->mmod->sigsq[dim]); */ assert(isinf(mean) == NO && isnan(mean) == NO); assert(isinf(var) == NO && isnan(var) == NO); } else if(n->tax == YES) /* Tip node */ { dt = fabs(tree->times->nd_t[n->anc->num]-tree->times->nd_t[n->num]); zi = n->ldsk->coord->lonlat[dim] - n->anc->ldsk->coord->lonlat[dim]; assert(dt > 0.0); mean = 0.5*(3.*zi/dt - n->anc->ldsk->veloc->deriv[dim]); var = log(dt) + log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[n->num]) + log(tree->mmod->sigsq_scale_norm_fact) - LOG4; var = exp(var); } else if(n == tree->n_root) /* Root node */ { xz = tree->n_root->ldsk->coord->lonlat[dim]; u = tree->n_root->v[1]; xu = tree->n_root->v[1]->ldsk->coord->lonlat[dim]; yu = tree->n_root->v[1]->ldsk->veloc->deriv[dim]; tu = fabs(tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]); v = tree->n_root->v[2]; xv = tree->n_root->v[2]->ldsk->coord->lonlat[dim]; yv = tree->n_root->v[2]->ldsk->veloc->deriv[dim]; tv = fabs(tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]); assert(tu > 0.0); muu = 3.*(xu-xz)/(2.*tu) - yu/2.; sigsqu = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[u->num]) + log(tree->mmod->sigsq_scale_norm_fact) + log(tu)- LOG4; sigsqu = exp(sigsqu); assert(tv > 0.0); muv = 3.*(xv-xz)/(2.*tv) - yv/2.; sigsqv = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[v->num]) + log(tree->mmod->sigsq_scale_norm_fact) + log(tv)- LOG4; sigsqv = exp(sigsqv); assert(sigsqu > 0.0); assert(sigsqv > 0.0); var = 1./sigsqu + 1./sigsqv; var = 1./var; mean = (muu/sigsqu + muv/sigsqv)*var; } if(tree->mmod->print_lk == YES) PhyML_Printf("\n. VIT %d Root xz: %f xu: %f yu: %f tu: %f xv: %f yv: %f tv: %f -- muu: %f sigsqu: %f | muv: %f sigsqv: %f | mean: %f var: %f", dim, xz, xu,yu,tu, xv,yv,tv, muu,sigsqu, muv,sigsqv, mean,var); assert(isinf(mean) == NO && isnan(mean) == NO); assert(isinf(var) == NO && isnan(var) == NO); /* !!!!!!!!!!!!!!!!!!!!1 */ /* log_hr += Log_Dnorm_Trunc(n->ldsk->veloc->deriv[dim],mean,sqrt(var),tree->mmod->min_veloc,tree->mmod->max_veloc,&err); */ /* if(sample == YES) */ /* { */ /* n->ldsk->veloc->deriv[dim] = Rnorm_Trunc(mean,sqrt(var),tree->mmod->min_veloc,tree->mmod->max_veloc,&err); */ /* if(err == YES) assert(false); */ /* } */ /* log_hr -= Log_Dnorm_Trunc(n->ldsk->veloc->deriv[dim],mean,sqrt(var),tree->mmod->min_veloc,tree->mmod->max_veloc,&err); */ log_hr += Log_Dnorm(n->ldsk->veloc->deriv[dim],mean,sqrt(var),&err); if(sample == YES) { n->ldsk->veloc->deriv[dim] = Rnorm(mean,sqrt(var)); if(n->ldsk->veloc->deriv[dim] > tree->mmod->max_veloc) { n->ldsk->veloc->deriv[dim] = tree->mmod->max_veloc; } if(n->ldsk->veloc->deriv[dim] < tree->mmod->min_veloc) { n->ldsk->veloc->deriv[dim] = tree->mmod->min_veloc; } } log_hr -= Log_Dnorm(n->ldsk->veloc->deriv[dim],mean,sqrt(var),&err); } return(log_hr); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IBM_Locations_Conditional(short int sample, int *node_order, short int dim, t_tree *tree) { int j,idx; phydbl log_hr; idx = -1; log_hr = 0.0; for(j=0;j<2*tree->n_otu-1;++j) { idx = (node_order != NULL) ? node_order[j] : j; log_hr += IBM_Location_One_Node(tree->a_nodes[idx],sample,dim,tree); } return(log_hr); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IBM_Location_One_Node(t_node *n, short int sample, short int dim, t_tree *tree) { t_node *z,*u,*v; int k; phydbl mean,var; phydbl xu,xv,xw; phydbl yu,yv,yz,yw; phydbl tu,tv,tz; phydbl muu,muv,muz; phydbl sigsqu,sigsqv,sigsqz; phydbl log_hr; short int diru,dirv; int err; /* w | | z / \ / \ u v The x's are the locations. The y's the velocities */ err = NO; mean = var = -1.; xu = xv = xw = -1.; yu = yv = yz = yw = -1.; tu = tv = tz = -1.; muu = muv = muz = -1.; sigsqu = sigsqv = sigsqz = -1.; diru = -1; log_hr = 0.0; z = n; u = v = NULL; /* Sample ancestral locations given locations at tips and velocities everywhere */ /* for(dim=0;dimmmod->n_dim;++dim) */ { if(n->tax == NO && n != tree->n_root) { yz = n->ldsk->veloc->deriv[dim]; diru = dirv = -1.; for(k=0;k<3;++k) { if(n->v[k] != n->anc && n->b[k] != tree->e_root) { if(diru < 0) { diru = k; u = n->v[k]; xu = n->v[k]->ldsk->coord->lonlat[dim]; yu = n->v[k]->ldsk->veloc->deriv[dim]; tu = fabs(tree->times->nd_t[n->v[k]->num] - tree->times->nd_t[n->num]); } else { dirv = k; v = n->v[k]; xv = n->v[k]->ldsk->coord->lonlat[dim]; yv = n->v[k]->ldsk->veloc->deriv[dim]; tv = fabs(tree->times->nd_t[n->v[k]->num] - tree->times->nd_t[n->num]); } } else if(n->v[k] == n->anc) { xw = n->v[k]->ldsk->coord->lonlat[dim]; yw = n->v[k]->ldsk->veloc->deriv[dim]; tz = fabs(tree->times->nd_t[n->v[k]->num] - tree->times->nd_t[n->num]); } else if(n->b[k] == tree->e_root) { xw = tree->n_root->ldsk->coord->lonlat[dim]; yw = tree->n_root->ldsk->veloc->deriv[dim]; tz = fabs(tree->times->nd_t[tree->n_root->num] - tree->times->nd_t[n->num]); } } assert(tu > 0.); assert(tv > 0.); assert(tz > 0.); muu = xu - (yu+yz)/2.*tu; sigsqu = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[u->num]) + log(tree->mmod->sigsq_scale_norm_fact) + 3.*log(tu)- LOG12; sigsqu = exp(sigsqu); muv = xv - (yv+yz)/2.*tv; sigsqv = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[v->num]) + log(tree->mmod->sigsq_scale_norm_fact) + 3.*log(tv)- LOG12; sigsqv = exp(sigsqv); muz = xw + (yw+yz)/2.*tz; sigsqz = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[z->num]) + log(tree->mmod->sigsq_scale_norm_fact) + 3.*log(tz)- LOG12; sigsqz = exp(sigsqz); assert(sigsqu > 0.0); assert(sigsqv > 0.0); assert(sigsqz > 0.0); var = 1./sigsqu + 1./sigsqv + 1./sigsqz; var = 1./var; mean = (muu/sigsqu + muv/sigsqv + muz/sigsqz)*var; if(tree->mmod->print_lk == YES) { PhyML_Printf("\n. LOC Node %d xu: %f yu: %f tu: %f xv: %f yv: %f tv: %f xw: %f yw: %f tz: %f -- muu: %f sigsqu: %f | muv: %f sigsqv: %f | muz: %f sigsqz: %f mean: %f var: %f [sigsq: %f] --> %f", n->num, xu,yu,tu, xv,yv,tv, xw,yw,tz, muu,sigsqu, muv,sigsqv, muz,sigsqz, mean,var, tree->mmod->sigsq[dim],tree->mmod->c_lnL); } /* PhyML_Printf(" %f --> %f",dum,n->ldsk->coord->lonlat[dim]); */ } else if(n == tree->n_root) /* Root node */ { yz = tree->n_root->ldsk->veloc->deriv[dim]; u = tree->n_root->v[1]; xu = tree->n_root->v[1]->ldsk->coord->lonlat[dim]; yu = tree->n_root->v[1]->ldsk->veloc->deriv[dim]; tu = fabs(tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]); v = tree->n_root->v[2]; xv = tree->n_root->v[2]->ldsk->coord->lonlat[dim]; yv = tree->n_root->v[2]->ldsk->veloc->deriv[dim]; tv = fabs(tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]); assert(tu > 0.0); muu = xu - (yu+yz)/2.*tu; sigsqu = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[u->num]) + log(tree->mmod->sigsq_scale_norm_fact) + 3.*log(tu)- LOG12; sigsqu = exp(sigsqu); muv = xv - (yv+yz)/2.*tv; sigsqv = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[v->num]) + log(tree->mmod->sigsq_scale_norm_fact) + 3.*log(tv)- LOG12; sigsqv = exp(sigsqv); assert(sigsqu > 0.0); assert(sigsqv > 0.0); var = 1./sigsqu + 1./sigsqv; var = 1./var; mean = (muu/sigsqu + muv/sigsqv)*var; } assert(isinf(mean) == NO && isnan(mean) == NO); assert(isinf(var) == NO && isnan(var) == NO); if(n->tax == NO) { log_hr += Log_Dnorm(n->ldsk->coord->lonlat[dim],mean,sqrt(var),&err); if(sample == YES) n->ldsk->coord->lonlat[dim] = Rnorm(mean,sqrt(var)); log_hr -= Log_Dnorm(n->ldsk->coord->lonlat[dim],mean,sqrt(var),&err); RRW_Update_Normalization_Factor(tree); } /* PhyML_Printf("\n. LOC yz: %f Root xu: %f yu: %f tu: %f xv: %f yv: %f tv: %f -- muu: %f sigsqu: %f | muv: %f sigsqv: %f | mean: %f var: %f --> %f", */ /* yz, */ /* xu,yu,tu, */ /* xv,yv,tv, */ /* muu,sigsqu, */ /* muv,sigsqv, */ /* mean,var, */ /* LOCATION_Lk(tree)); */ /* PhyML_Printf(" --> %f",tree->n_root->ldsk->coord->lonlat[dim]); */ } return(log_hr); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IBM_Augmented_Lk_Locations_Post(t_node *a, t_node *d, phydbl sigsq, int dim, t_tree *tree, short int print) { if(d->tax == TRUE) { return; } else { int i,start; t_node *v1, *v2; phydbl v1mu,v2mu; phydbl v1var,v2var; phydbl dv1var,dv2var; phydbl v1logrem,v2logrem; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { IBM_Augmented_Lk_Locations_Post(d,d->v[i],sigsq,dim,tree,print); } } v1 = v2 = NULL; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(v1 == NULL) v1 = d->v[i]; else v2 = d->v[i]; } } start = Contmod_Start(LOCATION,dim,tree); v1mu = tree->contmod->mu_down[start+v1->num]; v2mu = tree->contmod->mu_down[start+v2->num]; v1var = tree->contmod->var_down[start+v1->num]; v2var = tree->contmod->var_down[start+v2->num]; v1logrem = tree->contmod->logrem_down[start+v1->num]; v2logrem = tree->contmod->logrem_down[start+v2->num]; dv1var = log(sigsq) + log(tree->mmod->sigsq_scale[v1->num]) + -log(12.) + 3.*log(fabs(tree->times->nd_t[v1->num]-tree->times->nd_t[d->num])); dv1var = exp(dv1var); dv2var = log(sigsq) + log(tree->mmod->sigsq_scale[v2->num]) + -LOG12 + 3.*log(fabs(tree->times->nd_t[v2->num]-tree->times->nd_t[d->num])); dv2var = exp(dv2var); if(d == tree->n_root && print == YES) { PhyML_Printf("\n. v1mu=%f v2mu=%f v1var=%f dv1var=%f v2var=%f dv2var=%f t=%f t1=%f t2=%f", v1mu, v2mu, v1var,dv1var, v2var,dv2var, tree->times->nd_t[d->num], tree->times->nd_t[v1->num], tree->times->nd_t[v2->num]); } tree->contmod->mu_down[start+d->num] = (v1mu*(v2var+dv2var) + v2mu*(v1var+dv1var))/(v2var+dv2var+v1var+dv1var); tree->contmod->var_down[start+d->num] = (v2var+dv2var)*(v1var+dv1var)/(v2var+dv2var+v1var+dv1var); tree->contmod->logrem_down[start+d->num] = v1logrem + v2logrem; tree->contmod->logrem_down[start+d->num] -= .5*log(2.*PI*(v2var+dv2var+v1var+dv1var)); tree->contmod->logrem_down[start+d->num] -= .5*pow(v1mu-v2mu,2)/(v2var+dv2var+v1var+dv1var); } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IBM_Generate_Velocities_Then_Locations(t_tree *tree) { RRW_Update_Normalization_Factor(tree); IBM_Generate_Velocities(tree); IBM_Generate_Locations_Given_Velocities(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Generate velocities under a Brownian process. Locations are not known */ void IBM_Generate_Velocities(t_tree *tree) { IBM_Generate_Velocities_Pre(tree->n_root,tree->n_root->v[1],tree); IBM_Generate_Velocities_Pre(tree->n_root,tree->n_root->v[2],tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IBM_Generate_Velocities_Pre(t_node *a, t_node *d, t_tree *tree) { int i; phydbl mean,sd,dt; mean = sd = dt = -1.; if(a == tree->n_root) { for(i=0;immod->n_dim;++i) { a->ldsk->veloc->deriv[i] = Rnorm(0.0,1.); } } for(i=0;immod->n_dim;++i) { dt = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[a->num]); mean = a->ldsk->veloc->deriv[i]; sd = log(tree->mmod->sigsq[i]) + log(tree->mmod->sigsq_scale[i]) + log(tree->mmod->sigsq_scale_norm_fact) + log(dt); sd = exp(sd); sd = sqrt(sd); d->ldsk->veloc->deriv[i] = Rnorm(mean,sd); } if(d->tax == YES) return; else { for(i = 0; i<3; ++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { IBM_Generate_Velocities_Pre(d,d->v[i],tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IBM_Generate_Locations_Given_Velocities(t_tree *tree) { IBM_Generate_Locations_Given_Velocities_Pre(tree->n_root,tree->n_root->v[1],tree); IBM_Generate_Locations_Given_Velocities_Pre(tree->n_root,tree->n_root->v[2],tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IBM_Generate_Locations_Given_Velocities_Pre(t_node *a, t_node *d, t_tree *tree) { int i; phydbl mean,sd,dt; mean = sd = dt = -1.; if(a == tree->n_root) { for(i=0;immod->n_dim;++i) { a->ldsk->coord->lonlat[i] = Rnorm(0.0,1.0); } } for(i=0;immod->n_dim;++i) { dt = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[a->num]); mean = a->ldsk->coord->lonlat[i] + dt * (a->ldsk->veloc->deriv[i]+d->ldsk->veloc->deriv[i])/2.; sd = log(tree->mmod->sigsq[i]) + log(tree->mmod->sigsq_scale[i]) + log(tree->mmod->sigsq_scale_norm_fact) + 3.*log(dt) - LOG12; sd = exp(sd); sd = sqrt(sd); d->ldsk->coord->lonlat[i] = Rnorm(mean,sd); } if(d->tax == YES) return; else { for(i = 0; i<3; ++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { IBM_Generate_Locations_Given_Velocities_Pre(d,d->v[i],tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/ibm.h000066400000000000000000000046101501136442400201120ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef IBM_H #define IBM_H #include "utilities.h" short int IBM_Is_Ibm(t_phyrex_mod *mod); phydbl IBM_Sample_Velocities_And_Locations(int *node_order, int n_nodes, t_tree *tree); phydbl IBM_Velocities_Conditional(short int sample, int *node_order, short int dim, t_tree *tree); phydbl IBM_Velocity_One_Node(t_node *n, short int sample, short int dim, t_tree *tree); phydbl IBM_Locations_Conditional(short int sample, int *node_order, short int dim, t_tree *tree); phydbl IBM_Location_One_Node(t_node *n, short int sample, short int dim, t_tree *tree); void IBM_Augmented_Lk_Locations_Post(t_node *a, t_node *d, phydbl sigsq, int dim, t_tree *tree, short int print); void IBM_Generate_Velocities_Then_Locations(t_tree *tree); void IBM_Generate_Velocities(t_tree *tree); void IBM_Generate_Velocities_Pre(t_node *a, t_node *d, t_tree *tree); void IBM_Generate_Locations_Given_Velocities(t_tree *tree); void IBM_Generate_Locations_Given_Velocities_Pre(t_node *a, t_node *d, t_tree *tree); phydbl IBM_Velocity_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IBM_Velocity_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IBM_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IBM_Location_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IBM_Prior(t_tree *tree); void IBM_Integrated_Location_Down(phydbl son_a, phydbl son_b, phydbl son_mu_down, phydbl son_var_down, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl son_logrem, phydbl bro_logrem, phydbl *mean, phydbl *var, phydbl *logrem); void IBM_Integrated_Location_Up(phydbl dad_mu_up, phydbl dad_var_up, phydbl dad_logrem_up, phydbl son_a, phydbl son_b, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl bro_logrem_down, phydbl *mean, phydbl *var, phydbl *logrem); #endif stephaneguindon-phyml-76a39c8/src/init.c000066400000000000000000006143521501136442400203130ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "init.h" #ifdef BEAGLE #include "beagle_utils.h" #endif void Init_Eigen_Struct(eigen *this) { this->next = NULL; this->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Scalar_Dbl(scalar_dbl *p) { p->v = -1.; p->onoff = ON; p->optimize = NO; p->next = NULL; p->prev = NULL; p->print = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Scalar_Int(scalar_int *p) { p->v = -1.; p->optimize = NO; p->next = NULL; p->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Vect_Dbl(int len, vect_dbl *p) { p->len = len; p->optimize = NO; p->next = NULL; p->prev = NULL; p->v = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Vect_Int(int len, vect_int *p) { p->len = len; p->optimize = NO; p->next = NULL; p->prev = NULL; p->v = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_String(t_string *ts) { ts->len = -1.; ts->next = NULL; ts->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Efrq(phydbl *b_frq, t_efrq *f) { f->pi->optimize = NO; f->next = NULL; f->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tree(t_tree *tree, int n_otu) { tree->n_otu = n_otu; tree->mat = NULL; tree->n_root = NULL; tree->e_root = NULL; tree->ps_tree = NULL; tree->short_l = NULL; tree->mutmap = NULL; tree->next = NULL; tree->prev = NULL; tree->next = NULL; tree->prev = NULL; tree->mixt_tree = NULL; tree->geo = NULL; tree->xml_root = NULL; tree->aux_tree = NULL; tree->verbose = VL3; tree->edge_list = NULL; tree->node_list = NULL; tree->is_mixt_tree = NO; tree->tree_num = 0; tree->depth_curr_path = 0; tree->has_bip = NO; tree->n_moves = 0; tree->bl_from_node_stamps = 0; tree->lock_topo = NO; tree->ps_page_number = 0; tree->init_lnL = UNLIKELY; tree->best_lnL = UNLIKELY; tree->old_lnL = UNLIKELY; tree->c_lnL = UNLIKELY; tree->p_lnL = UNLIKELY; tree->sum_min_sum_scale = .0; tree->n_swap = 0; tree->best_pars = 1E+5; tree->n_root_pos = -1.; tree->print_labels = YES; tree->write_br_lens = YES; tree->num_curr_branch_available = 0; tree->tip_order_score = .0; tree->write_tax_names = YES; tree->update_alias_subpatt = NO; tree->bl_ndigits = 8; tree->n_short_l = 100; tree->norm_scale = 0.0; tree->br_len_recorded = NO; tree->apply_lk_scaling = YES; tree->dp = 0; tree->ignore_root = YES; tree->ignore_mixt_info = YES; tree->annealing_temp = 0.; tree->both_sides = NO; tree->json_num = 0; tree->update_eigen_lr = NO; tree->use_eigen_lr = NO; tree->eval_alnL = YES; tree->eval_rlnL = YES; tree->eval_glnL = YES; tree->eval_tlnL = YES; tree->scaling_method = SCALE_FAST; tree->perform_spr_right_away = YES; tree->tip_root = 0; tree->n_edges_traversed = 0; tree->fully_nni_opt = NO; tree->n_tot_bl_opt = 0; tree->numerical_warning = NO; #ifdef BEAGLE tree->b_inst = UNINITIALIZED; #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Edge_Light(t_edge *b, int num) { b->num = num; b->bip_score = 0; b->tdist_score = .0; b->dist_btw_edges = .0; b->topo_dist_btw_edges = 0; b->has_zero_br_len = NO; b->n_jumps = 0; b->l_var->v = -1.; b->does_exist = YES; b->l->v = -1.; b->bin_cod_num = -1.; b->l->onoff = ON; b->l->optimize = YES; b->next = NULL; b->prev = NULL; b->next_mixt = NULL; b->prev_mixt = NULL; b->p_lk_left = NULL; b->p_lk_rght = NULL; b->p_lk_loc_left = NULL; b->p_lk_loc_rght = NULL; b->Pij_rr = NULL; b->label = NULL; b->pars_l = NULL; b->pars_r = NULL; b->ui_l = NULL; b->ui_r = NULL; b->p_pars_l = NULL; b->p_pars_r = NULL; b->n_diff_states_l = NULL; b->n_diff_states_r = NULL; b->update_partial_lk_left = YES; b->update_partial_lk_rght = YES; #ifdef BEAGLE b->p_lk_left_idx = num; b->p_lk_rght_idx = UNINITIALIZED; // Will be initialized later when the total number of // branches is known (i.e. in Make_Tree_From_Scratch()) b->Pij_rr_idx = num; b->p_lk_tip_idx = UNINITIALIZED; // Will be initialized later only if this // branch is connected to a tip #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Node_Light(t_node *n, int num) { n->num = num; n->tax = -1; n->dist_to_root = .0; n->common = 1; n->ext_node = NULL; n->name = NULL; n->ori_name = NULL; n->c_seq = NULL; n->c_seq_anc = NULL; n->y_rank = 0.; n->y_rank_ori = 0.; n->y_rank_max = 0.; n->y_rank_min = 0.; n->anc = NULL; n->b_anc = NULL; n->rank = 0; n->match_node = NULL; n->id_rank = 0; n->next = NULL; n->prev = NULL; n->n_cal = 0; n->ldsk = NULL; n->rk_next = NULL; n->rk_prev = NULL; n->label = NULL; /* n->next = NULL; */ /* n->prev = NULL; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_NNI(t_nni *a_nni) { a_nni->left = NULL; a_nni->rght = NULL; a_nni->b = NULL; a_nni->init_l = NULL; a_nni->init_v = NULL; a_nni->init_lk = .0; a_nni->score = +1.0; a_nni->best_l = NULL; a_nni->best_v = NULL; a_nni->swap_node_v1 = NULL; a_nni->swap_node_v2 = NULL; a_nni->swap_node_v3 = NULL; a_nni->swap_node_v4 = NULL; a_nni->lk0 = UNLIKELY; a_nni->lk1 = UNLIKELY; a_nni->lk2 = UNLIKELY; a_nni->l0 = NULL; a_nni->l1 = NULL; a_nni->l2 = NULL; a_nni->v0 = NULL; a_nni->v1 = NULL; a_nni->v2 = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Nexus_Format(nexcom **com, FILE *fp) { /*****************************/ strcpy(com[0]->name, "dimensions"); com[0]->fp = fp; com[0]->nparm = 2; com[0]->nxt_token_t = NEXUS_PARM; com[0]->cur_token_t = NEXUS_COM; com[0]->parm[0] = Make_Nexus_Parm(); strcpy(com[0]->parm[0]->name, "ntax"); com[0]->parm[0]->fp = fp; com[0]->parm[0]->func = Read_Nexus_Dimensions; com[0]->parm[0]->com = com[0]; com[0]->parm[0]->nxt_token_t = NEXUS_EQUAL; com[0]->parm[0]->cur_token_t = NEXUS_PARM; com[0]->parm[1] = Make_Nexus_Parm(); strcpy(com[0]->parm[1]->name, "nchar"); com[0]->parm[1]->func = Read_Nexus_Dimensions; com[0]->parm[1]->com = com[0]; com[0]->parm[1]->nxt_token_t = NEXUS_EQUAL; com[0]->parm[1]->cur_token_t = NEXUS_PARM; /*****************************/ strcpy(com[1]->name, "format"); com[1]->fp = fp; com[1]->nparm = 11; com[1]->nxt_token_t = NEXUS_PARM; com[1]->cur_token_t = NEXUS_COM; com[1]->parm[0] = Make_Nexus_Parm(); strcpy(com[1]->parm[0]->name, "datatype"); com[1]->parm[0]->fp = fp; com[1]->parm[0]->func = Read_Nexus_Format; com[1]->parm[0]->com = com[1]; com[1]->parm[0]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[0]->cur_token_t = NEXUS_PARM; com[1]->parm[1] = Make_Nexus_Parm(); strcpy(com[1]->parm[1]->name, "respectcase"); com[1]->parm[1]->fp = fp; com[1]->parm[1]->func = Read_Nexus_Format; com[1]->parm[1]->com = com[1]; com[1]->parm[1]->nxt_token_t = NEXUS_PARM; com[1]->parm[1]->cur_token_t = NEXUS_VALUE; com[1]->parm[2] = Make_Nexus_Parm(); strcpy(com[1]->parm[2]->name, "missing"); com[1]->parm[2]->fp = fp; com[1]->parm[2]->func = Read_Nexus_Format; com[1]->parm[2]->com = com[1]; com[1]->parm[2]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[2]->cur_token_t = NEXUS_PARM; com[1]->parm[3] = Make_Nexus_Parm(); strcpy(com[1]->parm[3]->name, "gap"); com[1]->parm[3]->fp = fp; com[1]->parm[3]->func = Read_Nexus_Format; com[1]->parm[3]->com = com[1]; com[1]->parm[3]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[3]->cur_token_t = NEXUS_PARM; com[1]->parm[4] = Make_Nexus_Parm(); strcpy(com[1]->parm[4]->name, "symbols"); com[1]->parm[4]->fp = fp; com[1]->parm[4]->func = Read_Nexus_Format; com[1]->parm[4]->com = com[1]; com[1]->parm[4]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[4]->cur_token_t = NEXUS_PARM; com[1]->parm[5] = Make_Nexus_Parm(); strcpy(com[1]->parm[5]->name, "equate"); com[1]->parm[5]->fp = fp; com[1]->parm[5]->func = Read_Nexus_Format; com[1]->parm[5]->com = com[1]; com[1]->parm[5]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[5]->cur_token_t = NEXUS_PARM; com[1]->parm[6] = Make_Nexus_Parm(); strcpy(com[1]->parm[6]->name, "matchchar"); com[1]->parm[6]->fp = fp; com[1]->parm[6]->func = Read_Nexus_Format; com[1]->parm[6]->com = com[1]; com[1]->parm[6]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[6]->cur_token_t = NEXUS_PARM; com[1]->parm[7] = Make_Nexus_Parm(); strcpy(com[1]->parm[7]->name, "transpose"); com[1]->parm[7]->fp = fp; com[1]->parm[7]->func = Read_Nexus_Format; com[1]->parm[7]->com = com[1]; com[1]->parm[7]->nxt_token_t = NEXUS_PARM; com[1]->parm[7]->cur_token_t = NEXUS_VALUE; com[1]->parm[8] = Make_Nexus_Parm(); strcpy(com[1]->parm[8]->name, "interleave"); com[1]->parm[8]->fp = fp; com[1]->parm[8]->func = Read_Nexus_Format; com[1]->parm[8]->com = com[1]; com[1]->parm[8]->nxt_token_t = NEXUS_PARM; com[1]->parm[8]->cur_token_t = NEXUS_VALUE; com[1]->parm[9] = Make_Nexus_Parm(); strcpy(com[1]->parm[9]->name, "items"); com[1]->parm[9]->fp = fp; com[1]->parm[9]->func = Read_Nexus_Format; com[1]->parm[9]->com = com[1]; com[1]->parm[9]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[9]->cur_token_t = NEXUS_PARM; com[1]->parm[10] = Make_Nexus_Parm(); strcpy(com[1]->parm[10]->name, "statesformat"); com[1]->parm[10]->fp = fp; com[1]->parm[10]->func = Read_Nexus_Format; com[1]->parm[10]->com = com[1]; com[1]->parm[10]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[10]->cur_token_t = NEXUS_PARM; /*****************************/ strcpy(com[2]->name, "eliminate"); com[2]->fp = fp; com[2]->nparm = 0; com[2]->nxt_token_t = NEXUS_VALUE; com[2]->cur_token_t = NEXUS_COM; /*****************************/ strcpy(com[3]->name, "taxlabels"); com[3]->fp = fp; com[3]->nparm = 0; com[3]->nxt_token_t = -1; com[3]->cur_token_t = -1; /*****************************/ strcpy(com[4]->name, "charstatelabels"); com[4]->fp = fp; com[4]->nparm = 0; com[4]->nxt_token_t = -1; com[4]->cur_token_t = -1; /*****************************/ strcpy(com[5]->name, "charlabels"); com[5]->fp = fp; com[5]->nparm = 0; com[5]->nxt_token_t = -1; com[5]->cur_token_t = -1; /*****************************/ strcpy(com[6]->name, "statelabels"); com[6]->fp = fp; com[6]->nparm = 0; com[6]->nxt_token_t = -1; com[6]->cur_token_t = -1; /*****************************/ strcpy(com[7]->name, "matrix"); com[7]->fp = fp; com[7]->nparm = 1; com[7]->nxt_token_t = NEXUS_COM; com[7]->cur_token_t = NEXUS_VALUE; /* This will allow us to skip directly to the matrix reading function */ com[7]->parm[0] = Make_Nexus_Parm(); com[7]->parm[0]->fp = fp; strcpy(com[7]->parm[0]->name, "matrix"); com[7]->parm[0]->func = Read_Nexus_Matrix; com[7]->parm[0]->com = com[7]; com[7]->parm[0]->nxt_token_t = NEXUS_COM; com[7]->parm[0]->cur_token_t = -1; /*****************************/ strcpy(com[8]->name, "begin"); com[8]->fp = fp; com[8]->nparm = 3; com[8]->nxt_token_t = NEXUS_PARM; com[8]->cur_token_t = NEXUS_COM; com[8]->parm[0] = Make_Nexus_Parm(); strcpy(com[8]->parm[0]->name, "data"); com[8]->parm[0]->fp = fp; com[8]->parm[0]->func = Read_Nexus_Begin; com[8]->parm[0]->com = com[8]; com[8]->parm[0]->nxt_token_t = NEXUS_COM; com[8]->parm[0]->cur_token_t = NEXUS_PARM; com[8]->parm[1] = Make_Nexus_Parm(); strcpy(com[8]->parm[1]->name, "trees"); com[8]->parm[1]->fp = fp; com[8]->parm[1]->func = Read_Nexus_Begin; com[8]->parm[1]->com = com[8]; com[8]->parm[1]->nxt_token_t = NEXUS_COM; com[8]->parm[1]->cur_token_t = NEXUS_PARM; com[8]->parm[2] = Make_Nexus_Parm(); strcpy(com[8]->parm[2]->name, "taxa"); com[8]->parm[2]->fp = fp; com[8]->parm[2]->func = Read_Nexus_Taxa; com[8]->parm[2]->com = com[8]; com[8]->parm[2]->nxt_token_t = NEXUS_COM; com[8]->parm[2]->cur_token_t = NEXUS_VALUE; /*****************************/ strcpy(com[9]->name, "end"); com[9]->fp = fp; com[9]->nparm = 0; com[9]->nxt_token_t = -1; com[9]->cur_token_t = -1; /*****************************/ strcpy(com[10]->name, "translate"); com[10]->fp = fp; com[10]->nparm = 1; com[10]->nxt_token_t = NEXUS_COM; com[10]->cur_token_t = NEXUS_VALUE; com[10]->parm[0] = Make_Nexus_Parm(); strcpy(com[10]->parm[0]->name, "translate"); com[10]->parm[0]->fp = fp; com[10]->parm[0]->func = Read_Nexus_Translate; com[10]->parm[0]->com = com[10]; com[10]->parm[0]->nxt_token_t = NEXUS_COM; com[10]->parm[0]->cur_token_t = -1; /*****************************/ strcpy(com[11]->name, "tree"); com[11]->fp = fp; com[11]->nparm = 1; com[11]->nxt_token_t = NEXUS_COM; com[11]->cur_token_t = NEXUS_VALUE; com[11]->parm[0] = Make_Nexus_Parm(); strcpy(com[11]->parm[0]->name, "tree"); com[11]->parm[0]->fp = fp; com[11]->parm[0]->func = Read_Nexus_Tree; com[11]->parm[0]->com = com[11]; com[11]->parm[0]->nxt_token_t = -1; com[11]->parm[0]->cur_token_t = -1; /*****************************/ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Mat(matrix *mat, calign *data) { int i; mat->n_otu = data->n_otu; mat->r = mat->n_otu; mat->curr_int = mat->n_otu; mat->method = 1; for (i = 0; i < data->n_otu; i++) { strcpy(mat->name[i], data->c_seq[i]->name); mat->on_off[i] = 1; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Defaults_Input(option *io) { io->fp_in_align = NULL; io->fp_in_tree = NULL; io->fp_in_constraint_tree = NULL; io->fp_out_tree = NULL; io->fp_out_trees = NULL; io->fp_out_boot_tree = NULL; io->fp_out_boot_stats = NULL; io->fp_out_stats = NULL; io->fp_out_ancestral_seq = NULL; io->fp_out_ancestral_tree = NULL; io->fp_in_coord = NULL; io->fp_out_trace = NULL; io->fp_weight_file = NULL; io->fp_out_json_trace = NULL; io->fp_out_lk = NULL; io->fp_out_trace = NULL; io->long_tax_names = NULL; io->short_tax_names = NULL; io->lon = NULL; io->lat = NULL; io->z_scores = NULL; io->cstr_tree = NULL; io->next = NULL; io->prev = NULL; io->tree = NULL; io->mod = NULL; strcpy(io->nt_or_cd, "nucleotides"); io->tbe_bootstrap = NO; io->n_data_sets = 1; io->interleaved = 1; io->in_tree = 0; io->out_tree_file_open_mode = 1; io->out_stats_file_open_mode = 1; io->init_len = -1; io->n_otu = -1; io->n_data_set_asked = -1; io->print_boot_trees = 1; io->n_part = 1; io->ratio_test = ABAYES; io->multigene = 0; io->config_multigene = 0; io->curr_interface = 0; io->r_seed = -1; io->collapse_boot = 0; io->random_boot_seq_order = YES; io->print_trace = NO; io->print_json_trace = NO; io->print_site_lnl = NO; io->m4_model = NO; io->rm_ambigu = NO; io->append_run_ID = NO; io->quiet = NO; io->datatype = NT; io->colalias = YES; io->data_file_format = PHYLIP; io->tree_file_format = PHYLIP; io->boot_prog_every = 20; io->mem_question = YES; io->do_alias_subpatt = NO; io->lk_approx = EXACT; io->codpos = -1; io->mutmap = NO; io->state_len = 1; io->ancestral = NO; io->use_xml = NO; io->has_io_weights = NO; io->do_boot = NO; io->do_alrt = YES; io->do_tbe = NO; io->print_node_num = NO; io->print_support_val = NO; io->n_boot_replicates = 0; io->print_mat_and_exit = NO; io->edge_len_unit = SUBSTITUTIONS; #ifdef BEAGLE io->beagle_resource = 0; #endif io->precision = 0; MCMC_Init_MCMC_Struct(NULL, io, io->mcmc); RATES_Init_Rate_Struct(io->rates, NULL, -1); io->rates->model_id = LOGNORMAL; TIMES_Init_Time_Struct(io->times, NULL, -1); io->times->model_id = COALESCENT; io->times->coalescent_model_id = STRICTCOALESCENT; io->mcmc_output_times = NO; io->mcmc_output_trees = YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Rmat(t_rmat *rmat) { rmat->n_diff_rr = 1; rmat->optimize = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Defaults_Model(t_mod *mod) { Set_Defaults_Ras(mod->ras); strcpy(mod->modelname->s, "HKY85"); strcpy(mod->custom_mod_string->s, "000000"); mod->next = NULL; mod->prev = NULL; mod->next_mixt = NULL; mod->prev_mixt = NULL; mod->r_mat = NULL; mod->e_frq = NULL; mod->whichmodel = HKY85; mod->n_mixt_classes = 0; mod->mod_num = 0; mod->update_eigen = NO; mod->is_mixt_mod = NO; mod->kappa->v = 4.0; mod->kappa->optimize = YES; mod->lambda->v = 1.0; mod->lambda->optimize = YES; mod->l_var_sigma->v = 1.E-1; mod->l_var_sigma->optimize = YES; mod->e_frq_weight->v = 1.0; mod->e_frq_weight->optimize = YES; mod->r_mat_weight->v = 1.0; mod->r_mat_weight->optimize = YES; mod->ns = 4; mod->use_m4mod = NO; mod->ras->gamma_median = NO; mod->m4mod = NULL; mod->io = NULL; mod->log_l = NO; mod->gamma_mgf_bl = NO; mod->br_len_mult->v = 1.0; #if !(defined PHYTIME || defined PHYREX) mod->l_min = 1.E-8; mod->l_max = 100.0; #else mod->l_min = 1.E-8; mod->l_max = 1.E+3; #endif mod->l_var_min = mod->l_min; mod->l_var_max = mod->l_max; mod->br_len_mult->v = 1.0; mod->br_len_mult_unscaled->v = 1.0; mod->cv_type = KFOLD_COL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Defaults_Ras(t_ras *ras) { ras->n_catg = 4; ras->normalise_rr = YES; ras->pinvar->v = 0.0; ras->alpha->v = 1.0; ras->invar = NO; ras->free_mixt_rates = NO; ras->parent_class_number = 0; ras->init_r_proba = YES; ras->init_rr = YES; ras->sort_rate_classes = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Defaults_Optimiz(t_opt *s_opt) { s_opt->last_opt = YES; s_opt->opt_subst_param = YES; s_opt->opt_bl_one_by_one = YES; s_opt->init_lk = UNLIKELY; s_opt->n_it_max = 1000; s_opt->opt_topo = YES; s_opt->topo_search = NNI_MOVE; s_opt->random_input_tree = 0; s_opt->n_rand_starts = 5; s_opt->brent_it_max = BRENT_IT_MAX; s_opt->steph_spr = YES; s_opt->opt_br_len_mult = NO; s_opt->min_n_triple_moves = 20; s_opt->max_rank_triple_move = 0; s_opt->n_improvements = 0; s_opt->max_spr_depth = 0; s_opt->opt_clock_r = YES; s_opt->opt_node_ages = YES; s_opt->min_diff_lk_local = 1.E-03; s_opt->min_diff_lk_global = 1.E-03; s_opt->min_diff_lk_move = 1.E-03; s_opt->p_moves_to_examine = 0.15; s_opt->fast_nni = NO; s_opt->greedy = NO; s_opt->general_pars = NO; s_opt->tree_size_mult = 1; s_opt->opt_five_branch = YES; s_opt->nni_br_len_opt = YES; s_opt->pars_thresh = 5; s_opt->hybrid_thresh = NO; s_opt->quickdirty = NO; s_opt->spr_pars = YES; s_opt->spr_lnL = NO; s_opt->min_depth_path = 0; s_opt->eval_list_regraft = NO; s_opt->max_depth_path = 2000; s_opt->deepest_path = 2000; s_opt->max_delta_lnL_spr = 2000000.; s_opt->max_delta_lnL_spr_current = 0.0; s_opt->worst_lnL_spr = BIG; s_opt->br_len_in_spr = 10; s_opt->opt_free_mixt_rates = YES; s_opt->constrained_br_len = NO; s_opt->opt_gamma_br_len = YES; s_opt->first_opt_free_mixt_rates = YES; s_opt->wim_n_rgrft = -1; s_opt->wim_n_globl = -1; s_opt->wim_max_dist = -1; s_opt->wim_n_optim = -1; s_opt->wim_n_best = -1; s_opt->wim_inside_opt = 0; s_opt->opt_rmat_weight = NO; s_opt->opt_efrq_weight = NO; s_opt->skip_tree_traversal = NO; s_opt->serial_free_rates = YES; s_opt->curr_opt_free_rates = NO; s_opt->opt_neff = YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Init_Attribute(xml_attr *attr) {} ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Init_Node(xml_node *parent, xml_node *new_node, char *name) { if (name) strcpy(new_node->name, name); new_node->parent = parent ? parent : NULL; new_node->next = NULL; new_node->prev = NULL; new_node->child = NULL; new_node->ds->obj = NULL; new_node->ds->next = NULL; if (parent) { if (!parent->child) { parent->child = new_node; } else { xml_node *node = parent->child; while (node->next) node = node->next; node->next = new_node; new_node->prev = node; } } new_node->attr = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RATES_Init_Rate_Struct(t_rate *rates, t_rate *existing_rates, int n_otu) { int i; if (existing_rates && existing_rates->model_id != -1) { rates->model_id = existing_rates->model_id; } else { rates->model_id = NONE; } rates->met_within_gibbs = NO; rates->c_lnL = UNLIKELY; rates->p_lnL = UNLIKELY; rates->c_lnP = UNLIKELY; rates->p_lnP = UNLIKELY; rates->adjust_rates = 0; rates->use_rates = 1; rates->lexp = 1.E-3; rates->norm_fact = 1.0; rates->inflate_var = 1.0; rates->br_r_recorded = NO; /* Important to start from high subst. rate to ``reveal'' time structure */ /* Low rate, and thus old root, makes serially sampled data look like */ /* tips all have the same age. */ rates->clock_r = 1.E-1; rates->min_clock = 1.E-8; rates->max_clock = 1.E+2; rates->init_clock_r = NO; rates->clock_r_has_prior = NO; rates->clock_r_prior_mean = 1.0E-1; rates->clock_r_prior_var = 1.0E-8; /* rates->max_rate = 1.E+8; */ /* rates->min_rate = 1.E-2; */ rates->max_rate = 10.; rates->min_rate = 0.1; rates->nu = 0.1; rates->min_nu = 0.0; rates->max_nu = 3.0; rates->autocor_rate_prior = 1.0E+0; rates->min_dt = 0.0; rates->step_rate = 1.E-4; rates->approx = 1; rates->bl_from_rt = NO; rates->update_mean_l = NO; rates->update_cov_l = NO; rates->p_max = 0.01; if (n_otu > 0) { for (i = 0; i < (2 * n_otu - 2) * (2 * n_otu - 2); ++i) rates->cov_l[i] = 0.0; for (i = 0; i < 2 * n_otu - 2; ++i) { rates->mean_r[i] = 1.0; rates->mean_l[i] = 0.0; rates->cur_l[i] = 0.01; } for (i = 0; i < 2 * n_otu - 1; ++i) { rates->nd_r[i] = 1.0; rates->br_r[i] = 1.0; rates->br_do_updt[i] = YES; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Init_Time_Struct(t_time *times, t_time *existing_times, int n_otu) { if (existing_times && existing_times->model_id != -1) { times->model_id = existing_times->model_id; } else { times->model_id = COALESCENT; times->coalescent_model_id = STRICTCOALESCENT; } times->scaled_pop_size = 1.E+2; times->scaled_pop_size_min = 1.E-1; times->scaled_pop_size_max = 1.E+6; times->neff_prior_mean = 1.0; times->neff_prior_var = 1.0; times->neff_prior_distrib = FLAT_PRIOR; times->neff_growth = 1.E-10; times->neff_growth_min = -5.; times->neff_growth_max = +5.; times->c_lnL = UNLIKELY; times->p_lnL = UNLIKELY; times->c_lnP = UNLIKELY; times->p_lnP = UNLIKELY; times->c_lnL_jps = UNLIKELY; times->nd_t_recorded = NO; times->birth_rate = 1.E-1; times->birth_rate_min = 1.E-6; times->birth_rate_max = 1.E+0; times->birth_rate_pivot = 1.E-1; times->death_rate = 1.E-1; times->death_rate_min = 1.E-6; times->death_rate_min = 1.E+0; times->death_rate_pivot = 1.E-1; if (n_otu > 0) { for (int i = 0; i < 2 * n_otu - 2; ++i) { times->n_jps[i] = -1; times->t_jps[i] = -1; } for (int i = 0; i < 2 * n_otu - 1; ++i) { times->mean_t[i] = 0.0; times->nd_t[i] = 0.0; times->true_t[i] = 0.0; if (i < n_otu) { times->t_has_prior[i] = YES; times->t_prior_max[i] = 0.0; times->t_prior_min[i] = 0.0; } else { times->t_has_prior[i] = NO; times->t_prior_max[i] = 0.0; times->t_prior_min[i] = -BIG; } times->has_survived[i] = NO; times->t_rank[i] = i; } } times->update_time_norm_const = NO; times->is_asynchronous = NO; times->augmented_coalescent = NO; times->neff_prior_mean = 1.0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_One_Spr(t_spr *a_spr) { a_spr->lnL = UNLIKELY; a_spr->pars = 1E+5; a_spr->depth_path = 0; a_spr->dist = 0; a_spr->init_target_l = NULL; a_spr->init_target_v = NULL; a_spr->l0 = NULL; a_spr->l1 = NULL; a_spr->l2 = NULL; a_spr->v0 = NULL; a_spr->v1 = NULL; a_spr->v2 = NULL; a_spr->n_link = NULL; a_spr->n_opp_to_link = NULL; a_spr->b_opp_to_link = NULL; a_spr->b_target = NULL; a_spr->b_init_target = NULL; a_spr->next = NULL; a_spr->prev = NULL; a_spr->next = NULL; a_spr->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Target_Tip(t_clad *clade, t_tree *tree) { int i, j; for (i = 0; i < clade->n_tax; ++i) { for (j = 0; j < tree->n_otu; ++j) { if (!strcmp(tree->a_nodes[j]->name, clade->tax_list[i])) { clade->tip_list[i] = tree->a_nodes[j]; break; } } assert(j != tree->n_otu); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Model(calign *data, t_mod *mod, option *io) { int i, j; phydbl sum, aux; phydbl *dr, *di, *space; assert(data); assert(mod); assert(io); #ifdef BEAGLE mod->b_inst = UNINITIALIZED; // prevents calling an uninitialized BEAGLE // instance (for ex: prevents Update_Eigen(), // Update_RAS(), from calling BEAGLE) mod->optimizing_topology = false; #endif mod->ns = io->mod->ns; if (io->datatype == GENERIC) mod->whichmodel = JC69; dr = (phydbl *)mCalloc(mod->ns, sizeof(phydbl)); di = (phydbl *)mCalloc(mod->ns, sizeof(phydbl)); space = (phydbl *)mCalloc(2 * mod->ns, sizeof(phydbl)); if (mod->log_l == YES) { mod->l_min = log(mod->l_min); mod->l_max = log(mod->l_max); } // Init unscaled relative rate frequencies if (mod->ras->init_r_proba == YES) { /* for(i=0;iras->n_catg;i++) mod->ras->gamma_r_proba->v[i] = * (phydbl)1./mod->ras->n_catg; */ /* for(i=0;iras->n_catg;i++) mod->ras->gamma_r_proba_unscaled->v[i] = * (phydbl)(i+1); */ for (i = 0; i < mod->ras->n_catg; i++) mod->ras->gamma_r_proba_unscaled->v[i] = 1.0; } else { #ifndef PHYML mod->ras->gamma_r_proba_unscaled->v[mod->ras->n_catg - 1] = 1.0; for (i = 0; i < mod->ras->n_catg; i++) { sum = 0.0; for (j = 0; j < i + 1; ++j) sum += mod->ras->gamma_r_proba->v[j]; mod->ras->gamma_r_proba_unscaled->v[i] = sum * mod->ras->gamma_r_proba_unscaled->v[mod->ras->n_catg - 1]; } #endif #ifdef PHYML for (i = 0; i < mod->ras->n_catg; i++) { assert(mod->ras->gamma_r_proba->v[i] > 0.0); mod->ras->gamma_r_proba_unscaled->v[i] = log(mod->ras->gamma_r_proba->v[i]); } #endif } // Init unscaled relative rates if (mod->ras->init_rr == YES) { if (mod->ras->n_catg > 1) { /* for(i=0;iras->n_catg;i++) mod->ras->gamma_rr->v[i] = * (phydbl)i; */ /* for(i=0;iras->n_catg;i++) mod->ras->gamma_rr_unscaled->v[i] = * (phydbl)i; */ for (i = 0; i < mod->ras->n_catg; i++) mod->ras->gamma_rr_unscaled->v[i] = 1.0 + (phydbl)i / 10.; } else { mod->ras->gamma_rr->v[0] = 1.0; mod->ras->gamma_rr_unscaled->v[0] = 1.0; } } else { #ifndef PHYML for (i = 0; i < mod->ras->n_catg; i++) mod->ras->gamma_rr_unscaled->v[i] = mod->ras->gamma_rr->v[i]; #endif #ifdef PHYML for (i = 0; i < mod->ras->n_catg; i++) mod->ras->gamma_rr_unscaled->v[i] = log(mod->ras->gamma_rr->v[i]); #endif } if (io->datatype == NT) { /* Set the substitution parameters to their default values if they are not fixed by the user */ if (mod->kappa->optimize == YES) { mod->kappa->v = 4.0; mod->lambda->v = 1.0; } if (mod->whichmodel == CUSTOM) { for (i = 0; i < 6; i++) { mod->r_mat->rr_val->v[i] = log(1.0); /* mod->r_mat->rr_val->v[i] = exp(1.0); */ mod->r_mat->rr->v[i] = 1.0; } /* Condition below is true if custom model corresponds to TN93 or K80 */ if (mod->r_mat->rr_num->v[AC] == mod->r_mat->rr_num->v[AT] && mod->r_mat->rr_num->v[AT] == mod->r_mat->rr_num->v[CG] && mod->r_mat->rr_num->v[CG] == mod->r_mat->rr_num->v[GT] && mod->r_mat->rr_num->v[AG] != mod->r_mat->rr_num->v[AC] && mod->r_mat->rr_num->v[CT] != mod->r_mat->rr_num->v[AC]) { for (i = 1; i < mod->r_mat->n_diff_rr; i++) { mod->r_mat->rr_val->v[i] = log(2.0); /* mod->r_mat->rr_val->v[i] = exp(2.0); */ mod->r_mat->rr->v[i] = 2.0; } } else if (mod->r_mat->n_diff_rr == 6) /* Custom <-> GTR model */ { mod->r_mat->rr_val->v[AG] = log(2.0); mod->r_mat->rr_val->v[CT] = log(2.0); /* mod->r_mat->rr_val->v[AG] = exp(2.0); */ /* mod->r_mat->rr_val->v[CT] = exp(2.0); */ mod->r_mat->rr->v[AG] = 2.0; mod->r_mat->rr->v[CT] = 2.0; } } else if (mod->whichmodel == GTR) { if (mod->r_mat->optimize == YES) { for (i = 0; i < 6; i++) mod->r_mat->rr_val->v[i] = log(1.0); /* for(i=0;i<6;i++) mod->r_mat->rr_val->v[i] = exp(1.0); */ for (i = 0; i < 6; i++) mod->r_mat->rr->v[i] = 1.0; mod->r_mat->rr_val->v[AG] = log(2.0); mod->r_mat->rr_val->v[CT] = log(2.0); /* mod->r_mat->rr_val->v[AG] = exp(2.0); */ /* mod->r_mat->rr_val->v[CT] = exp(2.0); */ mod->r_mat->rr->v[AG] = 2.0; mod->r_mat->rr->v[CT] = 2.0; } } } if (mod->ras->alpha->optimize == YES) mod->ras->alpha->v = 1.0; if (mod->ras->pinvar->optimize == YES) mod->ras->pinvar->v = 0.2; if (io->datatype == NT) /* Nucleotides */ { /* init for nucleotides */ for (i = 0; i < mod->ns; i++) mod->e_frq->pi->v[i] = 1. / (phydbl)mod->ns; if (mod->whichmodel == JC69) { mod->e_frq->pi->v[0] = mod->e_frq->pi->v[1] = mod->e_frq->pi->v[2] = mod->e_frq->pi->v[3] = .25; mod->kappa->v = 1.; mod->e_frq->type = MODEL; mod->kappa->optimize = NO; mod->lambda->optimize = NO; } if (mod->whichmodel == K80) { mod->e_frq->pi->v[0] = mod->e_frq->pi->v[1] = mod->e_frq->pi->v[2] = mod->e_frq->pi->v[3] = .25; mod->e_frq->type = MODEL; mod->lambda->optimize = NO; } if (mod->whichmodel == F81) { if (mod->e_frq->type == EMPIRICAL || mod->e_frq->type == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq, data->obs_state_frq, mod->ns); else if (mod->e_frq->type == USER) for (i = 0; i < 4; i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; mod->kappa->v = 1.; } if (mod->whichmodel == F84) { if (mod->e_frq->type == EMPIRICAL || mod->e_frq->type == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq, data->obs_state_frq, mod->ns); else if (mod->e_frq->type == USER) for (i = 0; i < 4; i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; else { PhyML_Fprintf( stderr, "\n. The F84 model is not compatible with the '-f m' option (use " "'-f e' or '-f o' instead. See the documentation).\n"); assert(false); } aux = ((mod->e_frq->pi->v[0] + mod->e_frq->pi->v[2]) - (mod->e_frq->pi->v[1] + mod->e_frq->pi->v[3])) / (2. * mod->kappa->v); mod->lambda->v = ((mod->e_frq->pi->v[1] + mod->e_frq->pi->v[3]) + aux) / ((mod->e_frq->pi->v[0] + mod->e_frq->pi->v[2]) - aux); } if (mod->whichmodel == TN93) { if (mod->e_frq->type == EMPIRICAL || mod->e_frq->type == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq, data->obs_state_frq, mod->ns); else if (mod->e_frq->type == USER) for (i = 0; i < 4; i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; else { PhyML_Fprintf( stderr, "\n. The TN93 model is not compatible with the '-f m' option (use " "'-f e' or '-f o' instead. See the documentation).\n"); assert(false); } if (io->mod->kappa->optimize == YES) io->mod->lambda->optimize = YES; } if (mod->whichmodel == HKY85) { if (mod->e_frq->type == EMPIRICAL || mod->e_frq->type == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq, data->obs_state_frq, mod->ns); else if (mod->e_frq->type == USER) for (i = 0; i < 4; i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; else { PhyML_Fprintf( stderr, "\n. The HKY85 model is not compatible with the '-f m' option (use " "'-f e' or '-f o' instead. See the documentation).\n"); assert(false); } } if (mod->whichmodel == GTR) { if (mod->e_frq->type == EMPIRICAL || mod->e_frq->type == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq, data->obs_state_frq, mod->ns); else if (mod->e_frq->type == USER) for (i = 0; i < 4; i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; else { PhyML_Fprintf( stderr, "\n. The GTR model is not compatible with the '-f m' option (use " "'-f e' or '-f o' instead. See the documentation).\n"); assert(false); } mod->kappa->v = 1.; mod->custom_mod_string->s[0] = '0'; mod->custom_mod_string->s[1] = '1'; mod->custom_mod_string->s[2] = '2'; mod->custom_mod_string->s[3] = '3'; mod->custom_mod_string->s[4] = '4'; mod->custom_mod_string->s[5] = '5'; Translate_Custom_Mod_String(mod); } if (mod->whichmodel == CUSTOM) { if (mod->e_frq->type == EMPIRICAL) Init_Efrqs_Using_Observed_Freqs(mod->e_frq, data->obs_state_frq, mod->ns); else for (i = 0; i < 4; i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; mod->kappa->v = 1.; } for (i = 0; i < mod->ns; i++) mod->e_frq->pi_unscaled->v[i] = log(mod->e_frq->pi->v[i]); } else if (mod->io->datatype == AA) { /* init for amino-acids */ /* see comments of PMat_Empirical for details */ phydbl *qmat, *rr, *f; qmat = mod->r_mat->qmat->v; rr = mod->r_mat->rr_val->v; f = mod->e_frq->pi->v; for (i = 0; i < mod->ns * mod->ns; ++i) qmat[i] = .0; for (i = 0; i < mod->ns; ++i) f[i] = .0; switch (mod->whichmodel) { case DAYHOFF: { Init_Qmat_Dayhoff(qmat, f); break; } case JTT: { Init_Qmat_JTT(qmat, f); break; } case MTREV: { Init_Qmat_MtREV(qmat, f); break; } case LG: { Init_Qmat_LG(qmat, f); break; } case WAG: { Init_Qmat_WAG(qmat, f); break; } case DCMUT: { Init_Qmat_DCMut(qmat, f); break; } case RTREV: { Init_Qmat_RtREV(qmat, f); break; } case CPREV: { Init_Qmat_CpREV(qmat, f); break; } case VT: { Init_Qmat_VT(qmat, f); break; } case BLOSUM62: { Init_Qmat_Blosum62(qmat, f); break; } case MTMAM: { Init_Qmat_MtMam(qmat, f); break; } case MTART: { Init_Qmat_MtArt(qmat, f); break; } case HIVW: { Init_Qmat_HIVw(qmat, f); break; } case HIVB: { Init_Qmat_HIVb(qmat, f); break; } case AB: { Init_Qmat_AB(qmat, f); break; } case CUSTOMAA: { mod->fp_aa_rate_mat = Openfile(mod->aa_rate_mat_file->s, READ); Read_Qmat(qmat, f, mod->fp_aa_rate_mat); fclose(mod->fp_aa_rate_mat); break; } case FLU: { Init_Qmat_FLU(qmat, f); break; } default: { Init_Qmat_LG(qmat, f); break; } } for (i = 0; i < mod->ns; i++) for (j = i + 1; j < mod->ns; j++) rr[MIN(i, j) * mod->ns + MAX(i, j) - (MIN(i, j) + 1 + (int)POW(MIN(i, j) + 1, 2)) / 2] = qmat[i * mod->ns + j]; if (mod->e_frq->type == USER) for (i = 0; i < 20; i++) f[i] = mod->e_frq->user_b_freq->v[i]; else if (mod->e_frq->type == EMPIRICAL) Init_Efrqs_Using_Observed_Freqs(mod->e_frq, data->obs_state_frq, mod->ns); // Adjust equilibrium state frequencies if some of them are too close to // zero in order to avoid numerical precision issues. int iter = 0; do { for (i = 0; i < mod->ns; i++) if (mod->e_frq->pi->v[i] < E_FRQ_MIN) mod->e_frq->pi->v[i] = E_FRQ_MIN; sum = 0.0; for (i = 0; i < mod->ns; i++) sum += fabs(mod->e_frq->pi->v[i]); for (i = 0; i < mod->ns; i++) mod->e_frq->pi->v[i] /= sum; iter++; } while (iter < 10); for (i = 0; i < mod->ns; i++) mod->e_frq->pi_unscaled->v[i] = log(mod->e_frq->pi->v[i]); mod->mr->v = Update_Qmat_Generic(rr, f, mod->ns, qmat); } else if (mod->io->datatype == GENERIC) { /* Uniform state frequencies */ for (i = 0; i < mod->ns; i++) mod->e_frq->pi->v[i] = 1. / (phydbl)mod->ns; mod->kappa->v = 1; mod->e_frq->type = MODEL; mod->kappa->optimize = NO; mod->lambda->optimize = NO; for (i = 0; i < mod->ns * (mod->ns - 1) / 2; i++) mod->r_mat->rr_val->v[i] = log(1.0); /* for(i=0;ins*(mod->ns-1)/2;i++) mod->r_mat->rr_val->v[i] = exp(1.0); */ for (i = 0; i < mod->ns * (mod->ns - 1) / 2; i++) mod->r_mat->rr->v[i] = 1.0; } else { PhyML_Fprintf(stderr, "\n. Datatype not recognized.\n"); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } Init_Eigen_Struct(mod->eigen); mod->update_eigen = YES; Update_Eigen(mod); if (mod->is_mixt_mod == YES) MIXT_Init_Model(mod); free(dr); free(di); free(space); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Efrqs_Using_Observed_Freqs(t_efrq *f, phydbl *o, int ns) { int i; phydbl eps, sum; assert(f); assert(o); // To avoid numerical prevision issues eps = 1.E-50; for (i = 0; i < ns; i++) f->pi->v[i] = MAX(o[i], eps); sum = 0.0; for (i = 0; i < ns; i++) sum += f->pi->v[i]; for (i = 0; i < ns; i++) f->pi->v[i] /= sum; ; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Init_Qmat_Dayhoff(phydbl *daa, phydbl *pi) { /* Dayhoff's model data * Dayhoff, M.O., Schwartz, R.M., Orcutt, B.C. (1978) * "A model of evolutionary change in proteins." * Dayhoff, M.O.(ed.) Atlas of Protein Sequence Structur., Vol5, Suppl3. * National Biomedical Research Foundation, Washington DC, pp.345-352. */ int i, j, naa; naa = 20; /* PhyML_Printf("\n\n. REMINDER : THIS IS NOT DAYHOFF !!!\n\n"); */ /* daa[1*20 + 0] = 0.538903; */ /* daa[2*20 + 0] = 0.412504; */ /* daa[2*20 + 1] = 0.736081; */ /* daa[3*20 + 0] = 0.586915; */ /* daa[3*20 + 1] = 0.108051; */ /* daa[3*20 + 2] = 5.446642; */ /* daa[4*20 + 0] = 2.189718; */ /* daa[4*20 + 1] = 0.830604; */ /* daa[4*20 + 2] = 0.573426; */ /* daa[4*20 + 3] = 0.077565; */ /* daa[5*20 + 0] = 1.08213; */ /* daa[5*20 + 1] = 2.950693; */ /* daa[5*20 + 2] = 1.739514; */ /* daa[5*20 + 3] = 0.559035; */ /* daa[5*20 + 4] = 0.111314; */ /* daa[6*20 + 0] = 1.386865; */ /* daa[6*20 + 1] = 0.358434; */ /* daa[6*20 + 2] = 0.541447; */ /* daa[6*20 + 3] = 5.406871; */ /* daa[6*20 + 4] = 0.003738; */ /* daa[6*20 + 5] = 4.124043; */ /* daa[7*20 + 0] = 2.085747; */ /* daa[7*20 + 1] = 0.453132; */ /* daa[7*20 + 2] = 1.815844; */ /* daa[7*20 + 3] = 1.08647; */ /* daa[7*20 + 4] = 0.526418; */ /* daa[7*20 + 5] = 0.347693; */ /* daa[7*20 + 6] = 0.438476; */ /* daa[8*20 + 0] = 0.407898; */ /* daa[8*20 + 1] = 2.689322; */ /* daa[8*20 + 2] = 5.386808; */ /* daa[8*20 + 3] = 0.884563; */ /* daa[8*20 + 4] = 0.658583; */ /* daa[8*20 + 5] = 4.588358; */ /* daa[8*20 + 6] = 0.386218; */ /* daa[8*20 + 7] = 0.368668; */ /* daa[9*20 + 0] = 0.10177; */ /* daa[9*20 + 1] = 0.104875; */ /* daa[9*20 + 2] = 0.16239; */ /* daa[9*20 + 3] = 0.011698; */ /* daa[9*20 + 4] = 0.253282; */ /* daa[9*20 + 5] = 0.083872; */ /* daa[9*20 + 6] = 0.041767; */ /* daa[9*20 + 7] = 0.009778; */ /* daa[9*20 + 8] = 0.1042; */ /* daa[10*20 + 0] = 0.248202; */ /* daa[10*20 + 1] = 0.375742; */ /* daa[10*20 + 2] = 0.093863; */ /* daa[10*20 + 3] = 0.019241; */ /* daa[10*20 + 4] = 0.572688; */ /* daa[10*20 + 5] = 0.703538; */ /* daa[10*20 + 6] = 0.071961; */ /* daa[10*20 + 7] = 0.03006; */ /* daa[10*20 + 8] = 0.418222; */ /* daa[10*20 + 9] = 3.702051; */ /* daa[11*20 + 0] = 0.652019; */ /* daa[11*20 + 1] = 5.940478; */ /* daa[11*20 + 2] = 2.352253; */ /* daa[11*20 + 3] = 0.231001; */ /* daa[11*20 + 4] = 0.027995; */ /* daa[11*20 + 5] = 3.646743; */ /* daa[11*20 + 6] = 1.507981; */ /* daa[11*20 + 7] = 0.331175; */ /* daa[11*20 + 8] = 0.698362; */ /* daa[11*20 + 9] = 0.140326; */ /* daa[11*20 + 10] = 0.171396; */ /* daa[12*20 + 0] = 0.694226; */ /* daa[12*20 + 1] = 0.419899; */ /* daa[12*20 + 2] = 0.326927; */ /* daa[12*20 + 3] = 0.039488; */ /* daa[12*20 + 4] = 0.844827; */ /* daa[12*20 + 5] = 1.394214; */ /* daa[12*20 + 6] = 0.133235; */ /* daa[12*20 + 7] = 0.085075; */ /* daa[12*20 + 8] = 0.347092; */ /* daa[12*20 + 9] = 4.051255; */ /* daa[12*20 + 10] = 6.650794; */ /* daa[12*20 + 11] = 0.617549; */ /* daa[13*20 + 0] = 0.155206; */ /* daa[13*20 + 1] = 0.057971; */ /* daa[13*20 + 2] = 0.09816; */ /* daa[13*20 + 3] = 0.020441; */ /* daa[13*20 + 4] = 0.904305; */ /* daa[13*20 + 5] = 0.052719; */ /* daa[13*20 + 6] = 0.0219; */ /* daa[13*20 + 7] = 0.046668; */ /* daa[13*20 + 8] = 0.890005; */ /* daa[13*20 + 9] = 0.844963; */ /* daa[13*20 + 10] = 2.348881; */ /* daa[13*20 + 11] = 0.028372; */ /* daa[13*20 + 12] = 1.671635; */ /* daa[14*20 + 0] = 1.433475; */ /* daa[14*20 + 1] = 0.328393; */ /* daa[14*20 + 2] = 0.173181; */ /* daa[14*20 + 3] = 0.431874; */ /* daa[14*20 + 4] = 0.09902; */ /* daa[14*20 + 5] = 0.592324; */ /* daa[14*20 + 6] = 0.488352; */ /* daa[14*20 + 7] = 0.23865; */ /* daa[14*20 + 8] = 0.462856; */ /* daa[14*20 + 9] = 0.057048; */ /* daa[14*20 + 10] = 0.233532; */ /* daa[14*20 + 11] = 0.387808; */ /* daa[14*20 + 12] = 0.096377; */ /* daa[14*20 + 13] = 0.079912; */ /* daa[15*20 + 0] = 4.887126; */ /* daa[15*20 + 1] = 0.883923; */ /* daa[15*20 + 2] = 4.627163; */ /* daa[15*20 + 3] = 1.122164; */ /* daa[15*20 + 4] = 3.186667; */ /* daa[15*20 + 5] = 1.085947; */ /* daa[15*20 + 6] = 0.569339; */ /* daa[15*20 + 7] = 1.993432; */ /* daa[15*20 + 8] = 0.867972; */ /* daa[15*20 + 9] = 0.070512; */ /* daa[15*20 + 10] = 0.163009; */ /* daa[15*20 + 11] = 0.718913; */ /* daa[15*20 + 12] = 0.301103; */ /* daa[15*20 + 13] = 0.32579; */ /* daa[15*20 + 14] = 1.449582; */ /* daa[16*20 + 0] = 2.030538; */ /* daa[16*20 + 1] = 0.639463; */ /* daa[16*20 + 2] = 2.076294; */ /* daa[16*20 + 3] = 0.377239; */ /* daa[16*20 + 4] = 1.42848; */ /* daa[16*20 + 5] = 0.979403; */ /* daa[16*20 + 6] = 0.647562; */ /* daa[16*20 + 7] = 0.145556; */ /* daa[16*20 + 8] = 0.493329; */ /* daa[16*20 + 9] = 0.973405; */ /* daa[16*20 + 10] = 0.271824; */ /* daa[16*20 + 11] = 1.20033; */ /* daa[16*20 + 12] = 1.659187; */ /* daa[16*20 + 13] = 0.1217; */ /* daa[16*20 + 14] = 0.571399; */ /* daa[16*20 + 15] = 6.641034; */ /* daa[17*20 + 0] = 0.131405; */ /* daa[17*20 + 1] = 0.552911; */ /* daa[17*20 + 2] = 0.079985; */ /* daa[17*20 + 3] = 0.060514; */ /* daa[17*20 + 4] = 0.633662; */ /* daa[17*20 + 5] = 0.21823; */ /* daa[17*20 + 6] = 0.074988; */ /* daa[17*20 + 7] = 0.169114; */ /* daa[17*20 + 8] = 0.847725; */ /* daa[17*20 + 9] = 0.10627; */ /* daa[17*20 + 10] = 0.622044; */ /* daa[17*20 + 11] = 0.060755; */ /* daa[17*20 + 12] = 0.719575; */ /* daa[17*20 + 13] = 3.14824; */ /* daa[17*20 + 14] = 0.077123; */ /* daa[17*20 + 15] = 0.276716; */ /* daa[17*20 + 16] = 0.148883; */ /* daa[18*20 + 0] = 0.165179; */ /* daa[18*20 + 1] = 0.224883; */ /* daa[18*20 + 2] = 0.528334; */ /* daa[18*20 + 3] = 0.121252; */ /* daa[18*20 + 4] = 1.174118; */ /* daa[18*20 + 5] = 0.177062; */ /* daa[18*20 + 6] = 0.074715; */ /* daa[18*20 + 7] = 0.042356; */ /* daa[18*20 + 8] = 5.911187; */ /* daa[18*20 + 9] = 0.192481; */ /* daa[18*20 + 10] = 0.321454; */ /* daa[18*20 + 11] = 0.090556; */ /* daa[18*20 + 12] = 0.406415; */ /* daa[18*20 + 13] = 10.908861; */ /* daa[18*20 + 14] = 0.070752; */ /* daa[18*20 + 15] = 0.328483; */ /* daa[18*20 + 16] = 0.181539; */ /* daa[18*20 + 17] = 3.823886; */ /* daa[19*20 + 0] = 1.78517; */ /* daa[19*20 + 1] = 0.166975; */ /* daa[19*20 + 2] = 0.106482; */ /* daa[19*20 + 3] = 0.041707; */ /* daa[19*20 + 4] = 1.876812; */ /* daa[19*20 + 5] = 0.22421; */ /* daa[19*20 + 6] = 0.247356; */ /* daa[19*20 + 7] = 0.06688; */ /* daa[19*20 + 8] = 0.1436; */ /* daa[19*20 + 9] = 9.60184; */ /* daa[19*20 + 10] = 1.599119; */ /* daa[19*20 + 11] = 0.17319; */ /* daa[19*20 + 12] = 1.645134; */ /* daa[19*20 + 13] = 0.438571; */ /* daa[19*20 + 14] = 0.252486; */ /* daa[19*20 + 15] = 0.105536; */ /* daa[19*20 + 16] = 1.789097; */ /* daa[19*20 + 17] = 0.147951; */ /* daa[19*20 + 18] = 0.200571; */ /* for (i=0; i 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 (the great and helpful) 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. If you would like the data related to this matrix, please contact fabascal@uvigo.es. Federico Abascal (c)2005. */ int i, j, naa; naa = 20; daa[1 * 20 + 0] = 0.2; daa[2 * 20 + 0] = 0.2; daa[2 * 20 + 1] = 0.2; daa[3 * 20 + 0] = 0.6; daa[3 * 20 + 1] = 4.3; daa[3 * 20 + 2] = 500.2; daa[4 * 20 + 0] = 253.5; daa[4 * 20 + 1] = 35.5; daa[4 * 20 + 2] = 98.2; daa[4 * 20 + 3] = 10.6; daa[5 * 20 + 0] = 0.2; daa[5 * 20 + 1] = 154.0; daa[5 * 20 + 2] = 261.8; daa[5 * 20 + 3] = 0.2; daa[5 * 20 + 4] = 0.2; daa[6 * 20 + 0] = 0.2; daa[6 * 20 + 1] = 0.2; daa[6 * 20 + 2] = 183.0; daa[6 * 20 + 3] = 861.8; daa[6 * 20 + 4] = 0.2; daa[6 * 20 + 5] = 261.6; daa[7 * 20 + 0] = 199.8; daa[7 * 20 + 1] = 0.2; daa[7 * 20 + 2] = 120.5; daa[7 * 20 + 3] = 12.5; daa[7 * 20 + 4] = 80.5; daa[7 * 20 + 5] = 2.6; daa[7 * 20 + 6] = 43.9; daa[8 * 20 + 0] = 0.2; daa[8 * 20 + 1] = 41.3; daa[8 * 20 + 2] = 179.5; daa[8 * 20 + 3] = 0.2; daa[8 * 20 + 4] = 12.4; daa[8 * 20 + 5] = 313.5; daa[8 * 20 + 6] = 15.2; daa[8 * 20 + 7] = 0.2; daa[9 * 20 + 0] = 25.7; daa[9 * 20 + 1] = 1.8; daa[9 * 20 + 2] = 21.3; daa[9 * 20 + 3] = 6.6; daa[9 * 20 + 4] = 63.0; daa[9 * 20 + 5] = 10.5; daa[9 * 20 + 6] = 6.8; daa[9 * 20 + 7] = 2.7; daa[9 * 20 + 8] = 0.2; daa[10 * 20 + 0] = 3.7; daa[10 * 20 + 1] = 1.8; daa[10 * 20 + 2] = 12.6; daa[10 * 20 + 3] = 1.2; daa[10 * 20 + 4] = 78.7; daa[10 * 20 + 5] = 16.3; daa[10 * 20 + 6] = 1.7; daa[10 * 20 + 7] = 1.4; daa[10 * 20 + 8] = 5.5; daa[10 * 20 + 9] = 514.5; daa[11 * 20 + 0] = 0.2; daa[11 * 20 + 1] = 208.6; daa[11 * 20 + 2] = 467.3; daa[11 * 20 + 3] = 1.7; daa[11 * 20 + 4] = 0.2; daa[11 * 20 + 5] = 349.3; daa[11 * 20 + 6] = 106.3; daa[11 * 20 + 7] = 0.2; daa[11 * 20 + 8] = 0.2; daa[11 * 20 + 9] = 3.5; daa[11 * 20 + 10] = 3.8; daa[12 * 20 + 0] = 120.6; daa[12 * 20 + 1] = 5.2; daa[12 * 20 + 2] = 78.8; daa[12 * 20 + 3] = 0.2; daa[12 * 20 + 4] = 312.3; daa[12 * 20 + 5] = 67.3; daa[12 * 20 + 6] = 0.2; daa[12 * 20 + 7] = 55.7; daa[12 * 20 + 8] = 0.2; daa[12 * 20 + 9] = 514.8; daa[12 * 20 + 10] = 885.5; daa[12 * 20 + 11] = 105.6; daa[13 * 20 + 0] = 13.1; daa[13 * 20 + 1] = 4.7; daa[13 * 20 + 2] = 19.7; daa[13 * 20 + 3] = 0.2; daa[13 * 20 + 4] = 184.1; daa[13 * 20 + 5] = 0.2; daa[13 * 20 + 6] = 0.2; daa[13 * 20 + 7] = 0.8; daa[13 * 20 + 8] = 13.8; daa[13 * 20 + 9] = 117.9; daa[13 * 20 + 10] = 262.6; daa[13 * 20 + 11] = 10.7; daa[13 * 20 + 12] = 321.6; daa[14 * 20 + 0] = 49.3; daa[14 * 20 + 1] = 0.2; daa[14 * 20 + 2] = 16.5; daa[14 * 20 + 3] = 0.2; daa[14 * 20 + 4] = 0.2; daa[14 * 20 + 5] = 39.3; daa[14 * 20 + 6] = 7.9; daa[14 * 20 + 7] = 0.2; daa[14 * 20 + 8] = 0.8; daa[14 * 20 + 9] = 0.2; daa[14 * 20 + 10] = 12.2; daa[14 * 20 + 11] = 16.8; daa[14 * 20 + 12] = 5.3; daa[14 * 20 + 13] = 14.6; daa[15 * 20 + 0] = 673.0; daa[15 * 20 + 1] = 2.7; daa[15 * 20 + 2] = 398.4; daa[15 * 20 + 3] = 44.4; daa[15 * 20 + 4] = 664.2; daa[15 * 20 + 5] = 52.4; daa[15 * 20 + 6] = 31.5; daa[15 * 20 + 7] = 226.0; daa[15 * 20 + 8] = 10.6; daa[15 * 20 + 9] = 7.2; daa[15 * 20 + 10] = 8.2; daa[15 * 20 + 11] = 144.2; daa[15 * 20 + 12] = 111.7; daa[15 * 20 + 13] = 36.1; daa[15 * 20 + 14] = 86.5; daa[16 * 20 + 0] = 243.9; daa[16 * 20 + 1] = 0.2; daa[16 * 20 + 2] = 165.9; daa[16 * 20 + 3] = 0.2; daa[16 * 20 + 4] = 182.8; daa[16 * 20 + 5] = 43.7; daa[16 * 20 + 6] = 43.4; daa[16 * 20 + 7] = 0.2; daa[16 * 20 + 8] = 18.6; daa[16 * 20 + 9] = 203.7; daa[16 * 20 + 10] = 47.8; daa[16 * 20 + 11] = 69.5; daa[16 * 20 + 12] = 288.6; daa[16 * 20 + 13] = 13.5; daa[16 * 20 + 14] = 46.8; daa[16 * 20 + 15] = 660.4; daa[17 * 20 + 0] = 0.2; daa[17 * 20 + 1] = 0.2; daa[17 * 20 + 2] = 7.7; daa[17 * 20 + 3] = 0.2; daa[17 * 20 + 4] = 21.6; daa[17 * 20 + 5] = 6.7; daa[17 * 20 + 6] = 11.0; daa[17 * 20 + 7] = 1.9; daa[17 * 20 + 8] = 0.2; daa[17 * 20 + 9] = 0.2; daa[17 * 20 + 10] = 21.1; daa[17 * 20 + 11] = 16.0; daa[17 * 20 + 12] = 70.7; daa[17 * 20 + 13] = 53.7; daa[17 * 20 + 14] = 0.2; daa[17 * 20 + 15] = 2.4; daa[17 * 20 + 16] = 0.2; daa[18 * 20 + 0] = 1.2; daa[18 * 20 + 1] = 3.9; daa[18 * 20 + 2] = 251.2; daa[18 * 20 + 3] = 0.2; daa[18 * 20 + 4] = 72.0; daa[18 * 20 + 5] = 86.7; daa[18 * 20 + 6] = 7.7; daa[18 * 20 + 7] = 8.6; daa[18 * 20 + 8] = 191.4; daa[18 * 20 + 9] = 12.3; daa[18 * 20 + 10] = 19.8; daa[18 * 20 + 11] = 117.1; daa[18 * 20 + 12] = 70.9; daa[18 * 20 + 13] = 791.6; daa[18 * 20 + 14] = 18.4; daa[18 * 20 + 15] = 30.5; daa[18 * 20 + 16] = 46.0; daa[18 * 20 + 17] = 37.7; daa[19 * 20 + 0] = 339.9; daa[19 * 20 + 1] = 0.2; daa[19 * 20 + 2] = 22.6; daa[19 * 20 + 3] = 0.2; daa[19 * 20 + 4] = 350.4; daa[19 * 20 + 5] = 0.2; daa[19 * 20 + 6] = 13.6; daa[19 * 20 + 7] = 2.6; daa[19 * 20 + 8] = 0.2; daa[19 * 20 + 9] = 1854.5; daa[19 * 20 + 10] = 84.7; daa[19 * 20 + 11] = 26.1; daa[19 * 20 + 12] = 281.3; daa[19 * 20 + 13] = 51.9; daa[19 * 20 + 14] = 31.7; daa[19 * 20 + 15] = 60.6; daa[19 * 20 + 16] = 544.1; daa[19 * 20 + 17] = 0.2; daa[19 * 20 + 18] = 1.6; /* MtArt.old: esta es la MtArt que hice con 26 secuencias (2 outgroups) con una topologia incorrecta daa[1*20+ 0] = 0.2; daa[2*20+ 0] = 0.2; daa[2*20+ 1] = 8.0; daa[3*20+ 0] = 0.2; daa[3*20+ 1] = 0.2; daa[3*20+ 2] = 441.7; daa[4*20+ 0] = 287.9; daa[4*20+ 1] = 48.4; daa[4*20+ 2] = 82.4; daa[4*20+ 3] = 0.2; daa[5*20+ 0] = 0.2; daa[5*20+ 1] = 149.9; daa[5*20+ 2] = 278.6; daa[5*20+ 3] = 0.2; daa[5*20+ 4] = 21.7; daa[6*20+ 0] = 6.6; daa[6*20+ 1] = 0.2; daa[6*20+ 2] = 213.9; daa[6*20+ 3] = 760.8; daa[6*20+ 4] = 0.2; daa[6*20+ 5] = 292.9; daa[7*20+ 0] = 228.2; daa[7*20+ 1] = 0.2; daa[7*20+ 2] = 97.1; daa[7*20+ 3] = 10.4; daa[7*20+ 4] = 98.4; daa[7*20+ 5] = 4.0; daa[7*20+ 6] = 48.7; daa[8*20+ 0] = 0.2; daa[8*20+ 1] = 56.7; daa[8*20+ 2] = 156.4; daa[8*20+ 3] = 24.5; daa[8*20+ 4] = 15.5; daa[8*20+ 5] = 328.6; daa[8*20+ 6] = 7.0; daa[8*20+ 7] = 8.4; daa[9*20+ 0] = 26.4; daa[9*20+ 1] = 1.6; daa[9*20+ 2] = 40.1; daa[9*20+ 3] = 0.2; daa[9*20+ 4] = 22.1; daa[9*20+ 5] = 13.8; daa[9*20+ 6] = 0.2; daa[9*20+ 7] = 3.6; daa[9*20+ 8] = 0.2; daa[10*20+ 0] = 3.4; daa[10*20+ 1] = 0.6; daa[10*20+ 2] = 13.8; daa[10*20+ 3] = 0.7; daa[10*20+ 4] = 76.9; daa[10*20+ 5] = 12.1; daa[10*20+ 6] = 5.4; daa[10*20+ 7] = 2.5; daa[10*20+ 8] = 2.9; daa[10*20+ 9] = 542.6; daa[11*20+ 0] = 0.2; daa[11*20+ 1] = 240.2; daa[11*20+ 2] = 602.8; daa[11*20+ 3] = 35.5; daa[11*20+ 4] = 0.2; daa[11*20+ 5] = 357.6; daa[11*20+ 6] = 62.6; daa[11*20+ 7] = 0.2; daa[11*20+ 8] = 3.3; daa[11*20+ 9] = 0.2; daa[11*20+ 10] = 17.5; daa[12*20+ 0] = 119.0; daa[12*20+ 1] = 0.2; daa[12*20+ 2] = 91.4; daa[12*20+ 3] = 6.4; daa[12*20+ 4] = 332.3; daa[12*20+ 5] = 65.4; daa[12*20+ 6] = 0.2; daa[12*20+ 7] = 60.4; daa[12*20+ 8] = 2.4; daa[12*20+ 9] = 492.5; daa[12*20+ 10] = 815.8; daa[12*20+ 11] = 67.3; daa[13*20+ 0] = 8.2; daa[13*20+ 1] = 6.4; daa[13*20+ 2] = 31.5; daa[13*20+ 3] = 3.4; daa[13*20+ 4] = 174.4; daa[13*20+ 5] = 5.7; daa[13*20+ 6] = 5.7; daa[13*20+ 7] = 2.1; daa[13*20+ 8] = 11.0; daa[13*20+ 9] = 94.4; daa[13*20+ 10] = 243.3; daa[13*20+ 11] = 12.3; daa[13*20+ 12] = 357.8; daa[14*20+ 0] = 62.5; daa[14*20+ 1] = 0.4; daa[14*20+ 2] = 17.5; daa[14*20+ 3] = 0.2; daa[14*20+ 4] = 0.2; daa[14*20+ 5] = 48.6; daa[14*20+ 6] = 17.7; daa[14*20+ 7] = 2.7; daa[14*20+ 8] = 0.2; daa[14*20+ 9] = 0.2; daa[14*20+ 10] = 11.2; daa[14*20+ 11] = 21.7; daa[14*20+ 12] = 5.2; daa[14*20+ 13] = 12.6; daa[15*20+ 0] = 659.0; daa[15*20+ 1] = 5.2; daa[15*20+ 2] = 469.8; daa[15*20+ 3] = 52.3; daa[15*20+ 4] = 570.7; daa[15*20+ 5] = 47.8; daa[15*20+ 6] = 37.3; daa[15*20+ 7] = 227.8; daa[15*20+ 8] = 12.7; daa[15*20+ 9] = 12.3; daa[15*20+ 10] = 7.4; daa[15*20+ 11] = 189.0; daa[15*20+ 12] = 155.3; daa[15*20+ 13] = 43.8; daa[15*20+ 14] = 103.4; daa[16*20+ 0] = 276.4; daa[16*20+ 1] = 1.6; daa[16*20+ 2] = 175.6; daa[16*20+ 3] = 0.2; daa[16*20+ 4] = 96.2; daa[16*20+ 5] = 71.4; daa[16*20+ 6] = 37.4; daa[16*20+ 7] = 0.2; daa[16*20+ 8] = 14.2; daa[16*20+ 9] = 212.5; daa[16*20+ 10] = 38.5; daa[16*20+ 11] = 97.4; daa[16*20+ 12] = 254.7; daa[16*20+ 13] = 2.1; daa[16*20+ 14] = 41.6; daa[16*20+ 15] = 670.6; daa[17*20+ 0] = 6.2; daa[17*20+ 1] = 0.2; daa[17*20+ 2] = 0.2; daa[17*20+ 3] = 5.6; daa[17*20+ 4] = 0.2; daa[17*20+ 5] = 0.2; daa[17*20+ 6] = 3.1; daa[17*20+ 7] = 0.4; daa[17*20+ 8] = 0.2; daa[17*20+ 9] = 15.2; daa[17*20+ 10] = 11.5; daa[17*20+ 11] = 32.6; daa[17*20+ 12] = 82.4; daa[17*20+ 13] = 81.9; daa[17*20+ 14] = 0.2; daa[17*20+ 15] = 9.7; daa[17*20+ 16] = 0.2; daa[18*20+ 0] = 1.6; daa[18*20+ 1] = 7.7; daa[18*20+ 2] = 242.5; daa[18*20+ 3] = 0.2; daa[18*20+ 4] = 88.0; daa[18*20+ 5] = 93.1; daa[18*20+ 6] = 0.2; daa[18*20+ 7] = 6.0; daa[18*20+ 8] = 113.7; daa[18*20+ 9] = 22.1; daa[18*20+ 10] = 17.2; daa[18*20+ 11] = 138.5; daa[18*20+ 12] = 37.6; daa[18*20+ 13] = 770.2; daa[18*20+ 14] = 5.3; daa[18*20+ 15] = 25.0; daa[18*20+ 16] = 55.5; daa[18*20+ 17] = 69.3; daa[19*20+ 0] = 307.8; daa[19*20+ 1] = 2.2; daa[19*20+ 2] = 6.9; daa[19*20+ 3] = 0.2; daa[19*20+ 4] = 405.7; daa[19*20+ 5] = 0.8; daa[19*20+ 6] = 20.2; daa[19*20+ 7] = 5.7; daa[19*20+ 8] = 0.2; daa[19*20+ 9] = 1687.9; daa[19*20+ 10] = 49.4; daa[19*20+ 11] = 23.4; daa[19*20+ 12] = 329.9; daa[19*20+ 13] = 86.3; daa[19*20+ 14] = 27.3; daa[19*20+ 15] = 95.0; daa[19*20+ 16] = 443.0; daa[19*20+ 17] = 2.4; daa[19*20+ 18] = 0.2; 3*/ for (i = 0; i < naa; i++) for (j = 0; j < i; j++) daa[j * naa + i] = daa[i * naa + j]; pi[0] = 0.054116; pi[1] = 0.018227; pi[2] = 0.039903; pi[3] = 0.020160; pi[4] = 0.009709; pi[5] = 0.018781; pi[6] = 0.024289; pi[7] = 0.068183; pi[8] = 0.024518; pi[9] = 0.092639; pi[10] = 0.148658; pi[11] = 0.021718; pi[12] = 0.061453; pi[13] = 0.088668; pi[14] = 0.041826; pi[15] = 0.091030; pi[16] = 0.049194; pi[17] = 0.029786; pi[18] = 0.039443; pi[19] = 0.057701; /* pi[0] = 0.055505; pi[1] = 0.018320; pi[2] = 0.036614; pi[3] = 0.019517; pi[4] = 0.009878; pi[5] = 0.018732; pi[6] = 0.021591; pi[7] = 0.068414; pi[8] = 0.023638; pi[9] = 0.092558; pi[10] = 0.154697; pi[11] = 0.020168; pi[12] = 0.062033; pi[13] = 0.089433; pi[14] = 0.040642; pi[15] = 0.090298; pi[16] = 0.050134; pi[17] = 0.027693; pi[18] = 0.038448; pi[19] = 0.061687; */ return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Init_Qmat_HIVb(phydbl *daa, phydbl *pi) // added by FEDE { /* Nickle DC, Heath L, Jensen MA, Gilbert PB, Mullins JI, Kosakovsky Pond SL. HIV-Specific Probabilistic Models of Protein Evolution. PLoS ONE. 2007 Jun 6;2:e503. [thanks to Sergei L. Kosakovsky] Translated from HYPHY to Phyml format by Federico Abascal. */ int i, j, naa; naa = 20; daa[1 * 20 + 0] = 0.307507; daa[2 * 20 + 0] = 0.005; daa[2 * 20 + 1] = 0.295543; daa[3 * 20 + 0] = 1.45504; daa[3 * 20 + 1] = 0.005; daa[3 * 20 + 2] = 17.6612; daa[4 * 20 + 0] = 0.123758; daa[4 * 20 + 1] = 0.351721; daa[4 * 20 + 2] = 0.0860642; daa[4 * 20 + 3] = 0.005; daa[5 * 20 + 0] = 0.0551128; daa[5 * 20 + 1] = 3.4215; daa[5 * 20 + 2] = 0.672052; daa[5 * 20 + 3] = 0.005; daa[5 * 20 + 4] = 0.005; daa[6 * 20 + 0] = 1.48135; daa[6 * 20 + 1] = 0.0749218; daa[6 * 20 + 2] = 0.0792633; daa[6 * 20 + 3] = 10.5872; daa[6 * 20 + 4] = 0.005; daa[6 * 20 + 5] = 2.5602; daa[7 * 20 + 0] = 2.13536; daa[7 * 20 + 1] = 3.65345; daa[7 * 20 + 2] = 0.323401; daa[7 * 20 + 3] = 2.83806; daa[7 * 20 + 4] = 0.897871; daa[7 * 20 + 5] = 0.0619137; daa[7 * 20 + 6] = 3.92775; daa[8 * 20 + 0] = 0.0847613; daa[8 * 20 + 1] = 9.04044; daa[8 * 20 + 2] = 7.64585; daa[8 * 20 + 3] = 1.9169; daa[8 * 20 + 4] = 0.240073; daa[8 * 20 + 5] = 7.05545; daa[8 * 20 + 6] = 0.11974; daa[8 * 20 + 7] = 0.005; daa[9 * 20 + 0] = 0.005; daa[9 * 20 + 1] = 0.677289; daa[9 * 20 + 2] = 0.680565; daa[9 * 20 + 3] = 0.0176792; daa[9 * 20 + 4] = 0.005; daa[9 * 20 + 5] = 0.005; daa[9 * 20 + 6] = 0.00609079; daa[9 * 20 + 7] = 0.005; daa[9 * 20 + 8] = 0.103111; daa[10 * 20 + 0] = 0.215256; daa[10 * 20 + 1] = 0.701427; daa[10 * 20 + 2] = 0.005; daa[10 * 20 + 3] = 0.00876048; daa[10 * 20 + 4] = 0.129777; daa[10 * 20 + 5] = 1.49456; daa[10 * 20 + 6] = 0.005; daa[10 * 20 + 7] = 0.005; daa[10 * 20 + 8] = 1.74171; daa[10 * 20 + 9] = 5.95879; daa[11 * 20 + 0] = 0.005; daa[11 * 20 + 1] = 20.45; daa[11 * 20 + 2] = 7.90443; daa[11 * 20 + 3] = 0.005; daa[11 * 20 + 4] = 0.005; daa[11 * 20 + 5] = 6.54737; daa[11 * 20 + 6] = 4.61482; daa[11 * 20 + 7] = 0.521705; daa[11 * 20 + 8] = 0.005; daa[11 * 20 + 9] = 0.322319; daa[11 * 20 + 10] = 0.0814995; daa[12 * 20 + 0] = 0.0186643; daa[12 * 20 + 1] = 2.51394; daa[12 * 20 + 2] = 0.005; daa[12 * 20 + 3] = 0.005; daa[12 * 20 + 4] = 0.005; daa[12 * 20 + 5] = 0.303676; daa[12 * 20 + 6] = 0.175789; daa[12 * 20 + 7] = 0.005; daa[12 * 20 + 8] = 0.005; daa[12 * 20 + 9] = 11.2065; daa[12 * 20 + 10] = 5.31961; daa[12 * 20 + 11] = 1.28246; daa[13 * 20 + 0] = 0.0141269; daa[13 * 20 + 1] = 0.005; daa[13 * 20 + 2] = 0.005; daa[13 * 20 + 3] = 0.005; daa[13 * 20 + 4] = 9.29815; daa[13 * 20 + 5] = 0.005; daa[13 * 20 + 6] = 0.005; daa[13 * 20 + 7] = 0.291561; daa[13 * 20 + 8] = 0.145558; daa[13 * 20 + 9] = 3.39836; daa[13 * 20 + 10] = 8.52484; daa[13 * 20 + 11] = 0.0342658; daa[13 * 20 + 12] = 0.188025; daa[14 * 20 + 0] = 2.12217; daa[14 * 20 + 1] = 1.28355; daa[14 * 20 + 2] = 0.00739578; daa[14 * 20 + 3] = 0.0342658; daa[14 * 20 + 4] = 0.005; daa[14 * 20 + 5] = 4.47211; daa[14 * 20 + 6] = 0.0120226; daa[14 * 20 + 7] = 0.005; daa[14 * 20 + 8] = 2.45318; daa[14 * 20 + 9] = 0.0410593; daa[14 * 20 + 10] = 2.07757; daa[14 * 20 + 11] = 0.0313862; daa[14 * 20 + 12] = 0.005; daa[14 * 20 + 13] = 0.005; daa[15 * 20 + 0] = 2.46633; daa[15 * 20 + 1] = 3.4791; daa[15 * 20 + 2] = 13.1447; daa[15 * 20 + 3] = 0.52823; daa[15 * 20 + 4] = 4.69314; daa[15 * 20 + 5] = 0.116311; daa[15 * 20 + 6] = 0.005; daa[15 * 20 + 7] = 4.38041; daa[15 * 20 + 8] = 0.382747; daa[15 * 20 + 9] = 1.21803; daa[15 * 20 + 10] = 0.927656; daa[15 * 20 + 11] = 0.504111; daa[15 * 20 + 12] = 0.005; daa[15 * 20 + 13] = 0.956472; daa[15 * 20 + 14] = 5.37762; daa[16 * 20 + 0] = 15.9183; daa[16 * 20 + 1] = 2.86868; daa[16 * 20 + 2] = 6.88667; daa[16 * 20 + 3] = 0.274724; daa[16 * 20 + 4] = 0.739969; daa[16 * 20 + 5] = 0.243589; daa[16 * 20 + 6] = 0.289774; daa[16 * 20 + 7] = 0.369615; daa[16 * 20 + 8] = 0.711594; daa[16 * 20 + 9] = 8.61217; daa[16 * 20 + 10] = 0.0437673; daa[16 * 20 + 11] = 4.67142; daa[16 * 20 + 12] = 4.94026; daa[16 * 20 + 13] = 0.0141269; daa[16 * 20 + 14] = 2.01417; daa[16 * 20 + 15] = 8.93107; daa[17 * 20 + 0] = 0.005; daa[17 * 20 + 1] = 0.991338; daa[17 * 20 + 2] = 0.005; daa[17 * 20 + 3] = 0.005; daa[17 * 20 + 4] = 2.63277; daa[17 * 20 + 5] = 0.026656; daa[17 * 20 + 6] = 0.005; daa[17 * 20 + 7] = 1.21674; daa[17 * 20 + 8] = 0.0695179; daa[17 * 20 + 9] = 0.005; daa[17 * 20 + 10] = 0.748843; daa[17 * 20 + 11] = 0.005; daa[17 * 20 + 12] = 0.089078; daa[17 * 20 + 13] = 0.829343; daa[17 * 20 + 14] = 0.0444506; daa[17 * 20 + 15] = 0.0248728; daa[17 * 20 + 16] = 0.005; daa[18 * 20 + 0] = 0.005; daa[18 * 20 + 1] = 0.00991826; daa[18 * 20 + 2] = 1.76417; daa[18 * 20 + 3] = 0.674653; daa[18 * 20 + 4] = 7.57932; daa[18 * 20 + 5] = 0.113033; daa[18 * 20 + 6] = 0.0792633; daa[18 * 20 + 7] = 0.005; daa[18 * 20 + 8] = 18.6943; daa[18 * 20 + 9] = 0.148168; daa[18 * 20 + 10] = 0.111986; daa[18 * 20 + 11] = 0.005; daa[18 * 20 + 12] = 0.005; daa[18 * 20 + 13] = 15.34; daa[18 * 20 + 14] = 0.0304381; daa[18 * 20 + 15] = 0.648024; daa[18 * 20 + 16] = 0.105652; daa[18 * 20 + 17] = 1.28022; daa[19 * 20 + 0] = 7.61428; daa[19 * 20 + 1] = 0.0812454; daa[19 * 20 + 2] = 0.026656; daa[19 * 20 + 3] = 1.04793; daa[19 * 20 + 4] = 0.420027; daa[19 * 20 + 5] = 0.0209153; daa[19 * 20 + 6] = 1.02847; daa[19 * 20 + 7] = 0.953155; daa[19 * 20 + 8] = 0.005; daa[19 * 20 + 9] = 17.7389; daa[19 * 20 + 10] = 1.41036; daa[19 * 20 + 11] = 0.265829; daa[19 * 20 + 12] = 6.8532; daa[19 * 20 + 13] = 0.723274; daa[19 * 20 + 14] = 0.005; daa[19 * 20 + 15] = 0.0749218; daa[19 * 20 + 16] = 0.709226; daa[19 * 20 + 17] = 0.005; daa[19 * 20 + 18] = 0.0410593; for (i = 0; i < naa; i++) for (j = 0; j < i; j++) daa[j * naa + i] = daa[i * naa + j]; pi[0] = 0.060490222; pi[1] = 0.066039665; pi[2] = 0.044127815; pi[3] = 0.042109048; pi[4] = 0.020075899; pi[5] = 0.053606488; pi[6] = 0.071567447; pi[7] = 0.072308239; pi[8] = 0.022293943; pi[9] = 0.069730629; pi[10] = 0.098851122; pi[11] = 0.056968211; pi[12] = 0.019768318; pi[13] = 0.028809447; pi[14] = 0.046025282; pi[15] = 0.05060433; pi[16] = 0.053636813; pi[17] = 0.033011601; pi[18] = 0.028350243; pi[19] = 0.061625237; return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Init_Qmat_HIVw(phydbl *daa, phydbl *pi) { /* Nickle DC, Heath L, Jensen MA, Gilbert PB, Mullins JI, Kosakovsky Pond SL. HIV-Specific Probabilistic Models of Protein Evolution. PLoS ONE. 2007 Jun 6;2:e503. [thanks to Sergei L. Kosakovsky] Translated from HYPHY to Phyml format by Federico Abascal. */ int i, j, naa; naa = 20; daa[1 * 20 + 0] = 0.0744808; daa[2 * 20 + 0] = 0.617509; daa[2 * 20 + 1] = 0.16024; daa[3 * 20 + 0] = 4.43521; daa[3 * 20 + 1] = 0.0674539; daa[3 * 20 + 2] = 29.4087; daa[4 * 20 + 0] = 0.167653; daa[4 * 20 + 1] = 2.86364; daa[4 * 20 + 2] = 0.0604932; daa[4 * 20 + 3] = 0.005; daa[5 * 20 + 0] = 0.005; daa[5 * 20 + 1] = 10.6746; daa[5 * 20 + 2] = 0.342068; daa[5 * 20 + 3] = 0.005; daa[5 * 20 + 4] = 0.005; daa[6 * 20 + 0] = 5.56325; daa[6 * 20 + 1] = 0.0251632; daa[6 * 20 + 2] = 0.201526; daa[6 * 20 + 3] = 12.1233; daa[6 * 20 + 4] = 0.005; daa[6 * 20 + 5] = 3.20656; daa[7 * 20 + 0] = 1.8685; daa[7 * 20 + 1] = 13.4379; daa[7 * 20 + 2] = 0.0604932; daa[7 * 20 + 3] = 10.3969; daa[7 * 20 + 4] = 0.0489798; daa[7 * 20 + 5] = 0.0604932; daa[7 * 20 + 6] = 14.7801; daa[8 * 20 + 0] = 0.005; daa[8 * 20 + 1] = 6.84405; daa[8 * 20 + 2] = 8.59876; daa[8 * 20 + 3] = 2.31779; daa[8 * 20 + 4] = 0.005; daa[8 * 20 + 5] = 18.5465; daa[8 * 20 + 6] = 0.005; daa[8 * 20 + 7] = 0.005; daa[9 * 20 + 0] = 0.005; daa[9 * 20 + 1] = 1.34069; daa[9 * 20 + 2] = 0.987028; daa[9 * 20 + 3] = 0.145124; daa[9 * 20 + 4] = 0.005; daa[9 * 20 + 5] = 0.0342252; daa[9 * 20 + 6] = 0.0390512; daa[9 * 20 + 7] = 0.005; daa[9 * 20 + 8] = 0.005; daa[10 * 20 + 0] = 0.16024; daa[10 * 20 + 1] = 0.586757; daa[10 * 20 + 2] = 0.005; daa[10 * 20 + 3] = 0.005; daa[10 * 20 + 4] = 0.005; daa[10 * 20 + 5] = 2.89048; daa[10 * 20 + 6] = 0.129839; daa[10 * 20 + 7] = 0.0489798; daa[10 * 20 + 8] = 1.76382; daa[10 * 20 + 9] = 9.10246; daa[11 * 20 + 0] = 0.592784; daa[11 * 20 + 1] = 39.8897; daa[11 * 20 + 2] = 10.6655; daa[11 * 20 + 3] = 0.894313; daa[11 * 20 + 4] = 0.005; daa[11 * 20 + 5] = 13.0705; daa[11 * 20 + 6] = 23.9626; daa[11 * 20 + 7] = 0.279425; daa[11 * 20 + 8] = 0.22406; daa[11 * 20 + 9] = 0.817481; daa[11 * 20 + 10] = 0.005; daa[12 * 20 + 0] = 0.005; daa[12 * 20 + 1] = 3.28652; daa[12 * 20 + 2] = 0.201526; daa[12 * 20 + 3] = 0.005; daa[12 * 20 + 4] = 0.005; daa[12 * 20 + 5] = 0.005; daa[12 * 20 + 6] = 0.005; daa[12 * 20 + 7] = 0.0489798; daa[12 * 20 + 8] = 0.005; daa[12 * 20 + 9] = 17.3064; daa[12 * 20 + 10] = 11.3839; daa[12 * 20 + 11] = 4.09564; daa[13 * 20 + 0] = 0.597923; daa[13 * 20 + 1] = 0.005; daa[13 * 20 + 2] = 0.005; daa[13 * 20 + 3] = 0.005; daa[13 * 20 + 4] = 0.362959; daa[13 * 20 + 5] = 0.005; daa[13 * 20 + 6] = 0.005; daa[13 * 20 + 7] = 0.005; daa[13 * 20 + 8] = 0.005; daa[13 * 20 + 9] = 1.48288; daa[13 * 20 + 10] = 7.48781; daa[13 * 20 + 11] = 0.005; daa[13 * 20 + 12] = 0.005; daa[14 * 20 + 0] = 1.00981; daa[14 * 20 + 1] = 0.404723; daa[14 * 20 + 2] = 0.344848; daa[14 * 20 + 3] = 0.005; daa[14 * 20 + 4] = 0.005; daa[14 * 20 + 5] = 3.04502; daa[14 * 20 + 6] = 0.005; daa[14 * 20 + 7] = 0.005; daa[14 * 20 + 8] = 13.9444; daa[14 * 20 + 9] = 0.005; daa[14 * 20 + 10] = 9.83095; daa[14 * 20 + 11] = 0.111928; daa[14 * 20 + 12] = 0.005; daa[14 * 20 + 13] = 0.0342252; daa[15 * 20 + 0] = 8.5942; daa[15 * 20 + 1] = 8.35024; daa[15 * 20 + 2] = 14.5699; daa[15 * 20 + 3] = 0.427881; daa[15 * 20 + 4] = 1.12195; daa[15 * 20 + 5] = 0.16024; daa[15 * 20 + 6] = 0.005; daa[15 * 20 + 7] = 6.27966; daa[15 * 20 + 8] = 0.725157; daa[15 * 20 + 9] = 0.740091; daa[15 * 20 + 10] = 6.14396; daa[15 * 20 + 11] = 0.005; daa[15 * 20 + 12] = 0.392575; daa[15 * 20 + 13] = 4.27939; daa[15 * 20 + 14] = 14.249; daa[16 * 20 + 0] = 24.1422; daa[16 * 20 + 1] = 0.928203; daa[16 * 20 + 2] = 4.54206; daa[16 * 20 + 3] = 0.630395; daa[16 * 20 + 4] = 0.005; daa[16 * 20 + 5] = 0.203091; daa[16 * 20 + 6] = 0.458743; daa[16 * 20 + 7] = 0.0489798; daa[16 * 20 + 8] = 0.95956; daa[16 * 20 + 9] = 9.36345; daa[16 * 20 + 10] = 0.005; daa[16 * 20 + 11] = 4.04802; daa[16 * 20 + 12] = 7.41313; daa[16 * 20 + 13] = 0.114512; daa[16 * 20 + 14] = 4.33701; daa[16 * 20 + 15] = 6.34079; daa[17 * 20 + 0] = 0.005; daa[17 * 20 + 1] = 5.96564; daa[17 * 20 + 2] = 0.005; daa[17 * 20 + 3] = 0.005; daa[17 * 20 + 4] = 5.49894; daa[17 * 20 + 5] = 0.0443298; daa[17 * 20 + 6] = 0.005; daa[17 * 20 + 7] = 2.8258; daa[17 * 20 + 8] = 0.005; daa[17 * 20 + 9] = 0.005; daa[17 * 20 + 10] = 1.37031; daa[17 * 20 + 11] = 0.005; daa[17 * 20 + 12] = 0.005; daa[17 * 20 + 13] = 0.005; daa[17 * 20 + 14] = 0.005; daa[17 * 20 + 15] = 1.10156; daa[17 * 20 + 16] = 0.005; daa[18 * 20 + 0] = 0.005; daa[18 * 20 + 1] = 0.005; daa[18 * 20 + 2] = 5.06475; daa[18 * 20 + 3] = 2.28154; daa[18 * 20 + 4] = 8.34835; daa[18 * 20 + 5] = 0.005; daa[18 * 20 + 6] = 0.005; daa[18 * 20 + 7] = 0.005; daa[18 * 20 + 8] = 47.4889; daa[18 * 20 + 9] = 0.114512; daa[18 * 20 + 10] = 0.005; daa[18 * 20 + 11] = 0.005; daa[18 * 20 + 12] = 0.579198; daa[18 * 20 + 13] = 4.12728; daa[18 * 20 + 14] = 0.005; daa[18 * 20 + 15] = 0.933142; daa[18 * 20 + 16] = 0.490608; daa[18 * 20 + 17] = 0.005; daa[19 * 20 + 0] = 24.8094; daa[19 * 20 + 1] = 0.279425; daa[19 * 20 + 2] = 0.0744808; daa[19 * 20 + 3] = 2.91786; daa[19 * 20 + 4] = 0.005; daa[19 * 20 + 5] = 0.005; daa[19 * 20 + 6] = 2.19952; daa[19 * 20 + 7] = 2.79622; daa[19 * 20 + 8] = 0.827479; daa[19 * 20 + 9] = 24.8231; daa[19 * 20 + 10] = 2.95344; daa[19 * 20 + 11] = 0.128065; daa[19 * 20 + 12] = 14.7683; daa[19 * 20 + 13] = 2.28; daa[19 * 20 + 14] = 0.005; daa[19 * 20 + 15] = 0.862637; daa[19 * 20 + 16] = 0.005; daa[19 * 20 + 17] = 0.005; daa[19 * 20 + 18] = 1.35482; for (i = 0; i < naa; i++) for (j = 0; j < i; j++) daa[j * naa + i] = daa[i * naa + j]; pi[0] = 0.0377494; pi[1] = 0.057321; pi[2] = 0.0891129; pi[3] = 0.0342034; pi[4] = 0.0240105; pi[5] = 0.0437824; pi[6] = 0.0618606; pi[7] = 0.0838496; pi[8] = 0.0156076; pi[9] = 0.0983641; pi[10] = 0.0577867; pi[11] = 0.0641682; pi[12] = 0.0158419; pi[13] = 0.0422741; pi[14] = 0.0458601; pi[15] = 0.0550846; pi[16] = 0.0813774; pi[17] = 0.019597; pi[18] = 0.0205847; pi[19] = 0.0515639; return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Init_Qmat_JTT(phydbl *daa, phydbl *pi) { int i, j, naa; /* JTT's model data * D.T.Jones, W.R.Taylor and J.M.Thornton * "The rapid generation of mutation data matrices from protein sequences" * CABIOS vol.8 no.3 1992 pp275-282 */ naa = 20; /* PhyML_Printf("\n\n. REMINDER : THIS IS NOT JTT !!!\n\n"); */ /* daa[1*20 + 0] = 0.592439084; */ /* daa[2*20 + 0] = 0.427686326; */ /* daa[2*20 + 1] = 0.795121783; */ /* daa[3*20 + 0] = 0.649119246; */ /* daa[3*20 + 1] = 0.116285502; */ /* daa[3*20 + 2] = 6.004659556; */ /* daa[4*20 + 0] = 2.384113318; */ /* daa[4*20 + 1] = 0.925080814; */ /* daa[4*20 + 2] = 0.648459384; */ /* daa[4*20 + 3] = 0.088632079; */ /* daa[5*20 + 0] = 1.188499461; */ /* daa[5*20 + 1] = 3.230029905; */ /* daa[5*20 + 2] = 1.910660418; */ /* daa[5*20 + 3] = 0.599639374; */ /* daa[5*20 + 4] = 0.123291416; */ /* daa[6*20 + 0] = 1.534092487; */ /* daa[6*20 + 1] = 0.390654981; */ /* daa[6*20 + 2] = 0.566472743; */ /* daa[6*20 + 3] = 5.916482256; */ /* daa[6*20 + 4] = 0.001457992; */ /* daa[6*20 + 5] = 4.564894849; */ /* daa[7*20 + 0] = 2.282012114; */ /* daa[7*20 + 1] = 0.502549742; */ /* daa[7*20 + 2] = 1.97013036; */ /* daa[7*20 + 3] = 1.198016556; */ /* daa[7*20 + 4] = 0.565245125; */ /* daa[7*20 + 5] = 0.382529852; */ /* daa[7*20 + 6] = 0.477515495; */ /* daa[8*20 + 0] = 0.447587408; */ /* daa[8*20 + 1] = 2.948365572; */ /* daa[8*20 + 2] = 5.900694893; */ /* daa[8*20 + 3] = 0.96157692; */ /* daa[8*20 + 4] = 0.757153271; */ /* daa[8*20 + 5] = 5.048587596; */ /* daa[8*20 + 6] = 0.410583482; */ /* daa[8*20 + 7] = 0.406115605; */ /* daa[9*20 + 0] = 0.105337934; */ /* daa[9*20 + 1] = 0.115421183; */ /* daa[9*20 + 2] = 0.178948502; */ /* daa[9*20 + 3] = 0.01319564; */ /* daa[9*20 + 4] = 0.269637325; */ /* daa[9*20 + 5] = 0.087618072; */ /* daa[9*20 + 6] = 0.045232757; */ /* daa[9*20 + 7] = 0.00958642; */ /* daa[9*20 + 8] = 0.116145048; */ /* daa[10*20 + 0] = 0.269460438; */ /* daa[10*20 + 1] = 0.416549984; */ /* daa[10*20 + 2] = 0.100490196; */ /* daa[10*20 + 3] = 0.021637571; */ /* daa[10*20 + 4] = 0.610442865; */ /* daa[10*20 + 5] = 0.782347175; */ /* daa[10*20 + 6] = 0.077565847; */ /* daa[10*20 + 7] = 0.034916545; */ /* daa[10*20 + 8] = 0.456334781; */ /* daa[10*20 + 9] = 4.057302736; */ /* daa[11*20 + 0] = 0.71706921; */ /* daa[11*20 + 1] = 6.469532749; */ /* daa[11*20 + 2] = 2.606469511; */ /* daa[11*20 + 3] = 0.239488567; */ /* daa[11*20 + 4] = 0.020594132; */ /* daa[11*20 + 5] = 3.978479772; */ /* daa[11*20 + 6] = 1.669092348; */ /* daa[11*20 + 7] = 0.368262509; */ /* daa[11*20 + 8] = 0.744835535; */ /* daa[11*20 + 9] = 0.153626461; */ /* daa[11*20 + 10] = 0.186106976; */ /* daa[12*20 + 0] = 0.766271778; */ /* daa[12*20 + 1] = 0.465902609; */ /* daa[12*20 + 2] = 0.352429433; */ /* daa[12*20 + 3] = 0.04670109; */ /* daa[12*20 + 4] = 0.930016402; */ /* daa[12*20 + 5] = 1.529072358; */ /* daa[12*20 + 6] = 0.149497081; */ /* daa[12*20 + 7] = 0.092795029; */ /* daa[12*20 + 8] = 0.367452788; */ /* daa[12*20 + 9] = 4.443975824; */ /* daa[12*20 + 10] = 7.305963709; */ /* daa[12*20 + 11] = 0.691067831; */ /* daa[13*20 + 0] = 0.164314785; */ /* daa[13*20 + 1] = 0.064046051; */ /* daa[13*20 + 2] = 0.108166343; */ /* daa[13*20 + 3] = 0.021096631; */ /* daa[13*20 + 4] = 0.9869692; */ /* daa[13*20 + 5] = 0.054959009; */ /* daa[13*20 + 6] = 0.025919221; */ /* daa[13*20 + 7] = 0.053577857; */ /* daa[13*20 + 8] = 0.933637734; */ /* daa[13*20 + 9] = 0.928915383; */ /* daa[13*20 + 10] = 2.549658015; */ /* daa[13*20 + 11] = 0.032602723; */ /* daa[13*20 + 12] = 1.837397986; */ /* daa[14*20 + 0] = 1.57937466; */ /* daa[14*20 + 1] = 0.360749538; */ /* daa[14*20 + 2] = 0.189183366; */ /* daa[14*20 + 3] = 0.475387263; */ /* daa[14*20 + 4] = 0.108255878; */ /* daa[14*20 + 5] = 0.645294956; */ /* daa[14*20 + 6] = 0.537278362; */ /* daa[14*20 + 7] = 0.264516985; */ /* daa[14*20 + 8] = 0.510062949; */ /* daa[14*20 + 9] = 0.063380048; */ /* daa[14*20 + 10] = 0.25549658; */ /* daa[14*20 + 11] = 0.42259906; */ /* daa[14*20 + 12] = 0.105330979; */ /* daa[14*20 + 13] = 0.092650543; */ /* daa[15*20 + 0] = 5.358849732; */ /* daa[15*20 + 1] = 0.980362668; */ /* daa[15*20 + 2] = 5.114953674; */ /* daa[15*20 + 3] = 1.242898123; */ /* daa[15*20 + 4] = 3.417258976; */ /* daa[15*20 + 5] = 1.199117804; */ /* daa[15*20 + 6] = 0.61024061; */ /* daa[15*20 + 7] = 2.200746452; */ /* daa[15*20 + 8] = 0.928717085; */ /* daa[15*20 + 9] = 0.07737779; */ /* daa[15*20 + 10] = 0.17657022; */ /* daa[15*20 + 11] = 0.768621405; */ /* daa[15*20 + 12] = 0.330215244; */ /* daa[15*20 + 13] = 0.359985962; */ /* daa[15*20 + 14] = 1.559718375; */ /* daa[16*20 + 0] = 2.21115657; */ /* daa[16*20 + 1] = 0.711040813; */ /* daa[16*20 + 2] = 2.273163111; */ /* daa[16*20 + 3] = 0.408851733; */ /* daa[16*20 + 4] = 1.57572444; */ /* daa[16*20 + 5] = 1.074674746; */ /* daa[16*20 + 6] = 0.707096016; */ /* daa[16*20 + 7] = 0.157418108; */ /* daa[16*20 + 8] = 0.543088926; */ /* daa[16*20 + 9] = 1.056024176; */ /* daa[16*20 + 10] = 0.294118282; */ /* daa[16*20 + 11] = 1.325676171; */ /* daa[16*20 + 12] = 1.834248079; */ /* daa[16*20 + 13] = 0.136987103; */ /* daa[16*20 + 14] = 0.63778855; */ /* daa[16*20 + 15] = 7.294506488; */ /* daa[17*20 + 0] = 0.142106331; */ /* daa[17*20 + 1] = 0.600995696; */ /* daa[17*20 + 2] = 0.079481793; */ /* daa[17*20 + 3] = 0.069125482; */ /* daa[17*20 + 4] = 0.701931839; */ /* daa[17*20 + 5] = 0.23881661; */ /* daa[17*20 + 6] = 0.082469159; */ /* daa[17*20 + 7] = 0.185722676; */ /* daa[17*20 + 8] = 0.911694299; */ /* daa[17*20 + 9] = 0.11679729; */ /* daa[17*20 + 10] = 0.688555894; */ /* daa[17*20 + 11] = 0.063328042; */ /* daa[17*20 + 12] = 0.780079225; */ /* daa[17*20 + 13] = 3.432193724; */ /* daa[17*20 + 14] = 0.088827331; */ /* daa[17*20 + 15] = 0.293602516; */ /* daa[17*20 + 16] = 0.158083832; */ /* daa[18*20 + 0] = 0.178618354; */ /* daa[18*20 + 1] = 0.243634289; */ /* daa[18*20 + 2] = 0.567657832; */ /* daa[18*20 + 3] = 0.134890583; */ /* daa[18*20 + 4] = 1.28093676; */ /* daa[18*20 + 5] = 0.180560506; */ /* daa[18*20 + 6] = 0.081426157; */ /* daa[18*20 + 7] = 0.044067219; */ /* daa[18*20 + 8] = 6.464181222; */ /* daa[18*20 + 9] = 0.206728215; */ /* daa[18*20 + 10] = 0.334379787; */ /* daa[18*20 + 11] = 0.102051407; */ /* daa[18*20 + 12] = 0.431775879; */ /* daa[18*20 + 13] = 11.87781125; */ /* daa[18*20 + 14] = 0.078070175; */ /* daa[18*20 + 15] = 0.359969114; */ /* daa[18*20 + 16] = 0.199064371; */ /* daa[18*20 + 17] = 4.185797039; */ /* daa[19*20 + 0] = 1.964727121; */ /* daa[19*20 + 1] = 0.18579405; */ /* daa[19*20 + 2] = 0.113068304; */ /* daa[19*20 + 3] = 0.046258503; */ /* daa[19*20 + 4] = 2.069983598; */ /* daa[19*20 + 5] = 0.247259847; */ /* daa[19*20 + 6] = 0.272991021; */ /* daa[19*20 + 7] = 0.073432734; */ /* daa[19*20 + 8] = 0.158879333; */ /* daa[19*20 + 9] = 10.52590329; */ /* daa[19*20 + 10] = 1.74812825; */ /* daa[19*20 + 11] = 0.188152512; */ /* daa[19*20 + 12] = 1.800124087; */ /* daa[19*20 + 13] = 0.478606732; */ /* daa[19*20 + 14] = 0.277216066; */ /* daa[19*20 + 15] = 0.104728903; */ /* daa[19*20 + 16] = 1.963379491; */ /* daa[19*20 + 17] = 0.16552242; */ /* daa[19*20 + 18] = 0.222040517; */ /* for (i=0; idim = n_dim; Random_String(t->id, 3); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Init_Veloc(t_geo_veloc *t, int n_dim) { t->dim = n_dim; Random_String(t->id, 3); for (int i = 0; i < n_dim; ++i) t->deriv[i] = Uni() * 2. - 1.; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Init_Disk_Event(t_dsk *t, int n_dim, t_phyrex_mod *mmod) { t->prev = NULL; t->next = NULL; t->img = NULL; t->mmod = NULL; t->age_fixed = NO; t->cum_glnL = 0.0; t->cum_tlnL = 0.0; Random_String(t->id, 3); GEO_Init_Coord(t->centr, n_dim); if (mmod != NULL) t->mmod = mmod; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Init_Migrep_Mod(t_phyrex_mod *t, int n_dim, phydbl min_lat, phydbl min_lon, phydbl max_lat, phydbl max_lon) { assert(n_dim == 2); if (t->model_id == -1) t->model_id = SLFV_GAUSSIAN; t->n_dim = n_dim; if (t->sampling_scheme == -1) t->sampling_scheme = SPATIAL_SAMPLING_DETECTION; if (t->use_locations == -1) t->use_locations = YES; t->lim_up->lonlat[0] = max_lat; t->lim_up->lonlat[1] = max_lon; t->lim_do->lonlat[0] = min_lat; t->lim_do->lonlat[1] = min_lon; t->min_rad = 0.0; t->max_rad = 1.0 * ((max_lat - min_lat) + (max_lon - min_lon)); t->rad = 0.01 * ((max_lat - min_lat) + (max_lon - min_lon)); t->prior_param_rad = 1. / (0.1 * ((max_lat - min_lat) + (max_lon - min_lon))); t->do_location_sampling = YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Set_Default_Migrep_Mod(int n_otu, t_phyrex_mod *t) { for (int i = 0; i < 2 * n_otu - 1; ++i) t->sigsq_scale[i] = 1.0; t->sigsq_scale_min = 0.1; t->sigsq_scale_max = 10.; t->sigsq_scale_norm_fact = 1.0; t->model_id = -1; t->use_locations = -1; t->sampling_scheme = -1; t->safe_phyrex = YES; t->dist_type = HAVERSINE; t->lim_up->lonlat[0] = 100.; t->lim_up->lonlat[1] = 100.; t->lim_do->lonlat[0] = 0.0; t->lim_do->lonlat[1] = 0.0; t->lbda = 1.E-0; t->min_lbda = 1.E-6; t->max_lbda = 1.E+4; t->prior_param_lbda = 1.0; t->mu = 0.800; t->min_mu = 0.000; t->max_mu = 1.000; t->prior_param_mu = 1.000; t->min_rad = 0.0; t->max_rad = 100.; t->rad = 4.; t->prior_param_rad = 1.; t->update_rad = NO; t->min_veloc = -1.E+5; t->max_veloc = +1.E+5; t->omega = 1.E-3; t->min_omega = 0.0; t->max_omega = 1.E+3; t->ou_theta = 1.0E-1; t->min_ou_theta = 0.0; t->max_ou_theta = 1000.0; for (int i = 0; i < t->n_dim; ++i) t->ou_mu[i] = 0.0; t->min_ou_mu = -10.; t->max_ou_mu = 10.; t->min_sigsq = 0.0; t->max_sigsq = 1.E+3; t->prior_param_sigsq = 10.0; assert(t->n_dim > 0); for (int i = 0; i < t->n_dim; ++i) t->sigsq[i] = 10.; t->nu = 1.0E-0; t->c_lnL = UNLIKELY; t->p_lnL = UNLIKELY; t->c_lnP = UNLIKELY; t->p_lnP = UNLIKELY; t->c_ln_prior_rad = UNLIKELY; t->c_ln_prior_lbda = UNLIKELY; t->c_ln_prior_mu = UNLIKELY; t->soft_bound_area = 0.1; t->max_num_of_intervals = 10000000; t->rw_prior_mean = 1.0; t->rw_prior_sd = 1.0; t->rw_prior_distrib = EXPONENTIAL_PRIOR; t->rw_root_mean[LOCATION] = 0.0; t->rw_root_var[LOCATION] = 1.0; t->rw_root_mean[VELOCITY] = 0.0; t->rw_root_var[VELOCITY] = 1.0; t->integrateAncestralLocations = YES; t->rrw_prior_sd = 1.0; t->print_lk = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Init_Lindisk_Node(t_ldsk *t, t_dsk *disk, int n_dim) { t->disk = disk; /* disk->ldsk = t; */ t->prev = NULL; t->next = NULL; t->img = NULL; t->nd = NULL; t->is_hit = NO; t->n_next = 0; t->rr = 1.0; t->sigsq = 1.0; GEO_Init_Coord(t->coord, n_dim); GEO_Init_Coord(t->cpy_coord, n_dim); GEO_Init_Veloc(t->veloc, n_dim); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Init_MCMC_Struct(char *filename, option *io, t_mcmc *mcmc) { int pid; assert(mcmc); mcmc->io = io; mcmc->is = NO; mcmc->run = 0; mcmc->sample_interval = 1E+3; mcmc->chain_len = 1E+7; mcmc->chain_len_burnin = 1E+4; mcmc->randomize = YES; mcmc->norm_freq = 1E+3; mcmc->max_tune = 1.E+6; mcmc->min_tune = 1.E-6; mcmc->print_every = 2; mcmc->is_burnin = NO; mcmc->nd_t_digits = 4; mcmc->always_yes = NO; mcmc->max_lag = 1000; mcmc->sample_num = 0; mcmc->out_verbose = 1; if (filename) { char *s; s = (char *)mCalloc(T_MAX_NAME, sizeof(char)); strcpy(mcmc->out_filename, filename); pid = getpid(); sprintf(mcmc->out_filename + strlen(mcmc->out_filename), ".%d", pid); strcpy(s, mcmc->io->in_align_file); strcat(s, "_"); strcat(s, mcmc->out_filename); strcat(s, ".stats"); mcmc->out_fp_stats = fopen(s, "w"); strcpy(s, mcmc->io->in_align_file); strcat(s, "_"); strcat(s, mcmc->out_filename); strcat(s, ".trees"); mcmc->out_fp_trees = fopen(s, "w"); strcpy(s, mcmc->io->in_align_file); strcat(s, "_"); strcat(s, mcmc->out_filename); strcat(s, ".constree"); mcmc->out_fp_constree = fopen(s, "w"); /* strcpy(s,tree->mcmc->out_filename); */ /* strcat(s,".means"); */ /* tree->mcmc->out_fp_means = fopen(s,"w"); */ /* strcpy(s,tree->mcmc->out_filename); */ /* strcat(s,".lasts"); */ /* tree->mcmc->out_fp_last = fopen(s,"w"); */ Free(s); } else { mcmc->out_fp_stats = stderr; mcmc->out_fp_trees = stderr; /* tree->mcmc->out_fp_means = stderr; */ /* tree->mcmc->out_fp_last = stderr; */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Calibration(t_cal *cal) { cal->next = NULL; cal->prev = NULL; cal->lower = -1.; cal->upper = -1.; cal->is_primary = FALSE; cal->alpha_proba_list = NULL; cal->clade_list = NULL; cal->clade_list_size = 0; cal->id = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_All_Calibration(t_tree *tree) { int i; assert(tree->rates && tree->times->a_cal); For(i, 2 * tree->n_otu - 1) Init_Calibration(tree->times->a_cal[i]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Sarea(t_sarea *s) { assert(s); s->n_poly = 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Calign(int n_otu, int n_pattern, int init_len, calign *this) { this->obs_pinvar = .0; this->n_otu = n_otu; this->clean_len = -1; this->n_pattern = n_pattern; this->init_len = init_len; this->format = 0; this->io_wght = NULL; this->n_masked = 0; this->mask_type = MASK_TYPE_POSITION; this->masked_pos = NULL; for (int i = 0; i < n_otu; ++i) Init_Cseq(this->c_seq[i]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Cseq(align *this) { this->is_duplicate = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Linked_List(t_ll *list) { list->head = list; list->tail = list; list->next = NULL; list->prev = NULL; list->v = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_NNI_Score(phydbl val, t_edge *b, t_tree *tree) { b->nni->score = val; if (tree->is_mixt_tree == YES) MIXT_Init_NNI_Score(val, b, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Init_Model(m4 *m4mod, calign *data, t_mod *mod) { int i, j, ct; phydbl fq; if (mod->io->datatype == NT) m4mod->n_o = 4; else if (mod->io->datatype == AA) m4mod->n_o = 20; else { PhyML_Fprintf(stderr, "\n. Not implemented yet."); PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } mod->ns = m4mod->n_o * m4mod->n_h; for (i = 0; i < m4mod->n_o; i++) m4mod->o_fq[i] = mod->e_frq->pi ->v[i]; /*! At that stage, the mod->pi vector as been initialized under a standard non covarion type of model. Use these frequencies as they have been set according to the nucleotide substitution model chosen (e.g., 1/4 for JC69). !*/ for (i = 0; i < (int)(m4mod->n_h); ++i) m4mod->multipl->v[i] = 1.; ct = 0; for (i = 0; i < m4mod->n_o - 1; i++) { for (j = i + 1; j < m4mod->n_o; j++) { m4mod->o_rr->v[ct] = MAX(mod->r_mat->qmat->v[i * m4mod->n_o + j], 1.E-5); ct++; } } for (i = 0; i < (int)(m4mod->n_h * (m4mod->n_h - 1) / 2); ++i) m4mod->h_rr[i] = 1.; fq = (phydbl)(1. / m4mod->n_h); if (m4mod->delta->optimize == YES) m4mod->delta->v = 1.0; if (m4mod->alpha->optimize == YES) m4mod->alpha->v = 1.0; for (i = 0; i < m4mod->n_h; i++) m4mod->h_fq->v[i] = fq; for (i = 0; i < m4mod->n_h; i++) m4mod->h_fq_unscaled->v[i] = 1.0; for (i = 0; i < m4mod->n_h; i++) m4mod->multipl->v[i] = (phydbl)i; for (i = 0; i < m4mod->n_h; i++) m4mod->multipl_unscaled->v[i] = (phydbl)i; Set_Update_Eigen(YES, mod); M4_Update_Qmat(m4mod, mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Initialise x values using coordinates at the tip nodes along // one dimension (with index dim_idx) void RW_Init_Contrasts(int dim_idx, t_tree *tree) { for (int i = 0; i < tree->n_otu; ++i) tree->ctrst->x[i] = tree->a_nodes[i]->ldsk->coord->lonlat[dim_idx]; for (int i = 0; i < 2 * tree->n_otu - 1; ++i) tree->ctrst->tprime[i] = tree->times->nd_t[i]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Defaults_Contmod(t_tree *tree) { int i; tree->contmod->obs_model = NO; tree->contmod->obs_model_est = YES; tree->contmod->obs_var_min = 0.0; tree->contmod->obs_var_max = 1.E+2; tree->contmod->both_sides[LOCATION] = NO; tree->contmod->combined_lnL = UNLIKELY; tree->contmod->obs_var_prior_mean = 50.0; for (i = 0; i < tree->mmod->n_dim; ++i) tree->contmod->obs_var[i] = 0.0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Contmod_Locations(t_tree *tree) { int i, j, start, err; for (i = 0; i < tree->mmod->n_dim; ++i) { start = Contmod_Start(LOCATION, i, tree); for (j = 0; j < tree->n_otu; ++j) { tree->contmod->mu_down[start + j] = tree->a_nodes[j]->ldsk->coord->lonlat[i]; if (tree->contmod->obs_model == YES) tree->contmod->var_down[start + j] = tree->contmod->obs_var[i]; else tree->contmod->var_down[start + j] = 0.0; tree->contmod->logrem_down[start + j] = 0.0; tree->contmod->mu_up[start + j] = 0.0; tree->contmod->var_up[start + j] = 0.0; tree->contmod->logrem_up[start + j] = 0.0; if (tree->contmod->obs_model == YES) tree->contmod->lnL_down[start + j] = Log_Dnorm(tree->a_nodes[j]->ldsk->coord->lonlat[i], tree->a_nodes[j]->ldsk->coord->lonlat[i], tree->contmod->obs_var[i], &err); else tree->contmod->lnL_down[start + j] = 1.0; tree->contmod->lnL_up[start + j] = 0.0; } for (j = tree->n_otu; j < 2 * tree->n_otu - 1; ++j) { tree->contmod->mu_down[start + j] = 0.0; tree->contmod->var_down[start + j] = 0.0; tree->contmod->logrem_down[start + j] = 0.0; tree->contmod->mu_up[start + j] = 0.0; tree->contmod->var_up[start + j] = 0.0; tree->contmod->logrem_up[start + j] = 0.0; tree->contmod->lnL_down[start + j] = 0.0; tree->contmod->lnL_up[start + j] = 0.0; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Contmod_Velocities(t_tree *tree) { int i, j, start; for (i = 0; i < tree->mmod->n_dim; ++i) { start = Contmod_Start(VELOCITY, i, tree); for (j = 0; j < tree->n_otu; ++j) { tree->contmod->mu_down[start + j] = tree->a_nodes[j]->ldsk->veloc->deriv[i]; tree->contmod->var_down[start + j] = 0.0; tree->contmod->logrem_down[start + j] = 0.0; tree->contmod->mu_up[start + j] = 0.0; tree->contmod->var_up[start + j] = 0.0; tree->contmod->logrem_up[start + j] = 0.0; tree->contmod->lnL_down[start + j] = 0.0; tree->contmod->lnL_up[start + j] = 0.0; } for (j = tree->n_otu; j < 2 * tree->n_otu - 1; ++j) { tree->contmod->mu_down[start + j] = 0.0; tree->contmod->var_down[start + j] = 0.0; tree->contmod->logrem_down[start + j] = 0.0; tree->contmod->mu_up[start + j] = 0.0; tree->contmod->var_up[start + j] = 0.0; tree->contmod->logrem_up[start + j] = 0.0; tree->contmod->lnL_down[start + j] = 0.0; tree->contmod->lnL_up[start + j] = 0.0; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/init.h000066400000000000000000000063511501136442400203120ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef INIT_H #define INIT_H #include "utilities.h" void Init_Cseq(align *this); void Init_Eigen_Struct(eigen *this); void Init_Scalar_Dbl(scalar_dbl *p); void Init_Scalar_Int(scalar_int *p); void Init_Vect_Dbl(int len,vect_dbl *p); void Init_Vect_Int(int len,vect_int *p); void Init_Tree(t_tree *tree,int n_otu); void Init_Edge_Light(t_edge *b,int num); void Init_Node_Light(t_node *n,int num); void Init_NNI(t_nni *a_nni); void Init_Nexus_Format(nexcom **com, FILE *fp); void Init_Mat(matrix *mat,calign *data); void Set_Defaults_Input(option *io); void Set_Defaults_Model(t_mod *mod); void Set_Defaults_Optimiz(t_opt *s_opt); void XML_Init_Node(xml_node *prev,xml_node *new_node,char *name); void Init_One_Spr(t_spr *a_spr); void Init_Model(calign *data,t_mod *mod,option *io); int Init_Qmat_Dayhoff(phydbl *daa,phydbl *pi); int Init_Qmat_DCMut(phydbl *daa,phydbl *pi); int Init_Qmat_MtArt(phydbl *daa,phydbl *pi); int Init_Qmat_HIVb(phydbl *daa,phydbl *pi); int Init_Qmat_HIVw(phydbl *daa,phydbl *pi); int Init_Qmat_JTT(phydbl *daa,phydbl *pi); int Init_Qmat_MtREV(phydbl *daa,phydbl *pi); int Init_Qmat_LG(phydbl *daa,phydbl *pi); int Init_Qmat_WAG(phydbl *daa,phydbl *pi); int Init_Qmat_RtREV(phydbl *daa,phydbl *pi); int Init_Qmat_CpREV(phydbl *daa,phydbl *pi); int Init_Qmat_VT(phydbl *daa,phydbl *pi); int Init_Qmat_Blosum62(phydbl *daa,phydbl *pi); int Init_Qmat_MtMam(phydbl *daa,phydbl *pi); int Init_Qmat_AB(phydbl *daa, phydbl *pi); void XML_Init_Attribute(xml_attr *attr); void Init_String(t_string *ts); void Init_Efrq(phydbl *b_frq, t_efrq *f); void RATES_Init_Rate_Struct(t_rate *rates, t_rate *existing_rates, int n_otu); void TIMES_Init_Time_Struct(t_time *times, t_time *existing_time, int n_otu); void Init_Rmat(t_rmat *rmat); void Init_MGF_Bl(t_tree *tree); int Init_Qmat_FLU(phydbl *daa, phydbl *pi); void Set_Defaults_Ras(t_ras *ras); void GEO_Init_Coord(t_geo_coord *t, int n_dim); void PHYREX_Init_Disk_Event(t_dsk *t, int n_dim, t_phyrex_mod *mod); void PHYREX_Init_Lindisk_Node(t_ldsk *t, t_dsk *devt, int n_dim); void PHYREX_Init_Migrep_Mod(t_phyrex_mod *t, int n_dim, phydbl min_lat, phydbl min_lon, phydbl max_lat, phydbl max_lon); void MCMC_Init_MCMC_Struct(char *filename, option *io, t_mcmc *mcmc); void Init_Calibration(t_cal *cal); void Init_All_Calibration(t_tree *tree); void Init_Sarea(t_sarea *s); void Init_Efrqs_Using_Observed_Freqs(t_efrq *f, phydbl *o, int ns); void Init_Calign(int n_otu, int crunch_len, int init_len, calign *this); void Init_Linked_List(t_ll *list); void Init_Target_Tip(t_clad *clade, t_tree *tree); void Init_NNI_Score(phydbl val, t_edge *b, t_tree *tree); void M4_Init_Model(m4 *m4mod, calign *data, t_mod *mod); void RW_Init_Contrasts(int dim_idx, t_tree *tree); void PHYREX_Set_Default_Migrep_Mod(int n_otu, t_phyrex_mod *t); void Init_Contmod_Locations(t_tree *tree); void Init_Contmod_Velocities(t_tree *tree); void GEO_Init_Veloc(t_geo_veloc *t, int n_dim); void Set_Defaults_Contmod(t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/interface.c000066400000000000000000001525611501136442400213070ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "interface.h" void Launch_Interface(option *io) { Launch_Interface_Input(io); io->ready_to_go = 0; do { switch (io->curr_interface) { case INTERFACE_DATA_TYPE: { Launch_Interface_Data_Type(io); break; } case INTERFACE_MULTIGENE: { Launch_Interface_Multigene(io); break; } case INTERFACE_MODEL: { Launch_Interface_Model(io); break; } case INTERFACE_TOPO_SEARCH: { Launch_Interface_Topo_Search(io); break; } case INTERFACE_BRANCH_SUPPORT: { Launch_Interface_Branch_Support(io); break; } default: { PhyML_Printf("\n== Err in file %s at line %d\n\n", __FILE__, __LINE__); Exit(""); break; } } } while (!io->ready_to_go); if (io->in_tree == 2) { PhyML_Printf("\n. Enter the name of the input tree file > "); Getstring_Stdin(io->in_tree_file); io->fp_in_tree = Openfile(io->in_tree_file, 0); } if ((io->mod->whichmodel == CUSTOMAA) && (io->datatype == AA)) { char *filename; filename = (char *)mCalloc(T_MAX_NAME, sizeof(char)); fflush(NULL); PhyML_Printf("\n"); PhyML_Printf("\n. Enter the rate matrix file name > "); fflush(NULL); Getstring_Stdin(filename); io->mod->fp_aa_rate_mat = Openfile(filename, 0); strcpy(io->mod->aa_rate_mat_file->s, filename); PhyML_Printf("\n"); Free(filename); fflush(NULL); } if ((io->mod->s_opt->n_rand_starts > 0) && (io->mod->s_opt->topo_search == NNI_MOVE) && (io->mod->s_opt->random_input_tree)) { Warn_And_Exit("\n. The random starting tree option is only compatible with " "SPR based search options.\n"); } if ((io->datatype == NT) && (io->mod->whichmodel > 10)) { char choix; PhyML_Printf("\n== Err: model incompatible with the data type. Please use " "JC69, K80, F81, HKY, F84, TN93 or GTR\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Warn_And_Exit("\n"); } else if ((io->datatype == AA) && (io->mod->whichmodel < 11)) { char choix; PhyML_Printf("\n== Err: model incompatible with the data type. Please use " "LG, Dayhoff, JTT, MtREV, WAG, DCMut, RtREV, CpREV, VT, " "Blosum62, MtMam, MtArt, HIVw, HIVb or AB.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } if (io->mod->use_m4mod == YES) { io->mod->ns *= io->mod->m4mod->n_h; io->mod->m4mod = M4_Make_Light(); M4_Init_Model(io->mod->m4mod, io->cdata, io->mod); M4_Make_Complete(io->mod->m4mod->n_h, io->mod->m4mod->n_o, io->mod->m4mod); if ((io->mod->m4mod->multipl_unscaled->optimize == YES) && (io->mod->m4mod->alpha->optimize == NO)) io->mod->m4mod->use_cov_free = YES; } if (io->print_site_lnl) { strcpy(io->out_lk_file, io->in_align_file); strcat(io->out_lk_file, "_phyml_lk.txt"); if (io->append_run_ID) { strcat(io->out_lk_file, "_"); strcat(io->out_lk_file, io->run_id_string); } io->fp_out_lk = Openfile(io->out_lk_file, 1); } if (io->print_trace) { strcpy(io->out_trace_file, io->in_align_file); strcat(io->out_trace_file, "_phyml_trace.txt"); if (io->append_run_ID) { strcat(io->out_trace_file, "_"); strcat(io->out_trace_file, io->run_id_string); } io->fp_out_trace = Openfile(io->out_trace_file, 1); } if (io->mod->s_opt->random_input_tree) { strcpy(io->out_trees_file, io->in_align_file); strcat(io->out_trees_file, "_phyml_trees.txt"); if (io->append_run_ID) { strcat(io->out_trees_file, "_"); strcat(io->out_trees_file, io->run_id_string); } io->fp_out_trees = Openfile(io->out_trees_file, 1); } if ((io->print_boot_trees) && (io->n_boot_replicates > 0)) { strcpy(io->out_boot_tree_file, io->in_align_file); strcat(io->out_boot_tree_file, "_phyml_boot_trees.txt"); if (io->append_run_ID) { strcat(io->out_boot_tree_file, "_"); strcat(io->out_boot_tree_file, io->run_id_string); } io->fp_out_boot_tree = Openfile(io->out_boot_tree_file, 1); strcpy(io->out_boot_stats_file, io->in_align_file); strcat(io->out_boot_stats_file, "_phyml_boot_stats.txt"); if (io->append_run_ID) { strcat(io->out_boot_stats_file, "_"); strcat(io->out_boot_stats_file, io->run_id_string); } io->fp_out_boot_stats = Openfile(io->out_boot_stats_file, 1); } if (io->append_run_ID) { strcat(io->out_tree_file, "_"); strcat(io->out_stats_file, "_"); strcat(io->out_tree_file, io->run_id_string); strcat(io->out_stats_file, io->run_id_string); } if (io->mod->ras->n_catg == 1) io->mod->ras->alpha->optimize = NO; if (io->mod->whichmodel != K80 && io->mod->whichmodel != HKY85 && io->mod->whichmodel != F84 && io->mod->whichmodel != TN93) { io->mod->kappa->optimize = 0; } io->fp_out_tree = Openfile(io->out_tree_file, 1); io->fp_out_stats = Openfile(io->out_stats_file, 1); // VINCENT: do not necessarily optimize relative rate parameters, they could // be set by user if (io->mod->whichmodel == GTR) { if (io->mod->s_opt->opt_subst_param) io->mod->r_mat->optimize = YES; else io->mod->r_mat->optimize = NO; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Clear(void) { #ifdef WIN32 system("cls"); #elif UNIX PhyML_Printf("\033[2J\033[H"); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Input(option *io) { char choix; int n_trial; Clear(); Print_Banner(stdout); #ifdef EVOLVE char *n_data_sets; PhyML_Printf("\n\n"); PhyML_Printf("\n. Enter the tree file name > "); fflush(NULL); Getstring_Stdin(io->in_tree_file); io->fp_in_tree = Openfile(io->in_tree_file, 0); PhyML_Printf("\n"); PhyML_Printf("\n. Enter the reference sequence file name > "); fflush(NULL); Getstring_Stdin(io->in_align_file); io->fp_in_align = Openfile(io->in_align_file, 0); PhyML_Printf("\n"); PhyML_Printf("\n. Number of data sets > "); n_data_sets = (char *)mCalloc(10000, sizeof(char)); Getstring_Stdin(n_data_sets); n_trial = 0; while ((!atoi(n_data_sets)) || (atoi(n_data_sets) < 0)) { if (++n_trial > 10) Exit("\n== Err : the number of sets must be a positive integer"); PhyML_Printf("\n. The number of sets must be a positive integer"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(n_data_sets); } io->n_data_set_asked = atoi(n_data_sets); Free(n_data_sets); #elif OPTIMIZ PhyML_Printf("\n. Enter the tree file name > "); fflush(NULL); Getstring_Stdin(io->in_tree_file); io->fp_in_tree = Openfile(io->in_tree_file, 0); PhyML_Printf("\n"); PhyML_Printf("\n. Enter the reference sequence file name > "); fflush(NULL); Getstring_Stdin(io->in_align_file); io->fp_in_align = Openfile(io->in_align_file, 0); PhyML_Printf("\n"); #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) PhyML_Printf("\n. Enter the sequence file name > "); fflush(NULL); Getstring_Stdin(io->in_align_file); io->fp_in_align = Openfile(io->in_align_file, 0); #endif #if defined(PHYML) || defined(PART) || defined(PHYML_INSERT) strcpy(io->out_stats_file, io->in_align_file); strcat(io->out_stats_file, "_phyml_stats.txt"); strcpy(io->out_tree_file, io->in_align_file); strcat(io->out_tree_file, "_phyml_tree.txt"); strcpy(io->out_lk_file, io->in_align_file); strcat(io->out_lk_file, "_phyml_lk.txt"); #endif #ifdef EVOLVE if (Filexists("evolve_out.txt")) #elif OPTIMIZ if (Filexists("optimiz_out.txt")) #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) if (Filexists(io->out_stats_file)) #endif { PhyML_Printf("\n"); #ifdef EVOLVE PhyML_Printf("\n. A file 'evolve_out' already exists"); #elif OPTIMIZ PhyML_Printf("\n. A file 'optimiz_out' already exists"); #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) PhyML_Printf("\n. A file '%s' already exists", io->out_stats_file); #endif PhyML_Printf("\n. Do you want to Replace it or Append to it ? "); n_trial = 0; do { PhyML_Printf("\n. Please type R or A > "); if (!scanf("%c", &choix)) Exit("\n"); if (choix == '\n') choix = 'r'; else getchar(); if (++n_trial > 10) Exit("\n"); Uppercase(&choix); } while ((choix != 'R') && (choix != 'A')); if (choix == 'R') io->out_stats_file_open_mode = 1; else io->out_stats_file_open_mode = 2; } /* io->fp_out_stats = * Openfile(io->out_stats_file,io->out_stats_file_open_mode); */ #ifdef EVOLVE if (Filexists("evolve_seq.txt")) #elif OPTIMIZ if (Filexists("optimiz_tree.txt")) #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) if (Filexists(io->out_tree_file)) #endif { PhyML_Printf("\n"); #ifdef EVOLVE PhyML_Printf("\n. A file 'evolve_seq' already exists"); #elif OPTIMIZ PhyML_Printf("\n. A file 'optimiz_tree' already exists"); #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) PhyML_Printf("\n. A file '%s' already exists", io->out_tree_file); #endif PhyML_Printf("\n. Do you want to Replace it or Append to it ? "); n_trial = 0; do { PhyML_Printf("\n. Please type R or A > "); if (!scanf("%c", &choix)) Exit("\n"); if (choix == '\n') choix = 'r'; else getchar(); Uppercase(&choix); if (++n_trial > 10) Exit("\n"); } while ((choix != 'R') && (choix != 'A')); if (choix == 'R') io->out_tree_file_open_mode = 1; else io->out_tree_file_open_mode = 2; } /* io->fp_out_tree = Openfile(io->out_tree_file,io->out_tree_file_open_mode); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Data_Type(option *io) { char choix; char *s; char *buff; Clear(); Print_Banner(stdout); if (io->config_multigene) Print_Data_Set_Number(io, stdout); s = (char *)mCalloc(100, sizeof(char)); buff = (char *)mCalloc(100, sizeof(char)); PhyML_Printf("\n\n"); PhyML_Printf(" ................... " " \n"); PhyML_Printf(" Menu : Input Data " " \n"); PhyML_Printf(" ......................... " " \n"); PhyML_Printf("\n\n"); PhyML_Printf(" [+] " ".................................... Next sub-menu\n"); PhyML_Printf(" [-] " "................................ Previous sub-menu\n"); PhyML_Printf(" [Y] " ".............................. Launch the analysis\n"); PhyML_Printf("\n"); if (io->datatype == NT) strcpy(s, "DNA"); else if (io->datatype == AA) strcpy(s, "AA"); else strcpy(s, "Generic"); PhyML_Printf(" [D] " "....................... Data type (DNA/AA/Generic) " " %-15s \n", s); PhyML_Printf(" [I] " "...... Input sequences interleaved (or sequential) " " %-15s \n", (io->interleaved) ? ("interleaved") : ("sequential")); strcpy(s, ""); sprintf(s, " (%d sets)", io->n_data_sets); strcpy(buff, (io->n_data_sets > 1) ? ("yes") : ("no")); buff = strcat(buff, (io->n_data_sets > 1) ? (s) : ("\0")); PhyML_Printf(" [M] " "....................... Analyze multiple data sets " " %-15s \n", buff); if (!io->append_run_ID) strcpy(s, "none"); else strcpy(s, io->run_id_string); PhyML_Printf(" [R] " "........................................... Run ID " " %-15s \n", s); PhyML_Printf("\n\n. Are these settings correct ? " "(type '+', '-', 'Y' or other letter for one to change) "); if (!scanf("%c", &choix)) Exit("\n"); if (choix != '\n') getchar(); /* \n */ fflush(NULL); Uppercase(&choix); switch (choix) { /* case '\n': */ /* { */ /* io->curr_interface++; */ /* break; */ /* } */ case 'R': { io->append_run_ID = (io->append_run_ID) ? (0) : (1); PhyML_Printf("\n. Enter a run ID (any string of characters) > "); Getstring_Stdin(io->run_id_string); break; } case 'M': { char *c; int n_trial; PhyML_Printf("\n. How many data sets > "); c = (char *)mCalloc(100, sizeof(char)); Getstring_Stdin(c); n_trial = 0; while ((!atoi(c)) || (atoi(c) < 0)) { if (++n_trial > 10) Exit("\n== Err : The number of data sets must be a positive integer"); PhyML_Printf("\n. The number of data sets must be a positive integer"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(c); } io->n_data_sets = atoi(c); #ifdef PART if (io->n_data_sets > 1) { io->multigene = 1; } #endif if ((io->do_boot || io->do_tbe) && (io->n_data_sets > 1)) { PhyML_Printf( "\n. Bootstrap option is not allowed with multiple data sets !\n"); PhyML_Printf("\n. Type any key to exit."); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } Free(c); break; } case 'I': { if (io->interleaved) io->interleaved = 0; else io->interleaved = 1; break; } case 'D': { if (io->datatype == NT) { io->datatype = AA; io->mod->ns = 20; io->mod->kappa->optimize = 0; io->mod->whichmodel = LG; strcpy(io->mod->modelname->s, "LG"); } else if (io->datatype == AA) { io->datatype = GENERIC; io->mod->whichmodel = JC69; strcpy(io->mod->modelname->s, "JC69"); strcpy(io->nt_or_cd, "natural numbers"); } else if (io->datatype == GENERIC) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = HKY85; strcpy(io->mod->modelname->s, "HKY85"); strcpy(io->nt_or_cd, "nucleotides"); } break; } case '-': { io->curr_interface = (io->config_multigene) ? (INTERFACE_MODEL) : (INTERFACE_BRANCH_SUPPORT); break; } case '+': { io->curr_interface = (io->multigene) ? (INTERFACE_MULTIGENE) : (INTERFACE_MODEL); break; } case 'Y': { io->ready_to_go = 1; break; } default: { break; } } Free(s); Free(buff); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Model(option *io) { char choix; char *s; s = (char *)mCalloc(100, sizeof(char)); Clear(); Print_Banner(stdout); if (io->config_multigene) Print_Data_Set_Number(io, stdout); io->mod->r_mat = (t_rmat *)Make_Rmat(io->mod->ns); Init_Rmat(io->mod->r_mat); io->mod->e_frq = (t_efrq *)Make_Efrq(io->mod->ns); Init_Efrq(NULL,io->mod->e_frq); PhyML_Printf("\n\n"); PhyML_Printf(" ........................... " " \n"); PhyML_Printf(" Menu : Substitution Model " " \n"); PhyML_Printf(" ................................. " " \n"); PhyML_Printf("\n\n"); PhyML_Printf(" [+] " ".................................... Next sub-menu\n"); PhyML_Printf(" [-] " "................................ Previous sub-menu\n"); PhyML_Printf(" [Y] " ".............................. Launch the analysis\n"); PhyML_Printf("\n"); if (io->datatype == NT) { if (!strcmp(io->nt_or_cd, "nucleotides")) { PhyML_Printf(" [M] " "................. Model of nucleotide substitution " " %-15s \n", io->mod->modelname->s); if ((io->mod->whichmodel == F81) || (io->mod->whichmodel == HKY85) || (io->mod->whichmodel == F84) || (io->mod->whichmodel == TN93) || (io->mod->whichmodel == GTR) || (io->mod->whichmodel == CUSTOM)) { PhyML_Printf(" [F] " "................. Optimise equilibrium frequencies " " %-15s \n", (io->mod->e_frq->type == ML) ? ("yes") : ("no")); } if (io->mod->whichmodel == CUSTOM) { if (io->mod->e_frq->type == EMPIRICAL) { PhyML_Printf(" [E] " "......... Equilibrium frequencies " " %-15s \n", "empirical"); } else if (io->mod->e_frq->type == USER) { PhyML_Printf(" [E] " "......... Equilibrium frequencies " " %-15s \n", "user-defined"); } else if (io->mod->e_frq->type == ML) { PhyML_Printf(" [E] " "......... Equilibrium frequencies " " %-15s \n", "optimized"); } PhyML_Printf(" [K] " "............................. Current custom model " " %-15s \n", io->mod->custom_mod_string->s); PhyML_Printf(" [O] " "................ Optimise relative rate parameters " " %-15s \n", (io->mod->r_mat->optimize) ? ("yes") : ("no")); } } } else if (io->datatype == AA) { PhyML_Printf(" [M] " "................ Model of amino-acids substitution " " %-15s \n", io->mod->modelname->s); if (io->mod->e_frq->type == EMPIRICAL) PhyML_Printf(" [F] " ". Amino acid frequencies " " %-15s \n", "empirical"); else if (io->mod->e_frq->type == MODEL) PhyML_Printf(" [F] " ". Amino acid frequencies " " %-15s \n", "model"); else if (io->mod->e_frq->type == ML) PhyML_Printf(" [F] " ". Amino acid frequencies " " %-15s \n", "optimized"); } else if (io->datatype == GENERIC) { PhyML_Printf(" [M] " "................. Model of nucleotide substitution " " %-15s \n", io->mod->modelname->s); } if ((io->datatype == NT) && ((io->mod->whichmodel == K80) || (io->mod->whichmodel == HKY85) || (io->mod->whichmodel == F84) || (io->mod->whichmodel == TN93))) { strcpy(s, (io->mod->kappa->optimize) ? ("estimated") : ("fixed")); if (io->mod->kappa->optimize) strcat(s, ""); else strcat(s, " (ts/tv = "); /* (io->mod->kappa->optimize)?((char *)strcat(s,"")):((char * *)sprintf(s+(int)strlen((char *)s),"%3.2f)",io->mod->kappa->v)); */ if (io->mod->kappa->optimize) { strcat((char *)s, ""); } else { sprintf((char *)(s + (int)strlen(s)), "%3.2f)", io->mod->kappa->v); } PhyML_Printf(" [T] " ".................... Ts/tv ratio (fixed/estimated) " " %-15s \n", s); } strcpy(s, io->mod->ras->pinvar->optimize ? "estimated" : "fixed"); strcat(s, io->mod->ras->pinvar->optimize ? "" : " (p-invar = "); if (io->mod->ras->pinvar->optimize == YES) { strcat(s, ""); } else { sprintf((char *)(s + strlen((char *)s)), "%3.2f)", io->mod->ras->pinvar->v); } PhyML_Printf(" [V] " ". Proportion of invariable sites (fixed/estimated)" " %-15s \n", s); PhyML_Printf(" [R] " "....... One category of substitution rate (yes/no) " " %-15s \n", (io->mod->ras->n_catg > 1) ? ("no") : ("yes")); if (io->mod->ras->n_catg > 1) { PhyML_Printf(" [C] " "........... Number of substitution rate categories " " %-15d \n", io->mod->ras->n_catg); } if (io->mod->ras->n_catg > 1) { PhyML_Printf(" [G] " "............. Gamma distributed rates across sites " " %-15s \n", (io->mod->ras->free_mixt_rates) ? ("no") : ("yes")); } if ((io->mod->ras->n_catg > 1) && (io->mod->ras->free_mixt_rates == NO)) { strcpy(s, (io->mod->ras->alpha->optimize) ? ("estimated") : ("fixed")); strcat(s, io->mod->ras->alpha->optimize ? "" : " (alpha = "); if (io->mod->ras->alpha->optimize) { strcat(s, ""); } else { sprintf(s + strlen(s), "%3.2f)", io->mod->ras->alpha->v); } PhyML_Printf(" [A] " "... Gamma distribution parameter (fixed/estimated) " " %-15s \n", s); /* strcpy(s,(io->mod->ras->gamma_median)?("median"):("mean")); */ /* PhyML_Printf(" [G] " */ /* ".........'Middle' of each rate class (mean/median) " */ /* " %-15s \n",s); */ } PhyML_Printf("\n\n. Are these settings correct ? " "(type '+', '-', 'Y' or other letter for one to change) "); if (!scanf("%c", &choix)) Exit("\n"); if (choix != '\n') getchar(); /* \n */ Uppercase(&choix); switch (choix) { /* case '\n': */ /* { */ /* io->curr_interface++; */ /* break; */ /* } */ case 'G': { io->mod->ras->free_mixt_rates = (io->mod->ras->free_mixt_rates) ? (NO) : (YES); break; } case 'O': { io->mod->r_mat->optimize = (io->mod->r_mat->optimize) ? NO : YES; break; } case 'K': { int i, j; char **rr_param, *rr; int n_trial; if (io->mod->whichmodel == CUSTOM) { rr_param = (char **)mCalloc(6, sizeof(char *)); for (i = 0; i < 6; i++) rr_param[i] = (char *)mCalloc(10, sizeof(char)); rr = (char *)mCalloc(50, sizeof(char)); n_trial = 0; do { PhyML_Printf("\n. Enter a new custom model > "); Getstring_Stdin(io->mod->custom_mod_string->s); if (strlen(io->mod->custom_mod_string->s) == 6) { for (i = 0; i < 6; i++) { while (!isdigit((int)io->mod->custom_mod_string->s[i])) { if (++n_trial > 10) Exit("\n== Err : this string is not valid !\n"); PhyML_Printf("\n. This string is not valid\n"); PhyML_Printf("\n. Enter a new model > "); Getstring_Stdin(io->mod->custom_mod_string->s); } } if (i == 6) break; } else { PhyML_Printf("\n. The string should be of length 6\n"); n_trial++; } } while (n_trial < 10); if (n_trial == 10) Exit(""); io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = CUSTOM; if(io->mod->r_mat != NULL) Free_Rmat(io->mod->r_mat); io->mod->r_mat = (t_rmat *)Make_Rmat(io->mod->ns); Init_Rmat(io->mod->r_mat); Make_Custom_Model(io->mod); Translate_Custom_Mod_String(io->mod); strcpy(io->mod->modelname->s, "custom"); io->mod->kappa->optimize = NO; io->mod->r_mat->optimize = YES; strcpy(rr_param[0], "A<->C"); strcpy(rr_param[1], "A<->G"); strcpy(rr_param[2], "A<->T"); strcpy(rr_param[3], "C<->G"); strcpy(rr_param[4], "C<->T"); strcpy(rr_param[5], "G<->T"); PhyML_Printf("\n. Set the relative rate values\n"); for (i = 0; i < io->mod->r_mat->n_diff_rr; i++) { sprintf(rr, "\n. ["); for (j = 0; j < 6; j++) { if (io->mod->r_mat->rr_num->v[j] == i) { sprintf(rr + strlen(rr), "%s = ", rr_param[j]); } } sprintf(rr + strlen(rr) - 3, "]"); PhyML_Printf("%s", rr); PhyML_Printf(" (current=%.2f) > ", io->mod->r_mat->rr_val->v[i]); Getstring_Stdin(rr); if (rr[0] != '\0') { n_trial = 0; while ((atof(rr) < .0)) { if (++n_trial > 10) Exit("\n== Err : the value of this parameter must be a positive " "number\n"); PhyML_Printf( "\n. The value of this parameter must be a positive number\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(rr); } io->mod->r_mat->rr_val->v[i] = (phydbl)atof(rr); } } for (i = 0; i < 6; i++) Free(rr_param[i]); Free(rr_param); Free(rr); } break; } case 'E': { int i; if (io->mod->whichmodel == CUSTOM) { if (io->mod->e_frq->type == EMPIRICAL) io->mod->e_frq->type = ML; else if (io->mod->e_frq->type == ML) io->mod->e_frq->type = USER; else if (io->mod->e_frq->type == USER) io->mod->e_frq->type = MODEL; else if (io->mod->e_frq->type == MODEL) io->mod->e_frq->type = EMPIRICAL; if (io->mod->e_frq->type == USER) { char **bases; char *bs; phydbl sum; int n_trial; bases = (char **)mCalloc(4, sizeof(char *)); for (i = 0; i < 4; i++) bases[i] = (char *)mCalloc(50, sizeof(char)); bs = (char *)mCalloc(100, sizeof(char)); strcpy(bases[0], ". f(A)> "); strcpy(bases[1], ". f(C)> "); strcpy(bases[2], ". f(G)> "); strcpy(bases[3], ". f(T)> "); PhyML_Printf("\n. Set nucleotide frequencies \n"); sum = .0; for (i = 0; i < 4; i++) { PhyML_Printf("%s", bases[i]); Getstring_Stdin(bs); n_trial = 0; while ((atof(bs) < .0001) || (bs[0] == '\0')) { if (++n_trial > 10) Exit("\n== Err : the value of this parameter must be a positive " "number\n"); PhyML_Printf( "\n. The value of this parameter must be a positive number\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(bs); } io->mod->e_frq->user_b_freq->v[i] = (phydbl)atof(bs); sum += io->mod->e_frq->user_b_freq->v[i]; } for (i = 0; i < 4; i++) io->mod->e_frq->user_b_freq->v[i] /= sum; if (sum > 1.0 || sum < 1.0) { PhyML_Printf("\n. The nucleotide frequencies have to be normalised " "in order to sum to 1.0.\n"); PhyML_Printf("\n. The frequencies are now : f(A)=%f, f(C)=%f, " "f(G)=%f, f(T)=%f.\n", io->mod->e_frq->user_b_freq->v[0], io->mod->e_frq->user_b_freq->v[1], io->mod->e_frq->user_b_freq->v[2], io->mod->e_frq->user_b_freq->v[3]); PhyML_Printf("\n. Enter any key to continue.\n"); if (!scanf("%c", bs)) Exit("\n"); } for (i = 0; i < 4; i++) Free(bases[i]); Free(bases); Free(bs); } else { Warn_And_Exit( "\n. 'E' is not a valid option with these model settings.\n"); } } break; } case 'A': { char answer; int n_trial; answer = 0; if (io->mod->ras->alpha->optimize == NO) { PhyML_Printf("\n. Optimise alpha ? [Y/n] "); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = 'Y'; else getchar(); break; } else { PhyML_Printf("\n. Optimise alpha ? [N/y] "); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = 'N'; else getchar(); break; } n_trial = 0; while ((answer != 'Y') && (answer != 'y') && (answer != 'N') && (answer != 'n')) { if (++n_trial > 10) Exit("\n== Err : wrong answers !"); PhyML_Printf("\n. Optimise alpha ? [N/y] "); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = 'N'; else getchar(); } switch (answer) { case 'Y': case 'y': { io->mod->ras->alpha->optimize = 1; io->mod->s_opt->opt_subst_param = 1; break; } case 'N': case 'n': { char *a; a = (char *)mCalloc(100, sizeof(char)); io->mod->ras->alpha->v = 10.0; io->mod->ras->alpha->optimize = NO; PhyML_Printf("\n. Enter your value of alpha > "); Getstring_Stdin(a); n_trial = 0; while (atof(a) < 1.E-10) { if (++n_trial > 10) Exit("\n== Err : alpha must be > 1.E-10\n"); PhyML_Printf("\n. Alpha must be 1.E-10\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(a); } io->mod->ras->alpha->v = (phydbl)atof(a); Free(a); io->mod->ras->alpha->optimize = NO; break; } } break; } case 'C': { char *c; int n_trial; PhyML_Printf("\n. Enter your number of categories > "); c = (char *)mCalloc(100, sizeof(char)); Getstring_Stdin(c); n_trial = 0; while ((!atoi(c)) || (atoi(c) < 0)) { if (++n_trial > 10) Exit( "\n== Err : the number of categories must be a positive integer\n"); PhyML_Printf("\n. The number of categories must be a positive integer\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(c); } io->mod->ras->n_catg = atoi(c); Free(c); break; } case 'R': { io->mod->ras->n_catg = (io->mod->ras->n_catg == 1) ? (4) : (1); break; } case 'V': { char answer; int n_trial; answer = 0; if(io->mod->ras->pinvar->optimize == NO) { PhyML_Printf("\n. Optimise p-invar ? [Y/n] "); answer = 0; if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = 'Y'; else getchar(); break; } else { PhyML_Printf("\n. Optimise p-invar ? [N/y] "); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = 'N'; else getchar(); break; } n_trial = 0; while ((answer != 'Y') && (answer != 'y') && (answer != 'N') && (answer != 'n')) { if (++n_trial > 10) Exit("\n== Err : wrong answers !"); PhyML_Printf("\n. Optimise p-invar ? [N/y] "); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = 'N'; else getchar(); } switch (answer) { case 'Y': case 'y': { io->mod->s_opt->opt_subst_param = 1; io->mod->ras->pinvar->optimize = YES; io->mod->ras->pinvar->v = 0.2; io->mod->ras->invar = 1; break; } case 'N': case 'n': { char *p; p = (char *)mCalloc(100, sizeof(char)); PhyML_Printf("\n. Enter your value of p-invar > "); Getstring_Stdin(p); n_trial = 0; while ((atof(p) < 0.0) || (atof(p) > 1.0)) { if (++n_trial > 10) Exit("\n== Err : the proportion of invariable sites must be a " "positive number between 0.0 and 1.0"); PhyML_Printf("\n. The proportion must be a positive number between 0.0 " "and 1.0\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(p); } io->mod->ras->pinvar->v = (phydbl)atof(p); if (io->mod->ras->pinvar->v > 0.0 + SMALL) io->mod->ras->invar = 1; else io->mod->ras->invar = 0; Free(p); io->mod->ras->pinvar->optimize = NO; break; } } break; } case 'T': { char answer; int n_trial; answer = 0; if ((io->datatype == AA) || (io->mod->whichmodel == JC69) || (io->mod->whichmodel == F81) || (io->mod->whichmodel == GTR) || (io->mod->whichmodel == CUSTOM)) { PhyML_Printf("\n. 'K' is not a valid choice for this model\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } if (io->mod->kappa->optimize == NO) { PhyML_Printf("\n. Optimise ts/tv ratio ? [Y/n] "); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = 'Y'; else getchar(); break; } else { PhyML_Printf("\n. Optimise ts/tv ratio ? [N/y] "); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = 'N'; else getchar(); break; } n_trial = 0; while ((answer != 'Y') && (answer != 'y') && (answer != 'N') && (answer != 'n')) { if (++n_trial > 10) Exit("\n== Err : wrong answers !"); PhyML_Printf("\n. Optimise ts/tv ratio ? [N/y] "); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = 'N'; else getchar(); } switch (answer) { case 'Y': case 'y': { io->mod->kappa->v = 4.0; io->mod->s_opt->opt_subst_param = 1; io->mod->kappa->optimize = 1; if (io->mod->whichmodel == TN93) io->mod->lambda->optimize = 1; break; } case 'N': case 'n': { char *t; t = (char *)mCalloc(100, sizeof(char)); io->mod->kappa->optimize = 0; PhyML_Printf("\n. Enter your value of the ts/tv ratio > "); Getstring_Stdin(t); n_trial = 0; while (atof(t) < .0) { if (++n_trial > 10) Exit("\n== Err : the ts/tv ratio must be a positive number\n"); PhyML_Printf("\n. The ratio must be a positive number"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(t); } io->mod->kappa->v = (phydbl)atof(t); io->mod->kappa->optimize = 0; io->mod->lambda->optimize = 0; Free(t); break; } } break; } case 'F': { if ((io->mod->whichmodel == JC69) || (io->mod->whichmodel == K80)) { Warn_And_Exit( "\n. 'F' is not a valid choice with these model settings.\n"); } if (io->mod->e_frq->type == EMPIRICAL) io->mod->e_frq->type = ML; else if (io->mod->e_frq->type == ML) io->mod->e_frq->type = USER; else if (io->mod->e_frq->type == USER) io->mod->e_frq->type = MODEL; else if (io->mod->e_frq->type == MODEL) io->mod->e_frq->type = EMPIRICAL; break; } case 'M': { if (io->datatype == NT) { if (!strcmp(io->nt_or_cd, "nucleotides")) { if (io->mod->whichmodel == JC69) { io->mod->whichmodel = K80; } else if (io->mod->whichmodel == K80) { io->mod->whichmodel = F81; } else if (io->mod->whichmodel == F81) { io->mod->whichmodel = HKY85; } else if (io->mod->whichmodel == HKY85) { io->mod->whichmodel = F84; } else if (io->mod->whichmodel == F84) { io->mod->whichmodel = TN93; } else if (io->mod->whichmodel == TN93) { io->mod->whichmodel = GTR; } else if (io->mod->whichmodel == GTR) { io->mod->whichmodel = CUSTOM; } else if (io->mod->whichmodel == CUSTOM) { io->mod->whichmodel = JC69; } } } else if (io->datatype == AA) { if (io->mod->whichmodel == LG) { io->mod->whichmodel = WAG; } else if (io->mod->whichmodel == WAG) { io->mod->whichmodel = DAYHOFF; } else if (io->mod->whichmodel == DAYHOFF) { io->mod->whichmodel = JTT; } else if (io->mod->whichmodel == JTT) { io->mod->whichmodel = BLOSUM62; } else if (io->mod->whichmodel == BLOSUM62) { io->mod->whichmodel = MTREV; } else if (io->mod->whichmodel == MTREV) { io->mod->whichmodel = RTREV; } else if (io->mod->whichmodel == RTREV) { io->mod->whichmodel = CPREV; } else if (io->mod->whichmodel == CPREV) { io->mod->whichmodel = DCMUT; } else if (io->mod->whichmodel == DCMUT) { io->mod->whichmodel = VT; } else if (io->mod->whichmodel == VT) { io->mod->whichmodel = MTMAM; } else if (io->mod->whichmodel == MTMAM) { io->mod->whichmodel = MTART; } else if (io->mod->whichmodel == MTART) { io->mod->whichmodel = HIVW; } else if (io->mod->whichmodel == HIVW) { io->mod->whichmodel = HIVB; } else if (io->mod->whichmodel == HIVB) { io->mod->whichmodel = AB; } else if (io->mod->whichmodel == AB) { io->mod->whichmodel = CUSTOMAA; } else if (io->mod->whichmodel == CUSTOMAA) { io->mod->whichmodel = LG; } } else if (io->datatype == GENERIC) { io->mod->whichmodel = JC69; } Set_Model_Name(io->mod); break; } case '-': { io->curr_interface = INTERFACE_DATA_TYPE; break; } case '+': { io->curr_interface = (io->config_multigene) ? (INTERFACE_DATA_TYPE) : (INTERFACE_TOPO_SEARCH); break; } case 'Y': { io->ready_to_go = 1; break; } default: { break; } } if (io->mod->ras->alpha->optimize == YES || io->mod->kappa->optimize == YES || io->mod->lambda->optimize == YES || io->mod->ras->pinvar->optimize == YES|| io->mod->r_mat->optimize == YES) io->mod->s_opt->opt_subst_param = YES; else io->mod->s_opt->opt_subst_param = NO; Free(s); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Topo_Search(option *io) { char choix; char *s; s = (char *)mCalloc(100, sizeof(char)); Clear(); Print_Banner(stdout); PhyML_Printf("\n\n"); PhyML_Printf(" ....................... " " \n"); PhyML_Printf(" Menu : Tree Searching " " \n"); PhyML_Printf(" ............................. " " \n"); PhyML_Printf("\n\n"); PhyML_Printf(" [+] " ".................................... Next sub-menu\n"); PhyML_Printf(" [-] " "................................ Previous sub-menu\n"); PhyML_Printf(" [Y] " ".............................. Launch the analysis\n"); PhyML_Printf("\n"); PhyML_Printf(" [O] " "........................... Optimise tree topology " " %-15s \n", (io->mod->s_opt->opt_topo) ? ("yes") : ("no")); if (io->mod->s_opt->opt_topo) { switch (io->in_tree) { case 0: { strcpy(s, "BioNJ"); break; } case 1: { strcpy(s, "parsimony"); break; } case 2: { strcpy(s, "user tree"); break; } } PhyML_Printf(" [U] " "........ Starting tree (BioNJ/parsimony/user tree) " " %-15s \n", s); } else { switch (io->in_tree) { case 0: { strcpy(s, "BioNJ"); break; } case 2: { strcpy(s, "user tree"); break; } } PhyML_Printf(" [U] " "..................... Input tree (BioNJ/user tree) " " %-15s \n", s); } if (io->mod->s_opt->opt_topo) { char *s; s = (char *)mCalloc(T_MAX_OPTION, sizeof(char)); io->mod->s_opt->topo_search = SPR_MOVE; if (io->mod->s_opt->topo_search == NNI_MOVE) { /* strcpy(s,"NNI moves (fast, approximate)\0"); */ strcpy(s, "SPR moves\0"); } else if (io->mod->s_opt->topo_search == SPR_MOVE) { strcpy(s, "SPR moves\0"); } else if (io->mod->s_opt->topo_search == BEST_OF_NNI_AND_SPR) { strcpy(s, "SPR moves\0"); /* strcpy(s,"Best of NNI and SPR \0"); */ } PhyML_Printf(" [S] " ".................. Tree topology search operations " " %-15s \n", s); Free(s); if (io->mod->s_opt->topo_search != NNI_MOVE) { PhyML_Printf(" [R] " "........................ Add random starting trees " " %-15s \n", (io->mod->s_opt->random_input_tree) ? ("yes") : ("no")); if (io->mod->s_opt->random_input_tree) { PhyML_Printf(" [N] " ".................. Number of random starting trees " " %-15d \n", io->mod->s_opt->n_rand_starts); } } } else { PhyML_Printf(" [L] " ".......................... Optimise branch lengths " " %-15s \n", (io->mod->s_opt->opt_bl_one_by_one) ? ("yes") : ("no")); } PhyML_Printf("\n\n. Are these settings correct ? " "(type '+', '-', 'Y' or other letter for one to change) "); if (!scanf("%c", &choix)) Exit("\n"); if (choix != '\n') getchar(); /* \n */ Free(s); Uppercase(&choix); switch (choix) { case '-': { io->curr_interface = INTERFACE_MODEL; break; } case '+': { io->curr_interface = INTERFACE_BRANCH_SUPPORT; break; } case 'Y': { io->ready_to_go = 1; break; } case 'U': { io->in_tree++; if (!io->mod->s_opt->opt_topo) { if (io->in_tree == 1) io->in_tree = 2; } if (io->in_tree == 3) io->in_tree = 0; break; } case 'N': { char *n; int n_trial; PhyML_Printf("\n. Enter your number of starting trees > "); n = (char *)mCalloc(100, sizeof(char)); Getstring_Stdin(n); n_trial = 0; while (atoi(n) < 1) { if (++n_trial > 10) Exit("\n== Err : the number of starting trees must be a positive " "integer\n"); PhyML_Printf( "\n. The number of starting trees must be a positive integer\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(n); } io->mod->s_opt->n_rand_starts = atoi(n); io->n_trees = 1; Free(n); break; } case 'O': { io->mod->s_opt->opt_topo = (io->mod->s_opt->opt_topo) ? (0) : (1); break; } case 'L': { if (!io->mod->s_opt->opt_topo) { io->mod->s_opt->opt_bl_one_by_one = (io->mod->s_opt->opt_bl_one_by_one) ? (0) : (1); } break; } case 'S': { if (io->mod->s_opt->topo_search == NNI_MOVE) { io->mod->s_opt->topo_search = SPR_MOVE; io->mod->s_opt->n_rand_starts = 1; io->mod->s_opt->random_input_tree = 0; io->mod->s_opt->greedy = 0; } else if (io->mod->s_opt->topo_search == SPR_MOVE) { io->mod->s_opt->topo_search = BEST_OF_NNI_AND_SPR; io->mod->s_opt->n_rand_starts = 1; io->mod->s_opt->random_input_tree = 0; io->mod->s_opt->greedy = 0; } else if (io->mod->s_opt->topo_search == BEST_OF_NNI_AND_SPR) { io->mod->s_opt->topo_search = NNI_MOVE; io->mod->s_opt->n_rand_starts = 1; io->mod->s_opt->random_input_tree = 0; io->mod->s_opt->greedy = 0; } break; } case 'R': { io->mod->s_opt->random_input_tree = (io->mod->s_opt->random_input_tree) ? (0) : (1); if (io->mod->s_opt->random_input_tree) { if (io->fp_in_tree) fclose(io->fp_in_tree); /* io->in_tree = 0; */ io->n_trees = 1; io->mod->s_opt->n_rand_starts = 5; strcpy(io->out_trees_file, io->in_align_file); strcat(io->out_trees_file, "_phyml_trees.txt"); } break; } default: { break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Branch_Support(option *io) { char choix; char *s; s = (char *)mCalloc(100, sizeof(char)); Clear(); Print_Banner(stdout); PhyML_Printf("\n\n"); PhyML_Printf(" ....................... " " \n"); PhyML_Printf(" Menu : Branch Support " " \n"); PhyML_Printf(" ............................. " " \n"); PhyML_Printf("\n\n"); PhyML_Printf(" [+] " ".................................... Next sub-menu\n"); PhyML_Printf(" [-] " "................................ Previous sub-menu\n"); PhyML_Printf(" [Y] " ".............................. Launch the analysis\n"); PhyML_Printf("\n"); strcpy(s, (io->do_boot || io->do_tbe) ? ("yes") : ("no")); if (io->n_boot_replicates > 0) sprintf(s + strlen(s), " (%d replicate%s%s)", io->n_boot_replicates, (io->n_boot_replicates > 1) ? ("s") : (""), (io->do_tbe) ? (", TBE") : ("")); /* PhyML_Printf(" [+] " */ PhyML_Printf(" [B] " "................ Non parametric bootstrap analysis " " %-15s \n", s); if (io->ratio_test == 0) { strcpy(s, "no"); } else if (io->ratio_test == 1) { strcpy(s, "yes / aLRT statistics"); } else if (io->ratio_test == 2) { strcpy(s, "yes / Chi2-based supports"); } else if (io->ratio_test == 3) { strcpy(s, "yes / min of SH-like & Chi2-based supports"); } else if (io->ratio_test == 4) { strcpy(s, "yes / SH-like supports"); } else if (io->ratio_test == 5) { strcpy(s, "yes / aBayes supports"); } /* PhyML_Printf(" [+] " */ PhyML_Printf(" [A] " "................ Approximate likelihood ratio test " " %-15s \n", s); PhyML_Printf("\n. Are these settings correct ? " "(type '+', '-', 'Y' or other letter for one to change) "); if (!scanf("%c", &choix)) Exit("\n"); if (choix != '\n') getchar(); /* \n */ Uppercase(&choix); Free(s); switch (choix) { /* case '\n': */ /* { */ /* io->curr_interface++; */ /* break; */ /* } */ case 'B': { if (io->n_boot_replicates > 0) io->n_boot_replicates = 0; else { char *r; char answer; int n_trial; answer = 0; io->ratio_test = 0; if (io->n_data_sets > 1) { PhyML_Printf( "\n. Bootstrap option is not allowed with multiple data sets.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if (!scanf("%c", &choix)) Exit("\n"); Exit("\n"); } PhyML_Printf("\n. Number of replicates > "); r = (char *)mCalloc(T_MAX_OPTION, sizeof(char)); Getstring_Stdin(r); n_trial = 0; while ((!atoi(r)) || (atoi(r) < 0)) { if (++n_trial > 10) Exit("\n== Err : the number of replicates must be a positive " "integer\n"); PhyML_Printf("\n. The number of replicates must be a positive integer"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(r); } io->n_boot_replicates = atoi(r); PhyML_Printf("\n. Print bootstrap trees (and statistics) ? (%s) > ", (io->print_boot_trees) ? ("Y/n") : ("y/N")); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = (io->print_boot_trees) ? ('Y') : ('N'); else getchar(); switch (answer) { case 'Y': case 'y': { io->print_boot_trees = 1; strcpy(io->out_boot_tree_file, io->in_align_file); strcat(io->out_boot_tree_file, "_phyml_boot_trees.txt"); io->fp_out_boot_tree = Openfile(io->out_boot_tree_file, 1); strcpy(io->out_boot_stats_file, io->in_align_file); strcat(io->out_boot_stats_file, "_phyml_boot_stats.txt"); io->fp_out_boot_stats = Openfile(io->out_boot_stats_file, 1); break; } case 'N': case 'n': { io->print_boot_trees = 0; io->fp_out_boot_tree = NULL; io->fp_out_boot_stats = NULL; break; } } PhyML_Printf("\n. Compute TBE instead of FBP ? (%s) > ", (io->do_tbe) ? ("Y/n") : ("y/N")); if (!scanf("%c", &answer)) Exit("\n"); if (answer == '\n') answer = (io->do_tbe) ? ('Y') : ('N'); else getchar(); switch (answer) { case 'Y': case 'y': { io->do_tbe = YES; io->do_boot = NO; break; } case 'N': case 'n': { io->do_tbe = NO; io->do_boot = YES; break; } } Free(r); } break; } case 'A': { io->do_boot = NO; io->do_tbe = NO; io->do_alrt = YES; io->n_boot_replicates = 0; switch (io->ratio_test) { case 0: { io->ratio_test = 1; break; } case 1: { io->ratio_test = 2; break; } case 2: { /* io->ratio_test = 3; */ io->ratio_test = 4; break; } case 3: { io->ratio_test = 4; break; } case 4: { io->ratio_test = 5; break; } case 5: { io->ratio_test = 0; break; } } break; } case '-': { io->curr_interface = INTERFACE_TOPO_SEARCH; break; } case '+': { io->curr_interface = INTERFACE_DATA_TYPE; break; } case 'Y': { io->ready_to_go = 1; break; } default: break; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Multigene(option *io) { #ifdef PART if ((io->n_data_sets > 1) && (io->multigene)) { int set, n_trial; char choix; io->n_part = io->n_data_sets; io->st = (supert_tree *)PART_Make_Supert_tree_Light(io); io->st->n_part = io->n_data_sets; for (set = 0; set < io->n_part; set++) { io->st->optionlist[set] = Make_Input(); Set_Defaults_Input(io->st->optionlist[set]); Set_Defaults_Model(io->st->optionlist[set]->mod); Set_Defaults_Optimiz(io->st->optionlist[set]->mod->s_opt); io->st->optionlist[set]->curr_gt = set; PhyML_Printf("\n. Enter the sequence file name [data set %2d] > ", set + 1); fflush(NULL); Getstring_Stdin(io->st->optionlist[set]->in_align_file); io->st->optionlist[set]->fp_in_align = Openfile(io->st->optionlist[set]->in_align_file, 0); } PhyML_Printf("\n. Do you want to use your own initial tree ? [N/y] "); if (!scanf("%c", &choix)) Exit("\n"); if (choix != '\n') getchar(); n_trial = 0; while ((choix != 'Y') && (choix != 'y') && (choix != 'N') && (choix != 'n')) { if (++n_trial > 10) Exit("\n== Err : wrong answers !"); PhyML_Printf("\n. Do you want to use your own initial tree ? [N/y] ? "); if (!scanf("%c", &choix)) Exit("\n"); if (choix == '\n') choix = 'N'; else getchar(); } switch (choix) { case '\n': break; case 'Y': case 'y': { io->in_tree = 2; PhyML_Printf("\n. Enter the name of the tree file > "); Getstring_Stdin(io->in_tree_file); io->fp_in_tree = Openfile(io->in_tree_file, 0); break; } case 'N': case 'n': { io->in_tree = 0; break; } default: break; } io->curr_gt = 0; do { io->st->optionlist[io->curr_gt]->config_multigene = 1; do { switch (io->st->optionlist[io->curr_gt]->curr_interface) { case INTERFACE_DATA_TYPE: { Launch_Interface_Data_Type(io->st->optionlist[io->curr_gt]); break; } case INTERFACE_MODEL: { Launch_Interface_Model(io->st->optionlist[io->curr_gt]); break; } default: { PhyML_Printf("\n== Err in file %s at line %d\n\n", __FILE__, __LINE__); Exit(""); break; } } } while (!io->st->optionlist[io->curr_gt]->ready_to_go); io->curr_gt++; } while (io->curr_gt < io->n_part); } io->ready_to_go = 1; PART_Fill_Model_Partitions_Table(io->st); #endif } stephaneguindon-phyml-76a39c8/src/interface.h000066400000000000000000000013361501136442400213050ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef INTERFACE_H #define INTERFACE_H #include "utilities.h" void Launch_Interface(option *input); void Clear(void); void Launch_Interface_Input(option *input); void Launch_Interface_Data_Type(option *input); void Launch_Interface_Model(option *input); void Launch_Interface_Topo_Search(option *input); void Launch_Interface_Branch_Support(option *input); void Launch_Interface_Multigene(option *input); #endif stephaneguindon-phyml-76a39c8/src/invitee.c000066400000000000000000002765471501136442400210250ustar00rootroot00000000000000#include "spr.h" #include "utilities.h" #include "lk.h" #include "optimiz.h" #include "bionj.h" #include "models.h" #include "free.h" #include "help.h" #include "simu.h" #include "eigen.h" #include "pars.h" #include "alrt.h" #include "mixt.h" #include "invitee.h" #ifdef MPI #include "mpi_boot.h" #endif #include ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PhyTime_XML(char *xml_file) { FILE *f; char **clade, *clade_name, **mon_list; phydbl low, up; int i, j, n_taxa, clade_size, node_num, n_mon; //rnd_num xml_node *n_r, *n_t, *n_m, *n_cur; t_cal *last_calib; align **data, **c_seq; option *io; calign *cdata; t_opt *s_opt; t_mod *mod; time_t t_beg,t_end; int r_seed; char *most_likely_tree; int user_lk_approx; t_tree *tree; t_node **a_nodes; //*node; m4 *m4mod; srand(time(NULL)); i = 0; j = 0; last_calib = NULL; mod = NULL; most_likely_tree = NULL; n_taxa = 0; node_num = -1; //file can/cannot be open: if ((f =(FILE *)fopen(xml_file, "r")) == NULL) { PhyML_Printf("\n== File '%s' can not be opened...\n",xml_file); Exit("\n"); } n_r = XML_Load_File(f); //memory allocation for model parameters: io = (option *)Make_Input(); mod = (t_mod *)Make_Model_Basic(); s_opt = (t_opt *)Make_Optimiz(); m4mod = (m4 *)M4_Make_Light(); Set_Defaults_Input(io); Set_Defaults_Model(mod); Set_Defaults_Optimiz(s_opt); io -> mod = mod; mod = io -> mod; mod -> s_opt = s_opt; clade_size = -1; //////////////////////////////////////////////////////////////////////////// //////////////////////reading tree topology://////////////////////////////// //looking for a node n_t = XML_Search_Node_Name("topology", YES, n_r); //setting tree: /* tree = (t_tree *)mCalloc(1,sizeof(t_tree)); */ n_cur = XML_Search_Node_Name("instance", YES, n_t); if(n_cur != NULL) { if(XML_Search_Attribute(n_cur, "user.tree") != NULL) { strcpy(io -> out_tree_file, XML_Search_Attribute(n_cur, "user.tree") -> value); io -> fp_out_tree = Openfile(io -> out_tree_file, 1); io -> tree = Read_Tree_File_Phylip(io -> fp_in_tree); } else { PhyML_Printf("\n== No input tree was not found. \n"); PhyML_Printf("\n== Please specify either a tree file name or enter the whole tree directly in the XML file (in Newick format). \n"); Exit("\n"); } } else io -> tree = Read_Tree(&n_t -> value); io -> n_otu = io -> tree -> n_otu; tree = io -> tree; //setting initial values to n_calib: For(i, 2 * tree -> n_otu - 2) { tree -> a_nodes[i] -> n_calib = 0; //PhyML_Printf("\n. '%d' \n", tree -> a_nodes[i] -> n_calib); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //memory for nodes: a_nodes = (t_node **)mCalloc(2 * io -> n_otu - 1,sizeof(t_node *)); For(i, 2 * io -> n_otu - 2) a_nodes[i] = (t_node *)mCalloc(1,sizeof(t_node)); //setting a model: tree -> rates = RATES_Make_Rate_Struct(io -> n_otu); RATES_Init_Rate_Struct(tree -> rates, io -> rates, tree -> n_otu); tree -> times = TIMES_Make_Time_Struct(io -> n_otu); TIMES_Init_Time_Struct(tree -> times, io -> times, tree -> n_otu); //reading seed: if(XML_Search_Attribute(n_r, "seed")) io -> r_seed = String_To_Dbl(XML_Search_Attribute(n_r, "seed") -> value); //TO DO: check that the tree has a root Update_Ancestors(io -> tree -> n_root, io -> tree -> n_root -> v[2], io -> tree -> n_root -> b[2], io -> tree); Update_Ancestors(io -> tree -> n_root, io -> tree -> n_root -> v[1], io -> tree -> n_root -> b[1], io -> tree); //////////////////////////////////////////////////////////////////////////// //////////////////////memory allocation for temp parameters///////////////// //memory for monitor flag: io -> mcmc -> monitor = (int *)mCalloc(2 * io -> n_otu - 1,sizeof(int)); //memory for sequences: n_cur = XML_Search_Node_Name("alignment", YES, n_r); data = (align **)mCalloc(io -> n_otu,sizeof(align *)); For(i, io -> n_otu) { data[i] = (align *)mCalloc(1,sizeof(align)); data[i] -> name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); if(n_cur -> child -> value != NULL) data[i] -> state = (char *)mCalloc(strlen(n_cur -> child -> value) + 1,sizeof(char)); else data[i] -> state = (char *)mCalloc(T_MAX_SEQ,sizeof(char)); } io -> data = data; //tree -> data = data; //memory for clade: clade_name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); //memory for list of clades to be monitored mon_list = (char **)mCalloc(T_MAX_FILE,sizeof(char *)); For(i, T_MAX_FILE) { mon_list[i] = (char *)mCalloc(T_MAX_NAME,sizeof(char)); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //reading monitor node: i = 0; n_m = XML_Search_Node_Name("monitor", YES, n_r); if(n_m != NULL) { do { strcpy(mon_list[i], n_m -> child -> attr -> value); i++; if(n_m -> child) n_m -> child = n_m -> child -> next; else break; } while(n_m -> child); n_mon = i; } else { n_mon = 0; PhyML_Printf("\n. There is no clade to be monitored. \n"); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //chekcing for calibration node (upper or lower bound) to exist: n_cur = XML_Search_Node_Name("calibration", YES, n_r); if(n_cur == NULL) { PhyML_Printf("\n== There is no calibration information provided. \n"); PhyML_Printf("\n== Please check your data. \n"); Exit("\n"); } else { if(XML_Search_Node_Name("upper", NO, n_cur -> child) == NULL && XML_Search_Node_Name("lower", NO, n_cur -> child) == NULL) { PhyML_Printf("\n== There is no calibration information provided. \n"); PhyML_Printf("\n== Please check your data. \n"); Exit("\n"); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// n_r = n_r -> child; tree -> rates -> tot_num_cal = 0; do { if(!strcmp(n_r -> name, "alignment"))//looking for a node . { if(!n_r -> attr -> value) { PhyML_Printf("\n== Sequence type (nt / aa) must be provided. \n"); PhyML_Printf("\n== Please, include this information as an attribute of component <%s>. \n", n_r -> name); Exit("\n"); } char *s; s = To_Upper_String(n_r -> attr -> value); /* if(!strcmp(To_Upper_String(n_r -> attr -> value), "NT")) */ if(!strcmp(s, "NT")) { io -> datatype = 0; io -> mod -> ns = 4; } /* if(!strcmp(To_Upper_String(n_r -> attr -> value), "AA")) */ if(!strcmp(s, "AA")) { io -> datatype = 1; io -> mod -> ns = 20; } free(s); n_cur = XML_Search_Node_Name("instance", YES, n_r); if(n_cur != NULL) { if(XML_Search_Attribute(n_cur, "user.alignment") != NULL) { strcpy(io -> in_align_file, XML_Search_Attribute(n_cur, "user.alignment") -> value); io -> fp_in_align = Openfile(io -> in_align_file, 1); Detect_Align_File_Format(io); io -> data = Get_Seq(io); } } else { char *s; i = 0; s = To_Upper_String(n_r -> child -> value); do { strcpy(io -> in_align_file, "invitee"); strcpy(io -> data[i] -> name, n_r -> child -> attr -> value); /* strcpy(io -> data[i] -> state, To_Upper_String(n_r -> child -> value)); */ strcpy(io -> data[i] -> state, s); i++; if(n_r -> child -> next) n_r -> child = n_r -> child -> next; else break; } while(n_r -> child); n_taxa = i; free(s); } //checking if a sequences of the same lengths: i = 1; For(i, n_taxa) if(strlen(io -> data[0] -> state) != strlen(io -> data[i] -> state)) { PhyML_Printf("\n== All the sequences should be of the same length. Please check your data...\n"); Exit("\n"); break; } //checking sequence names: i = 0; For(i, n_taxa) Check_Sequence_Name(io -> data[i] -> name); //check if a number of tips is equal to a number of taxa: if(n_taxa != io -> n_otu) { PhyML_Printf("\n== The number of taxa is not the same as a number of tips. Check your data...\n"); Exit("\n"); } //deleting '-', etc. from sequences: io -> data[0] -> len = strlen(io -> data[0] -> state); Post_Process_Data(io); n_r = n_r -> next; } else if(!strcmp(n_r -> name, "calibration"))//looking for a node . { tree -> rates -> tot_num_cal++; if (tree -> rates -> calib == NULL) tree -> rates -> calib = Make_Calib(tree -> n_otu); if(last_calib) { last_calib -> next = tree -> rates -> calib; tree -> rates -> calib -> prev = last_calib; } last_calib = tree -> rates -> calib; low = -BIG; up = BIG; n_cur = XML_Search_Node_Name("lower", YES, n_r); if(n_cur != NULL) low = String_To_Dbl(n_cur -> value); n_cur = XML_Search_Node_Name("upper", YES, n_r); if(n_cur != NULL) up = String_To_Dbl(n_cur -> value); do { if(!strcmp("appliesto", n_r -> child -> name)) { //case of internal node: strcpy(clade_name, n_r -> child -> attr -> value);//reached clade names n_r -> child -> attr -> value if(!strcmp("root", clade_name)) { node_num = io -> tree -> n_root -> num; } else if(strcmp("NO_CLADE", clade_name) && strcmp("root", clade_name)) { xml_node *n_clade, *nd2; nd2 = n_r -> parent; n_clade = XML_Search_Node_Generic("clade", "id", clade_name, YES, nd2); if(n_clade) //found clade with a given name { i = 0; xml_node *nd; nd = n_clade -> child; clade = XML_Read_Clade(nd, tree); clade_size = XML_Number_Of_Taxa_In_Clade(nd); node_num = Find_Clade(clade, clade_size, io -> tree); } else { PhyML_Printf("\n== The calibration information for clade [%s] was not found.", clade_name); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } } if(strcmp("NO_CLADE", clade_name)) { For(j, n_mon) { if(!strcmp(clade_name, mon_list[j])) io -> mcmc -> monitor[node_num] = YES; } } if(strcmp("NO_CLADE", clade_name)) { tree -> rates -> calib -> proba[node_num] = String_To_Dbl(n_r -> child -> attr -> next -> value); if(!n_r -> child -> attr -> next && n_r -> child -> next == NULL) tree -> rates -> calib -> proba[node_num] = 1.; if(!n_r -> child -> attr -> next && n_r -> child -> next) { PhyML_Printf("\n== You either need to provide information about the probability with which calibration "); PhyML_Printf("\n== applies to a node or you need to apply calibration only to one node."); PhyML_Printf("\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } tree -> rates -> calib -> all_applies_to[tree -> rates -> calib -> n_all_applies_to] -> num = node_num; } else tree -> rates -> calib -> proba[2 * tree -> n_otu - 1] = String_To_Dbl(n_r -> child -> attr -> next -> value); tree -> rates -> calib -> n_all_applies_to++; tree -> rates -> calib -> lower = low; tree -> rates -> calib -> upper = up; PhyML_Printf("\n. Lower bound: %f.", low); PhyML_Printf("\n. Upper bound: %f.", up); ///////////////////////////////////////////////////////////////////////////////////////////////////// PhyML_Printf("\n. ......................................................................."); PhyML_Printf("\n"); if(strcmp(clade_name, "NO_CLADE")) PhyML_Printf("\n. Clade name: [%s]", clade_name); else { PhyML_Printf("\n. Calibration with:"); PhyML_Printf("\n. Lower bound set to: %15f time units.", low); PhyML_Printf("\n. Upper bound set to: %15f time units.", up); PhyML_Printf("\n. does not apply to any node with probability [%f]", String_To_Dbl(n_r -> child -> attr -> next -> value)); PhyML_Printf("\n. ......................................................................."); } if(strcmp(clade_name, "root") && strcmp(clade_name, "NO_CLADE")) { For(i, clade_size) PhyML_Printf("\n. Taxon name: [%s]", clade[i]); } if(strcmp(clade_name, "NO_CLADE")) { PhyML_Printf("\n. Node number to which calibration applies to is [%d] with probability [%f]", node_num, String_To_Dbl(n_r -> child -> attr -> next -> value)); PhyML_Printf("\n. Lower bound set to: %15f time units.", low); PhyML_Printf("\n. Upper bound set to: %15f time units.", up); PhyML_Printf("\n. ......................................................................."); } ///////////////////////////////////////////////////////////////////////////////////////////////////// if(n_r -> child -> next) n_r -> child = n_r -> child -> next; else break; } else if(n_r -> child -> next) n_r -> child = n_r -> child -> next; else break; } while(n_r -> child); tree -> rates -> calib = tree -> rates -> calib -> next; n_r = n_r -> next; } else if(!strcmp(n_r -> name, "ratematrices"))//initializing rate matrix: { if(n_r -> child) { Make_Ratematrice_From_XML_Node(n_r -> child, io, mod); n_r = n_r -> next; } else n_r = n_r -> next; } else if(!strcmp(n_r -> name, "equfreqs"))//initializing frequencies: { if(n_r -> child) { Make_Efrq_From_XML_Node(n_r -> child , io, mod); n_r = n_r -> next; } else n_r = n_r -> next; } else if(!strcmp(n_r -> name, "siterates"))//initializing site rates: { if(n_r -> child) { Make_RAS_From_XML_Node(n_r, io -> mod); n_r = n_r -> next; } else n_r = n_r -> next; } else if (n_r -> next) n_r = n_r -> next; else break; } while(1); tree -> rates -> calib = last_calib; while(tree -> rates -> calib -> prev) tree -> rates -> calib = tree -> rates -> calib -> prev; //////////////////////////////////////////////////////////////////////////////////////////////// //Check for the sum of probabilities for one calibration add up to one do { phydbl p = 0.0; for(i = tree -> n_otu; i < 2 * tree -> n_otu; i++) { p = p + tree -> rates -> calib -> proba[i]; /* PhyML_Printf("\n. # applies to %d \n", tree -> rates -> calib -> n_all_applies_to); */ /* PhyML_Printf("\n. %f \n", tree -> rates -> calib -> proba[i]); */ } if(!Are_Equal(p, 1.0, 1.E-10)) { PhyML_Printf("\n. ......................................................................."); PhyML_Printf("\n. WARNING! The sum of the probabilities for the calibration with:"); PhyML_Printf("\n. Lower bound set to: %15f time units.", tree -> rates -> calib -> lower); PhyML_Printf("\n. Upper bound set to: %15f time units.", tree -> rates -> calib -> upper); PhyML_Printf("\n. is not equal to 1."); PhyML_Printf("\n. The probability that this calibration does not apply to any node is set to [%f].", 1.0 - p); PhyML_Printf("\n. ......................................................................."); tree -> rates -> calib -> proba[2 * tree -> n_otu - 1] = 1.0 - p; tree -> rates -> calib -> n_all_applies_to++; /* PhyML_Printf("\n==You need to provide proper probabilities for the calibration. \n"); */ /* PhyML_Printf("\n. Err. in file %s at line %d\n",__FILE__,__LINE__); */ /* Exit("\n"); */ } if(tree -> rates -> calib -> next) tree -> rates -> calib = tree -> rates -> calib -> next; else break; } while(tree -> rates -> calib); while(tree -> rates -> calib -> prev) tree -> rates -> calib = tree -> rates -> calib -> prev; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //clear memory: free(clade_name); For(i, tree -> n_otu) { free(clade[i]); } free(clade); For(i, T_MAX_FILE) { free(mon_list[i]); } free(mon_list); /* do */ /* { */ /* printf("\n %f %f \n", tree -> rates -> calib -> lower, tree -> rates -> calib -> upper); */ /* printf("\n numb applies to: %d \n", tree -> rates -> calib -> n_all_applies_to); */ /* For(i, tree -> rates -> calib -> n_all_applies_to) printf("\n Node number %d \n", tree -> rates -> calib -> all_applies_to[i] -> num); */ /* if(tree -> rates -> calib -> next) tree -> rates -> calib = tree -> rates -> calib -> next; */ /* else break; */ /* } */ /* while(tree -> rates -> calib); */ /* while(tree -> rates -> calib -> prev) tree -> rates -> calib = tree -> rates -> calib -> prev; */ /* Exit("\n"); */ //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //START analysis: r_seed = (io -> r_seed < 0)?(time(NULL)):(io -> r_seed); srand(r_seed); rand(); PhyML_Printf("\n. Seed: %d\n", r_seed); PhyML_Printf("\n. Pid: %d\n",getpid()); PhyML_Printf("\n. Compressing sequences...\n"); data = io -> data; data[0] -> len = strlen(data[0] -> state); //////////////////////////////////////////////////////////////////////////// //memory for compressed sequences: cdata = (calign *)mCalloc(1,sizeof(calign)); c_seq = (align **)mCalloc(io -> n_otu,sizeof(align *)); For(i, io -> n_otu) { c_seq[i] = (align *)mCalloc(1,sizeof(align)); c_seq[i] -> name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); c_seq[i] -> state = (char *)mCalloc(data[0] -> len + 1,sizeof(char)); } cdata -> c_seq = c_seq; //////////////////////////////////////////////////////////////////////////// cdata = Compact_Data(data, io); Free_Seq(io -> data, cdata -> n_otu); io -> mod -> io = io; Check_Ambiguities(cdata, io -> mod -> io -> datatype, io -> state_len); Make_Model_Complete(mod); Init_Model(cdata, mod, io); if(io -> mod -> use_m4mod) M4_Init_Model(mod -> m4mod, cdata, mod); time(&(t_beg)); RATES_Fill_Lca_Table(tree); tree->mod = mod; tree->io = io; tree->data = cdata; tree->data->n_pattern = tree->data->n_pattern / tree->io->state_len; Set_Both_Sides(YES, tree); Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Make_Spr(tree); //calculate the probabilities of each combination of calibrations: TIMES_Calib_Partial_Proba(tree); int cal_numb = 0; do { if(!Are_Equal(tree -> rates -> times_partial_proba[cal_numb], 0.0, 1.E-10)) break; else cal_numb += 1; } while(1); PhyML_Printf("\n. Calibration number chosen %d.\n", cal_numb); Set_Current_Calibration(cal_numb, tree); tree -> rates -> numb_calib_chosen[cal_numb]++; int tot_num_comb; tot_num_comb = Number_Of_Comb(tree -> rates -> calib); PhyML_Printf("\n. The number of calibration combinations that is going to be considered is %d.\n", tot_num_comb); /* For(i, tot_num_comb) Set_Current_Calibration(i, tree); */ /* Exit("\n"); */ //set initial value for Hastings ratio for conditional jump: /* tree -> rates -> c_lnL_Hastings_ratio = 0.0; */ TIMES_Set_All_Node_Priors(tree); tree -> rates -> cur_comb_numb = cal_numb; tree -> rates -> log_K_cur = K_Constant_Prior_Times_Log(tree); TIMES_Get_Number_Of_Time_Slices(tree); TIMES_Label_Edges_With_Calibration_Intervals(tree); tree -> write_br_lens = NO; PhyML_Printf("\n. Input tree with calibration information ('almost' compatible with MCMCtree).\n"); char *t; t = Write_Tree(tree, YES); PhyML_Printf("\n. %s \n", t); free(t); tree -> write_br_lens = YES; // Work with log of branch lengths? if(tree -> mod -> log_l == YES) Log_Br_Len(tree); if(io -> mcmc -> use_data == YES) { // Force the exact likelihood score user_lk_approx = tree -> io -> lk_approx; tree -> io -> lk_approx = EXACT; /* MLE for branch lengths */ /* printf("\n. %s",Write_Tree(tree,NO)); */ /* printf("\n. alpha %f",tree->mod->ras->alpha->v); */ /* printf("\n. %f %f %f %f",tree->mod->e_frq->pi->v[0],tree->mod->e_frq->pi->v[1],tree->mod->e_frq->pi->v[2],tree->mod->e_frq->pi->v[3]); */ /* Lk(NULL,tree); */ /* printf("\n. %f",tree->c_lnL); */ /* Exit("\n"); */ Round_Optimize(tree, tree -> data, ROUND_MAX); // Set vector of mean branch lengths for the Normal approximation of the likelihood RATES_Set_Mean_L(tree); // Estimate the matrix of covariance for the Normal approximation of the likelihood PhyML_Printf("\n"); PhyML_Printf("\n. Computing Hessian..."); tree -> rates -> bl_from_rt = 0; Free(tree -> rates -> cov_l); tree -> rates -> cov_l = Hessian_Seo(tree); // tree->rates->cov_l = Hessian_Log(tree); For(i, (2 * tree -> n_otu - 3) * (2 * tree -> n_otu - 3)) tree -> rates -> cov_l[i] *= -1.0; if(!Iter_Matinv(tree -> rates -> cov_l, 2 * tree -> n_otu - 3, 2 * tree -> n_otu - 3, YES)) Exit("\n"); tree -> rates -> covdet = Matrix_Det(tree -> rates -> cov_l, 2 * tree -> n_otu - 3, YES); For(i,(2 * tree -> n_otu - 3) * (2 * tree -> n_otu - 3)) tree -> rates -> invcov[i] = tree -> rates -> cov_l[i]; if(!Iter_Matinv(tree -> rates -> invcov, 2 * tree -> n_otu - 3, 2 * tree -> n_otu - 3, YES)) Exit("\n"); tree -> rates -> grad_l = Gradient(tree); // Pre-calculation of conditional variances to speed up calculations RATES_Bl_To_Ml(tree); RATES_Get_Conditional_Variances(tree); RATES_Get_All_Reg_Coeff(tree); RATES_Get_Trip_Conditional_Variances(tree); RATES_Get_All_Trip_Reg_Coeff(tree); Lk(NULL, tree); PhyML_Printf("\n"); PhyML_Printf("\n. p(data|model) [exact ] ~ %.2f",tree -> c_lnL); tree -> io -> lk_approx = NORMAL; For(i,2 * tree -> n_otu - 3) tree -> rates -> u_cur_l[i] = tree -> rates -> mean_l[i] ; tree -> c_lnL = Lk(NULL,tree); PhyML_Printf("\n. p(data|model) [approx] ~ %.2f",tree -> c_lnL); tree -> io -> lk_approx = user_lk_approx; } tree -> rates -> model = io -> rates -> model; PhyML_Printf("\n. Selected model '%s' \n", RATES_Get_Model_Name(io -> rates -> model)); if(tree -> rates -> model == GUINDON) tree -> mod -> gamma_mgf_bl = YES; tree -> rates -> bl_from_rt = YES; if(tree -> io -> cstr_tree) Find_Surviving_Edges_In_Small_Tree(tree, tree -> io -> cstr_tree); time(&t_beg); tree -> mcmc = MCMC_Make_MCMC_Struct(); MCMC_Copy_MCMC_Struct(tree -> io -> mcmc, tree -> mcmc, "phytime"); tree -> mod -> m4mod = m4mod; MCMC_Complete_MCMC(tree -> mcmc, tree); tree -> mcmc -> is_burnin = NO; MCMC(tree); PhyML_Printf("\n"); for(i=0;i<6;i++) printf(" %d ", tree -> rates -> numb_calib_chosen[i]); PhyML_Printf("\n"); MCMC_Close_MCMC(tree -> mcmc); MCMC_Free_MCMC(tree -> mcmc); PhyML_Printf("\n"); Free_Calib(tree -> rates -> calib); Add_Root(tree->a_edges[0],tree); Free_Tree_Pars(tree); Free_Tree_Lk(tree); Free_Tree(tree); Free_Calign(cdata); Free_Model(mod); if(io -> fp_in_align) fclose(io -> fp_in_align); if(io -> fp_in_tree) fclose(io -> fp_in_tree); if(io -> fp_out_lk) fclose(io -> fp_out_lk); if(io -> fp_out_tree) fclose(io -> fp_out_tree); if(io -> fp_out_trees) fclose(io -> fp_out_trees); if(io -> fp_out_stats) fclose(io -> fp_out_stats); fclose(f); Free(most_likely_tree); Free_Input(io); time(&t_end); Print_Time_Info(t_beg,t_end); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Calculate the prior probability for node times taking into account the //probailitis with which each calibration applies to the particular node. phydbl TIMES_Calib_Cond_Prob(t_tree *tree) { phydbl times_lk, *Yule_val, *times_partial_proba, times_tot_proba, c, constant, ln_t; int i, tot_num_comb; t_cal *calib; times_tot_proba = 0.0; calib = tree -> rates -> calib; times_partial_proba = tree -> rates -> times_partial_proba; tot_num_comb = Number_Of_Comb(calib); Yule_val = (phydbl *)mCalloc(tot_num_comb, sizeof(phydbl)); For(i, tot_num_comb) { Set_Current_Calibration(i, tree); int result; result = TRUE; TIMES_Set_All_Node_Priors_S(&result, tree); times_lk = TIMES_Lk_Yule_Order_Root_Cond(tree); constant = 0.0; if(tot_num_comb > 1 && times_lk > -INFINITY && result != FALSE && tree->rates->update_time_norm_const == YES) Yule_val[i] = constant + times_lk; while(calib -> prev) calib = calib -> prev; } /* Exit("\n"); */ c = .0; times_tot_proba = 0.0; For(i, tot_num_comb) { times_tot_proba += times_partial_proba[i] * exp(Yule_val[i] + c); } ln_t = -c + log(times_tot_proba); free(Yule_val); return(ln_t); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //Function calculates the normalizing constant K of the joint distribution Yule_Order. //Use the fact that density Yule_Order can be used streight forward only in case of the complete //overlap of the calibration intervals for all of the nodes or in case of no overlap. phydbl K_Constant_Prior_Times_Log(t_tree *tree) { int i, j, k, f, n_otu, *indic, *n_slice, *slice_numbers; phydbl buf, chop_bound, *t_prior_min, *t_prior_max, *t_slice, *t_slice_min, *t_slice_max, *g_i_node; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; n_otu = tree -> n_otu; t_slice = (phydbl *)mCalloc(2 * (n_otu - 1), sizeof(phydbl)); //the vector of the union of lower and upper bounds, lined up in incresing order. t_slice_min = (phydbl *)mCalloc(2 * n_otu - 3, sizeof(phydbl)); //vector of the lower bounds of the sliced intervals. t_slice_max = (phydbl *)mCalloc(2 * n_otu - 3, sizeof(phydbl)); //vector of the upper bounds of the sliced intervals. indic = (int *)mCalloc((n_otu - 1) * (2 * n_otu - 3), sizeof(int)); //vector of the indicators, columns - node numbers (i + n_otu), rows - the number of the sliced interval. slice_numbers = (int *)mCalloc((n_otu - 1) * (2 * n_otu - 3), sizeof(int )); //vecor of the slice intervals numbers, columns node numbers (i + n_otu), rows - the number of the sliced interval. n_slice = (int *)mCalloc(n_otu - 1, sizeof(int)); //vector of the numbers of sliced intervals that apply to one node with number (i + n_otu). g_i_node = (phydbl *)mCalloc((n_otu - 1) * (2 * n_otu - 3), sizeof(phydbl)); //vector of the values of the function g evaluated for each node. i = 0; /* K = 0; */ j = n_otu; //////////////////////////////////////////////////////////////////////////// //Put prior bounds in one vector t_slice. Excluding tips. For(i, n_otu - 1) { t_slice[i] = t_prior_min[j]; j++; } j = n_otu; for(i = n_otu - 1; i < 2 * n_otu - 3; i++) { t_slice[i] = t_prior_max[j]; j++; } if(tree -> rates -> nd_t[tree -> n_root -> num] > t_prior_min[tree -> n_root -> num]) chop_bound = MIN(tree -> rates -> nd_t[tree -> n_root -> num], t_prior_max[tree -> n_root -> num]); else chop_bound = t_prior_min[tree -> n_root -> num]; t_slice[2 * n_otu - 3] = chop_bound; //////////////////////////////////////////////////////////////////////////// //Get slices in increasing order. Excluding tips. do { f = NO; For(j, 2 * n_otu - 3) { if(t_slice[j] > t_slice[j + 1]) { buf = t_slice[j]; t_slice[j] = t_slice[j + 1]; t_slice[j + 1] = buf; f = YES; } } } while(f); for(j = 1; j < 2 * n_otu - 2; j++) t_slice[j] = MAX(chop_bound, t_slice[j]); //////////////////////////////////////////////////////////////////////////// //Get the intervals with respect to slices. Total number of t_slice_min(max) - 2 * n_otu - 3. Excluding tips. i = 0; For(j, 2 * n_otu - 3) { t_slice_min[j] = t_slice[i]; t_slice_max[j] = t_slice[i + 1]; i++; } //////////////////////////////////////////////////////////////////////////// //Getting indicators for the node number [i + n_otu] to have slice. i = i + n_otu is the node number on the tree and j is the slice number, total //number of intervals is 2 * n_otu - 3. Excluding tips. For(i, n_otu - 1) { For(j, 2 * n_otu - 3) { if(Are_Equal(t_prior_min[i + n_otu], t_slice_min[j], 1.E-10) && t_prior_max[i + n_otu] > t_slice_max[j] && t_prior_min[i + n_otu] < t_slice_max[j] && !Are_Equal(t_slice_max[j], t_slice_min[j], 1.E-10)) indic[i * (2 * n_otu - 3) + j] = 1; else if(Are_Equal(t_prior_max[i + n_otu], t_slice_max[j], 1.E-10) && t_prior_min[i + n_otu] < t_slice_min[j] && t_prior_max[i + n_otu] > t_slice_min[j] && !Are_Equal(t_slice_max[j], t_slice_min[j], 1.E-10)) indic[i * (2 * n_otu - 3) + j] = 1; else if(t_prior_min[i + n_otu] < t_slice_min[j] && t_prior_max[i + n_otu] > t_slice_max[j] && !Are_Equal(t_slice_max[j], t_slice_min[j], 1.E-10)) indic[i * (2 * n_otu - 3) + j] = 1; else if(Are_Equal(t_prior_min[i + n_otu], t_slice_min[j], 1.E-10) && Are_Equal(t_prior_max[i + n_otu], t_slice_max[j], 1.E-10)) indic[i * (2 * n_otu - 3) + j] = 1; } } For(i, n_otu - 2) { indic[i * (2 * n_otu - 3)] = 0; } for(j = 1; j < 2 * n_otu - 3; j++) { indic[(n_otu - 2) * (2 * n_otu - 3) + j] = 0; } /* printf("\n"); */ /* printf(" ", j); */ /* For(j, 2 * n_otu - 3) printf(". '%d' ", j); */ /* printf("\n"); */ /* For(i, n_otu - 1) */ /* { */ /* printf(" ['%d'] ", i + n_otu); */ /* For(j, 2 * n_otu - 3) */ /* { */ /* printf(". '%d' ", indic[i * (2 * n_otu - 3) + j]); */ /* } */ /* printf("\n"); */ /* } */ //////////////////////////////////////////////////////////////////////////// //Running through all of the combinations of slices int *cur_slices, *cur_slices_shr, *cur_slices_cpy, *slices_start_node, shr_num_slices; phydbl *t_cur_slice_min, *t_cur_slice_max; phydbl tot_num_comb; phydbl log_g_i, lmbd; lmbd = tree -> rates -> birth_rate; tot_num_comb = 1; t_cur_slice_min = (phydbl *)mCalloc(n_otu - 1, sizeof(phydbl)); t_cur_slice_max = (phydbl *)mCalloc(n_otu - 1, sizeof(phydbl)); cur_slices = (int *)mCalloc(n_otu - 1, sizeof(int)); //the vector of the current slices with repetition. cur_slices_cpy = (int *)mCalloc(n_otu - 1, sizeof(int)); slices_start_node = (int *)mCalloc(n_otu - 1, sizeof(int)); cur_slices_shr = (int *)mCalloc(n_otu - 1, sizeof(int)); //the vector of the current slices without repetition. //////////////////////////////////////////////////////////////////////////// //Get the number of slices that can be applied for each node and the vectors of slice numbers for each node. For(i, n_otu - 1) { k = 0; For(j, 2 * n_otu - 3) { if(indic[i * (2 * n_otu - 3) + j] == 1) { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// g_i_node[i * (2 * n_otu - 3) + j] = (exp(lmbd * t_slice_max[j]) - exp(lmbd * t_slice_min[j])) / (exp(lmbd * t_prior_max[i + n_otu]) - exp(lmbd * t_prior_min[i + n_otu])); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// slice_numbers[i * (2 * n_otu - 3) + k] = j; n_slice[i]++; k++; } } } /* printf("\n"); */ /* For(i, n_otu - 1) */ /* { */ /* printf(" ['%d'] ", i + n_otu); */ /* For(j, 2 * n_otu - 3) */ /* { */ /* printf(". '%f' ", g_i_node[i * (2 * n_otu - 3) + j]); */ /* } */ /* printf("\n"); */ /* } */ /* printf("\n"); */ /* For(i, n_otu - 1) */ /* { */ /* printf(" ['%d'] ", i + n_otu); */ /* For(j, n_slice[i]) */ /* { */ /* printf(". '%d' ", slice_numbers[i * (2 * n_otu - 3) + j]); */ /* } */ /* printf("\n"); */ /* } */ For(i, n_otu - 1) { tot_num_comb = tot_num_comb * n_slice[i]; } int r, numb_unsuc, max_size, comb_numb, *combinations, *max_combination, numb_approx; /* **combinations; */ phydbl K_total; phydbl *t_slice_min_f, *t_slice_max_f, *K_val_approx; int *root_nodes, *dif; phydbl K_total_cur, max_K_val, scl_const; max_size = 1000000; combinations = (int *)mCalloc(max_size*(n_otu-1), sizeof(int)); max_combination = (int *)mCalloc((n_otu-1), sizeof(int)); t_slice_min_f = (phydbl *)mCalloc(n_otu - 1, sizeof(phydbl)); t_slice_max_f = (phydbl *)mCalloc(n_otu - 1, sizeof(phydbl)); K_val_approx = (phydbl *)mCalloc(max_size, sizeof(phydbl)); root_nodes = (int *)mCalloc(n_otu - 1, sizeof(int)); dif = (int *)mCalloc(n_otu - 1, sizeof(int)); numb_approx = 0; max_K_val = 0; scl_const = 0.0; /* lmbd = 4.0; */ numb_unsuc = 0; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////CALCULATING THE MAXIMUM VALUE OF m_i * g_i FOR ONE COMBINATION OF SLICES://////////////////////////////////////////////////////////////// comb_numb = 0; K_total = 0.0; do { /* printf("\n ____________________________________________________________________________________________________ \n"); */ int x = 0, f = FALSE; For(i, n_otu - 1) { r = rand()%(n_slice[i]); t_slice_min_f[i] = t_slice_min[slice_numbers[i * (2 * n_otu - 3) + r]]; t_slice_max_f[i] = t_slice_max[slice_numbers[i * (2 * n_otu - 3) + r]]; cur_slices[i] = slice_numbers[i * (2 * n_otu - 3) + r]; } For(i, n_otu - 1) { cur_slices_cpy[i] = cur_slices[i]; slices_start_node[i] = cur_slices[i]; } For(i, n_otu - 1) { for(j = i + 1; j < n_otu - 1; j++) { if(cur_slices[i] == cur_slices[j]) cur_slices[j] = -1; } } //For(i, n_otu - 1) printf(" Slice number'%d' \n", cur_slices[i]); shr_num_slices = 0; For(i, n_otu -1) { if(cur_slices[i] >= 0) { cur_slices_shr[shr_num_slices] = cur_slices[i]; shr_num_slices++; } } int result_1; int c = 0; int num_elem; result_1 = TRUE; Check_Time_Slices(tree -> n_root, tree -> n_root -> v[1], &result_1, t_slice_min_f, t_slice_max_f, tree); Check_Time_Slices(tree -> n_root, tree -> n_root -> v[2], &result_1, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. [START] Result '%d' \n", result_1); */ K_total_cur = 0.0; if(result_1 != TRUE) K_total_cur = 0.0; else { int n_1, n_2; num_elem = 0; x = 0; f = FALSE; if(comb_numb > 0) { For(i, comb_numb) { x = 0; For(j, n_otu - 1) { dif[j] = combinations[i*(n_otu-1) + j] - cur_slices_cpy[j]; if(dif[j] == 0) x++; } if(x == n_otu - 1) f = TRUE; } } if(!f) { For(i, n_otu - 1) combinations[comb_numb*(n_otu - 1) + i] = cur_slices_cpy[i]; /* printf("\n"); */ /* printf(" [1][CUR SLICES PROPOSED] "); */ /* printf(" [COMB NUMBER] = [%d] --- ", comb_numb); */ /* For(i, n_otu - 1) printf(". [%d] .", combinations[comb_numb*(n_otu - 1) + i]); */ /* printf("\n"); */ For(i, shr_num_slices) { Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[1], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[2], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); } /* for(i = 0; i < n_otu - 2; i++) printf("\n. [START] Node [%d] Slice_min [%f] Slice_max [%f] \n", i + n_otu, t_slice_min_f[i], t_slice_max_f[i]); */ For(j, num_elem) { n_1 = 0; n_2 = 0; Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[1], &n_1, t_slice_min_f, t_slice_max_f, tree); Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[2], &n_2, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. n_1 [%d] n_2 [%d]\n", n_1, n_2); */ K_total_cur = K_total_cur + log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1); /* printf("\n. K_total_cur [%f] \n", K_total_cur); */ /* printf("\n. [START] log(m_i) [%f] \n", log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1)); */ } /* printf("\n. [START] log(m_i) [%f] \n", K_total_cur); */ /* printf("\n. K_total_cur [%f] \n", K_total_cur); */ log_g_i = 0.0; For(i, n_otu - 2) log_g_i += log_g_i(lmbd, t_slice_max_f[i], t_slice_min_f[i], t_prior_max[i + n_otu], MAX(t_prior_min[i + n_otu],tree->times->nd_t[tree->n_root->num])); /* printf("\n. [START] log(g_i) [%f] \n", log_g_i); */ K_total_cur = exp(K_total_cur + log_g_i + scl_const); if(K_total_cur > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_total_cur; } K_val_approx[numb_approx] = K_total_cur; numb_approx++; /* printf("\n. [APPROX] Approximated constant after start (K_total_cur) = [%f] \n", (K_total_cur)); */ /* printf("\n. [START] m_i * g_i [%f] \n", K_total_cur); */ /* printf("\n. [START] sum(m_i * g_i) = m_i * g_i [%f] \n", K_total_cur); */ /* printf("\n. K of the tree for starting combination of slices [%f] \n", K_total_cur); */ comb_numb++; if(comb_numb > max_size) { combinations = (int *)mRealloc(combinations, max_size*(n_otu - 1) + (n_otu - 1),sizeof(char)); max_size = max_size + 1; } c++; } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* printf("\n. ____________________________________________________________________________________________ \n"); */ phydbl K_part, K_max; int m, n, count; K_max = K_total_cur; /* printf("\n. K_total [%f] \n", K_total); */ do { r = rand()%(n_otu - 1); count = 0; For(m, r) { /* printf("\n. NODE NUMBER ['%d'] \n", m + n_otu); */ For(n, 2 * n_otu - 3) { K_part = 0.0; if(g_i_node[m * (2 * n_otu - 3) + n] > 0) { t_slice_min_f[m] = t_slice_min[n]; t_slice_max_f[m] = t_slice_max[n]; cur_slices_cpy[m] = n; For(i, n_otu - 1) cur_slices[i] = cur_slices_cpy[i]; For(i, n_otu - 1) { for(j = i + 1; j < n_otu - 1; j++) { if(cur_slices[i] == cur_slices[j]) cur_slices[j] = -1; } } shr_num_slices = 0; For(i, n_otu -1) { if(cur_slices[i] >= 0) { cur_slices_shr[shr_num_slices] = cur_slices[i]; shr_num_slices++; } } result_1 = TRUE; Check_Time_Slices(tree -> n_root, tree -> n_root -> v[1], &result_1, t_slice_min_f, t_slice_max_f, tree); Check_Time_Slices(tree -> n_root, tree -> n_root -> v[2], &result_1, t_slice_min_f, t_slice_max_f, tree); if(result_1 != TRUE) K_part = 0.0; else { int n_1, n_2; x = 0; f = FALSE; num_elem = 0; if(comb_numb > 0) { For(i, comb_numb) { x = 0; For(j, n_otu - 1) { dif[j] = combinations[i*(n_otu-1) + j] - cur_slices_cpy[j]; if(dif[j] == 0) x++; } if(x == n_otu - 1) f = TRUE; } } if(!f) { For(i, n_otu - 1) combinations[comb_numb*(n_otu-1) + i] = cur_slices_cpy[i]; /* printf("\n"); */ /* printf(" [2][CUR SLICES PROPOSED] "); */ /* printf(" [COMB NUMBER] = [%d] --- ", comb_numb); */ /* For(i, n_otu - 1) printf(". [%d] .", combinations[comb_numb*(n_otu-1) + i]); */ /* printf("\n"); */ For(i, shr_num_slices) { Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[1], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[2], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); } For(j, num_elem) { n_1 = 0; n_2 = 0; Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[1], &n_1, t_slice_min_f, t_slice_max_f, tree); Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[2], &n_2, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. n_1 [%d] n_2 [%d]\n", n_1, n_2); */ K_part = K_part + log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1); /* printf("\n. [CONT] log(m_i) [%f] \n", log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1)); */ } /* printf("\n. [CONT] log(m_i) [%f] \n", K_part); */ /* printf("\n. K_part [%f] \n", K_part); */ if(K_part > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_part; } log_g_i = 0.0; For(i, n_otu - 2) log_g_i += log_g_i(lmbd, t_slice_max_f[i], t_slice_min_f[i], t_prior_max[i + n_otu], MAX(t_prior_min[i + n_otu],tree->times->nd_t[tree->n_root->num])); /* printf("\n. [START] log(g_i) [%f] \n", log_g_i); */ K_part = exp(K_part + log_g_i + scl_const); if(K_part > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_part; } /* printf("\n. [START] m_i * g_i [%f] \n", K_part); */ K_val_approx[numb_approx] = K_part; numb_approx++; K_total_cur = K_total_cur + K_part; /* printf("\n. [APPROX] Approximated constant after one run (K_part) = [%f] \n", (K_part)); */ /* printf("\n. K_max [%f] K_part [%f] \n", K_max, K_part); */ /* printf("\n. [CONT] sum(m_i * g_i) [%f] \n", K_total_cur); */ if(K_max < K_part) { K_max = K_part; /* For(i, n_otu - 1) slices_start_node[i] = cur_slices_cpy[i]; */ count++; } comb_numb++; if(comb_numb > max_size) { combinations = (int *)mRealloc(combinations, max_size*(n_otu - 1) + (n_otu - 1),sizeof(char)); max_size = max_size + 1; } c++; } } } } } for(m = r; m < n_otu - 1; m++) { For(n, 2 * n_otu - 3) { K_part = 0.0; if(g_i_node[m * (2 * n_otu - 3) + n] > 0) { t_slice_min_f[m] = t_slice_min[n]; t_slice_max_f[m] = t_slice_max[n]; cur_slices_cpy[m] = n; For(i, n_otu - 1) cur_slices[i] = cur_slices_cpy[i]; For(i, n_otu - 1) { for(j = i + 1; j < n_otu - 1; j++) { if(cur_slices[i] == cur_slices[j]) cur_slices[j] = -1; } } shr_num_slices = 0; For(i, n_otu -1) { if(cur_slices[i] >= 0) { cur_slices_shr[shr_num_slices] = cur_slices[i]; shr_num_slices++; } } result_1 = TRUE; Check_Time_Slices(tree -> n_root, tree -> n_root -> v[1], &result_1, t_slice_min_f, t_slice_max_f, tree); Check_Time_Slices(tree -> n_root, tree -> n_root -> v[2], &result_1, t_slice_min_f, t_slice_max_f, tree); if(result_1 != TRUE) K_part = 0.0; else { int n_1, n_2; x = 0; f = FALSE; num_elem = 0; if(comb_numb > 0) { For(i, comb_numb) { x = 0; For(j, n_otu - 1) { dif[j] = combinations[i*(n_otu-1) + j] - cur_slices_cpy[j]; /* dif[j] = combinations[i][j] - cur_slices_cpy[j]; */ if(dif[j] == 0) x++; /* printf(". [%d] ", dif[j]); */ } if(x == n_otu - 1) f = TRUE; } } if(!f) { For(i, n_otu - 1) combinations[comb_numb*(n_otu-1) + i] = cur_slices_cpy[i]; /* printf("\n"); */ /* printf(" [2][CUR SLICES PROPOSED] "); */ /* printf(" [COMB NUMBER] = [%d] --- ", comb_numb); */ /* For(i, n_otu - 1) printf(". [%d] .", combinations[comb_numb*(n_otu-1) + i]); */ /* printf("\n"); */ For(i, shr_num_slices) { Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[1], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[2], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); } For(j, num_elem) { n_1 = 0; n_2 = 0; Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[1], &n_1, t_slice_min_f, t_slice_max_f, tree); Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[2], &n_2, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. n_1 [%d] n_2 [%d]\n", n_1, n_2); */ K_part = K_part + log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1); /* printf("\n. [CONT] log(m_i) [%f] \n", log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1)); */ } /* printf("\n. [CONT] log(m_i) [%f] \n", K_part); */ /* printf("\n. K_part [%f] \n", K_part); */ log_g_i = 0.0; For(i, n_otu - 2) log_g_i += log_g_i(lmbd, t_slice_max_f[i], t_slice_min_f[i], t_prior_max[i + n_otu], MAX(t_prior_min[i + n_otu],tree->times->nd_t[tree->n_root->num])); /* printf("\n. [START] log(g_i) [%f] \n", log_g_i); */ K_part = exp(K_part + log_g_i + scl_const); if(K_part > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_part; } /* printf("\n. [START] m_i * g_i [%f] \n", K_part); */ K_val_approx[numb_approx] = K_part; numb_approx++; K_total_cur = K_total_cur + K_part; /* printf("\n. [APPROX] Approximated constant after one run (K_part) = [%f] \n", (K_part)); */ /* printf("\n. K_max [%f] K_part [%f] \n", K_max, K_part); */ /* printf("\n. [CONT] sum(m_i * g_i) [%f] \n", K_total_cur); */ if(K_max < K_part) { K_max = K_part; /* For(i, n_otu - 1) slices_start_node[i] = cur_slices_cpy[i]; */ count++; } comb_numb++; if(comb_numb > max_size) { combinations = (int *)mRealloc(combinations, max_size*(n_otu - 1) + (n_otu - 1),sizeof(char)); max_size = max_size + 1; } c++; } } } } } if(Are_Equal(count, 0, 1.E-10)) break; } while(1); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// For(m, n_otu - 1) { For(i, n_otu - 1) cur_slices_cpy[i] = max_combination[i]; For(i, n_otu - 1) { t_slice_min_f[i] = t_slice_min[cur_slices_cpy[i]]; t_slice_max_f[i] = t_slice_max[cur_slices_cpy[i]]; } For(n, 2 * n_otu - 3) { K_part = 0.0; if(g_i_node[m * (2 * n_otu - 3) + n] > 0) { t_slice_min_f[m] = t_slice_min[n]; t_slice_max_f[m] = t_slice_max[n]; cur_slices_cpy[m] = n; For(i, n_otu - 1) cur_slices[i] = cur_slices_cpy[i]; For(i, n_otu - 1) { for(j = i + 1; j < n_otu - 1; j++) { if(cur_slices[i] == cur_slices[j]) cur_slices[j] = -1; } } shr_num_slices = 0; For(i, n_otu -1) { if(cur_slices[i] >= 0) { cur_slices_shr[shr_num_slices] = cur_slices[i]; shr_num_slices++; } } result_1 = TRUE; Check_Time_Slices(tree -> n_root, tree -> n_root -> v[1], &result_1, t_slice_min_f, t_slice_max_f, tree); Check_Time_Slices(tree -> n_root, tree -> n_root -> v[2], &result_1, t_slice_min_f, t_slice_max_f, tree); if(result_1 != TRUE) K_part = 0.0; else { int n_1, n_2; x = 0; f = FALSE; num_elem = 0; if(comb_numb > 0) { For(i, comb_numb) { x = 0; For(j, n_otu - 1) { dif[j] = combinations[i*(n_otu-1) + j] - cur_slices_cpy[j]; /* dif[j] = combinations[i][j] - cur_slices_cpy[j]; */ if(dif[j] == 0) x++; /* printf(". [%d] ", dif[j]); */ } if(x == n_otu - 1) f = TRUE; } } if(!f) { For(i, n_otu - 1) combinations[comb_numb*(n_otu-1) + i] = cur_slices_cpy[i]; /* printf("\n"); */ /* printf(" [2][CUR SLICES PROPOSED] "); */ /* printf(" [COMB NUMBER] = [%d] --- ", comb_numb); */ /* For(i, n_otu - 1) printf(". [%d] .", combinations[comb_numb*(n_otu-1) + i]); */ /* printf("\n"); */ For(i, shr_num_slices) { Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[1], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[2], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); } For(j, num_elem) { n_1 = 0; n_2 = 0; Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[1], &n_1, t_slice_min_f, t_slice_max_f, tree); Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[2], &n_2, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. n_1 [%d] n_2 [%d]\n", n_1, n_2); */ K_part = K_part + log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1); /* printf("\n. [CONT] log(m_i) [%f] \n", log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1)); */ } /* printf("\n. [CONT] log(m_i) [%f] \n", K_part); */ /* printf("\n. K_part [%f] \n", K_part); */ log_g_i = 0.0; For(i, n_otu - 2) log_g_i += log_g_i(lmbd, t_slice_max_f[i], t_slice_min_f[i], t_prior_max[i + n_otu], MAX(t_prior_min[i + n_otu],tree->times->nd_t[tree->n_root->num])); /* printf("\n. [START] log(g_i) [%f] \n", log_g_i); */ K_part = exp(K_part + log_g_i + scl_const); if(K_part > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_part; } /* printf("\n. [START] m_i * g_i [%f] \n", K_part); */ K_val_approx[numb_approx] = K_part; numb_approx++; K_total_cur = K_total_cur + K_part; comb_numb++; if(comb_numb > max_size) { combinations = (int *)mRealloc(combinations, max_size*(n_otu - 1) + (n_otu - 1),sizeof(char)); max_size = max_size + 1; } c++; } } } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// K_total = K_total + K_total_cur; /* printf("\n. [APPROX TOTAL] Approximated constant (K_total) = [%f] \n", (K_total)); */ /* printf("\n%G %d", K_total, c); */ if(Are_Equal(c, 0, 1.E-10)) numb_unsuc++; else numb_unsuc = 0; } while(numb_unsuc < 100); /* printf("\n"); */ /* printf("\n. [APPROX TOTAL] log(K_total) = [%f] \n", log(K_total)); */ /* printf("\n. [APPROX TOTAL] log(Constant) = scl_const - log(K_total) = [%f] \n", scl_const - log(K_total)); */ /* printf("\n. [APPROX TOTAL] Approximated constant 1 / (K_total) = [%f] \n", 1 / (K_total)); */ /* printf("\n ____________________________________________________________________________________________________ \n"); */ /* printf("\n. [APPROX TOTAL] Numb_approx = [%d] \n", numb_approx); */ /* printf("\n"); */ /* } */ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// free(combinations); free(max_combination); free(dif); free(t_cur_slice_min); free(t_cur_slice_max); free(cur_slices); free(cur_slices_cpy); free(slices_start_node); free(cur_slices_shr); free(t_slice); free(t_slice_min); free(t_slice_max); free(t_slice_min_f); free(t_slice_max_f); free(indic); free(slice_numbers); free(root_nodes); free(n_slice); free(g_i_node); free(K_val_approx); return(-log(K_total)); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// int Number_Of_Comb_Slices(int m, int num_elem, int *n_slice) { int i, num_comb; i = 0; num_comb = 1; for(i = m; i < num_elem; i++) num_comb = num_comb * n_slice[i]; return(num_comb); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Check the combination of the time slices to be set correctly. void Check_Time_Slices(t_node *a, t_node *d, int *result, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree) { int n_otu; n_otu = tree -> n_otu; d -> anc = a; if(d -> tax) return; else { if(t_cur_slice_max[d -> num - n_otu] < t_cur_slice_max[a -> num - n_otu]) { *result = FALSE; } int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Check_Time_Slices(d, d -> v[i], result, t_cur_slice_min, t_cur_slice_max, tree); } } ////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //Getting the number of nodes on both sides from the node d_start, that are in the slice of that node. void Number_Of_Nodes_In_Slice(t_node *d_start, t_node *d, int *n, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree) { int n_otu; n_otu = tree -> n_otu; if(d -> tax) return; else { if(Are_Equal(t_cur_slice_max[d_start -> num - n_otu], t_cur_slice_max[d -> num - n_otu], 1.E-10) && Are_Equal(t_cur_slice_min[d_start -> num - n_otu], t_cur_slice_min[d -> num - n_otu], 1.E-10)) { (*n)++; int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Number_Of_Nodes_In_Slice(d_start, d -> v[i], n, t_cur_slice_min, t_cur_slice_max, tree); } } } ////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //Returnig the root node in the given slice. void Search_Root_Node_In_Slice(t_node *d_start, t_node *d, int *root_nodes, int *num_elem, phydbl t_slice_min, phydbl t_slice_max, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree) { int j, n_otu, f; j = 0; f = FALSE; n_otu = tree -> n_otu; if(Are_Equal(t_cur_slice_max[d_start -> num - n_otu], t_slice_max, 1.E-10) && Are_Equal(t_cur_slice_min[d_start -> num - n_otu], t_slice_min, 1.E-10)) { For(j, *num_elem) if(d_start -> num - n_otu == (root_nodes[j])) f = TRUE; if(f != TRUE) { (root_nodes[(*num_elem)]) = d_start -> num - n_otu; (*num_elem)++; return; } } else { d -> anc = d_start; if(d -> tax) return; else { if(Are_Equal(t_cur_slice_max[d -> num - n_otu], t_slice_max, 1.E-10) && Are_Equal(t_cur_slice_min[d -> num - n_otu], t_slice_min, 1.E-10)) { (root_nodes[*num_elem]) = d -> num - n_otu; (*num_elem)++; return; } int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Search_Root_Node_In_Slice(d, d -> v[i], root_nodes, num_elem, t_slice_min, t_slice_max, t_cur_slice_min, t_cur_slice_max, tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Factorial(int base) { if(base == 0) return(1); if(base == 1) return(1); return(base * Factorial(base-1)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Calculate the vector of the norm.constants for prior on node times. //The length of the vector is the total number of combinations of calibrations. phydbl *Norm_Constant_Prior_Times(t_tree *tree) { phydbl *log_K_val; int i, tot_num_comb; t_cal *calib; calib = tree -> rates -> calib; tot_num_comb = Number_Of_Comb(calib); log_K_val = (phydbl *)mCalloc(tot_num_comb, sizeof(phydbl)); For(i, tot_num_comb) { Set_Current_Calibration(i, tree); int result = TRUE; TIMES_Set_All_Node_Priors_S(&result, tree); if(result == TRUE) log_K_val[i] = K_Constant_Prior_Times_Log(tree); while(calib -> prev) calib = calib -> prev; } return(log_K_val); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Sets a vector of the partial probabilities for each combination of calibrations void TIMES_Calib_Partial_Proba(t_tree *tree) { phydbl *times_partial_proba, proba, *t_prior_min, *t_prior_max; int i, j, k, tot_num_comb; t_cal *calib; short int *t_has_prior; proba = 0.0; times_partial_proba = tree -> rates -> times_partial_proba; calib = tree -> rates -> calib; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; t_has_prior = tree -> rates -> t_has_prior; tot_num_comb = Number_Of_Comb(calib); For(i, tot_num_comb) { times_partial_proba[i] = 1.0; for(j = tree -> n_otu; j < 2 * tree -> n_otu - 1; j++) { t_prior_min[j] = -BIG; t_prior_max[j] = BIG; t_has_prior[j] = NO; } do { k = (i % Number_Of_Comb(calib)) / Number_Of_Comb(calib -> next); if(calib -> all_applies_to[k] -> num) { t_prior_min[calib -> all_applies_to[k] -> num] = MAX(t_prior_min[calib -> all_applies_to[k] -> num], calib -> lower); t_prior_max[calib -> all_applies_to[k] -> num] = MIN(t_prior_max[calib -> all_applies_to[k] -> num], calib -> upper); t_has_prior[calib -> all_applies_to[k] -> num] = YES; proba = calib -> proba[calib -> all_applies_to[k] -> num]; times_partial_proba[i] *= proba; } else { proba = calib -> proba[2 * tree -> n_otu - 1]; times_partial_proba[i] *= proba; } if(calib -> next) calib = calib -> next; else break; } while(calib); int result; result = TRUE; TIMES_Set_All_Node_Priors_S(&result, tree); if(result != TRUE) times_partial_proba[i] = 0; /* printf("\n. [4] Partial Proba [%f] \n", times_partial_proba[i]); */ while(calib -> prev) calib = calib -> prev; } phydbl sum_proba; sum_proba = 0.0; For(i, tot_num_comb) sum_proba += times_partial_proba[i]; if(!Are_Equal(sum_proba, 1.0, 1.E-10)) { For(i, tot_num_comb) times_partial_proba[i] = times_partial_proba[i] / sum_proba; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Function checks if the randomized node times are within the //upper and lower time limits, taken into account the times of //the ancestor and descendent. void Check_Node_Time(t_node *a, t_node *d, int *result, t_tree *tree) { phydbl t_low, t_up; phydbl *t_prior_min, *t_prior_max, *nd_t; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; if((a == tree -> n_root) && ((nd_t[a -> num] > MIN(t_prior_max[a -> num], MIN(nd_t[a -> v[1] -> num], nd_t[a -> v[2] -> num]))) || (nd_t[a -> num] < t_prior_min[a -> num]))) { *result = FALSE; return; } if(d -> tax) return; else { t_low = MAX(t_prior_min[d -> num], nd_t[d -> anc -> num]); t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); /* printf("\n. CHECK: %d t:%f u:%f d:%f",d->num,nd_t[d->num],t_up,t_low); */ if(nd_t[d -> num] < t_low || nd_t[d -> num] > t_up) { *result = FALSE; return; } int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Check_Node_Time(d, d -> v[i], result, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Function calculates the TOTAL number of calibration combinations, //given the number of nodes to which each calibartion applies to. int Number_Of_Comb(t_cal *calib) { int num_comb; if(!calib) return(1); num_comb = 1; do { num_comb *= calib -> n_all_applies_to; if(calib -> next) calib = calib -> next; else break; } while(calib); return(num_comb); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Function calculates the TOTAL number of calibration combinations, //given the number of nodes to which each calibartion applies to. int Number_Of_Calib(t_cal *calib) { int num_calib; num_calib = 0; do { num_calib++; if(calib -> next) calib = calib -> next; else break; } while(calib); return(num_calib); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Function sets current calibration in the following way: // Suppose we have a vector of calibrations C=(C1, C2, C3), each calibration // applies to a set of nodes. We can reach each node number through the indexes (corresponds // to the number the information was read). C1={0,1,2}, C2={0,1}, C3={0}; // The total number of combinations is 3*2*1=6. The first combination with row number 0 // will be {0,0,0}, the second row will be {0,1,0} and so on. Calling the node numbers with // the above indexes will return current calibration. Also sets the vector of probabilities // for current calibration combination. void Set_Current_Calibration(int row, t_tree *tree) { t_cal *calib; phydbl *t_prior_min, *t_prior_max; short int *t_has_prior; int k, i, j, *curr_nd_for_cal; calib = tree -> rates -> calib; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; t_has_prior = tree -> rates -> t_has_prior; curr_nd_for_cal = tree -> rates -> curr_nd_for_cal; /* printf("\n COMBINATION NUMBER [%d] \n", row); */ for(j = tree -> n_otu; j < 2 * tree -> n_otu - 1; j++) { t_prior_min[j] = -BIG; t_prior_max[j] = BIG; t_has_prior[j] = NO; } k = -1; i = 0; do { k = (row % Number_Of_Comb(calib)) / Number_Of_Comb(calib -> next); if(calib -> all_applies_to[k] -> num) { /* printf("\n"); */ /* printf(" %f %f %f %f ", calib -> lower, calib -> upper, t_prior_min[calib -> all_applies_to[k] -> num], t_prior_max[calib -> all_applies_to[k] -> num]); */ /* printf("\n"); */ /* printf("\n"); */ /* printf(" Node number [%d] ", calib -> all_applies_to[k] -> num); */ /* printf("\n"); */ t_prior_min[calib -> all_applies_to[k] -> num] = MAX(t_prior_min[calib -> all_applies_to[k] -> num], calib -> lower); /* printf("\n Prior min [%f] \n", t_prior_min[calib -> all_applies_to[k] -> num]); */ t_prior_max[calib -> all_applies_to[k] -> num] = MIN(t_prior_max[calib -> all_applies_to[k] -> num], calib -> upper); /* printf("\n Prior max [%f] \n", t_prior_max[calib -> all_applies_to[k] -> num]); */ t_has_prior[calib -> all_applies_to[k] -> num] = YES; curr_nd_for_cal[i] = calib -> all_applies_to[k] -> num; i++; } if(calib->next) calib = calib->next; else break; } while(calib); while(calib -> prev) calib = calib -> prev; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Randomly choose a combination of calibrations drawing an index of calibration combination, //used function Set_Cur_Calibration. void Random_Calibration(t_tree *tree) { int rnd, num_comb; t_cal *calib; calib = tree -> rates -> calib; num_comb = Number_Of_Comb(calib); srand(time(NULL)); rnd = rand()%(num_comb); Set_Current_Calibration(rnd, tree); TIMES_Set_All_Node_Priors(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Variable curr_nd_for_cal is a vector of node numbers, the length of that vector is a number of calibrations. //Function randomly updates that vector by randomly changing one node and setting times limits with respect //to a new vector. int RND_Calibration_And_Node_Number(t_tree *tree) { int i, j, tot_num_cal, cal_num, node_ind, node_num, *curr_nd_for_cal; phydbl *t_prior_min, *t_prior_max; //*times_partial_proba; short int *t_has_prior; t_cal *cal; tot_num_cal = tree -> rates -> tot_num_cal; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; t_has_prior = tree -> rates -> t_has_prior; curr_nd_for_cal = tree -> rates -> curr_nd_for_cal; cal = tree -> rates -> calib; cal_num = rand()%(tot_num_cal - 1); i = 0; while (i != cal_num) { cal = cal -> next; i++; } node_ind = rand()%(cal -> n_all_applies_to); node_num = cal -> all_applies_to[node_ind] -> num; curr_nd_for_cal[cal_num] = node_num; for(j = tree -> n_otu; j < 2 * tree -> n_otu - 1; j++) { t_prior_min[j] = -BIG; t_prior_max[j] = BIG; t_has_prior[j] = NO; } while(cal -> prev) cal = cal -> prev; i = 0; do { t_prior_min[curr_nd_for_cal[i]] = cal -> lower; t_prior_max[curr_nd_for_cal[i]] = cal -> upper; t_has_prior[curr_nd_for_cal[i]] = YES; i++; if(cal->next) cal = cal -> next; else break; } while(cal); while(cal -> prev) cal = cal -> prev; TIMES_Set_All_Node_Priors(tree); return(node_num); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Return the value uniformly distributed between two values. phydbl Randomize_One_Node_Time(phydbl min, phydbl max) { phydbl u; u = Uni(); u *= (max - min); u += min; return(u); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Calculates the Hastings ratio for the analysis. Used in case of //calibration conditional jump. NOT THE RIGHT ONE TO USE! void Lk_Hastings_Ratio_Times(t_node *a, t_node *d, phydbl *tot_prob, t_tree *tree) { phydbl t_low, t_up; phydbl *t_prior_min, *t_prior_max, *nd_t; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; if(d -> tax) return; else { t_low = MAX(t_prior_min[d -> num], nd_t[d -> anc -> num]); t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); (*tot_prob) += log(1) - log(t_up - t_low); int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) { Lk_Hastings_Ratio_Times(d, d -> v[i], tot_prob, tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Updates nodes which are below a randomized node in case if new proposed time //for that node is below the current value. void Update_Descendent_Cond_Jump(t_node *a, t_node *d, phydbl *L_Hast_ratio, t_tree *tree) { int result = TRUE; phydbl t_low, t_up; phydbl *t_prior_min, *t_prior_max, *nd_t; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; Check_Node_Time(tree -> n_root, tree -> n_root -> v[1], &result, tree); Check_Node_Time(tree -> n_root, tree -> n_root -> v[2], &result, tree); if(d -> tax) return; else { if(result != TRUE) { int i; t_low = MAX(nd_t[a -> num], t_prior_min[d -> num]); if(t_low < MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])) t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); else t_up = t_prior_max[d -> num]; nd_t[d -> num] = Randomize_One_Node_Time(t_low, t_up); (*L_Hast_ratio) += log(1) - log(t_up - t_low); for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Update_Descendent_Cond_Jump(d, d -> v[i], L_Hast_ratio, tree); } else return; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Updates nodes which are above a randomized node in case if new proposed time //for that node is above the current value. void Update_Ancestor_Cond_Jump(t_node *d, phydbl *L_Hast_ratio, t_tree *tree) { int result = TRUE; phydbl t_low, t_up; phydbl *t_prior_min, *t_prior_max, *nd_t; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; Check_Node_Time(tree -> n_root, tree -> n_root -> v[1], &result, tree); Check_Node_Time(tree -> n_root, tree -> n_root -> v[2], &result, tree); if(result != TRUE) { if(d == tree -> n_root) { t_low = t_prior_min[d -> num]; t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); nd_t[d -> num] = Randomize_One_Node_Time(t_low, t_up); (*L_Hast_ratio) += log(1) - log(t_up - t_low); return; } else { t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); if(nd_t[d -> anc -> num] > t_up) t_low = t_prior_min[d -> num]; else t_low = MAX(t_prior_min[d -> num], nd_t[d -> anc -> num]); nd_t[d -> num] = Randomize_One_Node_Time(t_low, t_up); (*L_Hast_ratio) += log(1) - log(t_up - t_low); Update_Ancestor_Cond_Jump(d -> anc, L_Hast_ratio, tree); } } else return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //when made a calibration conditional jump, updates node times //with respect to the new calibration which was made with respect //to the randomly chosen node, the root is fixed. Updates only those nodes //that are not within new intervals. Traverse up and down. void Update_Times_RND_Node_Ancestor_Descendant(int rnd_node, phydbl *L_Hast_ratio, t_tree *tree) { int i; phydbl *t_prior_min, *t_prior_max, *nd_t; phydbl new_time_rnd_node = 0.0; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; new_time_rnd_node = Randomize_One_Node_Time(t_prior_min[rnd_node], t_prior_max[rnd_node]); nd_t[rnd_node] = new_time_rnd_node; Update_Ancestor_Cond_Jump(tree -> a_nodes[rnd_node] -> anc, L_Hast_ratio, tree); for(i=0;i<3;i++) if((tree -> a_nodes[rnd_node] -> v[i] != tree -> a_nodes[rnd_node] -> anc) && (tree -> a_nodes[rnd_node] -> b[i] != tree -> e_root)) Update_Descendent_Cond_Jump(tree -> a_nodes[rnd_node], tree -> a_nodes[rnd_node] -> v[i], L_Hast_ratio, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //when made a calibration conditional jump, updates node times //with respect to the new calibration which was made with respect //to the randomly chosen node, starting from the root down to the tips. //Updates only those nodes that are not within new intervals. void Update_Times_Down_Tree(t_node *a, t_node *d, phydbl *L_Hastings_ratio, t_tree *tree) { int i; phydbl *t_prior_min, *t_prior_max, *nd_t, t_low, t_up; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; t_low = MAX(t_prior_min[d -> num], nd_t[a -> num]); t_up = t_prior_max[d -> num]; //printf("\n. [1] Node number: [%d] \n", d -> num); if(d -> tax) return; else { if(nd_t[d -> num] > t_up || nd_t[d -> num] < t_low) { //printf("\n. [2] Node number: [%d] \n", d -> num); //(*L_Hastings_ratio) += (log(1) - log(t_up - t_low)); (*L_Hastings_ratio) += (- log(t_up - t_low)); nd_t[d -> num] = Randomize_One_Node_Time(t_low, t_up); /* t_prior_min[d -> num] = t_low; */ /* t_prior_max[d -> num] = t_up; */ } for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Update_Times_Down_Tree(d, d -> v[i], L_Hastings_ratio, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_node *XML_Search_Node_Attribute_Value_Clade(char *attr_name, char *value, int skip, xml_node *node) { xml_node *match; //printf("\n. Node name [%s] Attr name [%s] Attr value [%s] \n", node -> name, attr_name, value); if(!node) { PhyML_Printf("\n== node: %p attr: %p",node,node?node->attr:NULL); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } match = NULL; if(skip == NO && node -> attr) { xml_attr *attr; attr = node -> attr; do { if(!strcmp(attr -> name, attr_name) && !strcmp(attr -> value, value)) { match = node; break; } attr = attr->next; if(!attr) break; } while(1); } if(match) return(match); if(node -> next && !match) { match = XML_Search_Node_Attribute_Value_Clade(attr_name, value, NO, node -> next); return match; } return NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_All_Node_Priors_S(int *result, t_tree *tree) { int i; phydbl min_prior; /* Set all t_prior_max values */ TIMES_Set_All_Node_Priors_Bottom_Up_S(tree->n_root,tree->n_root->v[2], result, tree); TIMES_Set_All_Node_Priors_Bottom_Up_S(tree->n_root,tree->n_root->v[1], result, tree); tree->times->t_prior_max[tree->n_root->num] = MIN(tree->times->t_prior_max[tree->n_root->num], MIN(tree->times->t_prior_max[tree->n_root->v[2]->num], tree->times->t_prior_max[tree->n_root->v[1]->num])); /* Set all t_prior_min values */ if(!tree->times->t_has_prior[tree->n_root->num]) { min_prior = 1.E+10; For(i,2*tree->n_otu-2) { if(tree->times->t_has_prior[i]) { if(tree->times->t_prior_min[i] < min_prior) min_prior = tree->times->t_prior_min[i]; } } tree->times->t_prior_min[tree->n_root->num] = 2.0 * min_prior; } if(tree->times->t_prior_min[tree->n_root->num] > 0.0) { *result = FALSE; } TIMES_Set_All_Node_Priors_Top_Down_S(tree->n_root,tree->n_root->v[2], result, tree); TIMES_Set_All_Node_Priors_Top_Down_S(tree->n_root,tree->n_root->v[1], result, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_All_Node_Priors_Bottom_Up_S(t_node *a, t_node *d, int *result, t_tree *tree) { int i; phydbl t_sup; if(d->tax) return; else { t_node *v1, *v2; /* the two sons of d */ for(i=0;i<3;i++) { if((d->v[i] != a) && (d->b[i] != tree->e_root)) { TIMES_Set_All_Node_Priors_Bottom_Up_S(d,d->v[i], result, tree); } } v1 = v2 = NULL; for(i=0;i<3;i++) if((d->v[i] != a) && (d->b[i] != tree->e_root)) { if(!v1) v1 = d->v[i]; else v2 = d->v[i]; } if(tree->times->t_has_prior[d->num] == YES) { t_sup = MIN(tree->times->t_prior_max[d->num], MIN(tree->times->t_prior_max[v1->num], tree->times->t_prior_max[v2->num])); tree->times->t_prior_max[d->num] = t_sup; if(tree->times->t_prior_max[d->num] < tree->times->t_prior_min[d->num]) { *result = FALSE; } } else { tree->times->t_prior_max[d->num] = MIN(tree->times->t_prior_max[v1->num], tree->times->t_prior_max[v2->num]); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_All_Node_Priors_Top_Down_S(t_node *a, t_node *d, int *result, t_tree *tree) { if(d->tax) return; else { int i; if(tree->times->t_has_prior[d->num] == YES) { tree->times->t_prior_min[d->num] = MAX(tree->times->t_prior_min[d->num],tree->times->t_prior_min[a->num]); if(tree->times->t_prior_max[d->num] < tree->times->t_prior_min[d->num]) { *result = FALSE; } } else { tree->times->t_prior_min[d->num] = tree->times->t_prior_min[a->num]; } for(i=0;i<3;i++) { if((d->v[i] != a) && (d->b[i] != tree->e_root)) { TIMES_Set_All_Node_Priors_Top_Down_S(d,d->v[i], result, tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl log_g_i(phydbl lmbd, phydbl t_slice_max, phydbl t_slice_min, phydbl t_prior_max, phydbl t_prior_min) { phydbl result = 0.0; if(lmbd * t_prior_min < -10.0) { phydbl K; K = -10.0 - lmbd * t_prior_min; /* printf("\n. K = [%f] \n", K); */ if(lmbd * t_prior_max + K > 700.0) { PhyML_Printf("\n. Please scale your calibration intervals. \n"); PhyML_Printf("\n. Cannot calculate exp(-lmbd * t_prior_max). \n"); PhyML_Printf("\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit("\n"); } else { result = log(exp(lmbd * t_slice_max + K) - exp(lmbd * t_slice_min + K)) - log(exp(lmbd * t_prior_max + K) - exp(lmbd * t_prior_min + K)); } } else { result = log(exp(lmbd * t_slice_max) - exp(lmbd * t_slice_min)) - log(exp(lmbd * t_prior_max) - exp(lmbd * t_prior_min)); } return(result); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int CombineInt(int int1, int int2) { int mem; mem = 500 * 2; char cResult[mem]; sprintf(cResult, "%d%d", int1, int2); return atoi(cResult); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Jump_Calibration_Move_Pre(t_node *a, t_node *d, phydbl old_ta, phydbl *log_hastings_ratio, t_tree *tree) { int i; phydbl *t_prior_min_new, *t_prior_max_new, t_low_new, t_up_new; phydbl *t_prior_min_old, *t_prior_max_old, t_low_old, t_up_old; phydbl *nd_t, old_t; phydbl eps = DBL_MIN; int move_anyway; t_prior_min_new = tree -> rates -> t_prior_min; t_prior_max_new = tree -> rates -> t_prior_max; t_prior_min_old = tree -> rates -> t_prior_min_ori; t_prior_max_old = tree -> rates -> t_prior_max_ori; nd_t = tree -> rates -> nd_t; t_low_new = MAX(t_prior_min_new[d -> num], nd_t[a -> num]); t_up_new = t_prior_max_new[d -> num]; t_low_old = MAX(t_prior_min_old[d -> num], old_ta); t_up_old = t_prior_max_old[d -> num]; old_t = nd_t[d -> num]; /* move_anyway = NO; */ /* if(Uni() < .5) move_anyway = YES; */ move_anyway = YES; if(d -> tax) return; else { if((nd_t[d -> num] > t_up_new || nd_t[d -> num] < t_low_new) || (move_anyway == YES)) /* Hastings ratio */ { (*log_hastings_ratio) += log(t_up_new - t_low_new + eps); } if((nd_t[d -> num] > t_up_new || nd_t[d -> num] < t_low_new) || (move_anyway == YES)) /* Do the jump */ { nd_t[d -> num] = Uni()*(t_up_new - t_low_new) + t_low_new; } if((nd_t[d -> num] > t_up_old || nd_t[d -> num] < t_low_old) || (move_anyway == YES)) /* Hastings ratio */ { (*log_hastings_ratio) -= log(t_up_old - t_low_old + eps); } for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Jump_Calibration_Move_Pre(d, d -> v[i], old_t, log_hastings_ratio, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Multiple_Time_Proposal_Density(t_node *a, t_node *d, phydbl *time_proposal_density, t_tree *tree) { int i; phydbl *t_prior_min, *t_prior_max, *nd_t, t_low, t_up; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; //printf("\n. [1] Node number: [%d] \n", d -> num); if(d -> tax) return; else { t_low = MAX(t_prior_min[d -> num], nd_t[a -> num]); t_up = t_prior_max[d -> num]; /* t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); */ /* printf("\n. Low [%f] Up [%f] \n", t_low, t_up); */ (*time_proposal_density) += (- log(t_up - t_low)); for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Multiple_Time_Proposal_Density(d, d -> v[i], time_proposal_density, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/invitee.h000066400000000000000000000050241501136442400210060ustar00rootroot00000000000000#ifndef INVITEE_H #define INVITEE_H #include "utilities.h" int My_Function(int argc, char **argv); int My_main(int argc, char **argv); void PhyTime_XML(char *xml_file); phydbl TIMES_Calib_Cond_Prob(t_tree *tree); int Number_Of_Comb(t_cal *calib); int Number_Of_Calib(t_cal *calib); void Check_Node_Time(t_node *a, t_node *d, int *result, t_tree *tree); void Set_Current_Calibration(int row, t_tree *tree); void Random_Calibration(t_tree *tree); int RND_Calibration_And_Node_Number(t_tree *tree); phydbl Randomize_One_Node_Time(phydbl min, phydbl max); void Lk_Hastings_Ratio_Times(t_node *a, t_node *d, phydbl *tot_prob, t_tree *tree); void Update_Descendent_Cond_Jump(t_node *a, t_node *d, phydbl *L_Hast_ratio, t_tree *tree); void Update_Ancestor_Cond_Jump(t_node *d, phydbl *L_Hast_ratio, t_tree *tree); void Update_Times_RND_Node_Ancestor_Descendant(int rnd_node, phydbl *L_Hast_ratio, t_tree *tree); void Update_Times_Down_Tree(t_node *a, t_node *d, phydbl *L_Hastings_ratio, t_tree *tree); phydbl K_Constant_Prior_Times_Log(t_tree *tree); int Number_Of_Comb_Slices(int m, int num_elem, int *n_slice); void Check_Time_Slices(t_node *a, t_node *d, int *result, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree); void Number_Of_Nodes_In_Slice(t_node *d_start, t_node *d, int *n, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree); void Search_Root_Node_In_Slice(t_node *d_start, t_node *d, int *root_nodes, int *num_elem, phydbl t_slice_min, phydbl t_slice_max, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree); int Factorial(int base); phydbl *Norm_Constant_Prior_Times(t_tree *tree); void TIMES_Calib_Partial_Proba(t_tree *tree); xml_node *XML_Search_Node_Attribute_Value_Clade(char *attr_name, char *value, int skip, xml_node *node); char **XML_Read_Clade(xml_node *n_clade, t_tree *tree); int XML_Number_Of_Taxa_In_Clade(xml_node *n_clade); void TIMES_Set_All_Node_Priors_S(int *result, t_tree *tree); void TIMES_Set_All_Node_Priors_Bottom_Up_S(t_node *a, t_node *d, int *result, t_tree *tree); void TIMES_Set_All_Node_Priors_Top_Down_S(t_node *a, t_node *d, int *result, t_tree *tree); phydbl LOG_g_i(phydbl lmbd, phydbl t_slice_max, phydbl t_slice_min, phydbl t_prior_max, phydbl t_prior_min); int CombineInt(int int1, int int2); void Update_Current_Times_Down_Tree(t_node *a, t_node *d, t_tree *tree); void Multiple_Time_Proposal_Density(t_node *a, t_node *d, phydbl *time_proposal_density, t_tree *tree); void Jump_Calibration_Move_Pre(t_node *a, t_node *d, phydbl old_ta, phydbl *log_hastings_ratio, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/io.c000066400000000000000000007206051501136442400177560ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "io.h" #include "assert.h" #ifdef BEAGLE #include "libhmsbeagle/beagle.h" #endif /* Tree parser function. We need to pass a pointer to the string of characters since this string might be freed and then re-allocated by that function (i.e., its address in memory might change) */ t_tree *Read_Tree(char **s_tree) { char **subs; int i, n_ext, n_int, n_otu; t_tree *tree; int degree, len; t_node *root_node; /* PhyML_Printf("\n. Reading tree %s",(*s_tree)); */ n_int = n_ext = 0; n_otu = 0; for (i = 0; i < (int)strlen((*s_tree)); ++i) { if ((*s_tree)[i] == '[') do ++i; while ((*s_tree)[i] != ']'); // Skip labels if ((*s_tree)[i] == ',') n_otu++; } n_otu += 1; tree = Make_Tree_From_Scratch(n_otu, NULL); subs = Sub_Trees((*s_tree), °ree); Clean_Multifurcation(subs, degree, 3); if (degree == 2) { root_node = tree->a_nodes[2 * n_otu - 2]; root_node->num = 2 * n_otu - 2; tree->n_root = root_node; n_int -= 1; } else { root_node = tree->a_nodes[n_otu]; root_node->num = n_otu; tree->n_root = NULL; } if (degree > 3) /* Multifurcation at the root. Need to re-assemble the subtrees since Clean_Multifurcation added sets of parenthesis and the corresponding NULL edges */ { degree = 3; Free((*s_tree)); len = 0; for (i = 0; i < degree; i++) len += (strlen(subs[i]) + 1); len += 5; (*s_tree) = (char *)mCalloc(len, sizeof(char)); (*s_tree)[0] = '('; (*s_tree)[1] = '\0'; for (i = 0; i < degree; i++) { strcat((*s_tree), subs[i]); strcat((*s_tree), ",\0"); } sprintf((*s_tree) + strlen((*s_tree)) - 1, "%s", ");\0"); i = 0; while (subs[i] != NULL) Free(subs[i++]); Free(subs); subs = Sub_Trees((*s_tree), °ree); } root_node->tax = 0; tree->has_branch_lengths = 0; tree->num_curr_branch_available = tree->n_otu; for (i = 0; i < degree; i++) R_rtree((*s_tree), subs[i], root_node, tree, &n_int, &n_ext); i = degree; while (subs[i] != NULL) Free(subs[i++]); Free(subs); if (tree->n_root) { if (tree->n_root->v[1]->tax == NO && tree->n_root->v[2]->tax == NO) { tree->e_root = tree->a_edges[tree->num_curr_branch_available]; tree->n_root->b[1] = tree->a_edges[tree->num_curr_branch_available + 1]; tree->n_root->b[2] = tree->a_edges[tree->num_curr_branch_available + 2]; } else { for (i = 0; i < tree->n_otu; ++i) if (tree->a_edges[i]->left == NULL && tree->a_edges[i]->rght == NULL) break; assert(i != tree->n_otu); tree->e_root = tree->a_edges[i]; tree->n_root->b[1] = tree->a_edges[tree->num_curr_branch_available]; tree->n_root->b[2] = tree->a_edges[tree->num_curr_branch_available + 1]; } tree->n_root->v[2]->v[0] = tree->n_root->v[1]; tree->n_root->v[1]->v[0] = tree->n_root->v[2]; tree->n_root->b[1]->left = tree->n_root; tree->n_root->b[2]->left = tree->n_root; tree->n_root->b[1]->rght = tree->n_root->v[1]; tree->n_root->b[2]->rght = tree->n_root->v[2]; // Reading edge lengths subs = Sub_Trees((*s_tree), °ree); Read_Branch_Length(subs[0], (*s_tree), tree->n_root->b[1], tree); Read_Branch_Length(subs[1], (*s_tree), tree->n_root->b[2], tree); // Edge labels Read_Edge_Label(subs[0], (*s_tree), tree->n_root->b[1]); Read_Edge_Label(subs[1], (*s_tree), tree->n_root->b[2]); // Node labels Read_Node_Label(subs[0], (*s_tree), tree->n_root); Read_Node_Label(subs[1], (*s_tree), tree->n_root); Free(subs); Connect_One_Edge_To_Two_Nodes(tree->n_root->v[2], tree->n_root->v[1], tree->e_root, tree); tree->e_root->l->v = tree->n_root->b[2]->l->v + tree->n_root->b[1]->l->v; if (tree->e_root->l->v > 0.0) tree->n_root_pos = tree->n_root->b[2]->l->v / tree->e_root->l->v; else tree->n_root_pos = .5; Update_Ancestors(tree->n_root, tree->n_root->v[2], tree->n_root->b[2], tree); Update_Ancestors(tree->n_root, tree->n_root->v[1], tree->n_root->b[1], tree); } return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* 'a' in t_node a stands for ancestor. 'd' stands for descendant */ void R_rtree(char *s_tree_a, char *s_tree_d, t_node *a, t_tree *tree, int *n_int, int *n_ext) { int i; t_node *d; int n_otu = tree->n_otu; if (strstr(s_tree_a, " ")) { PhyML_Fprintf(stderr, "\n. [%s]", s_tree_a); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } // Internal edge if (s_tree_d[0] == '(') { char **subs; int degree; t_edge *b; (*n_int) += 1; if ((*n_int + n_otu) == (2 * n_otu - 1)) { PhyML_Fprintf(stderr, "\n. The number of internal nodes in the tree " "exceeds the number of taxa minus one."); PhyML_Fprintf( stderr, "\n. There probably is a formating problem in the input tree."); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } d = tree->a_nodes[n_otu + *n_int]; d->num = n_otu + *n_int; d->tax = 0; b = tree->a_edges[tree->num_curr_branch_available]; Read_Edge_Label(s_tree_d, s_tree_a, b); Read_Branch_Support(s_tree_d, s_tree_a, b, tree); Read_Branch_Length(s_tree_d, s_tree_a, b, tree); Read_Node_Label(s_tree_d, s_tree_a, d); if (tree->n_root && a == tree->n_root) { if (!a->v[1]) a->v[1] = d; else a->v[2] = d; } else { for (i = 0; i < 3; i++) { if (!a->v[i]) { a->v[i] = d; break; } } } d->v[0] = a; if (!(tree->n_root && a == tree->n_root)) Connect_One_Edge_To_Two_Nodes( a, d, tree->a_edges[tree->num_curr_branch_available], tree); subs = Sub_Trees(s_tree_d, °ree); if (degree < 2) { PhyML_Fprintf(stderr, "\n. A problem was detected in the following subtree:"); PhyML_Fprintf(stderr, "\n. %s", s_tree_d); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } if (degree > 2) { Clean_Multifurcation(subs, degree, 2); Free(s_tree_d); s_tree_d = (char *)mCalloc(strlen(subs[0]) + strlen(subs[1]) + 5, sizeof(char)); i = 0; while (subs[i] != NULL) Free(subs[i++]); Free(subs); subs = Sub_Trees(s_tree_d, °ree); } R_rtree(s_tree_d, subs[0], d, tree, n_int, n_ext); R_rtree(s_tree_d, subs[1], d, tree, n_int, n_ext); i = 2; while (subs[i] != NULL) Free(subs[i++]); Free(subs); } // External edge else { int i; d = tree->a_nodes[*n_ext]; d->tax = 1; Read_Edge_Label(s_tree_d, s_tree_a, tree->a_edges[*n_ext]); Read_Node_Name(s_tree_d, s_tree_a, d, tree); Read_Branch_Length(s_tree_d, s_tree_a, tree->a_edges[*n_ext], tree); Read_Node_Label(s_tree_d, s_tree_a, d); if (tree->n_root && a == tree->n_root) { if (!a->v[1]) a->v[1] = d; else a->v[2] = d; } else { for (i = 0; i < 3; i++) { if (!a->v[i]) { a->v[i] = d; break; } } } d->v[0] = a; if (!(tree->n_root && a == tree->n_root)) { Connect_One_Edge_To_Two_Nodes(a, d, tree->a_edges[*n_ext], tree); } d->num = *n_ext; (*n_ext) += 1; } Free(s_tree_d); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Node_Name(char *s_d, char *s_a, t_node *d, t_tree *tree) { char *p; int i; assert(s_d[0] != '('); d->name = (char *)mCalloc(strlen(s_d) + 1, sizeof(char)); p = strstr(s_a, s_d); i = 0; while (p[i] != ':' && p[i] != '[') { d->name[i] = p[i]; i++; } d->name[i] = '\0'; d->ori_name = d->name; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Branch_Support(char *s_d, char *s_a, t_edge *b, t_tree *tree) { char *sub_tp; char *p; int i; if (s_d[0] != '(') return; // b is an external edge -> no edge support on it sub_tp = (char *)mCalloc(10 + strlen(s_d) + 1, sizeof(char)); sub_tp[0] = '('; sub_tp[1] = '\0'; strcat(sub_tp, s_d); p = strstr(s_a, sub_tp); if (!p) { sub_tp[0] = ','; sub_tp[1] = '\0'; strcat(sub_tp, s_d); p = strstr(s_a, sub_tp); } assert(p); p++; i = 0; if (p[i] == '(') { i = Next_Matching_Char(p, '(', ')', i); i++; } if (p[i] == '[') { i = Next_Matching_Char(p, '[', ']', i); i++; } if (p[i] != ':') { b->support_val = atof((char *)(p + i)); } Free(sub_tp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Branch_Length(char *s_d, char *s_a, t_edge *b, t_tree *tree) { char *sub_tp; char *p; int i; b->l->v = -1.; sub_tp = (char *)mCalloc(10 + strlen(s_d) + 1, sizeof(char)); sub_tp[0] = '('; sub_tp[1] = '\0'; strcat(sub_tp, s_d); p = strstr(s_a, sub_tp); if (!p) { sub_tp[0] = ','; sub_tp[1] = '\0'; strcat(sub_tp, s_d); p = strstr(s_a, sub_tp); } assert(p); p++; i = 0; while (p[i] != ':' && p[i] != '\0') { if (p[i] == '(') i = Next_Matching_Char(p, '(', ')', i); if (p[i] == '[') i = Next_Matching_Char(p, '[', ']', i); i++; } if (p[i] == ':') { i++; if (p[i] == '[') { i = Next_Matching_Char(p, '[', ']', i); i++; } b->l->v = atof(p + i); tree->has_branch_lengths = YES; b->does_exist = YES; /* PhyML_Printf("\n. READ LENGTH for s_d: %s b: %f",s_d,b->l->v); */ } Free(sub_tp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Edge_Label(char *s_d, char *s_a, t_edge *b) { char *sub_tp; char *p; int i; sub_tp = (char *)mCalloc(10 + strlen(s_d) + 1, sizeof(char)); sub_tp[0] = '('; sub_tp[1] = '\0'; strcat(sub_tp, s_d); p = strstr(s_a, sub_tp); if (!p) { sub_tp[0] = ','; sub_tp[1] = '\0'; strcat(sub_tp, s_d); p = strstr(s_a, sub_tp); } assert(p); p++; i = 0; while (p[i] != ':' && p[i] != '\0') { if (p[i] == '(') i = Next_Matching_Char(p, '(', ')', i); if (p[i] == '[') i = Next_Matching_Char(p, '[', ']', i); i++; } if (p[i] == ':') { i++; if (p[i] == '[') { char *s_lab; s_lab = (char *)mCalloc(strlen(s_a) + 1, sizeof(char)); s_lab[0] = '['; if (sscanf(p + i, "[%[^]]]", s_lab + 1) != 1) { PhyML_Fprintf( stderr, "\n. Edge label is in wrong format. A proper label should"); PhyML_Fprintf(stderr, "\n. look as follows: \"[xxx={yyy},xxxx={yy},...]\""); assert(FALSE); } s_lab[strlen(s_lab)] = ']'; s_lab[strlen(s_lab)] = '\0'; b->label = Read_Labels(s_lab); /* PhyML_Printf("\n. READ EDGE LABEL for s_d: %s lab.keyval: * %s:%s",s_d,b->label->key,b->label->val); */ Free(s_lab); i++; } } Free(sub_tp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Node_Label(char *s_d, char *s_a, t_node *n) { char *sub_tp; char *p; int i; sub_tp = (char *)mCalloc(10 + strlen(s_d) + 1, sizeof(char)); sub_tp[0] = '('; sub_tp[1] = '\0'; strcat(sub_tp, s_d); p = strstr(s_a, sub_tp); if (!p) { sub_tp[0] = ','; sub_tp[1] = '\0'; strcat(sub_tp, s_d); p = strstr(s_a, sub_tp); } assert(p); p++; i = 0; if (p[0] == '(') i = Next_Matching_Char(p, '(', ')', i); while (p[i] != '[' && p[i] != '\0') i++; if (p[i] == '[') { char *s_lab; s_lab = (char *)mCalloc(strlen(s_a) + 1, sizeof(char)); s_lab[0] = '['; if (sscanf(p + i, "[%[^]]]", s_lab + 1) != 1) { PhyML_Fprintf(stderr, "\n. Node label is in wrong format. A proper label should"); PhyML_Fprintf(stderr, "\n. look as follows: \"[xxx={yyy},xxxx={yy},...]\""); assert(FALSE); } s_lab[strlen(s_lab)] = ']'; s_lab[strlen(s_lab)] = '\0'; n->label = Read_Labels(s_lab); /* PhyML_Printf("\n. READ NODE LABEL for s_d: %s %s lab.keyval: %s:%s * %s:%s", */ /* s_d, */ /* s_lab, */ /* n->label->key,n->label->val, */ /* n->label->next->key,n->label->next->val); */ Free(s_lab); } Free(sub_tp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Clean_Multifurcation(char **subtrees, int current_deg, int end_deg) { if (current_deg <= end_deg) return; else { char *s_tmp; int i; /* s_tmp = (char *)mCalloc(T_MAX_LINE,sizeof(char)); */ s_tmp = (char *)mCalloc(10 + (int)strlen(subtrees[0]) + 1 + (int)strlen(subtrees[1]) + 1, sizeof(char)); strcat(s_tmp, "(\0"); strcat(s_tmp, subtrees[0]); strcat(s_tmp, ",\0"); strcat(s_tmp, subtrees[1]); strcat( s_tmp, ")#NULL\0"); /* Add the label 'NULL' to identify a non-existing edge */ Free(subtrees[0]); subtrees[0] = s_tmp; for (i = 1; i < current_deg - 1; i++) strcpy(subtrees[i], subtrees[i + 1]); Clean_Multifurcation(subtrees, current_deg - 1, end_deg); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char **Sub_Trees(char *tree, int *degree) { char **subs; int posbeg, posend; int i; subs = NULL; if (tree[0] != '(') { *degree = 1; return NULL; } posbeg = posend = 1; (*degree) = 0; do { posbeg = posend; while (tree[posend] != ',' && tree[posend] != ')') { if (tree[posend] == '(') posend = Next_Matching_Char(tree, '(', ')', posend); if (tree[posend] == '[') posend = Next_Matching_Char(tree, '[', ']', posend); posend++; } posend -= 1; if (*degree == 0) subs = (char **)mCalloc(1, sizeof(char *)); else subs = (char **)mRealloc(subs, *degree + 1, sizeof(char *)); subs[(*degree)] = (char *)mCalloc(strlen(tree) + 1, sizeof(char)); strncpy(subs[(*degree)], tree + posbeg, posend - posbeg + 1); subs[(*degree)][posend - posbeg + 1] = '\0'; /* Thanks to Jean-Baka Domelevo-Entfellner */ posend += 2; (*degree)++; if ((*degree) == NODE_DEG_MAX) { for (i = 0; i < (*degree); ++i) PhyML_Fprintf(stderr, "\n. Subtree %d : %s\n", i + 1, subs[i]); PhyML_Fprintf(stderr, "\n. The degree of a t_node cannot be greater than %d\n", NODE_DEG_MAX); Warn_And_Exit("\n"); } } while (tree[posend - 1] != ')'); subs = (char **)mRealloc(subs, *degree + 1, sizeof(char *)); subs[(*degree)] = NULL; return subs; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Next_Matching_Char(char *s, char o, char c, int pos) { int curr; curr = pos + 1; while (*(s + curr) != c) { if (*(s + curr) == o) curr = Next_Matching_Char(s, o, c, curr); curr++; } return curr; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Tree(FILE *fp, t_tree *tree) { char *s_tree; int i; s_tree = (char *)Write_Tree(tree); if (OUTPUT_TREE_FORMAT == NEWICK) PhyML_Fprintf(fp, "%s\n", s_tree); else if (OUTPUT_TREE_FORMAT == NEXUS) { PhyML_Fprintf(fp, "#NEXUS\n"); PhyML_Fprintf(fp, "BEGIN TREES;\n"); PhyML_Fprintf(fp, "\tTRANSLATE\n"); for (i = 0; i < tree->n_otu; ++i) PhyML_Fprintf(fp, "\t%3d\t%s,\n", i + 1, tree->a_nodes[i]->name); PhyML_Fprintf(fp, "\tUTREE PAUP_1=\n"); PhyML_Fprintf(fp, "%s\n", s_tree); PhyML_Fprintf(fp, "ENDBLOCK;"); } Free(s_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *Write_Tree(t_tree *tree) { char *s; int i, available; #ifndef MPI int init_len; init_len = 3 * (int)T_MAX_NAME; s = (char *)mCalloc(init_len, sizeof(char)); available = init_len; #elif defined MPI s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); #endif i = -1; s[0] = '('; if (tree->n_root == NULL) { i = 0; while ((!tree->a_nodes[tree->n_otu + i]->v[0]) || (!tree->a_nodes[tree->n_otu + i]->v[1]) || (!tree->a_nodes[tree->n_otu + i]->v[2])) i++; R_wtree(tree->a_nodes[tree->n_otu + i], tree->a_nodes[tree->n_otu + i]->v[0], tree->a_nodes[tree->n_otu + i]->b[0], &available, &s, tree); R_wtree(tree->a_nodes[tree->n_otu + i], tree->a_nodes[tree->n_otu + i]->v[1], tree->a_nodes[tree->n_otu + i]->b[1], &available, &s, tree); R_wtree(tree->a_nodes[tree->n_otu + i], tree->a_nodes[tree->n_otu + i]->v[2], tree->a_nodes[tree->n_otu + i]->b[2], &available, &s, tree); } else { R_wtree(tree->n_root, tree->n_root->v[1], tree->n_root->b[1], &available, &s, tree); R_wtree(tree->n_root, tree->n_root->v[2], tree->n_root->b[2], &available, &s, tree); } s[(int)strlen(s) - 1] = ')'; if (tree->n_root != NULL) if (tree->print_labels == YES) Print_Labels(NULL, s + (int)strlen(s), tree->n_root->label); if (tree->io && tree->io->print_node_num == YES) { if (!tree->n_root) sprintf(s + (int)strlen(s), "%d", tree->a_nodes[tree->n_otu + i]->num); else sprintf(s + (int)strlen(s), "%d", tree->n_root->num); } s[(int)strlen(s)] = ';'; return s; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void R_wtree(t_node *pere, t_node *fils, t_edge *b, int *available, char **s_tree, t_tree *tree) { int i, p; char *format; int last_len; phydbl mean_len; format = (char *)mCalloc(100, sizeof(char)); sprintf(format, "%%.%df", tree->bl_ndigits); p = -1; if (fils->tax == YES) // Tip node { last_len = (int)strlen(*s_tree); if (OUTPUT_TREE_FORMAT == NEWICK) { if (tree->write_tax_names == YES) { if (tree->io && tree->io->long_tax_names) { strcat(*s_tree, tree->io->long_tax_names[fils->num]); } else { if (fils->name && strlen(fils->name) > 0) strcat(*s_tree, fils->name); else sprintf(*s_tree + (int)strlen(*s_tree), "%d", fils->num + 1); } } else if (tree->write_tax_names == NO) { sprintf(*s_tree + (int)strlen(*s_tree), "%d", fils->num + 1); } } else if (OUTPUT_TREE_FORMAT == NEXUS) { sprintf(*s_tree + (int)strlen(*s_tree), "%d", fils->num + 1); } else { PhyML_Printf("\n. Unknown tree format."); PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); PhyML_Printf("\n. s=%s\n", *s_tree); } if ((fils->b) && (fils->b[0]) && (tree->write_br_lens == YES)) { if (tree->print_labels == YES) Print_Labels(NULL, *s_tree + (int)strlen(*s_tree), fils->label); (*s_tree)[(int)strlen(*s_tree)] = ':'; if (tree->print_labels == YES) Print_Labels(NULL, *s_tree + (int)strlen(*s_tree), b->label); if (tree->is_mixt_tree == NO) mean_len = b->l->v; else mean_len = MIXT_Get_Mean_Edge_Len(b, tree); sprintf(*s_tree + (int)strlen(*s_tree), format, MAX(0.0, mean_len)); } (*s_tree)[(int)strlen(*s_tree)] = ','; #ifndef MPI (*available) -= ((int)strlen(*s_tree) - last_len); /* printf("\n0 Available = %d [%d * %d]",(*available),(int)strlen(*s_tree),last_len); */ /* printf("\n0 %s [%d,%d]",*s_tree,(int)(int)strlen(*s_tree),*available); */ if (*available < 0) { PhyML_Fprintf(stderr, "\n. s=%s\n", *s_tree); PhyML_Fprintf(stderr, "\n. len=%d\n", (int)strlen(*s_tree)); PhyML_Fprintf( stderr, "\n. The sequence names in your input file might be too long."); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } if (*available < (int)S_TREE_CHUNK) { (*s_tree) = (char *)mRealloc( *s_tree, (int)strlen(*s_tree) + 3 * (int)S_TREE_CHUNK, sizeof(char)); for (i = 0; i < 3 * (int)S_TREE_CHUNK; ++i) (*s_tree)[(int)strlen(*s_tree) + i] = '\0'; (*available) = 3 * (int)S_TREE_CHUNK; } #endif } else // Internal node { (*s_tree)[(int)strlen(*s_tree)] = '('; #ifndef MPI (*available) -= 1; if (*available < (int)S_TREE_CHUNK) { (*s_tree) = (char *)mRealloc( *s_tree, (int)strlen(*s_tree) + 3 * (int)S_TREE_CHUNK, sizeof(char)); for (i = 0; i < 3 * (int)S_TREE_CHUNK; ++i) (*s_tree)[(int)strlen(*s_tree) + i] = '\0'; (*available) = 3 * (int)S_TREE_CHUNK; } #endif for (i = 0; i < 3; i++) { if ((fils->v[i] != pere) && (fils->b[i] != tree->e_root)) R_wtree(fils, fils->v[i], fils->b[i], available, s_tree, tree); else p = i; } if (p < 0) assert(false); last_len = (int)strlen(*s_tree); (*s_tree)[last_len - 1] = ')'; if ((fils->b) && (tree->write_br_lens == YES)) { if (tree->print_labels == YES) Print_Labels(NULL, *s_tree + (int)strlen(*s_tree), fils->label); if (tree->io && tree->io->print_support_val == YES) { if (tree->io->do_boot == YES) { sprintf(*s_tree + (int)strlen(*s_tree), "%.0f", fils->b[p]->support_val); } else { sprintf(*s_tree + (int)strlen(*s_tree), "%f", fils->b[p]->support_val); } } if (tree->io && tree->io->print_node_num == YES) { sprintf(*s_tree + (int)strlen(*s_tree), "%d", fils->num); } fflush(NULL); (*s_tree)[(int)strlen(*s_tree)] = ':'; if (tree->print_labels == YES) Print_Labels(NULL, *s_tree + (int)strlen(*s_tree), b->label); if (tree->is_mixt_tree == NO) mean_len = b->l->v; else mean_len = MIXT_Get_Mean_Edge_Len(b, tree); sprintf(*s_tree + (int)strlen(*s_tree), format, MAX(0.0, mean_len)); } (*s_tree)[(int)strlen(*s_tree)] = ','; #ifndef MPI (*available) -= ((int)strlen(*s_tree) - last_len); if (*available < 0) { PhyML_Fprintf(stderr, "\n. available = %d", *available); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } if (*available < (int)S_TREE_CHUNK) { (*s_tree) = (char *)mRealloc( *s_tree, (int)strlen(*s_tree) + 3 * (int)S_TREE_CHUNK, sizeof(char)); for (i = 0; i < 3 * (int)S_TREE_CHUNK; ++i) (*s_tree)[(int)strlen(*s_tree) + i] = '\0'; (*available) = 3 * (int)S_TREE_CHUNK; } #endif } Free(format); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Detect_Align_File_Format(option *io) { int c; fpos_t curr_pos; fgetpos(io->fp_in_align, &curr_pos); errno = 0; while ((c = fgetc(io->fp_in_align)) != EOF) { if (errno) io->data_file_format = PHYLIP; else if (c == '#') { char s[10], t[6] = "NEXUS"; if (!fgets(s, 6, io->fp_in_align)) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } if (!strcmp(t, s)) { fsetpos(io->fp_in_align, &curr_pos); io->data_file_format = NEXUS; return; } } } fsetpos(io->fp_in_align, &curr_pos); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Detect_Tree_File_Format(option *io) { int c; fpos_t curr_pos; assert(io->fp_in_tree != NULL); fgetpos(io->fp_in_tree, &curr_pos); errno = 0; while ((c = fgetc(io->fp_in_tree)) != EOF) { if (errno) { io->tree_file_format = PHYLIP; PhyML_Printf("\n. Detected PHYLIP tree file format."); } else if (c == '#') { char s[10], t[6] = "NEXUS"; if (!fgets(s, 6, io->fp_in_tree)) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } if (!strcmp(t, s)) { fsetpos(io->fp_in_tree, &curr_pos); io->tree_file_format = NEXUS; PhyML_Printf("\n. Detected NEXUS tree file format."); return; } } } fsetpos(io->fp_in_tree, &curr_pos); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// align **Get_Seq(option *io) { io->data = NULL; if (!io->fp_in_align) { PhyML_Fprintf(stderr, "\n. Filehandle to '%s' seems to be closed.", io->in_align_file); Exit("\n"); } Detect_Align_File_Format(io); switch (io->data_file_format) { case PHYLIP: { io->data = Get_Seq_Phylip(io); break; } case NEXUS: { io->nex_com_list = Make_Nexus_Com(); Init_Nexus_Format(io->nex_com_list, io->fp_in_align); Get_Nexus_Data(io); Free_Nexus(io); break; } default: { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s')\n", __FILE__, __LINE__, __FUNCTION__); Exit("\n"); break; } } if (!io->data) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s')\n", __FILE__, __LINE__, __FUNCTION__); Exit("\n"); } else { Post_Process_Data(io); } if (io->n_otu < 3) { PhyML_Fprintf( stderr, "\n. PhyML needs at least three sequences to perform an analysis."); assert(FALSE); } return io->data; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Post_Process_Data(option *io) { int i, j, swap; align *data_buff; for (i = 0; i < io->data[0]->len; ++i) { for (j = 0; j < io->n_otu; ++j) { if ((io->data[j]->state[i] == '*') || (io->data[j]->state[i] == '?') || (io->data[j]->state[i] == '-')) io->data[j]->state[i] = 'X'; if ((io->datatype == NT) && (io->data[j]->state[i] == 'N')) io->data[j]->state[i] = 'X'; if (io->data[j]->state[i] == 'U') io->data[j]->state[i] = 'T'; } } for (i = 0; i < io->n_otu; ++i) io->data[i]->len = io->data[0]->len; /* Sequences are ordered alphabetically */ data_buff = NULL; swap = TRUE; /* swap = FALSE; */ while (swap == TRUE) { swap = FALSE; for (i = 0; i < io->n_otu - 1; i++) { for (j = i + 1; j < io->n_otu; j++) { if (strcmp(io->data[i]->name, io->data[j]->name) < 0) { swap = TRUE; data_buff = io->data[i]; io->data[i] = io->data[j]; io->data[j] = data_buff; } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Nexus_Data(option *io) { char *token; nexcom *curr_com; nexparm *curr_parm; int nxt_token_t, cur_token_t; FILE *fp; assert(io->nex_com_list[0] != NULL); fp = io->nex_com_list[0]->fp; token = (char *)mCalloc(T_MAX_TOKEN, sizeof(char)); curr_com = NULL; curr_parm = NULL; nxt_token_t = NEXUS_COM; cur_token_t = -1; do { /* PhyML_Printf("\n+ Token: '%s' next_token=%d * cur_token=%d",token,nxt_token_t,cur_token_t); */ if (!Get_Token(fp, token)) break; if (token[0] == ';') { curr_com = NULL; curr_parm = NULL; nxt_token_t = NEXUS_COM; cur_token_t = -1; } if (nxt_token_t == NEXUS_EQUAL) { cur_token_t = NEXUS_VALUE; nxt_token_t = NEXUS_PARM; continue; } if ((nxt_token_t == NEXUS_COM) && (cur_token_t != NEXUS_VALUE)) { Find_Nexus_Com(token, &curr_com, &curr_parm, io->nex_com_list); if (curr_com) { nxt_token_t = curr_com->nxt_token_t; cur_token_t = curr_com->cur_token_t; } if (cur_token_t != NEXUS_VALUE) continue; } if ((nxt_token_t == NEXUS_PARM) && (cur_token_t != NEXUS_VALUE)) { Find_Nexus_Parm(token, &curr_parm, curr_com); if (curr_parm) { nxt_token_t = curr_parm->nxt_token_t; cur_token_t = curr_parm->cur_token_t; } if (cur_token_t != NEXUS_VALUE) continue; } if (cur_token_t == NEXUS_VALUE) { if ((curr_parm->func)(token, curr_parm, io)) /* Read in parameter value */ { nxt_token_t = NEXUS_PARM; cur_token_t = -1; } } } while (strlen(token) > 0); Free(token); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Get_Token(FILE *fp, char *token) { char c; assert(fp != NULL); c = ' '; while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { c = fgetc(fp); if (c == EOF) return 0; } if (c == '"') { do { *token = c; token++; c = fgetc(fp); if (c == EOF) return 0; } while (c != '"'); *token = c; /* c = fgetc(fp); */ if (c == EOF) return 0; *(token + 1) = '\0'; return 1; } if (c == '[') { Skip_Comment(fp); c = fgetc(fp); *token = c; token++; if (c == EOF) return 0; return 1; } if (c == '#') { *token = c; token++; } else if (c == ';') { *token = c; token++; } else if (c == ',') { *token = c; token++; } else if (c == '.') { *token = c; token++; } else if (c == '=') { *token = c; token++; } else if (c == '(') { *token = c; token++; } else if (c == ')') { *token = c; token++; } else if (c == '{') { *token = c; token++; } else if (c == '}') { *token = c; token++; } else if (c == '?') { *token = c; token++; } else if (c == '-') { *token = c; token++; } else { /* while(isgraph(c) && c != ';' && c != '-' && c != ',' && c != '=') */ while (isgraph(c) && c != ';' && c != ',' && c != '=') { *(token++) = c; c = fgetc(fp); if (c == EOF) return 0; } fseek(fp, -1 * sizeof(char), SEEK_CUR); } *token = '\0'; return 1; } /* void Get_Token(char *line, char *token) */ /* { */ /* while(**line == ' ' || **line == '\t') (*line)++; */ /* if(**line == '"') */ /* { */ /* do { *token = **line; (*line)++; token++; } while(**line != '"'); */ /* *token = **line; */ /* (*line)++; */ /* *(token+1) = '\0'; */ /* return; */ /* } */ /* if(**line == '[') */ /* { */ /* int in_comment; */ /* in_comment = 1; */ /* do */ /* { */ /* (*line)++; */ /* if(**line == '[') */ /* { */ /* in_comment++; */ /* } */ /* else if(**line == ']') in_comment--; */ /* } */ /* while(in_comment); */ /* (*line)++; */ /* return; */ /* } */ /* if(**line == '#') {*token = **line; (*line)++; token++; } */ /* else if(**line == ';') {*token = **line; (*line)++; token++; } */ /* else if(**line == ',') {*token = **line; (*line)++; token++; } */ /* else if(**line == '.') {*token = **line; (*line)++; token++; } */ /* else if(**line == '=') {*token = **line; (*line)++; token++; } */ /* else if(**line == '(') {*token = **line; (*line)++; token++; } */ /* else if(**line == ')') {*token = **line; (*line)++; token++; } */ /* else if(**line == '{') {*token = **line; (*line)++; token++; } */ /* else if(**line == '}') {*token = **line; (*line)++; token++; } */ /* else if(**line == '?') {*token = **line; (*line)++; token++; } */ /* else if(**line == '-') {*token = **line; (*line)++; token++; } */ /* else */ /* { */ /* while(isgraph(**line) && **line != ';' && **line != '=' && **line != * ',') */ /* { */ /* *(token++) = **line; */ /* (*line)++; */ /* } */ /* } */ /* *token = '\0'; */ /* } */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// align **Get_Seq_Phylip(option *io) { Read_Ntax_Len_Phylip(io->fp_in_align, &io->n_otu, &io->init_len); if (io->n_otu > N_MAX_OTU) { PhyML_Fprintf(stderr, "\n. The number of taxa should not exceed %d", N_MAX_OTU); assert(FALSE); } if (io->interleaved == YES) io->data = Read_Seq_Interleaved(io); else io->data = Read_Seq_Sequential(io); return io->data; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Ntax_Len_Phylip(FILE *fp, int *n_otu, int *n_tax) { char *line; int readok; line = (char *)mCalloc(T_MAX_LINE, sizeof(char)); readok = 0; do { if (fscanf(fp, "%s", line) == EOF) { Free(line); PhyML_Fprintf(stderr, "\n. PhyML can't read in this alignment."); PhyML_Fprintf(stderr, "\n. Could it be that sequence file is empty?"); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } else { if (strcmp(line, "\n") && strcmp(line, "\r") && strcmp(line, "\t")) { sscanf(line, "%d", n_otu); if (*n_otu <= 0) Warn_And_Exit("\n. The number of taxa cannot be negative.\n"); if (!fscanf(fp, "%s", line)) Exit("\n"); sscanf(line, "%d", n_tax); if (*n_tax <= 0) Warn_And_Exit("\n. The sequence length cannot be negative.\n"); else readok = 1; } } } while (!readok); Free(line); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// align **Read_Seq_Sequential(option *io) { int i; char *line; align **data; /* char c; */ char *format; format = (char *)mCalloc(T_MAX_NAME, sizeof(char)); line = (char *)mCalloc(T_MAX_LINE, sizeof(char)); data = (align **)mCalloc(io->n_otu, sizeof(align *)); /* while((c=fgetc(in))!='\n'); */ /* while(((c=fgetc(io->fp_in_align))!='\n') && (c != ' ') && (c != '\r') && * (c != '\t')); */ sprintf(format, "%%%ds", T_MAX_NAME); for (i = 0; i < io->n_otu; i++) { data[i] = (align *)mCalloc(1, sizeof(align)); data[i]->name = (char *)mCalloc(T_MAX_NAME, sizeof(char)); data[i]->state = (char *)mCalloc(io->init_len * io->state_len + 1, sizeof(char)); data[i]->is_ambigu = NULL; data[i]->len = 0; if (!fscanf(io->fp_in_align, format, data[i]->name)) Exit("\n"); Check_Sequence_Name(data[i]->name); while (data[i]->len < io->init_len * io->state_len) assert(Read_One_Line_Seq(&data, i, io->fp_in_align)); if (data[i]->len != io->init_len * io->state_len) { PhyML_Fprintf( stderr, "\n. Err. Problem with species %s's sequence (check the format).\n", data[i]->name); PhyML_Fprintf(stderr, "\n. Observed sequence length: %d, expected length: %d\n", data[i]->len, io->init_len * io->state_len); Warn_And_Exit(""); } } for (i = 0; i < io->n_otu; i++) data[i]->state[data[i]->len] = '\0'; Restrict_To_Coding_Position(data, io); Free(format); Free(line); return data; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// align **Read_Seq_Interleaved(option *io) { int i, end, num_block; char *line; align **data; /* char c; */ char *format; fpos_t curr_pos; line = (char *)mCalloc(T_MAX_LINE, sizeof(char)); format = (char *)mCalloc(T_MAX_NAME, sizeof(char)); data = (align **)mCalloc(io->n_otu, sizeof(align *)); /* while(((c=fgetc(io->fp_in_align))!='\n') && (c != ' ') && (c != '\r') && * (c != '\t')); */ sprintf(format, "%%%ds", T_MAX_NAME); end = 0; for (i = 0; i < io->n_otu; i++) { data[i] = (align *)mCalloc(1, sizeof(align)); data[i]->name = (char *)mCalloc(T_MAX_NAME, sizeof(char)); data[i]->state = (char *)mCalloc(io->init_len * io->state_len + 1, sizeof(char)); data[i]->len = 0; data[i]->is_ambigu = NULL; if (!fscanf(io->fp_in_align, format, data[i]->name)) Exit("\n"); Check_Sequence_Name(data[i]->name); if (!Read_One_Line_Seq(&data, i, io->fp_in_align)) { end = 1; if ((i != io->n_otu) && (i != io->n_otu - 1)) { PhyML_Fprintf(stderr, "\n. Err.: problem with species %s's sequence.\n", data[i]->name); PhyML_Fprintf(stderr, "\n. Observed sequence length: %d, expected length: %d\n", data[i]->len, io->init_len * io->state_len); Exit(""); } break; } } if (data[0]->len == io->init_len * io->state_len) end = 1; /* if(end) printf("\n. finished yet '%c'\n",fgetc(io->fp_in_align)); */ if (!end) { end = 0; num_block = 1; do { num_block++; /* interblock */ if (!fgets(line, T_MAX_LINE, io->fp_in_align)) break; if (line[0] != 13 && line[0] != 10) { PhyML_Fprintf(stderr, "\n. Err.: one or more missing sequences in block %d.\n", num_block - 1); Exit(""); } for (i = 0; i < io->n_otu; i++) if (data[i]->len != io->init_len * io->state_len) break; if (i == io->n_otu) break; for (i = 0; i < io->n_otu; i++) { /* Skip the taxon name, if any, in this interleaved block */ fgetpos(io->fp_in_align, &curr_pos); if (!fscanf(io->fp_in_align, format, line)) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } if (line && strcmp(line, data[i]->name)) fsetpos(io->fp_in_align, &curr_pos); if (data[i]->len > io->init_len * io->state_len) { PhyML_Fprintf(stderr, "\n. Observed sequence length=%d expected length=%d.\n", data[i]->len, io->init_len * io->state_len); PhyML_Fprintf(stderr, "\n. Err.: Problem with species %s's sequence.\n", data[i]->name); Exit(""); } else if (!Read_One_Line_Seq(&data, i, io->fp_in_align)) { end = 1; if ((i != io->n_otu) && (i != io->n_otu - 1)) { PhyML_Fprintf(stderr, "\n. Err.: Problem with species %s's sequence.\n", data[i]->name); PhyML_Fprintf( stderr, "\n. Observed sequence length: %d, expected length: %d.\n", data[i]->len, io->init_len * io->state_len); Exit(""); } break; } } } while (!end); } for (i = 0; i < io->n_otu; i++) data[i]->state[data[i]->len] = '\0'; for (i = 0; i < io->n_otu; i++) { if (data[i]->len != io->init_len * io->state_len) { PhyML_Fprintf(stderr, "\n. Check sequence '%s' length (expected length: %d, " "observed length: %d) [OTU %d].\n", data[i]->name, io->init_len, data[i]->len, i + 1); Exit(""); } } Restrict_To_Coding_Position(data, io); Free(format); Free(line); return data; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_One_Line_Seq(align ***data, int num_otu, FILE *in) { char c = ' '; int nchar = 0; while (1) { /* if((c == EOF) || (c == '\n') || (c == '\r')) break; */ if ((c == 13) || (c == 10)) { /* PhyML_Printf("[%d %d]\n",c,nchar); fflush(NULL); */ if (!nchar) { c = (char)fgetc(in); continue; } else { /* PhyML_Printf("break\n"); */ break; } } else if (c == EOF) { /* PhyML_Printf("EOL\n"); */ break; } else if ((c == ' ') || (c == '\t') || (c == 32)) { /* PhyML_Printf("[%d]",c); */ c = (char)fgetc(in); continue; } nchar++; Uppercase(&c); if (c == '.') { c = (*data)[0]->state[(*data)[num_otu]->len]; if (!num_otu) Warn_And_Exit( "\n. Err: Symbol \".\" should not appear in the first sequence\n"); } (*data)[num_otu]->state[(*data)[num_otu]->len] = c; (*data)[num_otu]->len++; c = (char)fgetc(in); /* PhyML_Printf("[%c %d]",c,c); fflush(NULL); */ if (c == ';') break; } /* printf("\n. Exit nchar: %d [%d]\n",nchar,c==EOF); */ if (c == EOF) return 0; else return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// scalar_dbl *Read_Io_Weights(option *io) { scalar_dbl *w, *ori, *prev = NULL; double val; assert(io->weight_file); io->fp_weight_file = Openfile(io->weight_file, READ); w = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); ori = w; do { if (fscanf(io->fp_weight_file, "%lf,", &val) == EOF) break; w->v = (phydbl)val; w->next = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); prev = w; w = w->next; } while (1); /* Remove the last allocated and empty element of the list */ if (prev != NULL && prev->next != NULL) { Free(prev->next); prev->next = NULL; } fclose(io->fp_weight_file); return (ori); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *Return_Tree_String_Phylip(FILE *fp_input_tree) { char *line; int i; char c; int open, maxopen; if (fp_input_tree == NULL) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } do { c = fgetc(fp_input_tree); } while ((c != '(') && (c != EOF)); if (c == EOF) return NULL; line = (char *)mCalloc(1, sizeof(char)); open = 1; maxopen = open; i = 0; for (;;) { if ((c == ' ') || (c == '\n')) { c = fgetc(fp_input_tree); if (c == EOF || c == ';') break; else continue; } /* if(c == '[') */ /* { */ /* Skip_Comment(fp_input_tree); */ /* c = fgetc(fp_input_tree); */ /* if(c == EOF || c == ';') break; */ /* } */ line = (char *)mRealloc(line, i + 2, sizeof(char)); line[i] = c; i++; c = fgetc(fp_input_tree); if (c == EOF || c == ';') break; if (c == '(') open++; if (c == ')') open--; if (open > maxopen) maxopen = open; } line[i] = '\0'; /* if(maxopen == 1) return NULL; */ return line; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *Read_Tree_File_Phylip(FILE *fp_input_tree) { char *line; t_tree *tree; line = Return_Tree_String_Phylip(fp_input_tree); tree = Read_Tree(&line); Free(line); return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Site(calign *cdata, int num, int n_otu, char *sep, int stepsize, FILE *fp) { int i, j; PhyML_Fprintf(fp, "\n"); for (i = 0; i < n_otu; i++) { PhyML_Fprintf(fp, "%20s ", cdata->c_seq[i]->name); for (j = 0; j < stepsize; j++) PhyML_Fprintf(fp, "%c", cdata->c_seq[i]->state[num + j]); PhyML_Fprintf(fp, "%s", sep); } PhyML_Fprintf(fp, "%s", sep); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Site_Lk(t_tree *tree, FILE *fp) { int site; int catg; char *s; phydbl postmean, sum; assert(fp); rewind(fp); if (tree->is_mixt_tree == YES) { MIXT_Print_Site_Lk(tree, fp); return; } assert(tree->io->print_site_lnl == YES); if (!tree->io->print_trace) { s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); PhyML_Fprintf(fp, "# Note : P(D|M) is the probability of site D given the " "model M (i.e., the site likelihood)\n"); if (tree->mod->ras->n_catg > 1 || tree->mod->ras->invar) { PhyML_Fprintf(fp, "# P*(D|M,rr[x]) is the scaled probability of site D " "given the model M and the relative rate\n"); PhyML_Fprintf(fp, "# of evolution rr[x], where x is the class of rate to " "be considered.\n"); PhyML_Fprintf(fp, "# The actual conditional probability is given by " "P*(D|M,rr[x])/2^F, where\n"); PhyML_Fprintf(fp, "# F is the scaling factor (see column 'Scaler').\n"); PhyML_Fprintf(fp, "# For invariant sites, P(D|M,rr[0]=0) is the actual " "conditional probability\n"); PhyML_Fprintf(fp, "# (i.e., it is not scaled).\n"); } PhyML_Fprintf(fp, "\n\n"); sprintf(s, "Site"); PhyML_Fprintf(fp, "%-12s", s); sprintf(s, "P(D|M)"); PhyML_Fprintf(fp, "%-15s", s); sprintf(s, "Scaler"); PhyML_Fprintf(fp, "%-7s", s); sprintf(s, "Pattern"); PhyML_Fprintf(fp, "%-9s", s); if (tree->mod->ras->n_catg > 1) { for (catg = 0; catg < tree->mod->ras->n_catg; catg++) { sprintf(s, "P*(D|M,rr[%d]=%5.4f)", catg + 1, tree->mod->ras->gamma_rr->v[catg]); PhyML_Fprintf(fp, "%-23s", s); } sprintf(s, "Posterior mean"); PhyML_Fprintf(fp, "%-22s", s); } if (tree->mod->ras->invar) { sprintf(s, "P(D|M,rr[0]=0)"); PhyML_Fprintf(fp, "%-16s", s); } sprintf(s, "NDistinctStates"); PhyML_Fprintf(fp, "%-16s", s); PhyML_Fprintf(fp, "\n"); Init_Ui_Tips(tree); for (site = 0; site < tree->data->init_len; site++) { PhyML_Fprintf(fp, "%-12d", site + 1); PhyML_Fprintf(fp, "%-15g", tree->cur_site_lk[tree->data->sitepatt[site]]); PhyML_Fprintf(fp, "%-7d", tree->fact_sum_scale[tree->data->sitepatt[site]]); PhyML_Fprintf(fp, "%-9d", tree->data->sitepatt[site]); if (tree->mod->ras->n_catg > 1) { for (catg = 0; catg < tree->mod->ras->n_catg; catg++) { PhyML_Fprintf(fp, "%-23g", tree->unscaled_site_lk_cat[tree->data->sitepatt[site] * tree->mod->ras->n_catg + catg]); } postmean = .0; for (catg = 0; catg < tree->mod->ras->n_catg; catg++) postmean += tree->mod->ras->gamma_rr->v[catg] * tree->unscaled_site_lk_cat[tree->data->sitepatt[site] * tree->mod->ras->n_catg + catg] * tree->mod->ras->gamma_r_proba->v[catg]; sum = .0; for (catg = 0; catg < tree->mod->ras->n_catg; catg++) { sum += tree->unscaled_site_lk_cat[tree->data->sitepatt[site] * tree->mod->ras->n_catg + catg] * tree->mod->ras->gamma_r_proba->v[catg]; } postmean /= sum; PhyML_Fprintf(fp, "%-22g", postmean); } if (tree->mod->ras->invar) { if ((phydbl)tree->data->invar[tree->data->sitepatt[site]] > -0.5) PhyML_Fprintf(fp, "%-16g", tree->mod->e_frq->pi ->v[tree->data->invar[tree->data->sitepatt[site]]]); else PhyML_Fprintf(fp, "%-16g", 0.0); } PhyML_Fprintf( fp, "%-16d", Number_Of_Diff_States_One_Site(tree->data->sitepatt[site], tree)); PhyML_Fprintf(fp, "\n"); } Free(s); } else { for (site = 0; site < tree->data->init_len; site++) PhyML_Fprintf(fp, "%.2f\t", log(tree->cur_site_lk[tree->data->sitepatt[site]])); PhyML_Fprintf(fp, "\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Seq(FILE *fp, align **data, int n_otu) { int i, j; PhyML_Fprintf(fp, "%d\t%d\n", n_otu, data[0]->len); for (i = 0; i < n_otu; i++) { PhyML_Fprintf(fp, "%s\t", data[i]->name); /* for(j=0;j<20;j++) */ /* { */ /* if(j<(int)strlen(data[i]->name)) */ /* fputc(data[i]->name[j],fp); */ /* else fputc(' ',fp); */ /* } */ /* PhyML_Printf("%10d ",i); */ For(j, data[i]->len) { PhyML_Fprintf(fp, "%c", data[i]->state[j]); } PhyML_Fprintf(fp, "\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_CSeq(FILE *fp, int compressed, calign *cdata, t_tree *tree) { int i, j; int n_otu; n_otu = cdata->n_otu; if (cdata->format == PHYLIP) { PhyML_Fprintf(fp, "%d\t%d\n", n_otu, cdata->init_len); } else if (cdata->format == NEXUS) { PhyML_Fprintf(fp, "#NEXUS\n"); PhyML_Fprintf(fp, "begin data\n"); PhyML_Fprintf(fp, "dimensions ntax=%d nchar=%d;\n", n_otu, cdata->init_len); PhyML_Fprintf(fp, "format sequential datatype=dna;\n"); PhyML_Fprintf(fp, "matrix\n"); } else { PhyML_Fprintf(fp, "This sample file is to be processed by IBDSim " "(http://www1.montpellier.inra.fr/CBGP/software/ibdsim/)"); } if (cdata->format == PHYLIP || cdata->format == NEXUS) { for (i = 0; i < n_otu; i++) { for (j = 0; j < 50; j++) { if (j < (int)strlen(cdata->c_seq[i]->name)) fputc(cdata->c_seq[i]->name[j], fp); else fputc(' ', fp); } if (compressed == YES) /* Print out compressed sequences */ PhyML_Fprintf(fp, "%s", cdata->c_seq[i]->state); else /* Print out uncompressed sequences */ { for (j = 0; j < cdata->init_len; j++) { PhyML_Fprintf(fp, "%c", cdata->c_seq[i]->state[cdata->sitepatt[j]]); } } PhyML_Fprintf(fp, "\n"); } PhyML_Fprintf(fp, "\n"); if (cdata->format == NEXUS) { PhyML_Fprintf(fp, ";\n"); PhyML_Fprintf(fp, "END;\n"); } } else if (cdata->format == IBDSIM) { for (i = 0; i < cdata->init_len; i++) PhyML_Fprintf(fp, "\nlocus %6d", i); for (i = 0; i < n_otu; i++) { PhyML_Fprintf(fp, "\npop"); PhyML_Fprintf(fp, "%12f %12f , ", tree ? tree->a_nodes[i]->coord->lonlat[0] : -1., tree ? tree->a_nodes[i]->coord->lonlat[1] : -1.); if (tree != NULL) { for (j = 0; j < cdata->init_len; j++) { switch (tree->a_nodes[i]->c_seq->state[j]) { case 'A': { PhyML_Fprintf(fp, "001 "); break; } case 'C': { PhyML_Fprintf(fp, "002 "); break; } case 'G': { PhyML_Fprintf(fp, "003 "); break; } case 'T': { PhyML_Fprintf(fp, "004 "); break; } } } } } } /* PhyML_Printf("\t"); */ /* for(j=0;jcrunch_len;j++) */ /* PhyML_Printf("%.0f ",cdata->wght[j]); */ /* PhyML_Printf("\n"); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_CSeq_Select(FILE *fp, int compressed, calign *cdata, t_tree *tree) { int i, j; int n_otu; phydbl eps; int slice = 14; eps = 1.E-6; n_otu = 0; for (i = 0; i < cdata->n_otu; i++) if (tree->times->nd_t[i] < tree->times->time_slice_lims[slice] + eps) n_otu++; PhyML_Fprintf(fp, "%d\t%d\n", n_otu, cdata->init_len); n_otu = cdata->n_otu; for (i = 0; i < n_otu; i++) { if (tree->times->nd_t[i] < tree->times->time_slice_lims[slice] + eps) { for (j = 0; j < 50; j++) { if (j < (int)strlen(cdata->c_seq[i]->name)) fputc(cdata->c_seq[i]->name[j], fp); else fputc(' ', fp); } if (compressed == YES) /* Print out compressed sequences */ PhyML_Fprintf(fp, "%s", cdata->c_seq[i]->state); else /* Print out uncompressed sequences */ { for (j = 0; j < cdata->init_len; j++) { PhyML_Fprintf(fp, "%c", cdata->c_seq[i]->state[cdata->sitepatt[j]]); } } PhyML_Fprintf(fp, "\n"); } } if (cdata->format == 1) { PhyML_Fprintf(fp, ";\n"); PhyML_Fprintf(fp, "END;\n"); } /* PhyML_Printf("\t"); */ /* for(j=0;jcrunch_len;j++) */ /* PhyML_Printf("%.0f ",cdata->wght[j]); */ /* PhyML_Printf("\n"); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Dist(matrix *mat) { int i, j; for (i = 0; i < mat->n_otu; i++) { PhyML_Printf("%s ", mat->name[i]); for (j = 0; j < mat->n_otu; j++) PhyML_Printf("%9.6f ", mat->dist[i][j]); PhyML_Printf("\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Node(t_node *a, t_node *d, t_tree *tree) { int i; int dir; dir = -1; for (i = 0; i < 3; i++) if (a->v[i] == d) { dir = i; break; } PhyML_Printf("Node nums: %3d %3d (dir:%3d) (a->anc:%3d) (d->anc:%3d) " "ta:%8.4f td:%8.4f t_min:%6.2f t_max:%6.2f", a->num, d->num, dir, a->anc ? a->anc->num : (-1), d->anc ? d->anc->num : (-1), tree->rates ? tree->times->nd_t[a->num] : -1., tree->rates ? tree->times->nd_t[d->num] : -1., tree->rates ? tree->times->t_prior_min[a->num] : -1., tree->rates ? tree->times->t_prior_max[a->num] : -1.); PhyML_Printf(" names = '%10s' '%10s' ; ", a->name, d->name); for (i = 0; i < 3; i++) if (a->v[i] == d) { if (a->b[i]) { PhyML_Printf("Branch num = %3d%c (%3d %3d) %f", a->b[i]->num, a->b[i] == tree->e_root ? '*' : ' ', a->b[i]->left->num, a->b[i]->rght->num, a->b[i]->l->v); if (a->b[i]->left->tax) PhyML_Printf(" WARNING LEFT->TAX!"); break; } } PhyML_Printf("\n"); if (d->tax) return; else for (i = 0; i < 3; i++) if (d->v[i] != a && d->b[i] != tree->e_root) Print_Node(d, d->v[i], tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Node_Brief(t_node *a, t_node *d, t_tree *tree, FILE *fp) { int i; int dir; dir = -1; for (i = 0; i < 3; i++) if (a->v[i] == d) { dir = i; break; } PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "Node nums: %3d %3d (dir:%3d)", a->num, d->num, dir); PhyML_Fprintf(fp, "\tnames = '%10s' '%10s' ; ", a->name, d->name); for (i = 0; i < 3; i++) if (a->v[i] == d) { if (a->b[i]) { PhyML_Fprintf(fp, "Branch num = %3d%c (%3d %3d) length:%10f", a->b[i]->num, a->b[i] == tree->e_root ? '*' : ' ', a->b[i]->left->num, a->b[i]->rght->num, a->b[i]->l->v); if (a->b[i]->left->tax) PhyML_Printf(" WARNING LEFT->TAX!"); break; } } if (d->tax) return; else for (i = 0; i < 3; i++) if (d->v[i] != a && d->b[i] != tree->e_root) Print_Node_Brief(d, d->v[i], tree, fp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Model(t_mod *mod) { int i, j, k; PhyML_Printf("\n. name=%s", mod->modelname->s); PhyML_Printf("\n. string=%s", mod->custom_mod_string); PhyML_Printf("\n. mod_num=%d", mod->mod_num); PhyML_Printf("\n. ns=%d", mod->ns); PhyML_Printf("\n. n_catg=%d", mod->ras->n_catg); PhyML_Printf("\n. kappa=%f", mod->kappa->v); PhyML_Printf("\n. alpha=%f", mod->ras->alpha->v); PhyML_Printf("\n. lambda=%f", mod->lambda->v); PhyML_Printf("\n. pinvar=%f", mod->ras->pinvar->v); PhyML_Printf("\n. br_len_mult=%f", mod->br_len_mult->v); PhyML_Printf("\n. whichmodel=%d", mod->whichmodel); PhyML_Printf("\n. update_eigen=%d", mod->update_eigen); PhyML_Printf("\n. bootstrap=%d", mod->io->n_boot_replicates); PhyML_Printf("\n. n_diff_rr=%d", mod->r_mat->n_diff_rr); PhyML_Printf("\n. invar=%d", mod->ras->invar); PhyML_Printf("\n. use_m4mod=%d", mod->use_m4mod); PhyML_Printf("\n. gamma_median=%d", mod->ras->gamma_median); PhyML_Printf("\n. state_len=%d", mod->io->state_len); PhyML_Printf("\n. log_l=%d", mod->log_l); PhyML_Printf("\n. l_min=%f", mod->l_min); PhyML_Printf("\n. l_max=%f", mod->l_max); PhyML_Printf("\n. free_mixt_rates=%d", mod->ras->free_mixt_rates); PhyML_Printf("\n. gamma_mgf_bl=%d", mod->gamma_mgf_bl); PhyML_Printf("\n. Pi\n"); for (i = 0; i < mod->ns; i++) PhyML_Printf(" %f ", mod->e_frq->pi->v[i]); PhyML_Printf("\n"); for (i = 0; i < mod->ns; i++) PhyML_Printf(" %f ", mod->e_frq->pi_unscaled->v[i]); PhyML_Printf("\n. Rates\n"); for (i = 0; i < mod->ras->n_catg; i++) PhyML_Printf(" %f ", mod->ras->gamma_r_proba->v[i]); PhyML_Printf("\n"); for (i = 0; i < mod->ras->n_catg; i++) PhyML_Printf(" %f ", mod->ras->gamma_r_proba_unscaled->v[i]); PhyML_Printf("\n"); for (i = 0; i < mod->ras->n_catg; i++) PhyML_Printf(" %f ", mod->ras->gamma_rr->v[i]); PhyML_Printf("\n"); for (i = 0; i < mod->ras->n_catg; i++) PhyML_Printf(" %f ", mod->ras->gamma_rr_unscaled->v[i]); PhyML_Printf("\n. Qmat \n"); if (mod->whichmodel == CUSTOM) { fflush(NULL); for (i = 0; i < 6; i++) { PhyML_Printf(" %12f ", mod->r_mat->rr->v[i]); fflush(NULL); } for (i = 0; i < 6; i++) { PhyML_Printf(" %12f ", mod->r_mat->rr_val->v[i]); fflush(NULL); } for (i = 0; i < 6; i++) { PhyML_Printf(" %12d ", mod->r_mat->rr_num->v[i]); fflush(NULL); } for (i = 0; i < 6; i++) { PhyML_Printf(" %12d ", mod->r_mat->n_rr_per_cat->v[i]); fflush(NULL); } } for (i = 0; i < mod->ns; i++) { PhyML_Printf(" "); for (j = 0; j < 4; j++) PhyML_Printf("%8.5f ", mod->r_mat->qmat->v[i * 4 + j]); PhyML_Printf("\n"); } PhyML_Printf("\n. Freqs"); PhyML_Printf("\n"); for (i = 0; i < mod->ns; i++) PhyML_Printf(" %12f ", mod->e_frq->user_b_freq->v[i]); PhyML_Printf("\n"); for (i = 0; i < mod->ns; i++) PhyML_Printf(" %12f ", mod->e_frq->pi->v[i]); PhyML_Printf("\n"); for (i = 0; i < mod->ns; i++) PhyML_Printf(" %12f ", mod->e_frq->pi_unscaled->v[i]); PhyML_Printf("\n. Eigen\n"); For(i, 2 * mod->ns) PhyML_Printf(" %f ", mod->eigen->space[i]); /* PhyML_Printf("\n"); */ /* For(i,2*mod->ns) PhyML_Printf(" %f ",mod->eigen->space_int[i]); */ PhyML_Printf("\n"); for (i = 0; i < mod->ns; i++) PhyML_Printf(" %f ", mod->eigen->e_val[i]); PhyML_Printf("\n"); for (i = 0; i < mod->ns; i++) PhyML_Printf(" %f ", mod->eigen->e_val_im[i]); PhyML_Printf("\n"); For(i, mod->ns * mod->ns) PhyML_Printf(" %f ", mod->eigen->r_e_vect[i]); PhyML_Printf("\n"); For(i, mod->ns * mod->ns) PhyML_Printf(" %f ", mod->eigen->r_e_vect_im[i]); PhyML_Printf("\n"); For(i, mod->ns * mod->ns) PhyML_Printf(" %f ", mod->eigen->l_e_vect[i]); PhyML_Printf("\n"); For(i, mod->ns * mod->ns) PhyML_Printf(" %f ", mod->eigen->q[i]); PhyML_Printf("\n"); PhyML_Printf("\n. Pij"); for (k = 0; k < mod->ras->n_catg; k++) { PMat(0.01 * mod->ras->gamma_rr->v[k], mod, mod->ns * mod->ns * k, mod->Pij_rr->v, NULL); PhyML_Printf("\n. l=%f\n", 0.01 * mod->ras->gamma_rr->v[k]); for (i = 0; i < mod->ns; i++) { PhyML_Printf(" "); for (j = 0; j < mod->ns; j++) PhyML_Printf("%8.5f ", mod->Pij_rr->v[k * mod->ns * mod->ns + i * mod->ns + j]); PhyML_Printf("\n"); } } PhyML_Printf("\n"); fflush(NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Mat(matrix *mat) { int i, j; PhyML_Printf("\n\n"); PhyML_Printf("%d", mat->n_otu); PhyML_Printf("\n"); for (i = 0; i < mat->n_otu; i++) { for (j = 0; j < 13; j++) { if (j >= (int)strlen(mat->name[i])) putchar(' '); else putchar(mat->name[i][j]); } for (j = 0; j < mat->n_otu; j++) { char s[2] = "-"; if (mat->dist[i][j] < .0) PhyML_Printf("%12s", s); else PhyML_Printf("%12f", mat->dist[i][j]); } PhyML_Printf("\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// FILE *Openfile(char *filename, int mode) { FILE *fp; char *s; int open_test = 0; s = filename; fp = NULL; switch (mode) { case READ: { while (!(fp = (FILE *)fopen(s, "r")) && ++open_test < 10) { PhyML_Printf("\n. Can't open file '%s', enter a new name : ", s); Getstring_Stdin(s); } break; } case WRITE: { fp = (FILE *)fopen(s, "w"); break; } case APPEND: { fp = (FILE *)fopen(s, "a"); break; } case READWRITE: { fp = (FILE *)fopen(s, "w+"); break; } default: break; } /* Free(s); */ return fp; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Fp_Out(FILE *fp_out, time_t t_beg, time_t t_end, t_tree *tree, option *io, int n_data_set, int num_tree, int add_citation, int precision) { char *s; char format[8]; div_t hour, min; int i, j; if (precision > 0) snprintf(format, 8, "%%.%huf", (unsigned short)precision); if (n_data_set == 1) { rewind(fp_out); Print_Banner_Small(fp_out); } PhyML_Fprintf(fp_out, "\n. Sequence filename: \t\t\t%s", Basename(io->in_align_file)); PhyML_Fprintf(fp_out, "\n. Data set: \t\t\t\t#%d", n_data_set); if (io->mod->s_opt->random_input_tree) PhyML_Fprintf(fp_out, "\n. Random init tree: \t\t\t#%d", num_tree + 1); else if (io->n_trees > 1) PhyML_Fprintf(fp_out, "\n. Starting tree number: \t\t#%d", num_tree + 1); /* if(io->mod->s_opt->opt_topo) */ /* PhyML_Fprintf(fp_out,"\n. Tree topology search: \t\tSPRs"); */ /* else */ /* PhyML_Fprintf(fp_out,"\n. Tree topology: \t\t\tfixed"); */ /* was after Sequence file ; moved here FLT */ s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); if (io->in_tree == 2) { strcat(strcat(strcat(s, "user tree ("), io->in_tree_file), ")"); } else { if (!io->mod->s_opt->random_input_tree) { if (io->in_tree == 0) strcat(s, "BioNJ"); if (io->in_tree == 1) strcat(s, "parsimony"); } else strcat(s, "random tree"); } PhyML_Fprintf(fp_out, "\n. Initial tree: \t\t\t%s", s); Free(s); if (tree->io->datatype == NT) { PhyML_Fprintf(fp_out, "\n. Model of nucleotides substitution: \t%s", tree->mod->modelname->s); if (io->mod->whichmodel == CUSTOM) PhyML_Fprintf(fp_out, " (%s)", io->mod->custom_mod_string); } else if (tree->io->datatype == AA) { PhyML_Fprintf(fp_out, "\n. Model of amino acids substitution: \t%s", tree->mod->modelname->s); if (io->mod->whichmodel == CUSTOMAA) PhyML_Fprintf(fp_out, " (%s)", tree->mod->aa_rate_mat_file->s); } else { PhyML_Fprintf(fp_out, "\n. Substitution model: \t\t%s", tree->mod->modelname->s); } PhyML_Fprintf(fp_out, "\n. Integrated length (IL) model: \t%s", (tree->mod->gamma_mgf_bl == YES) ? "yes" : "no"); if (tree->mod->gamma_mgf_bl == YES) PhyML_Fprintf(fp_out, "\n. Variance of IL model: \t\t%f", tree->mod->l_var_sigma->v); PhyML_Fprintf(fp_out, "\n. Number of taxa: \t\t\t%d", tree->n_otu); /*added FLT*/ PhyML_Fprintf(fp_out, "\n. Log-likelihood: \t\t\t%.5f", tree->c_lnL); /*was last ; moved here FLT*/ Unconstraint_Lk(tree); PhyML_Fprintf(fp_out, "\n. Unconstrained log-likelihood: \t%.5f", tree->unconstraint_lk); Composite_Lk(tree); PhyML_Fprintf(fp_out, "\n. Composite log-likelihood: \t\t%.5f", tree->composite_lk); PhyML_Fprintf(fp_out, "\n. Parsimony: \t\t\t\t%d", tree->c_pars); PhyML_Fprintf(fp_out, "\n. Tree size: \t\t\t\t%.5f", Get_Tree_Size(tree)); /* if(tree->mod->ras->n_catg > 1 && tree->mod->ras->free_mixt_rates == NO) */ if (tree->mod->ras->free_mixt_rates == NO) { PhyML_Fprintf(fp_out, "\n. Discrete gamma model: \t\t%s", "Yes"); PhyML_Fprintf(fp_out, "\n - Number of classes: \t\t\t%d", tree->mod->ras->n_catg); PhyML_Fprintf(fp_out, "\n - Gamma shape parameter: \t\t%.3f", tree->mod->ras->alpha->v); for (i = 0; i < tree->mod->ras->n_catg; i++) { PhyML_Fprintf(fp_out, "\n - Relative rate in class %d: \t\t%.5f [freq=%4f] \t\t", i + 1, tree->mod->ras->gamma_rr->v[i], tree->mod->ras->gamma_r_proba->v[i]); } } else if (tree->mod->ras->free_mixt_rates == YES) { int *rk; rk = Ranks(tree->mod->ras->gamma_rr->v, tree->mod->ras->n_catg); PhyML_Fprintf(fp_out, "\n. FreeRate model: \t\t\t%s", "Yes"); PhyML_Fprintf(fp_out, "\n - Number of classes: \t\t\t%d", tree->mod->ras->n_catg); for (i = 0; i < tree->mod->ras->n_catg; i++) { PhyML_Fprintf(fp_out, "\n - Relative rate in class %d: \t\t%.5f [freq=%4f] \t\t", i + 1, tree->mod->ras->gamma_rr->v[rk[i]], tree->mod->ras->gamma_r_proba->v[rk[i]]); } Free(rk); } if (tree->mod->ras->invar) PhyML_Fprintf(fp_out, "\n. Proportion of invariant: \t\t%.3f", tree->mod->ras->pinvar->v); /*was before Discrete gamma model ; moved here FLT*/ if ((tree->mod->whichmodel == K80) || (tree->mod->whichmodel == HKY85) || (tree->mod->whichmodel == F84)) { PhyML_Fprintf(fp_out, "\n. Transition/transversion ratio: \t"); if (precision > 0) PhyML_Fprintf(fp_out, format, tree->mod->kappa->v); else PhyML_Fprintf(fp_out, "%f", tree->mod->kappa->v); } else if (tree->mod->whichmodel == TN93) { PhyML_Fprintf(fp_out, "\n. Transition/transversion ratio for purines: \t\t"); if (precision > 0) PhyML_Fprintf(fp_out, format, tree->mod->kappa->v * 2. * tree->mod->lambda->v / (1. + tree->mod->lambda->v)); else PhyML_Fprintf(fp_out, "%f", tree->mod->kappa->v * 2. * tree->mod->lambda->v / (1. + tree->mod->lambda->v)); PhyML_Fprintf(fp_out, "\n. Transition/transversion ratio for pyrimidines: \t"); if (precision > 0) PhyML_Fprintf(fp_out, format, tree->mod->kappa->v * 2. / (1. + tree->mod->lambda->v)); else PhyML_Fprintf(fp_out, "%f", tree->mod->kappa->v * 2. / (1. + tree->mod->lambda->v)); } if (tree->io->datatype == NT) { PhyML_Fprintf(fp_out, "\n. Nucleotides frequencies:"); if (precision > 0) { PhyML_Fprintf(fp_out, "\n - f(A)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp_out, "\n - f(C)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp_out, "\n - f(G)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp_out, "\n - f(T)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[3]); } else { PhyML_Fprintf(fp_out, "\n - f(A)= %8.5f", tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp_out, "\n - f(C)= %8.5f", tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp_out, "\n - f(G)= %8.5f", tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp_out, "\n - f(T)= %8.5f", tree->mod->e_frq->pi->v[3]); } } /*****************************************/ if ((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) { Update_Qmat_GTR(tree->mod->r_mat->rr->v, tree->mod->r_mat->rr_val->v, tree->mod->r_mat->rr_num->v, tree->mod->e_frq->pi->v, tree->mod->r_mat->qmat->v); PhyML_Fprintf(fp_out, "\n"); PhyML_Fprintf(fp_out, ". GTR relative rate parameters :"); if (precision > 0) { PhyML_Fprintf(fp_out, "\n A <-> C "); if (tree->mod->r_mat->rr->v[0] < 10) PhyML_Fprintf(fp_out, " "); PhyML_Fprintf(fp_out, format, tree->mod->r_mat->rr->v[0]); PhyML_Fprintf(fp_out, "\n A <-> G "); if (tree->mod->r_mat->rr->v[1] < 10) PhyML_Fprintf(fp_out, " "); PhyML_Fprintf(fp_out, format, tree->mod->r_mat->rr->v[1]); PhyML_Fprintf(fp_out, "\n A <-> T "); if (tree->mod->r_mat->rr->v[2] < 10) PhyML_Fprintf(fp_out, " "); PhyML_Fprintf(fp_out, format, tree->mod->r_mat->rr->v[2]); PhyML_Fprintf(fp_out, "\n C <-> G "); if (tree->mod->r_mat->rr->v[3] < 10) PhyML_Fprintf(fp_out, " "); PhyML_Fprintf(fp_out, format, tree->mod->r_mat->rr->v[3]); PhyML_Fprintf(fp_out, "\n C <-> T "); if (tree->mod->r_mat->rr->v[4] < 10) PhyML_Fprintf(fp_out, " "); PhyML_Fprintf(fp_out, format, tree->mod->r_mat->rr->v[4]); PhyML_Fprintf(fp_out, "\n G <-> T "); if (tree->mod->r_mat->rr->v[5] < 10) PhyML_Fprintf(fp_out, " "); PhyML_Fprintf(fp_out, format, tree->mod->r_mat->rr->v[5]); } else { PhyML_Fprintf(fp_out, "\n A <-> C %8.5f", tree->mod->r_mat->rr->v[0]); PhyML_Fprintf(fp_out, "\n A <-> G %8.5f", tree->mod->r_mat->rr->v[1]); PhyML_Fprintf(fp_out, "\n A <-> T %8.5f", tree->mod->r_mat->rr->v[2]); PhyML_Fprintf(fp_out, "\n C <-> G %8.5f", tree->mod->r_mat->rr->v[3]); PhyML_Fprintf(fp_out, "\n C <-> T %8.5f", tree->mod->r_mat->rr->v[4]); PhyML_Fprintf(fp_out, "\n G <-> T %8.5f", tree->mod->r_mat->rr->v[5]); } PhyML_Fprintf(fp_out, "\n. Instantaneous rate matrix : "); if (precision > 0) { PhyML_Fprintf(fp_out, "\n [A"); for (i = 0; i < precision + 4; i++) PhyML_Fprintf(fp_out, "-"); PhyML_Fprintf(fp_out, "C"); for (i = 0; i < precision + 4; i++) PhyML_Fprintf(fp_out, "-"); PhyML_Fprintf(fp_out, "G"); for (i = 0; i < precision + 4; i++) PhyML_Fprintf(fp_out, "-"); PhyML_Fprintf(fp_out, "T"); for (i = 0; i < precision + 1; i++) PhyML_Fprintf(fp_out, "-"); PhyML_Fprintf(fp_out, "]\n"); for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (i == j) PhyML_Fprintf(fp_out, " "); else PhyML_Fprintf(fp_out, " "); PhyML_Fprintf(fp_out, format, tree->mod->r_mat->qmat->v[i * 4 + j]); } PhyML_Fprintf(fp_out, "\n"); } } else { PhyML_Fprintf(fp_out, "\n [A---------C---------G---------T------]\n"); for (i = 0; i < 4; i++) { PhyML_Fprintf(fp_out, " "); for (j = 0; j < 4; j++) PhyML_Fprintf(fp_out, "%8.5f ", tree->mod->r_mat->qmat->v[i * 4 + j]); PhyML_Fprintf(fp_out, "\n"); } } // PhyML_Fprintf(fp_out,"\n"); } if (tree->io->datatype == AA && (tree->mod->e_frq->type == ML || tree->mod->e_frq->type == EMPIRICAL)) { PhyML_Fprintf(fp_out, "\n. Amino-acid frequencies"); if (precision > 0) { PhyML_Fprintf(fp_out, "\n- f(Ala)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp_out, " f(Arg)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp_out, " f(Asn)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp_out, "\n- f(Asp)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[3]); PhyML_Fprintf(fp_out, " f(Cys)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[4]); PhyML_Fprintf(fp_out, " f(Gln)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[5]); PhyML_Fprintf(fp_out, "\n- f(Glu)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[6]); PhyML_Fprintf(fp_out, " f(Gly)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[7]); PhyML_Fprintf(fp_out, " f(His)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[8]); PhyML_Fprintf(fp_out, "\n- f(Ile)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[9]); PhyML_Fprintf(fp_out, " f(Leu)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[10]); PhyML_Fprintf(fp_out, " f(Lys)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[11]); PhyML_Fprintf(fp_out, "\n- f(Met)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[12]); PhyML_Fprintf(fp_out, " f(Phe)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[13]); PhyML_Fprintf(fp_out, " f(Pro)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[14]); PhyML_Fprintf(fp_out, "\n- f(Ser)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[15]); PhyML_Fprintf(fp_out, " f(Thr)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[16]); PhyML_Fprintf(fp_out, " f(Trp)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[17]); PhyML_Fprintf(fp_out, "\n- f(Tyr)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[18]); PhyML_Fprintf(fp_out, " f(Val)= "); PhyML_Fprintf(fp_out, format, tree->mod->e_frq->pi->v[19]); } else { PhyML_Fprintf(fp_out, "\n- f(Ala)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp_out, " f(Arg)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp_out, " f(Asn)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp_out, "\n- f(Asp)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[3]); PhyML_Fprintf(fp_out, " f(Cys)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[4]); PhyML_Fprintf(fp_out, " f(Gln)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[5]); PhyML_Fprintf(fp_out, "\n- f(Glu)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[6]); PhyML_Fprintf(fp_out, " f(Gly)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[7]); PhyML_Fprintf(fp_out, " f(His)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[8]); PhyML_Fprintf(fp_out, "\n- f(Ile)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[9]); PhyML_Fprintf(fp_out, " f(Leu)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[10]); PhyML_Fprintf(fp_out, " f(Lys)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[11]); PhyML_Fprintf(fp_out, "\n- f(Met)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[12]); PhyML_Fprintf(fp_out, " f(Phe)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[13]); PhyML_Fprintf(fp_out, " f(Pro)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[14]); PhyML_Fprintf(fp_out, "\n- f(Ser)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[15]); PhyML_Fprintf(fp_out, " f(Thr)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[16]); PhyML_Fprintf(fp_out, " f(Trp)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[17]); PhyML_Fprintf(fp_out, "\n- f(Tyr)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[18]); PhyML_Fprintf(fp_out, " f(Val)= "); PhyML_Fprintf(fp_out, "%f", tree->mod->e_frq->pi->v[19]); } } /*****************************************/ if (io->ratio_test == 1) { PhyML_Fprintf(fp_out, ". aLRT statistics to test branches"); } else if (io->ratio_test == 2) { PhyML_Fprintf(fp_out, ". aLRT branch supports (cubic approximation, " "mixture of Chi2s distribution)"); } PhyML_Fprintf(fp_out, "\n"); PhyML_Fprintf(fp_out, "\n. Run ID:\t\t\t\t%s", (io->append_run_ID) ? (io->run_id_string) : ("none")); PhyML_Fprintf(fp_out, "\n. Random seed:\t\t\t\t%d", io->r_seed); PhyML_Fprintf(fp_out, "\n. Subtree patterns aliasing:\t\t%s", io->do_alias_subpatt ? "yes" : "no"); PhyML_Fprintf(fp_out, "\n. Version:\t\t\t\t%s", VERSION); hour = div(t_end - t_beg, 3600); min = div(t_end - t_beg, 60); min.quot -= hour.quot * 60; PhyML_Fprintf(fp_out, "\n. Time used:\t\t\t\t%dh%dm%ds (%d seconds)", hour.quot, min.quot, (int)(t_end - t_beg) % 60, (int)(t_end - t_beg)); if (add_citation == YES) { PhyML_Fprintf(fp_out, "\n\n"); PhyML_Fprintf(fp_out, " ooooooooooooooooooooooooooooooooooooooooooooooooooo" "ooooooooooooooooooooooooooooooooooooooooooooo\n"); PhyML_Fprintf(fp_out, " Suggested citations:\n"); PhyML_Fprintf(fp_out, " S. Guindon, JF. Dufayard, V. Lefort, M. Anisimova, " "W. Hordijk, O. Gascuel\n"); PhyML_Fprintf( fp_out, " \"New algorithms and methods to estimate maximum-likelihood " "phylogenies: assessing the performance of PhyML 3.0.\"\n"); PhyML_Fprintf(fp_out, " Systematic Biology. 2010. 59(3):307-321.\n"); PhyML_Fprintf(fp_out, "\n"); PhyML_Fprintf(fp_out, " S. Guindon & O. Gascuel\n"); PhyML_Fprintf(fp_out, " \"A simple, fast, and accurate algorithm to estimate large " "phylogenies by maximum likelihood\"\n"); PhyML_Fprintf(fp_out, " Systematic Biology. 2003. 52(5):696-704.\n"); PhyML_Fprintf(fp_out, " ooooooooooooooooooooooooooooooooooooooooooooooooooo" "ooooooooooooooooooooooooooooooooooooooooooooo\n"); PhyML_Fprintf(fp_out, "\n\n Please consider making a donation to support PhyML " "development by clicking on the following link:\n"); PhyML_Fprintf(fp_out, "\n https://fondation-cnrs.org/faire-un-don/"); PhyML_Fprintf(fp_out, "\n\n ~ Thank you ! ~\n\n"); } else { PhyML_Fprintf(fp_out, "\n\n"); PhyML_Fprintf(fp_out, " ooooooooooooooooooooooooooooooooooooooooooooooooooo" "ooooooooooooooooooooooooooooooooooooooooooooo\n"); PhyML_Fprintf(fp_out, "\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*FLT wrote this function*/ void Print_Fp_Out_Lines(FILE *fp_out, time_t t_beg, time_t t_end, t_tree *tree, option *io, int n_data_set) { char *s; /*div_t hour,min;*/ if (n_data_set == 1) { PhyML_Fprintf(fp_out, ". Sequence file : [%s]\n\n", Basename(io->in_align_file)); if ((tree->io->datatype == NT) || (tree->io->datatype == AA)) { (tree->io->datatype == NT) ? (PhyML_Fprintf(fp_out, ". Model of nucleotides substitution : %s\n\n", io->mod->modelname->s)) : (PhyML_Fprintf(fp_out, ". Model of amino acids substitution : %s\n\n", io->mod->modelname->s)); } s = (char *)mCalloc(100, sizeof(char)); switch (io->in_tree) { case 0: { strcpy(s, "BioNJ"); break; } case 1: { strcpy(s, "parsimony"); break; } case 2: { strcpy(s, "user tree ("); strcat(s, io->in_tree_file); strcat(s, ")"); break; } } PhyML_Fprintf(fp_out, ". Initial tree : [%s]\n\n", s); Free(s); PhyML_Fprintf(fp_out, "\n"); /*headline 1*/ PhyML_Fprintf(fp_out, ". Data\t"); PhyML_Fprintf(fp_out, "Nb of \t"); PhyML_Fprintf(fp_out, "Likelihood\t"); PhyML_Fprintf(fp_out, "Discrete \t"); if (tree->mod->ras->n_catg > 1) PhyML_Fprintf(fp_out, "Number of \tGamma shape\t"); PhyML_Fprintf(fp_out, "Proportion of\t"); if (tree->mod->whichmodel <= 6) PhyML_Fprintf(fp_out, "Transition/ \t"); PhyML_Fprintf(fp_out, "Nucleotides frequencies \t"); if ((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) PhyML_Fprintf(fp_out, "Instantaneous rate matrix \t"); /* PhyML_Fprintf(fp_out,"Time\t");*/ PhyML_Fprintf(fp_out, "\n"); /*headline 2*/ PhyML_Fprintf(fp_out, " set\t"); PhyML_Fprintf(fp_out, "taxa\t"); PhyML_Fprintf(fp_out, "loglk \t"); PhyML_Fprintf(fp_out, "gamma model\t"); if (tree->mod->ras->n_catg > 1) PhyML_Fprintf(fp_out, "categories\tparameter \t"); PhyML_Fprintf(fp_out, "invariant \t"); if (tree->mod->whichmodel <= 6) PhyML_Fprintf(fp_out, "transversion\t"); PhyML_Fprintf(fp_out, "f(A) f(C) f(G) f(T) \t"); if ((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) PhyML_Fprintf(fp_out, "[A---------C---------G---------T------]\t"); /* PhyML_PhyML_Fprintf(fp_out,"used\t");*/ PhyML_Fprintf(fp_out, "\n"); /*headline 3*/ if (tree->mod->whichmodel == TN93) { PhyML_Fprintf(fp_out, " \t \t \t \t"); if (tree->mod->ras->n_catg > 1) PhyML_Fprintf(fp_out, " \t \t"); PhyML_Fprintf(fp_out, " \t"); PhyML_Fprintf(fp_out, "purines pyrimid.\t"); PhyML_Fprintf(fp_out, "\n"); } PhyML_Fprintf(fp_out, "\n"); } /*line items*/ PhyML_Fprintf(fp_out, " #%d\t", n_data_set); PhyML_Fprintf(fp_out, "%d \t", tree->n_otu); PhyML_Fprintf(fp_out, "%.5f\t", tree->c_lnL); PhyML_Fprintf(fp_out, "%s \t", (tree->mod->ras->n_catg > 1) ? ("Yes") : ("No ")); if (tree->mod->ras->n_catg > 1) { PhyML_Fprintf(fp_out, "%d \t", tree->mod->ras->n_catg); PhyML_Fprintf(fp_out, "%.3f \t", tree->mod->ras->alpha->v); } /*if(tree->mod->ras->invar)*/ PhyML_Fprintf(fp_out, "%.3f \t", tree->mod->ras->pinvar->v); if (tree->mod->whichmodel <= 5) { PhyML_Fprintf(fp_out, "%.3f \t", tree->mod->kappa->v); } else if (tree->mod->whichmodel == TN93) { PhyML_Fprintf(fp_out, "%.3f ", tree->mod->kappa->v * 2. * tree->mod->lambda->v / (1. + tree->mod->lambda->v)); PhyML_Fprintf(fp_out, "%.3f\t", tree->mod->kappa->v * 2. / (1. + tree->mod->lambda->v)); } if (tree->io->datatype == NT) { PhyML_Fprintf(fp_out, "%8.5f ", tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp_out, "%8.5f ", tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp_out, "%8.5f ", tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp_out, "%8.5f\t", tree->mod->e_frq->pi->v[3]); } /* hour = div(t_end-t_beg,3600); min = div(t_end-t_beg,60 ); min.quot -= hour.quot*60; PhyML_Fprintf(fp_out,"%dh%dm%ds\t", hour.quot,min.quot,(int)(t_end-t_beg)%60); if(t_end-t_beg > 60) PhyML_Fprintf(fp_out,". -> %d seconds\t",(int)(t_end-t_beg)); */ /*****************************************/ if ((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) { int i, j; for (i = 0; i < 4; i++) { if (i != 0) { /*format*/ PhyML_Fprintf(fp_out, " \t \t \t \t"); if (tree->mod->ras->n_catg > 1) PhyML_Fprintf(fp_out, " \t \t"); PhyML_Fprintf( fp_out, " \t \t"); } for (j = 0; j < 4; j++) PhyML_Fprintf(fp_out, "%8.5f ", tree->mod->r_mat->qmat->v[i * 4 + j]); if (i < 3) PhyML_Fprintf(fp_out, "\n"); } } /*****************************************/ PhyML_Fprintf(fp_out, "\n\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Freq(t_tree *tree) { switch (tree->io->datatype) { case NT: { PhyML_Printf("A : %f\n", tree->mod->e_frq->pi->v[0]); PhyML_Printf("C : %f\n", tree->mod->e_frq->pi->v[1]); PhyML_Printf("G : %f\n", tree->mod->e_frq->pi->v[2]); PhyML_Printf("T : %f\n", tree->mod->e_frq->pi->v[3]); break; } case AA: { PhyML_Printf("A : %f\n", tree->mod->e_frq->pi->v[0]); PhyML_Printf("R : %f\n", tree->mod->e_frq->pi->v[1]); PhyML_Printf("N : %f\n", tree->mod->e_frq->pi->v[2]); PhyML_Printf("D : %f\n", tree->mod->e_frq->pi->v[3]); PhyML_Printf("C : %f\n", tree->mod->e_frq->pi->v[4]); PhyML_Printf("Q : %f\n", tree->mod->e_frq->pi->v[5]); PhyML_Printf("E : %f\n", tree->mod->e_frq->pi->v[6]); PhyML_Printf("G : %f\n", tree->mod->e_frq->pi->v[7]); PhyML_Printf("H : %f\n", tree->mod->e_frq->pi->v[8]); PhyML_Printf("I : %f\n", tree->mod->e_frq->pi->v[9]); PhyML_Printf("L : %f\n", tree->mod->e_frq->pi->v[10]); PhyML_Printf("K : %f\n", tree->mod->e_frq->pi->v[11]); PhyML_Printf("M : %f\n", tree->mod->e_frq->pi->v[12]); PhyML_Printf("F : %f\n", tree->mod->e_frq->pi->v[13]); PhyML_Printf("P : %f\n", tree->mod->e_frq->pi->v[14]); PhyML_Printf("S : %f\n", tree->mod->e_frq->pi->v[15]); PhyML_Printf("T : %f\n", tree->mod->e_frq->pi->v[16]); PhyML_Printf("W : %f\n", tree->mod->e_frq->pi->v[17]); PhyML_Printf("Y : %f\n", tree->mod->e_frq->pi->v[18]); PhyML_Printf("V : %f\n", tree->mod->e_frq->pi->v[19]); PhyML_Printf("N : %f\n", tree->mod->e_frq->pi->v[20]); break; } default: { break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Settings(option *io) { int answer; char *s; s = (char *)mCalloc(100, sizeof(char)); PhyML_Printf("\n\n\n"); PhyML_Printf("\n\n"); PhyML_Printf("\n " "////////////////////////////////////" ".\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" "\\\\\\\\\\\\\\\\\\\\\\"); PhyML_Printf("\n " "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" "\\\\\\\\\\.//////////////////////////////////////////\n"); PhyML_Printf("\n . Sequence filename:\t\t\t\t %s", Basename(io->in_align_file)); if (io->datatype == NT) strcpy(s, "dna"); else if (io->datatype == AA) strcpy(s, "aa"); else strcpy(s, "generic"); PhyML_Printf("\n . Data type:\t\t\t\t\t %s", s); PhyML_Printf("\n . Alphabet size:\t\t\t\t %d", io->mod->ns); PhyML_Printf("\n . Sequence format:\t\t\t\t %s", io->interleaved ? "interleaved" : "sequential"); PhyML_Printf("\n . Number of data sets:\t\t\t\t %d", io->n_data_sets); PhyML_Printf("\n . Nb of bootstrapped data sets:\t\t\t %d", io->n_boot_replicates); if (io->n_boot_replicates > 0) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t no"); else { if (io->ratio_test == 1) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t " "yes (aLRT statistics)"); else if (io->ratio_test == 2) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t " "yes (Chi2-based parametric branch supports)"); else if (io->ratio_test == 3) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t " "yes (Minimum of SH-like and Chi2-based branch supports)"); else if (io->ratio_test == 4) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t " "yes (SH-like branch supports)"); else if (io->ratio_test == 5) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t " "yes (aBayes branch supports)"); } PhyML_Printf("\n . Model name:\t\t\t\t\t %s", io->mod->modelname->s); if (io->datatype == AA && io->mod->whichmodel == CUSTOMAA) PhyML_Printf(" (%s)", io->mod->aa_rate_mat_file->s); if (io->datatype == NT) { if ((io->mod->whichmodel == K80) || (io->mod->whichmodel == HKY85) || (io->mod->whichmodel == F84) || (io->mod->whichmodel == TN93)) { if (io->mod->s_opt && io->mod->kappa->optimize) PhyML_Printf("\n . Ts/tv ratio:\t\t\t\t\t estimated"); else PhyML_Printf("\n . Ts/tv ratio:\t\t\t\t\t %f", io->mod->kappa->v); } } if (io->mod->s_opt && io->mod->ras->pinvar->optimize) PhyML_Printf("\n . Proportion of invariable sites:\t\t estimated"); else PhyML_Printf("\n . Proportion of invariable sites:\t\t %f", io->mod->ras->pinvar->v); if (io->mod->ras->free_mixt_rates == NO) PhyML_Printf("\n . RAS model:\t\t\t\t\t discrete Gamma"); else PhyML_Printf("\n . RAS model:\t\t\t\t\t FreeRate"); PhyML_Printf("\n . Number of subst. rate catgs:\t\t\t %d", io->mod->ras->n_catg); if (io->mod->ras->n_catg > 1) { if (io->mod->ras->free_mixt_rates == NO) { if (io->mod->s_opt && io->mod->ras->alpha->optimize) PhyML_Printf( "\n . Gamma distribution parameter:\t\t\t estimated"); else PhyML_Printf("\n . Gamma distribution parameter:\t\t\t %f", io->mod->ras->alpha->v); PhyML_Printf("\n . 'Middle' of each rate class:\t\t\t %s", (io->mod->ras->gamma_median) ? ("median") : ("mean")); } } if (io->datatype == AA) { if (io->mod->e_frq->type == ML) PhyML_Printf( "\n . Amino-acid equilibrium frequencies:\t\t optimized"); else if (io->mod->e_frq->type == EMPIRICAL) PhyML_Printf( "\n . Amino-acid equilibrium frequencies:\t\t empirical"); else if (io->mod->e_frq->type == USER) PhyML_Printf( "\n . Amino-acid equilibrium frequencies:\t\t user-defined"); else if (io->mod->e_frq->type == MODEL) PhyML_Printf( "\n . Amino-acid equilibrium frequencies:\t\t model-defined"); } else if (io->datatype == NT) { if ((io->mod->whichmodel != JC69) && (io->mod->whichmodel != K80) && (io->mod->whichmodel != F81)) { if (io->mod->e_frq->type == ML) PhyML_Printf( "\n . Nucleotide equilibrium frequencies:\t\t optimized"); else if (io->mod->e_frq->type == EMPIRICAL) PhyML_Printf( "\n . Nucleotide equilibrium frequencies:\t\t empirical"); else if (io->mod->e_frq->type == USER) PhyML_Printf( "\n . Nucleotide equilibrium frequencies:\t\t user-defined"); else if (io->mod->e_frq->type == MODEL) PhyML_Printf("\n . Nucleotide equilibrium frequencies:\t\t " "model-defined"); } } PhyML_Printf("\n . Optimise tree topology:\t\t\t %s", (io->mod->s_opt && io->mod->s_opt->opt_topo) ? "yes" : "no"); switch (io->in_tree) { case 0: { strcpy(s, "BioNJ"); break; } case 1: { strcpy(s, "parsimony"); break; } case 2: { strcpy(s, "user tree ("); strcat(s, Basename(io->in_tree_file)); strcat(s, ")"); break; } } if (io->mod->s_opt && io->mod->s_opt->opt_topo) { /* if(io->mod->s_opt->topo_search == NNI_MOVE) PhyML_Printf("\n . * Tree topology search:\t\t\t\t NNIs"); */ /* else if(io->mod->s_opt->topo_search == SPR_MOVE) PhyML_Printf("\n . Tree * topology search:\t\t\t\t SPRs"); */ /* else if(io->mod->s_opt->topo_search == BEST_OF_NNI_AND_SPR) * PhyML_Printf("\n . Tree topology search:\t\t\t\t Best of NNIs and * SPRs"); */ PhyML_Printf("\n . Starting tree:\t\t\t\t %s", s); PhyML_Printf("\n . Add random input tree:\t\t\t %s", (io->mod->s_opt->random_input_tree) ? "yes" : "no"); if (io->mod->s_opt->random_input_tree) PhyML_Printf("\n . Number of random starting trees:\t\t %d", io->mod->s_opt->n_rand_starts); } else if (io->mod->s_opt && !io->mod->s_opt->random_input_tree) PhyML_Printf("\n . Evaluated tree:\t\t\t\t \"%s\"", s); PhyML_Printf("\n . Optimise branch lengths:\t\t\t %s", (io->mod->s_opt && io->mod->s_opt->opt_bl_one_by_one) ? "yes" : "no"); PhyML_Printf("\n . Minimum length of an edge:\t\t\t %g", io->mod->l_min); answer = NO; if (io->mod->ras->alpha->optimize || io->mod->kappa->optimize || io->mod->lambda->optimize || io->mod->ras->pinvar->optimize || io->mod->r_mat->optimize) answer = YES; PhyML_Printf("\n . Optimise substitution model parameters:\t %s", (answer) ? "yes" : "no"); PhyML_Printf("\n . Run ID:\t\t\t\t\t %s", (io->append_run_ID) ? (io->run_id_string) : ("none")); PhyML_Printf("\n . Random seed:\t\t\t\t\t %d", io->r_seed); PhyML_Printf("\n . Subtree patterns aliasing:\t\t\t %s", io->do_alias_subpatt ? "yes" : "no"); PhyML_Printf("\n . Version:\t\t\t\t\t %s", VERSION); PhyML_Printf("\n . Byte alignment:\t\t\t\t %d", BYTE_ALIGN); PhyML_Printf("\n . AVX enabled:\t\t\t\t\t %s", #if defined(__AVX__) "yes" #else "no" #endif ); PhyML_Printf("\n . SSE enabled:\t\t\t\t\t %s", #if defined(__SSE3__) "yes" #else "no" #endif ); /* PhyML_Printf("\n\n \u205C \u205C \u205C \u205C * \u205C \u205C \u205C \u205C \u205C \u205C \u205C \u205C \n"); */ PhyML_Printf("\n"); PhyML_Printf("\n " "////////////////////////////////////" ".\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" "\\\\\\\\\\\\\\\\\\\\\\"); PhyML_Printf("\n " "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" "\\\\\\\\\\.//////////////////////////////////////////\n"); PhyML_Printf("\n\n"); fflush(NULL); Free(s); } void Print_Banner(FILE *fp) { PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, " ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" "ooooooooooooooooooooooooooooooooooooooo\n"); PhyML_Fprintf(fp, " " " \n"); PhyML_Fprintf(fp, " --- PhyML %s --- " " \n", VERSION); PhyML_Fprintf(fp, " " " \n"); PhyML_Fprintf(fp, " A simple, fast, and accurate algorithm to estimate " "large phylogenies by maximum likelihood \n"); PhyML_Fprintf(fp, " Stephane Guindon & Olivier " "Gascuel \n"); PhyML_Fprintf(fp, " " " \n"); PhyML_Fprintf( fp, " https://github.com/stephaneguindon/phyml/ " " \n"); PhyML_Fprintf(fp, " " " \n"); PhyML_Fprintf(fp, " Copyright CNRS - Universite " "Montpellier \n"); PhyML_Fprintf(fp, " " " \n"); PhyML_Fprintf(fp, " ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" "ooooooooooooooooooooooooooooooooooooooo\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Banner_Small(FILE *fp) { PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, " ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" "ooooooooooooooooooooooooooooooooooooooo\n"); PhyML_Fprintf(fp, " --- PhyML %s --- " " \n", VERSION); PhyML_Fprintf( fp, " " "https://github.com/stephaneguindon/phyml/ \n"); PhyML_Fprintf(fp, " Copyright CNRS - Universite " "Montpellier \n"); PhyML_Fprintf(fp, " ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" "ooooooooooooooooooooooooooooooooooooooo\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Data_Set_Number(option *io, FILE *fp) { PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, " " " \n"); PhyML_Fprintf(fp, " [ Data set number %3d ] " " \n", io->curr_gt + 1); PhyML_Fprintf(fp, " " " \n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Lk(t_tree *tree, char *string) { t_tree *loc_tree; loc_tree = tree; /*! Rewind back to the first mixt_tree */ while (loc_tree->prev) loc_tree = loc_tree->prev; time(&(loc_tree->t_current)); PhyML_Printf("\n. (%5d sec) [%15.4f] %s", (int)(loc_tree->t_current - loc_tree->t_beg), Get_Lk(tree), string); #ifndef QUIET fflush(NULL); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_List(t_ll *list) { t_ll *ll; ll = list->head; do { t_node *n; n = (t_node *)ll->v; PhyML_Printf("\n. list elem: %p next: %p prev: %p [%d] %p %p", (void *)ll, (void *)ll->next, (void *)ll->prev, n->num, (void *)ll->head, (void *)ll->tail); ll = ll->next; } while (ll != NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Pars(t_tree *tree) { time(&(tree->t_current)); PhyML_Printf("\n. (%5d sec) [%5d]", (int)(tree->t_current - tree->t_beg), tree->c_pars); #ifndef QUIET fflush(NULL); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Lk_And_Pars(t_tree *tree) { time(&(tree->t_current)); PhyML_Printf("\n. (%5d sec) [%15.4f] [%5d]", (int)(tree->t_current - tree->t_beg), tree->c_lnL, tree->c_pars); #ifndef QUIET fflush(NULL); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Qmat(phydbl *daa, phydbl *pi, FILE *fp) { int i, j; phydbl sum; double val; assert(fp); rewind(fp); for (i = 1; i < 20; i++) { for (j = 0; j < 19; j++) { /* if(!fscanf(fp,"%lf",&(daa[i*20+j]))) Exit("\n"); */ if (!fscanf(fp, "%lf", &val)) { PhyML_Fprintf(stderr, "\n. Rate matrix file does not appear to have a proper " "format. Please refer to the documentation."); Exit("\n"); } daa[i * 20 + j] = (phydbl)val; daa[j * 20 + i] = daa[i * 20 + j]; if (j == i - 1) break; } } for (i = 0; i < 20; i++) { if (!fscanf(fp, "%lf", &val)) Exit("\n"); pi[i] = (phydbl)val; } sum = .0; for (i = 0; i < 20; i++) sum += pi[i]; if (FABS(sum - 1.) > 1.E-06) { PhyML_Printf("\n. Sum of amino-acid frequencies: %f", sum); PhyML_Printf("\n. Scaling amino-acid frequencies...\n"); for (i = 0; i < 20; i++) pi[i] /= sum; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Qmat_AA(phydbl *daa, phydbl *pi) { int i, j, cpt; cpt = 0; for (i = 0; i < 20; i++) { for (j = 0; j < i; j++) { PhyML_Printf("daa[%2d*20+%2d] = %10f; ", i, j, daa[i * 20 + j]); cpt++; if (!(cpt % 4)) PhyML_Printf("\n"); } } PhyML_Printf("\n\n"); PhyML_Printf("for (i=0; ia_nodes[0], tree->a_nodes[0]->v[0], tree->a_nodes[0]->b[0], fp, tree); /* mean_div_left = .0; */ /* for(k=0;ka_edges[j]->div_post_pred_left[k]; */ /* } */ /* mean_div_rght = .0; */ /* for(k=0;ka_edges[j]->div_post_pred_rght[k]; */ /* mean_div_left /= (phydbl)tree->data->init_len; */ /* mean_div_rght /= (phydbl)tree->data->init_len; */ /* PhyML_Fprintf(fp,"%4d 0 %f\n",j,mean_div_left); */ /* PhyML_Fprintf(fp,"%4d 1 %f\n",j,mean_div_rght); */ /* mean_div_left = .0; */ /* for(k=0;ka_edges[j]->div_post_pred_left[k]; */ /* mean_div_rght = .0; */ /* for(k=0;ka_edges[j]->div_post_pred_rght[k]; */ /* } */ /* if((mean_div_left != tree->data->init_len) || (mean_div_rght != * tree->data->init_len)) */ /* { */ /* PhyML_Printf("\n. mean_div_left = %f mean_div_rght = %f init_len = * %d", */ /* mean_div_left,mean_div_rght,tree->data->init_len); */ /* PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Diversity_Pre(t_node *a, t_node *d, t_edge *b, FILE *fp, t_tree *tree) { int k, ns; ns = -1; if (d->tax) return; else { if (tree->io->datatype == NT) ns = 4; else if (tree->io->datatype == AA) ns = 20; if (d == b->left) for (k = 0; k < ns; k++) PhyML_Fprintf(fp, "%4d 0 %2d %4d\n", b->num, k, b->div_post_pred_left[k]); else for (k = 0; k < ns; k++) PhyML_Fprintf(fp, "%4d 1 %2d %4d\n", b->num, k, b->div_post_pred_rght[k]); for (k = 0; k < 3; k++) if (d->v[k] != a) Print_Diversity_Pre(d, d->v[k], d->b[k], fp, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Tip_Partials(t_tree *tree, t_node *d) { if (!d->tax) { fprintf(stdout, "Node %d is not a Taxa\n", d->num); fflush(stdout); return; } assert(d->b[0]->rght == d); assert(d->b[0]->rght->tax); fprintf(stdout, "Taxa/Node %d\n", d->num); int site, i; for (site = 0; site < tree->data->n_pattern; ++site) { fprintf(stdout, "[%d: ", site); for (i = 0; i < tree->mod->ns; ++i) { int tip_partial = d->b[0]->p_lk_tip_r[site * tree->mod->ns + i]; fprintf(stdout, "%d", tip_partial); fflush(stdout); } fprintf(stdout, "] "); fflush(stdout); } fprintf(stdout, "\n"); fflush(stdout); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Edge_PMats(t_tree *tree, t_edge *b) { phydbl *Pij; #ifdef BEAGLE Pij = (phydbl *)malloc(tree->mod->ns * tree->mod->ns * tree->mod->ras->n_catg * sizeof(phydbl)); if (NULL == Pij) Warn_And_Exit(__PRETTY_FUNCTION__); int ret = beagleGetTransitionMatrix(tree->b_inst, b->Pij_rr_idx, Pij); if (ret < 0) { fprintf(stderr, "beagleGetTransitionMatrix() on instance %i failed:%i\n\n", tree->b_inst, ret); Free(Pij); Exit(""); } #else Pij = b->Pij_rr; #endif fprintf(stdout, "\nflattened P-Matrices (for each rate category) " "state*state*num_rates[%d*%d*%d] for branch num:%i\n", tree->mod->ns, tree->mod->ns, tree->mod->ras->n_catg, b->num); int i; for (i = 0; i < tree->mod->ns * tree->mod->ns * tree->mod->ras->n_catg; ++i) { fprintf(stdout, "%f,", Pij[i]); fflush(stdout); } fprintf(stdout, "\n"); fflush(stdout); #ifdef BEAGLE Free(Pij); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_All_Edge_PMats(t_tree *tree) { int i; for (i = 0; i < 2 * tree->n_otu - 3; ++i) Print_Edge_PMats(tree, tree->a_edges[i]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Edge_Likelihoods(t_tree *tree, t_edge *b, bool scientific /*Print in scientific notation?*/) { int catg, site, j; char *fmt = scientific ? "[%d,%d,%d]%e " : "[%d,%d,%d]%f "; // rate category, site, state, likelihood phydbl *lk_left = b->p_lk_left; phydbl *lk_right = b->p_lk_rght; fprintf(stdout, "\n"); fflush(stdout); if (NULL != lk_left) // not a tip? { fprintf( stdout, "Partial Likelihoods on LEFT subtree of Branch %d [rate,site,state]:\n", b->num); for (catg = 0; catg < tree->mod->ras->n_catg; ++catg) for (site = 0; site < tree->data->n_pattern; ++site) for (j = 0; j < tree->mod->ns; ++j) #ifdef BEAGLE fprintf(stdout, fmt, catg, site, j, lk_left[catg * tree->n_pattern * tree->mod->ns + site * tree->mod->ns + j]); #else fprintf(stdout, fmt, catg, site, j, lk_left[catg * tree->mod->ns + site * tree->mod->ras->n_catg * tree->mod->ns + j]); #endif fflush(stdout); } else // is a tip { fprintf(stdout, "Likelihoods on LEFT tip of Branch %d [site,state]:\n", b->num); for (site = 0; site < tree->data->n_pattern; ++site) for (j = 0; j < tree->mod->ns; ++j) fprintf(stdout, "[%d,%d]%.1f ", site, j, b->p_lk_tip_l[site * tree->mod->ns + j]); fflush(stdout); } fprintf(stdout, "\n"); fflush(stdout); if (NULL != lk_right) // not a tip? { fprintf(stdout, "Partial Likelihoods on RIGHT subtree of Branch %d " "[rate,site,state]:\n", b->num); for (catg = 0; catg < tree->mod->ras->n_catg; ++catg) for (site = 0; site < tree->data->n_pattern; ++site) for (j = 0; j < tree->mod->ns; ++j) #ifdef BEAGLE fprintf(stdout, fmt, catg, site, j, lk_right[catg * tree->n_pattern * tree->mod->ns + site * tree->mod->ns + j]); #else fprintf(stdout, fmt, catg, site, j, lk_right[catg * tree->mod->ns + site * tree->mod->ras->n_catg * tree->mod->ns + j]); #endif fflush(stdout); } else // is a tip { fprintf(stdout, "Likelihoods on RIGHT tip of Branch %d [site,state]:\n", b->num); for (site = 0; site < tree->data->n_pattern; ++site) for (j = 0; j < tree->mod->ns; ++j) fprintf(stdout, "[%d,%d]%.1f ", site, j, b->p_lk_tip_r[site * tree->mod->ns + j]); fflush(stdout); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_All_Edge_Likelihoods(t_tree *tree) { int i; for (i = 0; i < 2 * tree->n_otu - 3; ++i) Print_Edge_Likelihoods(tree, tree->a_edges[i], false); fflush(NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Dump_Arr_S(short int *arr, int num) { int i; if (NULL == arr) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s')\n", __FILE__, __LINE__, __FUNCTION__); Exit("\n. Trying to print NULL array"); return; } fprintf(stdout, "["); for (i = 0; i < num; ++i) { fprintf(stdout, "%d,", arr[i]); fflush(stdout); } fprintf(stdout, "]\n"); fflush(stdout); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Dump_Arr_D(phydbl *arr, int num) { int i; if (NULL == arr) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s')\n", __FILE__, __LINE__, __FUNCTION__); Exit("\n. Trying to print NULL array"); return; } fprintf(stdout, "["); for (i = 0; i < num; ++i) { fprintf(stdout, "%g,", arr[i]); fflush(stdout); } fprintf(stdout, "]\n"); fflush(stdout); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Dump_Arr_I(int *arr, int num) { int i; if (NULL == arr) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s')\n", __FILE__, __LINE__, __FUNCTION__); Exit("\n. Trying to print NULL array"); return; } fprintf(stdout, "["); for (i = 0; i < num; ++i) { fprintf(stdout, "%d,", arr[i]); fflush(stdout); } fprintf(stdout, "]\n"); fflush(stdout); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Tree_Structure(t_tree *tree) { int i; PhyML_Fprintf(stdout, "\n. n_otu: %d", tree->n_otu); for (i = 0; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_edges[i]) PhyML_Fprintf( stdout, "\n. Edge %p %3d, Length: %f LeftNode %3d [%s], RightNode %3d [%s]", tree->a_edges[i], tree->a_edges[i]->num, tree->a_edges[i]->l->v, tree->a_edges[i]->left ? tree->a_edges[i]->left->num : -1, tree->a_edges[i]->left ? tree->a_edges[i]->left->tax ? tree->a_edges[i]->left->name : "" : "", tree->a_edges[i]->rght ? tree->a_edges[i]->rght->num : -1, tree->a_edges[i]->left ? tree->a_edges[i]->rght->tax ? tree->a_edges[i]->rght->name : "" : ""); else PhyML_Fprintf(stdout, "\n. NULL"); } for (i = 0; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_nodes[i]) PhyML_Fprintf( stdout, "\n. Node %p %3d v0: %3d v1: %3d v2: %3d b0: %3d b1: %3d b2: %3d", tree->a_nodes[i], tree->a_nodes[i]->num, tree->a_nodes[i]->v[0] ? tree->a_nodes[i]->v[0]->num : -1, tree->a_nodes[i]->v[1] ? tree->a_nodes[i]->v[1]->num : -1, tree->a_nodes[i]->v[2] ? tree->a_nodes[i]->v[2]->num : -1, tree->a_nodes[i]->v[0] ? tree->a_nodes[i]->b[0]->num : -1, tree->a_nodes[i]->v[1] ? tree->a_nodes[i]->b[1]->num : -1, tree->a_nodes[i]->v[2] ? tree->a_nodes[i]->b[2]->num : -1); else PhyML_Fprintf(stdout, "\n. NULL"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *Read_User_Tree(calign *cdata, t_mod *mod, option *io) { t_tree *tree; PhyML_Printf("\n. Reading tree..."); fflush(NULL); if (io->n_trees == 1) rewind(io->fp_in_tree); Detect_Tree_File_Format(io); tree = NULL; switch (io->tree_file_format) { case PHYLIP: { tree = Read_Tree_File_Phylip(io->fp_in_tree); break; } case NEXUS: { io->nex_com_list = Make_Nexus_Com(); Init_Nexus_Format(io->nex_com_list, io->fp_in_tree); Get_Nexus_Data(io); tree = io->tree; Free_Nexus(io); break; } default: { PhyML_Fprintf(stderr, "\n. Problem detected with tree file format"); Exit("\n"); break; } } if (tree == NULL) Exit("\n. Input tree not found..."); /* Add branch lengths if necessary */ if (tree->has_branch_lengths == NO) { assert(cdata != NULL); assert(mod != NULL); Add_BioNJ_Branch_Lengths(tree, cdata, mod, NULL); } return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Time_Info(time_t t_beg, time_t t_end) { div_t hour, min; hour = div(t_end - t_beg, 3600); min = div(t_end - t_beg, 60); min.quot -= hour.quot * 60; PhyML_Printf("\n\n. Time used %dh%dm%ds\n", hour.quot, min.quot, (int)(t_end - t_beg) % 60); PhyML_Printf("\nooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" "ooooooooooooooooooooooooooooooooooo\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Time_Info_Brief(time_t t_beg, time_t t_end) { div_t hour, min; hour = div(t_end - t_beg, 3600); min = div(t_end - t_beg, 60); min.quot -= hour.quot * 60; PhyML_Printf("\n. Time used %dh%dm%ds\n", hour.quot, min.quot, (int)(t_end - t_beg) % 60); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PhyML_Printf(char *format, ...) { va_list ptr; #ifdef MPI if (Global_myRank == 0) { va_start(ptr, format); vprintf(format, ptr); va_end(ptr); } #else va_start(ptr, format); vprintf(format, ptr); va_end(ptr); #endif fflush(NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PhyML_Fprintf(FILE *fp, char *format, ...) { va_list ptr; #ifdef MPI if (Global_myRank == 0) { va_start(ptr, format); vfprintf(fp, format, ptr); va_end(ptr); } #else va_start(ptr, format); vfprintf(fp, format, ptr); va_end(ptr); #endif fflush(NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int PhyML_Fscanf(FILE *fp, char *format, ...) { va_list ptr; int rv; rv = -1; #ifdef MPI if (Global_myRank == 0) { va_start(ptr, format); rv = vfscanf(fp, format, ptr); if (!rv) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); va_end(ptr); } #else va_start(ptr, format); rv = vfscanf(fp, format, ptr); if (!rv) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); va_end(ptr); #endif return (rv); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Clade_Priors(char *file_name, t_tree *tree) { FILE *fp; char *s, *line; int n_clade_priors; int clade_size; char **clade_list; int i, pos; phydbl prior_low, prior_up; int node_num; PhyML_Printf("\n"); PhyML_Printf("\n. Reading prior on node ages.\n"); line = (char *)mCalloc(T_MAX_LINE, sizeof(char)); s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); clade_list = (char **)mCalloc(tree->n_otu, sizeof(char *)); for (i = 0; i < tree->n_otu; i++) clade_list[i] = (char *)mCalloc(T_MAX_NAME, sizeof(char)); fp = Openfile(file_name, 0); n_clade_priors = 0; do { if (!fgets(line, T_MAX_LINE, fp)) break; clade_size = 0; pos = 0; do { i = 0; while (line[pos] == ' ') pos++; while ((line[pos] != ' ') && (line[pos] != '\n') && line[pos] != '#') { s[i] = line[pos]; i++; pos++; } s[i] = '\0'; /* PhyML_Printf("\n. s = %s\n",s); */ if (line[pos] == '\n' || line[pos] == '#') break; pos++; if (strcmp(s, "|")) { strcpy(clade_list[clade_size], s); clade_size++; } else break; } while (1); if (line[pos] != '#' && line[pos] != '\n') { phydbl val1, val2; /* sscanf(line+pos,"%lf %lf",&prior_up,&prior_low); */ sscanf(line + pos, "%lf %lf", &val1, &val2); prior_up = (phydbl)val1; prior_low = (phydbl)val2; node_num = -1; if (!strcmp("@root@", clade_list[0])) node_num = tree->n_root->num; else node_num = Find_Clade(clade_list, clade_size, tree); n_clade_priors++; if (node_num < 0) { PhyML_Printf("\n"); PhyML_Printf("\n"); PhyML_Printf("\n. " "........................................................." "........"); PhyML_Printf("\n. WARNING: could not find any clade in the tree " "referred to with the following taxon names:"); for (i = 0; i < clade_size; i++) PhyML_Printf("\n. \"%s\"", clade_list[i]); PhyML_Printf("\n. " "........................................................." "........"); } else { tree->times->t_has_prior[node_num] = YES; tree->times->t_prior_min[node_num] = -MAX(prior_low, prior_up); tree->times->t_prior_max[node_num] = -MIN(prior_low, prior_up); if (fabs(prior_low - prior_up) < 1.E-6 && tree->a_nodes[node_num]->tax == YES) tree->times->nd_t[node_num] = prior_low; PhyML_Printf("\n"); PhyML_Printf("\n. " "[%3d]...................................................." "..............", n_clade_priors); PhyML_Printf("\n. Node %4d matches the clade referred to with the " "following taxon names:", node_num); for (i = 0; i < clade_size; i++) PhyML_Printf("\n. - \"%s\"", clade_list[i]); PhyML_Printf("\n. Lower bound set to: %15f time units.", MIN(prior_low, prior_up)); PhyML_Printf("\n. Upper bound set to: %15f time units.", MAX(prior_low, prior_up)); PhyML_Printf("\n. " "........................................................." ".............."); } } } while (1); PhyML_Printf("\n. Read prior information on %d %s.", n_clade_priors, n_clade_priors > 1 ? "clades" : "clade"); if (!n_clade_priors) { PhyML_Fprintf(stderr, "\n. PhyTime could not find any prior on node age."); PhyML_Fprintf(stderr, "\n. This is likely due to a problem in the calibration "); PhyML_Fprintf(stderr, "\n. file format. Make sure, for instance, that there is "); PhyML_Fprintf(stderr, "\n. a blank character between the end of the last name"); PhyML_Fprintf(stderr, "\n. of each clade and the character `|'. Otherwise, "); PhyML_Fprintf(stderr, "\n. please refer to the example file.\n"); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s')\n", __FILE__, __LINE__, __FUNCTION__); Warn_And_Exit(""); } for (i = 0; i < tree->n_otu; i++) Free(clade_list[i]); Free(clade_list); Free(line); Free(s); fclose(fp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// option *Get_Input(int argc, char **argv) { option *io; t_mod *mod; t_opt *s_opt; int rv; rv = 1; io = (option *)Make_Input(); mod = (t_mod *)Make_Model_Basic(); s_opt = (t_opt *)Make_Optimiz(); Set_Defaults_Input(io); Set_Defaults_Model(mod); Set_Defaults_Optimiz(s_opt); io->mod = mod; mod->io = io; mod->s_opt = s_opt; #ifdef MPI rv = Read_Command_Line(io, argc, argv); #elif (defined PHYTIME || defined INVITEE || defined PHYREX || defined TEST) rv = Read_Command_Line(io, argc, argv); #else switch (argc) { case 1: { Launch_Interface(io); break; } default: { rv = Read_Command_Line(io, argc, argv); } } #endif if (rv) return io; else return NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Set_Whichmodel(int select) { int wm; wm = -1; switch (select) { case 1: { wm = JC69; break; } case 2: { wm = K80; break; } case 3: { wm = F81; break; } case 4: { wm = HKY85; break; } case 5: { wm = F84; break; } case 6: { wm = TN93; break; } case 7: { wm = GTR; break; } case 8: { wm = CUSTOM; break; } case 11: { wm = WAG; break; } case 12: { wm = DAYHOFF; break; } case 13: { wm = JTT; break; } case 14: { wm = BLOSUM62; break; } case 15: { wm = MTREV; break; } case 16: { wm = RTREV; break; } case 17: { wm = CPREV; break; } case 18: { wm = DCMUT; break; } case 19: { wm = VT; break; } case 20: { wm = MTMAM; break; } case 21: { wm = MTART; break; } case 22: { wm = HIVW; break; } case 23: { wm = HIVB; break; } case 24: { wm = FLU; break; } case 25: { wm = CUSTOMAA; break; } case 26: { wm = LG; break; } case 27: { wm = AB; break; } default: { PhyML_Fprintf( stderr, "\n. Model number %d is unknown. Please use a valid model name", select); Exit("\n"); break; } } return wm; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Data_Structure(int final, FILE *fp, t_tree *mixt_tree) { int n_partition_elem; char *s; t_tree *tree, *cpy_mixt_tree; int c, cc, cc_efrq, cc_rmat, cc_lens; char *param; int *link_efrq, *link_rmat, *link_lens; phydbl r_mat_weight_sum, e_frq_weight_sum; PhyML_Fprintf(fp, "\n. Random seed: %d",mixt_tree->io->r_seed); PhyML_Fprintf(fp, "\n\n. Starting tree: %s", mixt_tree->io->in_tree == 2 ? mixt_tree->io->in_tree_file : "BioNJ"); cpy_mixt_tree = mixt_tree; n_partition_elem = 1; tree = mixt_tree; do { tree = tree->next_mixt; if (!tree) break; n_partition_elem++; } while (1); s = (char *)mCalloc(2, sizeof(char)); s[0] = ' '; s[1] = '\0'; tree = mixt_tree; do { s = (char *)mRealloc( s, (int)(strlen(s) + strlen(tree->io->in_align_file) + 2 + 2), sizeof(char)); strcat(s, tree->io->in_align_file); strcat(s, ", "); tree = tree->next_mixt; if (!tree) break; } while (1); s[(int)strlen(s) - 2] = ' '; s[(int)strlen(s) - 1] = '\0'; if (final == NO) PhyML_Fprintf(fp, "\n\n. Processing %d data %s (%s)", n_partition_elem, n_partition_elem > 1 ? "sets" : "set", s); if (final == YES) PhyML_Fprintf(fp, "\n\n. Processed %d data %s (%s)", n_partition_elem, n_partition_elem > 1 ? "sets" : "set", s); Free(s); if (final == YES) PhyML_Fprintf(fp, "\n\n. Final log-likelihood: %f", mixt_tree->c_lnL); r_mat_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->r_mat_weight); e_frq_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->e_frq_weight); do { int class = 0; PhyML_Fprintf(fp, "\n\n"); PhyML_Fprintf(fp, "\n " "________________________________________________________" "_______________ "); PhyML_Fprintf(fp, "\n| " " |"); PhyML_Fprintf(fp, "\n| %40s (partition element %2d) |", mixt_tree->io->in_align_file, mixt_tree->dp); PhyML_Fprintf(fp, "\n|_____________________________________________________" "__________________|"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n. Number of rate classes:\t\t%20d", mixt_tree->mod->ras->n_catg + (mixt_tree->mod->ras->invar ? 1 : 0)); if (mixt_tree->mod->ras->n_catg > 1) { PhyML_Fprintf(fp, "\n. Model of rate variation:\t\t%20s", mixt_tree->mod->ras->free_mixt_rates ? "FreeRates" : mixt_tree->mod->ras->invar ? "Gamma+Inv" : "Gamma"); if (mixt_tree->mod->ras->free_mixt_rates == NO) { PhyML_Fprintf(fp, "\n. Gamma shape parameter value:\t\t%20.2f", mixt_tree->mod->ras->alpha->v); PhyML_Fprintf(fp, "\n Optimise: \t\t\t\t%20s", mixt_tree->mod->ras->alpha->optimize == YES ? "yes" : "no"); } if (mixt_tree->mod->ras->invar == YES) { PhyML_Fprintf(fp, "\n. Proportion of invariable sites:\t%20.2f", mixt_tree->mod->ras->pinvar->v); PhyML_Fprintf(fp, "\n Optimise: \t\t\t\t%20s", mixt_tree->mod->ras->pinvar->optimize == YES ? "yes" : "no"); } } PhyML_Fprintf(fp, "\n. Relative average rate:\t\t%20f", mixt_tree->mod->br_len_mult->v); tree = mixt_tree; do { if (tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n. Mixture class %d", class + 1); if (mixt_tree->mod->ras->n_catg > 1) { if (tree->mod->ras->invar == NO) { PhyML_Fprintf(fp, "\n Relative substitution rate:\t%20f", mixt_tree->mod->ras->gamma_rr ->v[tree->mod->ras->parent_class_number]); PhyML_Fprintf(fp, "\n Rel. rate freq. (> 0 rates):\t%20f", mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number]); PhyML_Fprintf(fp, "\n Rate class number:\t\t%20d", tree->mod->ras->parent_class_number); } else { PhyML_Fprintf(fp, "\n Relative substitution rate:\t%20f", 0.0); PhyML_Fprintf(fp, "\n Relative rate freq.:\t\t%20f", mixt_tree->mod->ras->pinvar->v); } } PhyML_Fprintf(fp, "\n Substitution model:\t\t%20s", tree->mod->modelname->s); if (tree->mod->whichmodel == CUSTOM) PhyML_Fprintf(fp, "\n Substitution model code:\t%20s", tree->mod->custom_mod_string->s); if (tree->mod->whichmodel == CUSTOMAA) PhyML_Fprintf(fp, "\n Rate matrix file name:\t%20s", tree->mod->aa_rate_mat_file->s); if (tree->mod->whichmodel == K80 || tree->mod->whichmodel == HKY85 || tree->mod->whichmodel == TN93) { PhyML_Fprintf(fp, "\n Value of the ts/tv ratio:\t%20f", tree->mod->kappa->v); PhyML_Fprintf(fp, "\n Optimise ts/tv ratio:\t%20s", tree->mod->kappa->optimize ? "yes" : "no"); } else if (tree->mod->whichmodel == GTR || tree->mod->whichmodel == CUSTOM) { PhyML_Fprintf(fp, "\n Optimise subst. rates:\t%20s", tree->mod->r_mat->optimize ? "yes" : "no"); if (final == YES) { PhyML_Fprintf(fp, "\n Subst. rate A<->C:\t\t%20.2f", tree->mod->r_mat->rr->v[0]); PhyML_Fprintf(fp, "\n Subst. rate A<->G:\t\t%20.2f", tree->mod->r_mat->rr->v[1]); PhyML_Fprintf(fp, "\n Subst. rate A<->T:\t\t%20.2f", tree->mod->r_mat->rr->v[2]); PhyML_Fprintf(fp, "\n Subst. rate C<->G:\t\t%20.2f", tree->mod->r_mat->rr->v[3]); PhyML_Fprintf(fp, "\n Subst. rate C<->T:\t\t%20.2f", tree->mod->r_mat->rr->v[4]); PhyML_Fprintf(fp, "\n Subst. rate G<->T:\t\t%20.2f", tree->mod->r_mat->rr->v[5]); } } PhyML_Fprintf(fp, "\n Rate matrix weight:\t\t%20f", tree->mod->r_mat_weight->v / r_mat_weight_sum); if (tree->io->datatype == NT && tree->mod->whichmodel != JC69 && tree->mod->whichmodel != K80) { PhyML_Fprintf(fp, "\n Optimise nucleotide freq.:\t%20s", tree->mod->e_frq->type == ML ? "yes" : "no"); if (final == YES) { PhyML_Fprintf(fp, "\n Freq(A):\t\t\t%20.2f", tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp, "\n Freq(C):\t\t\t%20.2f", tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp, "\n Freq(G):\t\t\t%20.2f", tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp, "\n Freq(T):\t\t\t%20.2f", tree->mod->e_frq->pi->v[3]); } } else if (tree->io->datatype == AA) { char *s; s = (char *)mCalloc(50, sizeof(char)); if (tree->mod->e_frq->type == EMPIRICAL) { strcpy(s, "Empirical"); } else if (tree->mod->e_frq->type == MODEL) { strcpy(s, "Model"); } else if (tree->mod->e_frq->type == ML) { strcpy(s, "Optimized"); } PhyML_Fprintf(fp, "\n Amino-acid freq.:\t\t%20s", s); Free(s); } PhyML_Fprintf(fp, "\n Equ. freq. weight:\t\t%20f", tree->mod->e_frq_weight->v / e_frq_weight_sum); PhyML_Fprintf(fp, "\n Integrated length (IL) model:%20s", (tree->mod->gamma_mgf_bl == YES) ? "yes" : "no"); if (tree->mod->gamma_mgf_bl == YES) PhyML_Fprintf(fp, "\n Variance of IL model:\t%20.2g", tree->mod->l_var_sigma->v); class ++; tree = tree->next; if (tree && tree->is_mixt_tree == YES) break; } while (tree); PhyML_Fprintf(fp, "\n"); AIC(mixt_tree); BIC(mixt_tree); if (mixt_tree->mod->aic->print == YES) PhyML_Fprintf(fp, "\n AIC: %20.2f", mixt_tree->mod->aic->v); if (mixt_tree->mod->bic->print == YES) PhyML_Fprintf(fp, "\n BIC: %20.2f", mixt_tree->mod->bic->v); mixt_tree = mixt_tree->next_mixt; if (!mixt_tree) break; } while (1); tree = cpy_mixt_tree; c = 0; do { if (tree->is_mixt_tree) tree = tree->next; c++; tree = tree->next; } while (tree); link_efrq = (int *)mCalloc(c, sizeof(int)); link_lens = (int *)mCalloc(c, sizeof(int)); link_rmat = (int *)mCalloc(c, sizeof(int)); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n " "__________________________________________________________" "_____________ "); PhyML_Fprintf(fp, "\n| " " |"); PhyML_Fprintf(fp, "\n| Model summary table " " |"); PhyML_Fprintf(fp, "\n|_______________________________________________________" "________________|"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); /* PhyML_Fprintf(fp," "); */ PhyML_Fprintf(fp, " ------------------"); tree = cpy_mixt_tree; c = 0; do { if (tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp, "---"); tree = tree->next; } while (tree); param = (char *)mCalloc(30, sizeof(char)); PhyML_Fprintf(fp, "\n"); strcpy(param, "Partition element "); PhyML_Fprintf(fp, " %18s", param); tree = cpy_mixt_tree; c = 0; do { if (tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp, "%2d ", tree->mixt_tree->dp); tree = tree->next; } while (tree); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, " ------------------"); tree = cpy_mixt_tree; c = 0; do { if (tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp, "---"); tree = tree->next; } while (tree); tree = cpy_mixt_tree; c = 0; do { if (tree->is_mixt_tree) tree = tree->next; link_rmat[c] = -1; link_lens[c] = -1; link_efrq[c] = -1; tree = tree->next; c++; } while (tree); mixt_tree = cpy_mixt_tree; cc_efrq = 97; cc_rmat = 97; cc_lens = 97; cc = 0; do { if (mixt_tree->is_mixt_tree) mixt_tree = mixt_tree->next; if (link_efrq[cc] < 0) { link_efrq[cc] = cc_efrq; tree = mixt_tree->next; c = cc + 1; if (tree) { do { if (tree->is_mixt_tree) tree = tree->next; if (mixt_tree->mod->e_frq == tree->mod->e_frq) link_efrq[c] = cc_efrq; tree = tree->next; c++; } while (tree); } cc_efrq++; } if (link_lens[cc] < 0) { link_lens[cc] = cc_lens; tree = mixt_tree->next; c = cc + 1; if (tree) { do { if (tree->is_mixt_tree) tree = tree->next; if (mixt_tree->a_edges[0]->l == tree->a_edges[0]->l) link_lens[c] = cc_lens; tree = tree->next; c++; } while (tree); } cc_lens++; } if (link_rmat[cc] < 0) { link_rmat[cc] = cc_rmat; tree = mixt_tree->next; c = cc + 1; if (tree) { do { if (tree->is_mixt_tree) tree = tree->next; if (mixt_tree->mod->r_mat == tree->mod->r_mat && mixt_tree->mod->whichmodel == tree->mod->whichmodel && !strcmp(mixt_tree->mod->custom_mod_string->s, tree->mod->custom_mod_string->s) && !strcmp(mixt_tree->mod->aa_rate_mat_file->s, tree->mod->aa_rate_mat_file->s)) link_rmat[c] = cc_rmat; tree = tree->next; c++; } while (tree); } cc_rmat++; } cc++; mixt_tree = mixt_tree->next; } while (mixt_tree); PhyML_Fprintf(fp, "\n"); strcpy(param, "State frequencies "); PhyML_Fprintf(fp, " %18s", param); tree = cpy_mixt_tree; c = 0; do { if (tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp, "%2c ", link_efrq[c]); tree = tree->next; c++; } while (tree); PhyML_Fprintf(fp, "\n"); strcpy(param, "Branch lengths "); PhyML_Fprintf(fp, " %18s", param); tree = cpy_mixt_tree; c = 0; do { if (tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp, "%2c ", link_lens[c]); tree = tree->next; c++; } while (tree); PhyML_Fprintf(fp, "\n"); strcpy(param, "Rate matrix "); PhyML_Fprintf(fp, " %18s", param); tree = cpy_mixt_tree; c = 0; do { if (tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp, "%2c ", link_rmat[c]); tree = tree->next; c++; } while (tree); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, " ------------------"); tree = cpy_mixt_tree; c = 0; do { if (tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp, "---"); tree = tree->next; } while (tree); PhyML_Fprintf(fp, "\n"); if (final == YES) { tree = cpy_mixt_tree; c = 0; do { PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n. Tree estimated from data partition %d", c++); Br_Len_Involving_Invar(tree->next); Rescale_Br_Len_Multiplier_Tree(tree->next); s = Write_Tree( tree->next); /*! tree->next is not a mixt_tree so edge lengths are not averaged over when writing the tree out. */ PhyML_Fprintf(fp, "\n %s", s); Br_Len_Not_Involving_Invar(tree->next); Unscale_Br_Len_Multiplier_Tree(tree->next); Free(s); tree = tree->next_mixt; } while (tree); } Free(param); Free(link_efrq); Free(link_rmat); Free(link_lens); mixt_tree = cpy_mixt_tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// option *PhyML_XML(char *xml_filename) { char *most_likely_tree; phydbl best_lnL; int num_rand_tree; t_tree *mixt_tree, *tree; option *io, *dum; xml_node *xml_root; mixt_tree = XML_Process_Base(xml_filename); io = mixt_tree->io; most_likely_tree = NULL; xml_root = mixt_tree->xml_root; best_lnL = UNLIKELY; dum = NULL; dum = (option *)mCalloc(1, sizeof(option)); dum->use_xml = YES; for (num_rand_tree = 0; num_rand_tree < io->mod->s_opt->n_rand_starts; num_rand_tree++) { MIXT_Check_Model_Validity(mixt_tree); MIXT_Chain_Models(mixt_tree); Init_Model(mixt_tree->mod->io->cdata, mixt_tree->mod, mixt_tree->mod->io); Set_Model_Parameters(mixt_tree->mod); Print_Data_Structure(NO, stdout, mixt_tree); tree = MIXT_Starting_Tree(mixt_tree); Copy_Tree(tree, mixt_tree); Free_Tree(tree); if (mixt_tree->io->mod->s_opt->random_input_tree) { PhyML_Printf("\n\n. [%3d/%3d]", num_rand_tree + 1, mixt_tree->io->mod->s_opt->n_rand_starts); Random_Tree(mixt_tree); } Copy_Tree(mixt_tree, mixt_tree->next); Connect_CSeqs_To_Nodes(mixt_tree->mod->io->cdata, mixt_tree->mod->io, mixt_tree); Init_T_Beg(mixt_tree); Make_Tree_For_Pars(mixt_tree); Make_Tree_For_Lk(mixt_tree); Make_Spr(mixt_tree); MIXT_Chain_All(mixt_tree); MIXT_Check_Edge_Lens_In_All_Elem(mixt_tree); MIXT_Turn_Branches_OnOff_In_All_Elem(ON, mixt_tree); MIXT_Check_Invar_Struct_In_Each_Partition_Elem(mixt_tree); MIXT_Check_RAS_Struct_In_Each_Partition_Elem(mixt_tree); Br_Len_Not_Involving_Invar(mixt_tree); Unscale_Br_Len_Multiplier_Tree(mixt_tree); Set_Both_Sides(YES, mixt_tree); Set_Update_Eigen(YES, mixt_tree->mod); Lk(NULL, mixt_tree); Set_Update_Eigen(NO, mixt_tree->mod); if (mixt_tree->mod->s_opt->opt_topo) { Global_Spr_Search(mixt_tree); } else { Round_Optimize(mixt_tree, ROUND_MAX); } PhyML_Printf("\n\n. Log-likelihood = %f", mixt_tree->c_lnL); if ((num_rand_tree == io->mod->s_opt->n_rand_starts - 1) && (io->mod->s_opt->random_input_tree)) { num_rand_tree--; io->mod->s_opt->random_input_tree = NO; } Br_Len_Involving_Invar(mixt_tree); Rescale_Br_Len_Multiplier_Tree(mixt_tree); /*! Print the tree estimated using the current random (or BioNJ) starting * tree */ if (io->mod->s_opt->n_rand_starts > 1) { Print_Tree(io->fp_out_trees, mixt_tree); fflush(NULL); } if (mixt_tree->c_lnL > best_lnL) { best_lnL = mixt_tree->c_lnL; if (most_likely_tree) Free(most_likely_tree); if (io->ratio_test) { aLRT(mixt_tree); Collect_Edge_Support_Values(mixt_tree); } most_likely_tree = Write_Tree(mixt_tree); mixt_tree->lock_topo = NO; } tree = mixt_tree; do { tree->mod->aic->print = YES; tree->mod->bic->print = YES; tree = tree->next_mixt; } while (tree); tree = mixt_tree; do { if (tree->io->print_site_lnl == YES) Print_Site_Lk(tree, tree->io->fp_out_lk); tree = tree->next_mixt; } while (tree); MIXT_Init_T_End(mixt_tree); Print_Data_Structure(YES, mixt_tree->io->fp_out_stats, mixt_tree); MIXT_Cv(mixt_tree); Free_Best_Spr(mixt_tree); Free_Spr_List_One_Edge(mixt_tree); Free_Spr_List_All_Edge(mixt_tree); Free_Tree_Pars(mixt_tree); Free_Tree_Lk(mixt_tree); } /*! Print the most likely tree in the output file */ if (!mixt_tree->io->quiet) PhyML_Printf("\n\n. Printing the most likely tree in file '%s'...\n", Basename(mixt_tree->io->out_tree_file)); PhyML_Fprintf(mixt_tree->io->fp_out_tree, "%s\n", most_likely_tree); /*! Bootstrap analysis */ MIXT_Bootstrap(most_likely_tree, xml_root); while (io->prev != NULL) io = io->prev; Free(most_likely_tree); tree = mixt_tree; do { Free_Calign(tree->data); tree = tree->next_mixt; } while (tree); tree = mixt_tree; do { Free_Optimiz(tree->mod->s_opt); tree = tree->next; } while (tree); Free_Model_Complete(mixt_tree->mod); Free_Model_Basic(mixt_tree->mod); Free_Tree(mixt_tree); if (io->fp_out_trees) fclose(io->fp_out_trees); if (io->fp_out_tree) fclose(io->fp_out_tree); if (io->fp_out_stats) fclose(io->fp_out_stats); if (io->fp_out_json_trace) fclose(io->fp_out_json_trace); Free_Input(io); XML_Free_XML_Tree(xml_root); return (dum); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Check that the same nodes in the different mixt_trees are connected to the same taxa */ void Check_Taxa_Sets(t_tree *mixt_tree) { t_tree *tree; int i; tree = mixt_tree; do { if (tree->next) { for (i = 0; i < tree->n_otu; i++) { if (strcmp(tree->a_nodes[i]->name, tree->next->a_nodes[i]->name)) { PhyML_Fprintf( stderr, "\n. There seems to be a problem in one (or more) of your"); PhyML_Fprintf(stderr, "\n. sequence alignments. PhyML could not match taxon"); PhyML_Fprintf(stderr, "\n. '%s' found in file '%s' with any of the taxa", tree->a_nodes[i]->name, tree->io->in_align_file); PhyML_Fprintf(stderr, "\n. listed in file '%s'.", tree->next->io->in_align_file); Exit("\n"); } } } tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Ratematrix_From_XML_Node(xml_node *instance, option *io, t_mod *mod) { char *model = NULL; int select; model = XML_Get_Attribute_Value(instance, "model"); if (model == NULL) { PhyML_Fprintf(stderr, "\n. Poorly formated XML file."); PhyML_Fprintf(stderr, "\n. Attribute 'model' is mandatory in a node."); Exit("\n"); } select = XML_Validate_Attr_Int(model, 27, "xxxxx", // 0 "JC69", // 1 "K80", // 2 "F81", // 3 "HKY85", // 4 "F84", // 5 "TN93", // 6 "GTR", // 7 "CUSTOM", // 8 "xxxxx", // 9 "xxxxx", // 10 "WAG", // 11 "DAYHOFF", // 12 "JTT", // 13 "BLOSUM62", // 14 "MTREV", // 15 "RTREV", // 16 "CPREV", // 17 "DCMUT", // 18 "VT", // 19 "MTMAM", // 20 "MTART", // 21 "HIVW", // 22 "HIVB", // 23 "FLU", // 24 "CUSTOMAA", // 25 "LG", // 26 "AB"); // 27 if (select < 9) { if (io->datatype != NT) { PhyML_Fprintf(stderr, "\n. Data type and selected model are incompatible"); Exit("\n"); } } else { if (io->datatype != AA) { PhyML_Fprintf(stderr, "\n. Data type and selected model are incompatible"); Exit("\n"); } } mod->r_mat = (t_rmat *)Make_Rmat(mod->ns); Init_Rmat(mod->r_mat); Make_Custom_Model(mod); /*! Set model number & name */ mod->whichmodel = Set_Whichmodel(select); Set_Model_Name(mod); if (mod->whichmodel == K80 || mod->whichmodel == HKY85 || mod->whichmodel == TN93) { char *tstv, *opt_tstv; tstv = XML_Get_Attribute_Value(instance, "tstv"); if (tstv) { mod->kappa->v = String_To_Dbl(tstv); mod->kappa->optimize = NO; } else { mod->kappa->optimize = YES; } opt_tstv = XML_Get_Attribute_Value(instance, "optimise.tstv"); if (opt_tstv) { if (!strcmp(opt_tstv, "true") || !strcmp(opt_tstv, "yes")) { mod->kappa->optimize = YES; mod->s_opt->opt_subst_param = YES; } else { mod->kappa->optimize = NO; mod->s_opt->opt_subst_param = NO; } } } else { mod->kappa->optimize = NO; } if (mod->whichmodel == GTR || mod->whichmodel == CUSTOM) { xml_node *rr; char *val; phydbl v; rr = XML_Search_Node_Name("rr", YES, instance); if (rr != NULL) { // A<->C val = XML_Get_Attribute_Value(rr, "AC"); if (val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution " "between A and T"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } else { v = strtod(val, NULL); if (v != 0 && v > 0.0) { mod->r_mat->rr->v[0] = v; mod->r_mat->rr_val->v[0] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } // A<->G val = XML_Get_Attribute_Value(rr, "AG"); if (val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution " "between A and T"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } else { v = strtod(val, NULL); if (v != 0 && v > 0.0) { mod->r_mat->rr->v[1] = v; mod->r_mat->rr_val->v[1] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } // A<->T val = XML_Get_Attribute_Value(rr, "AT"); if (val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution " "between A and T"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } else { v = strtod(val, NULL); if (v != 0 && v > 0.0) { mod->r_mat->rr->v[2] = v; mod->r_mat->rr_val->v[2] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } // C<->G val = XML_Get_Attribute_Value(rr, "CG"); if (val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution " "between A and T"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } else { v = strtod(val, NULL); if (v != 0 && v > 0.0) { mod->r_mat->rr->v[3] = v; mod->r_mat->rr_val->v[3] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } // C<->T val = XML_Get_Attribute_Value(rr, "CT"); if (val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution " "between A and T"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } else { v = strtod(val, NULL); if (v != 0 && v > 0.0) { mod->r_mat->rr->v[4] = v; mod->r_mat->rr_val->v[4] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } // G<->T val = XML_Get_Attribute_Value(rr, "GT"); if (val != NULL) { v = strtod(val, NULL); if (v != 0 && v > 0.0) { mod->r_mat->rr->v[5] = v; mod->r_mat->rr_val->v[5] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } } } char *opt_rr; opt_rr = XML_Get_Attribute_Value(instance, "optimise.rr"); if (opt_rr != NULL) { assert(mod->r_mat != NULL); if (!strcmp(opt_rr, "yes") || !strcmp(opt_rr, "true")) { mod->r_mat->optimize = YES; mod->s_opt->opt_subst_param = YES; } else { mod->r_mat->optimize = NO; mod->s_opt->opt_subst_param = NO; } } /*! Custom model for nucleotide sequences. Read the corresponding code. */ if (mod->whichmodel == CUSTOM) { char *model_code = NULL; model_code = XML_Get_Attribute_Value(instance, "model.code"); if (!model_code) { PhyML_Fprintf(stderr, "\n. No valid 'model.code' attribute could be found.\n"); PhyML_Fprintf(stderr, "\n. Please fix your XML file.\n"); Exit("\n"); } else { strcpy(mod->custom_mod_string->s, model_code); Make_Custom_Model(mod); Translate_Custom_Mod_String(mod); } } /*! Custom model for amino-acids. Read in the rate matrix file */ if (mod->whichmodel == CUSTOMAA) { char *r_mat_file; r_mat_file = XML_Get_Attribute_Value(instance, "ratematrix.file"); if (!r_mat_file) { PhyML_Fprintf(stderr, "\n. No valid 'ratematrix.file' attribute could be found."); PhyML_Fprintf(stderr, "\n. Please fix your XML file.\n"); Exit("\n"); } else { strcpy(mod->aa_rate_mat_file->s, r_mat_file); } /* Free(r_mat_file); */ } char *buff; buff = XML_Get_Attribute_Value(instance->parent, "optimise.weights"); if (buff && (!strcmp(buff, "yes") || !strcmp(buff, "true"))) { mod->s_opt->opt_rmat_weight = YES; } else { mod->s_opt->opt_rmat_weight = NO; } char *il_model = NULL; il_model = XML_Get_Attribute_Value(instance, "integrated.lens"); if (il_model) { if (!strcmp(il_model, "yes") || !strcmp(il_model, "true")) { mod->gamma_mgf_bl = YES; } else { mod->gamma_mgf_bl = NO; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Efrq_From_XML_Node(xml_node *instance, option *io, t_mod *mod) { char *buff; mod->e_frq = (t_efrq *)Make_Efrq(mod->ns); Init_Efrq(NULL, mod->e_frq); buff = XML_Get_Attribute_Value(instance, "freqs"); if (buff) { if (!strcmp(buff, "empirical")) { mod->e_frq->type = EMPIRICAL; mod->e_frq->pi->optimize = NO; } if (!strcmp(buff, "model")) { mod->e_frq->type = MODEL; mod->e_frq->pi->optimize = NO; } else if (!strcmp(buff, "optimized")) { mod->e_frq->type = ML; mod->e_frq->pi->optimize = YES; } else if (!strcmp(buff, "user")) { mod->e_frq->type = ML; mod->e_frq->pi->optimize = NO; } } buff = XML_Get_Attribute_Value(instance, "base.freqs"); if (buff) { if (io->datatype == AA) { PhyML_Fprintf( stderr, "\n. Option 'base.freqs' is not allowed with amino-acid data."); Exit("\n"); } else { phydbl A, C, G, T; if (mod->e_frq->type != USER) { PhyML_Fprintf(stderr, "\n. Please set 'freqs=user'."); Exit("\n"); } sscanf(buff, "%lf,%lf,%lf,%lf", &A, &C, &G, &T); mod->e_frq->user_b_freq->v[0] = (phydbl)A; mod->e_frq->user_b_freq->v[1] = (phydbl)C; mod->e_frq->user_b_freq->v[2] = (phydbl)G; mod->e_frq->user_b_freq->v[3] = (phydbl)T; mod->e_frq->type = USER; } } buff = XML_Get_Attribute_Value(instance->parent, "optimise.weights"); if (buff && (!strcmp(buff, "yes") || !strcmp(buff, "true"))) { mod->s_opt->opt_efrq_weight = YES; } else { mod->s_opt->opt_efrq_weight = NO; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Topology_From_XML_Node(xml_node *instance, option *io, t_mod *mod) { // Starting tree char *init_tree; init_tree = XML_Get_Attribute_Value(instance, "init.tree"); if (!init_tree) { PhyML_Fprintf(stderr, "\n. Attribute 'init.tree=bionj|user|random' is mandatory"); PhyML_Fprintf(stderr, "\n. Please amend your XML file accordingly."); Exit("\n"); } if (!strcmp(init_tree, "user") || !strcmp(init_tree, "User")) { char *starting_tree = NULL; starting_tree = XML_Get_Attribute_Value(instance, "file.name"); if (!Filexists(starting_tree)) { PhyML_Fprintf(stderr, "\n. The tree file '%s' could not be found.", starting_tree); Exit("\n"); } else { strcpy(io->in_tree_file, starting_tree); io->in_tree = 2; io->fp_in_tree = Openfile(io->in_tree_file, 0); } } else if (!strcmp(init_tree, "random") || !strcmp(init_tree, "Random")) { char *n_rand_starts = NULL; io->mod->s_opt->random_input_tree = YES; n_rand_starts = XML_Get_Attribute_Value(instance, "n.rand.starts"); if (n_rand_starts) { mod->s_opt->n_rand_starts = atoi(n_rand_starts); if (mod->s_opt->n_rand_starts < 1) Exit("\n. Number of random starting trees must be > 0.\n\n"); } strcpy(io->out_trees_file, io->in_align_file); strcat(io->out_trees_file, "_phyml_rand_trees"); if (io->append_run_ID) { strcat(io->out_trees_file, "_"); strcat(io->out_trees_file, io->run_id_string); } strcat(io->out_trees_file, ".txt"); io->fp_out_trees = Openfile(io->out_trees_file, 1); } else if (!strcmp(init_tree, "parsimony") || !strcmp(init_tree, "Parsimony")) { io->in_tree = 1; } // Estimate tree topology char *optimise = NULL; optimise = XML_Get_Attribute_Value(instance, "optimise.topology"); if (optimise) { int select; select = XML_Validate_Attr_Int(optimise, 6, "true", "yes", "y", "false", "no", "n"); if (select > 2) io->mod->s_opt->opt_topo = NO; else { char *search; int select; search = XML_Get_Attribute_Value(instance, "search"); if (search == NULL) { io->mod->s_opt->topo_search = SPR_MOVE; io->mod->s_opt->opt_topo = YES; } else { select = XML_Validate_Attr_Int(search, 4, "spr", "nni", "best", "none"); switch (select) { case 0: { io->mod->s_opt->topo_search = SPR_MOVE; io->mod->s_opt->opt_topo = YES; break; } case 1: { io->mod->s_opt->topo_search = NNI_MOVE; io->mod->s_opt->opt_topo = YES; break; } case 2: { io->mod->s_opt->topo_search = BEST_OF_NNI_AND_SPR; io->mod->s_opt->opt_topo = YES; break; } case 3: { io->mod->s_opt->opt_topo = NO; break; } default: { PhyML_Fprintf(stderr, "\n. Topology search option '%s' is not valid.", search); Exit("\n"); break; } } } } } // Edge length unit char *edge_len; edge_len = XML_Get_Attribute_Value(instance, "edge.lengths"); if (edge_len != NULL) { if (!strcmp(edge_len, "calendar") || !strcmp(edge_len, "cal")) { io->edge_len_unit = CALENDAR; } else if (!strcmp(edge_len, "mutations") || !strcmp(edge_len, "substitutions") || !strcmp(edge_len, "mut") || !strcmp(edge_len, "subst")) { io->edge_len_unit = SUBSTITUTIONS; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_RAS_From_XML_Node(xml_node *parent, t_mod *mod) { xml_node *w; char *family; int select; family = NULL; mod->ras->n_catg = 0; XML_Check_Siterates_Node(parent); w = XML_Search_Node_Name("weights", YES, parent); if (w) { family = XML_Get_Attribute_Value(w, "family"); if (family == NULL) select = -1; else select = XML_Validate_Attr_Int(family, 3, "gamma", "gamma+inv", "freerates"); switch (select) { case 0: // Gamma model { char *alpha, *alpha_opt; mod->ras->pinvar->optimize = NO; mod->ras->invar = NO; alpha = XML_Get_Attribute_Value(w, "alpha"); if (alpha) { if (!strcmp(alpha, "estimate") || !strcmp(alpha, "estimated") || !strcmp(alpha, "optimise") || !strcmp(alpha, "optimised")) { mod->ras->alpha->optimize = YES; } else { mod->ras->alpha->optimize = NO; mod->ras->alpha->v = String_To_Dbl(alpha); } } alpha_opt = XML_Get_Attribute_Value(w, "optimise.alpha"); if (alpha_opt) { if (!strcmp(alpha_opt, "yes") || !strcmp(alpha_opt, "true")) { mod->ras->alpha->optimize = YES; } else { mod->ras->alpha->optimize = NO; } } mod->ras->n_catg = XML_Get_Number_Of_Classes_Siterates(parent); Make_RAS_Complete(mod->ras); break; } case 1: // Gamma+Inv model { char *alpha, *pinv, *alpha_opt, *pinv_opt; mod->ras->invar = YES; mod->ras->pinvar->optimize = YES; alpha = XML_Get_Attribute_Value(w, "alpha"); if (alpha) { if (!strcmp(alpha, "estimate") || !strcmp(alpha, "estimated") || !strcmp(alpha, "optimise") || !strcmp(alpha, "optimised")) { mod->ras->alpha->optimize = YES; } else { mod->ras->alpha->optimize = NO; mod->ras->alpha->v = String_To_Dbl(alpha); ; } } alpha_opt = XML_Get_Attribute_Value(w, "optimise.alpha"); if (alpha_opt) { if (!strcmp(alpha_opt, "yes") || !strcmp(alpha_opt, "true")) { mod->ras->alpha->optimize = YES; } else { mod->ras->alpha->optimize = NO; } } pinv = XML_Get_Attribute_Value(w, "pinv"); if (pinv) { if (!strcmp(pinv, "estimate") || !strcmp(pinv, "estimated") || !strcmp(pinv, "optimise") || !strcmp(pinv, "optimised")) { mod->ras->pinvar->optimize = YES; } else { mod->ras->pinvar->optimize = NO; mod->ras->pinvar->v = String_To_Dbl(pinv); ; } } pinv_opt = XML_Get_Attribute_Value(w, "optimise.pinv"); if (pinv_opt) { if (!strcmp(pinv_opt, "yes") || !strcmp(pinv_opt, "true")) { mod->ras->pinvar->optimize = YES; } else { mod->ras->pinvar->optimize = NO; } } mod->ras->n_catg = XML_Get_Number_Of_Classes_Siterates(parent); break; } case 2: // FreeRate model { char *opt_freerates; mod->ras->free_mixt_rates = YES; mod->s_opt->opt_free_mixt_rates = YES; opt_freerates = XML_Get_Attribute_Value(w, "optimise.freerates"); if (opt_freerates) { if (!strcmp(opt_freerates, "yes") || !strcmp(opt_freerates, "true")) { mod->s_opt->opt_free_mixt_rates = YES; } else { mod->s_opt->opt_free_mixt_rates = NO; } } mod->ras->n_catg = XML_Get_Number_Of_Classes_Siterates(parent); break; } default: { if (family != NULL) PhyML_Printf("\n. family: %s", family); else { PhyML_Printf("\n. Please specify a model family (\"gamma\", " "\"gamma+inv\" or \"freerate\")"); PhyML_Printf("\n. for every 'weights' element in every 'siterate' " "element. Note that "); PhyML_Printf("\n. a \"gamma\" or a \"freerate\" model with a single " "rate class amounts"); PhyML_Printf("\n. to no variation of rates across sites, if this is " "the model you'd"); PhyML_Printf("\n. like to implement..."); } PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } } } int nc = XML_Get_Number_Of_Classes_Siterates(parent); if (w && nc != mod->ras->n_catg) { PhyML_Printf("\n. component '%s'. The number of classes ", parent->id); PhyML_Printf("\n. specified in the component should be "); PhyML_Printf("\n. the same as that of nodes. Please fix"); PhyML_Printf("\n. your XML file accordingly."); Exit("\n"); } if (!w) mod->ras->n_catg = nc; Make_RAS_Complete(mod->ras); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Generic_Exit(const char *file, int line, const char *function) { PhyML_Fprintf(stderr, "\n. Err. in file '%s' (line %d)", file, line); if (function != NULL) PhyML_Printf(", function '%s'", function); #if defined(PHYTIME) PhyML_Fprintf(stderr, "\n. PhyTime finished prematurely."); #elif defined(PHYREX) PhyML_Fprintf(stderr, "\n. PhyREX finished prematurely."); #elif defined(PHYML) PhyML_Fprintf(stderr, "\n. PhyML finished prematurely."); #else PhyML_Fprintf(stderr, "\n. The execution finished prematurely."); #endif Exit("\n"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void JSON_Write_Object(json_o *obj, FILE *where) { json_kv *kv; assert(obj); assert(where); kv = obj->kv; assert(kv); PhyML_Fprintf(where, "{"); do { PhyML_Fprintf(where, "\"%s\":", kv->key); if (kv->value != NULL) PhyML_Fprintf(where, "\"%s\"", kv->value); else if (kv->array != NULL) JSON_Write_Array(kv->array, where); else if (kv->object != NULL) JSON_Write_Object(kv->object, where); kv = kv->next; if (kv) PhyML_Fprintf(where, ","); } while (kv); PhyML_Fprintf(where, "}"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void JSON_Write_Array(json_a *array, FILE *where) { json_o *o; assert(where); assert(array); o = array->object; assert(o); PhyML_Fprintf(where, "["); do { JSON_Write_Object(o, where); o = o->next; if (o) PhyML_Fprintf(where, ","); } while (o); PhyML_Fprintf(where, "]\n"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void JSON_Write_All(json_a *array, FILE *where) { JSON_Write_Array(array, where); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ json_o *JSON_Tree_To_Object(t_tree *mixt_tree) { t_tree *tree; json_kv *state, *kv; json_o *ret, *o; json_a *a; int string_len; char *s; time_t t_end; string_len = 20; ret = (json_o *)mCalloc(1, sizeof(json_o)); ret->next = NULL; state = (json_kv *)mCalloc(1, sizeof(json_kv)); ret->kv = state; state->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(state->key, "state"); state->value = NULL; state->array = NULL; state->object = NULL; state->next = NULL; state->array = (json_a *)mCalloc(1, sizeof(json_a)); a = state->array; a->object = (json_o *)mCalloc(1, sizeof(json_o)); o = a->object; // State num o->kv = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "type"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "t_num"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "id"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "state_num"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "value"); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%d", mixt_tree->json_num); mixt_tree->json_num++; kv->next = NULL; // Time o->next = (json_o *)mCalloc(1, sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "type"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "t_time"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "id"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "time"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "value"); kv->value = (char *)mCalloc(string_len, sizeof(char)); time(&t_end); sprintf(kv->value, "%d", (int)(t_end - mixt_tree->t_beg)); kv->next = NULL; // Tree o->next = (json_o *)mCalloc(1, sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "type"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "t_tree"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "id"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "tree"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "value"); s = Write_Tree(mixt_tree); kv->value = (char *)mCalloc((int)strlen(s) + 1, sizeof(char)); sprintf(kv->value, "%s", s); Free(s); kv->next = NULL; // Likelihood o->next = (json_o *)mCalloc(1, sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "type"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "t_param"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "id"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "likelihood"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "value"); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%G", mixt_tree->c_lnL); kv->next = NULL; // TsTv { int n_tstv, i; scalar_dbl **tstv; n_tstv = 0; tstv = NULL; tree = mixt_tree; do { if (tree->is_mixt_tree == YES) tree = tree->next; for (i = 0; i < n_tstv; ++i) if (tree->mod->kappa == tstv[i]) break; if (i == n_tstv) { if (!tstv) tstv = (scalar_dbl **)mCalloc(1, sizeof(scalar_dbl *)); else tstv = (scalar_dbl **)mRealloc(tstv, n_tstv + 1, sizeof(scalar_dbl *)); tstv[n_tstv] = tree->mod->kappa; n_tstv++; if (tree->mod->kappa->optimize == YES) { o->next = (json_o *)mCalloc(1, sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "type"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "t_param"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "id"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "tstv"); sprintf(kv->value + strlen(kv->value), "%d", n_tstv); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "value"); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%G", tree->mod->kappa->v); kv->next = NULL; } } tree = tree->next; } while (tree); if (tstv) Free(tstv); } // Alpha { int n_alpha, i; scalar_dbl **alpha; n_alpha = 0; alpha = NULL; tree = mixt_tree; do { for (i = 0; i < n_alpha; i++) if (tree->mod->ras->alpha == alpha[i]) break; if (i == n_alpha) { if (!alpha) alpha = (scalar_dbl **)mCalloc(1, sizeof(scalar_dbl *)); else alpha = (scalar_dbl **)mRealloc(alpha, n_alpha + 1, sizeof(scalar_dbl *)); alpha[n_alpha] = tree->mod->ras->alpha; n_alpha++; if (tree->mod->ras->alpha->optimize == YES) { o->next = (json_o *)mCalloc(1, sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "type"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "t_param"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "id"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "alpha"); sprintf(kv->value + strlen(kv->value), "%d", n_alpha); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "value"); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%G", tree->mod->ras->alpha->v); kv->next = NULL; } } tree = tree->next_mixt; } while (tree); if (alpha) Free(alpha); } // Tree size { tree = mixt_tree; int tree_num = 1; do { o->next = (json_o *)mCalloc(1, sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "type"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "t_param"); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "id"); kv->value = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->value, "tree_size"); sprintf(kv->value + strlen(kv->value), "%d", tree_num); kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "value"); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%G", Get_Tree_Size(tree)); kv->next = NULL; tree = tree->next_mixt; } while (tree); } return (ret); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ json_o *JSON_Tree_To_Object_Light(t_tree *mixt_tree) { t_tree *tree; json_kv *state, *kv; json_o *ret, *o; int string_len; char *s; time_t t_end; string_len = 20; ret = (json_o *)mCalloc(1, sizeof(json_o)); ret->next = NULL; state = (json_kv *)mCalloc(1, sizeof(json_kv)); ret->kv = state; state->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(state->key, "state"); state->value = NULL; state->array = NULL; state->object = NULL; state->next = NULL; state->object = (json_o *)mCalloc(1, sizeof(json_o)); o = state->object; o->kv = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = o->kv; // State num kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "state_num"); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%d", mixt_tree->json_num); // Time kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "time"); kv->value = (char *)mCalloc(string_len, sizeof(char)); time(&t_end); sprintf(kv->value, "%d", (int)(t_end - mixt_tree->t_beg)); // Tree kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "tree"); s = Write_Tree(mixt_tree); kv->value = (char *)mCalloc((int)strlen(s) + 1, sizeof(char)); sprintf(kv->value, "%s", s); Free(s); // Likelihood kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "likelihood"); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%G", mixt_tree->c_lnL); // TsTv { int n_tstv, i; scalar_dbl **tstv; n_tstv = 0; tstv = NULL; tree = mixt_tree; do { if (tree->is_mixt_tree == YES) tree = tree->next; for (i = 0; i < n_tstv; ++i) if (tree->mod->kappa == tstv[i]) break; if (i == n_tstv) { if (!tstv) tstv = (scalar_dbl **)mCalloc(1, sizeof(scalar_dbl *)); else tstv = (scalar_dbl **)mRealloc(tstv, n_tstv + 1, sizeof(scalar_dbl *)); tstv[n_tstv] = tree->mod->kappa; n_tstv++; if (tree->mod->kappa->optimize == YES) { kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "tstv"); sprintf(kv->key + strlen(kv->key), "%d", n_tstv); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%G", tree->mod->kappa->v); } } tree = tree->next; } while (tree); if (tstv) Free(tstv); } // Alpha { int n_alpha, i; scalar_dbl **alpha; n_alpha = 0; alpha = NULL; tree = mixt_tree; do { for (i = 0; i < n_alpha; i++) if (tree->mod->ras->alpha == alpha[i]) break; if (i == n_alpha) { if (!alpha) alpha = (scalar_dbl **)mCalloc(1, sizeof(scalar_dbl *)); else alpha = (scalar_dbl **)mRealloc(alpha, n_alpha + 1, sizeof(scalar_dbl *)); alpha[n_alpha] = tree->mod->ras->alpha; n_alpha++; if (tree->mod->ras->alpha->optimize == YES) { kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "alpha"); sprintf(kv->key + strlen(kv->key), "%d", n_alpha); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%G", tree->mod->ras->alpha->v); } } tree = tree->next_mixt; } while (tree); if (alpha) Free(alpha); } // Tree size { tree = mixt_tree; int tree_num = 1; do { kv->next = (json_kv *)mCalloc(1, sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len, sizeof(char)); strcpy(kv->key, "tree_size"); sprintf(kv->key + strlen(kv->key), "%d", tree_num); kv->value = (char *)mCalloc(string_len, sizeof(char)); sprintf(kv->value, "%G", Get_Tree_Size(tree)); tree = tree->next_mixt; } while (tree); } kv->next = NULL; return (ret); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void JSON_Tree_Io(t_tree *tree, FILE *where) { // Append json_o *o; fpos_t pos; char c; fgetpos(where, &pos); rewind(where); c = fgetc(where); if (c != '[') { PhyML_Fprintf(where, "["); } else { fsetpos(where, &pos); fseek(where, -1, SEEK_CUR); PhyML_Fprintf(where, ","); } PhyML_Fprintf(where, "\n"); /* o = JSON_Tree_To_Object(tree); */ o = JSON_Tree_To_Object_Light(tree); JSON_Write_Object(o, where); JSON_Free_Object(o); PhyML_Fprintf(where, "]"); fflush(where); // Print out latest tree + info /* json_o *o; */ /* rewind(where); */ /* /\* PhyML_Fprintf(where,"["); *\/ */ /* o = JSON_Tree_To_Object(tree); */ /* JSON_Write_Object(o,where); */ /* JSON_Free_Object(o); */ /* /\* PhyML_Fprintf(where,"]"); *\/ */ /* fflush(where); */ } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Print_Lk_Given_Edge_Recurr(t_node *a, t_node *d, t_edge *b, t_tree *tree) { PhyML_Printf("\n___ Edge %3d (left=%3d rght=%3d) lnL=%f", b->num, b->left->num, b->rght->num, Lk(b, tree)); if (d->tax) return; else { int i; for (i = 0; i < 3; i++) if (d->v[i] != a) Print_Lk_Given_Edge_Recurr(d, d->v[i], d->b[i], tree); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Collect_Edge_Support_Values(t_tree *tree) { int i; for (i = 0; i < 2 * tree->n_otu - 3; ++i) { if (tree->io->do_boot == YES) { tree->a_edges[i]->support_val = (phydbl)tree->a_edges[i]->bip_score; } else if (tree->io->do_tbe == YES) { int pminus1 = MIN(tree->a_edges[i]->left->bip_size[tree->a_edges[i]->l_r], tree->a_edges[i]->rght->bip_size[tree->a_edges[i]->r_l]) - 1; tree->a_edges[i]->support_val = 1. - ((tree->a_edges[i]->tdist_score) / (tree->io->n_boot_replicates * 1.0)) / pminus1; } else if (tree->io->do_alrt == YES) { tree->a_edges[i]->support_val = tree->a_edges[i]->ratio_test; } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if defined(PHYREX) void PHYREX_Output_Tree_Structure(FILE *fp, t_tree *tree) { char *s; s = PHYREX_Print_Tree_Structure(tree); PhyML_Fprintf(fp, "%s", s); Free(s); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if defined(PHYREX) char *PHYREX_Print_Tree_Structure(t_tree *tree) { t_dsk *disk; char *s, *buff; FILE *fp; fpos_t pos; fp = tmpfile(); assert(fp); buff = (char *)mCalloc(T_MAX_LINE, sizeof(char)); disk = tree->young_disk; while (disk->prev != NULL) disk = disk->prev; assert(disk->ldsk); assert(disk->ldsk->n_next > 0); fgetpos(fp, &pos); PhyML_Fprintf(fp, "begin\n"); fsetpos(fp, &pos); if (fgets(buff, T_MAX_LINE, fp) == NULL) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); s = (char *)mCalloc((int)strlen(buff) + 1, sizeof(char)); sprintf(s + strlen(s), "%s", buff); fgetpos(fp, &pos); PhyML_Fprintf(fp, "%d %d\n", tree->n_otu, tree->mmod->n_dim); fsetpos(fp, &pos); if (fgets(buff, T_MAX_LINE, fp) == NULL) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); s = (char *)mRealloc(s, (int)(strlen(s) + strlen(buff) + 1), sizeof(char)); sprintf(s + strlen(s), "%s", buff); do { fgetpos(fp, &pos); PhyML_Fprintf(fp, "%s ", disk->id); PhyML_Fprintf(fp, "%f ", disk->time); PhyML_Fprintf(fp, "%f %f ", disk->centr->lonlat[0], disk->centr->lonlat[1]); if (disk->ldsk != NULL) { s = (char *)mRealloc(s, (int)strlen(s) + 9, sizeof(char)); PhyML_Fprintf(fp, "*%s ", disk->ldsk->coord->id); PhyML_Fprintf(fp, "%f %f ", disk->ldsk->coord->lonlat[0], disk->ldsk->coord->lonlat[1]); } for (int i = 0; i < disk->n_ldsk_a; ++i) { PhyML_Fprintf(fp, "%s ", disk->ldsk_a[i]->coord->id); } PhyML_Fprintf(fp, "\n"); fsetpos(fp, &pos); if (fgets(buff, T_MAX_LINE, fp) == NULL) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); s = (char *)mRealloc(s, (int)(strlen(s) + strlen(buff) + 1), sizeof(char)); sprintf(s + strlen(s), "%s", buff); disk = disk->next; } while (disk); fgetpos(fp, &pos); PhyML_Fprintf(fp, "end"); fsetpos(fp, &pos); if (fgets(buff, T_MAX_LINE, fp) == NULL) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); s = (char *)mRealloc(s, (int)(strlen(s) + strlen(buff) + 1), sizeof(char)); sprintf(s + strlen(s), "%s", buff); fclose(fp); Free(buff); return (s); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if defined(PHYREX) void PHYREX_Check_Point(FILE *fp, t_tree *tree) { xml_node *n; char *s; if (XML_Search_Node_Attribute_Value("add", "true", NO, tree->xml_root) == NULL) { XML_Add_Attribute(tree->xml_root, "add", "true"); } n = XML_Search_Node_Name("slfv", YES, tree->xml_root); if (n == NULL) { n = XML_Add_Node(tree->xml_root, "slfv"); XML_Set_Node_Id(n, "SLFV1"); } s = PHYREX_Print_Tree_Structure(tree); XML_Set_Node_Value(n, s); XML_Update_XML_Struct_Given_Model_Params(tree); /* XML_Update_XML_Struct_Given_MCMC_Params(tree); */ XML_Write_XML_Graph(fp, tree->xml_root); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if defined(PHYREX) void PHYREX_Input_Tree_Structure(FILE *fp) { char *tk, *s, delim[4] = "\n\r "; int n_otu, n_dim, idx; t_dsk *disk; t_ldsk *new_ldsk, *root_ldsk, *ldsk; s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); do { if (fgets(s, T_MAX_LINE, fp) == NULL) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } while (strstr(s, "begin") == NULL); if (fgets(s, T_MAX_LINE, fp) == NULL) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); tk = strtok(s, delim); n_otu = strtod(tk, NULL); tk = strtok(NULL, delim); n_dim = strtod(tk, NULL); root_ldsk = NULL; new_ldsk = NULL; while (fgets(s, T_MAX_LINE, fp) != NULL) { tk = strtok(s, delim); if (strcmp(tk, "end") && tk != NULL) { disk = PHYREX_Make_Disk_Event(n_dim, n_otu); strcpy(disk->id, tk); tk = strtok(NULL, delim); disk->time = strtold(tk, NULL); tk = strtok(NULL, delim); disk->centr->lonlat[0] = strtold(tk, NULL); tk = strtok(NULL, delim); disk->centr->lonlat[1] = strtold(tk, NULL); tk = strtok(NULL, delim); if (tk[0] == '*') // disk has ldsk on it { if (root_ldsk == NULL) { disk->ldsk = PHYREX_Make_Lindisk_Node(n_dim); disk->ldsk->disk = disk; root_ldsk = disk->ldsk; } else { disk->ldsk = PHYREX_Find_Ldsk_From_Id(tk + 1, root_ldsk); assert(disk->ldsk != NULL); } strcpy(disk->ldsk->coord->id, tk + 1); tk = strtok(NULL, delim); disk->ldsk->coord->lonlat[0] = strtold(tk, NULL); tk = strtok(NULL, delim); disk->ldsk->coord->lonlat[1] = strtold(tk, NULL); do { tk = strtok(NULL, delim); if (tk == NULL) break; new_ldsk = PHYREX_Make_Lindisk_Node(n_dim); strcpy(new_ldsk->coord->id, tk); PHYREX_Make_Lindisk_Next(disk->ldsk); disk->ldsk->next[disk->ldsk->n_next - 1] = new_ldsk; disk->ldsk_a[disk->ldsk->n_next - 1] = new_ldsk; new_ldsk->prev = disk->ldsk; } while (tk); } else { idx = 0; do { tk = strtok(NULL, delim); if (tk == NULL) break; ldsk = PHYREX_Find_Ldsk_From_Id(tk, root_ldsk); assert(ldsk); disk->ldsk_a[idx] = ldsk; idx++; } while (tk); } } } Free(s); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Output_Scalar_Dbl(scalar_dbl *t, char *sep, FILE *fp) { scalar_dbl *l; l = t; do { PhyML_Fprintf(fp, "%g%s", l->v, sep); l = l->next; } while (l); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // s should look like that: "xxx={yyy},xxxx={yy},..." t_label *Read_Labels(char *s) { t_label *lab, *init_lab; char *s_cpy, *s_small; char *label; char *key, *val; int cur, beg, op; short int finished; if (s[0] != '[' || s[(int)strlen(s) - 1] != ']') { PhyML_Fprintf(stderr, "\n. Label is in wrong format. A proper label should"); PhyML_Fprintf(stderr, "\n. look as follows: \"[xxx={yyy},xxxx={yy},...]\""); assert(FALSE); } lab = Make_Label(); init_lab = lab; s_cpy = (char *)mCalloc((int)strlen(s) + 1, sizeof(char)); strcpy(s_cpy, s); label = (char *)mCalloc(strlen(s), sizeof(char)); cur = beg = 0; finished = NO; do { cur++; beg = cur; op = 0; do { if (s_cpy[cur] == '{') op++; if (s_cpy[cur] == '}') op--; cur++; } while (!(s_cpy[cur] == ',' && op == 0) && s_cpy[cur] != ']'); if (s_cpy[cur] == ']') finished = YES; else finished = NO; s_cpy[cur] = '\0'; strcpy(label, s_cpy + beg); key = strtok_r(label, "=", &s_small); val = strtok_r(NULL, "=", &s_small); Free(lab->key); lab->key = (char *)mCalloc(strlen(key) + 1, sizeof(char)); strcpy(lab->key, key); Free(lab->val); lab->val = (char *)mCalloc(strlen(val) + 1, sizeof(char)); strcpy(lab->val, val); if (finished == NO) { lab->sep = ','; lab->next = Make_Label(); lab = lab->next; } } while (finished == NO); lab = init_lab; Free(label); Free(s_cpy); return (lab); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Print_Labels(FILE *fp_where, char *s_where, t_label *label) { if (label == NULL) return; else { t_label *lab; lab = label; if (fp_where != NULL) { PhyML_Fprintf(fp_where, "["); } else { sprintf(s_where + (int)strlen(s_where), "["); } while (lab) { if (fp_where != NULL) { if (lab->prev == NULL) PhyML_Fprintf(fp_where, "&%s=%s", lab->key, lab->val); else PhyML_Fprintf(fp_where, "%s=%s", lab->key, lab->val); if (lab->next != NULL) PhyML_Fprintf(fp_where, ","); } else { if (lab->prev == NULL) sprintf(s_where + (int)strlen(s_where), "&%s=%s", lab->key, lab->val); else sprintf(s_where + (int)strlen(s_where), "%s=%s", lab->key, lab->val); if (lab->next != NULL) sprintf(s_where + (int)strlen(s_where), ","); } lab = lab->next; } if (fp_where != NULL) { PhyML_Fprintf(fp_where, "]"); } else { sprintf(s_where + (int)strlen(s_where), "]"); } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if (defined PHYREX) void PHYREX_Print_MultiTypeTree_Config_File(int n_sites, char *filename, t_tree *tree) { int i, j, n_demes; char *s, **deme_names; FILE *fp; fp = Openfile(filename, WRITE); assert(fp); deme_names = (char **)mCalloc(n_sites, sizeof(char *)); n_demes = 0; for (i = 0; i < tree->n_otu; i++) { s = strrchr(tree->a_nodes[i]->ldsk->coord->id, '_'); for (j = 0; j < n_demes; j++) if (!strcmp(s + 1, deme_names[j])) break; if (j == n_demes) { deme_names[n_demes] = (char *)mCalloc(strlen(s + 1) + 1, sizeof(char)); strcpy(deme_names[n_demes], s + 1); n_demes++; } } // n_demes is the number of non-empty sampling sites PhyML_Fprintf(fp, ""); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); for (i = 0; i < tree->n_otu; i++) { PhyML_Fprintf( fp, "\n", tree->a_nodes[i]->ldsk->coord->id, /* tree->a_nodes[i]->coord->id, */ tree->a_nodes[i]->name, tree->a_nodes[i]->c_seq->state); } PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\nbeast.math.distributions.Uniform"); PhyML_Fprintf(fp, "\nbeast.math.distributions.Exponential"); PhyML_Fprintf(fp, "\nbeast.math.distributions.LogNormalDistributionModel"); PhyML_Fprintf( fp, "\nbeast.math.distributions.Normal"); PhyML_Fprintf(fp, "\nbeast.math.distributions.Beta"); PhyML_Fprintf(fp, "\nbeast.math.distributions.Gamma"); PhyML_Fprintf(fp, "\nbeast.math.distributions.LaplaceDistribution"); PhyML_Fprintf(fp, "\nbeast.math.distributions.Prior"); PhyML_Fprintf(fp, "\nbeast.math.distributions.InverseGamma"); PhyML_Fprintf( fp, "\nbeast.math.distributions.OneOnX"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); For(i, n_demes * (n_demes - 1)) strcat(s, "1.0 "); PhyML_Fprintf(fp, "\n%s", n_demes * (n_demes - 1), s); Free(s); s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); for (i = 0; i < n_demes; i++) strcat(s, "1.0 "); PhyML_Fprintf(fp, "\n%s", n_demes, s); Free(s); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\nn_otu; i++) { s = strrchr(tree->a_nodes[i]->ldsk->coord->id, '_'); PhyML_Fprintf(fp, "%s=%s", tree->a_nodes[i]->ldsk->coord->id, s + 1); if (i < tree->n_otu - 1) PhyML_Fprintf(fp, ","); else PhyML_Fprintf(fp, "\">"); } PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n2.0"); s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); for (i = 0; i < n_demes; i++) strcat(s, "1.0 "); PhyML_Fprintf(fp, "\n%s", n_demes, s); Free(s); s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); For(i, n_demes * (n_demes - 1)) strcat(s, "1.0 "); PhyML_Fprintf(fp, "\n%s", n_demes * (n_demes - 1), s); Free(s); PhyML_Fprintf( fp, "\n0.25"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n1.0"); PhyML_Fprintf(fp, "\n1.25"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n1.0"); PhyML_Fprintf(fp, "\n1.25"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n1.0"); PhyML_Fprintf(fp, "\n1.25"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n1.0"); PhyML_Fprintf(fp, "\n1.0"); PhyML_Fprintf(fp, "\n0.0"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n%G", 1.0); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf( fp, "\n"); /* PhyML_Fprintf(fp,"\n"); */ /* PhyML_Fprintf(fp,"\n"); */ /* PhyML_Fprintf(fp,"\n"); */ PhyML_Fprintf( fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); PhyML_Fprintf(fp, "\n"); for (i = 0; i < n_demes; i++) Free(deme_names[i]); Free(deme_names); fclose(fp); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if (defined PHYREX || PHYTIME) void PHYREX_Print_MCMC_Stats(t_tree *tree) { FILE *fp_stats; fp_stats = tree->io->fp_out_stats; if (tree->mcmc->run == 0) { if (XML_Search_Node_Attribute_Value("add", "true", NO, tree->xml_root) == NULL) { PhyML_Fprintf(fp_stats, "\n# before rand glnL: %f alnL: %f", tree->mmod->c_lnL, tree->c_lnL); PhyML_Fprintf(fp_stats, "\n# ninter: %d", PHYREX_Total_Number_Of_Intervals(tree)); PhyML_Fprintf(fp_stats, "\n# ncoal: %d", PHYREX_Total_Number_Of_Coal_Disks(tree)); PhyML_Fprintf(fp_stats, "\n# nhits: %d", PHYREX_Total_Number_Of_Hit_Disks(tree)); PhyML_Fprintf(fp_stats, "\n# true lbda: %f", tree->mmod->lbda); PhyML_Fprintf(fp_stats, "\n# true mu: %f", tree->mmod->mu); PhyML_Fprintf(fp_stats, "\n# true rad: %f", SLFV_Update_Radius(tree)); PhyML_Fprintf(fp_stats, "\n# true sigsq: %f", tree->mmod->sigsq[0]); PhyML_Fprintf(fp_stats, "\n# true neigh. size: %f", SLFV_Neighborhood_Size(tree)); PhyML_Fprintf(fp_stats, "\n# fst-based estimate of neighborhood size: %f", SLFV_Neighborhood_Size_Regression(tree)); PhyML_Fprintf(fp_stats, "\n# nucleotide diversity: %f", Nucleotide_Diversity(tree->data)); PhyML_Fprintf(fp_stats, "\n# length of a generation: %G time units", SLFV_Generation_Length(tree)); PhyML_Fprintf(fp_stats, "\n# clock rate: %G subst. per time unit", tree->rates->clock_r); PhyML_Fprintf(fp_stats, "\n# after rand glnL: %f alnL: %f", tree->mmod->c_lnL, tree->c_lnL); PhyML_Fprintf(fp_stats, "\n# ninter: %d", PHYREX_Total_Number_Of_Intervals(tree)); PhyML_Fprintf(fp_stats, "\n# ncoal: %d", PHYREX_Total_Number_Of_Coal_Disks(tree)); PhyML_Fprintf(fp_stats, "\n# nhits: %d", PHYREX_Total_Number_Of_Hit_Disks(tree)); PhyML_Fprintf(fp_stats, "\n# start lbda: %f", tree->mmod->lbda); PhyML_Fprintf(fp_stats, "\n# start mu: %f", tree->mmod->mu); PhyML_Fprintf(fp_stats, "\n# start rad: %f", tree->mmod->rad); PhyML_Fprintf(fp_stats, "\n# dist. in tree: "); for (int i = 0; i < tree->n_otu - 1; ++i) for (int j = i + 1; j < tree->n_otu; ++j) PhyML_Fprintf(fp_stats, "%G ", PHYREX_Dist_Between_Two_Ldsk(tree->a_nodes[i]->ldsk, tree->a_nodes[j]->ldsk, tree)); PhyML_Fprintf(fp_stats, "\n# dist. in space: "); for (int i = 0; i < tree->n_otu - 1; ++i) for (int j = i + 1; j < tree->n_otu; ++j) PhyML_Fprintf(fp_stats, "%G ", Euclidean_Distance(tree->a_nodes[i]->ldsk->coord, tree->a_nodes[j]->ldsk->coord)); PhyML_Fprintf(fp_stats, "\n"); PhyML_Fprintf(fp_stats, "%s\t", "sample"); PhyML_Fprintf(fp_stats, "%s\t", "lnPost"); PhyML_Fprintf(fp_stats, "%s\t", "lnLAlgn"); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES) { PhyML_Fprintf(fp_stats, "%s\t", "lnLPIV"); PhyML_Fprintf(fp_stats, "%s\t", "lnLVeloc"); PhyML_Fprintf(fp_stats, "%s\t", "lnLSpac"); } else PhyML_Fprintf(fp_stats, "%s\t", "lnLSpac"); PhyML_Fprintf(fp_stats, "%s\t", "lnLRate"); PhyML_Fprintf(fp_stats, "%s\t", "lnLTime"); PhyML_Fprintf(fp_stats, "%s\t", "lnPSpac"); PhyML_Fprintf(fp_stats, "%s\t", "lnPRate"); PhyML_Fprintf(fp_stats, "%s\t", "lnPTime"); PhyML_Fprintf(fp_stats, "%s\t", "substRate"); PhyML_Fprintf(fp_stats, "%s\t", "clockRate"); for (int i = 0; i < tree->mmod->n_dim; ++i) PhyML_Fprintf(fp_stats, "%s%s\t", "sigSq", (i == 0) ? ("Lon") : ((i == 1) ? ("Lat") : ("xx"))); PhyML_Fprintf(fp_stats, "%s\t", "nEff"); PhyML_Fprintf(fp_stats, "%s\t", "growth"); PhyML_Fprintf(fp_stats, "%s\t", "speed"); PhyML_Fprintf(fp_stats, "%s\t", "displacement"); PhyML_Fprintf(fp_stats, "%s\t", "speedfromveloc"); if (IWN_Is_Iwn(tree->mmod) == YES) PhyML_Fprintf(fp_stats, "%s\t", "stickiness"); if (IOU_Is_Iou(tree->mmod) == YES) PhyML_Fprintf(fp_stats, "%s\t", "stickiness"); if (IOU_Is_Iou(tree->mmod) == YES) for (int i = 0; i < tree->mmod->n_dim; ++i) PhyML_Fprintf(fp_stats, "%s%s\t", "tren", (i == 0) ? ("Lon") : ((i == 1) ? ("Lat") : ("xx"))); if (tree->contmod->obs_model == YES) PhyML_Fprintf(fp_stats, "%s\t", "obsVarLon"); if (tree->contmod->obs_model == YES) PhyML_Fprintf(fp_stats, "%s\t", "obsVarLat"); PhyML_Fprintf(fp_stats, "%s\t", "rootTime"); PhyML_Fprintf(fp_stats, "%s\t", "rootLon"); PhyML_Fprintf(fp_stats, "%s\t", "rootLat"); PhyML_Fprintf(fp_stats, "%s\t", "nu"); PhyML_Fprintf(fp_stats, "%s\t", "rrNormFact"); PhyML_Fprintf(fp_stats, "%s\t", "rrRateMult"); PhyML_Fprintf(fp_stats, "%s\t", "rrwNormFact"); PhyML_Fprintf(fp_stats, "%s\t", "accNarrowExchange"); PhyML_Fprintf(fp_stats, "%s\t", "accWideExchange"); PhyML_Fprintf(fp_stats, "%s\t", "accMoveRootTime"); PhyML_Fprintf(fp_stats, "%s\t", "accMoveScaleTime"); PhyML_Fprintf(fp_stats, "%s\t", "accNodeTimes"); PhyML_Fprintf(fp_stats, "%s\t", "accRatesShrink"); PhyML_Fprintf(fp_stats, "%s\t", "accSigsq"); PhyML_Fprintf(fp_stats, "%s\t", "accSigsqScale"); PhyML_Fprintf(fp_stats, "%s\t", "accNodeVeloc"); PhyML_Fprintf(fp_stats, "%s\t", "accScaleVeloc"); PhyML_Fprintf(fp_stats, "%s\t", "tuneRatesShrink"); PhyML_Fprintf(fp_stats, "%s\t", "tuneVeloc"); if (tree->mcmc->out_verbose == 1) if (tree->mmod->model_id == RRW_GAMMA || tree->mmod->model_id == RRW_LOGNORMAL) for (int i = 0; i < 2 * tree->n_otu - 1; ++i) PhyML_Fprintf(fp_stats, "sigSq%d\t", i); PhyML_Fprintf(fp_stats, "sigSqSonLeft\t"); PhyML_Fprintf(fp_stats, "sigSqSonRght\t"); PhyML_Fprintf(fp_stats, "rrSonLeft\t"); PhyML_Fprintf(fp_stats, "rrSonRght\t"); PhyML_Fprintf(fp_stats, "root_VelocLon\t"); PhyML_Fprintf(fp_stats, "root_VelocLat\t"); if (tree->mcmc->out_verbose == 1) { for (int i = 0; i < tree->n_otu; ++i) { PhyML_Fprintf(fp_stats, "%s_VelocLon\t", tree->a_nodes[i]->name); PhyML_Fprintf(fp_stats, "%s_VelocLat\t", tree->a_nodes[i]->name); } if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES) { for (int i = tree->n_otu; i < 2 * tree->n_otu - 1; ++i) { PhyML_Fprintf(fp_stats, "%d_VelocLon%s\t", i, (tree->a_nodes[i] == tree->n_root->v[1] || tree->a_nodes[i] == tree->n_root->v[2]) ? "*" : ""); PhyML_Fprintf(fp_stats, "%d_VelocLat%s\t", i, (tree->a_nodes[i] == tree->n_root->v[1] || tree->a_nodes[i] == tree->n_root->v[2]) ? "*" : ""); } } } if (tree->mcmc->out_verbose == 1) { for (int i = tree->n_otu; i < 2 * tree->n_otu - 1; ++i) { PhyML_Fprintf(fp_stats, "%d_Lon%s\t", i, (tree->a_nodes[i] == tree->n_root->v[1] || tree->a_nodes[i] == tree->n_root->v[2]) ? "*" : ""); PhyML_Fprintf(fp_stats, "%d_Lat%s\t", i, (tree->a_nodes[i] == tree->n_root->v[1] || tree->a_nodes[i] == tree->n_root->v[2]) ? "*" : ""); } } } } if (!(tree->mcmc->run % tree->mcmc->sample_interval) && tree->mcmc->sample_interval > 0) { if (tree->eval_glnL == YES) LOCATION_Lk(NULL, tree); // Required in order to have contmod->lnL up-to-date if (tree->eval_tlnL == YES) TIMES_Lk(tree); if (tree->eval_alnL == YES) Lk(NULL, tree); if (tree->eval_rlnL == YES) RATES_Lk(tree); time(&(tree->mcmc->time_end)); PhyML_Fprintf(fp_stats, "\n"); PhyML_Fprintf(fp_stats, "%6d\t", tree->mcmc->run); PhyML_Fprintf(fp_stats, "%.2f\t", PHYREX_Get_Posterior(tree)); PhyML_Fprintf(fp_stats, "%.2f\t", tree->c_lnL); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES) { PhyML_Fprintf(fp_stats, "%.2f\t", tree->mmod->c_lnL); PhyML_Fprintf(fp_stats, "%.2f\t", tree->contmod->lnL[VELOCITY * tree->mmod->n_dim + 0] + tree->contmod->lnL[VELOCITY * tree->mmod->n_dim + 1]); PhyML_Fprintf(fp_stats, "%.2f\t", tree->contmod->lnL[LOCATION * tree->mmod->n_dim + 0] + tree->contmod->lnL[LOCATION * tree->mmod->n_dim + 1]); } else PhyML_Fprintf(fp_stats, "%.2f\t", tree->mmod->c_lnL); PhyML_Fprintf(fp_stats, "%.2f\t", tree->rates->c_lnL); PhyML_Fprintf(fp_stats, "%.2f\t", tree->times->c_lnL); PhyML_Fprintf(fp_stats, "%f\t", tree->mmod->c_lnP); PhyML_Fprintf(fp_stats, "%.2f\t", tree->rates->c_lnP); PhyML_Fprintf(fp_stats, "%.2f\t", tree->times->c_lnP); PhyML_Fprintf(fp_stats, "%g\t", RATES_Realized_Substitution_Rate(tree)); PhyML_Fprintf(fp_stats, "%g\t", tree->rates->clock_r); for (int i = 0; i < tree->mmod->n_dim; ++i) PhyML_Fprintf(fp_stats, "%g\t", tree->mmod->sigsq[i]); PhyML_Fprintf(fp_stats, "%g\t", tree->times->scaled_pop_size); PhyML_Fprintf(fp_stats, "%g\t", tree->times->neff_growth); PhyML_Fprintf(fp_stats, "%g\t", PHYREX_Realized_Dispersal_Dist(tree->mmod->dist_type, tree) / PHYREX_Time_Tree_Length(tree)); PhyML_Fprintf( fp_stats, "%g\t", PHYREX_Realized_Displacement_Dist(tree->mmod->dist_type, tree) / PHYREX_Time_Tree_Length(tree)); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES) PhyML_Fprintf(fp_stats, "%g\t", VELOC_Mean_Speed(tree)); else PhyML_Fprintf(fp_stats, "-1.\t"); if (IWN_Is_Iwn(tree->mmod) == YES) PhyML_Fprintf(fp_stats, "%g\t", tree->mmod->omega); if (IOU_Is_Iou(tree->mmod) == YES) PhyML_Fprintf(fp_stats, "%g\t", tree->mmod->ou_theta); if (IOU_Is_Iou(tree->mmod) == YES) for (int i = 0; i < tree->mmod->n_dim; ++i) PhyML_Fprintf(fp_stats, "%g\t", tree->mmod->ou_mu[i]); if (tree->contmod->obs_model == YES) PhyML_Fprintf(fp_stats, "%g\t", tree->contmod->obs_var[0]); if (tree->contmod->obs_model == YES) PhyML_Fprintf(fp_stats, "%g\t", tree->contmod->obs_var[1]); PhyML_Fprintf(fp_stats, "%.2f\t", tree->n_root->ldsk->disk->time); if (RRW_Is_Rw(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) RRW_Sample_Node_Locations_Joint(tree); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) VELOC_Sample_Node_Locations_Joint(tree); PhyML_Fprintf(fp_stats, "%g\t", tree->n_root->ldsk->coord->lonlat[0]); PhyML_Fprintf(fp_stats, "%g\t", tree->n_root->ldsk->coord->lonlat[1]); PhyML_Fprintf(fp_stats, "%g\t", tree->rates->nu); PhyML_Fprintf(fp_stats, "%g\t", tree->rates->norm_fact); PhyML_Fprintf(fp_stats, "%g\t", RATES_Mean_Rate_Multiplier(tree)); PhyML_Fprintf(fp_stats, "%g\t", tree->mmod->sigsq_scale_norm_fact); PhyML_Fprintf( fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_narrow_exchange]); PhyML_Fprintf( fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_wide_exchange]); PhyML_Fprintf(fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_root_time]); PhyML_Fprintf( fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_scale_times]); PhyML_Fprintf(fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_node_times]); PhyML_Fprintf(fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_rates_shrink]); PhyML_Fprintf(fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_sigsq]); PhyML_Fprintf( fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_sigsq_scale]); PhyML_Fprintf(fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_node_veloc]); PhyML_Fprintf(fp_stats, "%g\t", tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_all_veloc]); PhyML_Fprintf(fp_stats, "%g\t", tree->mcmc->tune_move[tree->mcmc->num_move_rates_shrink]); PhyML_Fprintf( fp_stats, "%g\t", tree->mcmc->tune_move[tree->mcmc->num_move_phyrex_node_veloc]); if (tree->mcmc->out_verbose == 1) if (tree->mmod->model_id == RRW_GAMMA || tree->mmod->model_id == RRW_LOGNORMAL) for (int i = 0; i < 2 * tree->n_otu - 1; ++i) PhyML_Fprintf(fp_stats, "%g\t", tree->mmod->sigsq_scale[i]); PhyML_Fprintf(fp_stats, "%f\t", tree->mmod->sigsq_scale[tree->n_root->v[1]->num]); PhyML_Fprintf(fp_stats, "%f\t", tree->mmod->sigsq_scale[tree->n_root->v[2]->num]); PhyML_Fprintf(fp_stats, "%f\t", tree->rates->br_r[tree->n_root->v[1]->num]); PhyML_Fprintf(fp_stats, "%f\t", tree->rates->br_r[tree->n_root->v[2]->num]); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES) { PhyML_Fprintf(fp_stats, "%g\t", tree->n_root->ldsk->veloc->deriv[0]); PhyML_Fprintf(fp_stats, "%g\t", tree->n_root->ldsk->veloc->deriv[1]); if (tree->mcmc->out_verbose == 1) for (int i = 0; i < 2 * tree->n_otu - 1; ++i) { PhyML_Fprintf(fp_stats, "%g\t", tree->a_nodes[i]->ldsk->veloc->deriv[0]); PhyML_Fprintf(fp_stats, "%g\t", tree->a_nodes[i]->ldsk->veloc->deriv[1]); } } else if (RRW_Is_Rw(tree->mmod) == YES) { RRW_Tip_Velocities(tree); PhyML_Fprintf(fp_stats, "%g\t", -1.); PhyML_Fprintf(fp_stats, "%g\t", -1.); if (tree->mcmc->out_verbose == 1) { for (int i = 0; i < tree->n_otu; ++i) { PhyML_Fprintf(fp_stats, "%g\t", tree->a_nodes[i]->ldsk->veloc->deriv[0]); PhyML_Fprintf(fp_stats, "%g\t", tree->a_nodes[i]->ldsk->veloc->deriv[1]); } } } if (tree->mcmc->out_verbose == 1) for (int i = tree->n_otu; i < 2 * tree->n_otu - 1; ++i) { PhyML_Fprintf(fp_stats, "%g\t", tree->a_nodes[i]->ldsk->coord->lonlat[0]); PhyML_Fprintf(fp_stats, "%g\t", tree->a_nodes[i]->ldsk->coord->lonlat[1]); } /* for(int i=0;in_otu;++i) */ /* { */ /* PhyML_Fprintf(fp_stats,"%g\t%g\t", */ /* (tree->a_nodes[i]->ldsk->coord->lonlat[0] - * tree->a_nodes[i]->anc->ldsk->coord->lonlat[0])/ */ /* fabs(tree->times->nd_t[tree->a_nodes[i]->num] - * tree->times->nd_t[tree->a_nodes[i]->anc->num]), */ /* (tree->a_nodes[i]->ldsk->coord->lonlat[1] - * tree->a_nodes[i]->anc->ldsk->coord->lonlat[1])/ */ /* fabs(tree->times->nd_t[tree->a_nodes[i]->num] - * tree->times->nd_t[tree->a_nodes[i]->anc->num])); */ /* } */ /* for(int i=0;in_otu;++i) */ /* { */ /* PhyML_Fprintf(fp_stats,"%g\t", */ /* Euclidean_Distance(tree->a_nodes[i]->ldsk->coord,tree->a_nodes[i]->anc->ldsk->coord)/ */ /* fabs(tree->times->nd_t[tree->a_nodes[i]->num] - * tree->times->nd_t[tree->a_nodes[i]->anc->num])); */ /* } */ /* for(int i=0;in_otu-1;++i) */ /* { */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->a_nodes[tree->n_otu+i]->ldsk->coord->lonlat[0]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->a_nodes[tree->n_otu+i]->ldsk->coord->lonlat[1]); */ /* } */ /* if(tree->io->mcmc_output_times == YES) */ /* { */ /* for(int i=tree->n_otu;i<2*tree->n_otu-1;++i) * PhyML_Fprintf(fp_stats,"%f\t",tree->times->nd_t[tree->a_nodes[i]->num]); */ /* } */ fflush(NULL); time(&(tree->mcmc->time_beg)); tree->mcmc->sample_num++; } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if (defined PHYREX || defined TEST) void PHYREX_Print_MCMC_Tree(t_tree *tree) { FILE *fp_tree; if (tree->io->mcmc_output_trees == NO) return; fp_tree = tree->io->fp_out_tree; if (tree->mcmc->run == 0) { PhyML_Fprintf(fp_tree, "#NEXUS"); PhyML_Fprintf(fp_tree, "\n\nBegin taxa;"); PhyML_Fprintf(fp_tree, "\n\tDimensions ntax=%d;", tree->n_otu); PhyML_Fprintf(fp_tree, "\n\tTaxlabels"); for (int i = 0; i < tree->n_otu; ++i) PhyML_Fprintf(fp_tree, "\n\t\t'%s'", tree->a_nodes[i]->name); PhyML_Fprintf(fp_tree, "\n\t;"); PhyML_Fprintf(fp_tree, "\n\tend;"); PhyML_Fprintf(fp_tree, "\n\n"); PhyML_Fprintf(fp_tree, "\nBegin trees;"); PhyML_Fprintf(fp_tree, "\n\tTranslate"); for (int i = 0; i < tree->n_otu; ++i) { PhyML_Fprintf(fp_tree, "\n\t%d '%s'", i + 1, tree->a_nodes[i]->name); if (i < tree->n_otu - 1) PhyML_Fprintf(fp_tree, ","); } PhyML_Fprintf(fp_tree, "\n;"); } if (!(tree->mcmc->run % tree->mcmc->sample_interval) && tree->mcmc->sample_interval > 0) { /* if(RRW_Is_Rw(tree->mmod) == YES && * tree->mmod->integrateAncestralLocations == YES) * RRW_Sample_Node_Locations_Joint(tree); */ /* if(VELOC_Is_Integrated_Velocity(tree->mmod) == YES && * tree->mmod->integrateAncestralLocations == YES) * VELOC_Sample_Node_Locations_Joint(tree); */ Record_Br_Len(tree); TIMES_Time_To_Bl(tree); tree->bl_ndigits = 3; /* tree->bl_ndigits = 7; */ tree->write_tax_names = NO; Label_Nodes_With_Locations(tree); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES) Label_Nodes_With_Velocities(tree); else if (RRW_Is_Rw(tree->mmod) == YES) { RRW_Tip_Velocities(tree); Label_Nodes_With_Velocities(tree); } Label_Edges(tree); char *s = Write_Tree(tree); Free_All_Node_Labels(tree); PhyML_Fprintf(fp_tree, "\ntree %d [&lnP=%f,precision={1.e-1,1e-02,1e-01}] = [&R] %s", tree->mcmc->run, tree->c_lnL, s); PhyML_Fprintf(fp_tree, "\nend;"); fseek(fp_tree, -5, SEEK_END); tree->write_tax_names = YES; Free(s); Restore_Br_Len(tree); fflush(NULL); } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if (defined PHYREX || defined TEST) void PHYREX_Print_MCMC_Summary(t_tree *tree) { char *s; s = (char *)mCalloc(100, sizeof(char)); strcpy(s, ""); if (tree->mcmc->run == 0) { if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES || RRW_Is_Rw(tree->mmod) == YES) sprintf(s, "%s", "speed\0"); PhyML_Fprintf( stdout, "\n. %23s\t%25s\t%15s\t%15s\t%15s\t%13s\t%10s\t%19s\t%13s", "run (aux.run)", "operator", "lnSpac", /* "lnTime", */ "lnAlgn", "lnPost", "rootTime", "substRate", "(rootLon;rootLat)", s); } if (!(tree->mcmc->run % tree->mcmc->print_every) && tree->mcmc->print_every > 0) { if (RRW_Is_Rw(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) RRW_Sample_Node_Locations_Joint(tree); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) VELOC_Sample_Node_Locations_Joint(tree); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES) sprintf(s, "%13f", VELOC_Mean_Speed(tree)); else if (RRW_Is_Rw(tree->mmod) == YES) sprintf(s, "%13f", PHYREX_Realized_Dispersal_Dist(tree->mmod->dist_type, tree) / PHYREX_Time_Tree_Length(tree)); PhyML_Fprintf(stdout, "\n. %10d " "(%10d)\t%25s\t%15.2f\t%15.2f\t%15.2f\t%13.1f\t%10f\t(%8.2f;%" "8.2f)\t%13s", tree->mcmc->run, tree->aux_tree[0]->mcmc->run, tree->mcmc->move_idx > -1 ? tree->mcmc->move_name[tree->mcmc->move_idx] : "", tree->mmod->c_lnL, /* tree->times->c_lnL, */ tree->c_lnL, PHYREX_Get_Posterior(tree), tree->times->nd_t[tree->n_root->num], tree->rates->clock_r, tree->n_root->ldsk->coord->lonlat[0], tree->n_root->ldsk->coord->lonlat[1], s); if (tree->numerical_warning == YES) PhyML_Fprintf(stdout, " -- WARNING: numerical precision issue detected..."); } Free(s); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ xml_node *Generate_PhyREX_XMLObj(char *run_id, char *out_file_name, char *seq_file_name, char *coord_file_name) { xml_node *root, *nd, *ndnd, *ndndnd; root = XML_Make_Node("phyrex"); XML_Init_Node(NULL, root, "phyrex"); root->attr = XML_Make_Attribute(NULL, "run.id", run_id); XML_Add_Attribute(root, "output.file", out_file_name); XML_Add_Attribute(root, "mcmc.chain.len", "2E+8"); XML_Add_Attribute(root, "mcmc.sample.every", "1E+4"); XML_Add_Attribute(root, "mcmc.print.every", "1E+4"); XML_Add_Attribute(root, "mcmc.burnin", "1E+6"); XML_Add_Attribute(root, "mutmap", "no"); XML_Add_Attribute(root, "ignore.sequences", "no"); XML_Add_Attribute(root, "mcmc.output.trees", "yes"); nd = XML_Add_Node(root, "spatialmodel"); nd->attr = XML_Make_Attribute(NULL, "name", "ibm"); XML_Add_Attribute(nd, "rw.prior.distrib", "flat"); XML_Add_Attribute(nd, "rw.prior.mean", "1."); XML_Add_Attribute(nd, "sampling", "detection"); XML_Add_Attribute(nd, "integrateAncestralLocations", "true"); XML_Add_Attribute(nd, "distance.type", "greatcircle"); XML_Add_Attribute(nd, "observational.model", "yes"); nd = XML_Add_Node(root, "lineagerates"); nd->attr = XML_Make_Attribute(NULL, "model", "lognormal"); XML_Add_Attribute(nd, "autocor.prior.rate", "100"); nd = XML_Add_Node(root, "treegenerating"); nd->attr = XML_Make_Attribute(NULL, "model", "coalescent"); XML_Add_Attribute(nd, "neff.prior.distrib", "flat"); XML_Add_Attribute(nd, "fix.node.ages", "no"); nd = XML_Add_Node(root, "clockrate"); nd->attr = XML_Make_Attribute(NULL, "prior.mean", "0.00058"); XML_Add_Attribute(nd, "prior.var", "1.E-2"); nd = XML_Add_Node(root, "topology"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "T1"); XML_Add_Attribute(ndnd, "init.tree", "BioNJ"); nd = XML_Add_Node(root, "ratematrices"); nd->attr = XML_Make_Attribute(NULL, "id", "RM1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "M1"); XML_Add_Attribute(ndnd, "model", "HKY85"); XML_Add_Attribute(ndnd, "optimise.tstv", "yes"); nd = XML_Add_Node(root, "siterates"); nd->attr = XML_Make_Attribute(NULL, "id", "SR1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "R1"); XML_Add_Attribute(ndnd, "init.value", "1.0"); ndnd = XML_Add_Node(nd, "weights"); ndnd->attr = XML_Make_Attribute(NULL, "id", "D1"); XML_Add_Attribute(ndnd, "family", "freerates"); ndndnd = XML_Add_Node(ndnd, "instance"); ndndnd->attr = XML_Make_Attribute(NULL, "appliesto", "R1"); XML_Add_Attribute(ndndnd, "value", "0.25"); nd = XML_Add_Node(root, "equfreqs"); nd->attr = XML_Make_Attribute(NULL, "id", "EF1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "F1"); XML_Add_Attribute(ndnd, "optimise.freqs", "no"); nd = XML_Add_Node(root, "branchlengths"); nd->attr = XML_Make_Attribute(NULL, "id", "BL1"); ndnd = XML_Add_Node(nd, "instance"); ndnd->attr = XML_Make_Attribute(NULL, "id", "L1"); XML_Add_Attribute(ndnd, "optimise.lens", "yes"); nd = XML_Add_Node(root, "partitionelem"); nd->attr = XML_Make_Attribute(NULL, "id", "partition1"); XML_Add_Attribute(nd, "file.name", seq_file_name); XML_Add_Attribute(nd, "data.type", "nt"); XML_Add_Attribute(nd, "interleaved", "no"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "T1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "M1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "F1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "R1"); ndnd = XML_Add_Node(nd, "mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL, "list", "L1"); nd = XML_Add_Node(root, "coordinates"); nd->attr = XML_Make_Attribute(NULL, "id", "coordinates"); XML_Add_Attribute(nd, "file.name", coord_file_name); return (root); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Print_Trace(void) { void *array[10]; char **strings; int size, i; size = backtrace(array, 10); strings = backtrace_symbols(array, size); if (strings != NULL) { PhyML_Printf("\n\n. Obtained %d stack frames.\n", size); for (i = 0; i < size; ++i) PhyML_Printf("\n. %s", strings[i]); Free(strings); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ stephaneguindon-phyml-76a39c8/src/io.h000066400000000000000000000134451501136442400177600ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef IO_H #define IO_H #include "utilities.h" t_tree *Read_Tree(char **s_tree); void R_rtree(char *s_tree_a,char *s_tree_d,t_node *a,t_tree *tree,int *n_int,int *n_ext); void Read_Node_Label(char *s_d, char *s_a, t_node *n); void Read_Branch_Length(char *s_d, char *s_a, t_edge *b, t_tree *tree); void Read_Node_Name(char *s_tree_d, char *s_tree_a, t_node *d, t_tree *tree); void Clean_Multifurcation(char **subtrees,int current_deg,int end_deg); char **Sub_Trees(char *tree,int *degree); int Next_Matching_Char(char *s, char o, char c,int pos); void Print_List(t_ll *list); void Print_Tree(FILE *fp,t_tree *tree); char *Write_Tree(t_tree *tree); void R_wtree_Custom(t_node *pere,t_node *fils,int *available,char **s_tree,int *pos,t_tree *tree); void Detect_Align_File_Format(option *io); void Detect_Tree_File_Format(option *io); align **Get_Seq(option *io); void Get_Nexus_Data(option *io); int Get_Token(FILE *fp,char *token); align **Get_Seq_Phylip(option *io); void Read_Ntax_Len_Phylip(FILE *fp,int *n_otu,int *n_tax); align **Read_Seq_Sequential(option *io); align **Read_Seq_Interleaved(option *io); int Read_One_Line_Seq(align ***data,int num_otu,FILE *in); char *Return_Tree_String_Phylip(FILE *fp_input_tree); t_tree *Read_Tree_File_Phylip(FILE *fp_input_tree); void Print_Site_Lk(t_tree *tree,FILE *fp); void Print_Seq(FILE *fp, align **data, int n_otu); void Print_CSeq(FILE *fp,int compressed,calign *cdata,t_tree *tree); void Print_CSeq_Select(FILE *fp,int compressed,calign *cdata,t_tree *tree); void Print_Dist(matrix *mat); void Print_Node(t_node *a,t_node *d,t_tree *tree); void Print_Model(t_mod *mod); void Print_Mat(matrix *mat); FILE *Openfile(char *filename,int mode); //void Print_Fp_Out(FILE *fp_out,time_t t_beg,time_t t_end,t_tree *tree,option *io,int n_data_set,int num_tree, int add_citation); void Print_Fp_Out(FILE *fp_out,time_t t_beg,time_t t_end,t_tree *tree,option *io,int n_data_set,int num_tree, int add_citation, int precision); void Print_Fp_Out_Lines(FILE *fp_out,time_t t_beg,time_t t_end,t_tree *tree,option *io,int n_data_set); void Print_Freq(t_tree *tree); void Print_Settings(option *io); void Print_Banner(FILE *fp); void Print_Banner_Small(FILE *fp); void Print_Data_Set_Number(option *io,FILE *fp); void Print_Lk(t_tree *tree,char *string); void Print_Pars(t_tree *tree); void Print_Lk_And_Pars(t_tree *tree); void Read_Qmat(phydbl *daa,phydbl *pi,FILE *fp); void Print_Qmat_AA(phydbl *daa,phydbl *pi); void Print_Square_Matrix_Generic(int n,phydbl *mat); void Print_Diversity(FILE *fp,t_tree *tree); void Print_Diversity_Pre(t_node *a,t_node *d,t_edge *b,FILE *fp,t_tree *tree); t_tree *Read_User_Tree(calign *cdata,t_mod *mod,option *io); void Print_Time_Info(time_t t_beg,time_t t_end); void Print_Time_Info_Brief(time_t t_beg,time_t t_end); void PhyML_Printf(char *format,...); void PhyML_Fprintf(FILE *fp,char *format,...); void Read_Clade_Priors(char *file_name,t_tree *tree); option *Get_Input(int argc,char **argv); void Print_Data_Structure(int final, FILE *fp, t_tree *root); int Set_Whichmodel(int select); void Print_Site(calign *cdata, int num, int n_otu, char *sep, int stepsize, FILE *fp); option *PhyML_XML(char *xml_filename); void Check_Taxa_Sets(t_tree *mixt_tree); void Make_Ratematrix_From_XML_Node(xml_node *instance, option *io, t_mod *mod); void Make_Efrq_From_XML_Node(xml_node *instance, option *io, t_mod *mod); void Make_Topology_From_XML_Node(xml_node *instance, option *io, t_mod *mod); void Make_RAS_From_XML_Node(xml_node *parent, t_mod *mod); void Post_Process_Data(option *io); int *Return_Int(int in); void Print_All_Edge_PMats(t_tree* tree); void Print_All_Edge_Likelihoods(t_tree* tree); void Print_Edge_Likelihoods(t_tree* tree, t_edge* b, bool scientific); void Print_Edge_PMats(t_tree* tree, t_edge* b); void Print_Tip_Partials(t_tree* tree, t_node* d); void Dump_Arr_D(phydbl* arr, int num); void Dump_Arr_S(short int* arr, int num); void Dump_Arr_I(int* arr, int num); void Print_Tree_Structure(t_tree* tree); void Print_Node_Brief(t_node *a, t_node *d, t_tree *tree, FILE *fp); void Generic_Exit(const char *file, int line, const char *function); void JSON_Write_Object(json_o *obj, FILE *where); void JSON_Write_Array(json_a *array, FILE *where); void JSON_Write_All(json_a *array, FILE *where); void JSON_Tree_Io(t_tree *tree, FILE *where); json_o *JSON_Tree_To_Object(t_tree *tree); json_o *JSON_Tree_To_Object_Light(t_tree *mixt_tree); scalar_dbl *Read_Io_Weights(option *io); void Print_Lk_Given_Edge_Recurr(t_node *a, t_node *d, t_edge *b, t_tree *tree); void R_wtree(t_node *pere, t_node *fils, t_edge *b, int *available, char **s_tree, t_tree *tree); void Read_Branch_Support(char *s_d, char *s_a, t_edge *b, t_tree *tree); void Collect_Edge_Support_Values(t_tree *tree); int PhyML_Fscanf(FILE *fp, char *format, ...); void Output_Scalar_Dbl(scalar_dbl *t, char *sep, FILE *fp); t_label *Read_Labels(char *s); void Print_Labels(FILE *fp_where, char *s_where, t_label *label); void Read_Edge_Label(char *s_d, char *s_a, t_edge *b); xml_node *Generate_PhyREX_XMLObj(char *run_id, char *out_file_name, char *seq_file_name, char *coord_file_name); void PHYREX_Print_MultiTypeTree_Config_File(int n_sites, char *filename, t_tree *tree); void PHYREX_Print_MCMC_Tree(t_tree *tree); void PHYREX_Print_MCMC_Stats(t_tree *tree); void PHYREX_Print_MCMC_Summary(t_tree *tree); void PHYREX_Output_Tree_Structure(FILE *fp, t_tree *tree); void PHYREX_Input_Tree_Structure(FILE *fp); char *PHYREX_Print_Tree_Structure(t_tree *tree); void PHYREX_Check_Point(FILE *fp, t_tree *tree); void Print_Trace(void); #endif stephaneguindon-phyml-76a39c8/src/iou.c000066400000000000000000000151151501136442400201340ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "iou.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// short int IOU_Is_Iou(t_phyrex_mod *mod) { if(mod->model_id == IOU) return(YES); return(NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Mean velocity at the end of an edge, given the velocity at the start of it */ phydbl IOU_Velocity_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl y0,t,ta,mu; assert(d != tree->n_root); y0 = d->anc->ldsk->veloc->deriv[dim]; t = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num]); ta = tree->mmod->ou_theta; mu = tree->mmod->ou_mu[dim]; return(y0*exp(-ta*t)+mu*(1.-exp(-ta*t))); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Variance of velocity at the end of an edge, given the velocity at the start of it */ phydbl IOU_Velocity_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl var,t,sg2,ta; assert(d != tree->n_root); /* t = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num]); */ /* sg = tree->mmod->sigsq[dim]; */ /* ta = tree->mmod->ou_theta; */ /* var = sg/(2.*ta)*(1.-exp(-2.*ta*t)); */ t = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num]); sg2 = tree->mmod->sigsq[dim] * tree->mmod->sigsq_scale[d->num] * tree->mmod->sigsq_scale_norm_fact; ta = tree->mmod->ou_theta; var = sg2 /(2.*ta) * (1. - exp(-2.*ta*t)); if(var < 0.0) var = 0.0; if(isinf(var) || isnan(var)) { PhyML_Printf("\n. ta: %f t: %f sg2: %f sinh: %f",ta,t,sg2,sinh(ta*t)); } // PhyML_Printf("\n. t: %f ta: %f sg2: %f var: %f",t,ta,sg2,var); assert(isnan(var) == NO); assert(isinf(var) == NO); return(var); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Mean of location at the end of the edge, given velocities at both extremities */ phydbl IOU_Location_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl t,x0,y0,yt,mean,ta,mu; assert(d != tree->n_root); t = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num]); if(t < SMALL) return(d->anc->ldsk->coord->lonlat[dim]); x0 = d->anc->ldsk->coord->lonlat[dim]; y0 = d->anc->ldsk->veloc->deriv[dim]; yt = d->ldsk->veloc->deriv[dim]; ta = tree->mmod->ou_theta; mu = tree->mmod->ou_mu[dim]; mean = /* x0 + (cosh(ta*t)-1.)/(sinh(ta*t)*ta)*(yt+y0) + */ /* mu*t - (mu/ta)*(1.-exp(-ta*t))*(1.+(cosh(ta*t)-1.)/sinh(ta*t)); */ x0 + (1./tanh(ta*t) - 1./sinh(ta*t))*(yt+y0)/ta + mu*t - (mu/ta)*(1.-exp(-ta*t))*(1.+1./tanh(ta*t)-1./sinh(ta*t)); /* PhyML_Printf("\n. t: %f x0: %f y0: %f yt: %f ta: %f mu: %f cosh: %f sinh: %f", */ /* t,x0,y0,yt,ta,mu,cosh(ta*t),sinh(ta*t)); */ assert(isnan(mean) == NO); return(mean); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Variance of location at the end of the edge, given velocities at both extremities */ phydbl IOU_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl var,t,ta,sg2; assert(d != tree->n_root); t = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num]); ta = tree->mmod->ou_theta; sg2 = tree->mmod->sigsq[dim] * tree->mmod->sigsq_scale[d->num] * tree->mmod->sigsq_scale_norm_fact; if(t < SMALL) return(0.0); // var = sg/pow(ta,3)*(ta*t-2.*(cosh(ta*t)-1.)/sinh(ta*t)); var = sg2/pow(ta,3)*(ta*t-2.*(1./tanh(ta*t) - 1./sinh(ta*t))); if(var > sg2*pow(t,3)/12) var = sg2*pow(t,3)/12; if(var < 0.0) var = 0.0; assert(isnan(var) == NO); return(var); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IOU_Prior(t_tree *tree) { tree->mmod->c_lnP = IOU_Prior_Theta(tree) + IOU_Prior_Mu(tree) + RW_Prior(tree); return(tree->mmod->c_lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IOU_Prior_Theta(t_tree *tree) { phydbl lbda,lnP; lnP = 0.0; lbda = 1.0E+2; lnP += Log_Dexp(tree->mmod->ou_theta,lbda); return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IOU_Prior_Mu(t_tree *tree) { phydbl lbda,lnP; lnP = 0.0; lbda = 1.0E+0; for (int i = 0; i < tree->mmod->n_dim; i++) lnP += Log_Dexp(tree->mmod->ou_mu[i], lbda); return (lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IOU_Integrated_Location_Down(phydbl son_a, phydbl son_b, phydbl son_mu_down, phydbl son_var_down, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl son_logrem, phydbl bro_logrem, phydbl *mean, phydbl *var, phydbl *logrem) { RW_Integrated_Lk_Down(son_a, son_b, son_mu_down, son_var_down, son_var, bro_a, bro_b, bro_mu_down, bro_var_down, bro_var, son_logrem, bro_logrem, mean, var, logrem); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IOU_Integrated_Location_Up(phydbl dad_mu_up, phydbl dad_var_up, phydbl dad_logrem_up, phydbl son_a, phydbl son_b, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl bro_logrem_down, phydbl *mean, phydbl *var, phydbl *logrem) { RW_Integrated_Lk_Up(dad_mu_up, dad_var_up, dad_logrem_up, son_a, son_b, son_var, bro_a, bro_b, bro_mu_down, bro_var_down, bro_var, bro_logrem_down, mean, var, logrem); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/iou.h000066400000000000000000000031651501136442400201430ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef IOU_H #define IOU_H #include "utilities.h" short int IOU_Is_Iou(t_phyrex_mod *mod); phydbl IOU_Velocity_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IOU_Velocity_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IOU_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IOU_Location_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IOU_Prior(t_tree *tree); phydbl IOU_Prior_Theta(t_tree *tree); phydbl IOU_Prior_Mu(t_tree *tree); void IOU_Integrated_Location_Down(phydbl son_a, phydbl son_b, phydbl son_mu_down, phydbl son_var_down, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl son_logrem, phydbl bro_logrem, phydbl *mean, phydbl *var, phydbl *logrem); void IOU_Integrated_Location_Up(phydbl dad_mu_up, phydbl dad_var_up, phydbl dad_logrem_up, phydbl son_a, phydbl son_b, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl bro_logrem_down, phydbl *mean, phydbl *var, phydbl *logrem); #endif stephaneguindon-phyml-76a39c8/src/iwn.c000066400000000000000000000221441501136442400201350ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "iwn.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// short int IWN_Is_Iwn(t_phyrex_mod *mod) { if(mod->model_id == IWNc || mod->model_id == RIWNc || mod->model_id == IWNu || mod->model_id == RIWNu) return(YES); return(NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IWN_Velocity_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree) { assert(d != tree->n_root); return(d->anc->ldsk->veloc->deriv[dim]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IWN_Velocity_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl logvar,dt; assert(d != tree->n_root); dt = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num]); /* PhyML_Printf("\n. omega: %12f dt: %12f omega > dt: %3d", */ /* tree->mmod->omega, */ /* dt, */ /* !(tree->mmod->omega < dt)); */ if(!(tree->mmod->omega < dt)) { return(0.0); } else { logvar = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[d->num]) + log(tree->mmod->sigsq_scale_norm_fact); return(exp(logvar)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IWN_Location_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl dt, loc_beg, veloc_beg, veloc_end, epst; int gt; assert(d != tree->n_root); dt = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num]); loc_beg = d->anc->ldsk->coord->lonlat[dim]; veloc_beg = d->anc->ldsk->veloc->deriv[dim]; veloc_end = d->ldsk->veloc->deriv[dim]; if(!(tree->mmod->omega < dt)) { return(loc_beg + veloc_beg*dt); } else { gt = IWN_Get_Gt(dt,tree->mmod->omega); epst = dt-gt*tree->mmod->omega; return(loc_beg + veloc_beg*tree->mmod->omega + .5*dt*(veloc_beg + veloc_end) + veloc_end*epst); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Variance of location at the end of the edge, given velocities at both extremities */ phydbl IWN_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl logvar,dt; int gt; assert(d != tree->n_root); dt = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[d->anc->num]); if(!(tree->mmod->omega < dt)) { return(0.0); } else { gt = IWN_Get_Gt(dt,tree->mmod->omega); logvar = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[d->num]) + log(tree->mmod->sigsq_scale_norm_fact) + 2.*log(tree->mmod->omega) + log(gt-1.)+ log((gt-1.)/4. + 1.); return(exp(logvar)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int IWN_Get_Gt(phydbl t, phydbl omega) { /* int gt; */ /* gt = 0; */ /* while(!(gt*omega > t)) { gt++; } */ /* return(gt-1); */ return((int)(t/omega)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IWN_Prior(t_tree *tree) { tree->mmod->c_lnP = IWN_Prior_Omega(tree) + RW_Prior_Sigsq(tree); return(tree->mmod->c_lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IWN_Prior_Omega(t_tree *tree) { phydbl lbda,lnP; lbda = 1.0; lnP = log(lbda)-lbda*tree->mmod->omega; return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IWN_Integrated_Location_Down(phydbl dt1, phydbl dt2, phydbl av1, phydbl bv1, phydbl v1mu, phydbl v1var, phydbl dv1var, phydbl av2, phydbl bv2, phydbl v2mu, phydbl v2var, phydbl dv2var, phydbl v1logrem, phydbl v2logrem, phydbl veloc_d, phydbl veloc_v1, phydbl veloc_v2, phydbl omega, phydbl *mean, phydbl *var, phydbl *logrem) { phydbl m,v,logr,epst; int err; err = 0; m = epst = -1.; v = 0.0; logr = 0.0; if(dv1var + v1var > SMALL && dv2var + v2var > SMALL) // Standard case { v = pow(av1,2)/(v1var + dv1var) + pow(av2,2)/(v2var + dv2var); v = 1/v; m = (av1*(v1mu-bv1)/(v1var + dv1var) + av2*(v2mu-bv2)/(v2var + dv2var)) * v; logr = v1logrem + v2logrem; logr -= log(fabs(av2*av1)); logr += Log_Dnorm((v1mu-bv1)/av1,(v2mu-bv2)/av2,sqrt((v1var+dv1var)/pow(av1,2)+(v2var+dv2var)/pow(av2,2)),&err); } else if(dv1var + v1var > SMALL) // Null variance along d - v2 { assert(dt2 < 2.*omega); epst = dt2 - omega; if(epst > .0) m = v2mu + omega * veloc_v2 + epst * veloc_d; else m = v2mu + omega * veloc_v2; } else if(dv2var + v2var > SMALL) // Null variance along d - v1 { assert(dt1 < 2.*omega); epst = dt1 - omega; if(epst > .0) m = v1mu + omega * veloc_v1 + epst * veloc_d; else m = v1mu + omega * veloc_v1; } else // Null variance along d - v1 and d - v2 { phydbl m1; epst = dt1 - omega; if(epst > .0) m1 = v1mu + omega * veloc_v1 + epst * veloc_d; else m1 = v1mu + omega * veloc_v1; /* PhyML_Printf("\n. dt1: %12f dt2: %12f v1mu: %12f v2mu: %12f veloc_v1: %12f veloc_v2: %12f veloc_d: %12f epst1: %12f epst2: %12f", */ /* dt1,dt2, */ /* v1mu,v2mu, */ /* veloc_v1,veloc_v2,veloc_d, */ /* dt1 - omega, */ /* dt2 - omega); */ /* PhyML_Printf("\n. m1=%f m2=%f",m1,m2); */ /* assert(fabs(m1 - m2) < 1.E-10); */ m = m1; } *mean = m; *var = v; *logrem = logr; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void IWN_Integrated_Location_Up(phydbl dt1, phydbl dt2, phydbl av1, phydbl bv1, phydbl v1mu, phydbl v1var, phydbl av1var, phydbl av2, phydbl bv2, phydbl v2mu, phydbl v2var, phydbl av2var, phydbl v1logrem, phydbl v2logrem, phydbl veloc_a, phydbl veloc_v1, phydbl veloc_v2, phydbl omega, phydbl *mean, phydbl *var, phydbl *logrem, short int a_is_root) { phydbl m,v,logr,epst; int err; v = logr = 0.0; err = 0; if(a_is_root == NO) { if(pow(av1,2)*v1var+av1var > SMALL && av2var + v2var > SMALL) // Standard case { v = pow(av2,2)/(v2var + av2var) + 1./(pow(av1,2)*v1var+av1var); v = 1./v; m = (av2*(v2mu-bv2)/(v2var + av2var) + (av1*v1mu+bv1)/(pow(av1,2)*v1var+av1var)) * v; logr = v1logrem + v2logrem; logr -= log(fabs(av2)); logr += Log_Dnorm((v2mu-bv2)/av2,av1*v1mu+bv1,sqrt((v2var+av2var)/pow(av2,2)+pow(av1,2)*v1var+av1var),&err); } else if(pow(av1,2)*v1var+av1var > SMALL) // Null variance along d - v2 { assert(dt2 < 2.*omega); epst = dt2 - omega; if(epst > .0) m = v2mu + omega * veloc_v2 + epst * veloc_a; else m = v2mu + omega * veloc_v2; } else if(av2var + v2var > SMALL) // Null variance along d - v1 { assert(dt1 < 2.*omega); epst = dt1 - omega; if(epst > .0) m = v1mu + omega * veloc_a + epst * veloc_v1; else m = v1mu + omega * veloc_v1; } else { phydbl m1; epst = dt1 - omega; if(epst > .0) m1 = v1mu + omega * veloc_a + epst * veloc_v1; else m1 = v1mu + omega * veloc_v1; m = m1; } } else { if(v2var + av2var > SMALL) { m = (v2mu-bv2)/av2; v = (v2var + av2var)/pow(av2,2); logr = v2logrem; logr -= log(fabs(av2)); } else { assert(dt2 < 2.*omega); epst = dt2 - omega; if(epst > .0) m = v2mu + omega * veloc_v2 + epst * veloc_a; else m = v2mu + omega * veloc_v2; } } *mean = m; *var = v; *logrem = logr; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/iwn.h000066400000000000000000000036551501136442400201500ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef IWN_H #define IWN_H #include "utilities.h" short int IWN_Is_Iwn(t_phyrex_mod *mod); int IWN_Get_Gt(phydbl t, phydbl omega); phydbl IWN_Velocity_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IWN_Velocity_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IWN_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IWN_Location_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl IWN_Prior(t_tree *tree); phydbl IWN_Prior_Omega(t_tree *tree); void IWN_Integrated_Location_Down(phydbl dt1, phydbl dt2, phydbl av1, phydbl bv1, phydbl v1mu, phydbl v1var, phydbl dv1var, phydbl av2, phydbl bv2, phydbl v2mu, phydbl v2var, phydbl dv2var, phydbl v1logrem, phydbl v2logrem, phydbl veloc_d, phydbl veloc_v1, phydbl veloc_v2, phydbl omega, phydbl *mean, phydbl *var, phydbl *logrem); void IWN_Integrated_Location_Up(phydbl dt1, phydbl dt2, phydbl av1, phydbl bv1, phydbl v1mu, phydbl v1var, phydbl av1var, phydbl av2, phydbl bv2, phydbl v2mu, phydbl v2var, phydbl av2var, phydbl v1logrem, phydbl v2logrem, phydbl veloc_a, phydbl veloc_v1, phydbl veloc_v2, phydbl omega, phydbl *mean, phydbl *var, phydbl *logrem, short int a_is_root); #endif stephaneguindon-phyml-76a39c8/src/lk.c000066400000000000000000003263511501136442400177550ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "assert.h" #include "lk.h" #ifdef BEAGLE #include "beagle_utils.h" #endif #include ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_Nucleotides_Float(char state, int pos, phydbl *p_lk) { switch(state) { case 'A' : p_lk[pos+0]=1.; p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+3]=.0; break; case 'C' : p_lk[pos+1]=1.; p_lk[pos+0]=p_lk[pos+2]=p_lk[pos+3]=.0; break; case 'G' : p_lk[pos+2]=1.; p_lk[pos+1]=p_lk[pos+0]=p_lk[pos+3]=.0; break; case 'T' : p_lk[pos+3]=1.; p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+0]=.0; break; case 'U' : p_lk[pos+3]=1.; p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+0]=.0; break; case 'M' : p_lk[pos+0]=p_lk[pos+1]=1.; p_lk[pos+2]=p_lk[pos+3]=.0; break; case 'R' : p_lk[pos+0]=p_lk[pos+2]=1.; p_lk[pos+1]=p_lk[pos+3]=.0; break; case 'W' : p_lk[pos+0]=p_lk[pos+3]=1.; p_lk[pos+1]=p_lk[pos+2]=.0; break; case 'S' : p_lk[pos+1]=p_lk[pos+2]=1.; p_lk[pos+0]=p_lk[pos+3]=.0; break; case 'Y' : p_lk[pos+1]=p_lk[pos+3]=1.; p_lk[pos+0]=p_lk[pos+2]=.0; break; case 'K' : p_lk[pos+2]=p_lk[pos+3]=1.; p_lk[pos+0]=p_lk[pos+1]=.0; break; case 'B' : p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+3]=1.; p_lk[pos+0]=.0; break; case 'D' : p_lk[pos+0]=p_lk[pos+2]=p_lk[pos+3]=1.; p_lk[pos+1]=.0; break; case 'H' : p_lk[pos+0]=p_lk[pos+1]=p_lk[pos+3]=1.; p_lk[pos+2]=.0; break; case 'V' : p_lk[pos+0]=p_lk[pos+1]=p_lk[pos+2]=1.; p_lk[pos+3]=.0; break; case 'N' : case 'X' : case '?' : case 'O' : case '-' : p_lk[pos+0]=p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+3]=1.;break; default : { PhyML_Fprintf(stderr,"\n. Unknown character state : '%c' at position %d.\n",state,pos); assert(false); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_Nucleotides_Int(char state, int pos, short int *p_pars) { switch(state) { case 'A' : p_pars[pos+0]=1; p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+3]=0; break; case 'C' : p_pars[pos+1]=1; p_pars[pos+0]=p_pars[pos+2]=p_pars[pos+3]=0; break; case 'G' : p_pars[pos+2]=1; p_pars[pos+1]=p_pars[pos+0]=p_pars[pos+3]=0; break; case 'T' : p_pars[pos+3]=1; p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+0]=0; break; case 'U' : p_pars[pos+3]=1; p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+0]=0; break; case 'M' : p_pars[pos+0]=p_pars[pos+1]=1; p_pars[pos+2]=p_pars[pos+3]=0; break; case 'R' : p_pars[pos+0]=p_pars[pos+2]=1; p_pars[pos+1]=p_pars[pos+3]=0; break; case 'W' : p_pars[pos+0]=p_pars[pos+3]=1; p_pars[pos+1]=p_pars[pos+2]=0; break; case 'S' : p_pars[pos+1]=p_pars[pos+2]=1; p_pars[pos+0]=p_pars[pos+3]=0; break; case 'Y' : p_pars[pos+1]=p_pars[pos+3]=1; p_pars[pos+0]=p_pars[pos+2]=0; break; case 'K' : p_pars[pos+2]=p_pars[pos+3]=1; p_pars[pos+0]=p_pars[pos+1]=0; break; case 'B' : p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+3]=1; p_pars[pos+0]=0; break; case 'D' : p_pars[pos+0]=p_pars[pos+2]=p_pars[pos+3]=1; p_pars[pos+1]=0; break; case 'H' : p_pars[pos+0]=p_pars[pos+1]=p_pars[pos+3]=1; p_pars[pos+2]=0; break; case 'V' : p_pars[pos+0]=p_pars[pos+1]=p_pars[pos+2]=1; p_pars[pos+3]=0; break; case 'N' : case 'X' : case '?' : case 'O' : case '-' : p_pars[pos+0]=p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+3]=1;break; default : { PhyML_Fprintf(stderr,"\n. Unknown character state : '%c'.\n",state); assert(false); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_AA_Float(char aa, int pos, phydbl *p_lk) { int i; for(i=0;i<20;i++) p_lk[pos+i] = .0; switch(aa){ case 'A' : p_lk[pos+0]= 1.; break;/* Alanine */ case 'R' : p_lk[pos+1]= 1.; break;/* Arginine */ case 'N' : p_lk[pos+2]= 1.; break;/* Asparagine */ case 'D' : p_lk[pos+3]= 1.; break;/* Aspartic acid */ case 'C' : p_lk[pos+4]= 1.; break;/* Cysteine */ case 'Q' : p_lk[pos+5]= 1.; break;/* Glutamine */ case 'E' : p_lk[pos+6]= 1.; break;/* Glutamic acid */ case 'G' : p_lk[pos+7]= 1.; break;/* Glycine */ case 'H' : p_lk[pos+8]= 1.; break;/* Histidine */ case 'I' : p_lk[pos+9]= 1.; break;/* Isoleucine */ case 'L' : p_lk[pos+10]=1.; break;/* Leucine */ case 'K' : p_lk[pos+11]=1.; break;/* Lysine */ case 'M' : p_lk[pos+12]=1.; break;/* Methionine */ case 'F' : p_lk[pos+13]=1.; break;/* Phenylalanin */ case 'P' : p_lk[pos+14]=1.; break;/* Proline */ case 'S' : p_lk[pos+15]=1.; break;/* Serine */ case 'T' : p_lk[pos+16]=1.; break;/* Threonine */ case 'W' : p_lk[pos+17]=1.; break;/* Tryptophan */ case 'Y' : p_lk[pos+18]=1.; break;/* Tyrosine */ case 'V' : p_lk[pos+19]=1.; break;/* Valine */ case 'B' : p_lk[pos+2]= 1.; break;/* Asparagine */ case 'Z' : p_lk[pos+5]= 1.; break;/* Glutamine */ case 'X' : case '?' : case '-' : for(i=0;i<20;i++) p_lk[pos+i] = 1.; break; default : { PhyML_Fprintf(stderr,"\n. Unknown character state : '%c'.\n",aa); Exit("\n. Init failed (data type supposed to be amino-acids)\n"); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_AA_Int(char aa, int pos, short int *p_pars) { int i; for(i=0;i<20;i++) p_pars[pos+i] = .0; switch(aa){ case 'A' : p_pars[pos+0] = 1; break;/* Alanine */ case 'R' : p_pars[pos+1] = 1; break;/* Arginine */ case 'N' : p_pars[pos+2] = 1; break;/* Asparagine */ case 'D' : p_pars[pos+3] = 1; break;/* Aspartic acid */ case 'C' : p_pars[pos+4] = 1; break;/* Cysteine */ case 'Q' : p_pars[pos+5] = 1; break;/* Glutamine */ case 'E' : p_pars[pos+6] = 1; break;/* Glutamic acid */ case 'G' : p_pars[pos+7] = 1; break;/* Glycine */ case 'H' : p_pars[pos+8] = 1; break;/* Histidine */ case 'I' : p_pars[pos+9] = 1; break;/* Isoleucine */ case 'L' : p_pars[pos+10] = 1; break;/* Leucine */ case 'K' : p_pars[pos+11] = 1; break;/* Lysine */ case 'M' : p_pars[pos+12] = 1; break;/* Methionine */ case 'F' : p_pars[pos+13] = 1; break;/* Phenylalanin */ case 'P' : p_pars[pos+14] = 1; break;/* Proline */ case 'S' : p_pars[pos+15] = 1; break;/* Serine */ case 'T' : p_pars[pos+16] = 1; break;/* Threonine */ case 'W' : p_pars[pos+17] = 1; break;/* Tryptophan */ case 'Y' : p_pars[pos+18] = 1; break;/* Tyrosine */ case 'V' : p_pars[pos+19] = 1; break;/* Valine */ case 'B' : p_pars[pos+2] = 1; break;/* Asparagine */ case 'Z' : p_pars[pos+5] = 1; break;/* Glutamine */ case 'X' : case '?' : case '-' : for(i=0;i<20;i++) p_pars[pos+i] = 1; break; default : { PhyML_Fprintf(stderr,"\n. Unknown character state : '%c'.\n",aa); Exit("\n. Init failed (data type supposed to be amino-acids)\n"); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_Generic_Float(char *state, int ns, int state_len, int pos, phydbl *p_lk) { int i; int state_int; for(i=0;i ns) { PhyML_Fprintf(stderr,"\n. %s %d cstate: %.2s istate: %d state_len: %d.\n",__FILE__,__LINE__,state,state_int,state_len); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit(""); } p_lk[pos+state_int] = 1.; /* PhyML_Printf("\n. %s %d cstate: %.2s istate: %d state_len: %d ns: %d pos: %d",__FILE__,__LINE__,state,state_int,state_len,ns,pos); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_Generic_Int(char *state, int ns, int state_len, int pos, short int *p_pars) { int i; int state_int; for(i=0;i ns) { PhyML_Fprintf(stderr,"\n. %s %d cstate: %.2s istate: %d state_len: %d.\n",__FILE__,__LINE__,state,state_int,state_len); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit(""); } p_pars[pos+state_int] = 1; /* PhyML_Printf("\n* %s %d cstate: %.2s istate: %d state_len: %d ns: %d pos: %d",__FILE__,__LINE__,state,state_int,state_len,ns,pos); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_All_Partial_Lk_Scale(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d) { Update_Partial_Lk(tree,b_fcus,d); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Post_Order_Lk(t_node *a, t_node *d, t_tree *tree) { int i,dir; dir = -1; if(d->tax) return; else { if(tree->is_mixt_tree) { MIXT_Post_Order_Lk(a,d,tree); return; } if(tree->n_root != NULL) { for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Post_Order_Lk(d,d->v[i],tree); else dir = i; } } else { for(i=0;i<3;i++) { if(d->v[i] != a) Post_Order_Lk(d,d->v[i],tree); else dir = i; } } if(dir < 0) { PhyML_Printf("\n. a->num: %d d->num: %d d->v[0]->num: %d d->v[1]->num: %d d->v[2]->num: %d d->b[0]->num: %d d->b[1]->num: %d d->b[2]->num: %d root ? %d e_root ? %d\n", a?a->num:-1, d?d->num:1, d->v[0]?d->v[0]->num:-1, d->v[1]?d->v[1]->num:-1, d->v[2]?d->v[2]->num:-1, d->b[0]?d->b[0]->num:-1, d->b[1]?d->b[1]->num:-1, d->b[2]?d->b[2]->num:-1, tree->n_root?tree->n_root->num:-1, tree->e_root?tree->e_root->num:-1); assert(FALSE); } /* PhyML_Printf("\n. a:%d [%d] d:%d dir:%d [%p %p] [%p %p %p] [%p %p]", */ /* a->num, */ /* a == tree->n_root, */ /* d->num, */ /* dir, */ /* d->b[dir], */ /* tree->e_root, */ /* d->b[0],d->b[1],d->b[2], */ /* tree->n_root->b[1],tree->n_root->b[2]); */ if(tree->ignore_root == NO && d->b[dir] == tree->e_root) { if(d == tree->n_root->v[1]) Update_Partial_Lk(tree,tree->n_root->b[1],d); else Update_Partial_Lk(tree,tree->n_root->b[2],d); } else { Update_Partial_Lk(tree,d->b[dir],d); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Pre_Order_Lk(t_node *a, t_node *d, t_tree *tree) { int i; if(d->tax) return; else { if(tree->is_mixt_tree) { MIXT_Pre_Order_Lk(a,d,tree); return; } if(tree->n_root) { for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { Update_Partial_Lk(tree,d->b[i],d); Pre_Order_Lk(d,d->v[i],tree); } } } else { for(i=0;i<3;++i) { if(d->v[i] != a) { Update_Partial_Lk(tree,d->b[i],d); Pre_Order_Lk(d,d->v[i],tree); } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Updates all partial likelihood vectors. Depending on whether // both_sides = YES or NO, only 'up' or 'up'&'down' partials will // be updates void Update_All_Partial_Lk(t_tree *tree) { if(tree->n_root) { if(tree->ignore_root == NO) { Post_Order_Lk(tree->n_root,tree->n_root->v[1],tree); Post_Order_Lk(tree->n_root,tree->n_root->v[2],tree); Update_Partial_Lk(tree,tree->n_root->b[1],tree->n_root); Update_Partial_Lk(tree,tree->n_root->b[2],tree->n_root); if(tree->both_sides == YES) { Pre_Order_Lk(tree->n_root,tree->n_root->v[2],tree); Pre_Order_Lk(tree->n_root,tree->n_root->v[1],tree); } } else { Post_Order_Lk(tree->e_root->rght,tree->e_root->left,tree); Post_Order_Lk(tree->e_root->left,tree->e_root->rght,tree); if(tree->both_sides == YES) { Pre_Order_Lk(tree->e_root->rght,tree->e_root->left,tree); Pre_Order_Lk(tree->e_root->left,tree->e_root->rght,tree); } } } else { Post_Order_Lk(tree->a_nodes[tree->tip_root],tree->a_nodes[tree->tip_root]->v[0],tree); if(tree->both_sides == YES) Pre_Order_Lk(tree->a_nodes[tree->tip_root],tree->a_nodes[tree->tip_root]->v[0],tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk(t_edge *b, t_tree *tree) { unsigned int br,catg,state,ambiguity_check,site; phydbl len,*expl,*dot_prod,*p_lk_left,*p_lk_rght; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int npatterns = tree->data->n_pattern; const unsigned int nsncatg = ns * ncatg; tree->numerical_warning = NO; /* if(tree->eval_alnL == NO) return UNLIKELY; */ if(b == NULL && tree->mod->s_opt->curr_opt_free_rates == YES) { tree->mod->s_opt->curr_opt_free_rates = NO; Optimize_Free_Rate_Weights(tree,YES,YES); tree->mod->s_opt->curr_opt_free_rates = YES; } if(tree->is_mixt_tree == YES) { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif MIXT_Lk(b,tree); return tree->c_lnL; } tree->old_lnL = tree->c_lnL; if(tree->rates && tree->io && tree->io->lk_approx == NORMAL) { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif tree->c_lnL = Lk_Normal_Approx(tree); return tree->c_lnL; } expl = tree->expl; dot_prod = tree->dot_prod; if(b == NULL) { Update_Boundaries(tree->mod); Update_RAS(tree->mod); Update_Efrq(tree->mod); Update_Eigen(tree->mod); } if(tree->mod->s_opt->skip_tree_traversal == NO) { if(!b) //Update PMat for all edges { for(br=0;br<2*tree->n_otu-3;++br) { Update_PMat_At_Given_Edge(tree->a_edges[br],tree); } if(tree->n_root && tree->ignore_root == NO) { Update_PMat_At_Given_Edge(tree->n_root->b[1],tree); Update_PMat_At_Given_Edge(tree->n_root->b[2],tree); } } else //Update PMat for a specific edge { if(tree->use_eigen_lr == NO) { if(tree->n_root && (b == tree->n_root->b[1] || b == tree->n_root->b[2]) && tree->ignore_root == YES) { Update_PMat_At_Given_Edge(tree->e_root,tree); } else { Update_PMat_At_Given_Edge(b,tree); } } } if(!b) { if(tree->n_root != NULL) { if(tree->ignore_root == NO) { Post_Order_Lk(tree->n_root,tree->n_root->v[1],tree); Post_Order_Lk(tree->n_root,tree->n_root->v[2],tree); Update_Partial_Lk(tree,tree->n_root->b[1],tree->n_root); Update_Partial_Lk(tree,tree->n_root->b[2],tree->n_root); if(tree->both_sides == YES) { Pre_Order_Lk(tree->n_root,tree->n_root->v[2],tree); Pre_Order_Lk(tree->n_root,tree->n_root->v[1],tree); } } else { Post_Order_Lk(tree->e_root->rght,tree->e_root->left,tree); Post_Order_Lk(tree->e_root->left,tree->e_root->rght,tree); if(tree->both_sides == YES) { Pre_Order_Lk(tree->e_root->rght,tree->e_root->left,tree); Pre_Order_Lk(tree->e_root->left,tree->e_root->rght,tree); } } } else { Post_Order_Lk(tree->a_nodes[tree->tip_root],tree->a_nodes[tree->tip_root]->v[0],tree); if(tree->both_sides == YES) Pre_Order_Lk(tree->a_nodes[tree->tip_root],tree->a_nodes[tree->tip_root]->v[0],tree); } } } if(!b) { if(tree->n_root) { if(tree->ignore_root == NO) b = (tree->n_root->v[1]->tax == NO)?(tree->n_root->b[2]):(tree->n_root->b[1]); else b = tree->e_root; } else b = tree->a_nodes[tree->tip_root]->b[0]; } tree->c_lnL = .0; tree->sum_min_sum_scale = .0; #ifdef BEAGLE calc_edgelks_beagle(b, tree); #else if(tree->update_eigen_lr == YES) Update_Eigen_Lr(b,tree); if(tree->use_eigen_lr == YES) { for(catg=0;catgl->v)*tree->mod->ras->gamma_rr->v[catg]; len *= tree->mod->br_len_mult->v; if(tree->mixt_tree != NULL) len *= tree->mixt_tree->mod->ras->gamma_rr->v[tree->mod->ras->parent_class_number]; if(len < tree->mod->l_min) len = tree->mod->l_min; else if(len > tree->mod->l_max) len = tree->mod->l_max; for(state=0;statemod->eigen->e_val[state]*len); } } p_lk_left = b->p_lk_left; p_lk_rght = b->rght->tax ? b->p_lk_tip_r : b->p_lk_rght; for(site=0;sitecurr_site = site; if((b->rght->tax) && (tree->mod->s_opt->greedy == NO)) { ambiguity_check = b->rght->c_seq->is_ambigu[tree->curr_site]; if(ambiguity_check == NO) { state = b->rght->c_seq->d_state[tree->curr_site]; } } if(tree->mod->use_m4mod) ambiguity_check = YES; if(tree->use_eigen_lr == YES) { if(tree->data->wght[site] > SMALL) Lk_Core_Eigen_Lr(expl,dot_prod,b,tree); dot_prod += nsncatg; } else { if(tree->data->wght[site] > SMALL) Lk_Core(state,ambiguity_check,p_lk_left,p_lk_rght,b->Pij_rr,b->tPij_rr,b,tree); if(b->rght->tax == YES) { p_lk_left += nsncatg; p_lk_rght += ns; } else { p_lk_left += nsncatg; p_lk_rght += nsncatg; } } } #endif return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // First derivative of the log-likelihood with respect // to the length of edge b phydbl dLk(phydbl *l, t_edge *b, t_tree *tree) { unsigned int catg,state,site; phydbl len,rr,var; phydbl lk,dlk,dlnlk,lnlk; phydbl ev,expevlen; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int npattern = tree->data->n_pattern; phydbl *dot_prod = tree->dot_prod; phydbl *expl = tree->expl; tree->numerical_warning = NO; assert(isnan(*l) == FALSE); if(*l < tree->mod->l_min) *l = tree->mod->l_min; else if(*l > tree->mod->l_max) *l = tree->mod->l_max; assert(b != NULL); if(tree->is_mixt_tree == YES) { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif return MIXT_dLk(l,b,tree); } if(tree->update_eigen_lr == YES) Update_Eigen_Lr(b,tree); for(catg=0;catgmod->ras->gamma_rr->v[catg]; if(tree->mixt_tree) rr = tree->mixt_tree->mod->ras->gamma_rr->v[tree->mod->ras->parent_class_number]; rr *= tree->mod->br_len_mult->v; len = (*l) * rr; /* var = tree->mod->l_var_sigma * rr*rr; */ var = (*l) * tree->mod->l_var_sigma->v * rr*rr; if(isinf(len) || isnan(len)) { PhyML_Fprintf(stderr,"\n. len=%f rr=%f l=%f",len,rr,*l); assert(FALSE); } if(len < tree->mod->l_min) len = tree->mod->l_min; else if(len > tree->mod->l_max) len = tree->mod->l_max; // value of rr should be corrected too if any of these two conditions // is true. Leads to numerical precision issues though... for(state=0;statemod->eigen->e_val[state]; expevlen = exp(ev*len); if(tree->mod->gamma_mgf_bl == YES) { expl[catg*2*ns + 2*state] = POW(1. - ev*var/len,-len*len/var); expl[catg*2*ns + 2*state + 1] = expl[catg*2*ns + 2*state]; expl[catg*2*ns + 2*state + 1] *= -(ev * rr/(1.-ev*var/len) + 2.*len*rr*LOG(1.-ev*var/len)/var); } else { expl[catg*2*ns + 2*state] = expevlen; expl[catg*2*ns + 2*state + 1] = expevlen*ev*rr; } } } dlnlk = 0.0; lnlk = 0.0; for(site=0;sitedata->wght[site] > SMALL) { tree->curr_site = site; Lk_dLk_Core_Eigen_Lr(expl,dot_prod+site*ns*ncatg,b,&lk,&dlk,tree); assert(lk > .0); dlk /= lk; dlnlk += tree->data->wght[site] * dlk; lnlk += tree->data->wght[site] * (log(lk) - (phydbl)LOG2 * tree->fact_sum_scale[site]); } } tree->c_dlnL = dlnlk; tree->c_lnL = lnlk; return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Core of the likelihood calculation. Assume that the partial likelihoods on both sides of t_edge *b are up-to-date. Calculate the log-likelihood at one site. Note: this function can be used to evaluate first or second derivative of the likelihood function with respect to the length of b, at a given site. Hence, be careful with the meaning of 'site_lk'. If 'derivative=TRUE', then site_lk is either the first or second derivative of the likelihood at that site, given the length of edge 'b'. */ phydbl Lk_Core(int state, int ambiguity_check, phydbl *p_lk_left, phydbl *p_lk_rght, phydbl *Pij_rr, phydbl *tPij_rr, t_edge *b, t_tree *tree) { phydbl site_lk,res,*pi,*site_lk_cat,log_site_lk; unsigned int catg; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int site = tree->curr_site; const unsigned nsns = ns*ns; assert(tree->data->wght[site] > SMALL); pi = tree->mod->e_frq->pi->v; if(tree->mod->s_opt->skip_tree_traversal == NO) { for(catg=0;catgsite_lk_cat[catg] = AVX_Lk_Core_One_Class_No_Eigen_Lr(p_lk_left,p_lk_rght,Pij_rr,tPij_rr,pi,ns,ambiguity_check,state); #elif ((defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) && !defined(DISABLE_NATIVE)) tree->site_lk_cat[catg] = SSE_Lk_Core_One_Class_No_Eigen_Lr(p_lk_left,p_lk_rght,Pij_rr,tPij_rr,pi,ns,ambiguity_check,state); #else tree->site_lk_cat[catg] = Lk_Core_One_Class_No_Eigen_Lr(p_lk_left,p_lk_rght,Pij_rr,pi,ns,ambiguity_check,state); #endif } else { tree->site_lk_cat[catg] = Lk_Core_One_Class_No_Eigen_Lr(p_lk_left,p_lk_rght,Pij_rr,pi,ns, ambiguity_check, state); } Pij_rr += nsns; tPij_rr += nsns; if(b->left->tax == NO) p_lk_left += ns; if(b->rght->tax == NO) p_lk_rght += ns; } Pull_Scaling_Factors(site,b,tree); } site_lk = .0; site_lk_cat = tree->unscaled_site_lk_cat + site*ncatg; for(catg=0;catgmod->ras->gamma_r_proba->v[catg]; if(tree->mod->ras->invar == YES) { int num_prec_issue = NO; phydbl inv_site_lk = Invariant_Lk(tree->fact_sum_scale[site],site,&num_prec_issue,tree); switch(num_prec_issue) { case YES : { assert(isinf(inv_site_lk)); tree->fact_sum_scale[site] = 0; inv_site_lk = Invariant_Lk(0,site,&num_prec_issue,tree); site_lk = inv_site_lk * tree->mod->ras->pinvar->v; break; } case NO : { site_lk = site_lk * (1. - tree->mod->ras->pinvar->v) + inv_site_lk * tree->mod->ras->pinvar->v; break; } } } if(tree->apply_lk_scaling == YES) res = site_lk / pow(2,tree->fact_sum_scale[site]); else res = site_lk; if(site_lk < SMALL) { site_lk = SMALL; tree->numerical_warning = YES; } log_site_lk = log(site_lk) - (phydbl)LOG2 * tree->fact_sum_scale[site]; // log_site_lk = log(site_lk_scaled / 2^(left_subtree+right_subtree)) tree->c_lnL_sorted[site] = log_site_lk; tree->c_lnL += tree->data->wght[site] * log_site_lk; tree->cur_site_lk[site] = exp(log_site_lk); // note to self : add opt out option to avoid calculating this if not necessary /* printf("\n. clnL: %f",tree->c_lnL); */ return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, t_tree *tree) { phydbl site_lk,res,*site_lk_cat,log_site_lk; unsigned int catg; int num_prec_issue; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int site = tree->curr_site; assert(tree->data->wght[site] > SMALL); if(tree->mod->s_opt->skip_tree_traversal == NO) { for(catg=0;catgmod->io->datatype == NT || tree->mod->io->datatype == AA) { #if ((defined(__AVX__) || defined(__AVX2__)) && !defined(DISABLE_NATIVE)) tree->site_lk_cat[catg] = AVX_Lk_Core_One_Class_Eigen_Lr(dot_prod,expl ? expl : NULL,ns); #elif ((defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) && !defined(DISABLE_NATIVE)) tree->site_lk_cat[catg] = SSE_Lk_Core_One_Class_Eigen_Lr(dot_prod,expl ? expl : NULL,ns); #else tree->site_lk_cat[catg] = Lk_Core_One_Class_Eigen_Lr(dot_prod,expl ? expl : NULL,ns); #endif } else { tree->site_lk_cat[catg] = Lk_Core_One_Class_Eigen_Lr(dot_prod,expl ? expl : NULL,ns); } dot_prod += ns; if(expl) expl += ns; } Pull_Scaling_Factors(site,b,tree); } site_lk_cat = tree->unscaled_site_lk_cat + site*ncatg; site_lk = .0; for(catg=0;catgmod->ras->gamma_r_proba->v[catg]; if(tree->mod->ras->invar == YES) { num_prec_issue = NO; phydbl inv_site_lk = Invariant_Lk(tree->fact_sum_scale[site],site,&num_prec_issue,tree); switch(num_prec_issue) { case YES : { assert(isinf(inv_site_lk)); tree->fact_sum_scale[site] = 0; inv_site_lk = Invariant_Lk(0,site,&num_prec_issue,tree); site_lk = inv_site_lk * tree->mod->ras->pinvar->v; break; } case NO : { site_lk = site_lk * (1. - tree->mod->ras->pinvar->v) + inv_site_lk * tree->mod->ras->pinvar->v; break; } } } if(site_lk < SMALL) { site_lk = SMALL; tree->numerical_warning = YES; } // likelihood (or 1st, 2nd derivative) not rescaled here. Valid only if all partial likelihoods // were scaled using the same factor, i.e., when scaling_method == SCALE_FAST. In this case, the // scaling factors will cancel out in dlk/lk and d2lk/lk res = site_lk; log_site_lk = log(site_lk) - (phydbl)LOG2 * tree->fact_sum_scale[site]; // log_site_lk = log(site_lk_scaled / 2^(left_subtree+right_subtree)) tree->c_lnL_sorted[site] = log_site_lk; tree->c_lnL += tree->data->wght[site] * log_site_lk; tree->cur_site_lk[site] = exp(log_site_lk); // note to self : add opt out option to avoid calculating this if not necessary return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Compute likelihood and first derivative of likelihood with respect to the length of edge b *unscaled* void Lk_dLk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, phydbl *lk, phydbl *dlk, t_tree *tree) { phydbl core_lk,core_dlk; unsigned int catg; int num_prec_issue; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int site = tree->curr_site; *lk = *dlk = 0.0; assert(tree->data->wght[site] > SMALL); if(tree->mod->s_opt->skip_tree_traversal == NO) { for(catg=0;catgmod->io->datatype == NT || tree->mod->io->datatype == AA) { #if ((defined(__AVX__) || defined(__AVX2__)) && !defined(DISABLE_NATIVE)) AVX_Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns,&core_lk,&core_dlk); #elif ((defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) && !defined(DISABLE_NATIVE)) SSE_Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns,&core_lk,&core_dlk); #else Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns,&core_lk,&core_dlk); #endif } else { Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns,&core_lk,&core_dlk); } *lk += core_lk * tree->mod->ras->gamma_r_proba->v[catg]; *dlk += core_dlk * tree->mod->ras->gamma_r_proba->v[catg]; dot_prod += ns; if(expl) expl += 2*ns; } Pull_Scaling_Factors(site,b,tree); } if(tree->mod->ras->invar == YES) { num_prec_issue = NO; phydbl inv_site_lk = Invariant_Lk(tree->fact_sum_scale[site],site,&num_prec_issue,tree); switch(num_prec_issue) { case YES : { *lk = inv_site_lk * tree->mod->ras->pinvar->v; *dlk = 0.0; break; } case NO : { *lk = *lk * (1. - tree->mod->ras->pinvar->v) + inv_site_lk * tree->mod->ras->pinvar->v; *dlk = *dlk * (1. - tree->mod->ras->pinvar->v); break; } } } if(*lk < SMALL) { *lk = SMALL; tree->numerical_warning = YES; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Eigen_Lr(t_edge *b, t_tree *tree) { unsigned int site,catg,i,j; phydbl *dot_prod,*r_e_vect,*l_e_vect,*p_lk_left,*p_lk_rght,*pi; phydbl left,rght; const unsigned int npattern = tree->data->n_pattern; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int nsncatg = ns*ncatg; if(tree->is_mixt_tree == YES) { MIXT_Update_Eigen_Lr(b,tree); return; } if(tree->mod->ns == 4 || tree->mod->ns == 20) { #if ((defined(__AVX__) || defined(__AVX2__)) && !defined(DISABLE_NATIVE)) AVX_Update_Eigen_Lr(b,tree); return; #elif ((defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) && !defined(DISABLE_NATIVE)) SSE_Update_Eigen_Lr(b,tree); return; #endif } assert(tree->update_eigen_lr == YES); dot_prod = tree->dot_prod; r_e_vect = tree->mod->eigen->r_e_vect; l_e_vect = tree->mod->eigen->l_e_vect; pi = tree->mod->e_frq->pi->v; if(b->left->tax == YES) p_lk_left = b->p_lk_tip_l; else p_lk_left = b->p_lk_left; if(b->rght->tax == YES) p_lk_rght = b->p_lk_tip_r; else p_lk_rght = b->p_lk_rght; for(site=0;sitedata->wght[site] > SMALL) { for(catg=0;catgleft->tax == NO) p_lk_left += ns; if(b->rght->tax == NO) p_lk_rght += ns; } if(b->left->tax == YES) p_lk_left += ns; if(b->rght->tax == YES) p_lk_rght += ns; } else { if(b->left->tax == YES) p_lk_left += ns; else p_lk_left += nsncatg; if(b->rght->tax == YES) p_lk_rght += ns; else p_lk_rght += nsncatg; dot_prod += nsncatg; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Rate_Correction(int exponent, phydbl *site_lk_cat) { int piecewise_exponent; phydbl multiplier,dum; unsigned long long int one = 1; dum = *site_lk_cat; if(exponent >= 0) { /* Multiply by 2^exponent */ do { piecewise_exponent = MIN(exponent,63); multiplier = (phydbl)(one << piecewise_exponent); dum = dum * multiplier; exponent = exponent - piecewise_exponent; } while(exponent != 0); } else { /* Divide by 2^exponent */ do { piecewise_exponent = MAX(exponent,-63); multiplier = 1. / (phydbl)(one << -piecewise_exponent); dum = dum * multiplier; exponent = exponent - piecewise_exponent; } while(exponent != 0); } *site_lk_cat = dum; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, int ns) { unsigned int l; phydbl lk = 0.0; if(expl != NULL) for(l=0;l= 0); sum = .0; Pij += state*ns; for(l=0;l .0) /* Only bother ascending into the subtrees if the likelihood of state k, at site "site*dim2" is > 0 */ { sum = .0; for(l=0;lmod->ras->invar == YES) { /* The site is invariant */ if(tree->data->invar[site] > -0.5) { inv_site_lk = tree->mod->e_frq->pi->v[tree->data->invar[site]]; /* printf("\n. inv_site_lk = %f [%c] [%d] invar: %d",inv_site_lk,tree->data->c_seq[0]->state[site],tree->data->invar[site],tree->data->invar[site]); */ if(tree->apply_lk_scaling == YES) { exponent = fact_sum_scale; do { piecewise_exponent = MIN(exponent,63); multiplier = (phydbl)((unsigned long long)(1) << piecewise_exponent); inv_site_lk *= multiplier; exponent -= piecewise_exponent; } while(exponent != 0); } /* Update the value of site_lk */ if(isinf(inv_site_lk)) // P(D|r=0) >> P(D|r>0) => assume P(D) = P(D|r=0)P(r=0) { int i; PhyML_Fprintf(stderr,"\n. fact_sum_scale: %d",fact_sum_scale); PhyML_Fprintf(stderr,"\n. pi: %f",tree->mod->e_frq->pi->v[tree->data->invar[site]]); for(i=0;imod->ns;i++) PhyML_Fprintf(stderr,"\n. pi %d: %f",i,tree->mod->e_frq->pi->v[i]); PhyML_Fprintf(stderr,"\n. Numerical precision issue alert."); PhyML_Fprintf(stderr,"\n. File %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); (*num_prec_issue) = YES; } } } return inv_site_lk; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Update partial likelihood on edge b on the side of b where node d lies. */ void Update_Partial_Lk(t_tree *tree, t_edge *b, t_node *d) { /* if(tree->eval_alnL == NO) return; */ if(b->left == d && b->update_partial_lk_left == NO) return; if(b->rght == d && b->update_partial_lk_rght == NO) return; if(tree->is_mixt_tree) { MIXT_Update_Partial_Lk(tree,b,d); return; } if((tree->io->do_alias_subpatt == YES) && (tree->update_alias_subpatt == YES)) Alias_One_Subpatt((d==b->left)?(b->rght):(b->left),d,tree); if(d->tax) return; #ifdef BEAGLE update_beagle_partials(tree, b, d); #else if(tree->mod->use_m4mod == NO) { if(tree->mod->ns == 4 || tree->mod->ns == 20) { #if ((defined(__AVX__) || defined(__AVX2__)) && !defined(DISABLE_NATIVE)) AVX_Update_Partial_Lk(tree,b,d); #elif ((defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) && !defined(DISABLE_NATIVE)) SSE_Update_Partial_Lk(tree,b,d); #else Default_Update_Partial_Lk(tree,b,d); #endif } else { Update_Partial_Lk_Generic(tree,b,d); } } else { Update_Partial_Lk_Generic(tree,b,d); } #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifndef BEAGLE void Update_Partial_Lk_Generic(t_tree *tree, t_edge *b, t_node *d) { /* | |<- b | d / \ / \ / \ n_v1 n_v2 */ t_node *n_v1, *n_v2; phydbl p1_lk1,p2_lk2; phydbl *p_lk,*p_lk_v1,*p_lk_v2; phydbl *Pij1,*Pij2; phydbl *tPij1,*tPij2; int *sum_scale, *sum_scale_v1, *sum_scale_v2; int sum_scale_v1_val, sum_scale_v2_val; int i,j; int catg,site; int n_patterns; short int ambiguity_check_v1,ambiguity_check_v2; int state_v1,state_v2; phydbl smallest_p_lk,largest_p_lk; int *p_lk_loc; unsigned const int ncatg = tree->mod->ras->n_catg; unsigned const int ns = tree->mod->ns; unsigned const int ncatgns = ncatg * ns; unsigned const int nsns = ns * ns; if(tree->n_root && tree->ignore_root == YES && (d == tree->n_root->v[1] || d == tree->n_root->v[2]) && (b == tree->n_root->b[1] || b == tree->n_root->b[2])) { assert(FALSE); } state_v1 = state_v2 = -1; ambiguity_check_v1 = ambiguity_check_v2 = NO; sum_scale_v1_val = sum_scale_v2_val = 0; p1_lk1 = p2_lk2 = .0; if(d->tax) { PhyML_Fprintf(stderr,"\n. t_node %d is a leaf...",d->num); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s').\n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } n_patterns = tree->data->n_pattern; n_v1 = n_v2 = NULL; p_lk = p_lk_v1 = p_lk_v2 = NULL; Pij1 = Pij2 = NULL; tPij1 = tPij2 = NULL; sum_scale_v1 = sum_scale_v2 = NULL; p_lk_loc = NULL; smallest_p_lk = BIG; Set_All_Partial_Lk(&n_v1,&n_v2, &p_lk,&sum_scale,&p_lk_loc, &Pij1,&tPij1,&p_lk_v1,&sum_scale_v1, &Pij2,&tPij2,&p_lk_v2,&sum_scale_v2, d,b,tree); /* For every site in the alignment */ for(site=0;sitedata->wght[site] > SMALL) { state_v1 = state_v2 = -1; ambiguity_check_v1 = ambiguity_check_v2 = NO; if(tree->mod->s_opt->greedy == NO) { /* n_v1 and n_v2 are tip nodes */ if(n_v1 && n_v1->tax) { /* Is the state at this tip ambiguous? */ ambiguity_check_v1 = n_v1->c_seq->is_ambigu[site]; /* if(ambiguity_check_v1 == NO) state_v1 = Get_State_From_Partial_Pars(n_v1->b[0]->p_lk_tip_r,site*ns,tree); */ if(ambiguity_check_v1 == NO) state_v1 = n_v1->c_seq->d_state[site]; } if(n_v2 && n_v2->tax) { /* Is the state at this tip ambiguous? */ ambiguity_check_v2 = n_v2->c_seq->is_ambigu[site]; /* ambiguity_check_v2 = tree->data->c_seq[n_v2->num]->is_ambigu[site]; */ /* if(ambiguity_check_v2 == NO) state_v2 = Get_State_From_Partial_Pars(n_v2->b[0]->p_lk_tip_r,site*ns,tree); */ if(ambiguity_check_v2 == NO) state_v2 = n_v2->c_seq->d_state[site]; } } if(tree->mod->use_m4mod) { ambiguity_check_v1 = YES; ambiguity_check_v2 = YES; } /* For all the rate classes */ for(catg=0;catgmod->ras->skip_rate_cat[catg] == YES) continue; smallest_p_lk = BIG; /* For all the states at node d */ for(i=0;imod->ns;i++) { p1_lk1 = .0; if(n_v1) { /* n_v1 is a tip */ if((n_v1->tax) && (!tree->mod->s_opt->greedy)) { if(ambiguity_check_v1 == NO) { /* For the (non-ambiguous) state at node n_v1 */ p1_lk1 = Pij1[catg*nsns+i*ns+state_v1]; } else { /* For all the states at node n_v1 */ for(j=0;jmod->ns;j++) { p1_lk1 += Pij1[catg*nsns+i*ns+j] * (phydbl)n_v1->b[0]->p_lk_tip_r[site*ns+j]; } } } /* n_v1 is an internal node */ else { /* For the states at node n_v1 */ for(j=0;jmod->ns;j++) { p1_lk1 += Pij1[catg*nsns+i*ns+j] * p_lk_v1[site*ncatgns+catg*ns+j]; } } } else { p1_lk1 = 1.0; } p2_lk2 = .0; /* We do exactly the same as for node n_v1 but for node n_v2 this time.*/ if(n_v2) { /* n_v2 is a tip */ if((n_v2->tax) && (!tree->mod->s_opt->greedy)) { if(ambiguity_check_v2 == NO) { /* For the (non-ambiguous) state at node n_v2 */ p2_lk2 = Pij2[catg*nsns+i*ns+state_v2]; } else { /* For all the states at node n_v2 */ for(j=0;jmod->ns;j++) { p2_lk2 += Pij2[catg*nsns+i*ns+j] * (phydbl)n_v2->b[0]->p_lk_tip_r[site*ns+j]; } } } /* n_v2 is an internal node */ else { /* For all the states at node n_v2 */ for(j=0;jmod->ns;j++) { p2_lk2 += Pij2[catg*nsns+i*ns+j] * p_lk_v2[site*ncatgns+catg*ns+j]; } } } else { p2_lk2 = 1.0; } p_lk[site*ncatgns+catg*ns+i] = p1_lk1 * p2_lk2; /* if(site == 0) PhyML_Printf("\n+ site: %d %G",site,p_lk[site*ncatgns+catg*ns+i]); */ } if(tree->scaling_method == SCALE_RATE_SPECIFIC) { smallest_p_lk = BIG; for(i=0;imod->augmented == NO && tree->apply_lk_scaling == YES && (n_v1->tax == NO || n_v2->tax == NO)) { int curr_scaler_pow; curr_scaler_pow = (int)(-500.*LOG2-log(smallest_p_lk))/LOG2; sum_scale[site*ncatg+catg] += curr_scaler_pow; for(i=0;iscaling_method == SCALE_FAST) { sum_scale_v1_val = (sum_scale_v1)?(sum_scale_v1[site]):(0); sum_scale_v2_val = (sum_scale_v2)?(sum_scale_v2[site]):(0); sum_scale[site] = sum_scale_v1_val + sum_scale_v2_val; sum_scale[site*ncatg+catg] = sum_scale_v1_val + sum_scale_v2_val; assert(sum_scale[site] < 1024); largest_p_lk = -BIG; for(i=0;i largest_p_lk) largest_p_lk = p_lk[site*ncatgns+i] ; if(largest_p_lk < INV_TWO_TO_THE_LARGE && tree->mod->augmented == NO && tree->apply_lk_scaling == YES) { for(i=0;imod->ras->n_catg; const unsigned int ns = tree->mod->ns; const unsigned int n_patterns = tree->data->n_pattern; if(tree->n_root && tree->ignore_root == YES && (d == tree->n_root->v[1] || d == tree->n_root->v[2]) && (b == tree->n_root->b[1] || b == tree->n_root->b[2])) { assert(FALSE); } if(d->tax) { PhyML_Fprintf(stderr,"\n. t_node %d is a leaf...",d->num); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } n_v1 = n_v2 = NULL; p_lk = p_lk_v1 = p_lk_v2 = NULL; Pij1 = Pij2 = NULL; tPij1 = tPij2 = NULL; p_lk_loc = NULL; sum_scale_v1 = NULL; sum_scale_v2 = NULL; Set_All_Partial_Lk(&n_v1,&n_v2, &p_lk,&sum_scale,&p_lk_loc, &Pij1,&tPij1,&p_lk_v1,&sum_scale_v1, &Pij2,&tPij2,&p_lk_v2,&sum_scale_v2, d,b,tree); Core_Default_Update_Partial_Lk(n_v1,n_v2, p_lk,p_lk_v1,p_lk_v2, Pij1,Pij2, sum_scale,sum_scale_v1,sum_scale_v2, ns,ncatg,n_patterns, tree->apply_lk_scaling, tree->data->wght); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Core_Default_Update_Partial_Lk(const t_node *n_v1, const t_node *n_v2, phydbl *plk0, const phydbl *plk1, const phydbl *plk2, const phydbl *Pij1, const phydbl *Pij2, int *sum_scale0, const int *sum_scale1, const int *sum_scale2, const int ns, const int ncatg, const int npatterns, const int apply_scaling, const phydbl *wght) { unsigned int i,site,ncatgns,catg,nsns; int state_v1,state_v2; int ambiguity_check_v1,ambiguity_check_v2; int sum_scale_v1_val, sum_scale_v2_val; phydbl largest_p_lk; const phydbl *init_Pij1, *init_Pij2; ncatgns = ncatg*ns; nsns = ns*ns; init_Pij1 = Pij1; init_Pij2 = Pij2; /* For every site in the alignment */ for(site=0;site SMALL) { state_v1 = state_v2 = -1; ambiguity_check_v1 = ambiguity_check_v2 = YES; /* n_v1 and n_v2 are tip nodes */ if(n_v1->tax) { /* Is the state at this tip ambiguous? */ ambiguity_check_v1 = n_v1->c_seq->is_ambigu[site]; if(ambiguity_check_v1 == NO) state_v1 = n_v1->c_seq->d_state[site]; } if(n_v2->tax) { /* Is the state at this tip ambiguous? */ ambiguity_check_v2 = n_v2->c_seq->is_ambigu[site]; if(ambiguity_check_v2 == NO) state_v2 = n_v2->c_seq->d_state[site]; } Pij1 = init_Pij1; Pij2 = init_Pij2; /* For all the rate classes */ for(catg=0;catgtax) ? 0 : ns; plk2 += (n_v2->tax) ? 0 : ns; plk0 += ns; } plk1 += (n_v1->tax) ? ns : 0; plk2 += (n_v2->tax) ? ns : 0; sum_scale_v1_val = (sum_scale1)?(sum_scale1[site]):(0); sum_scale_v2_val = (sum_scale2)?(sum_scale2[site]):(0); sum_scale0[site] = sum_scale_v1_val + sum_scale_v2_val; plk0 -= ncatgns; largest_p_lk = -BIG; for(i=0;i largest_p_lk) largest_p_lk = plk0[i]; if(largest_p_lk < INV_TWO_TO_THE_LARGE && apply_scaling == YES) { for(i=0;itax) ? ns : ncatgns; plk2 += (n_v2->tax) ? ns : ncatgns; } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Return_Abs_Lk(t_tree *tree) { Lk(NULL,tree); return FABS(tree->c_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// matrix *ML_Dist(calign *data, t_mod *mod) { int i,j,k,l; phydbl init; int n_catg; phydbl d_max,sum; matrix *mat; calign *twodata,*tmpdata; int state0, state1; phydbl *F,len; eigen *eigen_struct; tmpdata = (calign *)mCalloc(1, sizeof(calign)); tmpdata->c_seq = (align **)mCalloc(2, sizeof(align *)); tmpdata->obs_state_frq = (phydbl *)mCalloc(mod->ns, sizeof(phydbl)); tmpdata->ambigu = (short int *)mCalloc(data->n_pattern, sizeof(short int)); F = (phydbl *)mCalloc(mod->ns * mod->ns, sizeof(phydbl)); eigen_struct = (eigen *)Make_Eigen_Struct(mod->ns); Set_Update_Eigen(YES,mod); Update_Boundaries(mod); Update_Eigen(mod); tmpdata->n_otu = 2; tmpdata->n_pattern = data->n_pattern; tmpdata->init_len = data->init_len; mat = NULL; if(mod->io->datatype == NT) mat = (mod->whichmodel < 10)?(K80_dist(data,1E+6)):(JC69_Dist(data,mod)); else if(mod->io->datatype == AA) mat = JC69_Dist(data,mod); else if(mod->io->datatype == GENERIC) mat = JC69_Dist(data,mod); for(i=0;iras->n_catg;i++) /* Don't use the discrete gamma distribution */ { mod->ras->gamma_rr->v[i] = 1.0; mod->ras->gamma_r_proba->v[i] = 1.0; } n_catg = mod->ras->n_catg; mod->ras->n_catg = 1; for(j=0;jn_otu-1;j++) { tmpdata->c_seq[0] = data->c_seq[j]; tmpdata->c_seq[0]->name = data->c_seq[j]->name; tmpdata->wght = data->wght; for(k=j+1;kn_otu;k++) { tmpdata->c_seq[1] = data->c_seq[k]; tmpdata->c_seq[1]->name = data->c_seq[k]->name; twodata = Compact_Cdata(tmpdata,mod->io); Check_Ambiguities(twodata,mod->io->datatype,mod->io->state_len); Hide_Ambiguities(twodata); init = mat->dist[j][k]; if((init > DIST_MAX-SMALL) || (init < .0)) init = 0.1; d_max = init; for(i=0;ins*mod->ns;++i) F[i]=.0; len = 0.0; for(l=0;lc_seq[0]->len;++l) { state0 = Assign_State(twodata->c_seq[0]->state+l*mod->io->state_len,mod->io->datatype,mod->io->state_len); state1 = Assign_State(twodata->c_seq[1]->state+l*mod->io->state_len,mod->io->datatype,mod->io->state_len); if((state0 > -1) && (state1 > -1)) { F[mod->ns*state0+state1] += twodata->wght[l]; len += twodata->wght[l]; } } if(len > .0) { for(i=0;ins*mod->ns;++i) F[i] /= len; } sum = 0.; for(i=0;ins*mod->ns;++i) sum += F[i]; /* for(i=0;ins*mod->ns;++i) PhyML_Printf("\n. %g",F[i]); */ /* if(sum < .001) d_max = -1.; */ if(sum < .001) d_max = init; else if((sum > 1. - .001) && (sum < 1. + .001)) Opt_Dist_F(&(d_max),F,mod); else { PhyML_Fprintf(stderr,"\n\n. sum = %f",sum); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit(""); } if(d_max >= DIST_MAX) d_max = DIST_MAX; /* Do not correct for dist < BL_MIN, otherwise Fill_Missing_Dist * will not be called */ mat->dist[j][k] = d_max; mat->dist[k][j] = mat->dist[j][k]; Free_Calign(twodata); } } mod->ras->n_catg = n_catg; Free(tmpdata->ambigu); Free(tmpdata->obs_state_frq); Free(tmpdata->c_seq); free(tmpdata); Free_Eigen(eigen_struct); Free(F); return mat; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Given_Two_Seq(calign *data, int numseq1, int numseq2, phydbl dist, t_mod *mod, phydbl *loglk) { align *seq1,*seq2; phydbl site_lk,log_site_lk; int i,j,k,l; /* phydbl **p_lk_l,**p_lk_r; */ phydbl *p_lk_l,*p_lk_r; phydbl len; int dim1,dim2; dim1 = mod->ns; dim2 = mod->ns * mod->ns; DiscreteGamma(mod->ras->gamma_r_proba->v, mod->ras->gamma_rr->v, mod->ras->alpha->v, mod->ras->alpha->v,mod->ras->n_catg,mod->ras->gamma_median); seq1 = data->c_seq[numseq1]; seq2 = data->c_seq[numseq2]; p_lk_l = (phydbl *)mCalloc(data->c_seq[0]->len * mod->ns,sizeof(phydbl)); p_lk_r = (phydbl *)mCalloc(data->c_seq[0]->len * mod->ns,sizeof(phydbl)); for(i=0;iras->n_catg;i++) { len = dist*mod->ras->gamma_rr->v[i]; if(len < mod->l_min) len = mod->l_min; else if(len > mod->l_max) len = mod->l_max; PMat(len,mod,dim2*i,mod->Pij_rr->v,NULL); } if(mod->io->datatype == NT) { For(i,data->c_seq[0]->len) { Init_Tips_At_One_Site_Nucleotides_Float(seq1->state[i],i*mod->ns,p_lk_l); Init_Tips_At_One_Site_Nucleotides_Float(seq2->state[i],i*mod->ns,p_lk_r); } } else if(mod->io->datatype == AA) { For(i,data->c_seq[0]->len) { Init_Tips_At_One_Site_AA_Float(seq1->state[i],i*mod->ns,p_lk_l); Init_Tips_At_One_Site_AA_Float(seq2->state[i],i*mod->ns,p_lk_r); } } else { PhyML_Fprintf(stderr,"\n\n. Not implemented yet..."); PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit("\n"); } site_lk = .0; *loglk = 0; For(i,data->c_seq[0]->len) { if(data->wght[i] > 0.0) { site_lk = log_site_lk = .0; if(!data->ambigu[i]) { for(k=0;kns;k++) {if(p_lk_l[i*mod->ns+k] > .0001) break;} for(l=0;lns;l++) {if(p_lk_r[i*mod->ns+l] > .0001) break;} for(j=0;jras->n_catg;j++) { site_lk += mod->ras->gamma_r_proba->v[j] * mod->e_frq->pi->v[k] * p_lk_l[i*dim1+k] * mod->Pij_rr->v[j*dim2+k*dim1+l] * p_lk_r[i*dim1+l]; } } else { for(j=0;jras->n_catg;j++) { for(k=0;kns;k++) /*sort sum terms ? No global effect*/ { for(l=0;lns;l++) { site_lk += mod->ras->gamma_r_proba->v[j] * mod->e_frq->pi->v[k] * p_lk_l[i*dim1+k] * mod->Pij_rr->v[j*dim2+k*dim1+l] * p_lk_r[i*dim1+l]; } } } } if(site_lk <= .0) { PhyML_Fprintf(stderr,"\n\n. '%c' '%c'\n",seq1->state[i],seq2->state[i]); Exit("\n. Err: site lk <= 0\n"); } log_site_lk += (phydbl)log(site_lk); *loglk += data->wght[i] * log_site_lk;/* sort sum terms ? No global effect*/ } } /* For(i,data->c_seq[0]->len) */ /* { */ /* Free(p_lk_l[i]); */ /* Free(p_lk_r[i]); */ /* } */ Free(p_lk_l); Free(p_lk_r); return *loglk; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Multinomial log likelihood void Unconstraint_Lk(t_tree *tree) { int i; tree->unconstraint_lk = .0; for(i=0;idata->n_pattern;i++) tree->unconstraint_lk += tree->data->wght[i]*(phydbl)log(tree->data->wght[i]); tree->unconstraint_lk -= tree->data->init_len*(phydbl)log(tree->data->init_len); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Log-likelihood assuming a tree with edge of infinite lengths void Composite_Lk(t_tree *tree) { int i; tree->composite_lk = 0.0; for(i=0;imod->ns;++i) tree->composite_lk += tree->data->obs_state_frq[i]* tree->data->init_len* tree->n_otu* log(tree->mod->e_frq->pi->v[i]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Partial_Lk_Tips_Double(t_tree *tree) { if (tree->is_mixt_tree == YES) { MIXT_Init_Partial_Lk_Tips_Double(tree); return; } for (int tax_id = 0; tax_id < tree->n_otu; tax_id++) { if (!tree->a_nodes[tax_id]->c_seq || strcmp(tree->a_nodes[tax_id]->c_seq->name, tree->a_nodes[tax_id]->name)) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s') \n", __FILE__, __LINE__, __FUNCTION__); Exit(""); } } for (int site = 0; site < tree->data->n_pattern; site++) { for (int tax_id = 0; tax_id < tree->n_otu; tax_id++) { Init_Partial_Lk_Tips_Double_One_Character(tax_id, site, tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Partial_Lk_Tips_Double_One_Character(int node_id, int site, t_tree *tree) { int dim1; if (tree->is_mixt_tree == YES) { MIXT_Init_Partial_Lk_Tips_Double_One_Character(node_id, site, tree); return; } dim1 = tree->mod->ns; if (tree->io->datatype == NT) Init_Tips_At_One_Site_Nucleotides_Float( tree->a_nodes[node_id]->c_seq->state[site], site * dim1, tree->a_nodes[node_id]->b[0]->p_lk_tip_r); else if (tree->io->datatype == AA) Init_Tips_At_One_Site_AA_Float( tree->a_nodes[node_id]->c_seq->state[site], site * dim1, tree->a_nodes[node_id]->b[0]->p_lk_tip_r); else if (tree->io->datatype == GENERIC) Init_Tips_At_One_Site_Generic_Float( tree->a_nodes[node_id]->c_seq->state + site * tree->mod->io->state_len, tree->mod->ns, tree->mod->io->state_len, site * dim1, tree->a_nodes[node_id]->b[0]->p_lk_tip_r); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Partial_Lk_Tips_Double_One_Site(int site, t_tree *tree) { int dim1; if (tree->is_mixt_tree == YES) { MIXT_Init_Partial_Lk_Tips_Double_One_Site(site, tree); return; } dim1 = tree->mod->ns; for (int node_id = 0; node_id < tree->n_otu; node_id++) { if (tree->io->datatype == NT) Init_Tips_At_One_Site_Nucleotides_Float( tree->a_nodes[node_id]->c_seq->state[site], site * dim1, tree->a_nodes[node_id]->b[0]->p_lk_tip_r); else if (tree->io->datatype == AA) Init_Tips_At_One_Site_AA_Float(tree->a_nodes[node_id]->c_seq->state[site], site * dim1, tree->a_nodes[node_id]->b[0]->p_lk_tip_r); else if (tree->io->datatype == GENERIC) Init_Tips_At_One_Site_Generic_Float( tree->a_nodes[node_id]->c_seq->state + site * tree->mod->io->state_len, tree->mod->ns, tree->mod->io->state_len, site * dim1, tree->a_nodes[node_id]->b[0]->p_lk_tip_r); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Partial_Lk_Tips_Int(t_tree *tree) { int curr_site, i, dim1; if (tree->is_mixt_tree == YES) return; dim1 = tree->mod->ns; for (i = 0; i < tree->n_otu; i++) { if (!tree->a_nodes[i]->c_seq || strcmp(tree->a_nodes[i]->c_seq->name, tree->a_nodes[i]->name)) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s') \n", __FILE__, __LINE__, __FUNCTION__); Exit(""); } } for (curr_site = 0; curr_site < tree->data->n_pattern; curr_site++) { for (i = 0; i < tree->n_otu; i++) { /* printf("\n. site: %3d * %c",curr_site,tree->a_nodes[i]->c_seq->state[curr_site]); */ /* printf("\n. init at %s * %p",tree->a_nodes[i]->name,tree->a_nodes[i]->b[0]->p_lk_tip_r); * fflush(NULL); */ if (tree->io->datatype == NT) { Init_Tips_At_One_Site_Nucleotides_Float( tree->a_nodes[i]->c_seq->state[curr_site], curr_site * dim1, tree->a_nodes[i]->b[0]->p_lk_tip_r); /* Init_Tips_At_One_Site_Nucleotides_Int(tree->data->c_seq[i]->state[curr_site], */ /* curr_site*dim1, */ /* tree->a_nodes[i]->b[0]->p_lk_tip_r); */ } else if (tree->io->datatype == AA) Init_Tips_At_One_Site_AA_Float( tree->a_nodes[i]->c_seq->state[curr_site], curr_site * dim1, tree->a_nodes[i]->b[0]->p_lk_tip_r); /* Init_Tips_At_One_Site_AA_Int(tree->data->c_seq[i]->state[curr_site], */ /* curr_site*dim1, */ /* tree->a_nodes[i]->b[0]->p_lk_tip_r); */ else if (tree->io->datatype == GENERIC) { Init_Tips_At_One_Site_Generic_Float( tree->a_nodes[i]->c_seq->state + curr_site * tree->mod->io->state_len, tree->mod->ns, tree->mod->io->state_len, curr_site * dim1, tree->a_nodes[i]->b[0]->p_lk_tip_r); /* Init_Tips_At_One_Site_Generic_Int(tree->data->c_seq[i]->state+curr_site*tree->mod->io->state_len, */ /* tree->mod->ns, */ /* tree->mod->io->state_len, */ /* curr_site*dim1, */ /* tree->a_nodes[i]->b[0]->p_lk_tip_r); */ } #ifdef BEAGLE // Recall that tip partials are stored on the branch leading // to the tip, rather than on the tip itself (hence `p_lk_tip_idx` // is a field of the branch (i.e. b[0]) rather than the node. // Secondly, the BEAGLE's partial buffers are laid out as // BEAGLE's partials buffer = [ tax1, tax2, ..., taxN, b1Left, b2Left, // b3Left,...,bMLeft, b1Rght, b2Rght, b3Rght,...,bMRght] (N taxa, M // branches) tree->a_nodes[i]->b[0]->p_lk_tip_idx = i; #endif } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_PMat_At_Given_Edge(t_edge *b_fcus, t_tree *tree) { int i; phydbl len; phydbl l_min, l_max; phydbl mean, var; assert(b_fcus); assert(tree); assert(tree->eval_alnL == YES); if(tree->is_mixt_tree == YES) { MIXT_Update_PMat_At_Given_Edge(b_fcus,tree); return; } if(b_fcus->Pij_rr == NULL) { PhyML_Printf("\n. b_fcus is e_root ? %d node left: %d node rght: %d left is root ? %d right is root ? %d [%p] [%d] [%d]", (b_fcus == tree->e_root) ? 1 : 0, b_fcus->left->num, b_fcus->rght->num, (b_fcus->left == tree->n_root) ? 1 : 0, (b_fcus->rght == tree->n_root) ? 1 : 0, tree->aux_tree, tree->eval_alnL, tree->is_mixt_tree); assert(false); } if(tree->mixt_tree != NULL) assert(tree->mod->ras->n_catg == 1); if(tree->mod->gamma_mgf_bl == YES) Set_Br_Len_Var(b_fcus,tree); l_min = tree->mod->l_min; l_max = tree->mod->l_max; len = -1.0; if(tree->mod->log_l == YES) b_fcus->l->v = exp(b_fcus->l->v); for(i=0;imod->ras->n_catg;i++) { if(tree->mod->ras->skip_rate_cat[i] == YES) continue; //Update the branch length if(b_fcus->has_zero_br_len == YES) { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif len = -1.0; mean = -1.0; var = -1.0; } else { len = MAX(0.0,b_fcus->l->v)*tree->mod->ras->gamma_rr->v[i];//branch_len * rate len *= tree->mod->br_len_mult->v; if(tree->mixt_tree) len *= tree->mixt_tree->mod->ras->gamma_rr->v[tree->mod->ras->parent_class_number]; if(len < l_min) len = l_min; else if(len > l_max) len = l_max; mean = len; /* var = MAX(0.0,b_fcus->l_var->v) * POW(tree->mod->ras->gamma_rr->v[i]*tree->mod->br_len_mult->v,2); */ /* var = tree->mod->l_var_sigma * POW(tree->mod->ras->gamma_rr->v[i]*tree->mod->br_len_mult->v,2); */ var = MAX(0.0,b_fcus->l->v) * tree->mod->l_var_sigma->v * POW(tree->mod->ras->gamma_rr->v[i]*tree->mod->br_len_mult->v,2); if(tree->mixt_tree) var *= POW(tree->mixt_tree->mod->ras->gamma_rr->v[tree->mod->ras->parent_class_number],2); } //Update the transition prob. matrix if(tree->mod->gamma_mgf_bl == NO) { #ifdef BEAGLE assert(UNINITIALIZED != tree->mod->b_inst); #endif PMat(len,tree->mod,i*tree->mod->ns*tree->mod->ns,b_fcus->Pij_rr,b_fcus->tPij_rr); } else { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif PMat_MGF_Gamma(mean,var,tree->mod,i*tree->mod->ns*tree->mod->ns,b_fcus->Pij_rr,b_fcus->tPij_rr); } } #ifdef BEAGLE int whichmodel = tree->mod->whichmodel; //Only for some models we use Beagle to compute/update the P-matrices, for other models //we compute them in PhyML and explicitly set the P-matrices in BEAGLE if((tree->mod->io->datatype == AA || whichmodel==GTR || whichmodel==CUSTOM) && tree->mod->use_m4mod == NO) { if(b_fcus->has_zero_br_len == YES) Warn_And_Exit(TODO_BEAGLE); // update_beagle_eigen(tree->mod); update_beagle_ras(tree->mod); // len = MAX(0.0, b_fcus->l->v) * tree->mod->br_len_mult->v; int p_matrices[1] = b_fcus->Pij_rr_idx; double branch_lens[1] = len; int ret = beagleUpdateTransitionMatrices(tree->b_inst,0,p_matrices,NULL,NULL,branch_lens,1); if(ret<0) { PhyML_Fprintf(stderr, "beagleUpdateTransitionMatrices() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } //Retrieve a "local" copy of the P-matrix ret = beagleGetTransitionMatrix(tree->b_inst, b_fcus->Pij_rr_idx, b_fcus->Pij_rr); if(ret<0) { PhyML_Fprintf(stderr, "beagleGetTransitionMatrix() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } } else { int ret = beagleSetTransitionMatrix(tree->b_inst, b_fcus->Pij_rr_idx, b_fcus->Pij_rr, -1); if(ret<0) { PhyML_Fprintf(stderr, "beagleSetTransitionMatrix() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } } #endif if(tree->mod->log_l == YES) b_fcus->l->v = log(b_fcus->l->v); // Print_Model(tree->mod); // Dump_Arr_D(tree->cur_site_lk, tree->n_pattern); // Print_Edge_PMats(tree, b_fcus); // Print_Edge_Likelihoods(tree,b_fcus,true); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Partial_Lk_Along_A_Path(t_node **path, int path_length, t_tree *tree) { int i,j; for(i=0;iv[j] == path[i+1]) { if(path[i] == path[i]->b[j]->left) { Update_Partial_Lk(tree,path[i]->b[j],path[i]->b[j]->left); } else if(path[i] == path[i]->b[j]->rght) { Update_Partial_Lk(tree,path[i]->b[j],path[i]->b[j]->rght); } else { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d. \n",__FILE__,__LINE__); assert(FALSE); } break; } #ifdef DEBUG if(j == 3) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d.\n",__FILE__,__LINE__); assert(FALSE); } #endif } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Dist(phydbl *F, phydbl dist, t_mod *mod) { int i,j,k; phydbl lnL,len; int dim1,dim2; phydbl pi, pijk; // Compute likelihood of the model made of the // first class of the mixture. /* if(mod->is_mixt_mod == YES) mod = mod->next; */ /* assert(mod); */ if(mod->log_l == YES) dist = exp(dist); for(k=0;kras->n_catg;k++) { len = dist*mod->ras->gamma_rr->v[k]; if(len < mod->l_min) len = mod->l_min; else if(len > mod->l_max) len = mod->l_max; PMat(len,mod,mod->ns*mod->ns*k,mod->Pij_rr->v,NULL); /* PhyML_Printf("\n. p: %g len: %g",mod->Pij_rr->v[0],len); */ } dim1 = mod->ns*mod->ns; dim2 = mod->ns; lnL = .0; pi = -1.; pijk = -1.; for(i=0;ins-1;i++) { pi = mod->e_frq->pi->v[i]; for(j=i+1;jns;j++) { for(k=0;kras->n_catg;k++) { pijk = mod->Pij_rr->v[dim1*k+dim2*i+j]; lnL += (F[dim1*k+dim2*i+j] + F[dim1*k+dim2*j+i]) * log(pi * pijk); /* PhyML_Printf("\n. pijk: %g lnL: %g",pijk,lnL); */ } } } for(i=0;ins;i++) { pi = mod->e_frq->pi->v[i]; for(k=0;kras->n_catg;k++) { pijk = mod->Pij_rr->v[dim1*k+dim2*i+i]; lnL += F[dim1*k+dim2*i+i]* log(pi * pijk); /* PhyML_Printf("\n. pijk: %g lnL: %g",pijk,lnL); */ } } return lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Update_Lk_At_Given_Edge(t_edge *b_fcus, t_tree *tree) { Update_Partial_Lk(tree,b_fcus,b_fcus->left); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); tree->c_lnL = Lk(b_fcus,tree); return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Partial_Lk_Loc(t_tree *tree) { int i,j; t_node *d; int *patt_id_d; if(tree->is_mixt_tree == YES) return; for(i=0;i<2*tree->n_otu-1;++i) { for(j=0;jdata->n_pattern;j++) { tree->a_edges[i]->p_lk_loc_left[j] = j; tree->a_edges[i]->p_lk_loc_rght[j] = j; } } for(i=0;in_otu;i++) { d = tree->a_nodes[i]; patt_id_d = (d == d->b[0]->left)?(d->b[0]->patt_id_left):(d->b[0]->patt_id_rght); for(j=0;jdata->n_pattern;j++) { assert(tree->a_nodes[d->num]->c_seq); patt_id_d[j] = (int)tree->a_nodes[d->num]->c_seq->state[j]; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Normal_Approx(t_tree *tree) { phydbl lnL; int i; int dim; phydbl first_order; dim = 2*tree->n_otu-3; lnL = Dnorm_Multi_Given_InvCov_Det(tree->rates->u_cur_l, tree->rates->mean_l, tree->rates->invcov, tree->rates->covdet, 2*tree->n_otu-3,YES); first_order = 0.0; for(i=0;irates->u_cur_l[i] - tree->rates->mean_l[i]) * tree->rates->grad_l[i]; lnL += first_order; return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Part_Lk_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree) { return -1.0; /* return PART_Lk_At_Given_Edge(b,stree);; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Part_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { return -1.0; /* return PART_Lk(stree); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { Lk(NULL,tree); return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined GEO) phydbl Wrap_Geo_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { TIPO_Lk(tree); return tree->geo_lnL; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Lk_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree) { Lk(b,tree); return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if(defined PHYREX || PHYTIME) phydbl Wrap_Lk_Rates(t_edge *b, t_tree *tree, supert_tree *stree) { RATES_Lk(tree); return tree->rates->c_lnL; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if(defined PHYREX || PHYTIME) phydbl Wrap_Lk_Times(t_edge *b, t_tree *tree, supert_tree *stree) { TIMES_Lk(tree); return tree->times->c_lnL; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Lk_Linreg(t_edge *b, t_tree *tree, supert_tree *stree) { /* RATES_Lk_Linreg(tree); */ return -1.; /* return tree->rates->c_lnL_linreg; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Diff_Lk_Norm_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree) { phydbl diff; diff = Diff_Lk_Norm_At_Given_Edge(b,tree); return(-diff); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Check_Lk_At_Given_Edge(int verbose, t_tree *tree) { int res; int i; phydbl *lk; lk = (phydbl *)mCalloc(2*tree->n_otu-3,sizeof(phydbl)); res = 0; for(i=0;i<2*tree->n_otu-3;++i) { lk[i] = Lk(tree->a_edges[i],tree); if(verbose == YES) PhyML_Printf("\n. Edge %3d %13G %f %13G", tree->a_edges[i]->num,tree->a_edges[i]->l->v,lk[i], tree->a_edges[i]->l_var->v); } if(tree->n_root && tree->ignore_root == NO) { Lk(tree->n_root->b[1],tree); if(verbose == YES) PhyML_Printf("\nx Edge %3d %13G %f %13G", tree->n_root->b[1]->num,tree->n_root->b[1]->l->v,tree->c_lnL, tree->n_root->b[1]->l_var->v ); Lk(tree->n_root->b[2],tree); if(verbose == YES) PhyML_Printf("\nx Edge %3d %13G %f %13G", tree->n_root->b[2]->num,tree->n_root->b[2]->l->v,tree->c_lnL, tree->n_root->b[2]->l_var->v ); } res=1; for(i=1;i<2*tree->n_otu-3;i++) { if(FABS(lk[i]-lk[i-1]) > 1.E-2) res=0; } Free(lk); return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Computes the value of fact_sum_scale, the part of the scaling factors // that is common to all classes of the mixture and scale the // likelihood for each mixture using the part of the scaling // factors that is class-specific void Pull_Scaling_Factors(int site, t_edge *b, t_tree *tree) { unsigned int catg; const unsigned int ncatg = tree->mod->ras->n_catg; if(tree->apply_lk_scaling == NO) { tree->fact_sum_scale[site] = 0; for(catg=0;catgunscaled_site_lk_cat[site*ncatg+catg] = tree->site_lk_cat[catg]; return; } else { switch(tree->scaling_method) { case SCALE_RATE_SPECIFIC : { int *sum_scale_left_cat,*sum_scale_rght_cat; int exponent; phydbl max_sum_scale,min_sum_scale; phydbl sum,tmp,dum; sum_scale_left_cat = b->sum_scale_left_cat; sum_scale_rght_cat = b->sum_scale_rght_cat; max_sum_scale = (phydbl)BIG; min_sum_scale = -(phydbl)BIG; for(catg=0;catgsum_scale_left)? (b->sum_scale_left[site*ncatg+catg]): (0.0); sum_scale_rght_cat[catg] = (b->sum_scale_rght)? (b->sum_scale_rght[site*ncatg+catg]): (0.0); sum = sum_scale_left_cat[catg] + sum_scale_rght_cat[catg]; if(sum < .0) { PhyML_Fprintf(stderr,"\n. tree: %s\n",Write_Tree(tree)); PhyML_Fprintf(stderr,"\n. b->num = %d sum = %G root ? %d",sum,b->num,b == tree->e_root); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d.\n",__FILE__,__LINE__); Exit("\n"); } dum = log(FABS(tree->site_lk_cat[catg])); tmp = sum + ((phydbl)LOGBIG - dum)/(phydbl)LOG2; if(tmp < max_sum_scale) max_sum_scale = tmp; /* min of the maxs */ tmp = sum + ((phydbl)LOGSMALL - dum)/(phydbl)LOG2; if(tmp > min_sum_scale) min_sum_scale = tmp; /* max of the mins */ assert(isnan(tmp) == NO); } if(min_sum_scale > max_sum_scale) { #ifdef SAFEMODE PhyML_Printf("\n. Numerical precision issue alert."); PhyML_Printf("\n. min_sum_scale = %G max_sum_scale = %G",min_sum_scale,max_sum_scale); #endif min_sum_scale = max_sum_scale; } tree->fact_sum_scale[site] = (int)((max_sum_scale + min_sum_scale) / 2); /* Apply scaling factors */ for(catg=0;catgfact_sum_scale[site]; Rate_Correction(exponent,tree->site_lk_cat + catg); } break; } case SCALE_FAST : { int sum_scale_left,sum_scale_rght; sum_scale_left = (b->sum_scale_left)? (b->sum_scale_left[site]): (0.0); sum_scale_rght = (b->sum_scale_rght)? (b->sum_scale_rght[site]): (0.0); tree->fact_sum_scale[site] = sum_scale_left + sum_scale_rght; break; } default : { assert(FALSE); break; } } for(catg=0;catgunscaled_site_lk_cat[site*ncatg+catg] = tree->site_lk_cat[catg]; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Tree should be ready for likelihood analysis when calling // this function. void Stepwise_Add_Lk(t_tree *tree) { t_edge **residuals,**targets,*best_target; int *nd_idx,i,j,n_targets,*tg_idx,n_opt; residuals = (t_edge **)mCalloc(tree->n_otu-3,sizeof(t_edge *)); targets = (t_edge **)mCalloc(2*tree->n_otu-3,sizeof(t_edge *)); best_target = NULL; nd_idx = Permutate(tree->n_otu-3); // Remove all tips except that corresponding to a_nodes[0], // a_nodes[1] and a_nodes[2]. for(i=0;in_otu-3;i++) { Prune_Subtree(tree->a_nodes[i+3]->v[0], tree->a_nodes[i+3], NULL, residuals+i, tree); } // Initial targets n_targets = 3; for(i=0;ia_nodes[i]->b[0]; // Regraft each tip on the tree at most parsimonious position for(i=0;in_otu-3;i++) { Set_Both_Sides(YES,tree); Lk(NULL,tree); printf("\n. [%d/%d]",i,tree->n_otu-3); tree->best_lnL = UNLIKELY; best_target = NULL; tg_idx = Permutate(n_targets); for(j=0;ja_nodes[nd_idx[i]+3]->v[0], NULL, residuals[i], NULL, tree); Update_PMat_At_Given_Edge(targets[tg_idx[j]],tree); Update_PMat_At_Given_Edge(tree->a_nodes[nd_idx[i]+3]->b[0],tree); Update_Partial_Lk(tree,residuals[i],tree->a_nodes[nd_idx[i]+3]->v[0]); Lk(residuals[i],tree); if(tree->c_lnL > tree->best_lnL) { tree->best_lnL = tree->c_lnL; best_target = targets[tg_idx[j]]; } Prune_Subtree(tree->a_nodes[nd_idx[i]+3]->v[0], tree->a_nodes[nd_idx[i]+3], NULL, residuals+i, tree); } assert(best_target); Graft_Subtree(best_target, tree->a_nodes[nd_idx[i]+3]->v[0], NULL, residuals[i], NULL, tree); n_opt = 0; do Optimize_Br_Len_Serie (2,tree); while(n_opt++ < 3); targets[n_targets] = residuals[i]; targets[n_targets+1] = tree->a_nodes[nd_idx[i]+3]->b[0]; Free(tg_idx); n_targets+=2; } Round_Optimize(tree,5); PhyML_Fprintf(stderr,"\n. lk: %f",tree->c_lnL); Exit("\n"); Free(nd_idx); Free(residuals); Free(targets); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* | | |b | |d / \ / \ / \ / \ /v1 \v2 Set p_lk and sum_scale for subtrees with d, v1 and v2 as root, Pij for edges b, and the two edges connecting d to v1 and d to v2; Account for rooted trees. */ void Set_All_Partial_Lk(t_node **n_v1, t_node **n_v2, phydbl **p_lk, int **sum_scale, int **p_lk_loc, phydbl **Pij1, phydbl **tPij1, phydbl **p_lk_v1, int **sum_scale_v1, phydbl **Pij2, phydbl **tPij2, phydbl **p_lk_v2, int **sum_scale_v2, t_node *d, t_edge *b, t_tree *tree #ifdef BEAGLE , int *dest_p_idx, int *child1_p_idx, int* child2_p_idx, int* Pij1_idx, int* Pij2_idx #endif ) { unsigned int i; assert(tree->is_mixt_tree == NO); assert(d->tax == NO); if(tree->n_root == NULL || tree->ignore_root == YES) { /* Does d lie on the "left" or "right" of the branch? */ if(d == b->left) { *p_lk = b->p_lk_left; *sum_scale = b->sum_scale_left; #ifdef BEAGLE *dest_p_idx = b->p_lk_left_idx; #endif } else { *p_lk = b->p_lk_rght; *sum_scale = b->sum_scale_rght; #ifdef BEAGLE *dest_p_idx = b->p_lk_rght_idx; #endif } *n_v1 = *n_v2 = NULL; for(i=0;i<3;++i) { if(d->b[i] != b) { if(!(*n_v1)) { *n_v1 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree,child1_p_idx,Pij1_idx); #else Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree); #endif } else if(!(*n_v2)) { *n_v2 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree,child2_p_idx,Pij2_idx); #else Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree); #endif } else { PhyML_Printf("\n. Issue detected with node %d.\n",d->num); assert(FALSE); } } } } else { if(b == tree->e_root) { if(d == tree->n_root->v[1]) b = tree->n_root->b[1]; else if(d == tree->n_root->v[2]) b = tree->n_root->b[2]; else assert(FALSE); } if(d == tree->n_root) { if(b == tree->n_root->b[1]) { *p_lk = tree->n_root->b[1]->p_lk_left; *sum_scale = tree->n_root->b[1]->sum_scale_left; #ifdef BEAGLE *dest_p_idx = tree->n_root->b[1]->p_lk_left_idx; #endif } else { *p_lk = tree->n_root->b[2]->p_lk_left; *sum_scale = tree->n_root->b[2]->sum_scale_left; #ifdef BEAGLE *dest_p_idx = tree->n_root->b[2]->p_lk_left_idx; #endif } *n_v1 = NULL; *Pij1 = NULL; *tPij1 = NULL; *p_lk_v1 = NULL; *sum_scale_v1 = NULL; if(b == tree->n_root->b[1]) { *n_v2 = tree->n_root->v[2]; *Pij2 = tree->n_root->b[2]->Pij_rr; *tPij2 = tree->n_root->b[2]->tPij_rr; *p_lk_v2 = tree->n_root->b[2]->p_lk_rght; *sum_scale_v2 = tree->n_root->b[2]->sum_scale_rght; #ifdef BEAGLE *child2_p_idx = tree->n_root->b[2]->p_lk_rght_idx; *Pij2_idx = tree->n_root->b[2]->Pij_rr_idx; #endif } else if(b == tree->n_root->b[2]) { *n_v2 = tree->n_root->v[1]; *Pij2 = tree->n_root->b[1]->Pij_rr; *tPij2 = tree->n_root->b[1]->tPij_rr; *p_lk_v2 = tree->n_root->b[1]->p_lk_rght; *sum_scale_v2 = tree->n_root->b[1]->sum_scale_rght; #ifdef BEAGLE *child2_p_idx = tree->n_root->b[1]->p_lk_rght_idx; *Pij2_idx = tree->n_root->b[1]->Pij_rr_idx; #endif } else assert(FALSE); } else if(d == tree->n_root->v[1] || d == tree->n_root->v[2]) { if(b == tree->n_root->b[1] || b == tree->n_root->b[2]) { if(b == tree->n_root->b[1]) { *p_lk = tree->n_root->b[1]->p_lk_rght; *sum_scale = tree->n_root->b[1]->sum_scale_rght; #ifdef BEAGLE *dest_p_idx = tree->n_root->b[1]->p_lk_rght_idx; #endif } else { *p_lk = tree->n_root->b[2]->p_lk_rght; *sum_scale = tree->n_root->b[2]->sum_scale_rght; #ifdef BEAGLE *dest_p_idx = tree->n_root->b[2]->p_lk_rght_idx; #endif } *n_v1 = *n_v2 = NULL; for(i=0;i<3;++i) { if(d->b[i] != tree->e_root) { if(!(*n_v1)) { *n_v1 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree,child1_p_idx,Pij1_idx); #else Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree); #endif } else { *n_v2 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree,child2_p_idx,Pij2_idx); #else Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree); #endif } } } } else { if(d == b->left) { *p_lk = b->p_lk_left; *sum_scale = b->sum_scale_left; *p_lk_loc = b->p_lk_loc_left; #ifdef BEAGLE *dest_p_idx = b->p_lk_left_idx; #endif } else { *p_lk = b->p_lk_rght; *sum_scale = b->sum_scale_rght; *p_lk_loc = b->p_lk_loc_rght; #ifdef BEAGLE *dest_p_idx = b->p_lk_rght_idx; #endif } *n_v1 = tree->n_root; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d, (d == tree->n_root->v[1])? (tree->n_root->b[1]): (tree->n_root->b[2]), tree,child1_p_idx,Pij1_idx); #else Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d, (d == tree->n_root->v[1])? (tree->n_root->b[1]): (tree->n_root->b[2]), tree); #endif for(i=0;i<3;i++) { if(d->b[i] != tree->e_root && d->b[i] != b) { *n_v2 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree,child2_p_idx,Pij2_idx); #else Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree); #endif break; } } } } else { if(d == b->left) { *p_lk = b->p_lk_left; *sum_scale = b->sum_scale_left; *p_lk_loc = b->p_lk_loc_left; #ifdef BEAGLE *dest_p_idx = b->p_lk_left_idx; #endif } else { *p_lk = b->p_lk_rght; *sum_scale = b->sum_scale_rght; *p_lk_loc = b->p_lk_loc_rght; #ifdef BEAGLE *dest_p_idx = b->p_lk_rght_idx; #endif } *n_v1 = *n_v2 = NULL; for(i=0;i<3;i++) { if(d->b[i] != b) { if(!(*n_v1)) { *n_v1 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree,child1_p_idx,Pij1_idx); #else Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree); #endif } else { *n_v2 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree,child2_p_idx,Pij2_idx); #else Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree); #endif } } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* | | |d / \ / \ / \b / \ / \x (either n_v1 or n_v2) Returns p_lk and sum_scale for subtree with x as root, Pij for edge b */ void Set_Partial_Lk_One_Side(phydbl **Pij, phydbl **tPij, phydbl **p_lk, int **sum_scale, t_node *d, t_edge *b, t_tree *tree #ifdef BEAGLE , int* child_p_idx, int* Pij_idx #endif ) { if(Pij != NULL) { *Pij = b->Pij_rr; *tPij = b->tPij_rr; #ifdef BEAGLE *Pij_idx = b->Pij_rr_idx; #endif } if(d->tax == NO) { if(d == b->left) // if d is on the left of b, then d's neighbor is on the right { *p_lk = (b->rght->tax == YES) ? b->p_lk_tip_r : b->p_lk_rght; *sum_scale = b->sum_scale_rght; #ifdef BEAGLE *child_p_idx = b->rght->tax? b->p_lk_tip_idx: b->p_lk_rght_idx; #endif if(*p_lk == NULL) PhyML_Printf("\n. b:%d b->left:%d b->rght:%d d:%d", b->num, b->left->num, b->rght->num, d->num); assert(*p_lk); } else { *p_lk = b->p_lk_left; *sum_scale = b->sum_scale_left; #ifdef BEAGLE *child_p_idx = b->rght->tax? b->p_lk_tip_idx: b->p_lk_left_idx; #endif if(*p_lk == NULL) PhyML_Printf("\n. b:%d b->left:%d b->rght:%d d:%d", b->num, b->left->num, b->rght->num, d->num); assert(*p_lk); } } else { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif *p_lk = NULL; *sum_scale = NULL; PhyML_Printf("\n. WARNING. p_lk set to NULL. d->num: %d b->num: %d",d->num,b->num); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Switch_Partial_Lk_Post(t_node *a, t_node *d, t_edge *b, short int yesno, t_tree *tree) { if(a == tree->n_root) assert(FALSE); if(d->tax == NO) { int i; for(i=0;i<3;++i) if(d->v[i] != a) Switch_Partial_Lk_Post(d,d->v[i],d->b[i],yesno,tree); } if(b->left == d) b->update_partial_lk_left = yesno; else if(b->rght == d) b->update_partial_lk_rght = yesno; else assert(FALSE); return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Switch_Partial_Lk_Pre(t_node *a, t_node *d, t_edge *b, short int yesno, t_tree *tree) { if(a == tree->n_root) assert(FALSE); if(d->tax == YES) return; else { int i; for(i=0;i<3;++i) { if(d->v[i] != a) { if(d->b[i]->left == d) d->b[i]->update_partial_lk_left = yesno; else if(d->b[i]->rght == d) d->b[i]->update_partial_lk_rght = yesno; else assert(FALSE); } } for(i=0;i<3;++i) if(d->v[i] != a) Switch_Partial_Lk_Pre(d,d->v[i],d->b[i],yesno,tree); } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Partial_Lk_Inin(const phydbl *Pij1, const phydbl *plk1, const phydbl *Pij2, const phydbl *plk2, const int ns, phydbl *plk0) { unsigned int i,j; assert(plk0); assert(plk1); assert(plk2); assert(Pij1); assert(Pij2); for(i=0;i 1.0 || plk1[i] < 1.0 || plk2[i] > 1.0 || plk2[i] < 1.0) break; if(i != ns) { for(i=0;i= 0); assert(state2 >= 0); assert(Pij1); assert(Pij2); assert(plk0); for(i=0;i= 0); assert(Pij1); assert(Pij2); assert(plk0); assert(plk2); for(i=0;icontmod->mu_up[d->num]; mu_down = tree->contmod->mu_down[d->num]; var_up = tree->contmod->var_up[d->num]; var_down = tree->contmod->var_down[d->num]; var_zd = log_var_multiplier; var_za = var_zd; var_za += log(t_za); var_za = exp(var_za); if(t_zd > SMALL) { var_zd += log(t_zd); var_zd = exp(var_zd); } else { var_zd = 0.0; } if(!(var_zd+var_za+var_up+var_down > 0.0)) { PhyML_Printf("\n. a: %d d: %d t_za: %f t_zd: %f var_up: %f var_down = %f var_zd = %f var_za = %f", a->num,d->num, t_za,t_zd, var_up,var_down, var_zd,var_za); } assert(var_zd+var_za+var_up+var_down > 0.0); mean = (mu_down*(var_za+var_up) + mu_up*(var_zd+var_down))/(var_zd+var_za+var_up+var_down); sd = sqrt((var_za+var_up)*(var_zd+var_down)/(var_za+var_zd+var_up+var_down)); if(print == YES) { PhyML_Printf("\n. log_var_multiplier: %f mu_up: %f mu_down: %f var_up: %f var_down: %f mean: %f sd: %f", log_var_multiplier, mu_up,mu_down, var_up,var_down, mean,sd); } assert(isnan(sd) == NO && isinf(sd) == NO); assert(isnan(mean) == NO && isinf(mean) == NO); return(Rnorm(mean,sd)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/lk.h000066400000000000000000000201161501136442400177500ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef LK_H #define LK_H #include "utilities.h" #include "optimiz.h" #include "models.h" #include "free.h" #include "times.h" #include "mixt.h" #include "avx.h" #include "sse.h" void Update_All_Partial_Lk(t_tree *tree); void Init_Tips_At_One_Site_Nucleotides_Float(char state, int pos, phydbl *p_lk); void Init_Tips_At_One_Site_AA_Float(char aa, int pos, phydbl *p_lk); void Get_All_Partial_Lk(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); void Get_All_Partial_Lk_Scale(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); void Post_Order_Lk(t_node *pere, t_node *fils, t_tree *tree); void Pre_Order_Lk(t_node *pere, t_node *fils, t_tree *tree); phydbl Lk(t_edge *b, t_tree *tree); void Site_Lk(t_tree *tree); phydbl Return_Abs_Lk(t_tree *tree); matrix *ML_Dist(calign *data, t_mod *mod); phydbl Lk_Given_Two_Seq(calign *data, int numseq1, int numseq2, phydbl dist, t_mod *mod, phydbl *loglk); void Unconstraint_Lk(t_tree *tree); void Update_Partial_Lk(t_tree *tree, t_edge *b_fcus, t_node *n); void Update_Partial_Lk_Generic(t_tree *tree, t_edge *b_fcus, t_node *n); void Init_Partial_Lk_Tips_Double(t_tree *tree); void Init_Partial_Lk_Tips_Int(t_tree *tree); void Init_Partial_Lk_Tips_Double_One_Character(int node_idx, int curr_site, t_tree *tree); void Init_Partial_Lk_Tips_Double_One_Site(int site, t_tree *tree); void Init_Partial_Lk_At_One_Node(t_node *a, t_tree *tree); void Update_PMat_At_Given_Edge(t_edge *b_fcus, t_tree *tree); void Sort_Sites_Based_On_Lk(t_tree *tree); void Get_Partial_Lk_Scale(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); void Get_Partial_Lk(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); void Init_Tips_At_One_Site_Nucleotides_Int(char state, int pos, short int *p_pars); void Init_Tips_At_One_Site_AA_Int(char aa, int pos, short int *p_pars); void Update_Partial_Lk_Along_A_Path(t_node **path, int path_length, t_tree *tree); phydbl Lk_Dist(phydbl *F, phydbl dist, t_mod *mod); phydbl Update_Lk_At_Given_Edge(t_edge *b_fcus, t_tree *tree); void Update_Partial_Lk_Greedy(t_tree *tree, t_edge *b_fcus, t_node *n); void Get_All_Partial_Lk_Scale_Greedy(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); phydbl Lk_Triplet(t_node *a, t_node *d, t_tree *tree); phydbl *Post_Prob_Rates_At_Given_Edge(t_edge *b, phydbl *post_prob, t_tree *tree); phydbl Lk_With_MAP_Branch_Rates(t_tree *tree); void Init_Tips_At_One_Site_Generic_Int(char *state, int ns, int state_len, int pos, short int *p_pars); void Init_Tips_At_One_Site_Generic_Float(char *state, int ns, int state_len, int pos, phydbl *p_lk); void Backup_Partial_Lk(t_node *d, t_edge *b, t_tree *tree); void Restore_Partial_Lk(t_node *d, t_edge *b, t_tree *tree); void Backup_Partial_Scale(t_node *d, t_edge *b, t_tree *tree); void Restore_Partial_Scale(t_node *d, t_edge *b, t_tree *tree); void Init_Partial_Lk_Loc(t_tree *tree); phydbl Lk_Normal_Approx(t_tree *tree); phydbl Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Lk_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Part_Lk_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Part_Lk(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Geo_Lk(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Diff_Lk_Norm_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Lk_Rates(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Lk_Linreg(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Lk_Times(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Lk_LastFirst(t_tree *tree); int Check_Lk_At_Given_Edge(int verbose, t_tree *tree); void Stepwise_Add_Lk(t_tree *tree); void Update_Eigen_Lr(t_edge *b, t_tree *tree); phydbl dLk(phydbl *l, t_edge *b, t_tree *tree); phydbl Lk_Core(int state, int ambiguity_check, phydbl *p_lk_left, phydbl *p_lk_rght, phydbl *Pij_rr, phydbl *tPij_rr, t_edge *b, t_tree *tree); /* void Lk_dLk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, phydbl * *lk, phydbl *dlk, t_tree *tree); */ phydbl Lk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, t_tree *tree); phydbl Invariant_Lk(int fact_sum_scale, int site, int *num_prec_issue, t_tree *tree); void Composite_Lk(t_tree *tree); int Sample_Ancestral_Seq_Core(t_node *a, t_node *d, t_edge *b, int r_cat, int site, t_tree *tree); void Default_Update_Partial_Lk(t_tree *tree, t_edge *b, t_node *d); void Lk_dLk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, phydbl *lk, phydbl *dlk, t_tree *tree); void Lk_dLk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, unsigned int ns, phydbl *lk, phydbl *dlk); phydbl Lk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, int ns); void Core_Default_Update_Partial_Lk( const t_node *n_v1, const t_node *n_v2, phydbl *plk0, const phydbl *plk1, const phydbl *plk2, const phydbl *Pij1, const phydbl *Pij2, int *sum_scale0, const int *sum_scale1, const int *sum_scale2, const int ns, const int ncatg, const int npatterns, const int apply_scaling, const phydbl *wght); /* phydbl Lk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, int ns); */ /* void Lk_dLk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, unsigned * int ns, phydbl *lk, phydbl *dlk); */ phydbl Lk_Core_One_Class_No_Eigen_Lr(phydbl *p_lk_left, phydbl *p_lk_rght, phydbl *Pij, phydbl *pi, int ns, int ambiguity_check, int state); void Pull_Scaling_Factors(int site, t_edge *b, t_tree *tree); void Set_All_Partial_Lk(t_node **n_v1, t_node **n_v2, phydbl **p_lk, int **sum_scale, int **p_lk_loc, phydbl **Pij1, phydbl **tPij1, phydbl **p_lk_v1, int **sum_scale_v1, phydbl **Pij2, phydbl **tPij2, phydbl **p_lk_v2, int **sum_scale_v2, t_node *d, t_edge *b, t_tree *tree #ifdef BEAGLE , int *dest_p_idx, int *child1_p_idx, int *child2_p_idx, int *Pij1_idx, int *Pij2_idx #endif ); void Set_Partial_Lk_One_Side(phydbl **Pij, phydbl **tPij, phydbl **p_lk, int **sum_scale, t_node *d, t_edge *b, t_tree *tree #ifdef BEAGLE , int *child_p_idx, int *Pij_idx #endif ); void Rate_Correction(int exponent, phydbl *site_lk_cat); void Switch_Partial_Lk_Pre(t_node *a, t_node *d, t_edge *b, short int yesno, t_tree *tree); void Switch_Partial_Lk_Post(t_node *a, t_node *d, t_edge *b, short int yesno, t_tree *tree); void Partial_Lk_Inin(const phydbl *Pij1, const phydbl *plk1, const phydbl *Pij2, const phydbl *plk2, const int ns, phydbl *plk0); void Partial_Lk_Exex(const phydbl *Pij1, const int state1, const phydbl *Pij2, const int state2, const int ns, phydbl *plk0); void Partial_Lk_Exin(const phydbl *Pij1, const int state1, const phydbl *Pij2, const phydbl *plk2, const int ns, phydbl *plk0); phydbl Sample_Ancestral_Trait_Contmod(t_node *a, t_node *d, phydbl t_za, phydbl t_zd, phydbl log_var_multiplier, int print, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/location.c000066400000000000000000000242061501136442400211510ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines that implement the spatial part of Etheridge and Barton's model of continuous-space coalescent and other models of migration/spatial dispersion. */ #include "location.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if(defined PHYREX || PHYREXSIM || TEST) phydbl LOCATION_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { return(LOCATION_Lk(NULL,tree)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Wrap_Prior(t_edge *b, t_tree *tree, supert_tree *stree) { return(LOCATION_Prior(tree)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Lk(t_node *z, t_tree *tree) { phydbl lnL; lnL = UNLIKELY; if(tree->mmod->use_locations == NO) { tree->mmod->c_lnL = 0.0; return(tree->mmod->c_lnL); } switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { lnL = SLFV_Lk_Gaussian(tree); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RRW_GAMMA : case RRW_LOGNORMAL : case RW : { lnL = RRW_Lk(tree); break; } case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { lnL = VELOC_Lk(z,tree); break; } default : assert(false); } if(isinf(lnL) || isnan(lnL)) lnL = UNLIKELY; tree->mmod->c_lnL = lnL; return(tree->mmod->c_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void LOCATION_Update_Lk_Down(t_node *a, t_node *d, t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { assert(false); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RRW_GAMMA : case RRW_LOGNORMAL : case RW : { RRW_Update_Lk_Location_Down(a,d,tree); break; } case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { VELOC_Update_Lk_Velocity_Down(a,d,tree); VELOC_Update_Lk_Location_Down(a,d,tree); break; } default : assert(false); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void LOCATION_Update_Lk_Up(t_node *a, t_node *d, t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { assert(false); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RRW_GAMMA : case RRW_LOGNORMAL : case RW : { RRW_Update_Lk_Location_Up(a,d,tree); break; } case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { VELOC_Update_Lk_Velocity_Up(a,d,tree); VELOC_Update_Lk_Location_Up(a,d,tree); break; } default : assert(false); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Prior(t_tree *tree) { phydbl lnP; lnP = 0.0; if(tree->mmod->use_locations == NO) { tree->mmod->c_lnL = 0.0; return(tree->mmod->c_lnL); } switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { lnP = UNLIKELY; break; } case SLFV_UNIFORM : { lnP = UNLIKELY; break; } case RRW_GAMMA : case RRW_LOGNORMAL : case RIBM : { lnP = RRW_Prior(tree); break; } case RW : { lnP = RW_Prior(tree); break; } case IBM : { lnP = IBM_Prior(tree); break; } case IWNc : case IWNu : case RIWNc : case RIWNu : { lnP = IWN_Prior(tree); break; } case IOU : { lnP = IOU_Prior(tree); break; } default : assert(false); } if(isinf(lnP) || isnan(lnP)) lnP = UNLIKELY; tree->mmod->c_lnP = lnP; return(tree->mmod->c_lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree) { if(tree->mmod->use_locations == NO) return(0.0); switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { return(SLFV_Lk_Gaussian_Range(young,old,tree)); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { return(RRW_Lk_Range(young,old,tree)); break; } default : assert(FALSE); } return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Lk_Path(t_dsk *young, t_dsk *old, t_tree *tree) { if(tree->mmod->use_locations == NO) return(0.0); switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { return(SLFV_Lk_Gaussian_Range(young,old,tree)); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { return(RRW_Forward_Lk_Path(old->ldsk,young->ldsk,tree)); break; } default : assert(FALSE); } return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Forward_Lk_Path(t_ldsk *a, t_ldsk *d, t_tree *tree) { phydbl lnL; lnL = UNLIKELY; switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { assert(false); break; } case SLFV_UNIFORM : { assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { lnL = RRW_Forward_Lk_Path(a,d,tree); break; } default : assert(FALSE); } return lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Lk_Core(t_dsk *disk, t_tree *tree) { phydbl lnL; switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { lnL = SLFV_Lk_Gaussian_Core(disk,tree); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { lnL = RRW_Lk_Core(disk,tree); break; } default : assert(FALSE); } return lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void LOCATION_Sample_Path(t_ldsk *young, t_ldsk *old, phydbl *sd, phydbl *global_hr, t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { SLFV_Sample_Path(young,old,sd,global_hr,tree); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { assert(false); break; } default : assert(FALSE); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *LOCATION_Model_Id(t_phyrex_mod *mmod) { char *s; s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); strcpy(s,"none"); switch(mmod->model_id) { case SLFV_GAUSSIAN : { strcpy(s,"spatial coalescent (Gaussian)"); break; } case SLFV_UNIFORM : { strcpy(s,"spatial coalescent (Rectangle)"); break; } case RW : { strcpy(s,"strict random walk"); break; } case RRW_GAMMA : { strcpy(s,"relaxed random walk (Gamma)"); break; } case RRW_LOGNORMAL : { strcpy(s,"relaxed random walk (Lognormal)"); break; } case IBM : { strcpy(s,"integrated Brownian motion"); break; } case RIBM : { strcpy(s,"relaxed integrated Brownian motion"); break; } case IOU : { strcpy(s,"integrated Ornstein-Uhlenbeck"); break; } case IWNc : { strcpy(s,"integrated white noise (correlated)"); break; } case IWNu : { strcpy(s,"integrated white noise (uncorrelated)"); break; } case RIWNc : { strcpy(s,"integrated white noise (relaxed, correlated)"); break; } case RIWNu : { strcpy(s,"integrated white noise (relaxed, uncorrelated)"); break; } default : assert(FALSE); } return(s); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Mean_Lonlat(short int dim, t_tree *tree) { phydbl sum; int i; sum = 0.0; for(i=0;in_otu;++i) sum += tree->a_nodes[i]->ldsk->coord->lonlat[dim]; return(sum/tree->n_otu); } #endif stephaneguindon-phyml-76a39c8/src/location.h000066400000000000000000000022601501136442400211520ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef LOCATION_H #define LOCATION_H #include "utilities.h" phydbl LOCATION_Lk(t_node *z, t_tree *tree); phydbl LOCATION_Prior(t_tree *tree); phydbl LOCATION_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl LOCATION_Lk_Core(t_dsk *disk, t_tree *tree); void LOCATION_Sample_Path(t_ldsk *young, t_ldsk *old, phydbl *sd, phydbl *global_hr, t_tree *tree); phydbl LOCATION_Lk_Path(t_dsk *young, t_dsk *old, t_tree *tree); char *LOCATION_Model_Id(t_phyrex_mod *mmod); phydbl LOCATION_Forward_Lk_Path(t_ldsk *a, t_ldsk *d, t_tree *tree); phydbl LOCATION_Mean_Lonlat(short int dim, t_tree *tree); phydbl LOCATION_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree); phydbl LOCATION_Wrap_Prior(t_edge *b, t_tree *tree, supert_tree *stree); void LOCATION_Update_Lk_Down(t_node *a, t_node *d, t_tree *tree); void LOCATION_Update_Lk_Up(t_node *a, t_node *d, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/m4.c000066400000000000000000001502521501136442400176620ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines for Markov-Modulated Markov Models (M4) */ #include "m4.h" int M4_main(int argc, char **argv) { calign *cdata; option *io; t_tree *tree; int num_data_set; int num_tree, num_rand_tree; t_mod *mod; time_t t_beg, t_end; phydbl best_lnL; int r_seed; char *most_likely_tree = NULL; #ifdef MPI int rc; rc = MPI_Init(&argc, &argv); if (rc != MPI_SUCCESS) { PhyML_Printf("\n== Err. starting MPI program. Terminating.\n"); MPI_Abort(MPI_COMM_WORLD, rc); } MPI_Comm_size(MPI_COMM_WORLD, &Global_numTask); MPI_Comm_rank(MPI_COMM_WORLD, &Global_myRank); #endif #ifdef QUIET setvbuf(stdout, NULL, _IOFBF, 2048); #endif tree = NULL; mod = NULL; best_lnL = UNLIKELY; io = (option *)Get_Input(argc, argv); r_seed = (io->r_seed < 0) ? (time(NULL)) : (io->r_seed); srand(r_seed); io->r_seed = r_seed; if (io->in_tree == 2) Test_Multiple_Data_Set_Format(io); else io->n_trees = 1; if ((io->n_data_sets > 1) && (io->n_trees > 1)) { io->n_data_sets = MIN(io->n_trees, io->n_data_sets); io->n_trees = MIN(io->n_trees, io->n_data_sets); } for (num_data_set = 0; num_data_set < io->n_data_sets; num_data_set++) { best_lnL = UNLIKELY; Get_Seq(io); Make_Model_Complete(io->mod); Set_Model_Name(io->mod); Print_Settings(io); mod = io->mod; if (io->data) { if (io->n_data_sets > 1) PhyML_Printf("\n. Data set [#%d]\n", num_data_set + 1); cdata = Compact_Data(io->data, io); Free_Seq(io->data, cdata->n_otu); if (cdata) Check_Ambiguities(cdata, io->datatype, io->state_len); else { PhyML_Printf("\n== Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } for (num_tree = (io->n_trees == 1) ? (0) : (num_data_set); num_tree < io->n_trees; num_tree++) { if (!io->mod->s_opt->random_input_tree) io->mod->s_opt->n_rand_starts = 1; for (num_rand_tree = 0; num_rand_tree < io->mod->s_opt->n_rand_starts; num_rand_tree++) { if ((io->mod->s_opt->random_input_tree) && (io->mod->s_opt->topo_search != NNI_MOVE)) if (!io->quiet) PhyML_Printf("\n. [Random start %3d/%3d]\n", num_rand_tree + 1, io->mod->s_opt->n_rand_starts); Init_Model(cdata, mod, io); if (io->mod->use_m4mod) M4_Init_Model(mod->m4mod, cdata, mod); switch (io->in_tree) { case 0: case 1: { tree = Dist_And_BioNJ(cdata, mod, io); break; } case 2: { tree = Read_User_Tree(cdata, mod, io); break; } } if (!tree) continue; time(&t_beg); time(&(tree->t_beg)); tree->mod = mod; tree->io = io; tree->data = cdata; Set_Both_Sides(YES, tree); if (mod->s_opt->random_input_tree) Random_Tree(tree); if ((!num_data_set) && (!num_tree) && (!num_rand_tree)) Check_Memory_Amount(tree); Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Make_Spr(tree); if (io->do_alias_subpatt) { MIXT_Set_Alias_Subpatt(YES, tree); Lk(NULL, tree); MIXT_Set_Alias_Subpatt(NO, tree); } if (tree->mod->s_opt->opt_topo) { if (tree->mod->s_opt->topo_search == NNI_MOVE) Simu_Loop(tree); else if (tree->mod->s_opt->topo_search == SPR_MOVE) Global_Spr_Search(tree); else Best_Of_NNI_And_SPR(tree); } else { if (tree->mod->s_opt->opt_subst_param || tree->mod->s_opt->opt_bl_one_by_one) Round_Optimize(tree, ROUND_MAX); else Lk(NULL, tree); } Set_Both_Sides(YES, tree); Lk(NULL, tree); Pars(NULL, tree); Get_Tree_Size(tree); PhyML_Printf("\n. Log likelihood of the current tree: %f.\n", tree->c_lnL); Exit("\n"); /* */ M4_Compute_Proba_Hidden_States_On_Edges(tree); /* */ Get_Best_Root_Position(tree); /* Print the tree estimated using the current random (or BioNJ) * starting tree */ if (io->mod->s_opt->n_rand_starts > 1) { Br_Len_Involving_Invar(tree); Print_Tree(io->fp_out_trees, tree); fflush(NULL); } /* Record the most likely tree in a string of characters */ if (tree->c_lnL > best_lnL) { best_lnL = tree->c_lnL; Br_Len_Involving_Invar(tree); if (most_likely_tree) Free(most_likely_tree); most_likely_tree = Write_Tree(tree); Get_Tree_Size(tree); } /* JF(tree); */ time(&t_end); Print_Fp_Out(io->fp_out_stats, t_beg, t_end, tree, io, num_data_set + 1, (tree->mod->s_opt->n_rand_starts > 1) ? (num_rand_tree) : (num_tree), YES, io->precision); if (tree->io->print_site_lnl) Print_Site_Lk(tree, io->fp_out_lk); /* Start from BioNJ tree */ if ((num_rand_tree == io->mod->s_opt->n_rand_starts - 1) && (tree->mod->s_opt->random_input_tree)) { /* Do one more iteration in the loop, but don't randomize the tree */ num_rand_tree--; tree->mod->s_opt->random_input_tree = 0; } Free_Spr_List_One_Edge(tree); Free_One_Spr(tree->best_spr); if (tree->mat) Free_Mat(tree->mat); Free_Tree_Pars(tree); Free_Tree_Lk(tree); Free_Tree(tree); } /* Launch bootstrap analysis */ if (io->do_boot || io->do_tbe) { if (!io->quiet) PhyML_Printf( "\n. Launch bootstrap analysis on the most likely tree...\n"); #ifdef MPI MPI_Bcast(most_likely_tree, strlen(most_likely_tree) + 1, MPI_CHAR, 0, MPI_COMM_WORLD); if (!io->quiet) PhyML_Printf("\n. The bootstrap analysis will use %d CPUs.\n", Global_numTask); #endif most_likely_tree = Bootstrap_From_String(most_likely_tree, cdata, mod, io); } else if (io->ratio_test) { /* Launch aLRT */ if (!io->quiet) PhyML_Printf("\n. Compute aLRT branch supports on the most likely " "tree...\n"); most_likely_tree = aLRT_From_String(most_likely_tree, cdata, mod, io); } /* Print the most likely tree in the output file */ if (!io->quiet) PhyML_Printf("\n. Printing the most likely tree in file '%s'...\n", Basename(io->out_tree_file)); if (io->n_data_sets == 1) rewind(io->fp_out_tree); PhyML_Fprintf(io->fp_out_tree, "%s\n", most_likely_tree); if (io->n_trees > 1 && io->n_data_sets > 1) break; } Free_Calign(cdata); } else { PhyML_Printf("\n. No data was found.\n"); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } Free_Model_Complete(mod); } if (most_likely_tree) Free(most_likely_tree); if (mod->s_opt->n_rand_starts > 1) PhyML_Printf("\n. Best log likelihood: %f\n", best_lnL); Free_Optimiz(mod->s_opt); Free_Model_Basic(mod); if (io->fp_in_align) fclose(io->fp_in_align); if (io->fp_in_tree) fclose(io->fp_in_tree); if (io->fp_out_lk) fclose(io->fp_out_lk); if (io->fp_out_tree) fclose(io->fp_out_tree); if (io->fp_out_trees) fclose(io->fp_out_trees); if (io->fp_out_stats) fclose(io->fp_out_stats); Free_Input(io); time(&t_end); Print_Time_Info(t_beg, t_end); #ifdef MPI MPI_Finalize(); #endif return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Set_M4mod_Default(m4 *m4mod) { m4mod->use_cov_alpha = 1; m4mod->use_cov_alpha = 0; m4mod->n_h = 3; m4mod->n_o = 4; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Fill in the (big) rate matrix of the M4 t_mod */ void M4_Update_Qmat(m4 *m4mod, t_mod *mod) { int i, j; int n_s, n_o, n_h; phydbl mr, sum; /* The number of states in M4 models is the product of the number of hidden states (or classes) by the number of observable states */ n_s = mod->ns; n_o = m4mod->n_o; n_h = m4mod->n_h; /* Set the relative substitution rates */ if (mod->m4mod->use_cov_alpha) { DiscreteGamma(m4mod->h_fq->v, m4mod->multipl->v, m4mod->alpha->v, m4mod->alpha->v, m4mod->n_h, mod->ras->gamma_median); } else if (mod->m4mod->use_cov_free) { sum = .0; for (i = 0; i < mod->m4mod->n_h; i++) sum += FABS(mod->m4mod->h_fq_unscaled->v[i]); for (i = 0; i < mod->m4mod->n_h; i++) mod->m4mod->h_fq->v[i] = FABS(mod->m4mod->h_fq_unscaled->v[i]) / sum; do { sum = .0; for (i = 0; i < mod->m4mod->n_h; i++) { if (mod->m4mod->h_fq->v[i] < 0.01) mod->m4mod->h_fq->v[i] = 0.01; if (mod->m4mod->h_fq->v[i] > 0.99) mod->m4mod->h_fq->v[i] = 0.99; sum += mod->m4mod->h_fq->v[i]; } for (i = 0; i < mod->m4mod->n_h; i++) mod->m4mod->h_fq->v[i] /= sum; } while ((sum > 1.01) || (sum < 0.99)); /* Make sure the multipliers are centered on 1.0 */ sum = .0; for (i = 0; i < mod->m4mod->n_h; i++) sum += FABS(mod->m4mod->multipl_unscaled->v[i]) * mod->m4mod->h_fq->v[i]; for (i = 0; i < mod->m4mod->n_h; i++) mod->m4mod->multipl->v[i] = mod->m4mod->multipl_unscaled->v[i] / sum; /* printf("\n. WARNING\n"); */ /* mod->m4mod->h_fq[0] = 1./3; */ /* mod->m4mod->h_fq[1] = 1./3; */ /* mod->m4mod->h_fq[2] = 1./3; */ /* mod->m4mod->multipl[0] = 1.0; */ /* mod->m4mod->multipl[1] = 1.0; */ /* mod->m4mod->multipl[2] = 1.0; */ sum = 0; for (i = 0; i < mod->m4mod->n_h; i++) sum += mod->m4mod->multipl->v[i] * mod->m4mod->h_fq->v[i]; if (sum < 0.99 || sum > 1.01) { PhyML_Printf("\n. sum = %f", sum); PhyML_Printf("\n. Err in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit("\n"); } /* PhyML_Printf("\n__ "); */ /* for(i=0;im4mod->n_h;i++) PhyML_Printf("\n.%f %f %f", */ /* mod->m4mod->h_fq[i], */ /* mod->m4mod->h_fq_unscaled[i], */ /* mod->m4mod->multipl[i]); */ } /* PhyML_Printf("\n."); */ /* PhyML_Printf("\n. M4 model parameters"); */ /* m4mod->delta=.0; */ /* PhyML_Printf("\n. Delta = %f",m4mod->delta); */ /* for(i=0;im4mod->n_h;i++) PhyML_Printf("\n. multipl %d = * %f",i,m4mod->multipl[i]); */ /* for(i=0;im4mod->n_h;i++) PhyML_Printf("\n. fq %d = * %f",i,m4mod->h_fq[i]); */ /* Set up the stationary frequency vector */ for (i = 0; i < n_s; i++) mod->e_frq->pi->v[i] = m4mod->o_fq[i % n_o] * m4mod->h_fq->v[i / n_o]; if (mod->whichmodel != CUSTOM && mod->whichmodel != GTR && mod->io->datatype == NT) { phydbl kappa1, kappa2; if ((mod->whichmodel != F84) && (mod->whichmodel != TN93)) mod->lambda->v = 1.; else if (mod->whichmodel == F84) { mod->lambda->v = Get_Lambda_F84(mod->e_frq->pi->v, &(mod->kappa->v)); } kappa2 = mod->kappa->v * 2. / (1. + mod->lambda->v); kappa1 = kappa2 * mod->lambda->v; /* A <-> C */ m4mod->o_rr->v[0] = 1.0; /* A <-> G */ m4mod->o_rr->v[1] = kappa2; /* A <-> T */ m4mod->o_rr->v[2] = 1.0; /* C <-> G */ m4mod->o_rr->v[3] = 1.0; /* C <-> T */ m4mod->o_rr->v[4] = kappa1; } /* Fill in the matrices of nucleotide or amino-acid substitution rates here */ Update_Qmat_Generic(m4mod->o_rr->v, m4mod->o_fq, m4mod->n_o, m4mod->o_mats[0]); /* Print_Square_Matrix_Generic(n_o,m4mod->o_mats[0]); */ /* Multiply each of these matrices by a relative substitution rate */ for (i = 1; i < m4mod->n_h; i++) For(j, n_o * n_o) m4mod->o_mats[i][j] = m4mod->o_mats[0][j] * m4mod->multipl->v[i]; for (j = 0; j < n_o * n_o; ++j) m4mod->o_mats[0][j] *= m4mod->multipl->v[0]; for (i = 0; i < n_s * n_s; ++i) mod->r_mat->qmat->v[i] = .0; /* Diagonal blocks (i.e, nucleotide substitutions), symmetric */ for (i = 0; i < n_s; i++) { for (j = i + 1; j < n_s; j++) { if ((int)(j / n_o) == (int)(i / n_o)) { mod->r_mat->qmat->v[i * n_s + j] = m4mod->o_mats[(int)(i / n_o)][(i % n_o) * n_o + j % n_o]; mod->r_mat->qmat->v[j * n_s + i] = mod->r_mat->qmat->v[i * n_s + j] * m4mod->o_fq[i % n_o] / m4mod->o_fq[j % n_o]; } } } /* Work out scaling factor such that the expected number of observed state substitution along a branch of length 1 is 1.*/ mr = .0; for (i = 0; i < n_s; i++) { sum = .0; for (j = 0; j < n_s; j++) sum += mod->r_mat->qmat->v[i * n_s + j]; mr += sum * m4mod->o_fq[i % n_o] * m4mod->h_fq->v[(int)(i / n_o)]; } /* Scale the diagonal blocks */ For(i, n_s * n_s) mod->r_mat->qmat->v[i] /= mr; /* We are done with the diagonal blocks. Let's fill the non-diagonal ones now. */ /* Fill the matrix of substitution rate across classes (switches) here */ Update_Qmat_Generic(m4mod->h_rr, m4mod->h_fq->v, m4mod->n_h, m4mod->h_mat); /* Print_Square_Matrix_Generic(m4mod->n_h,m4mod->h_mat); */ /* Multiply this matrix by the switching rate */ For(i, n_h * n_h) m4mod->h_mat[i] *= m4mod->delta->v; /* Fill the non diagonal blocks */ for (i = 0; i < n_s; i++) { for (j = i + 1; j < n_s; j++) { if ((int)(j / n_o) != (int)(i / n_o)) { if (i % n_o == j % n_o) { mod->r_mat->qmat->v[i * n_s + j] = m4mod->h_mat[(int)(i / n_o) * n_h + (int)(j / n_o)]; mod->r_mat->qmat->v[j * n_s + i] = mod->r_mat->qmat->v[i * n_s + j] * m4mod->h_fq->v[(int)(i / n_o)] / m4mod->h_fq->v[(int)(j / n_o)]; } } } } /* Note: class equilibrium frequencies are already built in the h_mat matrix. No need to 'add' these frequencies later on. */ /* We are done with the non diagonal blocks */ /* Diagonal cells */ for (i = 0; i < n_s; i++) { sum = .0; for (j = 0; j < n_s; j++) { if (j != i) sum += mod->r_mat->qmat->v[i * n_s + j]; } mod->r_mat->qmat->v[i * n_s + i] = -sum; } For(i, n_s * n_s) mod->eigen->q[i] = mod->r_mat->qmat->v[i]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Init_Partial_Lk_Tips_Double(t_tree *tree) { int curr_site, i, j, k, l, dim1, dim2, dim3; dim1 = tree->mod->ras->n_catg * tree->mod->m4mod->n_h * tree->mod->m4mod->n_o; dim2 = tree->mod->m4mod->n_h * tree->mod->m4mod->n_o; dim3 = tree->mod->m4mod->n_o; Fors(curr_site, tree->data->n_pattern, tree->mod->io->state_len) { for (i = 0; i < tree->n_otu; i++) { for (j = 1; j < tree->mod->m4mod->n_h; j++) { for (k = 0; k < tree->mod->m4mod->n_o; k++) { tree->a_nodes[i] ->b[0] ->p_lk_rght[curr_site * dim1 + 0 * dim2 + j * dim3 + k] = tree->a_nodes[i] ->b[0] ->p_lk_rght[curr_site * dim1 + 0 * dim2 + 0 * dim3 + k]; printf("\n() i=%d plk=%f", curr_site * dim1 + 0 * dim2 + j * dim3 + k, tree->a_nodes[i]->b[0]->p_lk_rght[curr_site * dim1 + 0 * dim2 + j * dim3 + k]); /* tree->a_nodes[i]->b[0]->p_lk_rght[curr_site][0][j*tree->mod->m4mod->n_o+k] * = */ /* tree->a_nodes[i]->b[0]->p_lk_rght[curr_site][0][k]; */ } for (k = 0; k < tree->mod->m4mod->n_o; k++) for (l = 1; l < tree->mod->ras->n_catg; l++) tree->a_nodes[i] ->b[0] ->p_lk_rght[curr_site * dim1 + l * dim2 + j * dim3 + k] = tree->a_nodes[i] ->b[0] ->p_lk_rght[curr_site * dim1 + 0 * dim2 + j * dim3 + k]; /* tree->a_nodes[i]->b[0]->p_lk_rght[curr_site][l][j*tree->mod->m4mod->n_o+k] * = */ /* tree->a_nodes[i]->b[0]->p_lk_rght[curr_site][0][j*tree->mod->m4mod->n_o+k]; */ } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Init_Partial_Lk_Tips_Int(t_tree *tree) { int curr_site, i, j, k, dim2, dim3; dim2 = tree->mod->m4mod->n_h * tree->mod->m4mod->n_o; dim3 = tree->mod->m4mod->n_o; Fors(curr_site, tree->data->n_pattern, tree->mod->io->state_len) { for (i = 0; i < tree->n_otu; i++) { for (j = 1; j < tree->mod->m4mod->n_h; j++) { for (k = 0; k < tree->mod->m4mod->n_o; k++) { tree->a_nodes[i]->b[0]->p_lk_tip_r[curr_site * dim2 + j * dim3 + k] = tree->a_nodes[i] ->b[0] ->p_lk_tip_r[curr_site * dim2 + 0 * dim3 + k]; /* tree->a_nodes[i]->b[0]->p_lk_tip_r[curr_site][j*tree->mod->m4mod->n_o+k] * = */ /* tree->a_nodes[i]->b[0]->p_lk_tip_r[curr_site][k]; */ } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl ****M4_Integral_Term_On_One_Edge(t_edge *b, t_tree *tree) { phydbl ****integral, *P1, *P2; int ns; int g, i, j, k, l; int step; ns = tree->mod->ns; P1 = (phydbl *)mCalloc(tree->mod->ras->n_catg * ns * ns, sizeof(phydbl)); P2 = (phydbl *)mCalloc(tree->mod->ras->n_catg * ns * ns, sizeof(phydbl)); integral = (phydbl ****)mCalloc(tree->mod->ras->n_catg, sizeof(phydbl ***)); for (g = 0; g < tree->mod->ras->n_catg; g++) { integral[g] = (phydbl ***)mCalloc(ns, sizeof(phydbl **)); for (j = 0; j < ns; j++) { integral[g][j] = (phydbl **)mCalloc(ns, sizeof(phydbl *)); for (k = 0; k < ns; k++) integral[g][j][k] = (phydbl *)mCalloc(ns, sizeof(phydbl)); } } /* Integral calculation */ step = 100; PhyML_Printf("\n. ["); for (i = 0; i < step; i++) { for (g = 0; g < tree->mod->ras->n_catg; g++) { PMat(((phydbl)(i + 0.5) / step) * b->l->v * tree->mod->ras->gamma_rr->v[g], tree->mod, g * ns * ns, P1, NULL); PMat(((phydbl)(step - i - 0.5) / step) * b->l->v * tree->mod->ras->gamma_rr->v[g], tree->mod, g * ns * ns, P2, NULL); for (j = 0; j < ns; j++) { for (k = 0; k < ns; k++) { for (l = 0; l < ns; l++) { /* integral[g][j][k][l] += P1[g][j][k] * P2[g][j][l] / * ((phydbl)(step)); */ integral[g][j][k][l] += P1[g * ns * ns + j * ns + k] * P2[g * ns * ns + j * ns + l] / ((phydbl)(step)); } } } } PhyML_Printf("."); fflush(NULL); } PhyML_Printf("]\n"); Free(P1); Free(P2); return integral; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Post_Prob_H_Class_Edge_Site(t_edge *b, phydbl ****integral, phydbl *postprob, t_tree *tree) { /* Calculation of the expected frequencies of each hidden class at a given site. */ phydbl site_lk; int g, i, j, k, l; int n_h; phydbl sum; int dim1, dim2; dim1 = tree->mod->ras->n_catg * tree->mod->ns; dim2 = tree->mod->ns; n_h = tree->mod->m4mod ->n_h; /* number of classes, i.e., number of hidden states */ site_lk = (phydbl)exp(tree->cur_site_lk[tree->curr_site]); if (b->rght->tax) { sum = .0; for (i = 0; i < n_h; i++) { postprob[i] = .0; for (j = 0; j < tree->mod->m4mod->n_o; j++) { for (g = 0; g < tree->mod->ras->n_catg; g++) { for (k = 0; k < tree->mod->ns; k++) { for (l = 0; l < tree->mod->ns; l++) { postprob[i] += (1. / site_lk) * tree->mod->ras->gamma_r_proba->v[g] * tree->mod->m4mod->h_fq->v[i] * tree->mod->m4mod->o_fq[j] * b->p_lk_left[tree->curr_site * dim1 + g * dim2 + k] * b->p_lk_tip_r[tree->curr_site * dim2 + l] * integral[g][i * tree->mod->m4mod->n_o + j][k][l]; /* (1./site_lk) * */ /* tree->mod->ras->gamma_r_proba[g] * */ /* tree->mod->m4mod->h_fq[i] * */ /* tree->mod->m4mod->o_fq[j] * */ /* b->p_lk_left[tree->curr_site][g][k] * */ /* b->p_lk_tip_r[tree->curr_site][l] * */ /* /\* b->p_lk_rght[tree->curr_site][0][l] * * *\/ */ /* integral[g][i*tree->mod->m4mod->n_o+j][k][l]; */ } } } } sum += postprob[i]; } /* TO DO */ for (i = 0; i < n_h; i++) postprob[i] *= exp(b->sum_scale_left[tree->curr_site]); } else { sum = .0; for (i = 0; i < n_h; i++) { postprob[i] = .0; for (j = 0; j < tree->mod->m4mod->n_o; j++) { for (g = 0; g < tree->mod->ras->n_catg; g++) { for (k = 0; k < tree->mod->ns; k++) { for (l = 0; l < tree->mod->ns; l++) { postprob[i] += (1. / site_lk) * tree->mod->ras->gamma_r_proba->v[g] * tree->mod->m4mod->h_fq->v[i] * tree->mod->m4mod->o_fq[j] * b->p_lk_left[tree->curr_site * dim1 + g * dim2 + k] * b->p_lk_rght[tree->curr_site * dim1 + g * dim2 + l] * integral[g][i * tree->mod->m4mod->n_o + j][k][l]; /* (1./site_lk) * */ /* tree->mod->ras->gamma_r_proba[g] * */ /* tree->mod->m4mod->h_fq[i] * */ /* tree->mod->m4mod->o_fq[j] * */ /* b->p_lk_left[tree->curr_site][g][k] * */ /* b->p_lk_rght[tree->curr_site][g][l] * */ /* integral[g][i*tree->mod->m4mod->n_o+j][k][l]; */ } } } } sum += postprob[i]; } /* TO DO */ for (i = 0; i < n_h; i++) postprob[i] *= exp(b->sum_scale_left[tree->curr_site] + b->sum_scale_rght[tree->curr_site]); } for (i = 0; i < n_h; i++) if ((postprob[i] < -1.E-5) || (postprob[i] > 1.0 + 1.E-5)) { PhyML_Printf("\n. Cat : %d Prob : %f\n", i, postprob[i]); PhyML_Printf("\n. Err in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit("\n"); } sum = 0.0; for (i = 0; i < n_h; i++) sum += postprob[i]; if ((sum > 1.0 + 1.E-2) || (sum < 1.0 - 1.E-2)) { PhyML_Printf("\n. Sum = %f\n", sum); PhyML_Printf("\n. Err in file %s at line %d\n\n", __FILE__, __LINE__); Exit("\n"); } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl ***M4_Compute_Proba_Hidden_States_On_Edges(t_tree *tree) { int i; phydbl ***post_probs; phydbl ****integral; post_probs = (phydbl ***)mCalloc(2 * tree->n_otu - 3, sizeof(phydbl **)); for (i = 0; i < 2 * tree->n_otu - 3; ++i) { post_probs[i] = (phydbl **)mCalloc(tree->data->n_pattern, sizeof(phydbl *)); for (tree->curr_site = 0; tree->curr_site < tree->data->n_pattern; tree->curr_site++) post_probs[i][tree->curr_site] = (phydbl *)mCalloc(tree->mod->m4mod->n_h, sizeof(phydbl)); } /* Compute posterior probabilities of each hidden class (usually a rate class) on each edge, at each site. */ for (i = 0; i < 2 * tree->n_otu - 3; ++i) { PhyML_Printf("\n. Edge %4d/%4d", i + 1, 2 * tree->n_otu - 3); integral = M4_Integral_Term_On_One_Edge(tree->a_edges[i], tree); for (tree->curr_site = 0; tree->curr_site < tree->data->n_pattern; tree->curr_site++) M4_Post_Prob_H_Class_Edge_Site(tree->a_edges[i], integral, post_probs[i][tree->curr_site], tree); M4_Free_Integral_Term_On_One_Edge(integral, tree); } return post_probs; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Estimate the (posterior) mean relative rate of substitution on each branch at each site. The posterior mean rates averaged over sites is also estimated for each edge. The corresponding trees are printed in a postscript file. Tree 0 is the tree with posterior mean rates averaged over the sites. The following trees have posterior mean rates computed for each site. */ void M4_Compute_Posterior_Mean_Rates(phydbl ***post_probs, t_tree *tree) { char *s; int i; phydbl **mean_post_probs; phydbl *mrr; phydbl sum; int patt, br, rcat; phydbl *mean_br_len; int best_r, len_var; phydbl max_prob; mean_br_len = (phydbl *)mCalloc(2 * tree->n_otu - 3, sizeof(phydbl)); mean_post_probs = (phydbl **)mCalloc(2 * tree->n_otu - 3, sizeof(phydbl *)); For(i, 2 * tree->n_otu - 3) mean_post_probs[i] = (phydbl *)mCalloc(tree->mod->m4mod->n_h, sizeof(phydbl)); mrr = (phydbl *)mCalloc(2 * tree->n_otu - 3, sizeof(phydbl)); Record_Br_Len(tree); M4_Scale_Br_Len(tree); /* Compute the posterior mean relative rate on each branch averaged over the whole set of patterns (sites) */ len_var = 0; for (patt = 0; patt < tree->data->n_pattern; patt++) { if (!Is_Invar(patt, 1, NT, tree->data)) { For(br, 2 * tree->n_otu - 3) { max_prob = -1.; best_r = -1; for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) { if (post_probs[br][patt][rcat] > max_prob) { max_prob = post_probs[br][patt][rcat]; best_r = rcat; } } /* /\* Add weight on each category, weight is proportional to the * corresponding posterior probability *\/ */ /* for(rcat=0;rcatmod->m4mod->n_h;rcat++) */ /* { */ /* mean_post_probs[br][rcat] += * post_probs[br][patt][rcat] * tree->data->wght[patt]; */ /* } */ /* Add weight on the most probable rate category only */ mean_post_probs[br][best_r] += tree->data->wght[patt]; } len_var += tree->data->wght[patt]; } } For(br, 2 * tree->n_otu - 3) { for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) { mean_post_probs[br][rcat] /= (phydbl)len_var; } } /* Compute the posterior mean relative rate and scale each branch length using this factor */ for (br = 0; br < 2 * tree->n_otu - 3; ++br) { for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) { mrr[br] += mean_post_probs[br][rcat] * tree->mod->m4mod->multipl->v[rcat]; } tree->a_edges[br]->l->v *= mrr[br]; } PhyML_Fprintf(tree->io->fp_out_stats, "\n. Mean posterior probabilities & rates\n"); for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) PhyML_Fprintf(tree->io->fp_out_stats, "%2.4f ", tree->mod->m4mod->multipl[rcat]); PhyML_Fprintf(tree->io->fp_out_stats, "\n"); For(br, 2 * tree->n_otu - 3) { for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) { PhyML_Fprintf(tree->io->fp_out_stats, "%2.4f ", mean_post_probs[br][rcat]); } /* PhyML_Fprintf(tree->io->fp_out_stats," -- %f -> %f x %f = * %f",mrr[br],tree->a_edges[br]->l->v,mrr[br],tree->a_edges[br]->l->v*mrr[br]); */ PhyML_Fprintf(tree->io->fp_out_stats, " mrr=%f ", mrr[br]); if (mrr[br] > 1.) PhyML_Fprintf(tree->io->fp_out_stats, "FAST "); else PhyML_Fprintf(tree->io->fp_out_stats, "SLOW "); PhyML_Fprintf(tree->io->fp_out_stats, "%s", tree->a_edges[br]->label[0]); PhyML_Fprintf(tree->io->fp_out_stats, "\n"); } /* Print the tree */ PhyML_Fprintf(tree->io->fp_out_tree, "Constrained tree with corrected branch lengths = "); s = Write_Tree(tree); PhyML_Fprintf(tree->io->fp_out_tree, "%s\n", s); Free(s); tree->ps_tree = DR_Make_Tdraw_Struct(tree); DR_Print_Postscript_Header(tree->data->n_pattern, tree->io->fp_out_ps); tree->ps_page_number = 0; DR_Print_Tree_Postscript(tree->ps_page_number++, YES, tree->io->fp_out_ps, tree); /* Go back to the initial scaled branch lengths */ For(br, 2 * tree->n_otu - 3) tree->a_edges[br]->l->v /= mrr[br]; /* Compute the posterior mean relative rate at each site, for each branch and each rate category. Scale branch lengths using these factors and print each tree (i.e., on tree per site pattern) */ for (patt = 0; patt < tree->data->n_pattern; patt++) { For(br, 2 * tree->n_otu - 3) { mrr[br] = .0; max_prob = -1.; best_r = -1; for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) /* For each rate class */ { mrr[br] += post_probs[br][patt][rcat] * tree->mod->m4mod->multipl->v[rcat]; if (post_probs[br][patt][rcat] > max_prob) { max_prob = post_probs[br][patt][rcat]; best_r = rcat; } } /* mrr[br] = tree->mod->m4mod->multipl[best_r]; /\* Use the most * probable relative rate instead of mean *\/ */ tree->a_edges[br]->l->v *= mrr[br]; } For(br, 2 * tree->n_otu - 3) mean_br_len[br] += tree->a_edges[br]->l->v * tree->data->wght[patt]; PhyML_Fprintf( tree->io->fp_out_stats, "\n. Posterior probabilities site %4d (weight=%d, is_inv=%d)\n", patt, tree->data->wght[patt], Is_Invar(patt, 1, NT, tree->data)); for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) PhyML_Fprintf(tree->io->fp_out_stats, "%2.4f ", tree->mod->m4mod->multipl[rcat]); PhyML_Fprintf(tree->io->fp_out_stats, "\n"); For(br, 2 * tree->n_otu - 3) { PhyML_Fprintf(tree->io->fp_out_stats, "Edge %3d ", br); max_prob = -1.0; best_r = -1; for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) { if (post_probs[br][patt][rcat] > max_prob) { max_prob = post_probs[br][patt][rcat]; best_r = rcat; } } for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) { PhyML_Fprintf(tree->io->fp_out_stats, "%2.4f", post_probs[br][patt][rcat]); if (rcat == best_r) PhyML_Fprintf(tree->io->fp_out_stats, "* "); else PhyML_Fprintf(tree->io->fp_out_stats, " "); } /* PhyML_Fprintf(tree->io->fp_out_stats," -- %f -> %f x %f = * %f",mrr[br],tree->a_edges[br]->l->v,mrr[br],tree->a_edges[br]->l->v*mrr[br]); */ if (mrr[br] > 1.01) PhyML_Fprintf(tree->io->fp_out_stats, " %s ", "FAST"); else if (mrr[br] < 0.99) PhyML_Fprintf(tree->io->fp_out_stats, " %s ", "SLOW"); else PhyML_Fprintf(tree->io->fp_out_stats, " %s ", "MEDIUM"); PhyML_Fprintf(tree->io->fp_out_stats, "%s ", tree->a_edges[br]->label[0]); PhyML_Fprintf(tree->io->fp_out_stats, "\n"); } PhyML_Fprintf(tree->io->fp_out_tree, "tree %d = ", patt + 1); s = Write_Tree(tree); PhyML_Fprintf(tree->io->fp_out_tree, "%s\n", s); Free(s); DR_Print_Tree_Postscript(tree->ps_page_number++, YES, tree->io->fp_out_ps, tree); /* Go back to the initial scaled branch lengths */ For(br, 2 * tree->n_otu - 3) tree->a_edges[br]->l->v /= mrr[br]; For(br, 2 * tree->n_otu - 3) { sum = .0; for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) { sum += post_probs[br][patt][rcat]; } if ((sum < 0.99) || (sum > 1.01)) { PhyML_Fprintf(tree->io->fp_out_stats, "\n. sum = %f\n", sum); PhyML_Fprintf(tree->io->fp_out_stats, "\n. Err in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit("\n"); } } } /* Mean branch lengths */ For(br, 2 * tree->n_otu - 3) { mean_br_len[br] /= (phydbl)tree->data->init_len; tree->a_edges[br]->l->v = mean_br_len[br]; } PhyML_Fprintf(tree->io->fp_out_tree, "Mean branch lengths="); s = Write_Tree(tree); PhyML_Fprintf(tree->io->fp_out_tree, "%s\n", s); Free(s); /* DR_Print_Tree_Postscript(tree->ps_page_number++,tree->io->fp_out_ps,tree); */ Restore_Br_Len(tree); DR_Print_Postscript_EOF(tree->io->fp_out_ps); For(br, 2 * tree->n_otu - 3) { for (tree->curr_site = 0; tree->curr_site < tree->data->n_pattern; tree->curr_site++) Free(post_probs[br][tree->curr_site]); Free(post_probs[br]); } Free(post_probs); For(i, 2 * tree->n_otu - 3) Free(mean_post_probs[i]); Free(mean_post_probs); Free(mrr); Free(mean_br_len); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Classifiy each branch, at each site, among one of the rate classes */ phydbl **M4_Site_Branch_Classification(phydbl ***post_probs, t_tree *tree) { int patt, br, rcat, i; phydbl **best_probs; phydbl post_prob_fast, post_prob_slow; best_probs = (phydbl **)mCalloc(tree->data->n_pattern, sizeof(phydbl *)); for (i = 0; i < tree->data->n_pattern; i++) best_probs[i] = (phydbl *)mCalloc(2 * tree->n_otu - 3, sizeof(phydbl)); for (patt = 0; patt < tree->data->n_pattern; patt++) { for (br = 0; br < 2 * tree->n_otu - 3; ++br) { post_prob_fast = .0; post_prob_slow = .0; for (rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) /* For each rate class */ { if (tree->mod->m4mod->multipl->v[rcat] > 1.0) post_prob_fast += post_probs[br][patt][rcat]; else post_prob_slow += post_probs[br][patt][rcat]; } best_probs[patt][br] = (post_prob_fast > post_prob_slow) ? (post_prob_fast) : (post_prob_slow); tree->a_edges[br]->label = Make_Label(); /* if((post_prob_fast > post_prob_slow) && (best_probs[patt][br] * > 0.95)) */ /* strcpy(tree->a_edges[br]->labels[tree->a_edges[br]->n_labels],"FASTER"); */ /* else if((post_prob_fast < post_prob_slow) && * (best_probs[patt][br] > 0.95)) */ /* strcpy(tree->a_edges[br]->labels[tree->a_edges[br]->n_labels],"SLOWER"); */ /* else */ /* strcpy(tree->a_edges[br]->labels[tree->a_edges[br]->n_labels],"UNKNOWN"); */ if (post_prob_fast > post_prob_slow) strcpy(tree->a_edges[br]->label->val, "FASTER"); else strcpy(tree->a_edges[br]->label->val, "SLOWER"); tree->a_edges[br]->label = tree->a_edges[br]->label->next; } } return best_probs; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Site_Branch_Classification_Experiment(t_tree *tree) { calign *cpy_data; short int **true_rclass, **est_rclass; phydbl **best_probs; int i, j; phydbl correct_class, mis_class, unknown; true_rclass = (short int **)mCalloc(tree->data->init_len, sizeof(short int *)); est_rclass = (short int **)mCalloc(tree->data->init_len, sizeof(short int *)); for (i = 0; i < tree->data->init_len; i++) { true_rclass[i] = (short int *)mCalloc(2 * tree->n_otu - 3, sizeof(short int)); est_rclass[i] = (short int *)mCalloc(2 * tree->n_otu - 3, sizeof(short int)); } if (tree->io->datatype != NT && tree->io->datatype != AA) { PhyML_Printf("\n. Not implemented yet."); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } cpy_data = Copy_Cseq(tree->data, tree->io, NULL); /* Generate a simulated data set under H0, with the right sequence length. */ PhyML_Printf("\n. Evolving sequences (delta=%f, alpha=%f) ...\n", tree->mod->m4mod->delta->v, tree->mod->m4mod->alpha->v); EVOLVE_Seq(cpy_data, tree->mod, NULL, tree); for (j = 0; j < 2 * tree->n_otu - 3; ++j) { do tree->a_edges[j]->label = tree->a_edges[j]->label->prev; while (tree->a_edges[j]->label->prev != NULL); } for (i = 0; i < cpy_data->init_len; i++) { for (j = 0; j < 2 * tree->n_otu - 3; ++j) { if (!strcmp(tree->a_edges[j]->label->val, "FASTER")) { true_rclass[i][j] = 1; } else if (!strcmp(tree->a_edges[j]->label->val, "SLOWER")) { true_rclass[i][j] = 0; } else { PhyML_Printf("\n. Err in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit("\n"); } } tree->a_edges[j]->label = tree->a_edges[j]->label->next; } for (j = 0; j < 2 * tree->n_otu - 3; ++j) Free_Label(tree->a_edges[j]->label); /* Generate the memory needed for likelihood calculation because we will need bigger arrays */ Free_Tree_Lk(tree); Free_Tree_Pars(tree); tree->data = cpy_data; /* Allocate memory and initialize likelihood structure with simulated sequences (i.e., columns are not compressed) */ Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); /* Estimate model parameters */ PhyML_Printf("\n. Estimating model parameters...\n"); tree->mod->m4mod->alpha->optimize = YES; tree->mod->m4mod->delta->optimize = YES; Round_Optimize(tree, ROUND_MAX); tree->both_sides = 1; Lk(NULL, tree); /* Classify branches */ best_probs = M4_Site_Branch_Classification( M4_Compute_Proba_Hidden_States_On_Edges(tree), tree); for (j = 0; j < 2 * tree->n_otu - 3; ++j) { do tree->a_edges[j]->label = tree->a_edges[j]->label->prev; while (tree->a_edges[j]->label->prev != NULL); } for (i = 0; i < tree->data->init_len; i++) { for (j = 0; j < 2 * tree->n_otu - 3; ++j) { if (!strcmp(tree->a_edges[j]->label->val, "FASTER")) { est_rclass[i][j] = 1; } else if (!strcmp(tree->a_edges[j]->label->val, "SLOWER")) { est_rclass[i][j] = 0; } else if (!strcmp(tree->a_edges[j]->label->val, "UNKNOWN")) { est_rclass[i][j] = -1; } else { PhyML_Printf("\n. Err in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit("\n"); } } tree->a_edges[j]->label = tree->a_edges[j]->label->next; } unknown = .0; correct_class = .0; mis_class = .0; for (i = 0; i < tree->data->init_len; i++) { For(j, 2 * tree->n_otu - 3) { /* PhyML_Printf("\n. Edge %3d %4d %4d - * %f",j,true_rclass[i][j],est_rclass[i][j],best_probs[i][j]); */ if (est_rclass[i][j] == -1) { unknown += 1.; } else if (est_rclass[i][j] == true_rclass[i][j]) { correct_class += 1.; } else if (est_rclass[i][j] != true_rclass[i][j]) { mis_class += 1.; } else { PhyML_Printf("\n. Err in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit("\n"); } } /* PhyML_Printf("\n"); */ } correct_class /= ((tree->data->init_len * (2 * tree->n_otu - 3)) - unknown); mis_class /= ((tree->data->init_len * (2 * tree->n_otu - 3)) - unknown); unknown /= (tree->data->init_len * (2 * tree->n_otu - 3)); PhyML_Printf("\n. correct_class = %f mis_class = %f unknown = %f", correct_class, mis_class, unknown); for (i = 0; i < tree->data->init_len; i++) { Free(true_rclass[i]); Free(est_rclass[i]); Free(best_probs[i]); } Free(true_rclass); Free(est_rclass); Free(best_probs); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Scale branch lengths such that they express expected number of nucleotide or amino-acid substitutions */ void M4_Scale_Br_Len(t_tree *tree) { phydbl scale_fact, mrs; int i, j; /* (1) Work out the relative mean rate of switches */ mrs = .0; for (i = 0; i < tree->mod->m4mod->n_h; i++) { for (j = 0; j < tree->mod->m4mod->n_h; j++) { if (j != i) mrs += tree->mod->m4mod->h_fq->v[i] * tree->mod->m4mod->h_mat[i * tree->mod->m4mod->n_h + j]; } } /* (2) scale_fact = (1 + delta x mrs) */ scale_fact = 1.0 + tree->mod->m4mod->delta->v * mrs; /* (3) Scale branch lengths */ For(i, 2 * tree->n_otu - 3) tree->a_edges[i]->l->v /= scale_fact; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Free_Integral_Term_On_One_Edge(phydbl ****integral, t_tree *tree) { int g, i, j; for (g = 0; g < tree->mod->ras->n_catg; g++) { for (i = 0; i < tree->mod->m4mod->n_h; i++) { for (j = 0; j < tree->mod->m4mod->n_h; j++) { Free(integral[g][i][j]); } Free(integral[g][i]); } Free(integral[g]); } Free(integral); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Detect_Site_Switches_Experiment(t_tree *tree) { t_mod *nocov_mod, *cov_mod, *ori_mod; calign *ori_data, *cpy_data; int i, n_iter; phydbl *nocov_bl, *cov_bl; phydbl *site_lnl_nocov, *site_lnl_cov; nocov_bl = (phydbl *)mCalloc(2 * tree->n_otu - 3, sizeof(phydbl)); cov_bl = (phydbl *)mCalloc(2 * tree->n_otu - 3, sizeof(phydbl)); site_lnl_nocov = (phydbl *)mCalloc(tree->data->init_len, sizeof(phydbl)); site_lnl_cov = (phydbl *)mCalloc(tree->data->init_len, sizeof(phydbl)); ori_data = tree->data; ori_mod = tree->mod; if (tree->io->datatype != NT && tree->io->datatype != AA) { PhyML_Printf("\n== Not implemented yet."); PhyML_Printf("\n== Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } cpy_data = Copy_Cseq(tree->data, tree->io, NULL); PhyML_Printf("\n. Estimate model parameters under non-switching substitution " "model.\n"); Switch_From_M4mod_To_Mod(tree->mod); Simu_Loop(tree); nocov_mod = (t_mod *)Copy_Model(tree->mod); /* Record model parameters */ For(i, 2 * tree->n_otu - 3) nocov_bl[i] = tree->a_edges[i]->l->v; /* Record branch lengths */ for (i = 0; i < tree->data->n_pattern; i++) site_lnl_nocov[i] = tree->cur_site_lk[i]; Print_Lk(tree, "[LnL under non-switching substitution model]"); PhyML_Printf( "\n. Estimate model parameters under switching substitution model.\n"); Switch_From_Mod_To_M4mod(tree->mod); Simu_Loop(tree); cov_mod = (t_mod *)Copy_Model(tree->mod); /* Record model parameters */ For(i, 2 * tree->n_otu - 3) cov_bl[i] = tree->a_edges[i]->l->v; /* Record branch lengths */ for (i = 0; i < tree->data->n_pattern; i++) site_lnl_cov[i] = tree->cur_site_lk[i]; Print_Lk(tree, "[LnL under switching substitution model]"); PhyML_Printf("\n"); for (i = 0; i < tree->data->n_pattern; i++) PhyML_Printf("TRUTH %f %f\n", site_lnl_nocov[i], site_lnl_cov[i]); /* Generate a simulated data set under H0, with the right sequence length. */ tree->mod = nocov_mod; EVOLVE_Seq(cpy_data, nocov_mod, NULL, tree); /* Generate the memory needed for likelihood calculation because we will need bigger arrays */ tree->mod = cov_mod; Free_Tree_Lk(tree); Free_Tree_Pars(tree); tree->data = cpy_data; tree->mod = cov_mod; /* Allocate memory and initialize likelihood structure with simulated sequences (i.e., columns are not compressed) */ Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); n_iter = 0; do { /* Get the transition proba right to generate sequences */ tree->mod = nocov_mod; For(i, 2 * tree->n_otu - 3) tree->a_edges[i]->l->v = nocov_bl[i]; For(i, 2 * tree->n_otu - 3) Update_PMat_At_Given_Edge(tree->a_edges[i], tree); /* Generate sequences */ EVOLVE_Seq(cpy_data, nocov_mod, NULL, tree); tree->data = cpy_data; if (tree->mod->s_opt->greedy) Init_Partial_Lk_Tips_Double(tree); else Init_Partial_Lk_Tips_Int(tree); tree->mod = nocov_mod; For(i, 2 * tree->n_otu - 3) tree->a_edges[i]->l->v = nocov_bl[i]; Lk(NULL, tree); for (i = 0; i < tree->data->n_pattern; i++) site_lnl_nocov[i] = tree->cur_site_lk[i]; Print_Lk(tree, "[CPY LnL under non-switching substitution model]"); tree->mod = cov_mod; For(i, 2 * tree->n_otu - 3) tree->a_edges[i]->l->v = cov_bl[i]; Lk(NULL, tree); for (i = 0; i < tree->data->n_pattern; i++) site_lnl_cov[i] = tree->cur_site_lk[i]; Print_Lk(tree, "[CPY LnL under switching substitution model]"); PhyML_Printf("\n"); for (i = 0; i < tree->data->n_pattern; i++) PhyML_Printf("SYNTH %f %f\n", site_lnl_nocov[i], site_lnl_cov[i]); } while (++n_iter < 200); Free_Tree_Lk(tree); Free_Tree_Pars(tree); /* Back to the original data set to check that everything is ok */ tree->data = ori_data; Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); tree->mod = nocov_mod; For(i, 2 * tree->n_otu - 3) tree->a_edges[i]->l->v = nocov_bl[i]; Lk(NULL, tree); Print_Lk(tree, "[FINAL LnL under non-switching substitution model]"); tree->mod = cov_mod; For(i, 2 * tree->n_otu - 3) tree->a_edges[i]->l->v = cov_bl[i]; Lk(NULL, tree); Print_Lk(tree, "[FINAL LnL under switching substitution model]"); tree->mod = ori_mod; Free_Model(cov_mod); Free_Model(nocov_mod); Free(site_lnl_cov); Free(site_lnl_nocov); Free_Calign(cpy_data); Free(nocov_bl); Free(cov_bl); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Posterior_Prediction_Experiment(t_tree *tree) { calign *ori_data, *cpy_data; int i, n_iter, n_simul; FILE *fp_nocov, *fp_cov, *fp_obs; char *s; t_edge *best_edge; s = (char *)mCalloc(100, sizeof(char)); best_edge = NULL; strcpy(s, tree->io->in_align_file); fp_nocov = Openfile(strcat(s, "_nocov"), 1); strcpy(s, tree->io->in_align_file); fp_cov = Openfile(strcat(s, "_cov"), 1); strcpy(s, tree->io->in_align_file); fp_obs = Openfile(strcat(s, "_obs"), 1); Free(s); Print_Diversity_Header(fp_nocov, tree); Print_Diversity_Header(fp_cov, tree); Print_Diversity_Header(fp_obs, tree); ori_data = tree->data; if (tree->io->datatype != NT && tree->io->datatype != AA) { PhyML_Printf("\n. Not implemented yet."); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } cpy_data = Copy_Cseq(tree->data, tree->io, NULL); /* Generate a simulated data set under H0, with the right sequence length. */ Set_Model_Parameters(tree->mod); For(i, 2 * tree->n_otu - 3) Update_PMat_At_Given_Edge(tree->a_edges[i], tree); EVOLVE_Seq(cpy_data, tree->mod, NULL, tree); /* Generate the memory needed for likelihood calculation because we will need bigger arrays */ Free_Tree_Lk(tree); Free_Tree_Pars(tree); tree->data = cpy_data; /* Allocate memory and initialize likelihood structure with simulated sequences (i.e., columns are not compressed) */ Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); /* Go back to the original data set */ tree->data = ori_data; if (tree->mod->s_opt->greedy) Init_Partial_Lk_Tips_Double(tree); else Init_Partial_Lk_Tips_Int(tree); PhyML_Printf("\n. Estimate model parameters under non-switching substitution " "model.\n"); Switch_From_M4mod_To_Mod(tree->mod); tree->bl_from_node_stamps = 1; /* best_edge = TIMES_Find_Best_Root_Position(tree); */ PhyML_Printf("\n. Put root on t_edge %3d", i); TIMES_Least_Square_Node_Times(best_edge, tree); TIMES_Adjust_Node_Times(tree); /* TIMES_Round_Optimize(tree); */ /* Round_Optimize(tree,tree->data); */ /* Simu_Loop(tree); */ Print_Lk(tree, "[LnL under non-switching substitution model]"); Print_Tree(tree->io->fp_out_tree, tree); /* Print observed diversities */ Init_Ui_Tips(tree); Site_Diversity(tree); Print_Diversity(fp_obs, tree); n_simul = 100; n_iter = 0; do { EVOLVE_Seq(cpy_data, tree->mod, NULL, tree); tree->data = cpy_data; tree->data->n_pattern = cpy_data->init_len; if (tree->mod->s_opt->greedy) Init_Partial_Lk_Tips_Double(tree); else Init_Partial_Lk_Tips_Int(tree); Lk(NULL, tree); Init_Ui_Tips(tree); Site_Diversity(tree); Print_Diversity(fp_nocov, tree); Print_Lk(tree, "[CPY under non-switching substitution model]"); } while (++n_iter < n_simul); /* Go back to the original data set */ tree->data = ori_data; if (tree->mod->s_opt->greedy) Init_Partial_Lk_Tips_Double(tree); else Init_Partial_Lk_Tips_Int(tree); PhyML_Printf( "\n. Estimate model parameters under switching substitution model.\n"); Switch_From_Mod_To_M4mod(tree->mod); /* TIME_Round_Optimize(tree); */ /* Round_Optimize(tree,tree->data); */ /* Simu_Loop(tree); */ Print_Lk(tree, "[LnL under switching substitution model]"); Print_Tree(tree->io->fp_out_tree, tree); n_iter = 0; do { EVOLVE_Seq(cpy_data, tree->mod, NULL, tree); tree->data = cpy_data; tree->data->n_pattern = cpy_data->init_len; if (tree->mod->s_opt->greedy) Init_Partial_Lk_Tips_Double(tree); else Init_Partial_Lk_Tips_Int(tree); Lk(NULL, tree); Init_Ui_Tips(tree); Site_Diversity(tree); Print_Diversity(fp_cov, tree); Print_Lk(tree, "[LnL under switching substitution model]"); } while (++n_iter < n_simul); fclose(fp_obs); fclose(fp_nocov); fclose(fp_cov); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// m4 *M4_Copy_M4_Model(t_mod *ori_mod, m4 *ori_m4mod) { int i, j, n_h, n_o; m4 *cpy_m4mod; if (ori_mod->io->datatype != NT && ori_mod->io->datatype != AA) { PhyML_Printf("\n== Not implemented yet."); PhyML_Printf("\n== Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } cpy_m4mod = (m4 *)M4_Make_Light(); cpy_m4mod->n_o = ori_m4mod->n_o; cpy_m4mod->n_h = ori_m4mod->n_h; if (ori_mod->use_m4mod) { M4_Make_Complete(cpy_m4mod->n_h, cpy_m4mod->n_o, cpy_m4mod); n_h = cpy_m4mod->n_h; n_o = cpy_m4mod->n_o; cpy_m4mod->n_h = ori_m4mod->n_h; cpy_m4mod->n_o = ori_m4mod->n_o; for (i = 0; i < n_h; i++) For(j, n_o * n_o) cpy_m4mod->o_mats[i][j] = ori_m4mod->o_mats[i][j]; for (i = 0; i < n_h; i++) cpy_m4mod->multipl[i] = ori_m4mod->multipl[i]; for (i = 0; i < n_h; i++) cpy_m4mod->multipl_unscaled[i] = ori_m4mod->multipl_unscaled[i]; For(i, n_o * n_o) cpy_m4mod->o_rr[i] = ori_m4mod->o_rr[i]; For(i, n_h * n_h) cpy_m4mod->h_rr[i] = ori_m4mod->h_rr[i]; For(i, n_h * n_h) cpy_m4mod->h_mat[i] = ori_m4mod->h_mat[i]; for (i = 0; i < n_o; i++) cpy_m4mod->o_fq[i] = ori_m4mod->o_fq[i]; for (i = 0; i < n_h; i++) cpy_m4mod->h_fq[i] = ori_m4mod->h_fq[i]; for (i = 0; i < n_h; i++) cpy_m4mod->h_fq_unscaled[i] = ori_m4mod->h_fq_unscaled[i]; cpy_m4mod->delta->v = ori_m4mod->delta->v; cpy_m4mod->alpha->v = ori_m4mod->alpha->v; } return cpy_m4mod; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/m4.h000066400000000000000000000035221501136442400176640ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef M4_H #define M4_H #include "alrt.h" #include "bionj.h" #include "draw.h" #include "eigen.h" #include "free.h" #include "help.h" #include "lk.h" #include "models.h" #include "optimiz.h" #include "pars.h" #include "simu.h" #include "spr.h" #include "time.h" #include "utilities.h" #ifdef PART #include "mg.h" #endif int M4_main(int argc, char **argv); void M4_Free_M4_Model(m4 *m4mod); void M4_Init_Qmat(m4 *m4mod, calign *data, t_mod *mod); void M4_Update_Qmat(m4 *m4mod, t_mod *mod); void M4_Init_Model(m4 *m4mod, calign *data, t_mod *mod); void M4_Init_Partial_Lk_Tips_Double(t_tree *tree); void M4_Init_Partial_Lk_Tips_Int(t_tree *tree); void M4_Post_Prob_H_Class_Edge_Site(t_edge *b, phydbl ****integral, phydbl *postprob, t_tree *tree); phydbl ****M4_Integral_Term_On_One_Edge(t_edge *b, t_tree *tree); phydbl ***M4_Compute_Proba_Hidden_States_On_Edges(t_tree *tree); void M4_Free_Integral_Term_On_One_Edge(phydbl ****integral, t_tree *tree); void M4_Compute_Posterior_Mean_Rates(phydbl ***post_probs, t_tree *tree); void M4_Scale_Br_Len(t_tree *tree); void M4_Detect_Site_Switches_Experiment(t_tree *tree); m4 *M4_Copy_M4_Model(t_mod *ori_mod, m4 *ori_m4mod); void M4_Posterior_Prediction_Experiment(t_tree *tree); void M4_Set_M4mod_Default(m4 *m4mod); phydbl **M4_Site_Branch_Classification(phydbl ***post_probs, t_tree *tree); void M4_Site_Branch_Classification_Experiment(t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/main.c000066400000000000000000000772011501136442400202700ustar00rootroot00000000000000 // PhyML: a program that computes maximum likelihood phylogenies from // DNA or AA homologous sequences. // Copyright (C) Stephane Guindon. Oct 2003 onward. // All parts of the source except where indicated are distributed under // the GNU public licence. See http://www.opensource.org for details. #include "alrt.h" #include "bionj.h" #include "eigen.h" #include "free.h" #include "help.h" #include "invitee.h" #include "lk.h" #include "mixt.h" #include "models.h" #include "optimiz.h" #include "pars.h" #include "simu.h" #include "spr.h" #include "utilities.h" #ifdef MPI #include "mpi_boot.h" #endif #ifdef BEAGLE #include "beagle_utils.h" #endif #if (defined PHYML) int main(int argc, char **argv) { calign *cdata; option *io; t_tree *tree; int num_data_set; int num_tree, num_rand_tree; t_mod *mod; time_t t_beg, t_end; phydbl best_lnL; int r_seed; char *most_likely_tree = NULL; int orig_random_input_tree; #ifdef MPI int rc; rc = MPI_Init(&argc, &argv); if (rc != MPI_SUCCESS) { PhyML_Fprintf(stderr, "\n. Err. starting MPI program. Terminating.\n"); MPI_Abort(MPI_COMM_WORLD, rc); } if (MPI_Comm_size(MPI_COMM_WORLD, &Global_numTask) != MPI_SUCCESS) MPI_Abort(MPI_COMM_WORLD, rc); if (MPI_Comm_rank(MPI_COMM_WORLD, &Global_myRank) != MPI_SUCCESS) MPI_Abort(MPI_COMM_WORLD, rc); PhyML_Fprintf(stdout, "\n\n. Running the analysis on %d CPU%s.", Global_numTask, Global_numTask > 1 ? "s." : "."); #endif #ifdef QUIET setvbuf(stdout, NULL, _IOFBF, 2048); #endif tree = NULL; mod = NULL; best_lnL = UNLIKELY; io = (option *)Get_Input(argc, argv); if (!io) return (0); else if (io->use_xml == YES) { Free(io); return (0); } r_seed = (io->r_seed < 0) ? (time(NULL)) : (io->r_seed); #ifdef MPI srand(r_seed + Global_myRank); #else srand(r_seed); #endif io->r_seed = r_seed; if (io->in_tree == 2) Test_Multiple_Data_Set_Format(io); else io->n_trees = 1; if (io->n_trees == 0 && io->in_tree == 2) { PhyML_Printf("\n== Err.: the input tree file does not provide a tree in " "valid format."); Exit("\n"); } if ((io->n_data_sets > 1) && (io->n_trees > 1)) { io->n_data_sets = MIN(io->n_trees, io->n_data_sets); io->n_trees = MIN(io->n_trees, io->n_data_sets); } for (num_data_set = 0; num_data_set < io->n_data_sets; num_data_set++) { best_lnL = UNLIKELY; Get_Seq(io); Make_Model_Complete(io->mod); Set_Model_Name(io->mod); Print_Settings(io); mod = io->mod; orig_random_input_tree = io->mod->s_opt->random_input_tree; if (io->data) { if (io->n_data_sets > 1) PhyML_Printf("\n. Data set [#%d]\n", num_data_set + 1); cdata = Compact_Data(io->data, io); Free_Seq(io->data, cdata->n_otu); for (num_tree = (io->n_trees == 1) ? (0) : (num_data_set); num_tree < io->n_trees; num_tree++) { if (io->mod->s_opt->random_input_tree == NO) io->mod->s_opt->n_rand_starts = 1; if (orig_random_input_tree == YES && io->n_trees > 1) { PhyML_Printf("\n== Cannot combine random starting trees with " "multiple input trees."); Exit("\n"); } for (num_rand_tree = 0; num_rand_tree < io->mod->s_opt->n_rand_starts; num_rand_tree++) { if ((io->mod->s_opt->random_input_tree) && (io->mod->s_opt->topo_search != NNI_MOVE)) if (!io->quiet) PhyML_Printf("\n\n. [Random start %3d/%3d]", num_rand_tree + 1, io->mod->s_opt->n_rand_starts); Init_Model(cdata, mod, io); Set_Model_Parameters(mod); #ifdef M4 if (io->mod->use_m4mod) M4_Init_Model(mod->m4mod, cdata, mod); #endif // Make the initial tree switch (io->in_tree) { case 0: case 1: { tree = Dist_And_BioNJ(cdata, mod, io); if (io->print_mat_and_exit == YES) { Print_Mat(ML_Dist(cdata, mod)); exit(-1); } break; } case 2: { tree = Read_User_Tree(cdata, mod, io); break; } } if (io->mod->s_opt->opt_topo == YES) Remove_Duplicates(cdata, io, tree); if (io->fp_in_constraint_tree != NULL) { char *s; PhyML_Printf("\n. Reading constraint tree file..."); io->cstr_tree = Read_Tree_File_Phylip(io->fp_in_constraint_tree); if (io->cstr_tree->n_root != NULL) { PhyML_Printf("\n== The constraint tree file must be unrooted"); Exit("\n"); } s = Add_Taxa_To_Constraint_Tree(io->fp_in_constraint_tree, cdata); fflush(NULL); Free_Tree(tree); tree = Read_Tree(&s); io->in_tree = 2; Free(s); Check_Constraint_Tree_Taxa_Names(io->cstr_tree, cdata); Alloc_Bip(io->cstr_tree); Get_Bip(io->cstr_tree->a_nodes[0], io->cstr_tree->a_nodes[0]->v[0], io->cstr_tree); if (tree->has_branch_lengths == NO) Add_BioNJ_Branch_Lengths(tree, cdata, mod, NULL); } if (!tree) continue; time(&t_beg); time(&(tree->t_beg)); tree->mod = mod; tree->io = io; tree->data = cdata; tree->n_root = NULL; tree->e_root = NULL; tree->n_tot_bl_opt = 0; Set_Both_Sides(YES, tree); if ((!num_data_set) && (!num_tree) && (!num_rand_tree)) Check_Memory_Amount(tree); if (io->cstr_tree && !Check_Topo_Constraints(tree, io->cstr_tree)) { PhyML_Printf("\n\n== The initial tree does not satisfy the " "topological constraint."); PhyML_Printf("\n== Please use the user input tree option with an " "adequate tree topology."); Exit("\n"); } Connect_CSeqs_To_Nodes(tree->data, tree->io, tree); Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Make_Spr(tree); Br_Len_Not_Involving_Invar(tree); Unscale_Br_Len_Multiplier_Tree(tree); #ifdef BEAGLE if (mod->bootstrap == YES) { PhyML_Printf("\n== PhyML-BEAGLE does not support bootstrap " "analysis yet... "); Exit("\n"); } if (mod->ras->invar == YES) { PhyML_Printf("\n== PhyML-BEAGLE does not support invariant site " "models yet... "); Exit("\n"); } #endif if (tree->io->print_json_trace == YES) JSON_Tree_Io(tree, tree->io->fp_out_json_trace); Set_Update_Eigen(YES, tree->mod); Lk(NULL, tree); Set_Update_Eigen(NO, tree->mod); PhyML_Printf("\n. Init log-likelihood: %f", tree->c_lnL); if (tree->mod->s_opt->opt_topo) { Global_Spr_Search(tree); if (tree->n_root) Add_Root(tree->a_edges[0], tree); } else { #ifdef BEAGLE tree->b_inst = create_beagle_instance(tree, io->quiet, io); #endif if (tree->mod->s_opt->opt_subst_param || tree->mod->s_opt->opt_bl_one_by_one) Round_Optimize(tree, ROUND_MAX); } /* if(tree->mod->gamma_mgf_bl) * Best_Root_Position_IL_Model(tree); */ Set_Both_Sides(YES, tree); Lk(NULL, tree); Pars(NULL, tree); Get_Tree_Size(tree); PhyML_Printf("\n\n. Log likelihood of the current tree: %.*f.", DECIMAL_DIG, tree->c_lnL); if (tree->io->ancestral == YES) Ancestral_Sequences(tree, YES); Check_Br_Lens(tree); Br_Len_Involving_Invar(tree); Rescale_Br_Len_Multiplier_Tree(tree); if (!tree->n_root) Get_Best_Root_Position(tree); /* Print the tree estimated using the current random (or * BioNJ) starting tree */ /* if(io->mod->s_opt->n_rand_starts > 1) */ if (orig_random_input_tree == YES) { Print_Tree(io->fp_out_trees, tree); fflush(NULL); } /* Record the most likely tree in a string of characters */ if (tree->c_lnL > best_lnL) { best_lnL = tree->c_lnL; if (most_likely_tree) Free(most_likely_tree); most_likely_tree = Write_Tree(tree); time(&t_end); Print_Fp_Out( io->fp_out_stats, t_beg, t_end, tree, io, num_data_set + 1, (orig_random_input_tree == YES) ? (num_rand_tree) : (num_tree), (num_rand_tree == io->mod->s_opt->n_rand_starts - 1) ? (YES) : (NO), io->precision); if (tree->io->print_site_lnl) Print_Site_Lk(tree, io->fp_out_lk); } /* Start from BioNJ tree */ if ((num_rand_tree == io->mod->s_opt->n_rand_starts - 1) && (tree->mod->s_opt->random_input_tree)) { /* Do one more iteration in the loop, but don't randomize the tree */ tree->mod->s_opt->n_rand_starts++; tree->mod->s_opt->random_input_tree = NO; } #ifdef BEAGLE finalize_beagle_instance(tree); #endif Free_Best_Spr(tree); Free_Spr_List_One_Edge(tree); Free_Spr_List_All_Edge(tree); Free_Tree_Pars(tree); Free_Tree_Lk(tree); Free_Tree(tree); } // Tree done if (io->n_data_sets == 1) rewind(io->fp_out_tree); if (most_likely_tree) PhyML_Fprintf(io->fp_out_tree, "%s\n", most_likely_tree); /* Launch bootstrap analysis */ if (io->do_boot || io->do_tbe) { if (!io->quiet) PhyML_Printf( "\n\n. Launch bootstrap analysis on the most likely tree..."); #ifdef MPI MPI_Bcast(most_likely_tree, strlen(most_likely_tree) + 1, MPI_CHAR, 0, MPI_COMM_WORLD); if (!io->quiet) PhyML_Printf("\n\n. The bootstrap analysis will use %d CPU%c.", Global_numTask, Global_numTask > 1 ? 's' : '\0'); #endif most_likely_tree = Bootstrap_From_String(most_likely_tree, cdata, mod, io); PhyML_Printf("\n\n. Completed the bootstrap analysis succesfully."); fflush(NULL); } else if (io->ratio_test != NO) { /* Launch aLRT */ most_likely_tree = aLRT_From_String(most_likely_tree, cdata, mod, io); } /* Print the most likely tree in the output file */ if (!io->quiet) PhyML_Printf("\n\n. Printing the most likely tree in file '%s'.", Basename(io->out_tree_file)); if (io->n_data_sets == 1) rewind(io->fp_out_tree); t_tree *dum; dum = Read_Tree(&most_likely_tree); dum->data = cdata; dum->mod = mod; dum->io = io; Connect_CSeqs_To_Nodes(cdata, io, dum); Insert_Duplicates(dum); Free(most_likely_tree); most_likely_tree = Write_Tree(dum); Free_Tree(dum); PhyML_Fprintf(io->fp_out_tree, "%s\n", most_likely_tree); if (io->n_trees > 1 && io->n_data_sets > 1) break; } Free_Calign(cdata); } else { PhyML_Printf("\n== No data was found.\n"); PhyML_Printf("\n== Err. in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } Free_Model_Complete(mod); } if (most_likely_tree) Free(most_likely_tree); if (mod->s_opt->n_rand_starts > 1) PhyML_Printf("\n. Best log likelihood: %f\n", best_lnL); Free_Optimiz(mod->s_opt); Free_Model_Basic(mod); if (io->fp_in_constraint_tree) fclose(io->fp_in_constraint_tree); if (io->fp_in_align) fclose(io->fp_in_align); if (io->fp_in_tree) fclose(io->fp_in_tree); if (io->fp_out_lk) fclose(io->fp_out_lk); if (io->fp_out_tree) fclose(io->fp_out_tree); if (io->fp_out_trees) fclose(io->fp_out_trees); if (io->fp_out_stats) fclose(io->fp_out_stats); if (io->fp_out_trace) fclose(io->fp_out_trace); if (io->fp_out_json_trace) fclose(io->fp_out_json_trace); if (io->fp_in_constraint_tree != NULL) Free_Tree(io->cstr_tree); Free_Input(io); time(&t_end); Print_Time_Info(t_beg, t_end); #ifdef MPI MPI_Finalize(); #endif return 0; } #elif (M4) #include "m4.h" int main(int argc, char **argv) { M4_main(argc, argv); return 1; } #elif (PART) #include "mg.h" int main(int argc, char **argv) { PART_main(argc, argv); return 1; } /* #elif(PHYTIME) */ /* #include "times.h" */ /* int main(int argc, char **argv) */ /* { */ /* TIMES_main(argc, argv); */ /* return 1; */ /* } */ #elif (PHYCONT) #include "continuous.h" int main(int argc, char **argv) { CONT_main(argc, argv); return 1; } #elif (RF) int main(int argc, char **argv) { // option *io; // int r_seed; // io = (option *)Get_Input(argc, argv); // if (!io) return (0); // r_seed = (io->r_seed < 0) ? (time(NULL)) : (io->r_seed); // srand(r_seed); // io->r_seed = r_seed; // Get_Seq(io); // Shuffle_Sites(io->mod->ras->pinvar->v, io->data, io->n_otu); // Print_Seq(stdout, io->data, io->n_otu); /* t_tree *tree1, *tree2; */ /* FILE *fp_tree1, *fp_tree2; */ /* int i,j; */ /* fp_tree1 = (FILE *)fopen(argv[1],"r"); */ /* fp_tree2 = (FILE *)fopen(argv[2],"r"); */ /* tree1 = Read_Tree_File_Phylip(fp_tree1); */ /* tree2 = Read_Tree_File_Phylip(fp_tree2); */ /* Prune_Tree(tree1,tree2); */ /* Prune_Tree(tree2,tree1); */ /* PhyML_Printf("%s\n%s", */ /* Write_Tree(tree1), */ /* Write_Tree(tree2)); */ /* Match_Nodes_In_Small_Tree(tree1,tree2); */ /* For(i,2*tree1->n_otu-2) */ /* { */ /* printf("\n. Node %d in tree1 matches node %d in * tree2",i,(tree1->noeud[i]->match_node)?(tree1->noeud[i]->match_node->num):(-1)); */ /* } */ t_tree *tree1, *tree2; FILE *fp_tree1, *fp_tree2; int i,j,rf,n_edges,n_common,bip_size; phydbl thresh; t_edge *b; fp_tree1 = (FILE *)fopen(argv[1],"r"); fp_tree2 = (FILE *)fopen(argv[2],"r"); tree1 = Read_Tree_File_Phylip(fp_tree1); tree2 = Read_Tree_File_Phylip(fp_tree2); // Get_Rid_Of_Prefix('_',tree1); // Find_Common_Tips(tree1,tree2); Alloc_Bip(tree1); Alloc_Bip(tree2); Get_Bip(tree1->a_nodes[0],tree1->a_nodes[0]->v[0],tree1); Get_Bip(tree2->a_nodes[0],tree2->a_nodes[0]->v[0],tree2); PhyML_Printf("\n. RFxLENGTH=%f", .5 * (Compare_Bip(tree1, tree2, NO, TREE_COMP_RF_PLUS_LENGTH) + Compare_Bip(tree2, tree1, NO, TREE_COMP_RF_PLUS_LENGTH))); PhyML_Printf("\n. PLAIN RF=%f",.5 * (Compare_Bip(tree1, tree2, NO, TREE_COMP_RF_PLAIN) + Compare_Bip(tree2, tree1, NO, TREE_COMP_RF_PLAIN))); // PhyML_Printf("\n. INT LENGTHS=%f",.5 * (Compare_Bip(tree1, tree2, NO, TREE_COMP_LENGTH_SHARED_EDGES) + Compare_Bip(tree2, tree1, NO, TREE_COMP_LENGTH_SHARED_EDGES))); // PhyML_Printf("\n. EXT LENGTHS=%f",.5 * (Compare_Bip(tree1, tree2, NO, TREE_COMP_LENGTH_EXTERNAL_EDGES) + Compare_Bip(tree2, tree1, NO, TREE_COMP_LENGTH_EXTERNAL_EDGES))); PhyML_Printf("\n. INT LENGTHS=%f",(Compare_Bip(tree1, tree2, NO, TREE_COMP_LENGTH_SHARED_EDGES))); PhyML_Printf("\n. EXT LENGTHS=%f",(Compare_Bip(tree1, tree2, NO, TREE_COMP_LENGTH_EXTERNAL_EDGES))); // for (i = 0; i < 2 * tree1->n_otu - 3; ++i) tree1->a_edges[i]->bip_score = 0; // for (i = 0; i < 2 * tree2->n_otu - 3; ++i) tree2->a_edges[i]->bip_score = 0; /* rf = 0; */ /* n_edges = 0; */ /* /\* First tree *\/ */ /* For(i,2*tree1->n_otu-3) */ /* { */ /* /\* Consider the branch only if the corresponding bipartition has * size > 1 *\/ */ /* b = tree1->a_edges[i]; */ /* bip_size = MIN(b->left->bip_size[b->l_r],b->rght->bip_size[b->r_l]); */ /* if(bip_size > 1) */ /* { */ /* /\* with non-zero length *\/ */ /* if(tree1->a_edges[i]->l > thresh) */ /* { */ /* n_edges++; */ /* /\* This t_edge is not found in tree2 *\/ */ /* if(!tree1->a_edges[i]->bip_score) rf++; ; */ /* } */ /* } */ /* } */ /* /\* Second tree *\/ */ /* For(i,2*tree2->n_otu-3) */ /* { */ /* b = tree2->a_edges[i]; */ /* bip_size = MIN(b->left->bip_size[b->l_r],b->rght->bip_size[b->r_l]); */ /* if(bip_size > 1) */ /* { */ /* if(tree2->a_edges[i]->l > thresh) */ /* { */ /* n_edges++; */ /* /\* This t_edge is not found in tree1 *\/ */ /* if(!tree2->a_edges[i]->bip_score) rf++; ; */ /* } */ /* } */ /* } */ /* if(!n_edges) */ /* { */ /* Exit("\n. No comparable internal edges were found.\n"); */ /* } */ /* else */ /* { */ /* PhyML_Printf("\n. Robinson and Foulds distance: * %f.",(double)rf/(n_edges)); */ /* /\* PhyML_Printf("\n. %d internal edges were processed (%d in the * first tree, %d in the second).\n",n_edges,n_edges_t1,n_edges-n_edges_t1); * *\/ */ /* PhyML_Printf("\n"); */ /* } */ return 1; } #elif (TIPORDER) #include "tiporder.h" int main(int argc, char **argv) { TIPO_main(argc, argv); return 1; } #elif (TEST) #include "xml.h" int main(int argc, char **argv) { // /* Prediction using linear extrapolation of velocities estimated at the // tips. Takes as input */ // /* the XML file used for running the MCMC analysis (so as to get the // coordinates + sampling dates), */ // /* the list of sampled trees, the time interval for which prediction will // be made and the burnin */ // /* proportion */ // option *io; // t_tree *tree; // xml_node *root; // phydbl date_old,date_recent,burnin; // short int first; // int stepsize,sampsize; // date_recent = atof(argv[4]); // date_old = atof(argv[5]); // burnin = atof(argv[6]); // sampsize = 1000; // first = YES; // PhyML_Printf("\n. Time interval considered: // [%f,%f]",date_old,date_recent); assert(date_old < date_recent); // io = (option *)Get_Input(argc,argv); // if(!io) return(0); // Read_User_Tree(NULL,NULL,io); // root = XML_Load_File(io->fp_in_xml); // stepsize = io->treelist->list_size*(1. - burnin) / sampsize; // for(int i=0;itreelist->list_size;i++) // { // if(i > (int)(burnin*io->treelist->list_size)) // { // PhyML_Fprintf(stderr,"\n. Processing tree %d",i+1); // tree = io->treelist->tree[i]; // tree->times = TIMES_Make_Time_Struct(tree->n_otu); // TIMES_Init_Time_Struct(tree->times,NULL,tree->n_otu); // tree->rates = RATES_Make_Rate_Struct(tree->n_otu); // RATES_Init_Rate_Struct(tree->rates,NULL,tree->n_otu); // tree->mmod = PHYREX_Make_Migrep_Model(tree->n_otu,2); // tree->mmod->n_dim = 2; // PHYREX_Set_Default_Migrep_Mod(tree->n_otu,tree->mmod); // XML_Read_Calibration(root,tree); // MIXT_Chain_Cal(tree); // TIMES_Randomize_Tip_Times_Given_Calibrations(tree); // Topology // is unchanged tree->rates->clock_r = 1.0; // TIMES_Bl_To_Times(1,tree); // Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); // Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); // PHYREX_Make_And_Connect_Tip_Disks(tree); // PHYREX_Tree_To_Ldsk(tree); // Node_Labels_To_Velocities(tree); // Node_Labels_To_Locations(tree); // if(first == YES) PhyML_Printf("\n. XXX Tree\t Time\t Tax\t // Longitude\t Latitude\t NextLongitude\t NextLatitude"); first = // NO; // for(int j=0;j<2*tree->n_otu-1;++j) // { // if(tree->a_nodes[j]->tax == YES) // { // phydbl survival_duration,survival_rate,t,delta_t; // int k,K; // survival_rate = 1.0; // K = 4; // delta_t = (date_recent - date_old) / K; // survival_duration = Rexp(survival_rate); // if(tree->times->nd_t[j] + survival_duration > date_old) // { // t = date_old; // k = 0; // do // { // PhyML_Printf("\n. XXX %d\t %f\t %d\t %f\t %f\t // %f\t %f", // i+1, // tree->times->nd_t[j], // tree->a_nodes[j]->tax, // tree->a_nodes[j]->ldsk->coord->lonlat[0], // tree->a_nodes[j]->ldsk->coord->lonlat[1], // tree->a_nodes[j]->ldsk->coord->lonlat[0] // + (k*delta_t) * // tree->a_nodes[j]->ldsk->veloc->deriv[0], // tree->a_nodes[j]->ldsk->coord->lonlat[1] // + (k*delta_t) * // tree->a_nodes[j]->ldsk->veloc->deriv[1]); // k++; // t += delta_t; // } // while(t < MIN(date_recent,tree->times->nd_t[j] + // survival_duration)); // } // } // } // PHYREX_Free_Ldsk_Struct(tree); // RATES_Free_Rates(tree->rates); // TIMES_Free_Times(tree->times); // Free_Mmod(tree->mmod); // Free_Tree(tree); // } // } // Exit("\n"); // /* Select samples in the 801 sequence WNV data set within a user defined // date range ./test --xml=../WNV_RRW_tree_1.xml 2000 1990 1.0 */ option *io; // xml_node // *beast_root,*beast_taxa,*beast_taxon,*beast_date,*beast_loc,*beast_seq,**valid_taxa; // xml_node *phyrex_root,*nd,*ndnd; // int i,n_selected,n_selected_max,r_seed; // FILE *fp_xml,*fp_coord,*fp_seq; // char *filename,*dum,*xml_filename; // phydbl date_recent, date_f; // int *permut; // phydbl *select_proba,sum; // valid_taxa = (xml_node **)mCalloc(800,sizeof(xml_node *)); // select_proba = (phydbl *)mCalloc(800,sizeof(phydbl)); // filename = (char *)mCalloc(100,sizeof(char)); // xml_filename = (char *)mCalloc(100,sizeof(char)); // r_seed = time(NULL); // PhyML_Printf("\n seed: %d",r_seed); // srand(r_seed); // io = (option *)Get_Input(argc,argv); // if(!io) return(0); // date_recent = atof(argv[2]); // n_selected_max = atoi(argv[3]); // dum = (char *)mCalloc(100,sizeof(char)); // sprintf(dum,"%s%d%s","wnv_config_",r_seed,".xml"); // strcpy(xml_filename,dum); // Free(dum); // PhyML_Printf("\n. Upper limit of time: %f",date_recent); // strcpy(filename,"coord.txt"); // fp_coord = Openfile(filename,WRITE); // PhyML_Fprintf(fp_coord,"traits lat long\n"); // PhyML_Fprintf(fp_coord,"|NorthEast| 1000 1000\n"); // PhyML_Fprintf(fp_coord,"|SouthWest| -1000 -1000"); // strcpy(filename,"seq.txt"); // fp_seq = Openfile(filename,WRITE); // dum = (char *)mCalloc(100,sizeof(char)); // sprintf(dum,"%s%d","wnv_predict_",r_seed); // phyrex_root = Generate_PhyREX_XMLObj("ibm",dum,"seq.txt","coord.txt"); // Free(dum); // beast_root = XML_Load_File(io->fp_in_xml); // beast_taxa = XML_Search_Node_Name("taxa",NO,beast_root); // i = 1; // n_selected = 0; // beast_taxon = beast_taxa->child; // do // { // beast_date = XML_Search_Node_Name("date",NO,beast_taxon); // assert(beast_date); // date_f = atof(XML_Get_Attribute_Value(beast_date,"value")); // if(date_f < date_recent) // { // valid_taxa[n_selected] = beast_taxon; // select_proba[n_selected] = exp(-fabs(date_f-date_recent)); // n_selected++; // } // beast_taxon = beast_taxon->next; // } // while(beast_taxon); // PhyML_Fprintf(fp_seq,"%d 10302\n",MIN(n_selected,n_selected_max)); // permut = Permutate(MIN(n_selected,n_selected_max)); // sum = 0.0; // for(i=0;iattr = XML_Make_Attribute(NULL,"id",dum); // ndnd = XML_Add_Node(nd,"taxon"); // ndnd->attr = // XML_Make_Attribute(NULL,"value",XML_Get_Attribute_Value(valid_taxa[permut[i]],"id")); // nd = XML_Add_Node(phyrex_root,"calibration"); // dum = (char *)mCalloc(100,sizeof(char)); // sprintf(dum,"%s%d","cal",i+1); // nd->attr = XML_Make_Attribute(NULL,"id",dum); // Free(dum); // ndnd = XML_Add_Node(nd,"lower"); // XML_Set_Node_Value(ndnd,XML_Get_Attribute_Value(beast_date,"value")); // ndnd = XML_Add_Node(nd,"upper"); // XML_Set_Node_Value(ndnd,XML_Get_Attribute_Value(beast_date,"value")); // ndnd = XML_Add_Node(nd,"appliesto"); // dum = (char *)mCalloc(100,sizeof(char)); // sprintf(dum,"%s%d","clad",i+1); // ndnd->attr = XML_Make_Attribute(NULL,"clade.id",dum); // Free(dum); // PhyML_Fprintf(fp_coord,"\n"); // PhyML_Fprintf(fp_coord," // %s",XML_Get_Attribute_Value(valid_taxa[permut[i]],"id")); // beast_loc = // XML_Search_Node_Generic("attr","name","latitude",NO,valid_taxa[permut[i]]); // assert(beast_loc); // PhyML_Fprintf(fp_coord,"\t %s",beast_loc->value); // beast_loc = // XML_Search_Node_Generic("attr","name","longitude",NO,valid_taxa[permut[i]]); // assert(beast_loc); // PhyML_Fprintf(fp_coord,"\t %s",beast_loc->value); // beast_seq = // XML_Search_Node_Attribute_Value("idref",XML_Get_Attribute_Value(valid_taxa[permut[i]],"id"),NO,beast_root); // assert(beast_seq); // PhyML_Printf("\n. Found match with %s (%d) prob: // %f",XML_Get_Attribute_Value(valid_taxa[permut[i]],"id"),permut[i],select_proba[permut[i]]); // PhyML_Fprintf(fp_seq,"%s",XML_Get_Attribute_Value(valid_taxa[permut[i]],"id")); // PhyML_Fprintf(fp_seq,"\t\t%s\n",beast_seq->value); // select_proba[permut[i]] = 0.0; // sum = 0.0; // for(int i=0;in_otu); for (i = 0; i < tree->n_otu; ++i) { PhyML_Printf("\n", i + 1); PhyML_Printf("\n\t", tree->a_nodes[i]->name); PhyML_Printf("\n"); PhyML_Printf("\n", i + 1); PhyML_Printf("\n\t-%f", atof(strrchr(tree->a_nodes[i]->name, '|') + 1)); PhyML_Printf("\n\t-%f", atof(strrchr(tree->a_nodes[i]->name, '|') + 1)); PhyML_Printf("\n\t", i + 1); PhyML_Printf("\n"); } PhyML_Printf("\n\n%d\t 4", tree->n_otu); for (i = 0; i < tree->n_otu; ++i) { PhyML_Printf("\n%s\tATGC", tree->a_nodes[i]->name); } Exit("\n"); // Get_Seq(io); // for(i=0;in_otu;i++) // { // sscanf(io->data[i]->name,"%d",&year); // PhyML_Printf("\n%s\t%d",io->data[i]->name,year); // } for (i = 0; i < io->n_otu; i++) { // sscanf(io->data[i]->name,"%[^_]_%[^_]_%lf",a,b,&year); // PhyML_Printf("\n. a: %s b: %s",a,b); strtok(io->data[i]->name, "_"); char *a = strtok(NULL, "_"); year = strtok(NULL, "_"); lat = strtok(NULL, "_"); lon = strtok(NULL, "_"); PhyML_Printf("\n\t ", io->data[i]->name, a, year); PhyML_Printf( "\n\t\t ", year); PhyML_Printf("\n\t\t "); PhyML_Printf("\n\t\t\t %s", lat); PhyML_Printf("\n\t\t "); PhyML_Printf("\n\t\t "); PhyML_Printf("\n\t\t\t %s", lon); PhyML_Printf("\n\t\t "); PhyML_Printf("\n\t\t "); PhyML_Printf("\n\t\t\t %s %s", lat, lon); PhyML_Printf("\n\t\t "); PhyML_Printf("\n\t "); // PhyML_Printf("\n",i+1); // PhyML_Printf("\n\t",io->data[i]->name); // PhyML_Printf("\n"); // PhyML_Printf("\n",i+1); // PhyML_Printf("\n\t%d",year); // PhyML_Printf("\n\t%d",year); // PhyML_Printf("\n\t",i+1); // PhyML_Printf("\n"); } // FILE *fp; // char *name, *date; // int i; // name = (char *)mCalloc(T_MAX_NAME, sizeof(char)); // date = (char *)mCalloc(T_MAX_NAME, sizeof(char)); // i = 0; // fp = Openfile(argv[1], READ); // do // { // if (fscanf(fp, "%s", name) == EOF) // break; // if (fscanf(fp, "%s", date) == EOF) // break; // PhyML_Printf("\n", i + 1); // PhyML_Printf("\n\t", name); // PhyML_Printf("\n"); // PhyML_Printf("\n", i + 1); // PhyML_Printf("\n\t%s", date); // PhyML_Printf("\n\t%s", date); // PhyML_Printf("\n\t", i + 1); // PhyML_Printf("\n"); // ++i; // } while (1); } #elif (INVITEE) #include "invitee.h" int main(int argc, char **argv) { // My_Function(argc, argv); // PhyTime_XML(argc, argv); // Get_Input(argc, argv); // return 1; } #elif (GEO) #include "geo.h" int main(int argc, char **argv) { GEO_Main(argc, argv); return 1; } #elif (defined PHYREX || PHYREXSIM) #include "phyrex.h" int main(int argc, char **argv) { PHYREX_Main(argc, argv); return 1; } #elif (PHYTIME) #include "date.h" int main(int argc, char **argv) { DATE_Main(argc, argv); return 1; } #elif (CHECKPOINT) #include "checkpoint.h" int main(int argc, char **argv) { CHECK_Main(argc, argv); return 1; } #elif (EVOLVE) #include "evolve.h" int main(int argc, char **argv) { EVOLVE_Main(argc, argv); return 1; } #endif stephaneguindon-phyml-76a39c8/src/make.c000066400000000000000000002343231501136442400202610ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "make.h" ////////////////////////////////////////////////////////////// void Make_Tree_For_Lk(t_tree *tree) { int i; calign *cdata; if (tree->is_mixt_tree == YES) { MIXT_Make_Tree_For_Lk(tree); return; } const unsigned int ns = tree->mod->ns; const unsigned int nsns = ns * ns; #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) const unsigned int sz = (int)BYTE_ALIGN / 8; const unsigned int ncatg = tree->mod->ras->n_catg; #endif cdata = tree->data; assert(cdata); tree->c_lnL_sorted = (phydbl *)mCalloc(tree->data->n_pattern, sizeof(phydbl)); tree->cur_site_lk = (phydbl *)mCalloc(tree->data->n_pattern, sizeof(phydbl)); tree->old_site_lk = (phydbl *)mCalloc(tree->data->n_pattern, sizeof(phydbl)); tree->site_lk_cat = (phydbl *)mCalloc( MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(phydbl)); tree->unscaled_site_lk_cat = (phydbl *)mCalloc( MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->data->n_pattern, sizeof(phydbl)); tree->fact_sum_scale = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); #if (defined(__AVX__) || defined(__AVX2__)) #ifndef WIN32 if (posix_memalign( (void **)&tree->dot_prod, BYTE_ALIGN, (size_t)tree->data->n_pattern * tree->mod->ns * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign( (void **)&tree->expl, BYTE_ALIGN, (size_t)3 * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->p_lk_left_pi, BYTE_ALIGN, (size_t)ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->l_ev, BYTE_ALIGN, (size_t)nsns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_tPij1, BYTE_ALIGN, (size_t)(ncatg * nsns / sz) * sizeof(__m256d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_tPij2, BYTE_ALIGN, (size_t)(ncatg * nsns / sz) * sizeof(__m256d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_pmat1plk1, BYTE_ALIGN, (size_t)ns / sz * sizeof(__m256d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_pmat2plk2, BYTE_ALIGN, (size_t)ns / sz * sizeof(__m256d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_plk0, BYTE_ALIGN, (size_t)(ns / sz) * sizeof(__m256d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_l_ev, BYTE_ALIGN, (size_t)nsns / sz * sizeof(__m256d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_r_ev, BYTE_ALIGN, (size_t)nsns / sz * sizeof(__m256d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_prod_left, BYTE_ALIGN, (size_t)ns / sz * sizeof(__m256d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_prod_rght, BYTE_ALIGN, (size_t)ns / sz * sizeof(__m256d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign( (void **)&tree->big_lk_array, BYTE_ALIGN, (size_t)((3 * tree->n_otu - 2) * tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns + 2 * (2 * tree->n_otu - 1) * tree->mod->ras->n_catg * tree->mod->ns * tree->mod->ns) * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else tree->dot_prod = _aligned_malloc( tree->data->n_pattern * tree->mod->ns * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * sizeof(phydbl), BYTE_ALIGN); tree->expl = _aligned_malloc( 3 * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns * sizeof(phydbl), BYTE_ALIGN); tree->p_lk_left_pi = _aligned_malloc(ns * sizeof(phydbl), BYTE_ALIGN); tree->l_ev = _aligned_malloc(ns * ns * sizeof(phydbl), BYTE_ALIGN); tree->_tPij1 = _aligned_malloc(ncatg * nsns / sz * sizeof(__m256d), BYTE_ALIGN); tree->_tPij2 = _aligned_malloc(ncatg * nsns / sz * sizeof(__m256d), BYTE_ALIGN); tree->_pmat1plk1 = _aligned_malloc(ns / sz * sizeof(__m256d), BYTE_ALIGN); tree->_pmat2plk2 = _aligned_malloc(ns / sz * sizeof(__m256d), BYTE_ALIGN); tree->_plk0 = _aligned_malloc(ns / sz * sizeof(__m256d), BYTE_ALIGN); tree->_l_ev = _aligned_malloc(ns * ns / sz * sizeof(__m256d), BYTE_ALIGN); tree->_r_ev = _aligned_malloc(ns * ns / sz * sizeof(__m256d), BYTE_ALIGN); tree->_prod_left = _aligned_malloc(ns / sz * sizeof(__m256d), BYTE_ALIGN); tree->_prod_rght = _aligned_malloc(ns / sz * sizeof(__m256d), BYTE_ALIGN); tree->big_lk_array = _aligned_malloc( ((3 * tree->n_otu - 2) * tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns + 2 * (2 * tree->n_otu - 1) * tree->mod->ras->n_catg * tree->mod->ns * tree->mod->ns) * sizeof(phydbl), BYTE_ALIGN); #endif #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign( (void **)&tree->dot_prod, BYTE_ALIGN, (size_t)tree->data->n_pattern * tree->mod->ns * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign( (void **)&tree->expl, BYTE_ALIGN, (size_t)3 * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->p_lk_left_pi, BYTE_ALIGN, (size_t)ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->l_ev, BYTE_ALIGN, (size_t)nsns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_tPij1, BYTE_ALIGN, (size_t)(ncatg * nsns / sz) * sizeof(__m128d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_tPij2, BYTE_ALIGN, (size_t)(ncatg * nsns / sz) * sizeof(__m128d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_pmat1plk1, BYTE_ALIGN, (size_t)ns / sz * sizeof(__m128d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_pmat2plk2, BYTE_ALIGN, (size_t)ns / sz * sizeof(__m128d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_plk0, BYTE_ALIGN, (size_t)(ns / sz) * sizeof(__m128d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_l_ev, BYTE_ALIGN, (size_t)nsns / sz * sizeof(__m128d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_r_ev, BYTE_ALIGN, (size_t)nsns / sz * sizeof(__m128d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_prod_left, BYTE_ALIGN, (size_t)ns / sz * sizeof(__m128d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&tree->_prod_rght, BYTE_ALIGN, (size_t)ns / sz * sizeof(__m128d))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign( (void **)&tree->big_lk_array, BYTE_ALIGN, (size_t)((3 * tree->n_otu - 2) * tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns + 2 * (2 * tree->n_otu - 1) * tree->mod->ras->n_catg * tree->mod->ns * tree->mod->ns) * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else tree->dot_prod = _aligned_malloc( tree->data->n_pattern * tree->mod->ns * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * sizeof(phydbl), BYTE_ALIGN); tree->expl = _aligned_malloc( 3 * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns * sizeof(phydbl), BYTE_ALIGN); tree->p_lk_left_pi = _aligned_malloc(ns * sizeof(phydbl), BYTE_ALIGN); tree->l_ev = _aligned_malloc(ns * ns * sizeof(phydbl), BYTE_ALIGN); tree->_tPij1 = _aligned_malloc(ncatg * nsns / sz * sizeof(__m128d), BYTE_ALIGN); tree->_tPij2 = _aligned_malloc(ncatg * nsns / sz * sizeof(__m128d), BYTE_ALIGN); tree->_pmat1plk1 = _aligned_malloc(ns / sz * sizeof(__m128d), BYTE_ALIGN); tree->_pmat2plk2 = _aligned_malloc(ns / sz * sizeof(__m128d), BYTE_ALIGN); tree->_plk0 = _aligned_malloc(ns / sz * sizeof(__m128d), BYTE_ALIGN); tree->_l_ev = _aligned_malloc(ns * ns / sz * sizeof(__m128d), BYTE_ALIGN); tree->_r_ev = _aligned_malloc(ns * ns / sz * sizeof(__m128d), BYTE_ALIGN); tree->_prod_left = _aligned_malloc(ns / sz * sizeof(__m128d), BYTE_ALIGN); tree->_prod_rght = _aligned_malloc(ns / sz * sizeof(__m128d), BYTE_ALIGN); tree->big_lk_array = _aligned_malloc( ((3 * tree->n_otu - 2) * tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns + 2 * (2 * tree->n_otu - 1) * tree->mod->ras->n_catg * tree->mod->ns * tree->mod->ns) * sizeof(phydbl), BYTE_ALIGN); #endif #elif (!(defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__))) tree->dot_prod = (phydbl *)mCalloc( tree->data->n_pattern * tree->mod->ns * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(phydbl)); tree->expl = (phydbl *)mCalloc( 3 * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns, sizeof(phydbl)); tree->p_lk_left_pi = (phydbl *)mCalloc(ns, sizeof(phydbl)); tree->l_ev = (phydbl *)mCalloc(nsns, sizeof(phydbl)); tree->big_lk_array = (phydbl *)mCalloc( ((3 * tree->n_otu - 2) * tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns + 2 * (2 * tree->n_otu - 1) * tree->mod->ras->n_catg * tree->mod->ns * tree->mod->ns), sizeof(phydbl)); #endif tree->big_lk_array_pos = 0; tree->log_lks_aLRT = (phydbl **)mCalloc(3, sizeof(phydbl *)); for (i = 0; i < 3; i++) tree->log_lks_aLRT[i] = (phydbl *)mCalloc(tree->data->init_len, sizeof(phydbl)); for (i = 0; i < 2 * tree->n_otu - 1; ++i) Make_Edge_NNI(tree->a_edges[i]); Make_Extra_Edge_Lk(tree); if (tree->is_mixt_tree == NO) { for (i = 0; i < 2 * tree->n_otu - 1; ++i) Make_Edge_Lk(tree->a_edges[i], tree); for (i = 0; i < 2 * tree->n_otu - 2; ++i) Make_Node_Lk(tree->a_nodes[i]); for (i = 0; i < 2 * tree->n_otu - 1; ++i) Make_Edge_Loc(tree->a_edges[i], tree); Init_Partial_Lk_Tips_Double(tree); Init_Partial_Lk_Loc(tree); if (tree->n_root != NULL) { Free_Edge_Loc_Rght(tree->n_root->b[1]); Free_Edge_Loc_Rght(tree->n_root->b[2]); tree->n_root->b[1]->p_lk_rght = tree->e_root->p_lk_left; tree->n_root->b[2]->p_lk_rght = tree->e_root->p_lk_rght; tree->n_root->b[1]->p_lk_tip_r = tree->e_root->p_lk_tip_l; tree->n_root->b[2]->p_lk_tip_r = tree->e_root->p_lk_tip_r; tree->n_root->b[1]->div_post_pred_rght = tree->e_root->div_post_pred_left; tree->n_root->b[2]->div_post_pred_rght = tree->e_root->div_post_pred_rght; tree->n_root->b[1]->sum_scale_rght = tree->e_root->sum_scale_left; tree->n_root->b[2]->sum_scale_rght = tree->e_root->sum_scale_rght; tree->n_root->b[1]->sum_scale_rght_cat = tree->e_root->sum_scale_left_cat; tree->n_root->b[2]->sum_scale_rght_cat = tree->e_root->sum_scale_rght_cat; tree->n_root->b[1]->patt_id_rght = tree->e_root->patt_id_left; tree->n_root->b[2]->patt_id_rght = tree->e_root->patt_id_rght; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// align **Make_Empty_Alignment(option *io) { int i; char *line; align **data; line = (char *)mCalloc(T_MAX_LINE, sizeof(char)); data = (align **)mCalloc(io->n_otu, sizeof(align *)); for (i = 0; i < io->n_otu; i++) { data[i] = (align *)mCalloc(1, sizeof(align)); data[i]->name = (char *)mCalloc(T_MAX_NAME, sizeof(char)); data[i]->state = (char *)mCalloc(io->init_len * io->state_len + 1, sizeof(char)); data[i]->is_ambigu = NULL; data[i]->len = 0; Random_String(data[i]->name, 5); while (data[i]->len < io->init_len * io->state_len) { data[i]->state[data[i]->len] = 'X'; data[i]->len++; } } for (i = 0; i < io->n_otu; i++) data[i]->state[data[i]->len] = '\0'; Free(line); return data; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Tree_For_Pars(t_tree *tree) { int i; calign *cdata; if (tree->is_mixt_tree == YES) { MIXT_Make_Tree_For_Pars(tree); return; } cdata = tree->data; assert(cdata); assert(tree->mod); tree->site_pars = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); tree->step_mat = (int *)mCalloc(tree->mod->ns * tree->mod->ns, sizeof(int)); for (i = 0; i < 2 * tree->n_otu - 1; ++i) Make_Edge_Pars(tree->a_edges[i], tree); Init_Ui_Tips(tree); Init_Partial_Pars_Tips( tree); /* Must be called after Init_Ui_Tips is called */ if (tree->n_root) { Free_Edge_Pars_Rght(tree->a_edges[2 * tree->n_otu - 3]); Free_Edge_Pars_Rght(tree->a_edges[2 * tree->n_otu - 2]); } Get_Step_Mat(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_All_Edges_Lk(t_node *a, t_node *d, t_tree *tree) { int i; for (i = 0; i < 3; i++) if ((a->v[i]) && (a->v[i] == d)) Make_Edge_Lk(a->b[i], tree); if (d->tax) return; else { for (i = 0; i < 3; i++) { if (d->v[i] != a && d->b[i] != tree->e_root) Make_All_Edges_Lk(d, d->v[i], tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_edge *Make_Edge_Light(t_node *a, t_node *d, int num) { t_edge *b; b = (t_edge *)mCalloc(1, sizeof(t_edge)); b->l = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(b->l); b->l_old = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(b->l_old); b->l_var = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(b->l_var); b->l_var_old = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(b->l_var_old); Init_Edge_Light(b, num); if (a && b) { b->left = a; b->rght = d; if (a->tax) { b->rght = a; b->left = d; } /* root */ /* a tip is necessary on the right side of the t_edge */ (b->left == a) ? (Set_Edge_Dirs(b, a, d, NULL)) : (Set_Edge_Dirs(b, d, a, NULL)); assert(b->l_r > -1); assert(b->r_l > -1); b->l_old->v = b->l->v; } else { b->left = NULL; b->rght = NULL; } return b; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_Pars(t_edge *b, t_tree *tree) { assert(b); Make_Edge_Pars_Left(b, tree); Make_Edge_Pars_Rght(b, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_Pars_Left(t_edge *b, t_tree *tree) { b->pars_l = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); b->ui_l = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); b->p_pars_l = (int *)mCalloc(tree->data->n_pattern * tree->mod->ns, sizeof(int)); b->n_diff_states_l = (int *)mCalloc(tree->mod->ns, sizeof(int)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_Pars_Rght(t_edge *b, t_tree *tree) { b->pars_r = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); b->ui_r = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); b->p_pars_r = (int *)mCalloc(tree->data->n_pattern * tree->mod->ns, sizeof(int)); b->n_diff_states_r = (int *)mCalloc(tree->mod->ns, sizeof(int)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_Lk(t_edge *b, t_tree *tree) { if (tree->is_mixt_tree) { PhyML_Printf("\n== Err. in file %s at line %d (function '%s') \n", __FILE__, __LINE__, __FUNCTION__); Warn_And_Exit(""); } b->l_old->v = b->l->v; /* #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || * defined(__SSE2__) || defined(__SSE3__)) */ /* #ifndef WIN32 */ /* if(posix_memalign((void * *)&b->Pij_rr,BYTE_ALIGN,(size_t)tree->mod->ras->n_catg*tree->mod->ns*tree->mod->ns*sizeof(phydbl))) * Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* if(posix_memalign((void * *)&b->tPij_rr,BYTE_ALIGN,(size_t)tree->mod->ras->n_catg*tree->mod->ns*tree->mod->ns*sizeof(phydbl))) * Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* #else */ /* b->Pij_rr = * _aligned_malloc(tree->mod->ras->n_catg*tree->mod->ns*tree->mod->ns*sizeof(phydbl),BYTE_ALIGN); */ /* b->tPij_rr = * _aligned_malloc(tree->mod->ras->n_catg*tree->mod->ns*tree->mod->ns*sizeof(phydbl),BYTE_ALIGN); */ /* #endif */ /* #else */ /* b->Pij_rr = (phydbl * *)mCalloc(tree->mod->ras->n_catg*tree->mod->ns*tree->mod->ns,sizeof(phydbl)); */ /* b->tPij_rr = (phydbl * *)mCalloc(tree->mod->ras->n_catg*tree->mod->ns*tree->mod->ns,sizeof(phydbl)); */ /* #endif */ b->Pij_rr = tree->big_lk_array + tree->big_lk_array_pos; tree->big_lk_array_pos += tree->mod->ras->n_catg * tree->mod->ns * tree->mod->ns; b->tPij_rr = tree->big_lk_array + tree->big_lk_array_pos; tree->big_lk_array_pos += tree->mod->ras->n_catg * tree->mod->ns * tree->mod->ns; Make_Edge_Lk_Left(b, tree); Make_Edge_Lk_Rght(b, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_Lk_Left(t_edge *b, t_tree *tree) { int ns = tree->mod->ns; b->div_post_pred_left = (short int *)mCalloc(ns, sizeof(short int)); b->sum_scale_left_cat = (int *)mCalloc( MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); if (b->left && !b->left->tax) b->sum_scale_left = (int *)mCalloc(tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); else b->sum_scale_left = NULL; if (b->left) { if ((!b->left->tax) || (tree->mod->s_opt->greedy)) { /* #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || * defined(__SSE2__) || defined(__SSE3__)) */ /* #ifndef WIN32 */ /* if(posix_memalign((void * **)&b->p_lk_left,BYTE_ALIGN,(size_t)tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns*sizeof(phydbl))) * Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* #else */ /* b->p_lk_left = * _aligned_malloc(tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns*sizeof(phydbl),BYTE_ALIGN); */ /* #endif */ /* #else */ /* b->p_lk_left = (phydbl * *)mCalloc(tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns,sizeof(phydbl)); */ /* #endif */ b->p_lk_tip_l = NULL; b->p_lk_left = tree->big_lk_array + tree->big_lk_array_pos; tree->big_lk_array_pos += tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns; } else if (b->left->tax) { b->p_lk_left = NULL; #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign((void **)&b->p_lk_tip_l, BYTE_ALIGN, (size_t)tree->data->n_pattern * tree->mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else b->p_lk_tip_l = _aligned_malloc( tree->data->n_pattern * tree->mod->ns * sizeof(phydbl), BYTE_ALIGN); #endif #else b->p_lk_tip_l = (phydbl *)mCalloc(tree->data->n_pattern * tree->mod->ns, sizeof(phydbl)); #endif } } else { b->p_lk_left = NULL; b->p_lk_tip_l = NULL; } if (b->num >= 2 * tree->n_otu - 3) { b->sum_scale_left = (int *)mCalloc(tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); /* #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || * defined(__SSE2__) || defined(__SSE3__)) */ /* #ifndef WIN32 */ /* if(posix_memalign((void * **)&b->p_lk_left,BYTE_ALIGN,(size_t)tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns*sizeof(phydbl))) * Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* #else */ /* b->p_lk_left = * _aligned_malloc(tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns*sizeof(phydbl),BYTE_ALIGN); */ /* #endif */ /* #else */ /* b->p_lk_left = (phydbl * *)mCalloc(tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns,sizeof(phydbl)); */ /* #endif */ b->p_lk_left = tree->big_lk_array + tree->big_lk_array_pos; tree->big_lk_array_pos += tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns; } b->patt_id_left = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_Lk_Rght(t_edge *b, t_tree *tree) { int ns = tree->mod->ns; b->div_post_pred_rght = (short int *)mCalloc(ns, sizeof(short int)); b->sum_scale_rght_cat = (int *)mCalloc( MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); if (b->rght && b->rght->tax == NO) b->sum_scale_rght = (int *)mCalloc(tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); else b->sum_scale_rght = NULL; if (b->rght) { if ((!b->rght->tax) || (tree->mod->s_opt->greedy)) { /* #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || * defined(__SSE2__) || defined(__SSE3__)) */ /* #ifndef WIN32 */ /* if(posix_memalign((void * **)&b->p_lk_rght,BYTE_ALIGN,(size_t)tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns*sizeof(phydbl))) * Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* #else */ /* b->p_lk_rght = * _aligned_malloc(tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns*sizeof(phydbl),BYTE_ALIGN); */ /* #endif */ /* #else */ /* b->p_lk_rght = (phydbl * *)mCalloc(tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns,sizeof(phydbl)); */ /* #endif */ b->p_lk_tip_r = NULL; b->p_lk_rght = tree->big_lk_array + tree->big_lk_array_pos; tree->big_lk_array_pos += tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns; } else if (b->rght->tax) { #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign((void **)&b->p_lk_tip_r, BYTE_ALIGN, (size_t)tree->data->n_pattern * tree->mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else b->p_lk_tip_r = _aligned_malloc( tree->data->n_pattern * tree->mod->ns * sizeof(phydbl), BYTE_ALIGN); #endif #else b->p_lk_tip_r = (phydbl *)mCalloc(tree->data->n_pattern * tree->mod->ns, sizeof(phydbl)); #endif b->p_lk_rght = NULL; } } else { b->p_lk_rght = NULL; b->p_lk_tip_r = NULL; } if (b->num >= 2 * tree->n_otu - 3) { b->sum_scale_rght = (int *)mCalloc(tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); /* #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || * defined(__SSE2__) || defined(__SSE3__)) */ /* #ifndef WIN32 */ /* if(posix_memalign((void * **)&b->p_lk_rght,BYTE_ALIGN,(size_t)tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns*sizeof(phydbl))) * Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* #else */ /* b->p_lk_rght = * _aligned_malloc(tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns*sizeof(phydbl),BYTE_ALIGN); */ /* #endif */ /* #else */ /* b->p_lk_rght = (phydbl * *)mCalloc(tree->data->n_pattern*MAX(tree->mod->ras->n_catg,tree->mod->n_mixt_classes)*tree->mod->ns,sizeof(phydbl)); */ /* #endif */ b->p_lk_rght = tree->big_lk_array + tree->big_lk_array_pos; tree->big_lk_array_pos += tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns; } b->patt_id_rght = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Extra_Edge_Lk(t_tree *tree) { int ns = tree->mod->ns; tree->div_post_pred_extra_0 = (short int *)mCalloc(ns, sizeof(short int)); tree->sum_scale_cat_extra_0 = (int *)mCalloc( MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); tree->sum_scale_extra_0 = (int *)mCalloc(tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign( (void **)&tree->p_lk_extra_0, BYTE_ALIGN, (size_t)tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else tree->p_lk_extra_0 = _aligned_malloc( tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns * sizeof(phydbl), BYTE_ALIGN); #endif #else tree->p_lk_extra_0 = (phydbl *)mCalloc( tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns, sizeof(phydbl)); #endif #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign((void **)&tree->p_lk_tip_extra_0, BYTE_ALIGN, (size_t)tree->data->n_pattern * tree->mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else tree->p_lk_tip_extra_0 = _aligned_malloc( tree->data->n_pattern * tree->mod->ns * sizeof(phydbl), BYTE_ALIGN); #endif #else tree->p_lk_tip_extra_0 = (phydbl *)mCalloc(tree->data->n_pattern * tree->mod->ns, sizeof(phydbl)); #endif tree->patt_id_extra_0 = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); tree->div_post_pred_extra_1 = (short int *)mCalloc(ns, sizeof(short int)); tree->sum_scale_cat_extra_1 = (int *)mCalloc( MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); tree->sum_scale_extra_1 = (int *)mCalloc(tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(int)); #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign( (void **)&tree->p_lk_extra_1, BYTE_ALIGN, (size_t)tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else tree->p_lk_extra_1 = _aligned_malloc( tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns * sizeof(phydbl), BYTE_ALIGN); #endif #else tree->p_lk_extra_1 = (phydbl *)mCalloc( tree->data->n_pattern * MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->mod->ns, sizeof(phydbl)); #endif #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign((void **)&tree->p_lk_tip_extra_1, BYTE_ALIGN, (size_t)tree->data->n_pattern * tree->mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else tree->p_lk_tip_extra_1 = _aligned_malloc( tree->data->n_pattern * tree->mod->ns * sizeof(phydbl), BYTE_ALIGN); #endif #else tree->p_lk_tip_extra_1 = (phydbl *)mCalloc(tree->data->n_pattern * tree->mod->ns, sizeof(phydbl)); #endif tree->patt_id_extra_1 = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_Loc(t_edge *b, t_tree *tree) { Make_Edge_Loc_Left(b, tree); Make_Edge_Loc_Rght(b, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_Loc_Rght(t_edge *b, t_tree *tree) { b->p_lk_loc_rght = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_Loc_Left(t_edge *b, t_tree *tree) { b->p_lk_loc_left = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Edge_NNI(t_edge *b) { b->nni = Make_NNI(); b->nni->b = b; b->nni->left = b->left; b->nni->rght = b->rght; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_nni *Make_NNI(void) { t_nni *a_nni; a_nni = (t_nni *)mCalloc(1, sizeof(t_nni)); Init_NNI(a_nni); return a_nni; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_node *Make_Node_Light(int num) { t_node *n; n = (t_node *)mCalloc(1, sizeof(t_node)); n->v = (t_node **)mCalloc(3, sizeof(t_node *)); n->b = (t_edge **)mCalloc(3, sizeof(t_edge *)); n->score = (phydbl *)mCalloc(3, sizeof(phydbl)); n->s_ingrp = (int *)mCalloc(3, sizeof(int)); n->s_outgrp = (int *)mCalloc(3, sizeof(int)); n->cal = (t_cal **)mCalloc(MAX_N_CAL, sizeof(t_cal *)); Init_Node_Light(n, num); return n; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Node_Lk(t_node *n) { /* n->n_ex_nodes = (int *)mCalloc(2,sizeof(int)); */ return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// nexcom **Make_Nexus_Com(void) { nexcom **com; int i; com = (nexcom **)mCalloc(N_MAX_NEX_COM, sizeof(nexcom *)); for (i = 0; i < N_MAX_NEX_COM; i++) { com[i] = (nexcom *)mCalloc(1, sizeof(nexcom)); com[i]->name = (char *)mCalloc(T_MAX_NEX_COM, sizeof(char)); com[i]->parm = (nexparm **)mCalloc(N_MAX_NEX_PARM, sizeof(nexparm *)); } return com; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// nexparm *Make_Nexus_Parm(void) { nexparm *parm; parm = (nexparm *)mCalloc(1, sizeof(nexparm)); parm->name = (char *)mCalloc(T_MAX_TOKEN, sizeof(char)); parm->value = (char *)mCalloc(T_MAX_TOKEN, sizeof(char)); return parm; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// matrix *Make_Mat(int n_otu) { matrix *mat; int i; mat = (matrix *)mCalloc(1, sizeof(matrix)); mat->n_otu = n_otu; mat->P = (phydbl **)mCalloc(n_otu, sizeof(phydbl *)); mat->Q = (phydbl **)mCalloc(n_otu, sizeof(phydbl *)); mat->dist = (phydbl **)mCalloc(n_otu, sizeof(phydbl *)); mat->on_off = (int *)mCalloc(n_otu, sizeof(int)); mat->name = (char **)mCalloc(n_otu, sizeof(char *)); mat->tip_node = (t_node **)mCalloc(n_otu, sizeof(t_node *)); for (i = 0; i < n_otu; i++) { mat->P[i] = (phydbl *)mCalloc(n_otu, sizeof(phydbl)); mat->Q[i] = (phydbl *)mCalloc(n_otu, sizeof(phydbl)); mat->dist[i] = (phydbl *)mCalloc(n_otu, sizeof(phydbl)); mat->name[i] = (char *)mCalloc(T_MAX_NAME, sizeof(char)); } return mat; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *Make_Tree_From_Scratch(int n_otu, calign *data) { t_tree *tree; tree = Make_Tree(n_otu); Init_Tree(tree, n_otu); Make_All_Tree_Nodes(tree); Make_All_Tree_Edges(tree); Make_Tree_Path(tree); if (data) { Copy_Tax_Names_To_Tip_Labels(tree, data); tree->data = data; } #ifdef BEAGLE // offset the branch's partial indices because BEAGLE insists on first storing // the tips/taxa int num_branches = 2 * tree->n_otu - 1; int i; for (i = 0; i < 2 * tree->n_otu - 1; ++i) { // For edgeX, its "left" partial lies at index `num_tax + edgeX->num" tree->a_edges[i]->p_lk_left_idx = tree->n_otu + tree->a_edges[i]->p_lk_left_idx; // For edgeX, its "right" partial lies at index `num_tax + edgeX->num + // num_branches" tree->a_edges[i]->p_lk_rght_idx = tree->n_otu + tree->a_edges[i]->p_lk_left_idx + num_branches; } #endif return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *Make_Tree(int n_otu) { t_tree *tree; tree = (t_tree *)mCalloc(1, sizeof(t_tree)); tree->t_dir = (short int *)mCalloc((2 * n_otu - 2) * (2 * n_otu - 2), sizeof(int)); return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Tree_Path(t_tree *tree) { tree->curr_path = (t_node **)mCalloc(tree->n_otu, sizeof(t_node *)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_All_Tree_Nodes(t_tree *tree) { int i; tree->a_nodes = (t_node **)mCalloc(2 * tree->n_otu - 1, sizeof(t_node *)); for (i = 0; i < 2 * tree->n_otu - 1; ++i) { tree->a_nodes[i] = (t_node *)Make_Node_Light(i); if (i < tree->n_otu) tree->a_nodes[i]->tax = YES; else tree->a_nodes[i]->tax = NO; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_All_Tree_Edges(t_tree *tree) { int i; tree->a_edges = (t_edge **)mCalloc(2 * tree->n_otu - 1, sizeof(t_edge *)); for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i] = (t_edge *)Make_Edge_Light(NULL, NULL, i); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// calign *Make_Calign(int n_otu, int n_pattern, int state_len, int init_len, char **sp_names_in, int n_rm, char **sp_names_out) { calign *cdata; int j; cdata = (calign *)mCalloc(1, sizeof(calign)); cdata->c_seq = (align **)mCalloc(n_otu, sizeof(align *)); cdata->obs_state_frq = (phydbl *)mCalloc(T_MAX_ALPHABET, sizeof(phydbl)); cdata->wght = (phydbl *)mCalloc(n_pattern, sizeof(phydbl)); cdata->ambigu = (short int *)mCalloc(n_pattern, sizeof(short int)); cdata->invar = (short int *)mCalloc(n_pattern, sizeof(short int)); cdata->sitepatt = (int *)mCalloc(init_len, sizeof(int)); if (n_rm > 0) cdata->c_seq_rm = (align **)mCalloc(n_rm, sizeof(align *)); for (j = 0; j < n_otu; j++) { cdata->c_seq[j] = (align *)mCalloc(1, sizeof(align)); cdata->c_seq[j]->name = (char *)mCalloc((int)(strlen(sp_names_in[j]) + 1), sizeof(char)); strcpy(cdata->c_seq[j]->name, sp_names_in[j]); cdata->c_seq[j]->state = (char *)mCalloc(n_pattern * state_len + 1, sizeof(char)); cdata->c_seq[j]->d_state = (short int *)mCalloc(n_pattern * state_len, sizeof(short int)); cdata->c_seq[j]->is_ambigu = (short int *)mCalloc(n_pattern, sizeof(short int)); } for (j = 0; j < n_rm; j++) { cdata->c_seq_rm[j] = (align *)mCalloc(1, sizeof(align)); cdata->c_seq_rm[j]->name = (char *)mCalloc((int)(strlen(sp_names_out[j]) + 1), sizeof(char)); strcpy(cdata->c_seq_rm[j]->name, sp_names_out[j]); cdata->c_seq_rm[j]->state = (char *)mCalloc(n_pattern * state_len + 1, sizeof(char)); cdata->c_seq_rm[j]->d_state = (short int *)mCalloc(n_pattern * state_len, sizeof(short int)); cdata->c_seq_rm[j]->is_ambigu = (short int *)mCalloc(n_pattern, sizeof(short int)); } return cdata; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_treelist *Make_Treelist(int list_size) { t_treelist *tlist; tlist = (t_treelist *)mCalloc(1, sizeof(t_treelist)); tlist->list_size = list_size; tlist->tree = (t_tree **)mCalloc(list_size, sizeof(t_tree *)); return tlist; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_opt *Make_Optimiz(void) { t_opt *s_opt; s_opt = (t_opt *)mCalloc(1, sizeof(t_opt)); return s_opt; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Custom_Model(t_mod *mod) { if (!mod->r_mat) { PhyML_Printf("\n== Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit(""); } if (!mod->r_mat->rr->v) mod->r_mat->rr->v = (phydbl *)mCalloc(mod->ns * (mod->ns - 1) / 2, sizeof(phydbl)); if (!mod->r_mat->rr_val->v) mod->r_mat->rr_val->v = (phydbl *)mCalloc(mod->ns * (mod->ns - 1) / 2, sizeof(phydbl)); if (!mod->r_mat->rr_num->v) mod->r_mat->rr_num->v = (int *)mCalloc(mod->ns * (mod->ns - 1) / 2, sizeof(int *)); if (!mod->r_mat->n_rr_per_cat->v) mod->r_mat->n_rr_per_cat->v = (int *)mCalloc(mod->ns * (mod->ns - 1) / 2, sizeof(int)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_string *Make_String(int len) { t_string *ts; ts = (t_string *)mCalloc(1, sizeof(t_string)); ts->s = (char *)mCalloc(len, sizeof(char)); return (ts); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_mod *Make_Model_Basic(void) { t_mod *mod; mod = (t_mod *)mCalloc(1, sizeof(t_mod)); mod->modelname = Make_String(T_MAX_NAME); Init_String(mod->modelname); mod->custom_mod_string = Make_String(T_MAX_NAME); Init_String(mod->custom_mod_string); mod->ras = Make_RAS_Basic(); mod->kappa = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->kappa); mod->lambda = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->lambda); mod->br_len_mult = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->br_len_mult); mod->br_len_mult_unscaled = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->br_len_mult_unscaled); mod->mr = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->mr); mod->aic = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->aic); mod->bic = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->bic); mod->e_frq_weight = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->e_frq_weight); mod->r_mat_weight = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->r_mat_weight); mod->aa_rate_mat_file = Make_String(T_MAX_FILE); Init_String(mod->aa_rate_mat_file); mod->l_var_sigma = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(mod->l_var_sigma); return mod; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Call only when the values of mod->ns & ras->n_catg is set to its final value */ void Make_Model_Complete(t_mod *mod) { mod->Pij_rr = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, mod->Pij_rr); #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign((void **)&mod->Pij_rr->v, BYTE_ALIGN, (size_t)mod->ras->n_catg * mod->ns * mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else mod->Pij_rr->v = _aligned_malloc( mod->ras->n_catg * mod->ns * mod->ns * sizeof(phydbl), BYTE_ALIGN); #endif #else mod->Pij_rr->v = (phydbl *)mCalloc(mod->ras->n_catg * mod->ns * mod->ns, sizeof(phydbl)); #endif mod->eigen = (eigen *)Make_Eigen_Struct(mod->ns); // If r_mat (e_frq) are not NULL, then they have been created elsewhere and // affected. if (!mod->r_mat) { mod->r_mat = (t_rmat *)Make_Rmat(mod->ns); Init_Rmat(mod->r_mat); Make_Custom_Model(mod); } if (!mod->e_frq) { mod->e_frq = (t_efrq *)Make_Efrq(mod->ns); Init_Efrq(NULL, mod->e_frq); } Make_RAS_Complete(mod->ras); mod->e_frq->user_b_freq->len = mod->ns; if (mod->whichmodel < 0) { PhyML_Printf("\n== Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } if (mod->whichmodel == CUSTOM) Translate_Custom_Mod_String(mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_ras *Make_RAS_Basic(void) { t_ras *ras; ras = (t_ras *)mCalloc(1, sizeof(t_ras)); ras->gamma_r_proba = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, ras->gamma_r_proba); ras->gamma_r_proba->v = NULL; ras->gamma_r_proba_unscaled = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, ras->gamma_r_proba_unscaled); ras->gamma_r_proba_unscaled->v = NULL; ras->gamma_rr = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, ras->gamma_rr); ras->gamma_rr->v = NULL; ras->gamma_rr_unscaled = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, ras->gamma_rr_unscaled); ras->gamma_rr_unscaled->v = NULL; ras->alpha = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(ras->alpha); ras->pinvar = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(ras->pinvar); ras->free_rate_mr = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(ras->free_rate_mr); return (ras); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Call only when the value of ras->n_catg is set to its final value */ void Make_RAS_Complete(t_ras *ras) { if (!ras->gamma_r_proba->v) { ras->gamma_r_proba->v = (phydbl *)mCalloc(ras->n_catg, sizeof(phydbl)); ras->gamma_r_proba_unscaled->v = (phydbl *)mCalloc(ras->n_catg, sizeof(phydbl)); ras->gamma_rr->v = (phydbl *)mCalloc(ras->n_catg, sizeof(phydbl)); ras->gamma_rr_unscaled->v = (phydbl *)mCalloc(ras->n_catg, sizeof(phydbl)); ras->skip_rate_cat = (short int *)mCalloc(ras->n_catg, sizeof(short int)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_efrq *Make_Efrq(int ns) { t_efrq *e_frq; e_frq = (t_efrq *)mCalloc(1, sizeof(t_efrq)); e_frq->pi = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); e_frq->pi->len = ns; #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign((void **)&e_frq->pi->v, BYTE_ALIGN, (size_t)ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else e_frq->pi->v = _aligned_malloc(ns * sizeof(phydbl), BYTE_ALIGN); #endif #else e_frq->pi->v = (phydbl *)mCalloc(ns, sizeof(phydbl)); #endif e_frq->pi_unscaled = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); e_frq->pi_unscaled->v = (phydbl *)mCalloc(ns, sizeof(phydbl)); e_frq->pi_unscaled->len = ns; e_frq->user_b_freq = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, e_frq->user_b_freq); e_frq->user_b_freq->v = (phydbl *)mCalloc(T_MAX_OPTION, sizeof(phydbl)); return e_frq; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_rmat *Make_Rmat(int ns) { t_rmat *r_mat; r_mat = (t_rmat *)mCalloc(1, sizeof(t_rmat)); r_mat->qmat = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, r_mat->qmat); r_mat->qmat_buff = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, r_mat->qmat_buff); r_mat->rr = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, r_mat->rr); r_mat->rr_val = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); Init_Vect_Dbl(0, r_mat->rr_val); r_mat->rr_num = (vect_int *)mCalloc(1, sizeof(vect_int)); Init_Vect_Int(0, r_mat->rr_num); r_mat->n_rr_per_cat = (vect_int *)mCalloc(1, sizeof(vect_int)); Init_Vect_Int(0, r_mat->n_rr_per_cat); r_mat->qmat->v = (phydbl *)mCalloc(ns * ns, sizeof(phydbl)); r_mat->qmat_buff->v = (phydbl *)mCalloc(ns * ns, sizeof(phydbl)); return (r_mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// option *Make_Input(void) { int i; option *io = (option *)mCalloc(1, sizeof(option)); io->in_align_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->in_tree_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->in_constraint_tree_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->in_coord_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->in_xml_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_tree_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_trees_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_ancestral_seq_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_ancestral_tree_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_boot_tree_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_boot_stats_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_stats_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_lk_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->weight_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_ps_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_summary_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_trace_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->out_json_trace_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->nt_or_cd = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->run_id_string = (char *)mCalloc(T_MAX_OPTION, sizeof(char)); io->clade_list_file = (char *)mCalloc(T_MAX_FILE, sizeof(char)); io->alphabet = (char **)mCalloc(T_MAX_ALPHABET, sizeof(char *)); for (i = 0; i < T_MAX_ALPHABET; i++) io->alphabet[i] = (char *)mCalloc(T_MAX_STATE, sizeof(char)); io->treelist = (t_treelist *)mCalloc(1, sizeof(t_treelist)); io->mcmc = (t_mcmc *)MCMC_Make_MCMC_Struct(); io->rates = (t_rate *)RATES_Make_Rate_Struct(-1); io->times = (t_time *)TIMES_Make_Time_Struct(-1); return io; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_mcmc *MCMC_Make_MCMC_Struct(void) { t_mcmc *mcmc; mcmc = (t_mcmc *)mCalloc(1, sizeof(t_mcmc)); mcmc->out_filename = (char *)mCalloc(T_MAX_FILE, sizeof(char)); return (mcmc); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// eigen *Make_Eigen_Struct(int ns) { eigen *eig; eig = (eigen *)mCalloc(1, sizeof(eigen)); eig->size = ns; eig->space = (phydbl *)mCalloc(2 * ns, sizeof(phydbl)); eig->space_int = (int *)mCalloc(2 * ns, sizeof(int)); eig->e_val = (phydbl *)mCalloc(ns, sizeof(phydbl)); eig->e_val_im = (phydbl *)mCalloc(ns, sizeof(phydbl)); eig->r_e_vect_im = (phydbl *)mCalloc(ns * ns, sizeof(phydbl)); eig->q = (phydbl *)mCalloc(ns * ns, sizeof(phydbl)); #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign((void **)&eig->r_e_vect, BYTE_ALIGN, ns * ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&eig->l_e_vect, BYTE_ALIGN, ns * ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (posix_memalign((void **)&eig->dum, BYTE_ALIGN, ns * ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else eig->r_e_vect = _aligned_malloc(ns * ns * sizeof(phydbl), BYTE_ALIGN); eig->l_e_vect = _aligned_malloc(ns * ns * sizeof(phydbl), BYTE_ALIGN); eig->dum = _aligned_malloc(ns * ns * sizeof(phydbl), BYTE_ALIGN); #endif #else eig->r_e_vect = (phydbl *)mCalloc(ns * ns, sizeof(phydbl)); eig->l_e_vect = (phydbl *)mCalloc(ns * ns, sizeof(phydbl)); eig->dum = (phydbl *)mCalloc(ns * ns, sizeof(phydbl)); #endif Init_Eigen_Struct(eig); return eig; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Short_L(t_tree *tree) { if (!tree->short_l) tree->short_l = (phydbl *)mCalloc(tree->n_short_l, sizeof(phydbl)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_attr *XML_Make_Attribute(xml_attr *prev, char *attr_name, char *attr_value) { xml_attr *new_attr; new_attr = (xml_attr *)mCalloc(1, sizeof(xml_attr)); new_attr->prev = prev; new_attr->next = NULL; if (prev != NULL) prev->next = new_attr; new_attr->name = (char *)mCalloc(strlen(attr_name) + 1, sizeof(char)); strcpy(new_attr->name, attr_name); new_attr->value = (char *)mCalloc(strlen(attr_value) + 1, sizeof(char)); strcpy(new_attr->value, attr_value); return new_attr; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Make_Node_Id(xml_node *n, char *id) { if (id) n->id = (char *)mCalloc(strlen(id) + 1, sizeof(char)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Make_Node_Value(xml_node *n, char *val) { if (val) n->value = (char *)mCalloc(strlen(val) + 1, sizeof(char)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_node *XML_Make_Node(char *name) { xml_node *new_node = (xml_node *)mCalloc(1, sizeof(xml_node)); if (name) new_node->name = (char *)mCalloc(strlen(name) + 1, sizeof(char)); new_node->ds = (t_ds *)mCalloc(1, sizeof(t_ds)); return new_node; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Best_Spr(t_tree *tree) { tree->best_spr = Make_One_Spr(tree); Init_One_Spr(tree->best_spr); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Spr(t_tree *tree) { Make_Spr_List_One_Edge(tree); Make_Spr_List_All_Edge(tree); Make_Best_Spr(tree); if (tree->is_mixt_tree == YES) MIXT_Repeat_Task(Make_Spr, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Spr_List_One_Edge(t_tree *tree) { int i; tree->size_spr_list_one_edge = 2 * tree->n_otu - 3; tree->spr_list_one_edge = (t_spr **)mCalloc(2 * tree->n_otu - 2, sizeof(t_spr *)); for (i = 0; i < 2 * tree->n_otu - 2; ++i) { tree->spr_list_one_edge[i] = Make_One_Spr(tree); Init_One_Spr(tree->spr_list_one_edge[i]); } tree->perform_spr_right_away = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Spr_List_All_Edge(t_tree *tree) { int i; tree->size_spr_list_all_edge = 2 * tree->n_otu - 3; tree->spr_list_all_edge = (t_spr **)mCalloc(2 * tree->n_otu - 2, sizeof(t_spr *)); for (i = 0; i < 2 * tree->n_otu - 2; ++i) { tree->spr_list_all_edge[i] = Make_One_Spr(tree); Init_One_Spr(tree->spr_list_all_edge[i]); } tree->perform_spr_right_away = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_spr *Make_One_Spr(t_tree *tree) { t_spr *a_spr; a_spr = (t_spr *)mCalloc(1, sizeof(t_spr)); a_spr->path = (t_node **)mCalloc(tree->n_otu, sizeof(t_node *)); return a_spr; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_time *TIMES_Make_Time_Struct(int n_otu) { t_time *times; times = (t_time *)mCalloc(1, sizeof(t_time)); if (n_otu > 0) { times->calib_prob = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->t_prior_min_ori = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->t_prior_max_ori = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->times_partial_proba = (phydbl *)mCalloc(n_otu * n_otu, sizeof(phydbl)); times->numb_calib_chosen = (int *)mCalloc(n_otu * n_otu, sizeof(phydbl)); times->a_cal = (t_cal **)mCalloc(10 * n_otu, sizeof(t_cal *)); times->nd_t = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->buff_t = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->true_t = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->t_mean = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->t_prior = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->t_prior_min = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->t_prior_max = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->t_floor = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->t_rank = (int *)mCalloc(2 * n_otu - 1, sizeof(int)); times->t_has_prior = (short int *)mCalloc(2 * n_otu - 1, sizeof(short int)); times->mean_t = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->n_jps = (int *)mCalloc(2 * n_otu - 1, sizeof(int)); times->t_jps = (int *)mCalloc(2 * n_otu - 2, sizeof(int)); times->time_slice_lims = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); times->n_time_slice_spans = (int *)mCalloc(2 * n_otu - 1, sizeof(int)); times->curr_slice = (int *)mCalloc(2 * n_otu - 1, sizeof(int)); times->has_survived = (int *)mCalloc(2 * n_otu - 1, sizeof(int)); } return (times); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_rate *RATES_Make_Rate_Struct(int n_otu) { t_rate *rates; rates = (t_rate *)mCalloc(1, sizeof(t_rate)); rates->is_allocated = NO; if (n_otu > 0) { rates->is_allocated = YES; rates->nd_r = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->br_r = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->buff_br_r = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->buff_nd_r = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->true_r = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->dens = (phydbl *)mCalloc(2 * n_otu - 2, sizeof(phydbl)); rates->triplet = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->cov_l = (phydbl *)mCalloc((2 * n_otu - 2) * (2 * n_otu - 2), sizeof(phydbl)); rates->invcov = (phydbl *)mCalloc((2 * n_otu - 2) * (2 * n_otu - 2), sizeof(phydbl)); rates->mean_l = (phydbl *)mCalloc(2 * n_otu - 2, sizeof(phydbl)); rates->ml_l = (phydbl *)mCalloc(2 * n_otu - 2, sizeof(phydbl)); rates->cur_l = (phydbl *)mCalloc(2 * n_otu - 2, sizeof(phydbl)); rates->u_ml_l = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->u_cur_l = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->cov_r = (phydbl *)mCalloc((2 * n_otu - 2) * (2 * n_otu - 2), sizeof(phydbl)); rates->cond_var = (phydbl *)mCalloc(2 * n_otu - 2, sizeof(phydbl)); rates->mean_r = (phydbl *)mCalloc(2 * n_otu - 2, sizeof(phydbl)); rates->lca = (t_node **)mCalloc((2 * n_otu - 1) * (2 * n_otu - 1), sizeof(t_node *)); rates->reg_coeff = (phydbl *)mCalloc((2 * n_otu - 2) * (2 * n_otu - 2), sizeof(phydbl)); rates->trip_reg_coeff = (phydbl *)mCalloc((2 * n_otu - 2) * (6 * n_otu - 9), sizeof(phydbl)); rates->trip_cond_cov = (phydbl *)mCalloc((2 * n_otu - 2) * 9, sizeof(phydbl)); rates->_2n_vect1 = (phydbl *)mCalloc(2 * n_otu, sizeof(phydbl)); rates->_2n_vect2 = (phydbl *)mCalloc(2 * n_otu, sizeof(phydbl)); rates->_2n_vect3 = (phydbl *)mCalloc(2 * n_otu, sizeof(phydbl)); rates->_2n_vect4 = (phydbl *)mCalloc(2 * n_otu, sizeof(phydbl)); rates->_2n_vect5 = (short int *)mCalloc(2 * n_otu, sizeof(short int)); rates->_2n2n_vect1 = (phydbl *)mCalloc(4 * n_otu * n_otu, sizeof(phydbl)); rates->_2n2n_vect2 = (phydbl *)mCalloc(4 * n_otu * n_otu, sizeof(phydbl)); rates->br_do_updt = (short int *)mCalloc(2 * n_otu - 1, sizeof(short int)); rates->cur_gamma_prior_mean = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->cur_gamma_prior_var = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); rates->n_tips_below = (int *)mCalloc(2 * n_otu - 1, sizeof(int)); rates->model_name = (char *)mCalloc(T_MAX_NAME, sizeof(char)); } return rates; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Allocate memory min amount of memory for covarion model*/ m4 *M4_Make_Light(void) { m4 *m4mod; m4mod = (m4 *)mCalloc(1, sizeof(m4)); M4_Set_M4mod_Default(m4mod); return m4mod; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Allocate memory for covarion model */ void M4_Make_Complete(int n_h, int n_o, m4 *m4mod) { int i; m4mod->n_h = n_h; m4mod->n_o = n_o; m4mod->n_o = n_o; m4mod->o_rr = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); m4mod->o_rr->v = (phydbl *)mCalloc(n_o * n_o, sizeof(phydbl)); m4mod->o_rr->len = n_o * n_o; m4mod->o_fq = (phydbl *)mCalloc(n_o, sizeof(phydbl)); m4mod->o_mats = (phydbl **)mCalloc(n_h, sizeof(phydbl *)); for (i = 0; i < n_h; i++) m4mod->o_mats[i] = (phydbl *)mCalloc(n_o * n_o, sizeof(phydbl)); m4mod->h_mat = (phydbl *)mCalloc(n_h * n_h, sizeof(phydbl)); m4mod->h_rr = (phydbl *)mCalloc(n_h * n_h, sizeof(phydbl)); m4mod->h_fq = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); m4mod->h_fq->v = (phydbl *)mCalloc(n_h, sizeof(phydbl)); m4mod->multipl = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); m4mod->multipl->v = (phydbl *)mCalloc(n_h, sizeof(phydbl)); m4mod->multipl->len = n_h; m4mod->multipl_unscaled = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); m4mod->multipl_unscaled->v = (phydbl *)mCalloc(n_h, sizeof(phydbl)); m4mod->multipl_unscaled->len = n_h; m4mod->h_fq_unscaled = (vect_dbl *)mCalloc(1, sizeof(vect_dbl)); m4mod->h_fq_unscaled->v = (phydbl *)mCalloc(n_h, sizeof(phydbl)); m4mod->h_fq_unscaled->len = n_h; m4mod->alpha = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); m4mod->delta = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_cal *Make_Calibration(void) { t_cal *calib; calib = (t_cal *)mCalloc(1, sizeof(t_cal)); return (calib); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_clad *Make_Clade(void) { t_clad *clade; clade = (t_clad *)mCalloc(1, sizeof(t_clad)); return (clade); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_node **Make_Target_Tip(int n) { t_node **this; this = (t_node **)mCalloc(n, sizeof(t_node *)); return (this); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_All_Calibration(t_tree *tree) { int i; t_cal **all_cal; assert(tree->rates); all_cal = (t_cal **)mCalloc(2 * tree->n_otu - 1, sizeof(t_cal *)); For(i, 2 * tree->n_otu - 1) all_cal[i] = Make_Calibration(); tree->times->a_cal = all_cal; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Rmat_Weight(t_tree *mixt_tree) { t_tree *tree, *buff_tree; scalar_dbl *curr_weight; tree = mixt_tree; do { if (tree->is_mixt_tree == YES) tree = tree->next; buff_tree = mixt_tree->next; do { if (buff_tree->mod->r_mat_weight == tree->mod->r_mat_weight) break; buff_tree = buff_tree->next; } while (buff_tree != tree); if (buff_tree == tree) Free(tree->mod->r_mat_weight); tree = tree->next; } while (tree); tree = mixt_tree; do { if (tree->is_mixt_tree == YES) tree = tree->next; tree->mod->r_mat_weight = NULL; tree = tree->next; } while (tree); tree = mixt_tree->next; tree->mod->r_mat_weight = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(tree->mod->r_mat_weight); tree->mod->r_mat_weight->v = 1.0; curr_weight = tree->mod->r_mat_weight; buff_tree = tree = mixt_tree; do // For each mixt_tree { if (tree->is_mixt_tree == YES) { tree = tree->next; } buff_tree = mixt_tree->next; do { if (buff_tree->mod->r_mat == tree->mod->r_mat) { tree->mod->r_mat_weight = buff_tree->mod->r_mat_weight; break; } buff_tree = buff_tree->next; } while (buff_tree != tree); if (!tree->mod->r_mat_weight) { tree->mod->r_mat_weight = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(tree->mod->r_mat_weight); tree->mod->r_mat_weight->v = 1.0; curr_weight->next = tree->mod->r_mat_weight; tree->mod->r_mat_weight->prev = curr_weight; curr_weight = tree->mod->r_mat_weight; } tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Efrq_Weight(t_tree *mixt_tree) { t_tree *tree, *buff_tree; scalar_dbl *curr_weight; tree = mixt_tree; do { if (tree->is_mixt_tree == YES) tree = tree->next; buff_tree = mixt_tree->next; do { if (buff_tree->mod->e_frq_weight == tree->mod->e_frq_weight) break; buff_tree = buff_tree->next; } while (buff_tree != tree); if (buff_tree == tree) { Free(tree->mod->e_frq_weight); } tree = tree->next; } while (tree); tree = mixt_tree; do { if (tree->is_mixt_tree == YES) tree = tree->next; tree->mod->e_frq_weight = NULL; tree = tree->next; } while (tree); tree = mixt_tree->next; tree->mod->e_frq_weight = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(tree->mod->e_frq_weight); tree->mod->e_frq_weight->v = 1.0; curr_weight = tree->mod->e_frq_weight; buff_tree = tree = mixt_tree; do // For each mixt_tree { if (tree->is_mixt_tree == YES) tree = tree->next; buff_tree = mixt_tree->next; do { if (buff_tree->mod->e_frq == tree->mod->e_frq) { tree->mod->e_frq_weight = buff_tree->mod->e_frq_weight; break; } buff_tree = buff_tree->next; } while (buff_tree != tree); if (!tree->mod->e_frq_weight) { tree->mod->e_frq_weight = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(tree->mod->e_frq_weight); tree->mod->e_frq_weight->v = 1.0; curr_weight->next = tree->mod->e_frq_weight; tree->mod->e_frq_weight->prev = curr_weight; curr_weight = tree->mod->e_frq_weight; } tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_geo *GEO_Make_Geo_Basic(void) { t_geo *t; t = (t_geo *)mCalloc(1, sizeof(t_geo)); return (t); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Make_Geo_Complete(int ldscape_sz, int n_dim, int n_tax, t_geo *t) { int i; // F matrix t->f_mat = (phydbl *)mCalloc(ldscape_sz * ldscape_sz, sizeof(phydbl)); // R matrix t->r_mat = (phydbl *)mCalloc(ldscape_sz * ldscape_sz, sizeof(phydbl)); // Occupation vectors: one vector for each node t->occup = (int *)mCalloc((2 * n_tax - 1) * ldscape_sz, sizeof(int)); // Lineage locations t->idx_loc = (int *)mCalloc((int)(2 * n_tax - 1), sizeof(int)); // Sorted node heights t->sorted_nd = (t_node **)mCalloc((int)(2 * n_tax - 1), sizeof(t_node *)); // Covariance matrix t->cov = (phydbl *)mCalloc((int)(n_dim * n_dim), sizeof(phydbl)); // gives the location occupied beneath each node in the tree t->idx_loc_beneath = (int *)mCalloc((int)(2 * n_tax - 1) * ldscape_sz, sizeof(int)); // Locations t->coord_loc = (t_geo_coord **)mCalloc(ldscape_sz, sizeof(t_geo_coord *)); for (i = 0; i < ldscape_sz; i++) t->coord_loc[i] = GEO_Make_Geo_Coord(n_dim); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_geo_coord *GEO_Make_Geo_Coord(int dim) { t_geo_coord *t; t = (t_geo_coord *)mCalloc(1, sizeof(t_geo_coord)); t->lonlat = (phydbl *)mCalloc(dim, sizeof(phydbl)); t->id = (char *)mCalloc(T_MAX_ID_COORD, sizeof(char)); t->cpy = (t_geo_coord *)mCalloc(1, sizeof(t_geo_coord)); t->cpy->lonlat = (phydbl *)mCalloc(dim, sizeof(phydbl)); t->cpy->id = (char *)mCalloc(T_MAX_ID_COORD, sizeof(char)); return (t); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_geo_veloc *GEO_Make_Geo_Veloc(int dim) { t_geo_veloc *t; t = (t_geo_veloc *)mCalloc(1, sizeof(t_geo_veloc)); t->deriv = (phydbl *)mCalloc(dim, sizeof(phydbl)); t->id = (char *)mCalloc(T_MAX_ID_COORD, sizeof(char)); t->cpy = (t_geo_veloc *)mCalloc(1, sizeof(t_geo_veloc)); t->cpy->deriv = (phydbl *)mCalloc(dim, sizeof(phydbl)); t->cpy->id = (char *)mCalloc(T_MAX_ID_COORD, sizeof(char)); return (t); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_phyrex_mod *PHYREX_Make_Migrep_Model(int n_otu, int dim) { t_phyrex_mod *t; t = (t_phyrex_mod *)mCalloc(1, sizeof(t_phyrex_mod)); t->lim_up = GEO_Make_Geo_Coord(dim); t->lim_do = GEO_Make_Geo_Coord(dim); t->sigsq = (phydbl *)mCalloc(dim, sizeof(phydbl)); t->ou_mu = (phydbl *)mCalloc(dim, sizeof(phydbl)); t->sigsq_scale = (phydbl *)mCalloc(2 * n_otu - 1, sizeof(phydbl)); t->rw_root_mean = (phydbl *)mCalloc(2, sizeof(phydbl)); t->rw_root_var = (phydbl *)mCalloc(2, sizeof(phydbl)); return (t); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_dsk *PHYREX_Make_Disk_Event(int n_dim, int n_otu) { t_dsk *t; t = (t_dsk *)mCalloc(1, sizeof(t_dsk)); t->centr = GEO_Make_Geo_Coord(n_dim); t->id = (char *)mCalloc(T_MAX_ID_DISK, sizeof(char)); t->ldsk_a = (t_ldsk **)mCalloc(n_otu, sizeof(t_ldsk *)); return (t); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_ldsk *PHYREX_Make_Lindisk_Node(int n_dim) { t_ldsk *t; t = (t_ldsk *)mCalloc(1, sizeof(t_ldsk)); t->coord = GEO_Make_Geo_Coord(n_dim); t->cpy_coord = GEO_Make_Geo_Coord(n_dim); t->veloc = GEO_Make_Geo_Veloc(n_dim); return (t); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Make_Lindisk_Next(t_ldsk *t) { if (t->n_next == 0) t->next = (t_ldsk **)mCalloc(NEXT_BLOCK_SIZE, sizeof(t_ldsk *)); else if (!(t->n_next % NEXT_BLOCK_SIZE)) t->next = (t_ldsk **)mRealloc(t->next, t->n_next + NEXT_BLOCK_SIZE, sizeof(t_ldsk *)); t->n_next++; /* PhyML_Printf("\n. make next for ldsk %s n_next set to %d [%p] * %d",t->coord->id,t->n_next,t->next,NEXT_BLOCK_SIZE); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_poly *Make_Poly(int n) { t_poly *p; int i; p = (t_poly *)mCalloc(1, sizeof(t_poly)); p->poly_vert = (t_geo_coord **)mCalloc(n, sizeof(t_geo_coord *)); for (i = 0; i < n; i++) p->poly_vert[i] = GEO_Make_Geo_Coord(2); return (p); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_sarea *Make_Sarea(int n_poly) { t_sarea *s; s = (t_sarea *)mCalloc(1, sizeof(t_sarea)); s->a_poly = (t_poly **)mCalloc(n_poly, sizeof(t_poly *)); return (s); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_ll *Make_Linked_List(void) { t_ll *list; // Create list if non-existing and add list = (t_ll *)mCalloc(1, sizeof(t_ll)); return list; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Matrices used in transfer bootstrap computation (tbe.c) */ void Alloc_TBE_Matrices(int n_otu, short unsigned ***i_matrix, short unsigned ***c_matrix, short unsigned ***hamming, short unsigned **min_dist, short unsigned **min_dist_edge, int **cluster_sizes) { int i; int nb_edges = 2 * n_otu - 3; (*min_dist) = (short unsigned *)malloc( nb_edges * sizeof(short unsigned)); /* array of min Hamming distances */ (*min_dist_edge) = (short unsigned *)malloc( nb_edges * sizeof(short unsigned)); /* array of edge ids corresponding to min Hamming distances */ (*cluster_sizes) = (int *)malloc( nb_edges * sizeof(int)); /* array of sizes of clusters associated to each branch (in the post order traversal) */ (*c_matrix) = (short unsigned **)malloc( nb_edges * sizeof(short unsigned *)); /* matrix of cardinals of complements */ (*i_matrix) = (short unsigned **)malloc( nb_edges * sizeof(short unsigned *)); /* matrix of cardinals of intersections */ (*hamming) = (short unsigned **)malloc( nb_edges * sizeof(short unsigned *)); /* matrix of Hamming distances */ for (i = 0; i < nb_edges; i++) { (*c_matrix)[i] = (short unsigned *)malloc(nb_edges * sizeof(short unsigned)); (*i_matrix)[i] = (short unsigned *)malloc(nb_edges * sizeof(short unsigned)); (*hamming)[i] = (short unsigned *)malloc(nb_edges * sizeof(short unsigned)); (*min_dist)[i] = n_otu; /* initialization to the nb of taxa */ (*cluster_sizes)[i] = 0; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_MutMap(t_tree *tree) { // (# of edges) X (# of sites) X (# mutation types: A<->C A<->G A<->T C<->G // C<->T G<->T) do { tree->mutmap = (int *)mCalloc((2 * tree->n_otu - 3) * (tree->data->n_pattern) * 6, sizeof(int)); tree = tree->next_mixt; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_label *Make_Label(void) { t_label *lab; lab = (t_label *)mCalloc(1, sizeof(t_label)); lab->key = (char *)mCalloc(T_MAX_KEY, sizeof(char)); lab->val = (char *)mCalloc(T_MAX_VAL, sizeof(char)); lab->next = NULL; return (lab); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Contrasts(t_tree *tree) { tree->ctrst = (t_ctrst *)mCalloc(1, sizeof(t_ctrst)); tree->ctrst->x = (phydbl *)mCalloc(2 * tree->n_otu, sizeof(phydbl)); tree->ctrst->tprime = (phydbl *)mCalloc(2 * tree->n_otu, sizeof(phydbl)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Contmod(t_tree *tree) { int n_nodes, n_dim, n_char; n_nodes = 2 * tree->n_otu - 1; n_char = 2; n_dim = tree->mmod->n_dim; tree->contmod = (t_contmod *)mCalloc(1, sizeof(t_contmod)); tree->contmod->mu_down = (phydbl *)mCalloc(n_nodes * n_char * n_dim, sizeof(phydbl)); tree->contmod->var_down = (phydbl *)mCalloc(n_nodes * n_char * n_dim, sizeof(phydbl)); tree->contmod->logrem_down = (phydbl *)mCalloc(n_nodes * n_char * n_dim, sizeof(phydbl)); tree->contmod->mu_up = (phydbl *)mCalloc(n_nodes * n_char * n_dim, sizeof(phydbl)); tree->contmod->var_up = (phydbl *)mCalloc(n_nodes * n_char * n_dim, sizeof(phydbl)); tree->contmod->logrem_up = (phydbl *)mCalloc(n_nodes * n_char * n_dim, sizeof(phydbl)); tree->contmod->lnL_up = (phydbl *)mCalloc(n_nodes * n_char * n_dim, sizeof(phydbl)); tree->contmod->lnL_down = (phydbl *)mCalloc(n_nodes * n_char * n_dim, sizeof(phydbl)); tree->contmod->lnL = (phydbl *)mCalloc(4, sizeof(phydbl)); tree->contmod->obs_var = (phydbl *)mCalloc(2 * tree->mmod->n_dim, sizeof(phydbl)); tree->contmod->both_sides = (short int *)mCalloc(2, sizeof(short int)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/make.h000066400000000000000000000077101501136442400202640ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef MAKE_H #define MAKE_H #include "utilities.h" void Make_All_Edges_Lk(t_node *a, t_node *d, t_tree *tree); t_edge *Make_Edge_Light(t_node *a, t_node *d, int num); void Make_Edge_Pars(t_edge *b, t_tree *tree); void Make_Edge_Pars_Left(t_edge *b, t_tree *tree); void Make_Edge_Pars_Rght(t_edge *b, t_tree *tree); void Make_Edge_Lk(t_edge *b, t_tree *tree); void Make_Edge_Lk_Left(t_edge *b, t_tree *tree); void Make_Edge_Lk_Rght(t_edge *b, t_tree *tree); void Make_Edge_NNI(t_edge *b); t_nni *Make_NNI(void); t_node *Make_Node_Light(int num); void Make_Node_Lk(t_node *n); nexcom **Make_Nexus_Com(void); nexparm *Make_Nexus_Parm(void); matrix *Make_Mat(int n_otu); t_tree *Make_Tree_From_Scratch(int n_otu, calign *data); t_tree *Make_Tree(int n_otu); void Make_Tree_Path(t_tree *tree); void Make_All_Tree_Nodes(t_tree *tree); void Make_All_Tree_Edges(t_tree *tree); calign *Make_Calign(int n_otu, int crunch_len, int state_len, int init_len, char **sp_names, int n_rm, char **sp_names_out); t_treelist *Make_Treelist(int list_size); t_opt *Make_Optimiz(void); void Make_Custom_Model(t_mod *mod); t_mod *Make_Model_Basic(void); void Make_Model_Complete(t_mod *mod); t_efrq *Make_Efrq(int ns); t_rmat *Make_Rmat(int ns); option *Make_Input(void); eigen *Make_Eigen_Struct(int ns); void Make_Short_L(t_tree *tree); void Make_RAS_Complete(t_ras *ras); t_ras *Make_RAS_Basic(void); void Make_Best_Spr(t_tree *tree); void Make_Spr_List_One_Edge(t_tree *tree); void Make_Spr_List_All_Edge(t_tree *tree); t_spr *Make_One_Spr(t_tree *tree); void Make_Tree_For_Pars(t_tree *tree); void Make_Tree_For_Lk(t_tree *tree); t_string *Make_String(int len); t_mcmc *MCMC_Make_MCMC_Struct(void); void Make_Tree_4_Lk(t_tree *tree, calign *cdata, int n_site); t_rate *RATES_Make_Rate_Struct(int n_otu); t_time *TIMES_Make_Time_Struct(int n_otu); t_cal *Make_Calibration(void); void Make_Efrq_Weight(t_tree *mixt_tree); void Make_Rmat_Weight(t_tree *mixt_tree); t_geo *GEO_Make_Geo_Basic(void); void GEO_Make_Geo_Complete(int ldscape_sz, int n_dim, int n_tax, t_geo *t); t_geo_coord *GEO_Make_Geo_Coord(int n_dim); t_phyrex_mod *PHYREX_Make_Migrep_Model(int n_otu, int n_dim); t_dsk *PHYREX_Make_Disk_Event(int n_dim, int n_otu); t_ldsk *PHYREX_Make_Lindisk_Node(int n_dim); void PHYREX_Make_Lindisk_Next(t_ldsk *t); t_poly *Make_Poly(int n); void Make_All_Calibration(t_tree *tree); t_sarea *Make_Sarea(int n_poly); void Make_Edge_Loc(t_edge *b, t_tree *tree); void Make_Edge_Loc_Rght(t_edge *b, t_tree *tree); void Make_Edge_Loc_Left(t_edge *b, t_tree *tree); t_ll *Make_Linked_List(void); t_node **Make_Target_Tip(int n); t_clad *Make_Clade(void); void Alloc_TBE_Matrices(int n_otu, short unsigned ***i_matrix, short unsigned ***c_matrix, short unsigned ***hamming, short unsigned **min_dist, short unsigned **min_dist_edge, int **cluster_sizes); void Make_Extra_Edge_Lk(t_tree *tree); void Make_Spr(t_tree *tree); t_label *Make_Label(void); void Make_Contrasts(t_tree *tree); void Make_Contmod(t_tree *tree); t_geo_veloc *GEO_Make_Geo_Veloc(int dim); align **Make_Empty_Alignment(option *io); void M4_Make_Complete(int n_h, int n_o, m4 *m4mod); m4 *M4_Make_Light(void); #endif stephaneguindon-phyml-76a39c8/src/mcmc.c000066400000000000000000017011571501136442400202700ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "mcmc.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Single_Param_Generic(phydbl *val, phydbl lim_inf, phydbl lim_sup, int move_num, phydbl *lnPrior, phydbl *lnLike, phydbl (*prior_func)(t_edge *,t_tree *,supert_tree *), phydbl (*like_func)(t_edge *,t_tree *,supert_tree *), int move_type, int _log, /* _log == YES: the model describes the distribution of log(val) but the move applies to val. Need a correction factor */ short int print, t_edge *branch, t_tree *tree, supert_tree *stree) { phydbl cur_val,new_val,new_lnLike,new_lnPrior,cur_lnLike,cur_lnPrior; phydbl u,alpha,ratio; phydbl K; phydbl new_lnval, cur_lnval; /* Record_Br_Len(tree); */ cur_val = *val; new_val = -1.0; ratio = 0.0; K = tree->mcmc->tune_move[move_num]; cur_lnval = log(*val); new_lnval = cur_lnval; if(lnLike) { cur_lnLike = *lnLike; new_lnLike = UNLIKELY; } else { cur_lnLike = 0.0; new_lnLike = 0.0; } if(lnPrior) { cur_lnPrior = *lnPrior; new_lnPrior = UNLIKELY; } else { cur_lnPrior = 0.0; new_lnPrior = 0.0; } MCMC_Make_Move(&cur_val,&new_val,lim_inf,lim_sup,&ratio,K,move_type); if(new_val < lim_sup && new_val > lim_inf) { *val = new_val; /* if(tree->rates) RATES_Update_Edge_Lengths(tree); */ if(_log == YES) ratio += (cur_lnval - new_lnval); if(prior_func) new_lnPrior = (*prior_func)(branch,tree,stree); if(like_func) new_lnLike = (*like_func)(branch,tree,stree); } else { new_lnPrior = new_lnLike = UNLIKELY; } if(prior_func) ratio += (new_lnPrior - cur_lnPrior); if(like_func) ratio += (new_lnLike - cur_lnLike); ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_lnLike > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(print == YES) PhyML_Printf("\n. cur_val: %f new_val: %f curPrior: %f newPrior: %f curLike: %f newLike: %f alpha: %f K: %f", cur_val,new_val, cur_lnPrior,new_lnPrior, cur_lnLike,new_lnLike, alpha,K); if(u > alpha) /* Reject */ { *val = cur_val; new_val = cur_val; if(lnPrior) *lnPrior = cur_lnPrior; if(lnLike) *lnLike = cur_lnLike; /* Restore_Br_Len(tree); */ if(tree->mod && tree->mod->update_eigen) { if(!Update_Eigen(tree->mod)) { PhyML_Fprintf(stderr,"\n. Problem in move %s",tree->mcmc->move_name[tree->mcmc->move_idx]); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } } else /* Accept */ { tree->mcmc->acc_move[move_num]++; if(lnPrior) *lnPrior = new_lnPrior; if(lnLike) *lnLike = new_lnLike; } tree->mcmc->run_move[move_num]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Formula from ``Markov chain Monte Carlo in practice: a roundtable discussion'', Kass, Robert E and Carlin, Bradley P and Gelman, Andrew and Neal, Radford M The American Statistician, 1998 */ void MCMC_Update_Effective_Sample_Size(int move_num, t_mcmc *mcmc, t_tree *tree) { int i,N,lag; phydbl rho,mean,var,old_rho,act,ess; int burnin; N = mcmc->sample_num+1; burnin = (int)(0.1*N); if(burnin < 1) return; N -= burnin; mean = Weighted_Mean(mcmc->sampled_val+move_num*mcmc->sample_size+burnin,NULL,N); var = Variance(mcmc->sampled_val+move_num*mcmc->sample_size+burnin,N); /* if(move_num == tree->mcmc->num_move_phyrex_sigsq) */ /* printf("\n. %d %f %f\n",N,mean,var); */ act = -1.0; old_rho = 1.0; For(lag,MIN(N,mcmc->max_lag)) { rho = 0.0; for(i=0;isampled_val[move_num*mcmc->sample_size+burnin+i] - mean) * (mcmc->sampled_val[move_num*mcmc->sample_size+burnin+i+lag] - mean) ; rho /= (N - lag)*var; if(old_rho + rho < 0.0) { break; /* Geyer (1992) stopping criterion */ } old_rho = rho; act += 2.*rho; } if(act > 0.0) ess = N/act; else ess = 0.0; mcmc->ess[move_num] = ess; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Update_Mode(int move_num, t_mcmc *mcmc, t_tree *tree) { int i,j,N,best_bin; int burnin,breaks,*bin_score,best_score; phydbl min,max; breaks = 100; bin_score = (int *)mCalloc(breaks,sizeof(int)); N = mcmc->sample_num+1; burnin = (int)(0.1*N); if(burnin < 1) return; N -= burnin; min = +INFINITY; for(i=0;isampled_val[move_num*mcmc->sample_size+burnin+i] < min) min = mcmc->sampled_val[move_num*mcmc->sample_size+burnin+i]; max = -INFINITY; for(i=0;isampled_val[move_num*mcmc->sample_size+burnin+i] > max) max = mcmc->sampled_val[move_num*mcmc->sample_size+burnin+i]; for(i=0;i mcmc->sampled_val[move_num*mcmc->sample_size+burnin+i]) { bin_score[j-1]++; break; } } best_score = 0; best_bin = 0; for(j=0;j best_score) { best_score = bin_score[j]; best_bin = j; } mcmc->mode[move_num] = min + best_bin*(max-min)/breaks; Free(bin_score); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Clock_R(t_tree *tree) { phydbl new_lnL_seq, cur_lnL_seq; phydbl new_lnL_rates, cur_lnL_rates; phydbl new_lnP_rates, cur_lnP_rates; phydbl u, ratio, alpha; phydbl new_clock_r, cur_clock_r; phydbl min, max; int move_num; phydbl K; /* PhyML_Printf("\n. %d %d",tree->eval_alnL,tree->mod->s_opt->opt_clock_r); */ if(tree->mod->s_opt->opt_clock_r == NO) return; new_clock_r = tree->rates->clock_r; cur_clock_r = tree->rates->clock_r; min = tree->rates->min_clock; max = tree->rates->max_clock; ratio = 0.0; move_num = tree->mcmc->num_move_clock_r; K = tree->mcmc->tune_move[move_num]; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_rates = tree->rates->c_lnL; new_lnL_rates = UNLIKELY; cur_lnP_rates = tree->rates->c_lnP; new_lnP_rates = UNLIKELY; MCMC_Make_Move(&cur_clock_r,&new_clock_r,min,max,&ratio,K,tree->mcmc->move_type[move_num]); if(new_clock_r > min && new_clock_r < max) { tree->rates->clock_r = new_clock_r; RATES_Update_Edge_Lengths(tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) { new_lnL_rates = RATES_Lk(tree); new_lnP_rates = RATES_Prior(tree); } } if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) { ratio += (new_lnL_rates - cur_lnL_rates); ratio += (new_lnP_rates - cur_lnP_rates); } ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); if(u > alpha) /* Reject */ { tree->rates->clock_r = cur_clock_r; tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rates; tree->rates->c_lnP = cur_lnP_rates; RATES_Update_Edge_Lengths(tree); } else { tree->mcmc->acc_move[move_num]++; } tree->mcmc->run++; tree->mcmc->run_move[move_num]++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef GEO // Sample dispersal parameter from a phylogeo model void MCMC_GEO_Sigma(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree; do { MCMC_Single_Param_Generic(&(tree->geo->sigma), mixt_tree->geo->min_sigma, mixt_tree->geo->max_sigma, mixt_tree->mcmc->num_move_geo_sigma, NULL,&(mixt_tree->geo->c_lnL), NULL,GEO_Wrap_Lk, mixt_tree->mcmc->move_type[mixt_tree->mcmc->num_move_geo_sigma], NO,NO,NULL,mixt_tree,NULL); GEO_Update_Fmat(tree->geo); tree = tree->next; } while(tree); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef GEO // Sample competition parameter from a phylogeo model void MCMC_GEO_Lbda(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree; do { MCMC_Single_Param_Generic(&(tree->geo->lbda), mixt_tree->geo->min_lbda, mixt_tree->geo->max_lbda, mixt_tree->mcmc->num_move_geo_lambda, NULL,&(mixt_tree->geo->c_lnL), NULL,GEO_Wrap_Lk, mixt_tree->mcmc->move_type[mixt_tree->mcmc->num_move_geo_lambda], NO,NO,NULL,mixt_tree,NULL); tree = tree->next; } while(tree); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef GEO // Sample global migration rate parameter from a phylogeo model void MCMC_GEO_Tau(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree; do { MCMC_Single_Param_Generic(&(tree->geo->tau), mixt_tree->geo->min_tau, mixt_tree->geo->max_tau, mixt_tree->mcmc->num_move_geo_tau, NULL,&(mixt_tree->geo->c_lnL), NULL,GEO_Wrap_Lk, mixt_tree->mcmc->move_type[mixt_tree->mcmc->num_move_geo_tau], NO,NO,NULL,mixt_tree,NULL); tree = tree->next; } while(tree); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef GEO void MCMC_GEO_Dum(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree; do { MCMC_Single_Param_Generic(&(tree->geo->dum), mixt_tree->geo->min_dum, mixt_tree->geo->max_dum, mixt_tree->mcmc->num_move_geo_dum, NULL,&(mixt_tree->geo->c_lnL), NULL,GEO_Wrap_Lk, mixt_tree->mcmc->move_type[mixt_tree->mcmc->num_move_geo_dum], NO,NULL,mixt_tree,NULL); tree = tree->next; } while(tree); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef GEO void MCMC_GEO_Loc(t_tree *tree) { int target; int *rec_loc; // recorded locations int i; phydbl cur_lnL, new_lnL; phydbl u, ratio, alpha; phydbl sum; phydbl *probs; cur_lnL = tree->geo->c_lnL; rec_loc = (int *)mCalloc(2*tree->n_otu-1,sizeof(int)); For(i,2*tree->n_otu-1) rec_loc[i] = tree->geo->idx_loc[i]; // Choose an internal node (including the root) at random target = Rand_Int(tree->n_otu,2*tree->n_otu-2); target = 2*tree->n_otu-2; // Root node is special. Select new location uniformly at random if(tree->a_nodes[target] == tree->n_root) { probs = (phydbl *)mCalloc(tree->geo->ldscape_sz,sizeof(phydbl)); sum = 0.0; for(i=0;igeo->ldscape_sz;i++) sum += tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]; for(i=0;igeo->ldscape_sz;i++) probs[i] = tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]/sum; tree->geo->idx_loc[tree->n_root->num] = Sample_i_With_Proba_pi(probs,tree->geo->ldscape_sz); Free(probs); } // Randomize the locations below the selected node GEO_Randomize_Locations(tree->a_nodes[target], tree->geo, tree); new_lnL = GEO_Lk(tree->geo,tree); ratio = (new_lnL - cur_lnL); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { For(i,2*tree->n_otu-1) tree->geo->idx_loc[i] = rec_loc[i]; tree->geo->c_lnL = GEO_Lk(tree->geo,tree); // TO DO: you only need to update the occupation vector here... } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); Free(rec_loc); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Sample_Joint_Rates_Prior(t_tree *tree) { int i,dim; phydbl T; phydbl *r,*t,*lambda; phydbl *min_r,*max_r; phydbl k; dim = 2*tree->n_otu-2; lambda = tree->rates->_2n_vect1; min_r = tree->rates->_2n_vect2; max_r = tree->rates->_2n_vect3; r = tree->rates->br_r; t = tree->times->nd_t; for(i=0;irates->mean_r[i] = 1.0; RATES_Fill_Lca_Table(tree); RATES_Covariance_Mu(tree); T = .0; for(i=0;ia_nodes[i]->num] - t[tree->a_nodes[i]->anc->num]); for(i=0;ia_nodes[i]->num] - t[tree->a_nodes[i]->anc->num])/T; for(i=0;irates->min_rate; for(i=0;irates->max_rate; k = 1.; /* We want \sum_i lambda[i] r[i] = 1 */ Rnorm_Multid_Trunc_Constraint(tree->rates->mean_r, tree->rates->cov_r, min_r,max_r, lambda, k, r, dim); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Rates_All(t_tree *tree) { if(tree->eval_alnL == NO || tree->eval_rlnL == NO) return; if(tree->rates->model_id == STRICTCLOCK) return; if(tree->rates->model_id == GUINDON) return; if(tree->eval_alnL == YES) { Set_Both_Sides(YES,tree); Lk(NULL,tree); } MCMC_One_Rate(tree->n_root,tree->n_root->v[1],YES,tree); if(tree->eval_alnL == YES) Update_Partial_Lk(tree,tree->e_root,tree->n_root->v[1]); MCMC_One_Rate(tree->n_root,tree->n_root->v[2],YES,tree); RATES_Update_Normalization_Factor(tree); RATES_Update_Edge_Lengths(tree); if(tree->eval_alnL == YES) { Set_Both_Sides(NO,tree); Lk(NULL,tree); /* Required in order to rescale all branch rates */ } #ifdef PHYREX PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_One_Rate(t_node *a, t_node *d, int traversal, t_tree *tree) { t_edge *b; int i; phydbl u; phydbl new_lnL_seq, cur_lnL_seq; phydbl new_lnL_rate, cur_lnL_rate; phydbl ratio, hr, alpha; phydbl new_mu, cur_mu; phydbl r_min, r_max; int move_num; phydbl K; if(tree->eval_alnL == NO || tree->eval_rlnL == NO) return; if(tree->rates->model_id == STRICTCLOCK) return; if(tree->rates->model_id == GUINDON) return; b = Get_Edge(a,d,tree); assert(b); cur_mu = tree->rates->br_r[d->num]; new_mu = tree->rates->br_r[d->num]; r_min = tree->rates->min_rate; r_max = tree->rates->max_rate; ratio = 0.0; move_num = tree->mcmc->num_move_br_r; /* K = 0.01; */ /* K = 1.0; */ K = 0.1; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; hr = 0.0; MCMC_Make_Move(&cur_mu,&new_mu,r_min,r_max,&hr,K,tree->mcmc->move_type[move_num]); if(new_mu < r_min || new_mu > r_max) { tree->mcmc->run_move[move_num]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif return; } tree->rates->br_r[d->num] = new_mu; tree->rates->br_do_updt[d->num] = YES; if(a != NULL) { RATES_Update_One_Edge_Length(b,tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(b,tree); } if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) ratio += (new_lnL_rate - cur_lnL_rate); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); /* PhyML_Printf("\n. %f->%f %f->%f %f->%f ratio:%f", */ /* cur_mu,new_mu, */ /* cur_lnL_seq,new_lnL_seq, */ /* cur_lnL_rate,new_lnL_rate, */ /* ratio); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->rates->br_r[d->num] = cur_mu; RATES_Update_One_Edge_Length(b,tree); if(tree->eval_alnL == YES) Update_PMat_At_Given_Edge(b,tree); tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rate; } else { tree->mcmc->acc_move[move_num]++; } tree->mcmc->run_move[move_num]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif if(traversal == YES) { if(d->tax == YES) return; else { for(i=0;i<3;++i) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(tree->eval_alnL == YES) Update_Partial_Lk(tree,d->b[i],d); MCMC_One_Rate(d,d->v[i],YES,tree); } Update_Partial_Lk(tree,b,d); } } } #endif /* ////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////// */ /* Shrink or expand edge-specific relative rates of substitution */ #if (defined PHYREX || PHYTIME) void MCMC_Rates_Shrink(t_tree *tree) { int i; phydbl K,mult,u,alpha,ratio; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnL_seq,new_lnL_seq; phydbl r; /* Reference value for relative rates (set to 1.0 usually) */ if(tree->eval_alnL == NO || tree->eval_rlnL == NO) return; if(tree->rates->model_id == STRICTCLOCK) return; if(FABS(tree->times->t_prior_max[tree->n_root->num] - tree->times->t_prior_min[tree->n_root->num]) < 1.E-10) return; TIMES_Record_Times(tree); RATES_Record_Rates(tree); r = 1.0; K = tree->mcmc->tune_move[tree->mcmc->num_move_rates_shrink]; /* parameter of gamma distribution for selecting value of rate multiplier */ ratio = 0.0; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; u = Uni(); mult = Rgamma(1./K,K); for(i=0;i<2*tree->n_otu-2;++i) { assert(tree->a_nodes[i] != tree->n_root); tree->rates->br_r[tree->a_nodes[i]->num] = r + mult*(tree->rates->br_r[tree->a_nodes[i]->num] - r); if(tree->rates->br_r[tree->a_nodes[i]->num] < tree->rates->min_rate || tree->rates->br_r[tree->a_nodes[i]->num] > tree->rates->max_rate) { RATES_Reset_Rates(tree); tree->mcmc->run_move[tree->mcmc->num_move_rates_shrink]++; return; } } PHYREX_Update_Ldsk_Rates_Given_Edges(tree); RATES_Update_Normalization_Factor(tree); RATES_Update_Edge_Lengths(tree); if(RATES_Check_Node_Times(tree)) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); ratio += log(Dgamma(1./mult,1./K,K) / Dgamma(mult,1./K,K)); ratio += (2.*tree->n_otu-2.)*log(mult); /* Metropolis ratio */ if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) ratio += (new_lnL_rate - cur_lnL_rate); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); /* PhyML_Printf("\n. mult: %6f lnL_seq: %12f -> %12f lnL_rate: %12f -> %12f alpha: %6f", */ /* mult, */ /* cur_lnL_seq,new_lnL_seq, */ /* cur_lnL_rate,new_lnL_rate, */ /* alpha); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { RATES_Reset_Rates(tree); #ifdef PHYREX PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif RATES_Update_Normalization_Factor(tree); RATES_Update_Edge_Lengths(tree); tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rate; } else { tree->mcmc->acc_move[tree->mcmc->num_move_rates_shrink]++; } tree->mcmc->run_move[tree->mcmc->num_move_rates_shrink]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif /* ////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////// */ #if (defined PHYREX || PHYTIME) void MCMC_One_Node_Rate(t_node *a, t_node *d, int traversal, t_tree *tree) { t_edge *b; int i; b = NULL; if(a == tree->n_root) b = tree->e_root; else for(i=0;i<3;i++) if(d->v[i] == a) { b = d->b[i]; break; } /* Only the log_RANDWALK move seems to work here. Change with caution then. */ tree->rates->br_do_updt[d->num] = YES; MCMC_Single_Param_Generic(&(tree->rates->nd_r[d->num]), tree->rates->min_rate, tree->rates->max_rate, tree->mcmc->num_move_nd_r, &(tree->rates->c_lnL),NULL, Wrap_Lk_Rates,NULL, tree->mcmc->move_type[tree->mcmc->num_move_nd_r], NO,NO,NULL,tree,NULL); Update_PMat_At_Given_Edge(b,tree); if(traversal == YES) { if(d->tax == YES) return; else { for(i=0;i<3;i++) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { MCMC_One_Node_Rate(d,d->v[i],YES,tree); } } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Times_And_Rates_All(t_tree *tree) { MCMC_Times_And_Rates_Root(tree); MCMC_Times_And_Rates_Recur(tree->n_root,tree->n_root->v[1],YES,tree); MCMC_Times_And_Rates_Recur(tree->n_root,tree->n_root->v[2],YES,tree); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Times_And_Rates_Root(t_tree *tree) { phydbl u; phydbl t_min,t_max; phydbl r_min,r_max; phydbl t1_cur, t1_new; phydbl cur_lnL_rate, new_lnL_rate; phydbl cur_lnL_time, new_lnL_time; phydbl cur_lnL_seq, new_lnL_seq; phydbl ratio,alpha; phydbl t0,t2,t3; t_node *v2,*v3; phydbl K; int move_num; t_node *root; phydbl r2_cur,r3_cur; phydbl r2_new,r3_new; root = tree->n_root; if(FABS(tree->times->t_prior_min[root->num] - tree->times->t_prior_max[root->num]) < 1.E-10) return; move_num = tree->mcmc->num_move_times_and_rates_root; K = tree->mcmc->tune_move[move_num]; t1_cur = tree->times->nd_t[root->num]; ratio = 0.0; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = tree->rates->c_lnL; cur_lnL_time = tree->times->c_lnL; new_lnL_time = tree->times->c_lnL; cur_lnL_seq = tree->c_lnL; new_lnL_seq = tree->c_lnL; r_min = tree->rates->min_rate; r_max = tree->rates->max_rate; v2 = root->v[2]; v3 = root->v[1]; t0 = tree->times->t_prior_min[root->num]; t2 = tree->times->nd_t[v2->num]; t3 = tree->times->nd_t[v3->num]; t_min = -INFINITY; t_max = MIN(t2,t3); t_min += tree->rates->min_dt; t_max -= tree->rates->min_dt; u = Uni(); t1_new = t_max - (t_max - t1_cur)*exp(K*(u-.5)); ratio += log((t1_new - t_max) / (t1_cur - t_max)); r2_cur = r3_cur = -1.0; if(tree->rates->model_id == THORNE || tree->rates->model_id == LOGNORMAL || tree->rates->model_id == STRICTCLOCK) { r2_cur = tree->rates->br_r[v2->num]; r3_cur = tree->rates->br_r[v3->num]; } else if(tree->rates->model_id == GUINDON) { r2_cur = tree->rates->nd_r[v2->num]; r3_cur = tree->rates->nd_r[v3->num]; } else assert(FALSE); r2_new = r2_cur * (t2 - t1_cur) / (t2 - t1_new); r3_new = r3_cur * (t3 - t1_cur) / (t3 - t1_new); if(t_min > t_max) { PhyML_Fprintf(stderr,"\n. glnL:%f",TIMES_Lk(tree)); PhyML_Fprintf(stderr,"\n. t:%f",tree->times->nd_t[tree->n_root->num]); PhyML_Fprintf(stderr,"\n. t0 = %f t2 = %f t3 = %f",t0,t2,t3); PhyML_Fprintf(stderr,"\n. t_min = %f t_max = %f",t_min,t_max); PhyML_Fprintf(stderr,"\n. prior_min = %f prior_max = %f",tree->times->t_prior_min[root->num],tree->times->t_prior_max[root->num]); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } if(t1_new > t_min && t1_new < t_max && r2_new > r_min && r2_new < r_max && r3_new > r_min && r3_new < r_max) { TIMES_Record_Times(tree); RATES_Record_Rates(tree); tree->times->nd_t[root->num] = t1_new; if(tree->rates->model_id == THORNE || tree->rates->model_id == LOGNORMAL || tree->rates->model_id == STRICTCLOCK) { tree->rates->br_r[v2->num] = r2_new; tree->rates->br_r[v3->num] = r3_new; } else if(tree->rates->model_id == GUINDON) { tree->rates->nd_r[v2->num] = r2_new; tree->rates->nd_r[v3->num] = r3_new; } else assert(FALSE); if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); if(tree->rates->model_id == GUINDON) { if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); } else new_lnL_seq = cur_lnL_seq; ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnL_time - cur_lnL_time); ratio += (new_lnL_seq - cur_lnL_seq); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); /* printf("\n. alnL:%f->%f tlnL: %f->%f rlnL: %f->%f ratio: %f", */ /* cur_lnL_seq,new_lnL_seq, */ /* cur_lnL_time,new_lnL_time, */ /* cur_lnL_rate,new_lnL_rate, */ /* ratio); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->times->nd_t[root->num] = t1_cur; RATES_Reset_Rates(tree); RATES_Update_Edge_Lengths(tree); tree->rates->c_lnL = cur_lnL_rate; tree->times->c_lnL = cur_lnL_time; tree->c_lnL = cur_lnL_seq; } else { tree->mcmc->acc_move[move_num]+=1; } // Ignore boundaries when updating tuning parameter tree->mcmc->run_move[move_num]+=1; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Times_And_Rates_Recur(t_node *a, t_node *d, int traversal, t_tree *tree) { phydbl u; phydbl t_min,t_max; phydbl r_min,r_max; phydbl t1_cur, t1_new; phydbl cur_lnL_rate, new_lnL_rate; phydbl cur_lnL_time, new_lnL_time; phydbl cur_lnL_seq, new_lnL_seq; phydbl ratio,alpha; int i; phydbl t0,t2,t3; t_node *v2,*v3; int move_num; phydbl r1_cur,r2_cur,r3_cur; phydbl r1_new,r2_new,r3_new; if(d->tax) return; /* Won't change time at tip */ move_num = tree->mcmc->num_move_times_and_rates; t1_cur = tree->times->nd_t[d->num]; ratio = 0.0; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = tree->rates->c_lnL; cur_lnL_time = tree->times->c_lnL; new_lnL_time = tree->times->c_lnL; cur_lnL_seq = tree->c_lnL; new_lnL_seq = tree->c_lnL; r_min = tree->rates->min_rate; r_max = tree->rates->max_rate; r2_cur = -1.0; r1_cur = -1.0; r3_cur = -1.0; v2 = v3 = NULL; for(i=0;i<3;++i) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(!v2) { v2 = d->v[i]; } else { v3 = d->v[i]; } } if(tree->rates->model_id == THORNE || tree->rates->model_id == LOGNORMAL || tree->rates->model_id == STRICTCLOCK) { r1_cur = tree->rates->br_r[d->num]; r2_cur = tree->rates->br_r[v2->num]; r3_cur = tree->rates->br_r[v3->num]; } else if(tree->rates->model_id == GUINDON) { r1_cur = tree->rates->nd_r[d->num]; r2_cur = tree->rates->nd_r[v2->num]; r3_cur = tree->rates->nd_r[v3->num]; } else assert(FALSE); t0 = tree->times->nd_t[a->num]; t2 = tree->times->nd_t[v2->num]; t3 = tree->times->nd_t[v3->num]; t_min = MAX(t0,tree->times->t_prior_min[d->num]); t_max = MIN(tree->times->t_prior_max[d->num],MIN(t2,t3)); t_min += tree->rates->min_dt; t_max -= tree->rates->min_dt; t1_new = Uni()*(t_max - t_min) + t_min; r1_new = r1_cur * (t1_cur - t0) / (t1_new - t0); r2_new = r2_cur * (t2 - t1_cur) / (t2 - t1_new); r3_new = r3_cur * (t3 - t1_cur) / (t3 - t1_new); ratio += log((t1_cur - t0) / (t1_new - t0) * (t2 - t1_cur) / (t2 - t1_new) * (t3 - t1_cur) / (t3 - t1_new)); if(t1_new > t_min && t1_new < t_max && r1_new > r_min && r1_new < r_max && r2_new > r_min && r2_new < r_max && r3_new > r_min && r3_new < r_max) { TIMES_Record_Times(tree); RATES_Record_Rates(tree); tree->times->nd_t[d->num] = t1_new; if(tree->rates->model_id == THORNE || tree->rates->model_id == LOGNORMAL || tree->rates->model_id == STRICTCLOCK) { tree->rates->br_r[d->num] = r1_new; tree->rates->br_r[v2->num] = r2_new; tree->rates->br_r[v3->num] = r3_new; } else if(tree->rates->model_id == GUINDON) { tree->rates->nd_r[d->num] = r1_new; tree->rates->nd_r[v2->num] = r2_new; tree->rates->nd_r[v3->num] = r3_new; } else assert(FALSE); if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); if(tree->rates->model_id == GUINDON) { RATES_Update_Edge_Lengths(tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); } else new_lnL_seq = cur_lnL_seq; ratio += (new_lnL_time - cur_lnL_time); ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnL_seq - cur_lnL_seq); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* printf("\n. rej"); */ TIMES_Reset_Times(tree); RATES_Reset_Rates(tree); RATES_Update_Edge_Lengths(tree); tree->rates->c_lnL = cur_lnL_rate; tree->times->c_lnL = cur_lnL_time; tree->c_lnL = cur_lnL_seq; } else { /* printf("\n. acc"); */ tree->mcmc->acc_move[move_num]++; } tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } tree->mcmc->run_move[move_num]++; if(d->tax == YES) return; else { for(i=0;i<3;i++) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { MCMC_Times_And_Rates_Recur(d,d->v[i],YES,tree); } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Times_All(t_tree *tree) { // Down partials may not be up to date. Set_Both_Sides(YES,tree); if(tree->eval_alnL == YES) Lk(NULL,tree); Set_Both_Sides(NO,tree); MCMC_Root_Time(tree,NO); MCMC_Time_Recur(tree->n_root,tree->n_root->v[1],YES,tree); if(tree->eval_alnL == YES) Update_Partial_Lk(tree,tree->e_root,tree->n_root->v[1]); MCMC_Time_Recur(tree->n_root,tree->n_root->v[2],YES,tree); #ifdef PHYREX /* if(tree->mmod->safe_phyrex == YES) PHYREX_Update_Disk_Times_Given_Nodes(tree); */ #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Time_Recur(t_node *a, t_node *d, int traversal, t_tree *tree) { phydbl u; phydbl t_min,t_max; phydbl t1_cur, t1_new; phydbl cur_lnL_seq, new_lnL_seq; phydbl cur_lnL_rate, new_lnL_rate; phydbl cur_lnL_time, new_lnL_time; /* phydbl K; */ phydbl ratio,alpha; t_edge *b1,*b2,*b3; int i; phydbl t0,t2,t3; t_node *v2,*v3; int move_num; if(tree->mod->s_opt->opt_node_ages == NO) return; if(d->tax) return; /* Won't change time at tip */ move_num = tree->mcmc->num_move_times; t1_cur = tree->times->nd_t[d->num]; ratio = 0.0; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; v2 = v3 = NULL; for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(!v2) { v2 = d->v[i]; } else { v3 = d->v[i]; } } b1 = NULL; if(a == tree->n_root) b1 = tree->e_root; else for(i=0;i<3;i++) if(d->v[i] == a) { b1 = d->b[i]; break; } b2 = b3 = NULL; for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(!b2) { b2 = d->b[i]; } else { b3 = d->b[i]; } } t0 = tree->times->nd_t[a->num]; t2 = tree->times->nd_t[v2->num]; t3 = tree->times->nd_t[v3->num]; t_min = MAX(t0,tree->times->t_prior_min[d->num]); t_max = MIN(tree->times->t_prior_max[d->num],MIN(t2,t3)); t_min += tree->rates->min_dt; t_max -= tree->rates->min_dt; /* K = tree->mcmc->tune_move[tree->mcmc->num_move_times] * (t_max - t_min); */ /* MCMC_Make_Move(&t1_cur,&t1_new,t_min,t_max,&ratio,K,tree->mcmc->move_type[move_num]); */ t1_new = Uni()*(t_max - t_min) + t_min; if(t1_new > t_min && t1_new < t_max) { TIMES_Record_Times(tree); tree->times->nd_t[d->num] = t1_new; if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); } if(tree->eval_tlnL == YES) ratio += (new_lnL_time - cur_lnL_time); if(new_lnL_time > UNLIKELY) { RATES_Update_Edge_Lengths(tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); if(tree->eval_rlnL == YES) ratio += (new_lnL_rate - cur_lnL_rate); if(tree->eval_alnL == YES && tree->io->lk_approx == EXACT) { Update_PMat_At_Given_Edge(b1,tree); Update_PMat_At_Given_Edge(b2,tree); Update_PMat_At_Given_Edge(b3,tree); Update_Partial_Lk(tree,b1,d); } if(tree->eval_alnL == YES) new_lnL_seq = Lk(b1,tree); if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); } /* printf("\n. One_Time cur_t: %f new_t: %f ratio: %f alnL:%f->%f tlnL: %f->%f rlnL: %f->%f", */ /* t1_cur,t1_new, */ /* ratio, */ /* cur_lnL_seq,new_lnL_seq, */ /* cur_lnL_time,new_lnL_time, */ /* cur_lnL_rate,new_lnL_rate); */ ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* printf("\n. rej"); */ TIMES_Reset_Times(tree); RATES_Update_Edge_Lengths(tree); if(tree->eval_alnL == YES && tree->io->lk_approx == EXACT) { Update_PMat_At_Given_Edge(b1,tree); Update_PMat_At_Given_Edge(b2,tree); Update_PMat_At_Given_Edge(b3,tree); Update_Partial_Lk(tree,b1,d); } if(isinf(FABS(new_lnL_time)) == YES || isnan(new_lnL_time) == YES) { Print_Node(tree->n_root,tree->n_root->v[1],tree); Print_Node(tree->n_root,tree->n_root->v[2],tree); assert(FALSE); } tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rate; tree->times->c_lnL = cur_lnL_time; if(Are_Equal(tree->times->c_lnL,cur_lnL_time,1.E-3) == NO) { PhyML_Fprintf(stderr,"\n\n"); PhyML_Fprintf(stderr,"\n. moved node %d from %f to %f\n",d->num,t1_cur,t1_new); Print_Node(tree->n_root,tree->n_root->v[1],tree); Print_Node(tree->n_root,tree->n_root->v[2],tree); PhyML_Fprintf(stderr,"\n. new_glnL: %f cur_glnL: %f",tree->times->c_lnL,cur_lnL_time); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } /* new_lnL_seq = Lk(NULL,tree); /\* Not necessary. Remove once tested *\/ */ /* if(Are_Equal(new_lnL_seq,cur_lnL_seq,1.E-3) == NO) */ /* { */ /* PhyML_Printf("\n. a: %d d: %d v2: %d v3: %d",a->num,d->num,v2->num,v3->num); */ /* PhyML_Printf("\n. t1_cur: %f t1_new: %f",t1_cur,t1_new); */ /* PhyML_Printf("\n. new_alnL: %f cur_alnL: %f",new_lnL_seq,cur_lnL_seq); */ /* Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* } */ } else { /* cur_lnL_seq = Lk(NULL,tree); /\* Not necessary. Remove once tested *\/ */ /* if(Are_Equal(new_lnL_seq,cur_lnL_seq,1.E-3) == NO) */ /* { */ /* PhyML_Printf("\n. a: %d d: %d v2: %d v3: %d",a->num,d->num,v2->num,v3->num); */ /* PhyML_Printf("\n. t1_cur: %f t1_new: %f",t1_cur,t1_new); */ /* PhyML_Printf("\n. new_alnL: %f cur_alnL: %f",new_lnL_seq,cur_lnL_seq); */ /* Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* } */ tree->mcmc->acc_move[move_num]++; } /* printf("\n. %f",new_lnL_seq); fflush(NULL); */ if(t1_new < t0) { t1_new = t0+1.E-4; PhyML_Fprintf(stderr,"\n"); PhyML_Fprintf(stderr,"\n. a is root -> %s",(a == tree->n_root)?("YES"):("NO")); PhyML_Fprintf(stderr,"\n. t0 = %f t1_new = %f",t0,t1_new); PhyML_Fprintf(stderr,"\n. t_min=%f t_max=%f",t_min,t_max); PhyML_Fprintf(stderr,"\n. (t1-t0)=%f (t2-t1)=%f",t1_cur-t0,t2-t1_cur); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); /* Exit("\n"); */ } if(t1_new > MIN(t2,t3)) { PhyML_Fprintf(stderr,"\n"); PhyML_Fprintf(stderr,"\n. a is root -> %s",(a == tree->n_root)?("YES"):("NO")); PhyML_Fprintf(stderr,"\n. t0 = %f t1_new = %f t1 = %f t2 = %f t3 = %f MIN(t2,t3)=%f",t0,t1_new,t1_cur,t2,t3,MIN(t2,t3)); PhyML_Fprintf(stderr,"\n. t_min=%f t_max=%f",t_min,t_max); PhyML_Fprintf(stderr,"\n. (t1-t0)=%f (t2-t1)=%f",t1_cur-t0,t2-t1_cur); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); /* Exit("\n"); */ } if(isnan(t1_new)) { PhyML_Fprintf(stderr,"\n. run=%d",tree->mcmc->run); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); } tree->mcmc->run_move[move_num]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif if(traversal == YES) { if(d->tax == YES) return; else { for(i=0;i<3;i++) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(tree->eval_alnL == YES) Update_Partial_Lk(tree,d->b[i],d); MCMC_Time_Recur(d,d->v[i],YES,tree); } if(tree->eval_alnL == YES) Update_Partial_Lk(tree,b1,d); } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Root_Time(t_tree *tree, int print) { phydbl u; phydbl t_min,t_max; phydbl t0_cur, t0_new; phydbl cur_lnL_seq, new_lnL_seq; phydbl cur_lnL_rate, new_lnL_rate; #ifdef PHYREX phydbl cur_lnL_loc, new_lnL_loc; #endif phydbl cur_lnL_time, new_lnL_time; phydbl ratio,alpha,hr; phydbl t2,t1; t_node *v2,*v1; int move_num,iter,n_tot_iter; t_node *root; if(tree->mod->s_opt->opt_node_ages == NO) return; if(tree->eval_tlnL == NO) return; Set_Both_Sides(NO,tree); root = tree->n_root; move_num = tree->mcmc->num_move_root_time; v1 = root->v[1]; v2 = root->v[2]; t1 = tree->times->nd_t[v1->num]; t2 = tree->times->nd_t[v2->num]; if(tree->n_root->ldsk == NULL) { t_max = MIN(t2,t1); } else { t_max = +INFINITY; for(int i=0;in_root->ldsk->n_next;++i) if(tree->n_root->ldsk->next[i]->disk->time < t_max) t_max = tree->n_root->ldsk->next[i]->disk->time; } iter = 0; n_tot_iter = 1+(int)(0.1*tree->n_otu); do { ratio = 0.0; hr = 0.0; if(FABS(tree->times->t_prior_min[root->num] - tree->times->t_prior_max[root->num]) < 1.E-10) return; Set_Lk(tree); cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; #ifdef PHYREX cur_lnL_loc = tree->mmod->c_lnL; new_lnL_loc = UNLIKELY; #endif cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; t0_cur = tree->times->nd_t[root->num]; t_min = t0_cur - 0.1 * (tree->young_disk->time - t0_cur); t0_new = Uni()*(t_max - t_min) + t_min; hr -= log(1./(t_max - (t0_cur - 0.1 * (tree->young_disk->time - t0_cur)))); hr += log(1./(t_max - (t0_new - 0.1 * (tree->young_disk->time - t0_new)))); if(isnan(t0_new)) { PhyML_Printf("\n. t_max=%f t0_cur=%f t0_new=%f",t_max,t0_cur,t0_new); assert(FALSE); } if(t0_new > t_min && t0_new < t_max) { tree->times->nd_t[root->num] = t0_new; if(tree->n_root->ldsk) tree->n_root->ldsk->disk->time = tree->times->nd_t[root->num]; RATES_Update_One_Edge_Length(tree->e_root,tree); if(tree->eval_glnL == YES) { if(VELOC_Is_Integrated_Velocity(tree->mmod) == YES) { VELOC_Update_Lk_Velocity_Down(NULL,tree->n_root,tree); VELOC_Update_Lk_Location_Down(NULL,tree->n_root,tree); new_lnL_loc = (tree->mmod->use_locations == YES) ? LOCATION_Lk(tree->n_root,tree) : 0.0; // new_lnL_loc = (tree->mmod->use_locations == YES) ? LOCATION_Lk(NULL,tree) : 0.0; /* !!!!!!!!!!!!!!!!! */ } else new_lnL_loc = (tree->mmod->use_locations == YES) ? LOCATION_Lk(NULL,tree) : 0.0; } if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(tree->e_root,tree); } ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) ratio += (new_lnL_rate - cur_lnL_rate); if(tree->eval_tlnL == YES) ratio += (new_lnL_time - cur_lnL_time); #ifdef PHYREX if(tree->eval_glnL == YES && tree->mmod->use_locations == YES) ratio += (new_lnL_loc - cur_lnL_loc); #endif ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); #ifdef PHYREX /* if(tree->mcmc->run > 4243300) */ /* { */ /* PhyML_Printf("\n. %c [%4d] t:%1f->%1f tmin:%12f tmax:%12f t1:%f t2:%f R: %12f alnL:%10f->%10f[%d] tlnL: %10f->%10f[%d] glnL: %10f->%10f[%d] (%10f->%10f,%10f->%10f) rlnL: %10f->%10f[%d] hr: %f ratio: %10f", */ /* (tree->aux_tree != NULL) ? '*' : 'X', */ /* tree->mcmc->run, */ /* t0_cur,t0_new, */ /* t_min,t_max, */ /* t1,t2, */ /* tree->rates->norm_fact, */ /* cur_lnL_seq,new_lnL_seq,tree->eval_alnL, */ /* cur_lnL_time,new_lnL_time,tree->eval_glnL, */ /* cur_lnL_loc,new_lnL_loc,tree->eval_glnL, */ /* cur_lnL_loc_loc,new_lnL_loc_loc, */ /* cur_lnL_loc_veloc,new_lnL_loc_veloc, */ /* cur_lnL_rate,new_lnL_rate,tree->eval_rlnL, */ /* hr, */ /* ratio); */ /* } */ /* if(tree->aux_tree != NULL) */ /* { */ /* PhyML_Printf("\n."); */ /* PhyML_Printf("\n. %c [%4d] \n. t: %1f->%1f t1:%f t2: %f \n. r1: %10f->%10f r2: %10f->%10f \n. R: %12f alnL:%10f->%10f[%d] \n. tlnL: %10f->%10f[%d] \n. glnL: %10f->%10f[%d] \n. rlnL: %10f->%10f[%d] \n. tune: %10f hr: %f ratio: %10f K: %10f rate_failed: %d", */ /* (tree->aux_tree != NULL) ? '*' : 'X', */ /* tree->mcmc->run, */ /* t0_cur,t0_new, */ /* t1,t2, */ /* r1_cur,r1_new, */ /* r2_cur,r2_new, */ /* tree->rates->norm_fact, */ /* cur_lnL_seq,new_lnL_seq,tree->eval_alnL, */ /* cur_lnL_time,new_lnL_time,tree->eval_glnL, */ /* cur_lnL_loc,new_lnL_loc,tree->eval_glnL, */ /* cur_lnL_rate,new_lnL_rate,tree->eval_rlnL, */ /* tune, */ /* hr, */ /* ratio,K,rate_failed); */ /* PhyML_Printf("\n."); */ /* } */ #endif assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->times->nd_t[root->num] = t0_cur; if(tree->n_root->ldsk) tree->n_root->ldsk->disk->time = t0_cur; RATES_Update_One_Edge_Length(tree->e_root,tree); Reset_Lk(tree); } else { tree->mcmc->acc_move[move_num]++; } tree->mcmc->run_move[move_num]+=1; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } while(++iter < n_tot_iter); #ifdef PHYREX PHYREX_Update_Disk_Times_Given_Nodes(tree); PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Tree_Height(t_tree *tree) { phydbl K,mult,u,alpha,ratio; phydbl cur_lnL_seq,new_lnL_seq; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnL_time,new_lnL_time; phydbl floor; int n_nodes; if(FABS(tree->times->t_prior_max[tree->n_root->num] - tree->times->t_prior_min[tree->n_root->num]) < 1.E-10) return; TIMES_Record_Times(tree); K = tree->mcmc->tune_move[tree->mcmc->num_move_tree_height]; ratio = 0.0; cur_lnL_seq = tree->c_lnL; new_lnL_seq = tree->c_lnL; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = tree->rates->c_lnL; cur_lnL_time = tree->times->c_lnL; new_lnL_time = tree->times->c_lnL; u = Uni(); mult = exp(K*(u-0.5)); floor = 0.0; Scale_Subtree_Height(tree->n_root,mult,floor,&n_nodes,tree); RATES_Update_Edge_Lengths(tree); if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); if(new_lnL_time > UNLIKELY) { if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); } ratio += (phydbl)(n_nodes)*log(mult); ratio += (new_lnL_seq - cur_lnL_seq); ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnL_time - cur_lnL_time); /* printf("\n. seq: %f %f times: %f %f rates: %f %f", */ /* new_lnL_seq,cur_lnL_seq, */ /* new_lnL_time,cur_lnL_time, */ /* new_lnL_rate,cur_lnL_rate); */ ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { TIMES_Reset_Times(tree); RATES_Update_Edge_Lengths(tree); tree->times->c_lnL = TIMES_Lk(tree); // Required in order to set t_prior_min/max to their original values tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rate; if(Are_Equal(tree->times->c_lnL,cur_lnL_time,1.E-3) == NO) { PhyML_Fprintf(stderr,"\n. new_glnL: %f cur_glnL: %f",tree->times->c_lnL,cur_lnL_time); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } else { tree->mcmc->acc_move[tree->mcmc->num_move_tree_height]++; } tree->mcmc->run_move[tree->mcmc->num_move_tree_height]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Updown_T_Cr(t_tree *tree) { /*! TO DO: make sure to change the values of clock_r across the different seq partitions */ int i; phydbl K,mult,u,alpha,ratio; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnP_rate,new_lnP_rate; phydbl cur_lnL_time,new_lnL_time; phydbl cur_lnL_seq,new_lnL_seq; phydbl floor; int n_nodes; /*! Check that sequences are isochronous. */ for(i=0;in_otu-1;i++) if(!Are_Equal(tree->times->nd_t[i+1],tree->times->nd_t[i],1.E-10)) return; if(FABS(tree->times->t_prior_max[tree->n_root->num] - tree->times->t_prior_min[tree->n_root->num]) < 1.E-10) return; TIMES_Record_Times(tree); K = tree->mcmc->tune_move[tree->mcmc->num_move_updown_t_cr]; ratio = 0.0; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnP_rate = tree->rates->c_lnP; new_lnP_rate = UNLIKELY; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; u = Uni(); mult = exp(K*(u-0.5)); floor = 0.0; Scale_Subtree_Height(tree->n_root,mult,floor,&n_nodes,tree); if(tree->mod->s_opt->opt_clock_r == YES) { tree->rates->clock_r /= mult; if(tree->rates->clock_r < tree->rates->min_clock || tree->rates->clock_r > tree->rates->max_clock) { tree->rates->clock_r *= mult; TIMES_Reset_Times(tree); tree->mcmc->run_move[tree->mcmc->num_move_updown_t_cr]++; return; } } RATES_Update_Edge_Lengths(tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) { new_lnL_rate = RATES_Lk(tree); new_lnP_rate = RATES_Prior(tree); } if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); /* The Hastings ratio is actually mult^(n) when changing the absolute node heights. When considering the relative heights, this ratio combined to the Jacobian for the change of variable ends up to being equal to mult. */ ratio += (n_nodes - 1)*log(mult); if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) { ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnP_rate - cur_lnP_rate); } if(tree->eval_tlnL == YES) ratio += (new_lnL_time - cur_lnL_time); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); /* printf("\n. t_old = %f t_new = %f cr_old = %f cr_new = %f", */ /* tree->times->nd_t[tree->n_root->num]/mult, */ /* tree->times->nd_t[tree->n_root->num], */ /* tree->rates->clock_r*mult, */ /* tree->rates->clock_r); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { /* printf(" reject"); */ TIMES_Reset_Times(tree); if(tree->mod->s_opt->opt_clock_r == YES) tree->rates->clock_r *= mult; RATES_Update_Edge_Lengths(tree); tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rate; tree->rates->c_lnP = cur_lnP_rate; tree->times->c_lnL = cur_lnL_time; } else { /* printf("\ accept"); */ tree->mcmc->acc_move[tree->mcmc->num_move_updown_t_cr]++; } tree->mcmc->run_move[tree->mcmc->num_move_updown_t_cr]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Updown_T_Br(t_tree *tree) { int i; phydbl K,mult,u,alpha,ratio; phydbl cur_lnL_seq,new_lnL_seq; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnL_time,new_lnL_time; phydbl cur_lnL_geo,new_lnL_geo; phydbl floor; int n_nodes, target; if(tree->rates->model_id == STRICTCLOCK) return; /*! Check that sequences are isochronous. */ for(i=0;in_otu-1;i++) if(!Are_Equal(tree->times->nd_t[i+1],tree->times->nd_t[i],1.E-10)) return; if(FABS(tree->times->t_prior_max[tree->n_root->num] - tree->times->t_prior_min[tree->n_root->num]) < 1.E-10) return; TIMES_Record_Times(tree); RATES_Record_Rates(tree); K = 0.01; ratio = 0.0; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; cur_lnL_geo = tree->mmod->c_lnL; new_lnL_geo = UNLIKELY; u = Uni(); mult = exp(K*(u-0.5)); target = tree->n_root->num; floor = 0.0; Scale_Subtree_Height(tree->a_nodes[target],mult,floor,&n_nodes,tree); assert(n_nodes == tree->n_otu-1); for(i=0;i<2*tree->n_otu-1;++i) { if(tree->times->nd_t[i] > tree->times->t_prior_max[i] || tree->times->nd_t[i] < tree->times->t_prior_min[i]) { TIMES_Reset_Times(tree); tree->mcmc->run_move[tree->mcmc->num_move_updown_t_br]++; return; } } for(i=0;i<2*tree->n_otu-2;++i) { assert(tree->a_nodes[i] != tree->n_root); tree->rates->br_r[tree->a_nodes[i]->num] /= mult; if(tree->rates->br_r[tree->a_nodes[i]->num] < tree->rates->min_rate || tree->rates->br_r[tree->a_nodes[i]->num] > tree->rates->max_rate) { TIMES_Reset_Times(tree); RATES_Reset_Rates(tree); tree->mcmc->run_move[tree->mcmc->num_move_updown_t_br]++; return; } } PHYREX_Update_Disk_Times_Given_Nodes(tree); PHYREX_Update_Ldsk_Rates_Given_Edges(tree); RATES_Update_Normalization_Factor(tree); RATES_Update_Edge_Lengths(tree); if(RATES_Check_Node_Times(tree)) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); if(tree->eval_glnL == YES) new_lnL_geo = LOCATION_Lk(NULL,tree); if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); int n = tree->n_otu; ratio += (2.*n-2.-2.) * log(1./mult); // HR for rates ratio += (n-1.-2.) * log(mult); // HR for times ratio += 2.*log(mult); // Ratio of proposal densities /* Metropolis ratio */ if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) ratio += (new_lnL_rate - cur_lnL_rate); if(tree->eval_glnL == YES) ratio += (new_lnL_geo - cur_lnL_geo); if(tree->eval_tlnL == YES) ratio += (new_lnL_time - cur_lnL_time); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); /* PhyML_Printf("\n. mult: %f new_lnL_seq: %f cur_lnL_seq: %f new_lnL_rate: %f cur_lnL_rate: %f new_lnL_time: %f cur_lnL_time: %f", */ /* mult, */ /* new_lnL_seq,cur_lnL_seq, */ /* new_lnL_rate,cur_lnL_rate, */ /* new_lnL_time,cur_lnL_time); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { TIMES_Reset_Times(tree); RATES_Reset_Rates(tree); #ifdef PHYREX PHYREX_Update_Disk_Times_Given_Nodes(tree); PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif RATES_Update_Normalization_Factor(tree); RATES_Update_Edge_Lengths(tree); tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rate; tree->times->c_lnL = cur_lnL_time; tree->mmod->c_lnL = cur_lnL_geo; } else { tree->mcmc->acc_move[tree->mcmc->num_move_updown_t_br]++; } tree->mcmc->run_move[tree->mcmc->num_move_updown_t_br]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Subtree_Height(t_tree *tree) { phydbl K,mult,u,alpha,ratio; phydbl cur_lnL_seq,new_lnL_seq; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnL_time,new_lnL_time; phydbl floor; int target; int n_nodes; TIMES_Record_Times(tree); K = tree->mcmc->tune_move[tree->mcmc->num_move_subtree_height]; ratio = 0.0; cur_lnL_seq = tree->c_lnL; new_lnL_seq = tree->c_lnL; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = tree->rates->c_lnL; cur_lnL_time = tree->times->c_lnL; new_lnL_time = tree->times->c_lnL; u = Uni(); mult = exp(K*(u-0.5)); RATES_Record_Rates(tree); target = Rand_Int(tree->n_otu,2*tree->n_otu-3); floor = 0.0; if(tree->a_nodes[target] == tree->n_root) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); if(!Scale_Subtree_Height(tree->a_nodes[target],mult,floor,&n_nodes,tree)) { TIMES_Reset_Times(tree); tree->mcmc->run_move[tree->mcmc->num_move_subtree_height]++; return; } if(RATES_Check_Node_Times(tree)) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); if(new_lnL_time > UNLIKELY) { if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); } ratio += (phydbl)(n_nodes)*log(mult); ratio += (new_lnL_seq - cur_lnL_seq); ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnL_time - cur_lnL_time); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { TIMES_Reset_Times(tree); RATES_Reset_Rates(tree); RATES_Update_Edge_Lengths(tree); tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rate; tree->times->c_lnL = cur_lnL_time; } else { #ifdef PHYREX PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif tree->mcmc->acc_move[tree->mcmc->num_move_subtree_height]++; } tree->mcmc->run_move[tree->mcmc->num_move_subtree_height]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Tree_Rates(t_tree *tree) { phydbl K,mult,u,alpha,ratio; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnP_rate,new_lnP_rate; phydbl cur_lnL_seq,new_lnL_seq; int n_nodes; phydbl init_clock; if(tree->eval_alnL == NO) return; if(tree->rates->model_id == STRICTCLOCK) return; RATES_Record_Rates(tree); tree->mcmc->run_move[tree->mcmc->num_move_tree_rates]++; K = tree->mcmc->tune_move[tree->mcmc->num_move_tree_rates]; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnP_rate = tree->rates->c_lnP; new_lnP_rate = UNLIKELY; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; init_clock = tree->rates->clock_r; ratio = 0.0; u = Uni(); mult = exp(K*(u-0.5)); /* Multiply branch rates (or add to log of rates) */ if(!Scale_Subtree_Rates(tree->n_root,mult,&n_nodes,tree)) { RATES_Reset_Rates(tree); return; } if(n_nodes != 2*tree->n_otu-2) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); /* Adjust clock_r */ if(tree->mod->s_opt->opt_clock_r == YES) { tree->rates->clock_r /= mult; if(tree->rates->clock_r < tree->rates->min_clock || tree->rates->clock_r > tree->rates->max_clock) { tree->rates->clock_r = init_clock; RATES_Reset_Rates(tree); return; } } if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) { new_lnL_rate = RATES_Lk(tree); new_lnP_rate = RATES_Prior(tree); } if(tree->mod->s_opt->opt_clock_r == YES) ratio += (n_nodes-1)*log(mult); else ratio += (n_nodes-2)*log(mult); if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) { ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnP_rate - cur_lnP_rate); } ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { tree->rates->clock_r = init_clock; RATES_Reset_Rates(tree); RATES_Update_Edge_Lengths(tree); tree->rates->c_lnL = cur_lnL_rate; tree->rates->c_lnP = cur_lnP_rate; tree->c_lnL = cur_lnL_seq; } else { #if (defined PHYREX) PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif tree->mcmc->acc_move[tree->mcmc->num_move_tree_rates]++; } tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Subtree_Rates(t_tree *tree) { phydbl K,mult,u,alpha,ratio; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnL_seq,new_lnL_seq; int target; int n_nodes; if(tree->rates->model_id == STRICTCLOCK) return; RATES_Record_Rates(tree); Record_Br_Len(tree); K = tree->mcmc->tune_move[tree->mcmc->num_move_subtree_rates]; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = cur_lnL_rate; cur_lnL_seq = tree->c_lnL; new_lnL_seq = cur_lnL_seq; ratio = 0.0; u = Uni(); mult = exp(K*(u-0.5)); /* mult = Rgamma(1./K,K); */ target = Rand_Int(tree->n_otu,2*tree->n_otu-3); /* Multiply branch rates */ if(!Scale_Subtree_Rates(tree->a_nodes[target],mult,&n_nodes,tree)) { RATES_Reset_Rates(tree); tree->mcmc->run_move[tree->mcmc->num_move_subtree_rates]++; return; } if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); /* Proposal ratio: 2n-2=> number of multiplications, 1=>number of divisions */ ratio += (+n_nodes)*log(mult); /* ratio += (n_nodes-2)*log(mult) + log(Dgamma(1./mult,1./K,K)/Dgamma(mult,1./K,K)); */ ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnL_seq - cur_lnL_seq); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { RATES_Reset_Rates(tree); Restore_Br_Len(tree); tree->rates->c_lnL = cur_lnL_rate; tree->c_lnL = cur_lnL_seq; } else { #if (defined PHYREX) PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif tree->mcmc->acc_move[tree->mcmc->num_move_subtree_rates]++; } tree->mcmc->run_move[tree->mcmc->num_move_subtree_rates]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Swing(t_tree *tree) { int i; phydbl K,mult,u,alpha,ratio; phydbl cur_lnL_seq,new_lnL_seq; phydbl cur_lnL_rate,new_lnL_rate; if(tree->rates->model_id == STRICTCLOCK) return; TIMES_Record_Times(tree); RATES_Record_Rates(tree); Record_Br_Len(tree); K = 3.; cur_lnL_seq = tree->c_lnL; new_lnL_seq = cur_lnL_seq; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = cur_lnL_rate; ratio = 0.0; u = Uni(); /* mult = exp(K*(u-0.5)); */ mult = u*(K - 1./K) + 1./K; For(i,2*tree->n_otu-1) { if(tree->a_nodes[i]->tax == NO) { tree->times->nd_t[i] *= mult; } if(tree->times->nd_t[i] > tree->times->t_prior_max[i] || tree->times->nd_t[i] < tree->times->t_prior_min[i]) { TIMES_Reset_Times(tree); Restore_Br_Len(tree); return; } } for(i=0;i<2*tree->n_otu-2;++i) { tree->rates->br_r[i] /= mult; if(tree->rates->br_r[i] > tree->rates->max_rate || tree->rates->br_r[i] < tree->rates->min_rate) { TIMES_Reset_Times(tree); RATES_Reset_Rates(tree); Restore_Br_Len(tree); return; } } RATES_Update_Edge_Lengths(tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); ratio += (-(tree->n_otu-1.)-2.)*log(mult); ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnL_seq - cur_lnL_seq); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { TIMES_Reset_Times(tree); RATES_Reset_Rates(tree); Restore_Br_Len(tree); tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rate; /* printf("\n. Reject %8f",mult); */ } else { #if (defined PHYREX) PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif /* printf("\n. Accept %8f",mult); */ } tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Time_Slice(t_tree *tree) { int i; phydbl K,mult,u,alpha,ratio; phydbl cur_lnL_seq,new_lnL_seq; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnP_rate,new_lnP_rate; phydbl cur_lnL_time,new_lnL_time; phydbl floor; int n_nodes; /*! Check that sequences are isochronous. */ for(i=0;in_otu-1;i++) if(!Are_Equal(tree->times->nd_t[i+1],tree->times->nd_t[i],1.E-10)) return; TIMES_Record_Times(tree); K = tree->mcmc->tune_move[tree->mcmc->num_move_time_slice]; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnP_rate = tree->rates->c_lnP; new_lnP_rate = UNLIKELY; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; ratio = 0.0; u = Uni(); mult = exp(K*(u-0.5)); floor = Uni()*tree->times->nd_t[tree->n_root->num]; Scale_Subtree_Height(tree->n_root,mult,floor,&n_nodes,tree); if(TIMES_Check_Node_Height_Ordering(tree) != NO) { RATES_Update_Edge_Lengths(tree); if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); if(new_lnL_time > UNLIKELY) { if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) { new_lnL_rate = RATES_Lk(tree); new_lnP_rate = RATES_Prior(tree); } } ratio += (phydbl)(n_nodes)*log(mult); if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) { ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnP_rate - cur_lnP_rate); } ratio += (new_lnL_time - cur_lnL_time); /* printf("\n. seq: %f<-%f times: %f<-%f rates: %f<-%f acc.: [%d/%d] k: %f t: %f x: %f", */ /* new_lnL_seq,cur_lnL_seq, */ /* new_lnL_time,cur_lnL_time, */ /* new_lnL_rate,cur_lnL_rate, */ /* tree->mcmc->acc_move[tree->mcmc->num_move_time_slice], */ /* tree->mcmc->run_move[tree->mcmc->num_move_time_slice], */ /* K,floor,mult); */ ratio = exp(ratio); } else { ratio = 0.0; } alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { TIMES_Reset_Times(tree); RATES_Update_Edge_Lengths(tree); tree->times->c_lnL = TIMES_Lk(tree); // Required in order to set t_prior_min/max to their original values tree->c_lnL = cur_lnL_seq; tree->rates->c_lnL = cur_lnL_rate; tree->rates->c_lnP = cur_lnP_rate; if(Are_Equal(tree->times->c_lnL,cur_lnL_time,1.E-3) == NO) { PhyML_Fprintf(stderr,"\n. new_glnL: %f cur_glnL: %f",tree->times->c_lnL,cur_lnL_time); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } else { tree->mcmc->acc_move[tree->mcmc->num_move_time_slice]++; } tree->mcmc->run_move[tree->mcmc->num_move_time_slice]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Print_Param_Stdin(t_mcmc *mcmc, t_tree *tree) { time_t cur_time; time(&cur_time); if(mcmc->run == 1) { PhyML_Printf("\n\n"); PhyML_Printf("%9s","Run"); PhyML_Printf(" %5s","Time"); PhyML_Printf(" %10s","Likelihood"); PhyML_Printf(" %10s","Prior"); PhyML_Printf(" %19s","SubstRate[ ESS ]"); PhyML_Printf(" %17s","TreeHeight[ ESS ]"); if(tree->rates != NULL && (tree->rates->model_id == THORNE || tree->rates->model_id == GUINDON)) PhyML_Printf(" %16s","AutoCor[ ESS ]"); else PhyML_Printf(" %16s","RateVar[ ESS ]"); PhyML_Printf(" %15s","BirthR[ ESS ]"); PhyML_Printf(" %8s","MinESS"); } if((cur_time - mcmc->t_last_print) > mcmc->print_every) { mcmc->t_last_print = cur_time; PhyML_Printf("\n"); PhyML_Printf("%9d",tree->mcmc->run); PhyML_Printf(" %5d",(int)(cur_time-mcmc->t_beg)); PhyML_Printf(" %10.2f",tree->c_lnL); PhyML_Printf(" %10.2f",(tree->rates ? tree->rates->c_lnL+tree->times->c_lnL : +1)); #if (defined PHYREX || PHYTIME) PhyML_Printf(" %12.6f[%5.0f]",RATES_Average_Substitution_Rate(tree),tree->mcmc->ess[tree->mcmc->num_move_clock_r]); #endif /* PhyML_Printf("\t%12.6f[%5.0f]",tree->rates->clock_r,tree->mcmc->ess[tree->mcmc->num_move_clock_r]); */ PhyML_Printf(" %9f[%5.0f]", (tree->rates ? tree->rates->nu : -1.), tree->mcmc->ess[tree->mcmc->num_move_nu]); PhyML_Printf(" %8f[%5.0f]", (tree->rates ? tree->times->birth_rate : -1.), tree->mcmc->ess[tree->mcmc->num_move_birth_rate]); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Print_Param(t_mcmc *mcmc, t_tree *tree) { int i; FILE *fp; int orig_approx; phydbl orig_lnL; char *s; if(tree->mcmc->run > mcmc->chain_len) return; s = (char *)mCalloc(100,sizeof(char)); fp = mcmc->out_fp_stats; if(!(mcmc->run%mcmc->sample_interval)) { MCMC_Copy_To_New_Param_Val(tree->mcmc,tree); for(i=0;imcmc->n_moves;i++) { if((tree->mcmc->acc_rate[i] > .1) && (tree->mcmc->start_ess[i] == NO)) tree->mcmc->start_ess[i] = YES; if(tree->mcmc->start_ess[i] == YES) MCMC_Update_Effective_Sample_Size(i,tree->mcmc,tree); if(tree->mcmc->run > (int) tree->mcmc->chain_len * 0.1) tree->mcmc->adjust_tuning[i] = NO; } if(tree->mcmc->run == 0) { time(&(mcmc->t_beg)); time(&(mcmc->t_last_print)); PhyML_Fprintf(fp,"# Random seed: %d",tree->io->r_seed); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"Run\t"); /* PhyML_Fprintf(fp,"Time\t"); */ /* PhyML_Fprintf(fp,"MeanRate\t"); */ /* PhyML_Fprintf(fp,"NormFact\t"); */ /* for(i=0;in_moves;i++) */ /* { */ /* strcpy(s,"Acc."); */ /* PhyML_Fprintf(fp,"%s%d\t",strcat(s,mcmc->move_name[i]),i); */ /* } */ /* for(i=0;in_moves;i++) */ /* { */ /* strcpy(s,"Tune."); */ /* PhyML_Fprintf(fp,"%s%d\t",strcat(s,mcmc->move_name[i]),i); */ /* } */ /* for(i=0;in_moves;i++) */ /* { */ /* strcpy(s,"Run."); */ /* PhyML_Fprintf(fp,"%s\t",strcat(s,mcmc->move_name[i])); */ /* } */ PhyML_Fprintf(fp,"LnLike[Exact]\t"); PhyML_Fprintf(fp,"LnLike[Approx]\t"); PhyML_Fprintf(fp,"LnRates\t"); PhyML_Fprintf(fp,"LnTimes\t"); PhyML_Fprintf(fp,"LnPosterior\t"); PhyML_Fprintf(fp,"ClockRate\t"); #if (defined PHYREX || PHYTIME) PhyML_Fprintf(fp,"EvolRate\t"); #endif PhyML_Fprintf(fp,"Nu\t"); PhyML_Fprintf(fp,"BirthRate\t"); PhyML_Fprintf(fp,"TsTv\t"); if(tree->mod->ras->n_catg > 1) { if(tree->mod->ras->free_mixt_rates == NO) PhyML_Fprintf(fp,"Alpha\t"); else { for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp,"p%d\t",i); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp,"r%d\t",i); } } if(tree->mod->m4mod->n_h > 1 && tree->mod->use_m4mod == YES) { for(i=0;imod->m4mod->n_h;i++) PhyML_Fprintf(fp,"cov_p%d\t",i); for(i=0;imod->m4mod->n_h;i++) PhyML_Fprintf(fp,"cov_r%d\t",i); PhyML_Fprintf(fp,"cov_switch\t"); } if(fp != stdout) { for(i=tree->n_otu;i<2*tree->n_otu-1;i++) { if(tree->a_nodes[i] == tree->n_root->v[2]) PhyML_Fprintf(fp,"T%d%s\t",i,"[LeftRoot]"); else if(tree->a_nodes[i] == tree->n_root->v[1]) PhyML_Fprintf(fp,"T%d%s\t",i,"[RightRoot]"); else if(tree->a_nodes[i] == tree->n_root) PhyML_Fprintf(fp,"T%d%s\t",i,"[Root]"); else PhyML_Fprintf(fp,"T%d[%d]\t",i,tree->a_nodes[i]->anc->num); } } /* if(fp != stdout) */ /* { */ /* For(i,2*tree->n_otu-1) */ /* { */ /* if(tree->a_nodes[i] == tree->n_root->v[2]) */ /* PhyML_Fprintf(fp,"R%d[LeftRoot]\t",i); */ /* else if(tree->a_nodes[i] == tree->n_root->v[1]) */ /* PhyML_Fprintf(fp,"R%d[RightRoot]\t",i); */ /* else if(tree->a_nodes[i] != tree->n_root) */ /* PhyML_Fprintf(fp," R%d[%d]\t",i,tree->a_nodes[i]->anc->num); */ /* else */ /* PhyML_Fprintf(fp," R%d[Root]\t",i); */ /* /\* PhyML_Fprintf(fp," R%d[%f]\t",i,tree->rates->mean_l[i]); *\/ */ /* } */ /* } */ if(fp != stdout) { For(i,2*tree->n_otu-2) { if(tree->a_nodes[i] == tree->n_root->v[2]) PhyML_Fprintf(fp,"B%d[LeftRoot]\t",i); else if(tree->a_nodes[i] == tree->n_root->v[1]) PhyML_Fprintf(fp,"B%d[RightRoot]\t",i); else PhyML_Fprintf(fp," B%d[%d]\t",i,tree->a_nodes[i]->anc->num); /* PhyML_Fprintf(fp," R%d[%f]\t",i,tree->rates->mean_l[i]); */ } } /* if(fp != stdout) */ /* { */ /* For(i,2*tree->n_otu-2) */ /* { */ /* if(tree->a_nodes[i] == tree->n_root->v[2]) */ /* PhyML_Fprintf(fp,"G%d[LeftRoot]\t",i); */ /* else if(tree->a_nodes[i] == tree->n_root->v[1]) */ /* PhyML_Fprintf(fp,"G%d[RightRoot]\t",i); */ /* else */ /* PhyML_Fprintf(fp," G%d[%f]\t",i,tree->rates->ml_l[i]); */ /* /\* PhyML_Fprintf(fp," R%d[%f]\t",i,tree->rates->mean_l[i]); *\/ */ /* } */ /* } */ /* if(fp != stdout) */ /* { */ /* For(i,2*tree->n_otu-3) */ /* { */ /* if(tree->a_edges[i] == tree->e_root) */ /* PhyML_Fprintf(fp,"*L[%f]%d\t",i,tree->rates->u_ml_l[i]); */ /* else */ /* PhyML_Fprintf(fp," L[%f]%d\t",i,tree->rates->u_ml_l[i]); */ /* } */ /* } */ PhyML_Fprintf(mcmc->out_fp_trees,"#NEXUS\n"); PhyML_Fprintf(mcmc->out_fp_trees,"BEGIN TREES;\n"); PhyML_Fprintf(mcmc->out_fp_trees,"\tTRANSLATE\n"); for(i=0;in_otu-1;i++) PhyML_Fprintf(mcmc->out_fp_trees,"\t%3d\t%s,\n",tree->a_nodes[i]->num+1,tree->a_nodes[i]->name); PhyML_Fprintf(mcmc->out_fp_trees,"\t%3d\t%s;\n",tree->a_nodes[i]->num+1,tree->a_nodes[i]->name); tree->write_tax_names = NO; } PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"%6d\t",tree->mcmc->run); /* time(&mcmc->t_cur); */ /* PhyML_Fprintf(fp,"%6d\t",(int)(mcmc->t_cur-mcmc->t_beg)); */ /* RATES_Update_Edge_Lengths(tree); */ /* PhyML_Fprintf(fp,"%f\t",RATES_Check_Mean_Rates(tree)); */ /* PhyML_Fprintf(fp,"%f\t",tree->rates->norm_fact); */ /* for(i=0;imcmc->n_moves;i++) PhyML_Fprintf(fp,"%f\t",tree->mcmc->acc_rate[i]); */ /* for(i=0;imcmc->n_moves;i++) PhyML_Fprintf(fp,"%f\t",(phydbl)(tree->mcmc->tune_move[i])); */ /* for(i=0;imcmc->n_moves;i++) PhyML_Fprintf(fp,"%d\t",(int)(tree->mcmc->run_move[i])); */ orig_approx = tree->io->lk_approx; orig_lnL = tree->c_lnL; tree->io->lk_approx = EXACT; if(tree->eval_alnL == YES) Lk(NULL,tree); PhyML_Fprintf(fp,"%.1f\t",tree->c_lnL); tree->io->lk_approx = NORMAL; tree->c_lnL = 0.0; if(tree->eval_alnL == YES) Lk(NULL,tree); PhyML_Fprintf(fp,"%.1f\t",tree->c_lnL); tree->io->lk_approx = orig_approx; tree->c_lnL = orig_lnL; /* PhyML_Fprintf(fp,"0\t0\t"); */ PhyML_Fprintf(fp,"%G\t",tree->rates->c_lnL); PhyML_Fprintf(fp,"%G\t",tree->times->c_lnL); PhyML_Fprintf(fp,"%G\t",tree->c_lnL+tree->rates->c_lnL+tree->times->c_lnL); PhyML_Fprintf(fp,"%G\t",tree->rates->clock_r); #if (defined PHYREX || PHYTIME) PhyML_Fprintf(fp,"%G\t",RATES_Average_Substitution_Rate(tree)); #endif PhyML_Fprintf(fp,"%G\t",tree->rates->nu); PhyML_Fprintf(fp,"%G\t",tree->times->birth_rate); PhyML_Fprintf(fp,"%G\t",tree->mod->kappa->v); if(tree->mod->ras->n_catg > 1) { if(tree->mod->ras->free_mixt_rates == NO) PhyML_Fprintf(fp,"%G\t",tree->mod->ras->alpha->v); else { for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp,"%G\t",tree->mod->ras->gamma_r_proba->v[i]); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp,"%G\t",tree->mod->ras->gamma_rr->v[i]); /* for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp,"%G\t",tree->mod->ras->gamma_r_proba_unscaled[i]); */ /* for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp,"%G\t",tree->mod->ras->gamma_rr_unscaled[i]); */ } } if(tree->mod->m4mod->n_h > 1 && tree->mod->use_m4mod == YES) { for(i=0;imod->m4mod->n_h;i++) PhyML_Fprintf(fp,"%G\t",tree->mod->m4mod->h_fq[i]); for(i=0;imod->m4mod->n_h;i++) PhyML_Fprintf(fp,"%G\t",tree->mod->m4mod->multipl[i]); PhyML_Fprintf(fp,"%G\t",tree->mod->m4mod->delta); } char *format = (char *)mCalloc(100,sizeof(char)); sprintf(format,"%%.%df\t",tree->mcmc->nd_t_digits); for(i=tree->n_otu;i<2*tree->n_otu-1;i++) PhyML_Fprintf(fp,format,tree->times->nd_t[i]); Free(format); /* for(i=0;i<2*tree->n_otu-1;i++) PhyML_Fprintf(fp,"%.4f\t",log(tree->rates->nd_r[i])); */ // Average rate along edges: length divided by elapsed time for(i=0;i<2*tree->n_otu-2;++i) PhyML_Fprintf(fp,"%.4f\t", tree->rates->cur_l[i]/(tree->times->nd_t[tree->a_nodes[i]->num] - tree->times->nd_t[tree->a_nodes[i]->anc->num])); /* fp_pred = fopen("predict.txt","a"); */ /* for(i=0;i<2*tree->n_otu-2;i++) */ /* PhyML_Fprintf(fp_pred,"B%d\t%12f\t%12f\t%4d\n",i,exp(tree->rates->br_r[i]),tree->times->nd_t[i],tree->times->has_survived[i]); */ /* fclose(fp_pred); */ /* phydbl p,sd,mean; */ /* for(i=0;i<2*tree->n_otu-2;i++) */ /* { */ /* sd = tree->rates->nu * (tree->times->nd_t[i] - tree->times->nd_t[tree->a_nodes[i]->anc->num]); */ /* mean = tree->rates->br_r[tree->a_nodes[i]->anc->num] - .5*sd*sd; */ /* p = Pnorm(tree->rates->br_r[i],mean,sd); */ /* PhyML_Fprintf(fp,"%f\t",p); */ /* tree->rates->mean_r[i] += p; */ /* } */ /* for(i=0;i<2*tree->n_otu-2;i++) PhyML_Fprintf(fp,"%.4f\t",tree->rates->cur_gamma_prior_mean[i]); */ /* if(fp != stdout) for(i=tree->n_otu;i<2*tree->n_otu-1;i++) PhyML_Fprintf(fp,"%G\t",tree->times->t_prior[i]); */ /* For(i,2*tree->n_otu-3) PhyML_Fprintf(fp,"%f\t",exp(tree->a_edges[i]->l->v)); */ /* RATES_Update_Edge_Lengths(tree); */ /* For(i,2*tree->n_otu-3) PhyML_Fprintf(fp,"%f\t",tree->a_edges[i]->l->v); */ for(i=0;i<2*tree->n_otu-2;++i) tree->rates->mean_r[i] = exp(tree->rates->br_r[i]); for(i=0;i<2*tree->n_otu-1;++i) tree->times->mean_t[i] = tree->times->nd_t[i]; /* Time_To_Branch(tree); */ /* char *s; */ /* s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); */ /* strcpy(s,mcmc->io->in_align_file); */ /* strcat(s,"_"); */ /* strcat(s,mcmc->out_filename); */ /* strcat(s,".ps"); */ /* DR_Draw_Tree(s,tree); */ /* Free(s); */ /* FILE *fp; */ /* int j; */ /* t_node *d, *v1, *v2; */ /* int n1, n2; */ /* phydbl r1, r2; */ /* s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); */ /* strcpy(s,mcmc->io->in_align_file); */ /* strcat(s,"_"); */ /* strcat(s,mcmc->out_filename); */ /* strcat(s,".corr"); */ /* fp = fopen(s,"w"); */ /* n1 = n2 = 0; */ /* r1 = r2 = 0.f; */ /* For(i,2*tree->n_otu-3) */ /* { */ /* if(tree->a_nodes[i]->tax == NO) */ /* { */ /* d = tree->a_nodes[i]; */ /* v1 = v2 = NULL; */ /* for(j=0;j<3;j++) */ /* { */ /* if(d->v[j] != d->anc && d->b[j] != tree->e_root) */ /* { */ /* if(!v1) v1 = d->v[j]; */ /* else v2 = d->v[j]; */ /* } */ /* } */ /* for(j=0;j<3;j++) */ /* { */ /* if(v1->v[j] && v1->v[j] == d) */ /* { */ /* n1 = v1->bip_size[j]; */ /* /\* r1 = RATES_Get_Mean_Rate_In_Subtree(v1,tree); *\/ */ /* r1 = exp(tree->rates->br_r[v1->num]); */ /* break; */ /* } */ /* } */ /* for(j=0;j<3;j++) */ /* { */ /* if(v2->v[j] && v2->v[j] == d) */ /* { */ /* n2 = v2->bip_size[j]; */ /* /\* r2 = RATES_Get_Mean_Rate_In_Subtree(v2,tree); *\/ */ /* r2 = exp(tree->rates->br_r[v2->num]); */ /* break; */ /* } */ /* } */ /* fprintf(fp,"\n%4d %4d %15f %15f",n1,n2,r1,r2); */ /* } */ /* } */ /* fclose(fp); */ // TREES #if (defined PHYREX || PHYTIME) TIMES_Time_To_Bl(tree); tree->bl_ndigits = 3; char *s_tree = Write_Tree(tree); tree->bl_ndigits = 7; PhyML_Fprintf(mcmc->out_fp_trees,"TREE %8d [%f] = [&R] %s\n",mcmc->run,tree->c_lnL,s_tree); Free(s_tree); #endif } if(tree->mcmc->run == mcmc->chain_len) PhyML_Fprintf(mcmc->out_fp_trees,"END;\n"); fflush(NULL); Free(s); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Print_Means(t_mcmc *mcmc, t_tree *tree) { if(!(mcmc->run%mcmc->sample_interval)) { int i; char *s; s = (char *)mCalloc(T_MAX_FILE,sizeof(char)); strcpy(s,tree->mcmc->out_filename); strcat(s,".means"); fclose(mcmc->out_fp_means); mcmc->out_fp_means = fopen(s,"w"); PhyML_Fprintf(mcmc->out_fp_means,"#"); for(i=tree->n_otu;i<2*tree->n_otu-1;i++) PhyML_Fprintf(mcmc->out_fp_means,"T%d\t",i); PhyML_Fprintf(mcmc->out_fp_means,"\n"); for(i=tree->n_otu;i<2*tree->n_otu-1;i++) tree->times->t_mean[i] *= (phydbl)(mcmc->run / mcmc->sample_interval); for(i=tree->n_otu;i<2*tree->n_otu-1;i++) { tree->times->t_mean[i] += tree->times->nd_t[i]; tree->times->t_mean[i] /= (phydbl)(mcmc->run / mcmc->sample_interval + 1); /* PhyML_Fprintf(tree->mcmc->out_fp_means,"%d\t",tree->mcmc->run / tree->mcmc->sample_interval); */ PhyML_Fprintf(tree->mcmc->out_fp_means,"%.1f\t",tree->times->t_mean[i]); } PhyML_Fprintf(tree->mcmc->out_fp_means,"\n"); fflush(NULL); Free(s); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Print_Last(t_mcmc *mcmc, t_tree *tree) { if(!(mcmc->run%mcmc->sample_interval)) { int i; char *s; s = (char *)mCalloc(T_MAX_FILE,sizeof(char)); strcpy(s,tree->mcmc->out_filename); strcat(s,".lasts"); fclose(mcmc->out_fp_last); mcmc->out_fp_last = fopen(s,"w"); /* rewind(mcmc->out_fp_last); */ PhyML_Fprintf(mcmc->out_fp_last,"#"); PhyML_Fprintf(tree->mcmc->out_fp_last,"Time\t"); for(i=tree->n_otu;i<2*tree->n_otu-1;i++) PhyML_Fprintf(tree->mcmc->out_fp_last,"T%d\t",i); PhyML_Fprintf(tree->mcmc->out_fp_last,"\n"); if(mcmc->run) { time(&(mcmc->t_cur)); PhyML_Fprintf(tree->mcmc->out_fp_last,"%d\t",(int)(mcmc->t_cur-mcmc->t_beg)); /* PhyML_Fprintf(tree->mcmc->out_fp_last,"%d\t",(int)(mcmc->t_beg)); */ } for(i=tree->n_otu;i<2*tree->n_otu-1;i++) PhyML_Fprintf(tree->mcmc->out_fp_last,"%.1f\t",tree->times->nd_t[i]); PhyML_Fprintf(tree->mcmc->out_fp_last,"\n"); fflush(NULL); Free(s); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Pause(t_mcmc *mcmc) { char choice; char *s; int len; s = (char *)mCalloc(100,sizeof(char)); if(!(mcmc->run%mcmc->chain_len) && (mcmc->is_burnin == NO)) { PhyML_Printf("\n. Do you wish to stop the analysis [N/y] "); if(!scanf("%c",&choice)) Exit("\n"); if(choice == '\n') choice = 'N'; else getchar(); /* \n */ Uppercase(&choice); switch(choice) { case 'N': { len = 1E+4; PhyML_Printf("\n. How many extra generations is required [default: 1E+4] "); Getstring_Stdin(s); if(s[0] == '\0') len = 1E+4; else len = (int)atof(s); if(len < 0) { PhyML_Fprintf(stderr,"\n. The value entered must be an integer greater than 0.\n"); Exit("\n"); } mcmc->chain_len += len; break; } case 'Y': { PhyML_Printf("\n. Ok. Done.\n"); Exit("\n"); break; } default: { PhyML_Printf("\n. Please enter 'Y' or 'N'.\n"); Exit("\n"); } } } Free(s); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Terminate(int signum) { char choice; PhyML_Printf("\n\n. Caught signal %d...",signum); PhyML_Printf("\n\n. Do you really want to terminate [Y/n]: "); if(!scanf("%c",&choice)) Exit("\n"); if(choice == '\n') choice = 'Y'; else getchar(); /* \n */ Uppercase(&choice); if(choice == 'Y') raise(SIGTERM); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Copy_MCMC_Struct(t_mcmc *ori, t_mcmc *cpy, char *filename) { int pid; int i; cpy->sample_interval = ori->sample_interval ; cpy->chain_len = ori->chain_len ; cpy->randomize = ori->randomize ; cpy->norm_freq = ori->norm_freq ; cpy->n_moves = ori->n_moves ; cpy->max_tune = ori->max_tune ; cpy->min_tune = ori->min_tune ; cpy->print_every = ori->print_every ; cpy->is_burnin = ori->is_burnin ; cpy->is = ori->is ; cpy->io = ori->io ; cpy->in_fp_par = ori->in_fp_par ; cpy->nd_t_digits = ori->nd_t_digits ; cpy->max_lag = ori->max_lag ; cpy->move_idx = ori->move_idx ; for(i=0;in_moves;i++) { cpy->start_ess[i] = ori->start_ess[i]; cpy->ess_run[i] = ori->ess_run[i]; cpy->ess[i] = ori->ess[i]; cpy->move_weight[i] = ori->move_weight[i]; cpy->run_move[i] = ori->run_move[i]; cpy->acc_move[i] = ori->acc_move[i]; cpy->prev_run_move[i] = ori->prev_run_move[i]; cpy->prev_acc_move[i] = ori->prev_acc_move[i]; cpy->acc_rate[i] = ori->acc_rate[i]; cpy->tune_move[i] = ori->tune_move[i]; strcpy(cpy->move_name[i],ori->move_name[i]); cpy->adjust_tuning[i] = ori->adjust_tuning[i]; } if(filename) { char *s; s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); strcpy(cpy->out_filename,filename); pid = getpid(); sprintf(cpy->out_filename+strlen(cpy->out_filename),"_%d",pid); strcpy(s,cpy->io->in_align_file); strcat(s,"_"); strcat(s,cpy->out_filename); strcat(s,"_stats"); cpy->out_fp_stats = fopen(s,"w"); strcpy(s,cpy->io->in_align_file); strcat(s,"_"); strcat(s,cpy->out_filename); strcat(s,"_trees"); cpy->out_fp_trees = fopen(s,"w"); strcpy(s,cpy->io->in_align_file); strcat(s,"_"); strcat(s,cpy->out_filename); strcat(s,"_constree"); cpy->out_fp_constree = fopen(s,"w"); Free(s); } else { cpy->out_fp_stats = stderr; cpy->out_fp_trees = stderr; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Close_MCMC(t_mcmc *mcmc) { fclose(mcmc->out_fp_trees); fclose(mcmc->out_fp_stats); fclose(mcmc->out_fp_constree); /* fclose(mcmc->out_fp_means); */ /* fclose(mcmc->out_fp_last); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Randomize_Contmod(t_tree *tree) { if(tree->contmod == NULL) return; if(tree->contmod->obs_model == NO || tree->contmod->obs_model_est == NO) return; for(int i=0;immod->n_dim;++i) tree->contmod->obs_var[i] = Uni()*2.; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Randomize_Locations(t_tree *tree) { int i; if(tree->mmod == NULL) return; MCMC_Randomize_Locations_Pre(tree->n_root,tree->n_root->v[1],tree); MCMC_Randomize_Locations_Pre(tree->n_root,tree->n_root->v[2],tree); for(i=0;immod->n_dim;++i) { tree->n_root->ldsk->coord->lonlat[i] = Rnorm(0.5*(tree->n_root->v[1]->ldsk->coord->lonlat[i] + tree->n_root->v[2]->ldsk->coord->lonlat[i]), 0.01*(tree->n_root->v[1]->ldsk->coord->lonlat[i] + tree->n_root->v[2]->ldsk->coord->lonlat[i])); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Randomize_Locations_Pre(t_node *a, t_node *d, t_tree *tree) { if(d->tax == YES) return; else { int i; t_node *v1, *v2; v1 = v2 = NULL; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { MCMC_Randomize_Locations_Pre(d,d->v[i],tree); if(v1 == NULL) v1 = d->v[i]; else v2 = d->v[i]; } } for(i=0;immod->n_dim;++i) { d->ldsk->coord->lonlat[i] = Rnorm(0.5*(v1->ldsk->coord->lonlat[i] + v2->ldsk->coord->lonlat[i]), 0.01*(v1->ldsk->coord->lonlat[i] + v2->ldsk->coord->lonlat[i])); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Randomize_Kappa(t_tree *tree) { tree->mod->kappa->v = Uni()*5.; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Randomize_Rate_Across_Sites(t_tree *tree) { if(tree->mod->ras->n_catg == 1) return; if(tree->mod->ras->free_mixt_rates == YES) { int i; for(i=0;imod->ras->n_catg-1;i++) tree->mod->ras->gamma_r_proba_unscaled->v[i] = Uni(); tree->mod->ras->gamma_r_proba_unscaled->v[tree->mod->ras->n_catg-1] = 1.; for(i=0;imod->ras->n_catg-1;i++) tree->mod->ras->gamma_rr_unscaled->v[i] = (phydbl)i+0.1; /* Do not randomize those as their ordering matter */ tree->mod->ras->gamma_rr_unscaled->v[tree->mod->ras->n_catg-1] = (phydbl)tree->mod->ras->n_catg; } else { tree->mod->ras->alpha->v = Uni()*5.; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Randomize_Covarion_Rates(t_tree *tree) { if(tree->mod->use_m4mod == NO) return; if(tree->mod->m4mod->n_h == 1) return; int i; for(i=0;imod->m4mod->n_h;i++) { tree->mod->m4mod->multipl_unscaled->v[i] = (phydbl)i+1.; tree->mod->m4mod->h_fq_unscaled->v[i] = Uni()*(100.-0.01) + 0.01; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Randomize_Covarion_Switch(t_tree *tree) { if(tree->mod->use_m4mod == NO) return; tree->mod->m4mod->delta->v = Uni()*(10.-0.01)+0.01; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Randomize_Branch_Lengths(t_tree *tree) { int i; if(tree->mod->log_l == NO) For(i,2*tree->n_otu-3) tree->a_edges[i]->l->v = Rexp(10.); else For(i,2*tree->n_otu-3) tree->a_edges[i]->l->v = -4* Uni(); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Randomize_Node_Rates(t_tree *tree) { int i,err; phydbl mean_r, var_r; phydbl min_r, max_r; mean_r = 1.0; var_r = 0.5; min_r = tree->rates->min_rate; max_r = tree->rates->max_rate; for(i=0;i<2*tree->n_otu-2;++i) if(tree->a_nodes[i] != tree->n_root) { tree->rates->nd_r[i] = Rnorm_Trunc(mean_r,SQRT(var_r),min_r,max_r,&err); if(err == YES) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Rates(t_tree *tree) { /* Should be called once t_node times have been determined */ int i; for(i=0;i<2*tree->n_otu-2;++i) tree->rates->br_r[i] = 1.0; if(tree->rates->model_id == STRICTCLOCK) return; i = 0; do { MCMC_Randomize_Rates_Pre(tree->n_root,tree->n_root->v[2],tree); MCMC_Randomize_Rates_Pre(tree->n_root,tree->n_root->v[1],tree); RATES_Lk(tree); ++i; if(i > 1000) assert(false); } while(tree->rates->c_lnL < UNLIKELY + 1.); #if (defined PHYREX) PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Rates_Pre(t_node *a, t_node *d, t_tree *tree) { int i; phydbl min_r, max_r; int err; min_r = tree->rates->min_rate; max_r = tree->rates->max_rate; err = -1; /* tree->rates->br_r[d->num] = Rnorm_Trunc(1.0,tree->rates->nu,min_r,max_r,&err); */ tree->rates->br_r[d->num] = Rnorm_Trunc(1.0,2.0,min_r,max_r,&err); if(err == YES) assert(false); if(d->tax) return; else { for(i=0;i<3;++i) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) MCMC_Randomize_Rates_Pre(d,d->v[i],tree); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX) void MCMC_Randomize_Sigsq_Scale(t_tree *tree) { int i; if(tree->mmod->model_id == RRW_GAMMA || tree->mmod->model_id == RRW_LOGNORMAL || tree->mmod->model_id == RIBM || tree->mmod->model_id == RIWNc || tree->mmod->model_id == RIWNu) { phydbl sd; sd = 0.1; for(i=0;i<2*tree->n_otu-2;++i) { do { tree->mmod->sigsq_scale[tree->a_nodes[i]->num] = Rgamma(1./sd,sd); } while(tree->mmod->sigsq_scale[tree->a_nodes[i]->num] < tree->mmod->sigsq_scale_min || tree->mmod->sigsq_scale[tree->a_nodes[i]->num] > tree->mmod->sigsq_scale_max); } } if(tree->mmod->model_id == IBM || tree->mmod->model_id == IWNc || tree->mmod->model_id == IWNu || tree->mmod->model_id == IOU) for(i=0;i<2*tree->n_otu-2;++i) tree->mmod->sigsq_scale[tree->a_nodes[i]->num] = 1.; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX) void MCMC_Randomize_Sigsq(t_tree *tree) { int i; for(i=0;immod->n_dim;++i) { switch(tree->mmod->rw_prior_distrib) { case EXPONENTIAL_PRIOR: { tree->mmod->sigsq[i] = Rexp(1./tree->mmod->rw_prior_mean); break; } case NORMAL_PRIOR: { tree->mmod->sigsq[i] = Rnorm(tree->mmod->rw_prior_mean, tree->mmod->rw_prior_sd); break; } case FLAT_PRIOR: { tree->mmod->sigsq[i] = 1.E-0; break; } default : assert(false); } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX) void MCMC_Randomize_Veloc(t_tree *tree) { int j; phydbl mean, var; if(VELOC_Is_Integrated_Velocity(tree->mmod) == YES) { /* for(i=0;i<2*tree->n_otu-1;++i) */ /* { */ /* for(j=0;jmmod->n_dim;++j) */ /* { */ /* tree->a_nodes[i]->ldsk->veloc->deriv[j] = Uni()*2.-1; */ /* assert(tree->a_nodes[i]->ldsk->veloc->deriv[j] > tree->mmod->min_veloc); */ /* assert(tree->a_nodes[i]->ldsk->veloc->deriv[j] < tree->mmod->max_veloc); */ /* } */ /* } */ for(j=0;jmmod->n_dim;++j) { mean = tree->mmod->rw_root_mean[VELOCITY]; // var = tree->mmod->rw_root_var[VELOCITY]; var = 0.1; tree->n_root->ldsk->veloc->deriv[j] = Rnorm(mean,sqrt(var)); // tree->n_root->ldsk->veloc->deriv[j] = 0.0; // Using a large initial root velocity -> PhyREX cannot sample root velocity properly assert(tree->n_root->ldsk->veloc->deriv[j] > tree->mmod->min_veloc); assert(tree->n_root->ldsk->veloc->deriv[j] < tree->mmod->max_veloc); } MCMC_Randomize_Veloc_Pre(tree->n_root,tree->n_root->v[1],tree); MCMC_Randomize_Veloc_Pre(tree->n_root,tree->n_root->v[2],tree); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX) void MCMC_Randomize_Veloc_Pre(t_node *a, t_node *d, t_tree *tree) { int i,j; phydbl mean, var; for(j=0;jmmod->n_dim;++j) { mean = VELOC_Velocity_Mean_Along_Edge(d,j,tree); var = VELOC_Velocity_Variance_Along_Edge(d,j,tree); d->ldsk->veloc->deriv[j] = Rnorm(mean,sqrt(var)); if(d->ldsk->veloc->deriv[j] < tree->mmod->min_veloc) d->ldsk->veloc->deriv[j] = tree->mmod->min_veloc; if(d->ldsk->veloc->deriv[j] > tree->mmod->max_veloc) d->ldsk->veloc->deriv[j] = tree->mmod->max_veloc; } if(d->tax) return; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { MCMC_Randomize_Veloc_Pre(d,d->v[i],tree); } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Birth(t_tree *tree) { phydbl min_b,max_b; phydbl u; min_b = tree->times->birth_rate_min; max_b = MIN(0.5,tree->times->birth_rate_max); u = Uni(); tree->times->birth_rate = (max_b - min_b) * u + min_b; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Death(t_tree *tree) { phydbl min_d,max_d; phydbl u; min_d = tree->times->death_rate_min; max_d = MIN(MIN(0.5,tree->times->death_rate_min),tree->times->birth_rate); u = Uni(); tree->times->death_rate = (max_d - min_d) * u + min_d; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Nu(t_tree *tree) { phydbl min_nu,max_nu; phydbl u; /* It is preferable to start with small values of nu as if is difficult for the MCMC sampler to sample equal rates on edge (i.e., molecular clock) since such combination of rate lies on the boundary of the space of all edge rate combination. We give here a bit of help to the sampler by considering starting points close to the molecular clock constraint. */ min_nu = tree->rates->min_nu; max_nu = tree->rates->max_nu/10.; u = Uni(); tree->rates->nu = (max_nu - min_nu) * u + min_nu; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Clock_Rate(t_tree *tree) { phydbl mean,sd; int iter; if(tree->mod->s_opt->opt_clock_r == YES && tree->rates->init_clock_r == NO) { mean = tree->rates->clock_r_prior_mean; sd = sqrt(tree->rates->clock_r_prior_var); iter = 0; do { tree->rates->clock_r = Rnorm(mean,sd); iter++; if(iter > 1000) { PhyML_Fprintf(stderr,"\n. Could not initialize clock rate properly."); assert(false); } } while(tree->rates->clock_r < tree->rates->min_clock || tree->rates->clock_r > tree->rates->max_clock); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Alpha(t_tree *tree) { phydbl u; u = Uni(); tree->rates->alpha = u*6.0+1.0; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Node_Times(t_tree *tree) { phydbl t_sup, t_inf; phydbl u; int iter; int i; phydbl dt,min_dt; int min_node; if(tree->mod->s_opt->opt_node_ages == NO) return; t_inf = tree->times->t_prior_min[tree->n_root->num]; t_sup = tree->times->t_prior_max[tree->n_root->num]; u = Uni(); u *= (t_sup - t_inf); u += t_inf; tree->times->nd_t[tree->n_root->num] = u; MCMC_Randomize_Node_Times_Top_Down(tree->n_root,tree->n_root->v[2],tree); MCMC_Randomize_Node_Times_Top_Down(tree->n_root,tree->n_root->v[1],tree); min_node = -1; iter = 0; do { min_dt = MDBL_MAX; For(i,2*tree->n_otu-2) { dt = tree->times->nd_t[i] - tree->times->nd_t[tree->a_nodes[i]->anc->num]; if(dt < min_dt) { min_dt = dt; min_node = i; } } if(min_dt > 0.01 * FABS(tree->times->nd_t[tree->n_root->num])/(phydbl)(tree->n_otu-1)) break; TIMES_Record_Times(tree); For(i,2*tree->n_otu-1) { if(tree->a_nodes[i]->tax == NO) tree->times->nd_t[i] -= 0.1*FABS(tree->times->nd_t[tree->n_root->num])/(phydbl)(tree->n_otu-1); if(tree->times->nd_t[i] < tree->times->t_prior_min[i] || tree->times->nd_t[i] > tree->times->t_prior_max[i]) { TIMES_Reset_Times(tree); break; } } MCMC_Randomize_Node_Times_Bottom_Up(tree->n_root,tree->n_root->v[2],tree); MCMC_Randomize_Node_Times_Bottom_Up(tree->n_root,tree->n_root->v[1],tree); iter++; } while(iter < 1000); if(iter == 1000) { PhyML_Fprintf(stderr,"\n. min_dt = %f",min_dt); PhyML_Fprintf(stderr,"\n. min->t=%f min->anc->t=%f",tree->times->nd_t[min_node],tree->times->nd_t[tree->a_nodes[min_node]->anc->num]); PhyML_Fprintf(stderr,"\n. d up=%f down=%f",tree->times->t_prior_min[min_node],tree->times->t_prior_max[min_node]); PhyML_Fprintf(stderr,"\n. a up=%f down=%f",tree->times->t_prior_min[tree->a_nodes[min_node]->anc->num],tree->times->t_prior_max[tree->a_nodes[min_node]->anc->num]); PhyML_Fprintf(stderr,"\n. up=%f down=%f",tree->times->t_prior_min[min_node],tree->times->t_floor[tree->a_nodes[min_node]->anc->num]); PhyML_Fprintf(stderr,"\n. min_node = %d",min_node); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } /* PhyML_Printf("\n. Needed %d iterations to randomize node heights.",iter); */ /* TIMES_Print_Node_Times(tree->n_root,tree->n_root->v[2],tree); */ /* TIMES_Print_Node_Times(tree->n_root,tree->n_root->v[1],tree); */ if(RATES_Check_Node_Times(tree)) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Node_Times_Bottom_Up(t_node *a, t_node *d, t_tree *tree) { if(tree->mod->s_opt->opt_node_ages == NO) return; if(d->tax) return; else { int i; phydbl u; phydbl t_inf, t_sup; t_node *v1, *v2; for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { MCMC_Randomize_Node_Times_Bottom_Up(d,d->v[i],tree); } } v1 = v2 = NULL; for(i=0;i<3;i++) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(!v1) v1 = d->v[i]; else v2 = d->v[i]; } } t_sup = MIN(tree->times->nd_t[v1->num],tree->times->nd_t[v2->num]); t_inf = tree->times->nd_t[a->num]; u = Uni(); u *= (t_sup - t_inf); u += t_inf; if(u > tree->times->t_prior_min[d->num] && u < tree->times->t_prior_max[d->num]) tree->times->nd_t[d->num] = u; } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Randomize_Node_Times_Top_Down(t_node *a, t_node *d, t_tree *tree) { if(tree->mod->s_opt->opt_node_ages == NO) return; if(d->tax) return; else { int i; phydbl u; phydbl t_inf, t_sup; t_inf = MAX(tree->times->nd_t[a->num],tree->times->t_prior_min[d->num]); t_sup = tree->times->t_prior_max[d->num]; u = Uni(); u *= (t_sup - t_inf); u += t_inf; tree->times->nd_t[d->num] = u; for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { MCMC_Randomize_Node_Times_Top_Down(d,d->v[i],tree); } } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Get_Acc_Rates(t_mcmc *mcmc) { int i; phydbl eps; int lag; lag = 100; eps = 1.E-6; for(i=0;in_moves;i++) { if(mcmc->run_move[i] - mcmc->prev_run_move[i] > lag) { mcmc->acc_rate[i] = (phydbl)(mcmc->acc_move[i] - mcmc->prev_acc_move[i] + eps) / (phydbl)(mcmc->run_move[i] - mcmc->prev_run_move[i] + eps) ; mcmc->prev_run_move[i] = mcmc->run_move[i]; mcmc->prev_acc_move[i] = mcmc->acc_move[i]; MCMC_Adjust_Tuning_Parameter(i,mcmc); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Adjust_Tuning_Parameter(int move, t_mcmc *mcmc) { if(mcmc->adjust_tuning[move] == YES) { phydbl scale; phydbl rate; phydbl rate_inf,rate_sup; if(mcmc->run < (int)(0.01*mcmc->chain_len)) scale = 1.5; else scale = 1.2; rate_inf = rate_sup = 0.234; if(!strcmp(mcmc->move_name[move],"tree_height")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_scale_times")) { rate_inf = 0.1; rate_sup = 0.1; } else if(!strcmp(mcmc->move_name[move],"subtree_height")) { rate_inf = 0.2; rate_sup = 0.2; } else if(!strcmp(mcmc->move_name[move],"updown_t_cr")) { rate_inf = 0.1; rate_sup = 0.1; } else if(!strcmp(mcmc->move_name[move],"clock")) { rate_inf = 0.234; rate_sup = 0.234; } /* if(!strcmp(mcmc->move_name[move],"tree_rates")) */ /* { */ /* rate_inf = 0.05; */ /* rate_sup = 0.05; */ /* } */ else if(!strcmp(mcmc->move_name[move],"phyrex_lbda")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_mu")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_rad")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_ldsk_and_disk")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_ldsk_multi")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_disk_multi")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_indel_disk")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_indel_hit")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_scale_times")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_ldsk_given_disk")) { rate_inf = 0.1; rate_sup = 0.1; } else if(!strcmp(mcmc->move_name[move],"phyrex_disk_given_ldsk")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_ldsk_tip_to_root")) { rate_inf = 0.1; rate_sup = 0.1; } else if(!strcmp(mcmc->move_name[move],"phyrex_neff")) { rate_inf = 0.234; rate_sup = 0.234; } else if(!strcmp(mcmc->move_name[move],"phyrex_spr_slide")) { rate_inf = 0.02; rate_sup = 0.02; } else if(!strcmp(mcmc->move_name[move],"root_time")) { rate_inf = 0.1; rate_sup = 0.1; } else { rate_inf = 0.234; // Gareth Robert's magic number ! rate_sup = 0.234; } rate = mcmc->acc_rate[move]; if(rate < rate_inf) { mcmc->tune_move[move] /= scale; } else if(rate > rate_sup) { mcmc->tune_move[move] *= scale; } if(mcmc->tune_move[move] > mcmc->max_tune) mcmc->tune_move[move] = mcmc->max_tune; if(mcmc->tune_move[move] < mcmc->min_tune) mcmc->tune_move[move] = mcmc->min_tune; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_One_Length(t_edge *b, t_tree *tree) { phydbl u; phydbl new_lnL_seq, cur_lnL_seq; phydbl ratio, alpha; phydbl new_l, cur_l; phydbl K,mult; cur_l = b->l->v; cur_lnL_seq = tree->c_lnL; new_lnL_seq = tree->c_lnL; K = 0.1; u = Uni(); mult = exp(K*(u-0.5)); /* mult = u*(K-1./K)+1./K; */ new_l = cur_l * mult; if(new_l < tree->mod->l_min || new_l > tree->mod->l_max) return; b->l->v = new_l; if(tree->eval_alnL == YES) new_lnL_seq = Lk(b,tree); ratio = (new_lnL_seq - cur_lnL_seq) + (log(mult)); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { b->l->v = cur_l; Update_PMat_At_Given_Edge(b,tree); tree->c_lnL = cur_lnL_seq; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Scale_Br_Lens(t_tree *tree) { phydbl u; phydbl new_lnL_seq, cur_lnL_seq; phydbl ratio, alpha; phydbl K,mult; int i; Record_Br_Len(tree); cur_lnL_seq = tree->c_lnL; new_lnL_seq = tree->c_lnL; K = 1.2; u = Uni(); mult = u*(K-1./K)+1./K; for(i=0;i<2*tree->n_otu-3;++i) { tree->a_edges[i]->l->v *= mult; if(tree->a_edges[i]->l->v < tree->mod->l_min || tree->a_edges[i]->l->v > tree->mod->l_max) return; } Set_Both_Sides(NO,tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); ratio = (new_lnL_seq - cur_lnL_seq) + (2*tree->n_otu-5) * (log(mult)); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { Restore_Br_Len(tree); tree->c_lnL = cur_lnL_seq; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Br_Lens(t_tree *tree) { MCMC_Br_Lens_Pre(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree->a_nodes[0]->b[0],tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Br_Lens_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { int i; if(a == tree->n_root || d == tree->n_root) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); MCMC_One_Length(b,tree); if(d->tax) return; else { for(i=0;i<3;i++) if(d->v[i] != a) { Update_Partial_Lk(tree,d->b[i],d); MCMC_Br_Lens_Pre(d,d->v[i],d->b[i],tree); } Update_Partial_Lk(tree,b,d); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Potentially one kappa parameter for each tree in a mixture -> update each of them void MCMC_Kappa(t_tree *mixt_tree) { t_tree *tree; phydbl cur_kappa,new_kappa; phydbl u,alpha,ratio; phydbl K; phydbl cur_lnL_seq, new_lnL_seq; if(mixt_tree->eval_alnL == NO) return; Set_Update_Eigen(YES,mixt_tree->mod); tree = mixt_tree; do { if(tree->is_mixt_tree == YES) tree = tree->next; if(!(tree->mod->whichmodel == HKY85 || tree->mod->whichmodel == K80 || tree->mod->whichmodel == TN93)) tree = tree->next; if(tree == NULL) return; cur_kappa = -1.0; new_kappa = -1.0; ratio = 0.0; K = mixt_tree->mcmc->tune_move[mixt_tree->mcmc->num_move_kappa]; cur_lnL_seq = mixt_tree->c_lnL; new_lnL_seq = UNLIKELY; cur_kappa = tree->mod->kappa->v; MCMC_Make_Move(&cur_kappa,&new_kappa,TSTV_MIN,TSTV_MAX,&ratio,K,mixt_tree->mcmc->move_type[mixt_tree->mcmc->num_move_kappa]); if(new_kappa < TSTV_MAX && new_kappa > TSTV_MIN) { tree->mod->kappa->v = new_kappa; if(mixt_tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,mixt_tree); } if(mixt_tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->mod->kappa->v = cur_kappa; mixt_tree->c_lnL = cur_lnL_seq; if(!Set_Model_Parameters(mixt_tree->mod)) { PhyML_Fprintf(stderr,"\n. Problem in move %s",tree->mcmc->move_name[tree->mcmc->move_idx]); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } else { mixt_tree->mcmc->acc_move[mixt_tree->mcmc->num_move_kappa]++; } /* PhyML_Printf("\n. [%10d] MCMC cur_k: %f new_k: %f cur: %f new: %f k: %f -> %f",mixt_tree->mcmc->run,cur_kappa,new_kappa,cur_lnL_seq,new_lnL_seq,tree->mod->kappa->v,mixt_tree->c_lnL); */ mixt_tree->mcmc->run_move[mixt_tree->mcmc->num_move_kappa]++; mixt_tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(mixt_tree); PHYREX_Print_MCMC_Tree(mixt_tree); PHYREX_Print_MCMC_Summary(mixt_tree); #endif tree = tree->next; } while(tree != NULL); Set_Update_Eigen(NO,mixt_tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Potentially one set of relative rate parameters for each tree in a mixture -> update each of them void MCMC_RR(t_tree *mixt_tree) { t_tree *tree; phydbl cur_rr,new_rr; phydbl u,alpha,ratio; int n_r_mat,*permut; phydbl K; phydbl cur_lnL_seq, new_lnL_seq; t_rmat **r_mat; int i; if(mixt_tree->eval_alnL == NO) return; Set_Update_Eigen(YES,mixt_tree->mod); tree = mixt_tree; n_r_mat = 0; r_mat = NULL; permut = NULL; do { if(tree->is_mixt_tree == YES) tree = tree->next; if(!(tree->mod->whichmodel == GTR || tree->mod->whichmodel == CUSTOM)) tree = tree->next; if(tree == NULL) return; for(i=0;imod->r_mat == r_mat[i]) break; if(i == n_r_mat && (tree->mod->whichmodel == GTR || tree->mod->whichmodel == CUSTOM) && tree->mod->r_mat->n_diff_rr > 1) { permut = Permutate(tree->mod->r_mat->n_diff_rr); for(i=0;imod->r_mat->n_diff_rr;++i) { cur_rr = -1.0; new_rr = -1.0; ratio = 0.0; K = 1.0; cur_lnL_seq = mixt_tree->c_lnL; new_lnL_seq = UNLIKELY; mixt_tree->mcmc->run_move[mixt_tree->mcmc->num_move_rr]++; cur_rr = tree->mod->r_mat->rr_val->v[permut[i]]; MCMC_Make_Move(&cur_rr,&new_rr,UNSCALED_RR_MIN,UNSCALED_RR_MAX,&ratio,K,mixt_tree->mcmc->move_type[mixt_tree->mcmc->num_move_rr]); if(new_rr < UNSCALED_RR_MAX && new_rr > UNSCALED_RR_MIN) { tree->mod->r_mat->rr_val->v[permut[i]] = new_rr; if(mixt_tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,mixt_tree); } if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); ratio += log(new_rr) - log(cur_rr); /* Because we are updating log(rr) instead of rr */ ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->mod->r_mat->rr_val->v[permut[i]] = cur_rr; mixt_tree->c_lnL = cur_lnL_seq; if(!Set_Model_Parameters(mixt_tree->mod)) { PhyML_Fprintf(stderr,"\n. Problem in move %s",tree->mcmc->move_name[tree->mcmc->move_idx]); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } else { mixt_tree->mcmc->acc_move[mixt_tree->mcmc->num_move_rr]++; } mixt_tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(mixt_tree); PHYREX_Print_MCMC_Tree(mixt_tree); PHYREX_Print_MCMC_Summary(mixt_tree); #endif /* PhyML_Printf("\n. MCMC cur_rr: %f new_rr: %f cur: %f new: %f",cur_rr,new_rr,cur_lnL_seq,new_lnL_seq); */ } Free(permut); } tree = tree->next; } while(tree != NULL); Set_Update_Eigen(NO,mixt_tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Rate_Across_Sites(t_tree *tree) { int i; if(tree->mod->ras->n_catg == 1) return; for(i=0;imod->ras->n_catg;i++) { if(tree->mod->ras->free_mixt_rates == YES) MCMC_Free_Mixt_Rate(tree); else MCMC_Alpha(tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Alpha(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-2;++i) tree->rates->br_do_updt[i] = NO; MCMC_Single_Param_Generic(&(tree->mod->ras->alpha->v),0.,100.,tree->mcmc->num_move_ras, NULL,&(tree->c_lnL), NULL,Wrap_Lk,tree->mcmc->move_type[tree->mcmc->num_move_ras],NO,NO,NULL,tree,NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Free_Mixt_Rate(t_tree *mixt_tree) { t_tree *tree; phydbl *u,*v; phydbl *f; phydbl cur_val; phydbl cur_A, new_A; phydbl low_bound,up_bound; unsigned int k,i,idx; phydbl hr,z; int n_moves; phydbl cur_lnL_seq, new_lnL_seq; phydbl ratio,alpha; tree = mixt_tree; do { tree->mod->ras->sort_rate_classes = YES; tree->mod->ras->normalise_rr = YES; cur_lnL_seq = mixt_tree->c_lnL; new_lnL_seq = UNLIKELY; k = tree->mod->ras->n_catg; f = tree->mod->ras->gamma_r_proba->v; u = tree->mod->ras->gamma_r_proba_unscaled->v; v = tree->mod->ras->gamma_rr_unscaled->v; // Setting the values of the unscaled rr freq as is done below // does not lead to changing the likelihood. u[0] = f[0]; for(i=1;imod); for(i=0;i GAMMA_RR_UNSCALED_MAX) break; if(v[i] < GAMMA_R_PROBA_UNSCALED_MIN || v[i] > GAMMA_R_PROBA_UNSCALED_MAX) break; } if(i != k) new_lnL_seq = -INFINITY; else if(mixt_tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,mixt_tree); new_A = 0.0; for(i=0;ieval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* printf("\nf class=%d new_val=%f cur_val=%f cur: %f -> new: %f",idx,u[idx],cur_val,cur_lnL_seq,new_lnL_seq); */ z = Uni(); if(z > alpha) /* Reject */ { u[idx] = cur_val; if(!Set_Model_Parameters(mixt_tree->mod)) { PhyML_Fprintf(stderr,"\n. Problem in move %s",tree->mcmc->move_name[tree->mcmc->move_idx]); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } /* phydbl cur_lk = cur_lnL_seq; */ /* phydbl new_lk = Lk(NULL,mixt_tree); */ /* if(Are_Equal(cur_lk,new_lk,1.E-5) == NO) */ /* { */ /* PhyML_Printf("\n. new: %f cur: %f",new_lk,cur_lk); */ /* assert(FALSE); */ /* } */ mixt_tree->c_lnL = cur_lnL_seq; } else /* Accept */ { cur_lnL_seq = new_lnL_seq; } mixt_tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(mixt_tree); PHYREX_Print_MCMC_Tree(mixt_tree); PHYREX_Print_MCMC_Summary(mixt_tree); #endif } else { // Update rates cur_A = 0.0; for(i=0;imod); for(i=0;i GAMMA_RR_UNSCALED_MAX) break; if(u[i] < GAMMA_R_PROBA_UNSCALED_MIN || u[i] > GAMMA_R_PROBA_UNSCALED_MAX) break; } if(i != k) new_lnL_seq = -INFINITY; else if(mixt_tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,mixt_tree); new_A = 0.0; for(i=0;ieval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* printf("\nr class=%d new_val=%f cur_val=%f cur: %f -> new: %f",idx,v[idx],cur_val,cur_lnL_seq,new_lnL_seq); */ z = Uni(); if(z > alpha) /* Reject */ { v[idx] = cur_val; if(!Set_Model_Parameters(mixt_tree->mod)) { PhyML_Fprintf(stderr,"\n. Problem in move %s",tree->mcmc->move_name[tree->mcmc->move_idx]); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } /* phydbl cur_lk = cur_lnL_seq; */ /* phydbl new_lk = Lk(NULL,mixt_tree); */ /* if(Are_Equal(cur_lk,new_lk,1.E-5) == NO) */ /* { */ /* PhyML_Printf("\n. new: %f cur: %f",new_lk,cur_lk); */ /* assert(FALSE); */ /* } */ mixt_tree->c_lnL = cur_lnL_seq; } else /* Accept */ { cur_lnL_seq = new_lnL_seq; } mixt_tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(mixt_tree); PHYREX_Print_MCMC_Tree(mixt_tree); PHYREX_Print_MCMC_Summary(mixt_tree); #endif } } while(n_moves != k); tree = tree->next_mixt; } while(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Covarion_Rates(t_tree *tree) { int i, class; phydbl u; phydbl min,max; if(tree->mod->use_m4mod == NO) return; Set_Update_Eigen(YES,tree->mod); for(i=0;i<2*tree->n_otu-2;++i) tree->rates->br_do_updt[i] = YES; class = Rand_Int(0,tree->mod->m4mod->n_h-1); min = 0.01; max = 100.; u = Uni(); if(u < .5) { if(!class) { min = 0.01; max = tree->mod->m4mod->multipl_unscaled->v[1]; } else if(class == tree->mod->m4mod->n_h-1) { min = tree->mod->m4mod->multipl_unscaled->v[tree->mod->m4mod->n_h-2]; max = +100.; } else { min = MIN(tree->mod->m4mod->multipl_unscaled->v[class-1],tree->mod->m4mod->multipl_unscaled->v[class+1]); max = MAX(tree->mod->m4mod->multipl_unscaled->v[class-1],tree->mod->m4mod->multipl_unscaled->v[class+1]); } MCMC_Single_Param_Generic(&(tree->mod->m4mod->multipl_unscaled->v[class]),min,max,tree->mcmc->num_move_cov_rates+class+tree->mod->m4mod->n_h, NULL,&(tree->c_lnL), NULL,Wrap_Lk,tree->mcmc->move_type[tree->mcmc->num_move_cov_rates+class+tree->mod->m4mod->n_h],NO,NO,NULL,tree,NULL); } else { MCMC_Single_Param_Generic(&(tree->mod->m4mod->h_fq_unscaled->v[class]),0.01,+100.,tree->mcmc->num_move_cov_rates+class, NULL,&(tree->c_lnL), NULL,Wrap_Lk,tree->mcmc->move_type[tree->mcmc->num_move_cov_rates+class],NO,NO,NULL,tree,NULL); } Set_Update_Eigen(NO,tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Covarion_Switch(t_tree *tree) { if(tree->mod->use_m4mod == NO) return; Set_Update_Eigen(YES,tree->mod); MCMC_Single_Param_Generic(&(tree->mod->m4mod->delta->v),0.01,+100.,tree->mcmc->num_move_cov_switch, NULL,&(tree->c_lnL), NULL,Wrap_Lk,tree->mcmc->move_type[tree->mcmc->num_move_cov_switch], NO,NO,NULL,tree,NULL); Set_Update_Eigen(NO,tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) void MCMC_Birth_Rate(t_tree *tree) { phydbl cur_birth_rate,new_birth_rate; phydbl cur_lnL_time,new_lnL_time; phydbl cur_lnL_time_ghost,new_lnL_time_ghost; /* phydbl cur_lnL_time_pivot,new_lnL_time_pivot; */ phydbl u,alpha,ratio; phydbl birth_rate_min,birth_rate_max; phydbl K; int i,n_mcmc_steps,move; cur_birth_rate = -1.0; new_birth_rate = -1.0; ratio = 0.0; n_mcmc_steps = tree->mcmc->run_move[tree->mcmc->num_move_birth_rate] == 1 ? 1000 : 100; move = -1; K = tree->mcmc->tune_move[tree->mcmc->num_move_birth_rate]; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; cur_lnL_time_ghost = UNLIKELY; new_lnL_time_ghost = UNLIKELY; /* cur_lnL_time_pivot = UNLIKELY; */ /* new_lnL_time_pivot = UNLIKELY; */ cur_birth_rate = tree->times->birth_rate; birth_rate_min = MAX(tree->times->birth_rate_min,tree->times->death_rate); birth_rate_max = tree->times->birth_rate_max; MCMC_Make_Move(&cur_birth_rate,&new_birth_rate,birth_rate_min,birth_rate_max,&ratio,K,tree->mcmc->move_type[tree->mcmc->num_move_birth_rate]); /* new_birth_rate = Uni()*(birth_rate_max - birth_rate_min) + birth_rate_min; */ if(new_birth_rate < birth_rate_max && new_birth_rate > birth_rate_min && new_birth_rate > tree->times->death_rate) { tree->times->birth_rate = new_birth_rate; new_lnL_time = TIMES_Lk(tree); if(tree->mcmc->run_move[tree->mcmc->num_move_birth_rate] == 500) { tree->times->birth_rate_pivot = tree->times->birth_rate; tree->times->death_rate_pivot = tree->times->death_rate; } if(tree->mcmc->run_move[tree->mcmc->num_move_birth_rate] >= 0) { tree->aux_tree[0]->eval_alnL = NO; tree->aux_tree[0]->eval_rlnL = NO; tree->aux_tree[0]->eval_glnL = YES; tree->aux_tree[0]->eval_tlnL = YES; tree->aux_tree[0]->times->birth_rate = new_birth_rate; tree->aux_tree[0]->rates->c_lnL = UNLIKELY; tree->aux_tree[0]->c_lnL = UNLIKELY; TIMES_Randomize_Tree_With_Time_Constraints(tree->aux_tree[0]->times->a_cal[0],tree->aux_tree[0]); tree->aux_tree[0]->times->birth_rate = new_birth_rate; tree->aux_tree[0]->times->death_rate = tree->times->death_rate; TIMES_Lk(tree->aux_tree[0]); if(!(tree->aux_tree[0]->times->c_lnL > UNLIKELY)) { PhyML_Fprintf(stderr,"\n. glnL=%f",tree->aux_tree[0]->times->c_lnL); PhyML_Fprintf(stderr,"\n. birth=%G death=%G [%G]",new_birth_rate,tree->times->death_rate,tree->aux_tree[0]->times->death_rate); TIMES_Lk(tree->aux_tree[0]); assert(FALSE); } i = 0; do { u = Uni(); for(move=0;movemcmc->n_moves;move++) if(tree->mcmc->move_weight[move] > u-1.E-10) break; /* if(!(i%10)) PhyML_Printf("\n<< %5d Move '%20s' %12f",i,tree->mcmc->move_name[move],tree->aux_tree[0]->times->c_lnL); */ if(!strcmp(tree->mcmc->move_name[move],"tree_height")) { MCMC_Tree_Height(tree->aux_tree[0]); i++; } if(!strcmp(tree->mcmc->move_name[move],"times")) { MCMC_Times_All(tree->aux_tree[0]); i++; } if(!strcmp(tree->mcmc->move_name[move],"spr")) { MCMC_Prune_Regraft(tree->aux_tree[0]); i++; } if(!strcmp(tree->mcmc->move_name[move],"spr_local")) { MCMC_Prune_Regraft_Local(tree->aux_tree[0]); i++; } if(!(tree->aux_tree[0]->times->c_lnL > UNLIKELY)) { PhyML_Fprintf(stderr,"\n. move: %s",tree->mcmc->move_name[move]); PhyML_Fprintf(stderr,"\n. glnL=%f",tree->aux_tree[0]->times->c_lnL); TIMES_Lk(tree->aux_tree[0]); assert(FALSE); } /* PhyML_Printf("\n.> %4d %15f",i,tree->aux_tree[0]->times->c_lnL); */ } while(i < n_mcmc_steps); tree->aux_tree[0]->times->birth_rate = cur_birth_rate; tree->aux_tree[0]->times->death_rate = tree->times->death_rate; cur_lnL_time_ghost = TIMES_Lk(tree->aux_tree[0]); tree->aux_tree[0]->times->birth_rate = new_birth_rate; tree->aux_tree[0]->times->death_rate = tree->times->death_rate; new_lnL_time_ghost = TIMES_Lk(tree->aux_tree[0]); ratio += (cur_lnL_time_ghost - new_lnL_time_ghost); } } ratio += (new_lnL_time - cur_lnL_time); ratio = exp(ratio); alpha = MIN(1.,ratio); /* printf("\n. b :%4d: %12G -> %12G ratio : %12G [ghost: %12G %12G -- real: %12G %12G]", */ /* tree->mcmc->run_move[tree->mcmc->num_move_birth_rate], */ /* cur_birth_rate, */ /* new_birth_rate, */ /* ratio, */ /* cur_lnL_time_ghost, */ /* new_lnL_time_ghost, */ /* cur_lnL_time, */ /* new_lnL_time); */ u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* PhyML_Printf(" reject"); */ tree->times->birth_rate = cur_birth_rate; tree->times->c_lnL = cur_lnL_time; } else { /* PhyML_Printf(" accept"); */ tree->mcmc->acc_move[tree->mcmc->num_move_birth_rate]++; } tree->mcmc->run_move[tree->mcmc->num_move_birth_rate]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) void MCMC_Death_Rate(t_tree *tree) { /* MCMC_Single_Param_Generic(&(tree->times->death_rate), */ /* 0.0, // instead of tree->times->death_rate_min as death rate can be equal to 0 (Yule model) */ /* tree->times->death_rate_min, */ /* tree->mcmc->num_move_death_rate, */ /* &(tree->times->c_lnL),NULL, */ /* Wrap_Lk_Times,NULL,tree->mcmc->move_type[tree->mcmc->num_move_death_rate],NO,NULL,tree,NULL); */ phydbl cur_death_rate,new_death_rate; phydbl cur_lnL_time,new_lnL_time; phydbl cur_lnL_time_ghost,new_lnL_time_ghost; /* phydbl cur_lnL_time_pivot,new_lnL_time_pivot; */ phydbl u,alpha,ratio; phydbl death_rate_min,death_rate_max; phydbl K; int i,n_mcmc_steps,move; cur_death_rate = -1.0; new_death_rate = -1.0; ratio = 0.0; n_mcmc_steps = tree->mcmc->run_move[tree->mcmc->num_move_death_rate] == 1 ? 1000 : 100; move = -1; K = tree->mcmc->tune_move[tree->mcmc->num_move_death_rate]; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; cur_lnL_time_ghost = UNLIKELY; new_lnL_time_ghost = UNLIKELY; /* cur_lnL_time_pivot = UNLIKELY; */ /* new_lnL_time_pivot = UNLIKELY; */ cur_death_rate = tree->times->death_rate; death_rate_min = tree->times->death_rate_min; death_rate_max = MIN(tree->times->death_rate_min,tree->times->birth_rate); MCMC_Make_Move(&cur_death_rate,&new_death_rate,death_rate_min,death_rate_max,&ratio,K,tree->mcmc->move_type[tree->mcmc->num_move_death_rate]); /* new_death_rate = Uni()*(death_rate_max - death_rate_min) + death_rate_min; */ if(new_death_rate < death_rate_max && new_death_rate > death_rate_min && new_death_rate < tree->times->birth_rate) { tree->times->death_rate = new_death_rate; new_lnL_time = TIMES_Lk(tree); if(tree->mcmc->run_move[tree->mcmc->num_move_birth_rate] >= 0) { /* if(tree->mcmc->run_move[tree->mcmc->num_move_birth_rate] >= 500) */ /* { */ /* tree->aux_tree[0]->times->birth_rate = tree->times->birth_rate_pivot; */ /* tree->aux_tree[0]->times->death_rate = tree->times->death_rate_pivot; */ /* cur_lnL_time_pivot = TIMES_Lk(tree->aux_tree[0]); */ /* } */ /* tree->aux_tree[0]->times->death_rate = cur_death_rate; */ /* tree->aux_tree[0]->times->birth_rate = tree->times->birth_rate; */ /* cur_lnL_time_ghost = TIMES_Lk(tree->aux_tree[0]); */ /* Copy_Tree(tree->aux_tree[0],tree->aux_tree[0]->aux_tree[0]); */ /* RATES_Copy_Rate_Struct(tree->aux_tree[0]->rates,tree->aux_tree[0]->aux_tree[0]->rates,tree->n_otu); */ /* DATE_Assign_Primary_Calibration(tree->aux_tree[0]->aux_tree[0]); */ tree->aux_tree[0]->eval_alnL = NO; tree->aux_tree[0]->eval_rlnL = NO; tree->aux_tree[0]->eval_glnL = YES; tree->aux_tree[0]->eval_tlnL = YES; tree->aux_tree[0]->rates->c_lnL = UNLIKELY; tree->aux_tree[0]->c_lnL = UNLIKELY; TIMES_Randomize_Tree_With_Time_Constraints(tree->aux_tree[0]->times->a_cal[0],tree->aux_tree[0]); tree->aux_tree[0]->times->birth_rate = tree->times->birth_rate; tree->aux_tree[0]->times->death_rate = new_death_rate; TIMES_Lk(tree->aux_tree[0]); if(!(tree->aux_tree[0]->times->c_lnL > UNLIKELY)) { PhyML_Fprintf(stderr,"\n. glnL=%f",tree->aux_tree[0]->times->c_lnL); PhyML_Fprintf(stderr,"\n. death=%G birth=%G [%G]",new_death_rate,tree->times->birth_rate,tree->aux_tree[0]->times->birth_rate); PhyML_Fprintf(stderr,"\n"); for(int i=0;iaux_tree[0]->times->n_cal;++i) { t_cal *cal = tree->aux_tree[0]->times->a_cal[i]; PhyML_Fprintf(stderr,"\n. calibration %s applies to clade %s\t",cal->id,cal->clade_list[cal->current_clade_idx]->id); for(int j=0;jclade_list_size;++j) { t_clad *clade = cal->clade_list[j]; PhyML_Fprintf(stderr,"time:%G\t",tree->aux_tree[0]->times->nd_t[clade->target_nd->num]); } } PhyML_Fprintf(stderr,"\n"); TIMES_Lk(tree->aux_tree[0]); assert(FALSE); } i = 0; do { u = Uni(); for(move=0;movemcmc->n_moves;move++) if(tree->mcmc->move_weight[move] > u-1.E-10) break; /* if(!(i%10)) PhyML_Printf("\n>> %5d Move '%20s' %12f",i,tree->mcmc->move_name[move],tree->aux_tree[0]->times->c_lnL); */ if(!strcmp(tree->mcmc->move_name[move],"tree_height")) { MCMC_Tree_Height(tree->aux_tree[0]); i++; } if(!strcmp(tree->mcmc->move_name[move],"times")) { MCMC_Times_All(tree->aux_tree[0]); i++; } if(!strcmp(tree->mcmc->move_name[move],"spr")) { MCMC_Prune_Regraft(tree->aux_tree[0]); i++; } if(!strcmp(tree->mcmc->move_name[move],"spr_local")) { MCMC_Prune_Regraft_Local(tree->aux_tree[0]); i++; } if(!(tree->aux_tree[0]->times->c_lnL > UNLIKELY)) { PhyML_Fprintf(stderr,"\n. move: %s",tree->mcmc->move_name[move]); PhyML_Fprintf(stderr,"\n. glnL=%f",tree->aux_tree[0]->times->c_lnL); TIMES_Lk(tree->aux_tree[0]); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } while(i < n_mcmc_steps); tree->aux_tree[0]->times->death_rate = cur_death_rate; tree->aux_tree[0]->times->birth_rate = tree->times->birth_rate; cur_lnL_time_ghost = TIMES_Lk(tree->aux_tree[0]); tree->aux_tree[0]->times->birth_rate = tree->times->birth_rate; tree->aux_tree[0]->times->death_rate = new_death_rate; new_lnL_time_ghost = TIMES_Lk(tree->aux_tree[0]); ratio += (cur_lnL_time_ghost - new_lnL_time_ghost); /* if(tree->mcmc->run_move[tree->mcmc->num_move_birth_rate] >= 500) */ /* { */ /* tree->aux_tree[0]->times->birth_rate = tree->times->birth_rate_pivot; */ /* tree->aux_tree[0]->times->death_rate = tree->times->death_rate_pivot; */ /* new_lnL_time_pivot = TIMES_Lk(tree->aux_tree[0]); */ /* ratio += (new_lnL_time_pivot - cur_lnL_time_pivot); */ /* } */ } } ratio += (new_lnL_time - cur_lnL_time); ratio = exp(ratio); alpha = MIN(1.,ratio); /* printf("\n. d :%4d: %12G -> %12G ratio : %12G [ghost: %12G %12G -- real: %12G %12G]", */ /* tree->mcmc->run_move[tree->mcmc->num_move_death_rate], */ /* cur_death_rate, */ /* new_death_rate, */ /* ratio, */ /* cur_lnL_time_ghost, */ /* new_lnL_time_ghost, */ /* cur_lnL_time, */ /* new_lnL_time); */ u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* PhyML_Printf(" reject"); */ tree->times->death_rate = cur_death_rate; tree->times->c_lnL = cur_lnL_time; /* Copy_Tree(tree->aux_tree[0]->aux_tree[0],tree->aux_tree[0]); */ /* RATES_Copy_Rate_Struct(tree->aux_tree[0]->aux_tree[0]->rates,tree->aux_tree[0]->rates,tree->n_otu); */ /* DATE_Assign_Primary_Calibration(tree->aux_tree[0]); */ } else { /* PhyML_Printf(" accept"); */ tree->mcmc->acc_move[tree->mcmc->num_move_death_rate]++; } tree->mcmc->run_move[tree->mcmc->num_move_death_rate]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) void MCMC_Birth_Death_Updown(t_tree *tree) { phydbl cur_death_rate,new_death_rate; phydbl cur_birth_rate,new_birth_rate; phydbl cur_lnL_time,new_lnL_time; phydbl cur_lnL_time_ghost,new_lnL_time_ghost; /* phydbl cur_lnL_time_pivot,new_lnL_time_pivot; */ phydbl u,alpha,ratio; phydbl death_rate_min,death_rate_max; phydbl birth_rate_min,birth_rate_max; phydbl K,scale; int i,n_mcmc_steps,move; cur_death_rate = -1.0; new_death_rate = -1.0; cur_birth_rate = -1.0; new_birth_rate = -1.0; ratio = 0.0; n_mcmc_steps = tree->mcmc->run_move[tree->mcmc->num_move_birth_death_updown] == 1 ? 1000 : 100; move = -1; K = tree->mcmc->tune_move[tree->mcmc->num_move_birth_death_updown]; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; cur_lnL_time_ghost = UNLIKELY; new_lnL_time_ghost = UNLIKELY; /* cur_lnL_time_pivot = UNLIKELY; */ /* new_lnL_time_pivot = UNLIKELY; */ cur_death_rate = tree->times->death_rate; cur_birth_rate = tree->times->birth_rate; death_rate_min = tree->times->death_rate_min; death_rate_max = tree->times->death_rate_min; birth_rate_min = tree->times->birth_rate_min; birth_rate_max = tree->times->birth_rate_max; scale = exp(K*(Uni()-.5)); new_birth_rate = cur_birth_rate * scale; new_death_rate = cur_death_rate * scale; ratio += 2.*log(scale); if(new_death_rate < death_rate_max && new_death_rate > death_rate_min && new_birth_rate < birth_rate_max && new_birth_rate > birth_rate_min && new_death_rate < new_birth_rate) { tree->times->death_rate = new_death_rate; tree->times->birth_rate = new_birth_rate; new_lnL_time = TIMES_Lk(tree); if(tree->mcmc->run_move[tree->mcmc->num_move_birth_rate] >= 0) { tree->aux_tree[0]->eval_alnL = NO; tree->aux_tree[0]->eval_rlnL = NO; tree->aux_tree[0]->eval_glnL = YES; tree->aux_tree[0]->eval_tlnL = YES; tree->aux_tree[0]->rates->c_lnL = UNLIKELY; tree->aux_tree[0]->c_lnL = UNLIKELY; TIMES_Randomize_Tree_With_Time_Constraints(tree->aux_tree[0]->times->a_cal[0],tree->aux_tree[0]); tree->aux_tree[0]->times->death_rate = new_death_rate; tree->aux_tree[0]->times->birth_rate = new_birth_rate; TIMES_Lk(tree->aux_tree[0]); if(!(tree->aux_tree[0]->times->c_lnL > UNLIKELY)) { PhyML_Fprintf(stderr,"\n. glnL=%f",tree->aux_tree[0]->times->c_lnL); PhyML_Fprintf(stderr,"\n. death=%G birth=%G [%G]",new_death_rate,tree->times->birth_rate,tree->aux_tree[0]->times->birth_rate); TIMES_Lk(tree->aux_tree[0]); assert(FALSE); } i = 0; do { u = Uni(); for(move=0;movemcmc->n_moves;move++) if(tree->mcmc->move_weight[move] > u-1.E-10) break; if(!strcmp(tree->mcmc->move_name[move],"tree_height")) MCMC_Tree_Height(tree->aux_tree[0]); if(!strcmp(tree->mcmc->move_name[move],"times")) MCMC_Times_All(tree->aux_tree[0]); if(!strcmp(tree->mcmc->move_name[move],"spr")) MCMC_Prune_Regraft(tree->aux_tree[0]); if(!strcmp(tree->mcmc->move_name[move],"spr_local")) MCMC_Prune_Regraft_Local(tree->aux_tree[0]); if(!(tree->aux_tree[0]->times->c_lnL > UNLIKELY)) { PhyML_Fprintf(stderr,"\n. move: %s",tree->mcmc->move_name[move]); PhyML_Fprintf(stderr,"\n. glnL=%f",tree->aux_tree[0]->times->c_lnL); TIMES_Lk(tree->aux_tree[0]); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } i++; } while(i < n_mcmc_steps); tree->aux_tree[0]->times->death_rate = cur_death_rate; tree->aux_tree[0]->times->birth_rate = cur_birth_rate; cur_lnL_time_ghost = TIMES_Lk(tree->aux_tree[0]); tree->aux_tree[0]->times->death_rate = new_death_rate; tree->aux_tree[0]->times->birth_rate = new_birth_rate; new_lnL_time_ghost = TIMES_Lk(tree->aux_tree[0]); ratio += (cur_lnL_time_ghost - new_lnL_time_ghost); } } ratio += (new_lnL_time - cur_lnL_time); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* PhyML_Printf(" reject"); */ tree->times->death_rate = cur_death_rate; tree->times->birth_rate = cur_birth_rate; tree->times->c_lnL = cur_lnL_time; } else { /* PhyML_Printf(" accept"); */ tree->mcmc->acc_move[tree->mcmc->num_move_birth_death_updown]++; } tree->mcmc->run_move[tree->mcmc->num_move_birth_death_updown]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Nu(t_tree *tree) { phydbl cur_nu,new_nu; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnP_rate,new_lnP_rate; phydbl cur_lnL_seq, new_lnL_seq; phydbl u,alpha,ratio; phydbl min_nu,max_nu; phydbl K; if(tree->rates->model_id == STRICTCLOCK) return; ratio = 0.0; K = tree->mcmc->tune_move[tree->mcmc->num_move_nu]; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnP_rate = tree->rates->c_lnP; new_lnP_rate = UNLIKELY; cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_nu = tree->rates->nu; new_nu = tree->rates->nu; min_nu = tree->rates->min_nu; max_nu = tree->rates->max_nu; MCMC_Make_Move(&cur_nu,&new_nu,min_nu,max_nu,&ratio,K,tree->mcmc->move_type[tree->mcmc->num_move_nu]); if(new_nu < max_nu && new_nu > min_nu) { tree->rates->nu = new_nu; if(tree->eval_rlnL == YES) { new_lnL_rate = RATES_Lk(tree); new_lnP_rate = RATES_Prior(tree); } if(tree->rates->model_id == GUINDON) { RATES_Update_Edge_Lengths(tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); } } if(tree->eval_rlnL == YES) { ratio += (new_lnL_rate - cur_lnL_rate); ratio += (new_lnP_rate - cur_lnP_rate); } if(tree->eval_alnL == YES && tree->rates->model_id == GUINDON) ratio += (new_lnL_seq - cur_lnL_seq); ratio = exp(ratio); alpha = MIN(1.,ratio); /* PhyML_Printf("\n. cur_nu: %f new_nu: %f cur_lnL_rate: %f new_lnL_rate: %f cur_lnP_rate: %f new_lnP_rate: %f ratio: %f", */ /* cur_nu, */ /* new_nu, */ /* cur_lnL_rate, */ /* new_lnL_rate, */ /* cur_lnP_rate, */ /* new_lnP_rate, */ /* ratio); */ u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->rates->nu = cur_nu; tree->rates->c_lnL = cur_lnL_rate; tree->rates->c_lnP = cur_lnP_rate; tree->c_lnL = cur_lnL_seq; if(tree->rates->model_id == GUINDON && tree->eval_alnL == YES) RATES_Update_Edge_Lengths(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_nu]++; } tree->mcmc->run_move[tree->mcmc->num_move_nu]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) void MCMC_Clade_Change(t_tree *tree) { phydbl u,alpha,ratio; phydbl cur_lnL_calib, new_lnL_calib; phydbl cur_lnL_time, new_lnL_time; int target_cal_idx,current_clade_idx,new_clade_idx; t_cal *cal; ratio = 0.0; cal = NULL; cur_lnL_calib = DATE_Lk_Calib(tree); new_lnL_time = tree->times->c_lnL; cur_lnL_time = tree->times->c_lnL; // Choose a calibration uniformly at random target_cal_idx = Rand_Int(0,tree->times->n_cal-1); cal = tree->times->a_cal[target_cal_idx]; /* printf("\n. CURRENT cal: %s clade: %s target: %d",cal->id,cal->clade_list[cal->current_clade_idx]->id,cal->clade_list[cal->current_clade_idx]->target_nd->num); */ // Choose a new clade uniformly at random current_clade_idx = cal->current_clade_idx; new_clade_idx = Rand_Int(0,cal->clade_list_size-1); cal->current_clade_idx = new_clade_idx; new_lnL_time = TIMES_Lk(tree); ratio += new_lnL_time - cur_lnL_time; /* printf("\n. NEW cal: %s clade: %s target: %d",cal->id,cal->clade_list[cal->current_clade_idx]->id,cal->clade_list[cal->current_clade_idx]->target_nd->num); */ new_lnL_calib = DATE_Lk_Calib(tree); ratio += new_lnL_calib - cur_lnL_calib; ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* printf("\n. reject\n"); */ cal->current_clade_idx = current_clade_idx; tree->times->c_lnL = cur_lnL_time; TIMES_Lk(tree); // Required in order to update node targeted by selected calibration } else { /* printf("\n. accept\n"); */ tree->mcmc->acc_move[tree->mcmc->num_move_clade_change]++; } tree->mcmc->run_move[tree->mcmc->num_move_clade_change]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) /* Only works when simulating from prior */ void MCMC_Sim_Rate(t_node *a, t_node *d, t_tree *tree) { int err; phydbl mean,sd,br_r_a,dt_d; br_r_a = tree->rates->br_r[a->num]; dt_d = tree->times->nd_t[d->num] - tree->times->nd_t[a->num]; sd = SQRT(dt_d*tree->rates->nu); mean = br_r_a; if(tree->rates->model_id == STRICTCLOCK) tree->rates->br_r[d->num] = tree->rates->clock_r; else { tree->rates->br_r[d->num] = Rnorm_Trunc(mean,sd,tree->rates->min_rate,tree->rates->max_rate,&err); #if (defined PHYREX) PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif if(err == YES) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } if(d->tax) return; else { int i; for(i=0;i<3;i++) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) MCMC_Sim_Rate(d,d->v[i],tree); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) void MCMC_Prune_Regraft(t_tree *tree) { phydbl u,alpha,ratio; phydbl t_min,t_max; phydbl cur_lnL_seq,new_lnL_seq; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnL_time,new_lnL_time; phydbl new_t; int i,prune_idx,n_iter,n_regraft_nd,regraft_idx,dir_prune; phydbl *times; int rnd_dir,dir_v1,dir_v2; t_node *prune,*prune_daughter,*new_regraft_nd,*cur_regraft_nd; t_ll *regraft_nd_list; t_edge *target, *ori_target, *residual,*regraft_edge; phydbl regraft_t_min,regraft_t_max; /* phydbl *prob_idx; */ /* phydbl r,sum,prob_select_fwd,prob_select_bwd; */ n_iter = MAX(1,(int)(tree->n_otu/5)); /* n_iter = tree->n_otu-2; */ times = tree->times->nd_t; /* prob_idx = (phydbl *)mCalloc(tree->n_otu-1,sizeof(phydbl)); */ // Shallowest node has probability proportional to r to be // to be selected as prune node while deepest a proba prop to 1. /* r = 0.5; */ /* for(i=0;in_otu-1;i++) prob_idx[i] = i*(r-1.0)/(tree->n_otu-2) + 1.0; */ /* sum = .0; */ /* for(i=0;in_otu-1;i++) sum += prob_idx[i]; */ /* for(i=0;in_otu-1;i++) prob_idx[i] /= sum; */ while(n_iter--) { TIMES_Update_Node_Ordering(tree); /* if(tree->eval_alnL == YES) Lk(NULL,tree); */ tree->mcmc->run_move[tree->mcmc->num_move_spr]++; TIMES_Record_Times(tree); cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; ratio = 0.0; regraft_edge = NULL; new_regraft_nd = NULL; cur_regraft_nd = NULL; new_t = 0.0; // Select prune node (any internal node) prune_idx = Rand_Int(tree->n_otu,2*tree->n_otu-2); /* prune_idx = Sample_i_With_Proba_pi(prob_idx,tree->n_otu-1); */ /* prob_select_fwd = prob_idx[prune_idx]; */ /* ratio -= log(prob_select_fwd); */ /* prune_idx = tree->times->t_rank[prune_idx]; */ prune = tree->a_nodes[prune_idx]; assert(prune && prune->tax == NO); // Select a daughter of prune node dir_v1 = dir_v2 = -1; for(i=0;i<3;i++) if(prune->v[i] != prune->anc && prune->b[i] != tree->e_root) { if(dir_v1 < 0) dir_v1 = i; else dir_v2 = i; } u = Uni(); if(u < 0.5) rnd_dir = dir_v1; else rnd_dir = dir_v2; prune_daughter = prune->v[rnd_dir]; cur_regraft_nd = prune->v[rnd_dir == dir_v1 ? dir_v2 : dir_v1]; if(prune == tree->n_root) { if(prune_daughter == prune->v[dir_v1] && prune->v[dir_v2]->tax == YES) { prune_daughter = prune->v[dir_v2]; cur_regraft_nd = prune->v[dir_v1]; } if(prune_daughter == prune->v[dir_v2] && prune->v[dir_v1]->tax == YES) { prune_daughter = prune->v[dir_v1]; cur_regraft_nd = prune->v[dir_v2]; } } if(prune_daughter->anc != prune) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); dir_prune = -1; for(i=0;i<3;i++) { if(prune_daughter->v[i] == prune || prune_daughter->b[i] == tree->e_root) { dir_prune = i; break; } } assert(dir_prune > -1); // Get the list of potential regraft nodes (oldest node on regraft edge) regraft_nd_list = DATE_List_Of_Regraft_Nodes(prune_daughter->v[dir_prune],prune_daughter,®raft_t_min,®raft_t_max,NO,tree); assert(regraft_nd_list); if(prune == tree->n_root) Push_Bottom_Linked_List(prune,®raft_nd_list,YES); // Number of regraft nodes n_regraft_nd = Linked_List_Len(regraft_nd_list); if(!(n_regraft_nd > 0)) // Should be at least 1, since original graft site is in the list { printf("\n\n. prune: %d [%d-%d-%d] [%s-%s-%s] [%f-%f;%f] prune_daughter: %d [%f-%f;%f] prune->anc: %d [%f-%f;%f] effective: %d glnL: %f", prune->num, prune->v[0] ? prune->v[0]->num : -1, prune->v[1]->num, prune->v[2]->num, prune->v[0] ? prune->v[0]->tax ? prune->v[0]->name : "XXX" : "XXX", prune->v[1]->tax ? prune->v[1]->name : "XXX", prune->v[2]->tax ? prune->v[2]->name : "XXX", tree->times->nd_t[prune->num], tree->times->t_prior_min[prune->num], tree->times->t_prior_max[prune->num], prune_daughter->num, tree->times->nd_t[prune_daughter->num], tree->times->t_prior_min[prune_daughter->num], tree->times->t_prior_max[prune_daughter->num], prune->anc ? prune->anc->num : -1, prune->anc ? tree->times->nd_t[prune->anc->num] : -1, prune->anc ? tree->times->t_prior_min[prune->anc->num] : -1, prune->anc ? tree->times->t_prior_max[prune->anc->num] : -1, prune_daughter->v[dir_prune]->num, tree->times->c_lnL); fflush(NULL); regraft_nd_list = DATE_List_Of_Regraft_Nodes(prune_daughter->v[dir_prune],prune_daughter,®raft_t_min,®raft_t_max,YES,tree); assert(FALSE); } // Randomly select one (uniform) regraft_idx = Rand_Int(0,n_regraft_nd-1); new_regraft_nd = Linked_List_Elem(regraft_idx,regraft_nd_list); Free_Linked_List(regraft_nd_list); // Time of regraft node and corresponding (partial) Hastings ratio t_max = MIN(times[prune_daughter->num],times[cur_regraft_nd->num]); if(prune == tree->n_root) t_min = 10.0*t_max; else t_min = times[prune->anc->num]; t_min = MAX(t_min,regraft_t_min); ratio += log(1./(t_max - t_min)); t_max = MIN(times[prune_daughter->num],times[new_regraft_nd->num]); if(new_regraft_nd == tree->n_root) t_min = 10.0*t_max; else t_min = times[new_regraft_nd->anc->num]; t_min = MAX(t_min,regraft_t_min); ratio -= log(1./(t_max - t_min)); new_t = Uni()*(t_max-t_min) + t_min; // Age of root node changes when pruned subtree is on one side of that node // Change here, not after the prune and regraft move /* if(prune == tree->n_root) */ /* { */ /* if(prune_daughter == tree->n_root->v[1]) */ /* times[tree->n_root->num] = times[tree->n_root->v[2]->num]; */ /* else if(prune_daughter == tree->n_root->v[2]) */ /* times[tree->n_root->num] = times[tree->n_root->v[1]->num]; */ /* else assert(false); */ /* } */ // New age if(prune == tree->n_root || new_regraft_nd == tree->n_root) { if(prune == tree->n_root) { if(prune_daughter == tree->n_root->v[1]) times[tree->n_root->num] = times[tree->n_root->v[2]->num]; else times[tree->n_root->num] = times[tree->n_root->v[1]->num]; times[prune_daughter->v[dir_prune]->num] = new_t; } if(new_regraft_nd == tree->n_root) { times[prune_daughter->v[dir_prune]->num] = times[tree->n_root->num]; times[tree->n_root->num] = new_t; } } else { times[prune->num] = new_t; } // Prune target = residual = NULL; Prune_Subtree(prune_daughter->v[dir_prune], prune_daughter, &target,&residual,tree); ori_target = target; // Regraft edge is the one sitting above regraft_nd if(new_regraft_nd == tree->n_root->v[1] || new_regraft_nd == tree->n_root->v[2] || new_regraft_nd == tree->n_root) regraft_edge = tree->e_root; else { for(i=0;i<3;i++) if(new_regraft_nd->v[i] == new_regraft_nd->anc) break; assert(i!=3); regraft_edge = new_regraft_nd->b[i]; } assert(regraft_edge); assert(residual->left != residual->rght); assert(regraft_edge->left != prune_daughter->v[dir_prune]); assert(regraft_edge->rght != prune_daughter->v[dir_prune]); // Regraft Graft_Subtree(regraft_edge, prune_daughter->v[dir_prune], prune_daughter, residual, new_regraft_nd,tree); /* TIMES_Update_Node_Ordering(tree); */ /* For(i,2*tree->n_otu-2) if(prune->num == tree->times->t_rank[i]) break; */ /* prob_select_bwd = prob_idx[i]; */ /* ratio += log(prob_select_bwd); */ if(!TIMES_Check_Node_Height_Ordering(tree)) { printf("\n. prune[%d]->t:%.3f daughter[%d]->t:%.3f prune_anc[%d]->t:%.3f regraft[%d]->t:%.3f regraft_anc[%d]->t:%.3f [effective:%d] t_prior_min/max: [prune:[%.3f %.3f] regraft:[%.3f %.3f]] ", prune->num, times[prune->num], prune_daughter->num, times[prune_daughter->num], prune->anc ? prune->anc->num : -1, prune->anc ? times[prune->anc->num] : -1., new_regraft_nd->num, times[new_regraft_nd->num], new_regraft_nd->anc ? new_regraft_nd->anc->num : -1, new_regraft_nd->anc ? times[new_regraft_nd->anc->num] : +1., prune->num, tree->times->t_prior_min[prune->num], tree->times->t_prior_max[prune->num], tree->times->t_prior_min[new_regraft_nd->num], tree->times->t_prior_max[new_regraft_nd->num]); PhyML_Fprintf(stderr,"\n. root: %d %d %d",tree->n_root->num,tree->n_root->v[1]->num,tree->n_root->v[2]->num); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } DATE_Assign_Primary_Calibration(tree); RATES_Update_Edge_Lengths(tree); if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); if(new_lnL_time > UNLIKELY) { Set_Both_Sides(NO,tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); } if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) ratio += (new_lnL_rate - cur_lnL_rate); if(tree->eval_tlnL == YES) ratio += (new_lnL_time - cur_lnL_time); ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_lnL_time > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { // Reject Prune_Subtree(prune_daughter->v[dir_prune], prune_daughter, &target,&residual,tree); assert(residual->left != residual->rght); assert(ori_target->left != prune_daughter->v[dir_prune]); assert(ori_target->rght != prune_daughter->v[dir_prune]); Graft_Subtree(ori_target, prune_daughter->v[dir_prune], prune_daughter,residual,prune == tree->n_root ? tree->n_root : cur_regraft_nd,tree); TIMES_Reset_Times(tree); RATES_Update_Edge_Lengths(tree); DATE_Assign_Primary_Calibration(tree); new_lnL_time = TIMES_Lk(tree); if(Are_Equal(new_lnL_time,cur_lnL_time,1.E-5) == NO) { PhyML_Printf("\n. new_lnL_time: %f cur_lnL_time: %f",new_lnL_time,cur_lnL_time); assert(FALSE); } /* if(tree->eval_alnL == YES) */ /* { */ /* new_lnL_seq = Lk(NULL,tree); */ /* if(Are_Equal(new_lnL_seq,cur_lnL_seq,1.E-5) == NO) */ /* { */ /* PhyML_Printf("\n. new: %f cur: %f",new_lnL_seq,cur_lnL_seq); */ /* assert(FALSE); */ /* } */ /* } */ if(!(tree->times->c_lnL > UNLIKELY)) { printf("\n. time prune: %f",times[prune->num]); printf("\n. time prune_daughter: %f",times[prune_daughter->num]); printf("\n. prune: %d prune_daughter: %d prune_daughter->v[dir_prune]: %d cur_regraft_nd: %d new_regraft_nd: %d", prune->num, prune_daughter->num, prune_daughter->v[dir_prune]->num, cur_regraft_nd->num, new_regraft_nd->num); TIMES_Lk(tree); fflush(NULL); } assert(tree->times->c_lnL > UNLIKELY); tree->c_lnL = cur_lnL_seq; tree->times->c_lnL = cur_lnL_time; tree->rates->c_lnL = cur_lnL_rate; } else { tree->mcmc->acc_move[tree->mcmc->num_move_spr]++; } tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } /* Free(prob_idx); */ } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) void MCMC_Prune_Regraft_Weighted(t_tree *tree) { phydbl u,alpha,ratio; phydbl cur_lnL_seq,new_lnL_seq; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnL_time,new_lnL_time; phydbl new_t; int i,prune_idx,n_iter,dir_prune; phydbl *times; int rnd_dir,dir_v1,dir_v2; t_node *prune,*prune_daughter,*new_regraft_nd,*cur_regraft_nd; t_edge *target, *ori_target, *residual,*regraft_edge; phydbl radius; n_iter = MAX(1,(int)(tree->n_otu/5)); times = tree->times->nd_t; while(n_iter--) { tree->mcmc->run_move[tree->mcmc->num_move_spr_weighted]++; TIMES_Record_Times(tree); cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; ratio = 0.0; regraft_edge = NULL; new_regraft_nd = NULL; cur_regraft_nd = NULL; new_t = 0.0; // Select prune node (any internal node) prune_idx = Rand_Int(tree->n_otu,2*tree->n_otu-2); prune = tree->a_nodes[prune_idx]; assert(prune && prune->tax == NO); // Select a daughter of prune node dir_v1 = dir_v2 = -1; for(i=0;i<3;i++) if(prune->v[i] != prune->anc && prune->b[i] != tree->e_root) { if(dir_v1 < 0) dir_v1 = i; else dir_v2 = i; } u = Uni(); if(u < 0.5) rnd_dir = dir_v1; else rnd_dir = dir_v2; prune_daughter = prune->v[rnd_dir]; cur_regraft_nd = prune->v[rnd_dir == dir_v1 ? dir_v2 : dir_v1]; if(prune == tree->n_root) { if(prune_daughter == prune->v[dir_v1] && prune->v[dir_v2]->tax == YES) { prune_daughter = prune->v[dir_v2]; cur_regraft_nd = prune->v[dir_v1]; } if(prune_daughter == prune->v[dir_v2] && prune->v[dir_v1]->tax == YES) { prune_daughter = prune->v[dir_v1]; cur_regraft_nd = prune->v[dir_v2]; } } assert(prune_daughter->anc == prune); dir_prune = -1; for(i=0;i<3;i++) { if(prune_daughter->v[i] == prune || prune_daughter->b[i] == tree->e_root) { dir_prune = i; break; } } assert(dir_prune > -1); radius = Rnorm(0.0,0.05); radius = fabs(radius); radius += tree->rates->cur_l[prune_daughter->num]; // valid too when prune == tree->n_root /* printf("\n. Init rad: %G l: %G %G root: %d",radius,tree->rates->cur_l[prune_daughter->num],prune_daughter->b[dir_prune]->l->v,prune_daughter->b[dir_prune] == tree->e_root); */ // Get the list of potential regraft nodes (oldest node on regraft edge) Random_Walk_Along_Tree_On_Radius(prune_daughter, prune_daughter->v[dir_prune], prune_daughter->b[dir_prune], &radius, ®raft_edge, &new_regraft_nd, &new_t, tree); /* printf("\n. new_regraft_edge: %d, new_regraft_nd: %d time: %f cur_regraft_nd: %d prune: %d prune_daughter: %d", */ /* regraft_edge ? regraft_edge->num : -1, */ /* new_regraft_nd ? new_regraft_nd->num : -1, */ /* new_t, */ /* cur_regraft_nd->num, */ /* prune->num, */ /* prune_daughter->num); fflush(NULL); */ if(new_regraft_nd == NULL) continue; if(new_regraft_nd == prune) continue; if(new_regraft_nd == cur_regraft_nd) continue; if(new_t > times[prune_daughter->num]) continue; assert(new_regraft_nd != prune_daughter); // New age if(prune == tree->n_root || new_regraft_nd == tree->n_root) { if(prune == tree->n_root) { if(prune_daughter == tree->n_root->v[1]) times[tree->n_root->num] = times[tree->n_root->v[2]->num]; else times[tree->n_root->num] = times[tree->n_root->v[1]->num]; times[prune_daughter->v[dir_prune]->num] = new_t; } if(new_regraft_nd == tree->n_root) { times[prune_daughter->v[dir_prune]->num] = times[tree->n_root->num]; times[tree->n_root->num] = new_t; } } else { times[prune->num] = new_t; } // Prune target = residual = NULL; Prune_Subtree(prune_daughter->v[dir_prune], prune_daughter, &target,&residual,tree); ori_target = target; // Regraft edge is the one sitting above new_regraft_nd if(new_regraft_nd == tree->n_root->v[1] || new_regraft_nd == tree->n_root->v[2] || new_regraft_nd == tree->n_root) regraft_edge = tree->e_root; else { for(i=0;i<3;++i) if(new_regraft_nd->v[i] == new_regraft_nd->anc) break; assert(i!=3); regraft_edge = new_regraft_nd->b[i]; } assert(regraft_edge); assert(residual->left != residual->rght); assert(regraft_edge->left != prune_daughter->v[dir_prune]); assert(regraft_edge->rght != prune_daughter->v[dir_prune]); // Regraft Graft_Subtree(regraft_edge, prune_daughter->v[dir_prune], prune_daughter, residual, new_regraft_nd,tree); if(!TIMES_Check_Node_Height_Ordering(tree)) { PhyML_Fprintf(stderr,"\n. prune[%d]->t:%.3f daughter[%d]->t:%.3f prune_anc[%d]->t:%.3f regraft[%d]->t:%.3f regraft_anc[%d]->t:%.3f [effective:%d] t_prior_min/max: [prune:[%.3f %.3f] regraft:[%.3f %.3f]] ", prune->num, times[prune->num], prune_daughter->num, times[prune_daughter->num], prune->anc ? prune->anc->num : -1, prune->anc ? times[prune->anc->num] : -1., new_regraft_nd->num, times[new_regraft_nd->num], new_regraft_nd->anc ? new_regraft_nd->anc->num : -1, new_regraft_nd->anc ? times[new_regraft_nd->anc->num] : +1., prune->num, tree->times->t_prior_min[prune->num], tree->times->t_prior_max[prune->num], tree->times->t_prior_min[new_regraft_nd->num], tree->times->t_prior_max[new_regraft_nd->num]); PhyML_Fprintf(stderr,"\n. root: %d %d %d",tree->n_root->num,tree->n_root->v[1]->num,tree->n_root->v[2]->num); assert(FALSE); } RATES_Update_Edge_Lengths(tree); DATE_Assign_Primary_Calibration(tree); if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); if(new_lnL_time > UNLIKELY) { Set_Both_Sides(NO,tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); } if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) ratio += (new_lnL_rate - cur_lnL_rate); if(tree->eval_tlnL == YES) ratio += (new_lnL_time - cur_lnL_time); ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_lnL_time > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { // Reject Prune_Subtree(prune_daughter->v[dir_prune], prune_daughter, &target,&residual,tree); assert(residual->left != residual->rght); assert(ori_target->left != prune_daughter->v[dir_prune]); assert(ori_target->rght != prune_daughter->v[dir_prune]); Graft_Subtree(ori_target, prune_daughter->v[dir_prune], prune_daughter,residual,prune == tree->n_root ? tree->n_root : cur_regraft_nd,tree); TIMES_Reset_Times(tree); RATES_Update_Edge_Lengths(tree); DATE_Assign_Primary_Calibration(tree); new_lnL_time = TIMES_Lk(tree); if(Are_Equal(new_lnL_time,cur_lnL_time,1.E-5) == NO) { PhyML_Printf("\n. new_lnL_time: %f cur_lnL_time: %f",new_lnL_time,cur_lnL_time); assert(FALSE); } /* new_lnL_seq = Lk(NULL,tree); */ /* if(Are_Equal(new_lnL_seq,cur_lnL_seq,1.E-5) == NO) */ /* { */ /* PhyML_Printf("\n. new: %f cur: %f",new_lnL_seq,cur_lnL_seq); */ /* assert(FALSE); */ /* } */ if(!(tree->times->c_lnL > UNLIKELY)) { printf("\n. time prune: %f",times[prune->num]); printf("\n. time prune_daughter: %f",times[prune_daughter->num]); printf("\n. prune: %d prune_daughter: %d prune_daughter->v[dir_prune]: %d cur_regraft_nd: %d new_regraft_nd: %d", prune->num, prune_daughter->num, prune_daughter->v[dir_prune]->num, cur_regraft_nd->num, new_regraft_nd->num); TIMES_Lk(tree); fflush(NULL); } assert(tree->times->c_lnL > UNLIKELY); tree->c_lnL = cur_lnL_seq; tree->times->c_lnL = cur_lnL_time; tree->rates->c_lnL = cur_lnL_rate; } else { tree->mcmc->acc_move[tree->mcmc->num_move_spr_weighted]++; } tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) void MCMC_Prune_Regraft_Local(t_tree *tree) { phydbl u,alpha,ratio; phydbl t_min,t_max; phydbl cur_lnL_seq,new_lnL_seq; phydbl cur_lnL_rate,new_lnL_rate; phydbl cur_lnL_time,new_lnL_time; phydbl new_t; int i,prune_idx,n_iter,n_regraft_nd,regraft_idx,dir_prune; phydbl *times; int rnd_dir,dir_v1,dir_v2; t_node *prune,*prune_daughter,*new_regraft_nd,*cur_regraft_nd; t_ll *regraft_nd_list; t_edge *target, *ori_target, *residual,*regraft_edge; t_node *a, *b, *c, *d, *e; n_iter = MAX(1,(int)(tree->n_otu/5)); times = tree->times->nd_t; while(n_iter--) { tree->mcmc->run_move[tree->mcmc->num_move_spr_local]++; TIMES_Record_Times(tree); cur_lnL_seq = tree->c_lnL; new_lnL_seq = UNLIKELY; cur_lnL_rate = tree->rates->c_lnL; new_lnL_rate = UNLIKELY; cur_lnL_time = tree->times->c_lnL; new_lnL_time = UNLIKELY; ratio = 0.0; regraft_edge = NULL; new_regraft_nd = NULL; cur_regraft_nd = NULL; new_t = 0.0; // Select prune node (any internal node) prune_idx = Rand_Int(tree->n_otu,2*tree->n_otu-2); /* prune_idx = tree->n_otu+n_iter; */ prune = tree->a_nodes[prune_idx]; assert(prune && prune->tax == NO); // Select a daughter of prune node dir_v1 = dir_v2 = -1; for(i=0;i<3;i++) if(prune->v[i] != prune->anc && prune->b[i] != tree->e_root) { if(dir_v1 < 0) dir_v1 = i; else dir_v2 = i; } u = Uni(); if(u < 0.5) rnd_dir = dir_v1; else rnd_dir = dir_v2; prune_daughter = prune->v[rnd_dir]; cur_regraft_nd = prune->v[rnd_dir == dir_v1 ? dir_v2 : dir_v1]; if(prune == tree->n_root) { if(prune_daughter == prune->v[dir_v1] && prune->v[dir_v2]->tax == YES) { prune_daughter = prune->v[dir_v2]; cur_regraft_nd = prune->v[dir_v1]; } if(prune_daughter == prune->v[dir_v2] && prune->v[dir_v1]->tax == YES) { prune_daughter = prune->v[dir_v1]; cur_regraft_nd = prune->v[dir_v2]; } } assert(prune_daughter->anc == prune); dir_prune = -1; for(i=0;i<3;i++) { if(prune_daughter->v[i] == prune || prune_daughter->b[i] == tree->e_root) { dir_prune = i; break; } } assert(dir_prune > -1); /* | | d / \ / \c / \ e / \prune_daughter /\ / \ a b */ // Probability of forward move regraft_nd_list = NULL; a = b = c = d = e = NULL; e = cur_regraft_nd; if(e->tax == NO && times[e->num] < times[prune_daughter->num]) { for(i=0;i<3;i++) { if(e->v[i] != e->anc && e->b[i] != tree->e_root) { if(a == NULL) a = e->v[i]; else b = e->v[i]; } } Push_Bottom_Linked_List(a,®raft_nd_list,YES); Push_Bottom_Linked_List(b,®raft_nd_list,YES); } if(prune_daughter->anc != tree->n_root) { d = prune_daughter->anc->anc; for(i=0;i<3;i++) { if(d->v[i] != d->anc && d->b[i] != tree->e_root && d->v[i] != prune) { c = d->v[i]; break; } } Push_Bottom_Linked_List(c,®raft_nd_list,YES); Push_Bottom_Linked_List(d,®raft_nd_list,YES); } n_regraft_nd = Linked_List_Len(regraft_nd_list); if(n_regraft_nd == 0) { Free_Linked_List(regraft_nd_list); continue; } assert(n_regraft_nd > 0); ratio -= log(1./n_regraft_nd); // Randomly select one node among potential regraft sites (uniform) regraft_idx = Rand_Int(0,n_regraft_nd-1); new_regraft_nd = Linked_List_Elem(regraft_idx,regraft_nd_list); Free_Linked_List(regraft_nd_list); // Time of regraft node and corresponding (partial) Hastings ratio t_max = MIN(times[prune_daughter->num],times[cur_regraft_nd->num]); if(prune == tree->n_root) t_min = 10.0*t_max; else t_min = times[prune->anc->num]; ratio += log(1./(t_max - t_min)); t_max = MIN(times[prune_daughter->num],times[new_regraft_nd->num]); if(new_regraft_nd == tree->n_root) t_min = 10.0*t_max; else t_min = times[new_regraft_nd->anc->num]; ratio -= log(1./(t_max - t_min)); new_t = Uni()*(t_max-t_min) + t_min; // Age of root node changes when pruned subtree is on one side of that node // Change here, not after the prune and regraft move /* if(prune == tree->n_root) */ /* { */ /* if(prune_daughter == tree->n_root->v[1]) */ /* times[tree->n_root->num] = times[tree->n_root->v[2]->num]; */ /* else if(prune_daughter == tree->n_root->v[2]) */ /* times[tree->n_root->num] = times[tree->n_root->v[1]->num]; */ /* else assert(false); */ /* } */ /* printf("\n-> prune: %d prune_daughter: %d prune_daughter->v[dir_prune]: %d cur_regraft_nd: %d new_regraft_nd: %d", */ /* prune->num, */ /* prune_daughter->num, */ /* prune_daughter->v[dir_prune]->num, */ /* cur_regraft_nd->num, */ /* new_regraft_nd->num); */ /* printf("\n. a:%d b:%d c:%d d:%d e:%d", */ /* a ? a->num : -1, */ /* b ? b->num : -1, */ /* c ? c->num : -1, */ /* d ? d->num : -1, */ /* e ? e->num : -1); */ /* fflush(NULL); */ // New age if(prune == tree->n_root || new_regraft_nd == tree->n_root) { if(prune == tree->n_root) { if(prune_daughter == tree->n_root->v[1]) times[tree->n_root->num] = times[tree->n_root->v[2]->num]; else times[tree->n_root->num] = times[tree->n_root->v[1]->num]; times[prune_daughter->v[dir_prune]->num] = new_t; } if(new_regraft_nd == tree->n_root) { times[prune_daughter->v[dir_prune]->num] = times[tree->n_root->num]; times[tree->n_root->num] = new_t; } } else { times[prune->num] = new_t; } // Prune target = residual = NULL; Prune_Subtree(prune_daughter->v[dir_prune], prune_daughter, &target,&residual,tree); ori_target = target; // Regraft edge is the one sitting above regraft_nd if(new_regraft_nd == tree->n_root->v[1] || new_regraft_nd == tree->n_root->v[2] || new_regraft_nd == tree->n_root) regraft_edge = tree->e_root; else { for(i=0;i<3;i++) if(new_regraft_nd->v[i] == new_regraft_nd->anc) break; assert(i!=3); regraft_edge = new_regraft_nd->b[i]; } assert(regraft_edge); assert(residual->left != residual->rght); assert(regraft_edge->left != prune_daughter->v[dir_prune]); assert(regraft_edge->rght != prune_daughter->v[dir_prune]); // Regraft Graft_Subtree(regraft_edge, prune_daughter->v[dir_prune], prune_daughter, residual, new_regraft_nd,tree); a = b = c = d = e = NULL; regraft_nd_list = NULL; e = new_regraft_nd; if(new_regraft_nd == tree->n_root) { if(prune_daughter == tree->n_root->v[1]) e = tree->n_root->v[2]; else if(prune_daughter == tree->n_root->v[2]) e = tree->n_root->v[1]; else assert(false); } if(e->tax == NO && times[e->num] < times[prune_daughter->num]) { for(i=0;i<3;i++) { if(e->v[i] != e->anc && e->b[i] != tree->e_root) { if(a == NULL) a = e->v[i]; else b = e->v[i]; } } Push_Bottom_Linked_List(a,®raft_nd_list,YES); Push_Bottom_Linked_List(b,®raft_nd_list,YES); } // prune is different from prune_daughter->anc here if prune == tree->n_root if(prune_daughter->anc != tree->n_root) { d = prune_daughter->anc->anc; for(i=0;i<3;i++) { if(d->v[i] != d->anc && d->b[i] != tree->e_root && d->v[i] != prune) { c = d->v[i]; break; } } Push_Bottom_Linked_List(c,®raft_nd_list,YES); Push_Bottom_Linked_List(d,®raft_nd_list,YES); } /* printf("\n+ a:%d b:%d c:%d d:%d e:%d", */ /* a ? a->num : -1, */ /* b ? b->num : -1, */ /* c ? c->num : -1, */ /* d ? d->num : -1, */ /* e ? e->num : -1); */ /* fflush(NULL); */ // Number of regraft nodes n_regraft_nd = Linked_List_Len(regraft_nd_list); assert(n_regraft_nd > 0); ratio += log(1./n_regraft_nd); Free_Linked_List(regraft_nd_list); // New age /* if(new_regraft_nd == tree->n_root) */ /* { */ /* if(prune_daughter == tree->n_root->v[1]) */ /* times[tree->n_root->v[2]->num] = times[tree->n_root->num]; */ /* else if(prune_daughter == tree->n_root->v[2]) */ /* times[tree->n_root->v[1]->num] = times[tree->n_root->num]; */ /* else assert(false); */ /* times[tree->n_root->num] = new_t; */ /* } */ /* else if(prune == tree->n_root) */ /* { */ /* times[prune_daughter->v[dir_prune]->num] = new_t; */ /* } */ /* else */ /* { */ /* times[prune->num] = new_t; */ /* } */ if(!TIMES_Check_Node_Height_Ordering(tree)) { printf("\n. prune[%d]->t:%.3f daughter[%d]->t:%.3f prune_anc[%d]->t:%.3f regraft[%d]->t:%.3f regraft_anc[%d]->t:%.3f [effective:%d] t_prior_min/max: [prune:[%.3f %.3f] regraft:[%.3f %.3f]] ", prune->num, times[prune->num], prune_daughter->num, times[prune_daughter->num], prune->anc ? prune->anc->num : -1, prune->anc ? times[prune->anc->num] : -1., new_regraft_nd->num, times[new_regraft_nd->num], new_regraft_nd->anc ? new_regraft_nd->anc->num : -1, new_regraft_nd->anc ? times[new_regraft_nd->anc->num] : +1., prune->num, tree->times->t_prior_min[prune->num], tree->times->t_prior_max[prune->num], tree->times->t_prior_min[new_regraft_nd->num], tree->times->t_prior_max[new_regraft_nd->num]); PhyML_Fprintf(stderr,"\n. root: %d %d %d",tree->n_root->num,tree->n_root->v[1]->num,tree->n_root->v[2]->num); assert(FALSE); } RATES_Update_Edge_Lengths(tree); DATE_Assign_Primary_Calibration(tree); if(tree->eval_tlnL == YES) new_lnL_time = TIMES_Lk(tree); if(new_lnL_time > UNLIKELY) { Set_Both_Sides(NO,tree); if(tree->eval_alnL == YES) new_lnL_seq = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_lnL_rate = RATES_Lk(tree); } if(tree->eval_alnL == YES) ratio += (new_lnL_seq - cur_lnL_seq); if(tree->eval_rlnL == YES) ratio += (new_lnL_rate - cur_lnL_rate); if(tree->eval_tlnL == YES) ratio += (new_lnL_time - cur_lnL_time); ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_lnL_time > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) { // Reject Prune_Subtree(prune_daughter->v[dir_prune], prune_daughter, &target,&residual,tree); assert(residual->left != residual->rght); assert(ori_target->left != prune_daughter->v[dir_prune]); assert(ori_target->rght != prune_daughter->v[dir_prune]); Graft_Subtree(ori_target, prune_daughter->v[dir_prune], prune_daughter,residual,prune == tree->n_root ? tree->n_root : cur_regraft_nd,tree); TIMES_Reset_Times(tree); RATES_Update_Edge_Lengths(tree); DATE_Assign_Primary_Calibration(tree); new_lnL_time = TIMES_Lk(tree); if(Are_Equal(new_lnL_time,cur_lnL_time,1.E-5) == NO) { PhyML_Printf("\n. new_lnL_time: %f cur_lnL_time: %f",new_lnL_time,cur_lnL_time); assert(FALSE); } /* new_lnL_seq = Lk(NULL,tree); */ /* if(Are_Equal(new_lnL_seq,cur_lnL_seq,1.E-5) == NO) */ /* { */ /* PhyML_Printf("\n. new: %f cur: %f",new_lnL_seq,cur_lnL_seq); */ /* assert(FALSE); */ /* } */ if(!(tree->times->c_lnL > UNLIKELY)) { printf("\n. time prune: %f",times[prune->num]); printf("\n. time prune_daughter: %f",times[prune_daughter->num]); printf("\n. prune: %d prune_daughter: %d prune_daughter->v[dir_prune]: %d cur_regraft_nd: %d new_regraft_nd: %d", prune->num, prune_daughter->num, prune_daughter->v[dir_prune]->num, cur_regraft_nd->num, new_regraft_nd->num); TIMES_Lk(tree); fflush(NULL); } assert(tree->times->c_lnL > UNLIKELY); tree->c_lnL = cur_lnL_seq; tree->times->c_lnL = cur_lnL_time; tree->rates->c_lnL = cur_lnL_rate; } else { tree->mcmc->acc_move[tree->mcmc->num_move_spr_local]++; } tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Complete_MCMC(t_mcmc *mcmc, t_tree *tree) { int i; phydbl sum; time(&(mcmc->time_beg)); time(&(mcmc->time_end)); mcmc->n_moves = 0; mcmc->io = tree->io; mcmc->move_idx = -1; mcmc->sample_size = mcmc->chain_len/mcmc->sample_interval; mcmc->sample_num = 0; mcmc->num_move_nd_r = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_br_r = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_times = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_times_and_rates = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_times_and_rates_root = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_root_time = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_nu = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_clock_r = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_tree_height = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_time_slice = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_subtree_height = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_kappa = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_rr = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_tree_rates = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_subtree_rates = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_updown_nu_cr = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_ras = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_updown_t_cr = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_cov_rates = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_cov_switch = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_birth_rate = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_death_rate = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_birth_death_updown = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_spr = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_spr_weighted = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_spr_local = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_spr_root = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_updown_t_br = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_jump_calibration = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_geo_lambda = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_geo_sigma = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_geo_tau = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_geo_updown_tau_lbda = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_geo_updown_lbda_sigma = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_geo_dum = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_lbda = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_mu = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_rad = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_indel_disk = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_move_disk_ud = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_swap_disk = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_indel_hit = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_spr = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_spr_slide = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_narrow_exchange = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_wide_exchange = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_scale_times = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_ldscape_lim = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_sigsq = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_time_neff = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_time_neff_growth = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_sim = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_traj = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_indel_disk_serial = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_sim_plus = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_indel_hit_serial = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_ldsk_given_disk = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_disk_given_ldsk = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_ldsk_and_disk = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_ldsk_multi = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_disk_multi = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_add_remove_jump = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_clade_change = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_ldsk_tip_to_root = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_sigsq_scale = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_ldsk_tips = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_node_times = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_node_veloc = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_correlated_node_veloc = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_all_veloc = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_shuffle_node_times = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_iwn_omega = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_iou_theta = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_iou_mu = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_rates_shrink = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_obs_var = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_tip_loc = mcmc->n_moves; mcmc->n_moves += 1; mcmc->num_move_phyrex_iou_theta_sigsq = mcmc->n_moves; mcmc->n_moves += 1; mcmc->run_move = (int *)mCalloc(mcmc->n_moves,sizeof(int)); mcmc->acc_move = (int *)mCalloc(mcmc->n_moves,sizeof(int)); mcmc->prev_run_move = (int *)mCalloc(mcmc->n_moves,sizeof(int)); mcmc->prev_acc_move = (int *)mCalloc(mcmc->n_moves,sizeof(int)); mcmc->acc_rate = (phydbl *)mCalloc(mcmc->n_moves,sizeof(phydbl)); mcmc->move_weight = (phydbl *)mCalloc(mcmc->n_moves,sizeof(phydbl)); mcmc->move_prob = (phydbl *)mCalloc(mcmc->n_moves,sizeof(phydbl)); mcmc->move_type = (int *)mCalloc(mcmc->n_moves,sizeof(int)); /* TO DO: instead of n_moves here we should have something like n_param */ mcmc->ess = (phydbl *)mCalloc(mcmc->n_moves,sizeof(phydbl)); mcmc->ess_run = (int *)mCalloc(mcmc->n_moves,sizeof(int)); mcmc->start_ess = (int *)mCalloc(mcmc->n_moves,sizeof(int)); mcmc->adjust_tuning = (int *)mCalloc(mcmc->n_moves,sizeof(int)); mcmc->tune_move = (phydbl *)mCalloc(mcmc->n_moves,sizeof(phydbl)); mcmc->sampled_val = (phydbl *)mCalloc((int)mcmc->n_moves*(mcmc->chain_len/mcmc->sample_interval + 1),sizeof(phydbl)); mcmc->mode = (phydbl *)mCalloc((int)mcmc->n_moves,sizeof(phydbl)); mcmc->move_name = (char **)mCalloc(mcmc->n_moves,sizeof(char *)); for(i=0;in_moves;i++) mcmc->move_name[i] = (char *)mCalloc(T_MAX_MCMC_MOVE_NAME,sizeof(char)); for(i=0;in_moves;i++) mcmc->adjust_tuning[i] = YES; strcpy(mcmc->move_name[mcmc->num_move_br_r],"br_rate"); strcpy(mcmc->move_name[mcmc->num_move_nd_r],"nd_rate"); strcpy(mcmc->move_name[mcmc->num_move_times],"times"); strcpy(mcmc->move_name[mcmc->num_move_times_and_rates],"times_and_rates"); strcpy(mcmc->move_name[mcmc->num_move_times_and_rates_root],"times_and_rates_root"); strcpy(mcmc->move_name[mcmc->num_move_root_time],"root_time"); strcpy(mcmc->move_name[mcmc->num_move_nu],"nu"); strcpy(mcmc->move_name[mcmc->num_move_clock_r],"clock"); strcpy(mcmc->move_name[mcmc->num_move_tree_height],"tree_height"); strcpy(mcmc->move_name[mcmc->num_move_time_slice],"time_slice"); strcpy(mcmc->move_name[mcmc->num_move_subtree_height],"subtree_height"); strcpy(mcmc->move_name[mcmc->num_move_kappa],"kappa"); strcpy(mcmc->move_name[mcmc->num_move_rr],"rr"); strcpy(mcmc->move_name[mcmc->num_move_spr],"spr"); strcpy(mcmc->move_name[mcmc->num_move_spr_weighted],"spr_weighted"); strcpy(mcmc->move_name[mcmc->num_move_spr_local],"spr_local"); strcpy(mcmc->move_name[mcmc->num_move_spr_root],"spr_root"); strcpy(mcmc->move_name[mcmc->num_move_tree_rates],"tree_rates"); strcpy(mcmc->move_name[mcmc->num_move_subtree_rates],"subtree_rates"); strcpy(mcmc->move_name[mcmc->num_move_updown_nu_cr],"updown_nu_cr"); strcpy(mcmc->move_name[mcmc->num_move_ras],"ras"); strcpy(mcmc->move_name[mcmc->num_move_updown_t_cr],"updown_t_cr"); strcpy(mcmc->move_name[mcmc->num_move_cov_rates],"cov_rates"); strcpy(mcmc->move_name[mcmc->num_move_cov_switch],"cov_switch"); strcpy(mcmc->move_name[mcmc->num_move_birth_rate],"birth_rate"); strcpy(mcmc->move_name[mcmc->num_move_death_rate],"death_rate"); strcpy(mcmc->move_name[mcmc->num_move_birth_death_updown],"birth_death_updown"); strcpy(mcmc->move_name[mcmc->num_move_updown_t_br],"updown_t_br"); strcpy(mcmc->move_name[mcmc->num_move_jump_calibration],"jump_calibration"); strcpy(mcmc->move_name[mcmc->num_move_geo_lambda],"geo_lambda"); strcpy(mcmc->move_name[mcmc->num_move_geo_sigma],"geo_sigma"); strcpy(mcmc->move_name[mcmc->num_move_geo_tau],"geo_tau"); strcpy(mcmc->move_name[mcmc->num_move_geo_updown_tau_lbda],"geo_updown_tau_lbda"); strcpy(mcmc->move_name[mcmc->num_move_geo_updown_lbda_sigma],"geo_updown_lbda_sigma"); strcpy(mcmc->move_name[mcmc->num_move_geo_dum],"geo_dum"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_lbda],"phyrex_lbda"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_mu],"phyrex_mu"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_rad],"phyrex_rad"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_indel_disk],"phyrex_indel_disk"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_move_disk_ud],"phyrex_move_disk_ud"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_swap_disk],"phyrex_swap_disk"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_indel_hit],"phyrex_indel_hit"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_spr],"phyrex_spr"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_spr_slide],"phyrex_spr_slide"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_narrow_exchange],"phyrex_narrow_exchange"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_wide_exchange],"phyrex_wide_exchange"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_scale_times],"phyrex_scale_times"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_ldscape_lim],"phyrex_ldscape_lim"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_sigsq],"phyrex_sigsq"); strcpy(mcmc->move_name[mcmc->num_move_time_neff],"phyrex_neff"); strcpy(mcmc->move_name[mcmc->num_move_time_neff_growth],"phyrex_neff_growth"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_sim],"phyrex_sim"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_traj],"phyrex_traj"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_indel_disk_serial],"phyrex_indel_disk_serial"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_sim_plus],"phyrex_sim_plus"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_indel_hit_serial],"phyrex_indel_hit_serial"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_ldsk_multi],"phyrex_ldsk_multi"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_disk_multi],"phyrex_disk_multi"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_ldsk_and_disk],"phyrex_ldsk_and_disk"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_disk_given_ldsk],"phyrex_disk_given_ldsk"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_ldsk_given_disk],"phyrex_ldsk_given_disk"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_add_remove_jump],"phyrex_add_remove_jump"); strcpy(mcmc->move_name[mcmc->num_move_clade_change],"clade_change"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_ldsk_tip_to_root],"phyrex_ldsk_tip_to_root"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_sigsq_scale],"phyrex_sigsq_scale"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_ldsk_tips],"phyrex_ldsk_tips"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_node_times],"phyrex_node_times"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_node_veloc],"phyrex_node_veloc"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_correlated_node_veloc],"phyrex_corr_node_veloc"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_all_veloc],"phyrex_all_veloc"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_shuffle_node_times],"phyrex_shuffle_node_times"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_iwn_omega],"phyrex_iwn_omega"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_iou_theta],"phyrex_iou_theta"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_iou_mu],"phyrex_iou_mu"); strcpy(mcmc->move_name[mcmc->num_move_rates_shrink],"rates_shrink"); strcpy(mcmc->move_name[mcmc->num_move_obs_var], "observational_var"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_tip_loc], "tip_location"); strcpy(mcmc->move_name[mcmc->num_move_phyrex_iou_theta_sigsq], "phyrex_iou_theta_sigsq"); for(i=0;in_moves;i++) mcmc->move_type[i] = -1; mcmc->move_type[mcmc->num_move_nd_r] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_br_r] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_times] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_root_time] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_nu] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_clock_r] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_tree_height] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_time_slice] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_subtree_height] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_kappa] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_rr] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_tree_rates] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_subtree_rates] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_updown_nu_cr] = MCMC_MOVE_RANDWALK_NORMAL; mcmc->move_type[mcmc->num_move_ras] = MCMC_MOVE_RANDWALK_NORMAL; mcmc->move_type[mcmc->num_move_updown_t_cr] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_cov_rates] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_cov_switch] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_birth_rate] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_death_rate] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_birth_death_updown] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_updown_t_br] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_jump_calibration] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_geo_lambda] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_geo_sigma] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_geo_tau] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_geo_updown_tau_lbda] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_geo_updown_lbda_sigma] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_geo_dum] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_lbda] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_mu] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_rad] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_scale_times] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_sigsq] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_time_neff] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_time_neff_growth] = MCMC_MOVE_RANDWALK_NORMAL; mcmc->move_type[mcmc->num_move_phyrex_indel_hit] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_indel_disk] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_ldsk_tip_to_root] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_sigsq_scale] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_ldsk_tips] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_node_times] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_correlated_node_veloc] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_node_veloc] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_all_veloc] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_shuffle_node_times] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_iwn_omega] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_iou_theta] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_iou_mu] = MCMC_MOVE_RANDWALK_NORMAL; mcmc->move_type[mcmc->num_move_rates_shrink] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_obs_var] = MCMC_MOVE_SCALE_THORNE; mcmc->move_type[mcmc->num_move_phyrex_tip_loc] = MCMC_MOVE_SCALE_THORNE; for(i=0;in_moves;i++) mcmc->tune_move[i] = 1.; mcmc->tune_move[mcmc->num_move_time_neff_growth] = 0.01; mcmc->tune_move[mcmc->num_move_root_time] = 0.1; mcmc->move_prob[mcmc->num_move_br_r] = 4.0; mcmc->move_prob[mcmc->num_move_nd_r] = 0.0; mcmc->move_prob[mcmc->num_move_times] = 0.0; mcmc->move_prob[mcmc->num_move_times_and_rates] = 0.0; mcmc->move_prob[mcmc->num_move_root_time] = 3.0; mcmc->move_prob[mcmc->num_move_clock_r] = 3.0; mcmc->move_prob[mcmc->num_move_tree_height] = 0.0; mcmc->move_prob[mcmc->num_move_time_slice] = 0.0; mcmc->move_prob[mcmc->num_move_subtree_height] = 0.0; mcmc->move_prob[mcmc->num_move_nu] = 1.0; mcmc->move_prob[mcmc->num_move_kappa] = 1.0; mcmc->move_prob[mcmc->num_move_rr] = 1.0; mcmc->move_prob[mcmc->num_move_spr] = 0.0; mcmc->move_prob[mcmc->num_move_spr_weighted] = 0.0; mcmc->move_prob[mcmc->num_move_spr_local] = 0.0; mcmc->move_prob[mcmc->num_move_spr_root] = 0.0; mcmc->move_prob[mcmc->num_move_tree_rates] = 0.0; mcmc->move_prob[mcmc->num_move_subtree_rates] = 0.0; mcmc->move_prob[mcmc->num_move_updown_nu_cr] = 0.0; mcmc->move_prob[mcmc->num_move_ras] = 1.0; mcmc->move_prob[mcmc->num_move_updown_t_cr] = 0.0; /* Does not seem to work well (does not give uniform prior on root height when sampling from prior) */ mcmc->move_prob[mcmc->num_move_cov_rates] = 0.0; mcmc->move_prob[mcmc->num_move_cov_switch] = 0.0; mcmc->move_prob[mcmc->num_move_birth_rate] = 0.0; mcmc->move_prob[mcmc->num_move_death_rate] = 0.0; mcmc->move_prob[mcmc->num_move_birth_death_updown] = 0.0; mcmc->move_prob[mcmc->num_move_updown_t_br] = 1.0; #if defined (INVITEE) mcmc->move_prob[mcmc->num_move_jump_calibration] = 0.0; #else mcmc->move_prob[mcmc->num_move_jump_calibration] = 0.0; #endif mcmc->move_prob[mcmc->num_move_geo_lambda] = 0.0; mcmc->move_prob[mcmc->num_move_geo_sigma] = 0.0; mcmc->move_prob[mcmc->num_move_geo_tau] = 0.0; mcmc->move_prob[mcmc->num_move_geo_updown_tau_lbda] = 0.0; mcmc->move_prob[mcmc->num_move_geo_updown_lbda_sigma] = 0.0; mcmc->move_prob[mcmc->num_move_geo_dum] = 0.0; mcmc->move_prob[mcmc->num_move_clade_change] = 0.0; mcmc->move_prob[mcmc->num_move_rates_shrink] = 1.0; mcmc->move_prob[mcmc->num_move_obs_var] = 1.0; # if defined (PHYREX) mcmc->move_prob[mcmc->num_move_phyrex_lbda] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_mu] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_rad] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_sigsq] = 2.0; mcmc->move_prob[mcmc->num_move_time_neff] = 0.5; mcmc->move_prob[mcmc->num_move_time_neff_growth] = 0.5; mcmc->move_prob[mcmc->num_move_phyrex_sigsq_scale] = 0.5; mcmc->move_prob[mcmc->num_move_phyrex_indel_disk] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_indel_hit] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_move_disk_ud] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_swap_disk] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_spr] = 0.0; /* Obsolete. Won't work with Exchange_Ldsks and Exchange_Nodes functions */ mcmc->move_prob[mcmc->num_move_phyrex_spr_slide] = 0.0; /* Same here */ mcmc->move_prob[mcmc->num_move_phyrex_narrow_exchange] = 4.0; mcmc->move_prob[mcmc->num_move_phyrex_wide_exchange] = 4.0; mcmc->move_prob[mcmc->num_move_phyrex_scale_times] = 2.0; mcmc->move_prob[mcmc->num_move_phyrex_ldscape_lim] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_sim] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_traj] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_sim_plus] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_indel_disk_serial] = 2.0; mcmc->move_prob[mcmc->num_move_phyrex_indel_hit_serial] = 2.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_given_disk] = 6.0; mcmc->move_prob[mcmc->num_move_phyrex_disk_given_ldsk] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_and_disk] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_multi] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_disk_multi] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_add_remove_jump] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_tip_to_root] = 6.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_tips] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_node_times] = 4.0; mcmc->move_prob[mcmc->num_move_phyrex_node_veloc] = 4.0; mcmc->move_prob[mcmc->num_move_phyrex_correlated_node_veloc] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_all_veloc] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_shuffle_node_times] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_iwn_omega] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_iou_theta] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_iou_mu] = 1.0; mcmc->move_prob[mcmc->num_move_phyrex_tip_loc] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_iou_theta_sigsq] = 1.0; # else mcmc->move_prob[mcmc->num_move_phyrex_lbda] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_mu] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_rad] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_sigsq] = 0.0; mcmc->move_prob[mcmc->num_move_time_neff] = 0.0; mcmc->move_prob[mcmc->num_move_time_neff_growth] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_indel_disk] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_indel_hit] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_move_disk_ud] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_swap_disk] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_spr] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_spr_slide] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_narrow_exchange] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_wide_exchange] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_scale_times] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_ldscape_lim] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_sim] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_traj] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_sim_plus] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_indel_disk_serial] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_indel_hit_serial] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_given_disk] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_disk_given_ldsk] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_and_disk] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_multi] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_disk_multi] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_add_remove_jump] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_tip_to_root] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_sigsq_scale] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_ldsk_tips] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_node_times] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_node_veloc] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_correlated_node_veloc] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_all_veloc] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_shuffle_node_times] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_iwn_omega] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_iou_theta] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_iou_mu] = 0.0; mcmc->move_prob[mcmc->num_move_rates_shrink] = 0.0; mcmc->move_prob[mcmc->num_move_obs_var] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_tip_loc] = 0.0; mcmc->move_prob[mcmc->num_move_phyrex_iou_theta_sigsq] = 0.0; #endif sum = 0.0; for(i=0;in_moves;i++) sum += mcmc->move_prob[i]; for(i=0;in_moves;i++) mcmc->move_prob[i] /= sum; for(i=1;in_moves;i++) mcmc->move_weight[i] = mcmc->move_weight[i-1] + mcmc->move_prob[i]; for(i=0;in_moves;i++) mcmc->start_ess[i] = YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) int MCMC_Run(t_tree *tree) { t_mcmc *mcmc; int i; mcmc = MCMC_Preprocess(tree); Set_Both_Sides(NO,tree); do { /* MIXT_Propagate_Tree_Update(tree); */ if(mcmc->run > mcmc->chain_len_burnin) for(i=0;in_moves;i++) mcmc->adjust_tuning[i] = NO; else { for(i=0;in_moves;i++) mcmc->adjust_tuning[i] = YES; tree->mcmc->is_burnin = NO; } MCMC_Run_Core(tree); PHYREX_Check_Lk(tree); MCMC_Get_Acc_Rates(mcmc); (void)signal(SIGINT,MCMC_Terminate); } while(mcmc->run < mcmc->chain_len); PhyML_Fprintf(stdout,"\n. The analysis completed !"); return(1); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) t_mcmc *MCMC_Preprocess(t_tree *tree) { t_mcmc *mcmc; mcmc = NULL; if(tree->io->mcmc == NULL) { mcmc = MCMC_Make_MCMC_Struct(); tree->mcmc = mcmc; } else { tree->mcmc = tree->io->mcmc; mcmc = tree->mcmc; } mcmc->is_burnin = YES; mcmc->nd_t_digits = 1; MCMC_Complete_MCMC(mcmc,tree); MIXT_Set_Bl_From_Rt(YES,tree); PHYREX_Update_Ldsk_Rates_Given_Edges(tree); PHYREX_Update_Ldsk_Sigsq_Given_Edges(tree); Set_Update_Eigen(YES,tree->mod); RATES_Update_Edge_Lengths(tree); Lk(NULL,tree); Set_Update_Eigen(NO,tree->mod); RATES_Lk(tree); TIMES_Lk(tree); LOCATION_Lk(NULL,tree); if(isnan(tree->c_lnL) || isinf(tree->c_lnL)) { PhyML_Fprintf(stderr,"\n. Cannot compute sequence log-likelihood. Aborting."); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } if(isnan(tree->mmod->c_lnL) || isinf(tree->mmod->c_lnL)) { PhyML_Fprintf(stderr,"\n. Cannot compute location log-likelihood. Aborting."); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); return(mcmc); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Run_Core(t_tree *tree) { phydbl u; int move; u = Uni(); for(move=0;movemcmc->n_moves;move++) if(tree->mcmc->move_weight[move] > u-1.E-10) break; tree->mcmc->move_idx = move; assert(!(move == tree->mcmc->n_moves)); /* PhyML_Printf("\n. Move: %s tree->mmod->c_lnL: %f tree->c_lnL: %f", */ /* tree->mcmc->move_name[move], */ /* tree->mmod->c_lnL, */ /* tree->c_lnL, */ /* tree->rates->c_lnL, */ /* tree->times->c_lnL); */ if(!strcmp(tree->mcmc->move_name[move],"nu")) MCMC_Nu(tree); if(!strcmp(tree->mcmc->move_name[move],"br_rate")) MCMC_Rates_All(tree); if(!strcmp(tree->mcmc->move_name[move],"rates_shrink")) MCMC_Rates_Shrink(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_lbda")) MCMC_PHYREX_Lbda(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_mu")) MCMC_PHYREX_Mu(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_rad")) MCMC_PHYREX_Radius(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_sigsq")) MCMC_PHYREX_Sigsq(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_neff")) MCMC_PHYREX_Neff(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_neff_growth")) MCMC_PHYREX_Neff_Growth(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_indel_disk")) MCMC_PHYREX_Indel_Disk(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_indel_hit")) MCMC_PHYREX_Indel_Hit(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_move_disk_ud")) MCMC_PHYREX_Move_Disk_Updown(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_swap_disk")) MCMC_PHYREX_Swap_Disk(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_scale_times")) MCMC_PHYREX_Scale_Times(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_spr")) MCMC_PHYREX_Prune_Regraft(tree,YES); if(!strcmp(tree->mcmc->move_name[move],"phyrex_spr_slide")) MCMC_PHYREX_Prune_Regraft_Slide(tree,YES); if(!strcmp(tree->mcmc->move_name[move],"phyrex_narrow_exchange")) MCMC_PHYREX_Narrow_Exchange(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_wide_exchange")) MCMC_PHYREX_Wide_Exchange(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_traj")) MCMC_PHYREX_Lineage_Traj(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_disk_multi")) MCMC_PHYREX_Disk_Multi(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_ldsk_multi")) MCMC_PHYREX_Ldsk_Multi(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_ldsk_and_disk")) MCMC_PHYREX_Ldsk_And_Disk(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_ldsk_tip_to_root")) MCMC_PHYREX_Ldsk_Tip_To_Root(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_ldsk_given_disk")) MCMC_PHYREX_Ldsk_Given_Disk(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_disk_given_ldsk")) MCMC_PHYREX_Disk_Given_Ldsk(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_indel_disk_serial")) MCMC_PHYREX_Indel_Disk_Serial(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_indel_hit_serial")) MCMC_PHYREX_Indel_Hit_Serial(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_add_remove_jump")) MCMC_PHYREX_Add_Remove_Jump(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_sigsq_scale")) MCMC_PHYREX_Sigsq_Scale(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_node_times")) MCMC_PHYREX_Node_Times(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_shuffle_node_times")) MCMC_PHYREX_Shuffle_Node_Times(tree,NO); if(!strcmp(tree->mcmc->move_name[move],"phyrex_node_veloc")) MCMC_PHYREX_Node_Velocity(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_corr_node_veloc")) MCMC_PHYREX_Correlated_Node_Velocity(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_all_veloc")) MCMC_PHYREX_All_Velocities(tree); if(!strcmp(tree->mcmc->move_name[move],"kappa")) MCMC_Kappa(tree); if(!strcmp(tree->mcmc->move_name[move],"rr")) MCMC_RR(tree); if(!strcmp(tree->mcmc->move_name[move],"ras")) MCMC_Rate_Across_Sites(tree); if(!strcmp(tree->mcmc->move_name[move],"clock")) MCMC_Clock_R(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_iwn_omega")) MCMC_PHYREX_IWN_Update_Omega(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_iou_theta")) MCMC_PHYREX_IOU_Update_Theta(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_iou_theta_sigsq")) MCMC_PHYREX_IOU_Update_Theta_Sigsq(tree); if(!strcmp(tree->mcmc->move_name[move],"phyrex_iou_mu")) MCMC_PHYREX_IOU_Update_Mu(tree); if(!strcmp(tree->mcmc->move_name[move],"updown_t_br")) MCMC_Updown_T_Br(tree); if(!strcmp(tree->mcmc->move_name[move],"observational_var")) MCMC_Obs_Var(tree); if(tree->mmod->c_lnL < UNLIKELY || tree->c_lnL < UNLIKELY || tree->rates->c_lnL < UNLIKELY || tree->times->c_lnL < UNLIKELY) { PhyML_Printf("\n. Move: %s tree->mmod->c_lnL: %f tree->c_lnL: %f", tree->mcmc->move_name[move], tree->mmod->c_lnL, tree->c_lnL, tree->rates->c_lnL, tree->times->c_lnL); assert(FALSE); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Copy_To_New_Param_Val(t_mcmc *mcmc, t_tree *tree) { mcmc->sampled_val[mcmc->num_move_nu*mcmc->sample_size+mcmc->sample_num] = tree->rates->nu; mcmc->sampled_val[mcmc->num_move_clock_r*mcmc->sample_size+mcmc->sample_num] = tree->rates->clock_r; mcmc->sampled_val[mcmc->num_move_tree_height*mcmc->sample_size+mcmc->sample_num] = tree->times->nd_t[tree->n_root->num]; mcmc->sampled_val[mcmc->num_move_kappa*mcmc->sample_size+mcmc->sample_num] = tree->mod ? tree->mod->kappa->v : -1.; mcmc->sampled_val[mcmc->num_move_birth_rate*mcmc->sample_size+mcmc->sample_num] = tree->times->birth_rate; mcmc->sampled_val[mcmc->num_move_death_rate*mcmc->sample_size+mcmc->sample_num] = tree->times->death_rate; /* For(i,2*tree->n_otu-2) */ /* mcmc->sampled_val[(mcmc->num_move_br_r+i)*mcmc->sample_size+mcmc->sample_num] = tree->rates->br_r[i]; */ /* For(i,2*tree->n_otu-1) */ /* mcmc->sampled_val[(mcmc->num_move_nd_r+i)*mcmc->sample_size+mcmc->sample_num] = tree->rates->nd_r[i]; */ mcmc->sampled_val[mcmc->num_move_geo_tau*mcmc->sample_size+mcmc->sample_num] = tree->geo ? tree->geo->tau : -1.; mcmc->sampled_val[mcmc->num_move_geo_lambda*mcmc->sample_size+mcmc->sample_num] = tree->geo ? tree->geo->lbda : -1.; mcmc->sampled_val[mcmc->num_move_geo_sigma*mcmc->sample_size+mcmc->sample_num] = tree->geo ? tree->geo->sigma : -1.; mcmc->sampled_val[mcmc->num_move_geo_dum*mcmc->sample_size+mcmc->sample_num] = tree->geo ? tree->geo->dum : -1.; #ifdef PHYREX mcmc->sampled_val[mcmc->num_move_phyrex_lbda*mcmc->sample_size+mcmc->sample_num] = tree->mmod ? tree->mmod->lbda : -1.; mcmc->sampled_val[mcmc->num_move_phyrex_mu*mcmc->sample_size+mcmc->sample_num] = tree->mmod ? SLFV_Neighborhood_Size(tree) : -1.; mcmc->sampled_val[mcmc->num_move_phyrex_sigsq*mcmc->sample_size+mcmc->sample_num] = tree->mmod ? SLFV_Update_Sigsq(tree) : -1.; mcmc->sampled_val[mcmc->num_move_phyrex_rad*mcmc->sample_size+mcmc->sample_num] = tree->mmod ? tree->mmod->rad : -1.; #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME) void MCMC_Slice_One_Rate(t_node *a, t_node *d, int traversal, t_tree *tree) { phydbl L,R; /* Left and Right limits of the slice */ phydbl w; /* window width */ phydbl u; phydbl x0,x1; phydbl logy; t_edge *b; int i; b = NULL; if(a == tree->n_root) b = tree->e_root; else for(i=0;i<3;i++) if(d->v[i] == a) { b = d->b[i]; break; } w = 0.05; /* w = 10.; */ x0 = tree->rates->br_r[d->num]; logy = tree->c_lnL+tree->rates->c_lnL - Rexp(1.); u = Uni(); L = x0 - w*u; R = L + w; do { tree->rates->br_r[d->num] = L; tree->rates->br_do_updt[d->num] = YES; RATES_Update_Edge_Lengths(tree); Lk(b,tree); RATES_Lk(tree); if(L < tree->rates->min_rate) { L = tree->rates->min_rate - w; break;} L = L - w; } while(tree->c_lnL + tree->rates->c_lnL > logy); L = L + w; do { tree->rates->br_r[d->num] = R; tree->rates->br_do_updt[d->num] = YES; RATES_Update_Edge_Lengths(tree); Lk(b,tree); RATES_Lk(tree); if(R > tree->rates->max_rate) { R = tree->rates->max_rate + w; break;} R = R + w; } while(tree->c_lnL + tree->rates->c_lnL > logy); R = R - w; for(;;) { u = Uni(); x1 = L + u*(R-L); tree->rates->br_r[d->num] = x1; tree->rates->br_do_updt[d->num] = YES; RATES_Update_Edge_Lengths(tree); Lk(b,tree); RATES_Lk(tree); if(tree->c_lnL + tree->rates->c_lnL > logy) break; if(x1 < x0) L = x1; else R = x1; } #if (defined PHYREX) PHYREX_Update_Ldsk_Rates_Given_Edges(tree); #endif if(traversal == YES) { if(d->tax == YES) return; else { for(i=0;i<3;i++) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(tree->io->lk_approx == EXACT) Update_Partial_Lk(tree,d->b[i],d); MCMC_Slice_One_Rate(d,d->v[i],YES,tree); } } if(tree->io->lk_approx == EXACT) Update_Partial_Lk(tree,b,d); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Make_Move(phydbl *cur, phydbl *new, phydbl inf, phydbl sup, phydbl *loghr, phydbl tune, int move_type) { phydbl u; switch(move_type) { case MCMC_MOVE_RANDWALK_NORMAL: { *new = *cur + Rnorm(0.0,tune); /* Do not use reflection here */ *loghr = 0.0; break; } case MCMC_MOVE_RANDWALK_UNIFORM: { u = Uni(); /* *new = u * (2.*tune) + (*cur) - tune; */ /* *new = Reflect(*new,inf,sup); */ *new = u*(sup-inf)+inf; *loghr = 0.0; break; } case MCMC_MOVE_SCALE_THORNE: { u = Uni(); *new = (*cur) * exp(tune*(u-.5)); *loghr = log((*new)/(*cur)); break; } case MCMC_MOVE_SCALE_GAMMA: { phydbl r; *new = (*cur) * Rgamma(1./tune,tune); r = (*new)/(*cur); *loghr = -log(r) + log(Dgamma(1./r,1./tune,tune)/Dgamma(r,1./tune,tune)); break; } default : { PhyML_Printf("\n. Move not implemented"); Exit(""); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Read_Param_Vals(t_tree *tree) { char *token; int sizemax; FILE *in_fp; phydbl val; int i; in_fp = tree->mcmc->in_fp_par; sizemax = T_MAX_LINE; token = (char *)mCalloc(sizemax,sizeof(char)); if(fgets(token,sizemax,in_fp) == NULL) // Skip first line { PhyML_Fprintf(stderr,"\n. Wrong file format."); assert(FALSE); } if(fgets(token,sizemax,in_fp) == NULL) // Skip second { PhyML_Fprintf(stderr,"\n. Wrong file format."); assert(FALSE); } fscanf(in_fp,"%lf\t",&val); // Run /* PhyML_Printf("\n. Run = %d",(int)val); */ fscanf(in_fp,"%lf\t",&val); // LnLike[Exact] /* PhyML_Printf("\n. LnLike = %f",val); */ fscanf(in_fp,"%lf\t",&val); // LnLike[Approx] /* PhyML_Printf("\n. LnLike = %f",val); */ fscanf(in_fp,"%lf\t",&val); // LnPriorRate /* PhyML_Printf("\n. LnPrior = %f",val); */ fscanf(in_fp,"%lf\t",&val); // LnPriorTime /* PhyML_Printf("\n. LnPrior = %f",val); */ fscanf(in_fp,"%lf\t",&val); // LnPosterior /* PhyML_Printf("\n. LnPost = %f",val); */ fscanf(in_fp,"%lf\t",&val); // ClockRate tree->rates->clock_r = val; /* PhyML_Printf("\n. Clock = %f",val); */ fscanf(in_fp,"%lf\t",&val); // EvolRate fscanf(in_fp,"%lf\t",&val); // Nu tree->rates->nu = val; /* PhyML_Printf("\n. Nu = %f",val); */ fscanf(in_fp,"%lf\t",&val); // Birth rate tree->times->birth_rate = val; fscanf(in_fp,"%lf\t",&val); // TsTv tree->mod->kappa->v = val; /* PhyML_Printf("\n. TsTv = %f",val); */ for(i=0;in_otu-1;i++) { fscanf(in_fp,"%lf\t",&val); // Node heights tree->times->nd_t[i+tree->n_otu] = val; } for(i=0;i<2*tree->n_otu-2;++i) { fscanf(in_fp,"%lf\t",&val); // Edge average rates tree->rates->br_r[i] = log(val); } Free(token); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef PHYREX void MCMC_PHYREX_Lbda(t_tree *tree) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) { MCMC_Single_Param_Generic(&(tree->mmod->lbda), tree->mmod->min_lbda, tree->mmod->max_lbda, tree->mcmc->num_move_phyrex_lbda, NULL,&(tree->mmod->c_lnL), NULL,(tree->eval_glnL == YES) ? PHYREX_Wrap_Lk : NULL, tree->mcmc->move_type[tree->mcmc->num_move_phyrex_lbda], NO,NO,NULL,tree,NULL); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef PHYREX void MCMC_PHYREX_Mu(t_tree *tree) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) { MCMC_Single_Param_Generic(&(tree->mmod->mu), tree->mmod->min_mu, tree->mmod->max_mu, tree->mcmc->num_move_phyrex_mu, NULL,&(tree->mmod->c_lnL), NULL,(tree->eval_glnL == YES) ? PHYREX_Wrap_Lk : NULL, tree->mcmc->move_type[tree->mcmc->num_move_phyrex_mu], NO,NO,NULL,tree,NULL); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef PHYREX void MCMC_PHYREX_Radius(t_tree *tree) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) { MCMC_Single_Param_Generic(&(tree->mmod->rad), tree->mmod->min_rad, tree->mmod->max_rad, tree->mcmc->num_move_phyrex_rad, NULL,&(tree->mmod->c_lnL), NULL,(tree->eval_glnL == YES) ? PHYREX_Wrap_Lk : NULL, tree->mcmc->move_type[tree->mcmc->num_move_phyrex_rad], NO,NO,NULL,tree,NULL); } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Exchange algorithm (Murray et al. 2006, Moller et al. 2006) coupled to MH-within-MH // technique (Liang 2012) for getting samples from the dispersal parameter under the // "survey scheme" for sampling. #ifdef PHYREX void MCMC_PHYREX_Sigsq(t_tree *tree, int print) { if(RRW_Is_Rw(tree->mmod) == YES && tree->mmod->sampling_scheme == SPATIAL_SAMPLING_SURVEY) { phydbl cur_sigsq,new_sigsq; phydbl cur_glnL,new_glnL; phydbl cur_glnP,new_glnP; phydbl cur_glnL_aux,new_glnL_aux; // log-likelihoods for auxiliary RV phydbl u,alpha,ratio; phydbl K,hr; phydbl neff_orig; int dim_idx; t_tree *aux_tree; cur_sigsq = -1.0; new_sigsq = -1.0; ratio = 0.0; aux_tree = tree->aux_tree[0]; neff_orig = tree->times->scaled_pop_size; hr = 0.0; /* Perform small jumps in order to facilitate convergence of inner sampler */ K = 0.1; dim_idx = Rand_Int(0,tree->mmod->n_dim-1); Set_Lk(tree); Set_Prior(tree); cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_glnP = tree->mmod->c_lnP; new_glnP = UNLIKELY; cur_glnL_aux = UNLIKELY; new_glnL_aux = UNLIKELY; cur_sigsq = tree->mmod->sigsq[dim_idx]; hr = 0.0; MCMC_Make_Move(&cur_sigsq, &new_sigsq, tree->mmod->min_sigsq, tree->mmod->max_sigsq, &hr,K, tree->mcmc->move_type[tree->mcmc->num_move_phyrex_sigsq]); if(new_sigsq < tree->mmod->max_sigsq && new_sigsq > tree->mmod->min_sigsq) { tree->mmod->sigsq[dim_idx] = new_sigsq; new_glnL = LOCATION_Lk(NULL,tree); new_glnP = LOCATION_Prior(tree); TIMES_Lk(tree); if(tree->mcmc->run_move[tree->mcmc->num_move_phyrex_sigsq] >= 0) { for(int i=0;immod->n_dim;++i) aux_tree->mmod->sigsq[i] = tree->mmod->sigsq[i]; aux_tree->mmod->sigsq[dim_idx] = new_sigsq; for(int i=0;i<2*aux_tree->n_otu-2;++i) aux_tree->mmod->sigsq_scale[i] = tree->mmod->sigsq_scale[i]; aux_tree->times->scaled_pop_size = tree->times->scaled_pop_size; aux_tree->times->neff_growth = tree->times->neff_growth; TIMES_Lk(aux_tree); LOCATION_Lk(NULL,aux_tree); if(aux_tree->times->c_lnL < UNLIKELY || aux_tree->mmod->c_lnL < UNLIKELY) { tree->mmod->sigsq[dim_idx] = cur_sigsq; Reset_Lk(tree); Reset_Prior(tree); return; } MCMC_PHYREX_Exchange_Core(aux_tree,tree,NO); aux_tree->mmod->sigsq[dim_idx] = new_sigsq; new_glnL_aux = LOCATION_Lk(NULL,aux_tree); aux_tree->mmod->sigsq[dim_idx] = cur_sigsq; cur_glnL_aux = LOCATION_Lk(NULL,aux_tree); if(Are_Equal(aux_tree->times->scaled_pop_size,neff_orig,1.E-5) == FALSE) { PhyML_Printf("\n. aux_tree->times->scaled_pop_size=%f neff_orig=%f",aux_tree->times->scaled_pop_size,neff_orig); assert(false); } } } ratio = 0.0; ratio += (new_glnL - cur_glnL); ratio += (new_glnP - cur_glnP); ratio += (cur_glnL_aux - new_glnL_aux); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* if(print == YES) */ /* PhyML_Printf("\n. SIGSQ lnL: %f->%f lnP: %f->%f aux: %f->%f T: %f hr: %f alpha: %f", */ /* cur_glnL,new_glnL, */ /* new_glnP,cur_glnP, */ /* new_glnL_aux,cur_glnL_aux, */ /* aux_tree->n_root->ldsk->disk->time, */ /* hr,alpha); */ u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->mmod->sigsq[dim_idx] = cur_sigsq; Reset_Lk(tree); Reset_Prior(tree); } else { /* PhyML_Printf(" accept"); */ tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_sigsq]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); tree->mcmc->run_move[tree->mcmc->num_move_phyrex_sigsq]++; } else if((RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) && tree->mmod->sampling_scheme == SPATIAL_SAMPLING_DETECTION) { phydbl cur_sigsq,new_sigsq; phydbl min_sigsq,max_sigsq; phydbl cur_glnL,new_glnL; phydbl cur_glnP,new_glnP; phydbl u,alpha,ratio,hr; phydbl K; int dim_idx; ratio = 0.0; /* K = 1.0; */ K = tree->mcmc->tune_move[tree->mcmc->num_move_phyrex_sigsq]; min_sigsq = tree->mmod->min_sigsq; max_sigsq = tree->mmod->max_sigsq; dim_idx = Rand_Int(0,tree->mmod->n_dim-1); Set_Lk(tree); Set_Prior(tree); cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_glnP = tree->mmod->c_lnP; new_glnP = UNLIKELY; cur_sigsq = tree->mmod->sigsq[dim_idx]; new_sigsq = tree->mmod->sigsq[dim_idx]; hr = 0.0; MCMC_Make_Move(&cur_sigsq,&new_sigsq,min_sigsq,max_sigsq,&hr,K,tree->mcmc->move_type[tree->mcmc->num_move_phyrex_sigsq]); if(new_sigsq < max_sigsq && new_sigsq > min_sigsq) { tree->mmod->sigsq[dim_idx] = new_sigsq; new_glnL = LOCATION_Lk(NULL,tree); new_glnP = LOCATION_Prior(tree); } ratio = 0.0; ratio += (new_glnL - cur_glnL); ratio += (new_glnP - cur_glnP); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); // print = YES; if(print == YES) PhyML_Printf("\n. SIGSQ glnL: %f->%f glnP: %f->%f sigsq: %f %f alpha: %f %d", cur_glnL,new_glnL, cur_glnP,new_glnP, tree->mmod->sigsq[0],tree->mmod->sigsq[1], alpha, dim_idx); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { // if(print == YES) PhyML_Printf(" reject"); tree->mmod->sigsq[dim_idx] = cur_sigsq; Reset_Lk(tree); Reset_Prior(tree); } else { // if(print == YES) PhyML_Printf(" accept"); tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_sigsq]++; } tree->mcmc->run_move[tree->mcmc->num_move_phyrex_sigsq]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Sigsq_Scale(t_tree *tree, int print) { int i,n_changes,*permut; phydbl m; phydbl cur_lnL_geo,new_lnL_geo; phydbl cur_lnP_geo,new_lnP_geo; phydbl cur_lnL_geo_aux,new_lnL_geo_aux; phydbl cur_lnP_geo_aux,new_lnP_geo_aux; phydbl cur_scale,new_scale; phydbl alpha,ratio,u,K,hr; phydbl *sigsq_scale_bkp; t_tree *aux_tree; short int serial; if(tree->mmod->use_locations == NO) return; if(tree->mmod->model_id == RW || tree->mmod->model_id == IBM || tree->mmod->model_id == IWNc || tree->mmod->model_id == IWNu || tree->mmod->model_id == IOU) return; serial = YES; if(serial == NO) { tree->mcmc->run_move[tree->mcmc->num_move_phyrex_sigsq_scale]++; sigsq_scale_bkp = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); /* K = 10.0/tree->n_otu; // Small so as to facilitate convergence of exchange algo */ if(tree->mmod->sampling_scheme == SPATIAL_SAMPLING_SURVEY) { K = 0.1; n_changes = (int)(1. + 0.05*tree->n_otu); // Same here } else { K = 0.5; n_changes = (int)(1. + 0.2*tree->n_otu); // Same here } hr = 0.0; aux_tree = NULL; Set_Lk(tree); Set_Prior(tree); cur_lnL_geo = tree->mmod->c_lnL; new_lnL_geo = UNLIKELY; cur_lnP_geo = tree->mmod->c_lnP; new_lnP_geo = UNLIKELY; cur_lnP_geo_aux = UNLIKELY; new_lnP_geo_aux = UNLIKELY; cur_lnL_geo_aux = UNLIKELY; new_lnL_geo_aux = UNLIKELY; for(i=0;i<2*tree->n_otu-1;++i) sigsq_scale_bkp[i] = tree->mmod->sigsq_scale[i]; permut = Permutate(2*tree->n_otu-1); for(i=0;immod->sigsq_scale[permut[i]]; m = exp(K*(Uni()-.5)); new_scale = m * cur_scale; hr += log(m); if(new_scale < tree->mmod->sigsq_scale_min || new_scale > tree->mmod->sigsq_scale_max) break; tree->mmod->sigsq_scale[permut[i]] = new_scale; } Free(permut); if(i == n_changes) { if(tree->mmod->sampling_scheme == SPATIAL_SAMPLING_SURVEY) { aux_tree = tree->aux_tree[0]; for(i=0;immod->n_dim;++i) aux_tree->mmod->sigsq[i] = tree->mmod->sigsq[i]; for(i=0;i<2*aux_tree->n_otu-1;++i) aux_tree->mmod->sigsq_scale[i] = tree->mmod->sigsq_scale[i]; aux_tree->times->scaled_pop_size = tree->times->scaled_pop_size; aux_tree->times->neff_growth = tree->times->neff_growth; TIMES_Lk(aux_tree); LOCATION_Lk(NULL,aux_tree); if(aux_tree->times->c_lnL < UNLIKELY || aux_tree->mmod->c_lnL < UNLIKELY) { for(i=0;i<2*aux_tree->n_otu-1;++i) tree->mmod->sigsq_scale[i] = sigsq_scale_bkp[i]; Reset_Lk(tree); Reset_Prior(tree); return; } MCMC_PHYREX_Exchange_Core(aux_tree,tree,NO); for(i=0;i<2*aux_tree->n_otu-1;++i) aux_tree->mmod->sigsq_scale[i] = tree->mmod->sigsq_scale[i]; new_lnL_geo_aux = LOCATION_Lk(NULL,aux_tree); new_lnP_geo_aux = LOCATION_Prior(aux_tree); for(i=0;i<2*aux_tree->n_otu-1;++i) aux_tree->mmod->sigsq_scale[i] = sigsq_scale_bkp[i]; cur_lnL_geo_aux = LOCATION_Lk(NULL,aux_tree); cur_lnP_geo_aux = LOCATION_Prior(aux_tree); } new_lnL_geo = LOCATION_Lk(NULL,tree); new_lnP_geo = LOCATION_Prior(tree); } ratio = 0.0; if(tree->eval_glnL == YES) { ratio += (new_lnL_geo - cur_lnL_geo); ratio += (new_lnP_geo - cur_lnP_geo); ratio += (cur_lnL_geo_aux - new_lnL_geo_aux); ratio += (cur_lnP_geo_aux - new_lnP_geo_aux); } ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); if(print == YES) PhyML_Printf("\n. SIGSQSCAL lnL: %12f->%12f lnP: %12f->%12f lnLaux: %12f->%12f lnPaux: %12f->%12f T: %12f hr: %12f alpha: %12f", cur_lnL_geo,new_lnL_geo, cur_lnP_geo,new_lnP_geo, cur_lnL_geo_aux,new_lnL_geo_aux, cur_lnP_geo_aux,new_lnP_geo_aux, aux_tree ? aux_tree->n_root->ldsk->disk->time : -1., hr,alpha); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_lnL_geo > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { for(i=0;i<2*tree->n_otu-2;++i) tree->mmod->sigsq_scale[i] = sigsq_scale_bkp[i]; Reset_Lk(tree); Reset_Prior(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_sigsq_scale]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); Free(sigsq_scale_bkp); } else { if(tree->mmod->sampling_scheme == SPATIAL_SAMPLING_SURVEY) assert(false); permut = Permutate(2*tree->n_otu-1); for(i=0;i<2*tree->n_otu-1;++i) { tree->mcmc->run_move[tree->mcmc->num_move_phyrex_sigsq_scale]++; Set_Lk(tree); Set_Prior(tree); cur_lnL_geo = tree->mmod->c_lnL; new_lnL_geo = UNLIKELY; cur_lnP_geo = tree->mmod->c_lnP; new_lnP_geo = UNLIKELY; K = 1.0; cur_scale = tree->mmod->sigsq_scale[permut[i]]; m = exp(K*(Uni()-.5)); new_scale = m * cur_scale; hr = log(m); if(new_scale < tree->mmod->sigsq_scale_max && new_scale > tree->mmod->sigsq_scale_min) { tree->mmod->sigsq_scale[permut[i]] = new_scale; ratio = 0.0; if(tree->eval_glnL == YES) { new_lnL_geo = LOCATION_Lk(NULL,tree); new_lnP_geo = LOCATION_Prior(tree); ratio += (new_lnL_geo - cur_lnL_geo); ratio += (new_lnP_geo - cur_lnP_geo); } ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->mmod->sigsq_scale[permut[i]] = cur_scale; Reset_Lk(tree); Reset_Prior(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_sigsq_scale]++; } } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } Free(permut); } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Neff(t_tree *tree, int print) { if(tree->mod->s_opt->opt_neff == NO) return; if(tree->eval_tlnL == NO) return; if(tree->times->model_id == COALESCENT && RRW_Is_Rw(tree->mmod) == YES && VELOC_Is_Integrated_Velocity(tree->mmod) == NO && tree->mmod->sampling_scheme == SPATIAL_SAMPLING_SURVEY) { phydbl cur_neff,new_neff; phydbl cur_lnL,new_lnL; phydbl cur_lnP,new_lnP; phydbl cur_lnL_aux,new_lnL_aux; // log-likelihoods for auxiliary RV phydbl u,alpha,ratio; phydbl K,hr; phydbl sigsq_orig; t_tree *aux_tree; cur_neff = -1.0; new_neff = -1.0; ratio = 0.0; aux_tree = tree->aux_tree[0]; sigsq_orig = tree->mmod->sigsq[0]; hr = 0.0; /* n_mcmc_steps = 10; */ /* Perform small jumps in order to facilitate convergence of inner sampler */ K = 0.1; Set_Lk(tree); Set_Prior(tree); cur_lnL = tree->times->c_lnL; new_lnL = UNLIKELY; cur_lnP = tree->times->c_lnP; new_lnP = UNLIKELY; cur_lnL_aux = UNLIKELY; new_lnL_aux = UNLIKELY; cur_neff = tree->times->scaled_pop_size; MCMC_Make_Move(&cur_neff, &new_neff, tree->times->scaled_pop_size_min, tree->times->scaled_pop_size_max, &hr,K, tree->mcmc->move_type[tree->mcmc->num_move_time_neff]); if(new_neff < tree->times->scaled_pop_size_max && new_neff > tree->times->scaled_pop_size_min) { tree->times->scaled_pop_size = new_neff; new_lnL = TIMES_Lk(tree); new_lnP = TIMES_Prior(tree); if(tree->mcmc->run_move[tree->mcmc->num_move_time_neff] >= 0) { for(int i=0;immod->n_dim;++i) aux_tree->mmod->sigsq[i] = tree->mmod->sigsq[i]; sigsq_orig = aux_tree->mmod->sigsq[0]; for(int i=0;i<2*aux_tree->n_otu-2;++i) aux_tree->mmod->sigsq_scale[i] = tree->mmod->sigsq_scale[i]; aux_tree->times->scaled_pop_size = new_neff; aux_tree->times->neff_growth = tree->times->neff_growth; TIMES_Lk(aux_tree); LOCATION_Lk(NULL,aux_tree); if(aux_tree->times->c_lnL < UNLIKELY || aux_tree->mmod->c_lnL < UNLIKELY) { tree->times->scaled_pop_size = cur_neff; Reset_Lk(tree); Reset_Prior(tree); return; } MCMC_PHYREX_Exchange_Core(aux_tree,tree,NO); aux_tree->times->scaled_pop_size = new_neff; new_lnL_aux = TIMES_Lk(aux_tree); aux_tree->times->scaled_pop_size = cur_neff; cur_lnL_aux = TIMES_Lk(aux_tree); assert(Are_Equal(aux_tree->mmod->sigsq[0],sigsq_orig,1.E-5)); } } ratio = 0.0; ratio += (new_lnL - cur_lnL); ratio += (new_lnP - cur_lnP); ratio += (cur_lnL_aux - new_lnL_aux); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); if(print == YES) PhyML_Printf("\n. Ne %15f->%15f lnL: %12.2f->%12.2f lnP: %12.2f->%12.2f aux: %12.2f->%12.2f T: %12f hr: %12f alpha: %12f", cur_neff,new_neff, cur_lnL,new_lnL, new_lnP,cur_lnP, new_lnL_aux,cur_lnL_aux, aux_tree->n_root->ldsk->disk->time, hr,alpha); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->times->scaled_pop_size = cur_neff; Reset_Lk(tree); Reset_Prior(tree); } else { /* PhyML_Printf(" accept"); */ tree->mcmc->acc_move[tree->mcmc->num_move_time_neff]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); tree->mcmc->run_move[tree->mcmc->num_move_time_neff]++; } else if(tree->times->model_id == COALESCENT && (RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) && tree->mmod->sampling_scheme == SPATIAL_SAMPLING_DETECTION) { phydbl cur_Ne,new_Ne; phydbl min_Ne,max_Ne; phydbl cur_tlnL,new_tlnL; phydbl cur_tlnP,new_tlnP; phydbl u,alpha,ratio,hr; phydbl K; ratio = 0.0; K = 0.1; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; cur_tlnP = tree->times->c_lnP; new_tlnP = UNLIKELY; cur_Ne = tree->times->scaled_pop_size; new_Ne = tree->times->scaled_pop_size; min_Ne = tree->times->scaled_pop_size_min; max_Ne = tree->times->scaled_pop_size_max; Set_Lk(tree); Set_Prior(tree); hr = 0.0; MCMC_Make_Move(&cur_Ne,&new_Ne,min_Ne,max_Ne,&hr,K,tree->mcmc->move_type[tree->mcmc->num_move_time_neff]); if(new_Ne < max_Ne && new_Ne > min_Ne) { tree->times->scaled_pop_size = new_Ne; new_tlnL = TIMES_Lk(tree); new_tlnP = TIMES_Prior(tree); } ratio = 0.0; ratio += (new_tlnL - cur_tlnL); ratio += (new_tlnP - cur_tlnP); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); if(print == YES) PhyML_Printf("\n. Ne %12f->%12f -- lnL: %12f->%12f %12f->%12f [T: %f] alpha: %f", cur_Ne,new_Ne, cur_tlnL,new_tlnL, cur_tlnP,new_tlnP, tree->n_root->ldsk->disk->time, alpha); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->times->scaled_pop_size = cur_Ne; Reset_Lk(tree); Reset_Prior(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_time_neff]++; } tree->mcmc->run_move[tree->mcmc->num_move_time_neff]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Neff_Growth(t_tree *tree, int print) { if(tree->eval_tlnL == NO) return; if(tree->times->model_id == COALESCENT && (tree->times->coalescent_model_id == EXPCOALESCENT || tree->times->coalescent_model_id == POWLAW) && RRW_Is_Rw(tree->mmod) == YES && VELOC_Is_Integrated_Velocity(tree->mmod) == NO && tree->mmod->sampling_scheme == SPATIAL_SAMPLING_SURVEY) { phydbl cur_growth,new_growth; phydbl cur_lnL,new_lnL; phydbl cur_lnP,new_lnP; phydbl cur_lnL_aux,new_lnL_aux; // log-likelihoods for auxiliary RV phydbl u,alpha,ratio; phydbl K,hr; t_tree *aux_tree; cur_growth = -1.0; new_growth = -1.0; ratio = 0.0; aux_tree = tree->aux_tree[0]; hr = 0.0; /* Perform small jumps in order to facilitate convergence of inner sampler */ K = 0.01; Set_Lk(tree); Set_Prior(tree); cur_lnL = tree->times->c_lnL; new_lnL = UNLIKELY; cur_lnP = tree->times->c_lnP; new_lnP = UNLIKELY; cur_lnL_aux = UNLIKELY; new_lnL_aux = UNLIKELY; cur_growth = tree->times->neff_growth; MCMC_Make_Move(&cur_growth, &new_growth, tree->times->neff_growth_min, tree->times->neff_growth_max, &hr,K, tree->mcmc->move_type[tree->mcmc->num_move_time_neff_growth]); if(new_growth < tree->times->neff_growth_max && new_growth > tree->times->neff_growth_min) { tree->times->neff_growth = new_growth; new_lnL = TIMES_Lk(tree); new_lnP = TIMES_Prior(tree); if(tree->mcmc->run_move[tree->mcmc->num_move_time_neff_growth] >= 0) { for(int i=0;immod->n_dim;++i) aux_tree->mmod->sigsq[i] = tree->mmod->sigsq[i]; for(int i=0;i<2*aux_tree->n_otu-2;++i) aux_tree->mmod->sigsq_scale[i] = tree->mmod->sigsq_scale[i]; aux_tree->times->scaled_pop_size = tree->times->scaled_pop_size; aux_tree->times->neff_growth = new_growth; TIMES_Lk(aux_tree); LOCATION_Lk(NULL,aux_tree); if(aux_tree->times->c_lnL < UNLIKELY || aux_tree->mmod->c_lnL < UNLIKELY) { tree->times->neff_growth = cur_growth; Reset_Lk(tree); Reset_Prior(tree); return; } MCMC_PHYREX_Exchange_Core(aux_tree,tree,NO); aux_tree->times->neff_growth = new_growth; new_lnL_aux = TIMES_Lk(aux_tree); aux_tree->times->neff_growth = cur_growth; cur_lnL_aux = TIMES_Lk(aux_tree); } } ratio = 0.0; ratio += (new_lnL - cur_lnL); ratio += (new_lnP - cur_lnP); ratio += (cur_lnL_aux - new_lnL_aux); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); if(print == YES) PhyML_Printf("\n. EXPG lnL: %f->%f lnP: %f->%f aux: %f->%f T: %f hr: %f alpha: %f", cur_lnL,new_lnL, new_lnP,cur_lnP, new_lnL_aux,cur_lnL_aux, aux_tree->n_root->ldsk->disk->time, hr,alpha); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->times->neff_growth = cur_growth; Reset_Lk(tree); Reset_Prior(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_time_neff_growth]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); tree->mcmc->run_move[tree->mcmc->num_move_time_neff_growth]++; } else if(tree->times->model_id == COALESCENT && (tree->times->coalescent_model_id == EXPCOALESCENT || tree->times->coalescent_model_id == POWLAW) && (RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) && tree->mmod->sampling_scheme == SPATIAL_SAMPLING_DETECTION) { phydbl cur_growth,new_growth; phydbl min_growth,max_growth; phydbl cur_tlnL,new_tlnL; phydbl cur_tlnP,new_tlnP; phydbl u,alpha,ratio,hr; phydbl K; ratio = 0.0; K = 0.01; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; cur_tlnP = tree->times->c_lnP; new_tlnP = UNLIKELY; cur_growth = tree->times->neff_growth; new_growth = tree->times->neff_growth; min_growth = tree->times->neff_growth_min; max_growth = tree->times->neff_growth_max; Set_Lk(tree); Set_Prior(tree); hr = 0.0; MCMC_Make_Move(&cur_growth,&new_growth,min_growth,max_growth,&hr,K,tree->mcmc->move_type[tree->mcmc->num_move_time_neff_growth]); if(new_growth < max_growth && new_growth > min_growth) { tree->times->neff_growth = new_growth; new_tlnL = TIMES_Lk(tree); new_tlnP = TIMES_Prior(tree); } ratio = 0.0; ratio += (new_tlnL - cur_tlnL); ratio += (new_tlnP - cur_tlnP); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); if(print == YES) PhyML_Printf("\n. N growth %12f->%12f -- lnL: %12f->%12f %12f->%12f [T: %f] alpha: %f", cur_growth,new_growth, cur_tlnL,new_tlnL, cur_tlnP,new_tlnP, tree->n_root->ldsk->disk->time, alpha); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->times->neff_growth = cur_growth; Reset_Lk(tree); Reset_Prior(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_time_neff_growth]++; } tree->mcmc->run_move[tree->mcmc->num_move_time_neff_growth]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Indel_Disk(t_tree *tree) { int n_disks_cur, n_disks_new; phydbl hr; phydbl cur_lbda,new_lbda; phydbl cur_mu,new_mu; phydbl cur_rad,new_rad; t_dsk *disk; if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) return; if(tree->mmod->use_locations == NO) return; hr = 0.0; new_lbda = tree->mmod->lbda; cur_lbda = tree->mmod->lbda; new_mu = tree->mmod->mu; cur_mu = tree->mmod->mu; new_rad = tree->mmod->rad; cur_rad = tree->mmod->rad; /* new_lbda = cur_lbda * exp(1.0*(Uni()-.5)); */ /* hr += log(new_lbda/cur_lbda); */ /* new_mu = cur_mu * exp(0.5*(Uni()-.5)); */ /* hr += log(new_mu/cur_mu); */ /* new_rad = cur_rad * exp(0.5*(Uni()-.5)); */ /* hr += log(new_rad/cur_rad); */ if(new_rad > tree->mmod->max_rad || new_rad < tree->mmod->min_rad) return; if(new_mu > tree->mmod->max_mu || new_mu < tree->mmod->min_mu) return; if(new_lbda > tree->mmod->max_lbda || new_lbda < tree->mmod->min_lbda) return; tree->mmod->lbda = new_lbda; tree->mmod->mu = new_mu; tree->mmod->rad = new_rad; disk = tree->young_disk->prev; n_disks_cur = 0; do { if(disk->ldsk == NULL && disk->age_fixed == NO) n_disks_cur++; disk = disk->prev; } while(disk); n_disks_new = (int)Rpois(n_disks_cur+SMALL); hr += Dpois(n_disks_cur,n_disks_new+SMALL,YES); hr -= Dpois(n_disks_new,n_disks_cur+SMALL,YES); if(n_disks_new < n_disks_cur) { MCMC_PHYREX_Delete_Disk(hr, n_disks_cur - n_disks_new , cur_lbda, cur_mu, cur_rad, tree); } else { MCMC_PHYREX_Insert_Disk(hr, n_disks_new - n_disks_cur, cur_lbda, cur_mu, cur_rad, tree); } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Insert or delete a disk that does not affect any ldisk */ #ifdef PHYREX void MCMC_PHYREX_Delete_Disk(phydbl hr, int n_delete_disks, phydbl cur_lbda, phydbl cur_mu, phydbl cur_rad, t_tree *tree) { phydbl u,alpha,ratio; phydbl cur_glnL, new_glnL; phydbl cur_tlnL, new_tlnL; phydbl T; t_dsk *disk,**target_disk,**valid_disks; int i,j,block,n_valid_disks,*permut; assert(RRW_Is_Rw(tree->mmod) == NO && VELOC_Is_Integrated_Velocity(tree->mmod) == NO); tree->mcmc->run_move[tree->mcmc->num_move_phyrex_indel_disk]++; if(n_delete_disks == 0) { tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; return; } Set_Lk(tree); valid_disks = NULL; disk = NULL; new_glnL = UNLIKELY; cur_glnL = tree->mmod->c_lnL; new_tlnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; ratio = 0.0; block = 100; disk = tree->young_disk->prev; if(!disk->prev) { tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; return; } n_valid_disks = 0; do { if(!disk->ldsk && disk->age_fixed == NO) { if(!n_valid_disks) valid_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_valid_disks+1)%block)) valid_disks = (t_dsk **)mRealloc(valid_disks,n_valid_disks+block,sizeof(t_dsk *)); valid_disks[n_valid_disks] = disk; n_valid_disks++; } disk = disk->prev; } while(disk && disk->prev); if(!n_valid_disks || (n_valid_disks - n_delete_disks < 0)) { tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; return; } target_disk = (t_dsk **)mCalloc(n_delete_disks,sizeof(t_dsk *)); permut = Permutate(n_valid_disks); for(j=0;jmmod->n_dim;i++) hr += log(1./(tree->mmod->lim_up->lonlat[i]-tree->mmod->lim_do->lonlat[i])); } T = PHYREX_Tree_Height(tree); T = fabs(T-tree->young_disk->time); // Pr(n -> n-k) i.e, denominator hr += LnChoose(n_valid_disks,n_delete_disks); // Pr(n-k -> n) i.e., numerator hr += n_delete_disks * log(1./T); hr += LnFact(n_delete_disks); if(tree->eval_glnL == YES) { new_glnL = LOCATION_Lk(NULL,tree); ratio += (new_glnL - cur_glnL); } if(tree->eval_tlnL == YES) { new_tlnL = TIMES_Lk(tree); ratio += (new_tlnL - cur_tlnL); } ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); /* PhyML_Printf("\n- Delete new_glnL: %f [%f] hr: %f u:%f alpha: %f n_delete: %d [%d %d %f]", */ /* new_glnL,cur_glnL,hr,u,alpha,n_delete_disks, */ /* tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_indel_disk], */ /* tree->mcmc->run_move[tree->mcmc->num_move_phyrex_indel_disk], */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_indel_disk]); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; for(j=0;jmcmc->acc_move[tree->mcmc->num_move_phyrex_indel_disk]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); Free(valid_disks); Free(target_disk); Free(permut); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Insert_Disk(phydbl hr, int n_insert_disks, phydbl cur_lbda, phydbl cur_mu, phydbl cur_rad, t_tree *tree) { t_dsk *disk,**new_disk,**target_disk; phydbl T,t; phydbl cur_glnL, new_glnL; phydbl cur_tlnL, new_tlnL; phydbl u,alpha,ratio; int i,j,n_valid_disks,num_prec_issue; assert(RRW_Is_Rw(tree->mmod) == NO && VELOC_Is_Integrated_Velocity(tree->mmod) == NO); tree->mcmc->run_move[tree->mcmc->num_move_phyrex_indel_disk]++; if(n_insert_disks == 0) { tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; return; } Set_Lk(tree); disk = NULL; new_glnL = UNLIKELY; cur_glnL = tree->mmod->c_lnL; new_tlnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; ratio = 0.0; num_prec_issue = NO; if(tree->young_disk->next) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); T = PHYREX_Tree_Height(tree); disk = tree->young_disk->prev; n_valid_disks = 0; do { if(!disk->ldsk) n_valid_disks++; disk = disk->prev; } while(disk && disk->prev); target_disk = (t_dsk **)mCalloc(n_insert_disks,sizeof(t_dsk *)); new_disk = (t_dsk **)mCalloc(n_insert_disks,sizeof(t_dsk *)); for(j=0;jyoung_disk->time-T) + T; disk = tree->young_disk->prev; while(disk && disk->time > t) disk = disk->prev; if(!(disk->time != t)) { PhyML_Printf("\n. Numerical precision issue in insert_disk"); PhyML_Printf("\n. t=%g disk->time=%g diff=%g",t,disk->time,t-disk->time); num_prec_issue = YES; } }while(num_prec_issue == YES); assert(disk->next); target_disk[j] = disk->next; new_disk[j] = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(new_disk[j],tree->mmod->n_dim,tree->mmod); new_disk[j]->time = t; PHYREX_Insert_Disk(new_disk[j],tree); for(i=0;immod->n_dim;i++) new_disk[j]->centr->lonlat[i] = Uni()*(tree->mmod->lim_up->lonlat[i]-tree->mmod->lim_do->lonlat[i])+tree->mmod->lim_do->lonlat[i]; for(i=0;immod->n_dim;i++) hr -= log(1./(tree->mmod->lim_up->lonlat[i]-tree->mmod->lim_do->lonlat[i])); } /* // Pr(n+k -> n) i.e, numerator */ hr -= LnChoose(n_valid_disks+n_insert_disks,n_insert_disks); /* // Pr(n -> n+k) i.e., denominator */ T = fabs(T-tree->young_disk->time); hr -= n_insert_disks * log(1./T); hr -= LnFact(n_insert_disks); if(tree->eval_glnL == YES || tree->eval_tlnL == YES) PHYREX_Update_Lindisk_List(tree); if(tree->eval_glnL == YES) { new_glnL = LOCATION_Lk(NULL,tree); ratio += (new_glnL - cur_glnL); } if(tree->eval_tlnL == YES) { new_tlnL = TIMES_Lk(tree); ratio += (new_tlnL - cur_tlnL); } ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); /* PhyML_Printf("\n+ Insert new_glnL: %f [%f] hr: %f u: %f alpha: %f n_insert: %d [%d %d %d %d %f]", */ /* new_glnL,cur_glnL,hr,u,alpha,n_insert_disks, */ /* tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_indel_disk], */ /* tree->mcmc->run_move[tree->mcmc->num_move_phyrex_indel_disk], */ /* tree->mcmc->prev_acc_move[tree->mcmc->num_move_phyrex_indel_disk], */ /* tree->mcmc->prev_run_move[tree->mcmc->num_move_phyrex_indel_disk], */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_indel_disk]); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; for(j=0;jmmod->lbda); */ tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_indel_disk]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); Free(target_disk); Free(new_disk); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Update time of disk */ #ifdef PHYREX void MCMC_PHYREX_Move_Disk_Updown(t_tree *tree, int print) { phydbl u,alpha,ratio; phydbl cur_glnL, new_glnL, hr; phydbl cur_alnL, new_alnL; phydbl cur_rlnL, new_rlnL; phydbl cur_tlnL, new_tlnL; phydbl *ori_time,new_time,cur_time; phydbl max, min; t_dsk *disk,**target_disk,**all_disks; int i,block,n_all_disks,n_move_disks,*permut,update_alnL,err; phydbl K; disk = NULL; block = 100; all_disks = NULL; K = 0.0; disk = tree->young_disk->prev; n_all_disks = 0; do { if(disk->age_fixed == NO && !(disk->ldsk && disk->ldsk->n_next > 1 && tree->a_edges[0]->l->optimize == NO)) { if(!n_all_disks) all_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_all_disks+1)%block)) all_disks = (t_dsk **)mRealloc(all_disks,n_all_disks+block,sizeof(t_dsk *)); all_disks[n_all_disks] = disk; n_all_disks++; } disk = disk->prev; } while(disk); if(!n_all_disks) return; /* n_move_disks = (int)(1+Rand_Int(0,0.2*n_all_disks)); */ n_move_disks = (int)(1+0.2*n_all_disks); /* n_move_disks = n_all_disks; */ target_disk = (t_dsk **)mCalloc(n_all_disks,sizeof(t_dsk *)); ori_time = (phydbl *)mCalloc(n_all_disks,sizeof(phydbl)); permut = Permutate(n_all_disks); for(i=0;imcmc->run_move[tree->mcmc->num_move_phyrex_move_disk_ud]++; Set_Lk(tree); cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; cur_alnL = tree->c_lnL; new_alnL = UNLIKELY; cur_rlnL = tree->rates->c_lnL; new_rlnL = UNLIKELY; hr = 0.0; update_alnL = NO; target_disk[i] = all_disks[permut[i]]; if(target_disk[i]->ldsk && target_disk[i]->ldsk->n_next > 1) update_alnL = YES; ori_time[i] = target_disk[i]->time; cur_time = target_disk[i]->time; if(target_disk[i]->prev) { max = target_disk[i]->next->time; min = target_disk[i]->prev->time; new_time = Uni()*(max - min) + min; } else { max = target_disk[i]->next->time; /* assert((max - cur_time) > 0.0); */ /* new_time = max - Rexp(MIN(10.,LOG2/(max - cur_time + 1.E-10))); */ /* hr -= log(Dexp(max - new_time,MIN(10.,LOG2/(max - cur_time + 1.E-10)))); */ /* hr += log(Dexp(max - cur_time,MIN(10.,LOG2/(max - new_time + 1.E-10)))); */ K = (tree->young_disk->time - tree->n_root->ldsk->disk->time)/5.; new_time = Rnorm_Trunc(cur_time,K,-TWO_TO_THE_LARGE,max,&err); hr -= Log_Dnorm_Trunc(new_time,cur_time,K,-TWO_TO_THE_LARGE,max,&err); K = (tree->young_disk->time - tree->n_root->ldsk->disk->time)/5.; hr += Log_Dnorm_Trunc(cur_time,new_time,K,-TWO_TO_THE_LARGE,max,&err); if(isnan(new_time)) { PhyML_Printf("\n. max=%f cur_time=%f K=%f new_time=%f",max,cur_time,K,new_time); assert(FALSE); } } target_disk[i]->time = new_time; PHYREX_Update_Node_Times_Given_Disks(tree); if(tree->eval_glnL == YES) new_glnL = LOCATION_Lk(NULL,tree); if(tree->eval_tlnL == YES) new_tlnL = TIMES_Lk(tree); if(tree->eval_alnL == YES && update_alnL == YES) new_alnL = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_rlnL = RATES_Lk(tree); ratio = 0.0; if(tree->eval_alnL == YES && update_alnL == YES) ratio += (new_alnL - cur_alnL); if(tree->eval_rlnL == YES) ratio += (new_rlnL - cur_rlnL); if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); /* if(target_disk[i]->prev == NULL) */ if(print == YES) PhyML_Printf("\n- Move disk alnL: [%12f->%12f] glnL: [%12f->%12f] tlnL: [%12f->%12f] hr: %12f u:%6f alpha: %12f new_time: %12f cur_time: %12f max: %12f K=%f iter=%4d", new_alnL,cur_alnL, new_glnL,cur_glnL, new_tlnL,cur_tlnL, hr, u, alpha, new_time, cur_time, max, K, i); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* for(i=0;itime = ori_time[i]; */ target_disk[i]->time = ori_time[i]; PHYREX_Update_Node_Times_Given_Disks(tree); Reset_Lk(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_move_disk_ud]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } Free(target_disk); Free(all_disks); Free(ori_time); Free(permut); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Scale_Times(t_tree *tree, int print) { phydbl u,alpha,ratio,hr; phydbl cur_glnL, new_glnL; phydbl cur_tlnL, new_tlnL; phydbl cur_alnL, new_alnL; phydbl cur_rlnL, new_rlnL; phydbl cur_rlnP, new_rlnP; phydbl scale_fact_times; int n_disks; phydbl K; t_dsk *ref_disk; if(tree->mod->s_opt->opt_node_ages == NO) return; if(tree->eval_tlnL == NO) return; Set_Lk(tree); Set_Prior(tree); PHYREX_Record_Disk_Times(tree); cur_alnL = tree->c_lnL; new_alnL = UNLIKELY; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_rlnL = tree->rates->c_lnL; new_rlnL = UNLIKELY; cur_rlnP = tree->rates->c_lnP; new_rlnP = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; K = tree->mcmc->tune_move[tree->mcmc->num_move_phyrex_scale_times]; hr = 0.0; tree->mcmc->run_move[tree->mcmc->num_move_phyrex_scale_times]++; ref_disk = tree->young_disk; u = Uni(); scale_fact_times = exp(K*(u-.5)); n_disks = PHYREX_Scale_All(scale_fact_times,ref_disk,tree); if(n_disks < 0) return; // Root age cannot be younger than age of oldest sample if(tree->eval_alnL == YES && tree->mod->s_opt->opt_clock_r == YES) tree->rates->clock_r /= scale_fact_times; if(PHYREX_Check_Struct(tree,NO) && tree->rates->clock_r > tree->rates->min_clock && tree->rates->clock_r < tree->rates->max_clock) { /* The Hastings ratio is (n_disk-2) (instead of n_disk) when considering a uniform distrib for the multiplier, which is not the case here. */ if(tree->eval_alnL == YES && tree->mod->s_opt->opt_clock_r == YES) hr = (n_disks-1)*log(scale_fact_times); else hr = n_disks*log(scale_fact_times); PHYREX_Update_Lindisk_List(tree); PHYREX_Update_Node_Times_Given_Disks(tree); if(tree->eval_alnL == YES) RATES_Update_Edge_Lengths(tree); if(tree->eval_glnL == YES) new_glnL = LOCATION_Lk(NULL,tree); if(tree->eval_tlnL == YES) new_tlnL = TIMES_Lk(tree); if(tree->eval_alnL == YES) new_alnL = Lk(NULL,tree); if(tree->eval_rlnL == YES) { new_rlnL = RATES_Lk(tree); new_rlnP = RATES_Prior(tree); } } ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_alnL - cur_alnL); if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_rlnL == YES) { ratio += (new_rlnL - cur_rlnL); ratio += (new_rlnP - cur_rlnP); } if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); if(print == YES) { PhyML_Printf("\n. SCALE [%6d] Scale times glnL: %10g->%10g[%2d] alnL: %10g->%10g[%2d] rlnL: %10g->%10g[%2d] tlnL: %10g->%10g[%2d] ratio: %10g scale: %10g neff=%10g T=%10g->%10g clock: %10g check: %2d", tree->mcmc->run, cur_glnL,new_glnL,tree->eval_glnL, cur_alnL,new_alnL,tree->eval_alnL, cur_rlnL,new_rlnL,tree->eval_rlnL, cur_tlnL,new_tlnL,tree->eval_tlnL, ratio,scale_fact_times, tree->times->scaled_pop_size, tree->n_root->ldsk->disk->time_bkp, tree->n_root->ldsk->disk->time, tree->rates->clock_r, PHYREX_Check_Struct(tree,NO)); } assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { PHYREX_Restore_Disk_Times(tree); if(tree->eval_alnL == YES && tree->mod->s_opt->opt_clock_r == YES) tree->rates->clock_r *= scale_fact_times; PHYREX_Update_Lindisk_List(tree); PHYREX_Update_Node_Times_Given_Disks(tree); if(tree->eval_alnL == YES) RATES_Update_Edge_Lengths(tree); PHYREX_Check_Disk_Times(tree); Reset_Lk(tree); Reset_Prior(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_scale_times]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Swap_Disk(t_tree *tree, int print) { phydbl u,alpha,ratio; phydbl cur_glnL, new_glnL; phydbl cur_alnL, new_alnL; phydbl cur_rlnL, new_rlnL; phydbl cur_tlnL, new_tlnL; phydbl hr,t,t_min,t_max,*ori_time,K; t_dsk *disk,*target_disk,**valid_disks; t_ldsk *ldsk_next; int i,j,block,n_valid_disks,*permut,n_swaps,err; /* if(RRW_Is_Rw(tree->mmod) == YES && tree->times->augmented_coalescent == NO) return; */ valid_disks = NULL; block = 100; disk = tree->young_disk->prev; if(!disk->prev) return; n_valid_disks = 0; do { if(disk && disk->ldsk && disk->ldsk->n_next >= 1 && disk->age_fixed == NO) { if(!(disk->ldsk->n_next > 1 && tree->a_edges[0]->l->optimize == NO)) { if(!n_valid_disks) valid_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_valid_disks+1)%block)) valid_disks = (t_dsk **)mRealloc(valid_disks,n_valid_disks+block,sizeof(t_dsk *)); valid_disks[n_valid_disks] = disk; n_valid_disks++; } } disk = disk->prev; } while(disk != NULL); if(n_valid_disks < 2) return; permut = Permutate(n_valid_disks); n_swaps = (int)(1 + 0.2*n_valid_disks); ori_time = (phydbl *)mCalloc(n_swaps,sizeof(phydbl)); for(j=0;jmcmc->run_move[tree->mcmc->num_move_phyrex_swap_disk]++; Set_Lk(tree); disk = NULL; target_disk = NULL; ldsk_next = NULL; new_glnL = UNLIKELY; cur_glnL = tree->mmod->c_lnL; new_tlnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_alnL = UNLIKELY; cur_alnL = tree->c_lnL; new_rlnL = UNLIKELY; cur_rlnL = tree->rates->c_lnL; hr = 0.0; /* Uniform selection of a valid disk */ target_disk = valid_disks[permut[j]]; ori_time[j] = target_disk->time; t_min = (target_disk->ldsk->prev != NULL) ? target_disk->ldsk->prev->disk->time : -TWO_TO_THE_LARGE; t_max = +INFINITY; for(i=0;ildsk->n_next;++i) if(target_disk->ldsk->next[i]->disk->time < t_max) { t_max = target_disk->ldsk->next[i]->disk->time; ldsk_next = target_disk->ldsk->next[i]; } assert(t_max > t_min); if(target_disk->ldsk->prev) { t = Uni()*(t_max - t_min) + t_min; } else { K = (tree->young_disk->time - tree->n_root->ldsk->disk->time)/20.; t = Rnorm_Trunc(ori_time[j],K,-TWO_TO_THE_LARGE,t_max,&err); hr -= Log_Dnorm_Trunc(t,ori_time[j],K,-TWO_TO_THE_LARGE,t_max,&err); K = (tree->young_disk->time - tree->n_root->ldsk->disk->time)/20.; hr += Log_Dnorm_Trunc(ori_time[j],t,K,-TWO_TO_THE_LARGE,t_max,&err); if(isnan(t)) { PhyML_Printf("\n. t_max=%f ori_time[i]=%f K=%f t=%f",t_max,ori_time[i],K,t); assert(FALSE); } } PHYREX_Move_Disk_Updown(target_disk,t,tree); target_disk->time = t; if(target_disk->ldsk->prev != NULL) PHYREX_Update_Lindisk_List_Range(ldsk_next->disk,target_disk->ldsk->prev->disk,tree); if(target_disk->ldsk && target_disk->ldsk->nd) { for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->ldsk == target_disk->ldsk) tree->times->nd_t[i] = t; } if(tree->eval_glnL == YES) { new_glnL = (tree->mmod->use_locations == YES) ? LOCATION_Lk(NULL,tree) : 0.0; if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) new_tlnL = TIMES_Lk(tree); if(tree->eval_alnL == YES) new_alnL = Lk(NULL,tree); if(tree->eval_rlnL == YES) new_rlnL = RATES_Lk(tree); ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_alnL - cur_alnL); if(tree->eval_rlnL == YES) ratio += (new_rlnL - cur_rlnL); if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); if(print == YES) printf("\n- Swap glnL: [%f->%f] alnL: [%f->%f] tlnL: [%f->%f] t: [%f->%f] hr: %f u:%f alpha: %f", cur_glnL,new_glnL, cur_alnL,new_alnL, cur_tlnL,new_tlnL, ori_time[j],t, hr,u,alpha); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* printf("\n- Reject %f %f",target_disk->time,ori_time); */ PHYREX_Move_Disk_Updown(target_disk,ori_time[j],tree); target_disk->time = ori_time[j]; if(target_disk->ldsk && target_disk->ldsk->nd) { for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->ldsk == target_disk->ldsk) tree->times->nd_t[i] = ori_time[j]; } if(target_disk->ldsk->prev != NULL) PHYREX_Update_Lindisk_List_Range(ldsk_next->disk,target_disk->ldsk->prev->disk,tree); RATES_Update_Edge_Lengths(tree); Reset_Lk(tree); } else { /* printf("\n- Accept %f %f",target_disk->time,ori_time); */ tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_swap_disk]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } Free(ori_time); Free(valid_disks); Free(permut); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Shuffle_Node_Times(t_tree *tree, int print) { phydbl u; phydbl t_min,t_max; phydbl cur_t,new_t; phydbl cur_glnL,new_glnL; phydbl cur_alnL,new_alnL; phydbl cur_rlnL,new_rlnL; phydbl cur_tlnL,new_tlnL; phydbl ratio,alpha,hr; int i; int move_num,err,n_nodes,idx; t_ldsk *ldsk_next,*n_ldsk; if(tree->mod->s_opt->opt_node_ages == NO) return; if(tree->eval_tlnL == NO) return; n_nodes = 1+(int)(0.1*tree->n_otu); TIMES_Record_Times(tree); move_num = tree->mcmc->num_move_phyrex_shuffle_node_times; ratio = 0.0; cur_alnL = tree->c_lnL; new_alnL = UNLIKELY; cur_rlnL = tree->rates->c_lnL; new_rlnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; hr = 0.0; Set_Lk(tree); do { idx = Rand_Int(tree->n_otu,2*tree->n_otu-3); assert(tree->a_nodes[idx] != tree->n_root); assert(tree->a_nodes[idx] != NULL); assert(tree->a_nodes[idx]->tax == NO); n_ldsk = tree->a_nodes[idx]->ldsk; assert(n_ldsk->next != NULL); assert(n_ldsk->n_next == 2); assert(n_ldsk->prev != NULL); cur_t = n_ldsk->disk->time; ldsk_next = NULL; t_min = tree->times->nd_t[n_ldsk->prev->nd->num]; t_max = +INFINITY; for(i=0;in_next;++i) if(n_ldsk->next[i]->disk->time < t_max) { t_max = n_ldsk->next[i]->disk->time; ldsk_next = n_ldsk->next[i]; } assert(t_max > t_min); /* new_t = Uni()*(t_max - t_min) + t_min; */ new_t = Rnorm_Trunc(cur_t,(t_max - t_min)/20.,t_min,t_max,&err); hr -= Log_Dnorm_Trunc(new_t,cur_t,(t_max - t_min)/20.,t_min,t_max,&err); hr += Log_Dnorm_Trunc(cur_t,new_t,(t_max - t_min)/20.,t_min,t_max,&err); /* new_t = Rnorm_Trunc(cur_t,(t_max - t_min)/100.,t_min,t_max,&err); */ /* hr -= Log_Dnorm_Trunc(new_t,cur_t,(t_max - t_min)/100.,t_min,t_max,&err); */ /* hr += Log_Dnorm_Trunc(cur_t,new_t,(t_max - t_min)/100.,t_min,t_max,&err); */ PHYREX_Move_Disk_Updown(n_ldsk->disk,new_t,tree); n_ldsk->disk->time = new_t; tree->times->nd_t[tree->a_nodes[idx]->num] = new_t; // Ok only if tree is binary PHYREX_Update_Lindisk_List_Range(ldsk_next->disk,n_ldsk->prev->disk,tree); } while(--n_nodes > 0); RATES_Update_Edge_Lengths(tree); if(tree->eval_glnL == YES) { new_glnL = (tree->mmod->use_locations == YES) ? LOCATION_Lk(NULL,tree) : 0.0; if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) new_tlnL = TIMES_Lk(tree); if(tree->eval_rlnL == YES) new_rlnL = RATES_Lk(tree); if(tree->eval_alnL == YES) new_alnL = Lk(NULL,tree); ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_alnL - cur_alnL); if(tree->eval_rlnL == YES) ratio += (new_rlnL - cur_rlnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); if(tree->eval_glnL == YES && tree->mmod->use_locations == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); if(print == YES) PhyML_Printf("\n. PHYREX_Shuffle_Node_Time %6d alnL:%f->%f glnL:%f->%f rlnL:%f->%f tlnL:%f->%f alpha:%f", tree->mcmc->run, cur_alnL,new_alnL, cur_glnL,new_glnL, cur_rlnL,new_rlnL, cur_tlnL,new_tlnL, alpha); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { TIMES_Reset_Times(tree); for(i=tree->n_otu;i<2*tree->n_otu-1;++i) { PHYREX_Move_Disk_Updown(tree->a_nodes[i]->ldsk->disk,tree->times->nd_t[i],tree); tree->a_nodes[i]->ldsk->disk->time = tree->times->nd_t[i]; } RATES_Update_Edge_Lengths(tree); PHYREX_Update_Lindisk_List(tree); Reset_Lk(tree); } else { tree->mcmc->acc_move[move_num]++; } tree->mcmc->run_move[move_num]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Node_Times(t_tree *tree, int print) { if(tree->mod->s_opt->opt_node_ages == NO) return; if(tree->eval_tlnL == NO) return; MCMC_Root_Time(tree, print); if(tree->eval_alnL == YES) { Set_Both_Sides(YES,tree); Lk(NULL,tree); } if(tree->eval_glnL == YES) { tree->contmod->both_sides[LOCATION] = YES; tree->contmod->both_sides[VELOCITY] = YES; LOCATION_Lk(NULL,tree); } assert(tree->n_root->ldsk->n_next == 2); MCMC_PHYREX_Node_Times_Pre(tree->n_root->ldsk,tree->n_root->ldsk->next[0],tree,print); if (tree->eval_alnL == YES) Update_Partial_Lk(tree,tree->e_root,tree->n_root->ldsk->next[0]->nd); if (tree->eval_glnL == YES) LOCATION_Update_Lk_Up(tree->n_root, tree->n_root->ldsk->next[1]->nd, tree); MCMC_PHYREX_Node_Times_Pre(tree->n_root->ldsk,tree->n_root->ldsk->next[1],tree,print); RATES_Update_Normalization_Factor(tree); RATES_Update_Edge_Lengths(tree); if(tree->eval_alnL == YES) { Set_Both_Sides(NO,tree); Lk(NULL,tree); /* Required in order to rescale all branch rates */ } if(tree->eval_glnL == YES) { tree->contmod->both_sides[LOCATION] = NO; tree->contmod->both_sides[VELOCITY] = NO; LOCATION_Lk(NULL,tree); } #ifdef PHYREX /* if(tree->mmod->safe_phyrex == YES) PHYREX_Update_Disk_Times_Given_Nodes(tree); */ #endif } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Node_Times_Pre(t_ldsk *a_ldsk, t_ldsk *d_ldsk, t_tree *tree, int print) { phydbl u; phydbl t_min,t_max; phydbl cur_t,new_t; phydbl cur_glnL,new_glnL; phydbl cur_alnL,new_alnL; phydbl cur_rlnL,new_rlnL; phydbl cur_tlnL,new_tlnL; phydbl ratio,alpha,hr; int i; int move_num,err; t_ldsk *ldsk_next; if(tree->mod->s_opt->opt_node_ages == NO) return; if(tree->eval_tlnL == NO) return; if(d_ldsk->next == NULL) return; assert(d_ldsk->n_next == 2); Set_Lk(tree); move_num = tree->mcmc->num_move_phyrex_node_times; cur_t = d_ldsk->disk->time; ratio = 0.0; cur_alnL = tree->c_lnL; new_alnL = UNLIKELY; cur_rlnL = tree->rates->c_lnL; new_rlnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; hr = 0.0; ldsk_next = NULL; t_min = a_ldsk->disk->time; t_max = +INFINITY; for(i=0;in_next;++i) if(d_ldsk->next[i]->disk->time < t_max) { t_max = d_ldsk->next[i]->disk->time; ldsk_next = d_ldsk->next[i]; } assert(t_max > t_min); /* new_t = Uni()*(t_max - t_min) + t_min; */ new_t = Rnorm_Trunc(cur_t,(t_max - t_min)/10.,t_min,t_max,&err); hr -= Log_Dnorm_Trunc(new_t,cur_t,(t_max - t_min)/10.,t_min,t_max,&err); hr += Log_Dnorm_Trunc(cur_t,new_t,(t_max - t_min)/10.,t_min,t_max,&err); /* new_t = Rnorm_Trunc(cur_t,(t_max - t_min)/100.,t_min,t_max,&err); */ /* hr -= Log_Dnorm_Trunc(new_t,cur_t,(t_max - t_min)/100.,t_min,t_max,&err); */ /* hr += Log_Dnorm_Trunc(cur_t,new_t,(t_max - t_min)/100.,t_min,t_max,&err); */ PHYREX_Move_Disk_Updown(d_ldsk->disk,new_t,tree); d_ldsk->disk->time = new_t; tree->times->nd_t[d_ldsk->nd->num] = new_t; // Ok only if tree is binary PHYREX_Update_Lindisk_List_Range(ldsk_next->disk,d_ldsk->prev->disk,tree); if(tree->eval_glnL == YES) { new_glnL = (tree->mmod->use_locations == YES) ? LOCATION_Lk(NULL,tree) : 0.0; if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_glnL == YES) { if (d_ldsk->nd->anc != NULL) LOCATION_Update_Lk_Up(d_ldsk->nd->anc, d_ldsk->nd, tree); if (d_ldsk->nd->tax == NO) LOCATION_Update_Lk_Down(d_ldsk->nd->anc, d_ldsk->nd, tree); new_glnL = (tree->mmod->use_locations == YES) ? LOCATION_Lk(d_ldsk->nd, tree) : 0.0; if (PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) new_tlnL = TIMES_Lk(tree); if(tree->eval_rlnL == YES) new_rlnL = RATES_Lk(tree); if(tree->eval_alnL == YES) { t_edge *bp,*bc; bp = Get_Edge(d_ldsk->nd->anc,d_ldsk->nd,tree); RATES_Update_One_Edge_Length(bp,tree); for(i=0;in_next;++i) { bc = Get_Edge(d_ldsk->nd,d_ldsk->next[i]->nd,tree); RATES_Update_One_Edge_Length(bc,tree); Update_PMat_At_Given_Edge(bc,tree); } Update_Partial_Lk(tree,bp,d_ldsk->nd); new_alnL = Lk(bp,tree); } ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_alnL - cur_alnL); if(tree->eval_rlnL == YES) ratio += (new_rlnL - cur_rlnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); if(tree->eval_glnL == YES && tree->mmod->use_locations == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); if(print == YES) PhyML_Printf("\n. PHYREX_Node_Time %6d alnL:%f->%f glnL:%f->%f rlnL:%f->%f tlnL:%f->%f alpha:%f", tree->mcmc->run, cur_alnL,new_alnL, cur_glnL,new_glnL, cur_rlnL,new_rlnL, cur_tlnL,new_tlnL, alpha); /* if(tree->aux_tree == NULL && (v0 == tree->n_root->v[1] || v0 == tree->n_root->v[2])) */ /* { */ /* PhyML_Printf("\n! cur_t: %f new_t: %f t_min: %f t_max: %f alnL:%f->%f glnL:%f->%f rlnL:%f->%f tlnL:%f->%f hr: %f alpha:%f", */ /* cur_t,new_t,t_min,t_max, */ /* cur_alnL,new_alnL, */ /* cur_glnL,new_glnL, */ /* cur_rlnL,new_rlnL, */ /* cur_tlnL,new_tlnL, */ /* hr, */ /* alpha); */ /* } */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* PhyML_Printf("\n. Reject"); */ PHYREX_Move_Disk_Updown(d_ldsk->disk,cur_t,tree); d_ldsk->disk->time = cur_t; tree->times->nd_t[d_ldsk->nd->num] = cur_t; // Ok only if tree is binary if(tree->eval_glnL == YES) { if (d_ldsk->nd->anc != NULL) LOCATION_Update_Lk_Up(d_ldsk->nd->anc, d_ldsk->nd, tree); if (d_ldsk->nd->tax == NO) LOCATION_Update_Lk_Down(d_ldsk->nd->anc, d_ldsk->nd, tree); } if(tree->eval_alnL == YES) { t_edge *bp,*bc; bp = Get_Edge(d_ldsk->nd->anc,d_ldsk->nd,tree); RATES_Update_One_Edge_Length(bp,tree); Update_PMat_At_Given_Edge(bp,tree); for(i=0;in_next;++i) { bc = Get_Edge(d_ldsk->nd,d_ldsk->next[i]->nd,tree); RATES_Update_One_Edge_Length(bc,tree); Update_PMat_At_Given_Edge(bc,tree); } Update_Partial_Lk(tree,bp,d_ldsk->nd); } PHYREX_Update_Lindisk_List_Range(ldsk_next->disk,d_ldsk->prev->disk,tree); Reset_Lk(tree); } else { /* PhyML_Printf("\n. Accept"); */ tree->mcmc->acc_move[move_num]++; } tree->mcmc->run_move[move_num]++; tree->mcmc->run++; #ifdef PHYREX PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); #endif for(i=0;in_next;i++) { if (tree->eval_alnL == YES) Update_Partial_Lk(tree, Get_Edge(d_ldsk->nd, d_ldsk->next[i]->nd, tree), d_ldsk->nd); if (tree->eval_glnL == YES) LOCATION_Update_Lk_Up(d_ldsk->nd, d_ldsk->next[i]->nd, tree); MCMC_PHYREX_Node_Times_Pre(d_ldsk, d_ldsk->next[i], tree, print); } if(tree->eval_alnL == YES && d_ldsk->nd->anc != tree->n_root) Update_Partial_Lk(tree,Get_Edge(d_ldsk->nd->anc,d_ldsk->nd,tree),d_ldsk->nd); if (tree->eval_glnL == YES) LOCATION_Update_Lk_Down(d_ldsk->nd->anc, d_ldsk->nd, tree); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Indel_Hit(t_tree *tree) { int n_disks_cur, n_disks_new; t_dsk *disk; phydbl hr; phydbl cur_lbda,new_lbda; phydbl cur_mu,new_mu; phydbl cur_rad,new_rad; if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) return; if(tree->mmod->use_locations == NO) return; hr = 0.0; new_lbda = tree->mmod->lbda; cur_lbda = tree->mmod->lbda; new_rad = tree->mmod->rad; cur_rad = tree->mmod->rad; new_mu = tree->mmod->mu; cur_mu = tree->mmod->mu; /* new_lbda = cur_lbda * exp(1.0*(Uni()-.5)); */ /* hr += log(new_lbda/cur_lbda); */ /* new_mu = cur_mu * exp(0.5*(Uni()-.5)); */ /* hr += log(new_mu/cur_mu); */ /* new_rad = cur_rad * exp(0.5*(Uni()-.5)); */ /* hr += log(new_rad/cur_rad); */ if(new_rad > tree->mmod->max_rad || new_rad < tree->mmod->min_rad) return; if(new_mu > tree->mmod->max_mu || new_mu < tree->mmod->min_mu) return; if(new_lbda > tree->mmod->max_lbda || new_lbda < tree->mmod->min_lbda) return; tree->mmod->lbda = new_lbda; tree->mmod->mu = new_mu; tree->mmod->rad = new_rad; disk = tree->young_disk->prev; n_disks_cur = 0; do { if(disk->ldsk != NULL && disk->ldsk->n_next == 1) n_disks_cur++; disk = disk->prev; } while(disk); n_disks_new = (int)Rpois(n_disks_cur+SMALL); hr += Dpois(n_disks_cur,n_disks_new+SMALL,YES); hr -= Dpois(n_disks_new,n_disks_cur+SMALL,YES); if(n_disks_new < n_disks_cur) { MCMC_PHYREX_Delete_Hit(hr, n_disks_cur - n_disks_new, cur_lbda, cur_rad, cur_mu, tree); } else { MCMC_PHYREX_Insert_Hit(hr, n_disks_new - n_disks_cur, cur_lbda, cur_rad, cur_mu, tree); } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Insert a disk with a new lineage displacement */ #ifdef PHYREX void MCMC_PHYREX_Insert_Hit(phydbl hr, int n_insert_disks, phydbl cur_lbda, phydbl cur_rad, phydbl cur_mu, t_tree *tree) { t_dsk *disk,**new_disk,*young_disk,*old_disk; t_ldsk **young_ldsk, **old_ldsk, **new_ldsk; phydbl T,t,c,rad; phydbl cur_glnL, new_glnL; phydbl cur_tlnL, new_tlnL; phydbl u,alpha,ratio; int i,j,*dir_old_young,n_valid_disks,err,num_prec_issue; assert(RRW_Is_Rw(tree->mmod) == NO && VELOC_Is_Integrated_Velocity(tree->mmod) == NO); tree->mcmc->run_move[tree->mcmc->num_move_phyrex_indel_hit]++; if(n_insert_disks == 0) { tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; return; } Set_Lk(tree); disk = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; num_prec_issue = NO; rad = 0.0; for(j=0;jmmod->n_dim;j++) rad += 0.01 * (tree->mmod->lim_up->lonlat[j]-tree->mmod->lim_do->lonlat[j]); rad /= tree->mmod->n_dim; disk = tree->young_disk->prev; n_valid_disks = 0; do { if(disk->ldsk != NULL && disk->ldsk->n_next == 1) n_valid_disks++; disk = disk->prev; } while(disk && disk->prev); new_disk = (t_dsk **)mCalloc(n_insert_disks,sizeof(t_dsk *)); new_ldsk = (t_ldsk **)mCalloc(n_insert_disks,sizeof(t_ldsk *)); old_ldsk = (t_ldsk **)mCalloc(n_insert_disks,sizeof(t_ldsk *)); young_ldsk = (t_ldsk **)mCalloc(n_insert_disks,sizeof(t_ldsk *)); dir_old_young = (int *)mCalloc(n_insert_disks,sizeof(int)); T = PHYREX_Tree_Height(tree); for(j=0;jyoung_disk->time-T) + T; disk = tree->young_disk->prev; while(disk && disk->time > t) disk = disk->prev; if(!(disk->time != t)) { PhyML_Printf("\n. Numerical precision issue in insert_hit"); PhyML_Printf("\n. t=%g disk->time=%g diff=%g",t,disk->time,t-disk->time); num_prec_issue = YES; } }while(num_prec_issue == YES); /* Disks located just prior and after inserted disk */ young_disk = disk->next; assert(young_disk->n_ldsk_a); old_disk = disk; assert(old_disk->n_ldsk_a); /* Make and initialize new disk */ new_disk[j] = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(new_disk[j],tree->mmod->n_dim,tree->mmod); /* Time of the new disk */ new_disk[j]->time = t; /* Insert it */ PHYREX_Insert_Disk(new_disk[j],tree); assert(new_disk[j]->next == young_disk); assert(new_disk[j]->prev == old_disk); /* Which lineage is going to be hit ? */ hr -= log(1./PHYREX_Number_Of_Outgoing_Ldsks(young_disk)); young_ldsk[j] = PHYREX_Random_Select_Outgoing_Ldsk(young_disk); old_ldsk[j] = young_ldsk[j]->prev; if(old_ldsk[j]->disk->time > young_ldsk[j]->disk->time || young_ldsk[j]->disk->time < new_disk[j]->time || old_ldsk[j]->disk->time > new_disk[j]->time) { PhyML_Fprintf(stderr,"\n. young_disk->time: %f",young_disk->time); PhyML_Fprintf(stderr,"\n. old_disk->time: %f",old_disk->time); PhyML_Fprintf(stderr,"\n. young_ldsk->disk->time: %f",young_ldsk[j]->disk->time); PhyML_Fprintf(stderr,"\n. old_ldsk->disk->time: %f",old_ldsk[j]->disk->time); PhyML_Fprintf(stderr,"\n. new_disk->disk->time: %f",new_disk[j]->time); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } /* Direction from old to young ldsk */ dir_old_young[j] = PHYREX_Get_Next_Direction(young_ldsk[j],old_ldsk[j]); assert(dir_old_young[j] != -1); /* Make and initialize new ldsk */ new_ldsk[j] = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(new_ldsk[j],new_disk[j],tree->mmod->n_dim); PHYREX_Make_Lindisk_Next(new_ldsk[j]); new_disk[j]->ldsk = new_ldsk[j]; /* Connect it */ new_ldsk[j]->prev = old_ldsk[j]; new_ldsk[j]->next[0] = young_ldsk[j]; young_ldsk[j]->prev = new_ldsk[j]; old_ldsk[j]->next[dir_old_young[j]] = new_ldsk[j]; /* NOT OPTIMAL */ /* Update ldsk_a arrays in the time interval affected by the insertion */ PHYREX_Update_Lindisk_List_Range(new_ldsk[j]->disk,old_ldsk[j]->disk,tree); /* Sample position of the displaced ldsk */ for(i=0;immod->n_dim;i++) { new_disk[j]->centr->lonlat[i] = Uni() * (tree->mmod->lim_up->lonlat[i]-tree->mmod->lim_do->lonlat[i])+tree->mmod->lim_do->lonlat[i]; hr -= log(1./(tree->mmod->lim_up->lonlat[i]-tree->mmod->lim_do->lonlat[i])); if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) { c = new_disk[j]->centr->lonlat[i]; } else if(RRW_Is_Rw(tree->mmod) == YES) { c = .5*(old_ldsk[j]->coord->lonlat[i] + young_ldsk[j]->coord->lonlat[i]); } else c = -1.; err = NO; new_ldsk[j]->coord->lonlat[i] = Rnorm_Trunc(c, rad, tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); if(err == YES) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); hr -= Log_Dnorm_Trunc(new_ldsk[j]->coord->lonlat[i], c, rad, tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); } } T = PHYREX_Tree_Height(tree); T = fabs(T-tree->young_disk->time); hr -= LnChoose(n_valid_disks+n_insert_disks,n_insert_disks); hr -= n_insert_disks * log(1./T); hr -= LnFact(n_insert_disks); if(tree->eval_glnL == YES) new_glnL = LOCATION_Lk(NULL,tree); if(tree->eval_tlnL == YES) new_tlnL = TIMES_Lk(tree); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); /* printf("\n- Insert hit %15f %15f %5d",new_glnL - cur_glnL, alpha, n_insert_disks); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* printf("+ Reject"); */ tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; for(j=n_insert_disks-1;j>=0;j--) { old_ldsk[j]->next[dir_old_young[j]] = young_ldsk[j]; young_ldsk[j]->prev = old_ldsk[j]; PHYREX_Remove_Disk(new_disk[j]); } PHYREX_Update_Lindisk_List(tree); Reset_Lk(tree); for(j=n_insert_disks-1;j>=0;j--) { PHYREX_Free_Disk(new_disk[j]); PHYREX_Free_Ldisk(new_ldsk[j]); } } else { /* printf("+ Accept"); */ /* if(indel > 0) printf("\n. Accept"); */ tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_indel_hit]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); Free(new_disk); Free(new_ldsk); Free(old_ldsk); Free(young_ldsk); Free(dir_old_young); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Remove one or more disks with a lineage displacement */ #ifdef PHYREX void MCMC_PHYREX_Delete_Hit(phydbl hr, int n_delete_disks, phydbl cur_lbda, phydbl cur_rad, phydbl cur_mu, t_tree *tree) { phydbl u,alpha,ratio; phydbl cur_glnL,new_glnL; phydbl cur_tlnL,new_tlnL; phydbl c,rad,T; t_dsk *disk,**target_disk,**valid_disks; t_ldsk **target_ldsk,**old_ldsk,**young_ldsk; int i,j,block,n_valid_disks,*dir_old_young,*permut,err; assert(RRW_Is_Rw(tree->mmod) == NO && VELOC_Is_Integrated_Velocity(tree->mmod) == NO); tree->mcmc->run_move[tree->mcmc->num_move_phyrex_indel_hit]++; if(n_delete_disks == 0) { tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; return; } Set_Lk(tree); disk = NULL; valid_disks = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; ratio = 0.0; block = 100; rad = 0.0; for(j=0;jmmod->n_dim;j++) rad += 0.01 * (tree->mmod->lim_up->lonlat[j]-tree->mmod->lim_do->lonlat[j]); rad /= tree->mmod->n_dim; if(tree->young_disk->next) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); disk = tree->young_disk->prev; if(!disk->prev) { tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; return; } n_valid_disks = 0; do { /* Include only disks with displacement that are not coalescent events */ if(disk->ldsk != NULL && disk->ldsk->n_next == 1) { if(!n_valid_disks) valid_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_valid_disks+1)%block)) valid_disks = (t_dsk **)mRealloc(valid_disks,n_valid_disks+block,sizeof(t_dsk *)); valid_disks[n_valid_disks] = disk; n_valid_disks++; } disk = disk->prev; } while(disk && disk->prev); if(!n_valid_disks || (n_valid_disks - n_delete_disks < 0)) { tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; return; } target_disk = (t_dsk **)mCalloc(n_delete_disks,sizeof(t_dsk *)); target_ldsk = (t_ldsk **)mCalloc(n_delete_disks,sizeof(t_ldsk *)); old_ldsk = (t_ldsk **)mCalloc(n_delete_disks,sizeof(t_ldsk *)); young_ldsk = (t_ldsk **)mCalloc(n_delete_disks,sizeof(t_ldsk *)); dir_old_young = (int *)mCalloc(n_delete_disks,sizeof(int)); permut = Permutate(n_valid_disks); for(j=0;jldsk; assert(target_disk[j]->age_fixed == NO); assert(target_ldsk[j] != NULL); assert(target_ldsk[j]->n_next == 1); old_ldsk[j] = target_ldsk[j]->prev; young_ldsk[j] = target_ldsk[j]->next[0]; dir_old_young[j] = PHYREX_Get_Next_Direction(young_ldsk[j],old_ldsk[j]); assert(dir_old_young[j] != -1); /* Part of the Hastings ratio corresponding to the probability of selecting */ /* target_disk->ldsk->next[0] to be hit (reverse move) */ hr += log(1./target_disk[j]->next->n_ldsk_a); /* Density for position of the displaced ldsk */ for(i=0;immod->n_dim;i++) { hr += log(1./(tree->mmod->lim_up->lonlat[i]-tree->mmod->lim_do->lonlat[i])); if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) { c = target_disk[j]->centr->lonlat[i]; } else if(RRW_Is_Rw(tree->mmod) == YES) { c = .5*(target_ldsk[j]->prev->coord->lonlat[i] + target_ldsk[j]->next[0]->coord->lonlat[i]); } else c = -1.; hr += Log_Dnorm_Trunc(target_ldsk[j]->coord->lonlat[i], c, rad, tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); } /* New connections between old_ldsk and young_ldsk */ old_ldsk[j]->next[dir_old_young[j]] = young_ldsk[j]; young_ldsk[j]->prev = old_ldsk[j]; /* Remove target disk */ PHYREX_Remove_Disk(target_disk[j]); /* Update ldsk_a arrays in the time interval affected by the deletion */ PHYREX_Update_Lindisk_List_Range(young_ldsk[j]->disk,old_ldsk[j]->disk,tree); } T = PHYREX_Tree_Height(tree); T = fabs(T-tree->young_disk->time); hr += LnChoose(n_valid_disks,n_delete_disks); hr += n_delete_disks * log(1./T); hr += LnFact(n_delete_disks); Free(valid_disks); if(tree->eval_glnL == YES) new_glnL = LOCATION_Lk(NULL,tree); if(tree->eval_tlnL == YES) new_tlnL = TIMES_Lk(tree); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); /* printf("\n- Delete hit %15f %15f %5d",new_glnL - cur_glnL, alpha, n_delete_disks); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { tree->mmod->lbda = cur_lbda; tree->mmod->rad = cur_rad; tree->mmod->mu = cur_mu; for(j=n_delete_disks-1;j>=0;j--) { PHYREX_Insert_Disk(target_disk[j],tree); old_ldsk[j]->next[dir_old_young[j]] = target_ldsk[j]; young_ldsk[j]->prev = target_ldsk[j]; } PHYREX_Update_Lindisk_List(tree); Reset_Lk(tree); } else { for(j=0;jmcmc->acc_move[tree->mcmc->num_move_phyrex_indel_hit]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); Free(target_disk); Free(target_ldsk); Free(old_ldsk); Free(young_ldsk); Free(dir_old_young); Free(permut); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Obsolete. Won't work with Exchange_Ldsks and Exchange_Nodes functions. Should have zero weight. */ #ifdef PHYREX void MCMC_PHYREX_Prune_Regraft(t_tree *tree, int print) { phydbl u,alpha,ratio,hr; phydbl cur_glnL, new_glnL; phydbl cur_alnL, new_alnL; phydbl cur_rlnL, new_rlnL; phydbl cur_tlnL, new_tlnL; t_dsk *disk,*regraft_disk,*oldest_disk,*youngest_disk,*regraft_disk_prev,*regraft_disk_next,*a_root_dsk; t_ldsk *prune_ldsk,*regraft_ldsk,*prune_ldsk_daughter,*cur_path,*new_path,*ldsk,*ldsk_dum,*regraft_ldsk_prev,*regraft_ldsk_next,*prune_ldsk_prev,*prune_ldsk_next, *a_root_ldsk,*root_ldsk; int i,j,n_prune_ldsks,err; short int dir_regraft_prev_next,dir_prune_prev_prune,dir_prune_daughter; int cur_path_len; int n_iter; int cur_pos,new_pos; phydbl *rad; phydbl dt_orig,dt_new; phydbl cur_t,new_t; phydbl K; if(tree->mod->s_opt->opt_topo == NO) return; K = 0.5; /* n_iter = (int)(1+Rand_Int(0,0.05*tree->n_otu)); */ n_iter = (int)(1+0.2*tree->n_otu); rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ /* for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; */ for(j=0;jmmod->n_dim;++j) rad[j] = 1.*tree->mmod->sigsq[j]; /* Disk and lineage sitting on top of actual root */ a_root_dsk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(a_root_dsk,tree->mmod->n_dim,tree->mmod); a_root_ldsk = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(a_root_ldsk,a_root_dsk,tree->mmod->n_dim); PHYREX_Make_Lindisk_Next(a_root_ldsk); a_root_dsk->ldsk = a_root_ldsk; for(j=0;jmmod->n_dim;++j) a_root_ldsk->coord->lonlat[j] = 0.5*(tree->mmod->lim_up->lonlat[j] + tree->mmod->lim_do->lonlat[j]);; PHYREX_Update_Ldsk_Rates_Given_Edges(tree); PHYREX_Update_Ldsk_Sigsq_Given_Edges(tree); while(n_iter--) { tree->mcmc->run_move[tree->mcmc->num_move_phyrex_spr]++; Set_Lk(tree); disk = NULL; prune_ldsk_next = NULL; prune_ldsk_prev = NULL; regraft_ldsk_next = NULL; regraft_ldsk_prev = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; cur_alnL = tree->c_lnL; new_alnL = UNLIKELY; cur_rlnL = tree->rates->c_lnL; new_rlnL = UNLIKELY; new_t = -1.0; cur_t = -1.0; hr = 0.0; ratio = 0.0; cur_pos = -1; new_pos = -1; dir_prune_prev_prune = -1; dir_regraft_prev_next = -1; dir_prune_daughter = -1; root_ldsk = tree->n_root->ldsk; if(tree->eval_tlnL == YES) assert(cur_tlnL > UNLIKELY); if(tree->eval_glnL == YES) assert(cur_glnL > UNLIKELY); if(tree->eval_alnL == YES) assert(cur_alnL > UNLIKELY); if(tree->eval_rlnL == YES) assert(cur_rlnL > UNLIKELY); if(tree->young_disk->next) assert(FALSE); /* Connect a_root_ldsk to root_ldsk */ a_root_ldsk->next[0] = root_ldsk; a_root_dsk->next = root_ldsk->disk; root_ldsk->prev = a_root_ldsk; root_ldsk->disk->prev = a_root_dsk; a_root_dsk->time = -TWO_TO_THE_LARGE; disk = tree->young_disk->prev; n_prune_ldsks = 0; do { /* Include only disks with displacement that are coalescent events with out-degree==2 */ if(disk->ldsk != NULL && disk->ldsk->n_next == 2 && disk->ldsk->prev != NULL) for(i=0;ildsk->n_next;++i) n_prune_ldsks++; disk = disk->prev; } while(disk); if(!n_prune_ldsks) { root_ldsk->prev = NULL; root_ldsk->disk->prev = NULL; Free(rad); return; } prune_ldsk_daughter = NULL; do { u = Uni(); } while(!(u<1.0)); // 0 <= u < 1 j = 0; disk = tree->young_disk->prev; do { if(disk->ldsk != NULL && disk->ldsk->n_next == 2 && disk->ldsk->prev != NULL) { for(i=0;ildsk->n_next;++i) { j++; if((phydbl)j/n_prune_ldsks > u) { prune_ldsk_daughter = disk->ldsk->next[i]; dir_prune_daughter = i; break; } } if(i != disk->ldsk->n_next) break; } disk = disk->prev; } while(disk); assert(prune_ldsk_daughter != NULL); prune_ldsk = prune_ldsk_daughter->prev; /* prune_ldsk_daughter is the next coalescent event or tip node */ while(prune_ldsk_daughter->n_next == 1) prune_ldsk_daughter = prune_ldsk_daughter->next[0]; assert(dir_prune_daughter > -1); if(RRW_Is_Rw(tree->mmod) == YES && tree->mmod->use_locations == YES) for(j=0;jmmod->n_dim;j++) hr += RRW_Density_Ldsk_Location(prune_ldsk,rad[j],j,NO,tree); // TO DO: add similar function for SLFV assert(prune_ldsk_daughter->disk->time > tree->n_root->ldsk->disk->time); /* Set time of regraft_ldsk */ cur_t = prune_ldsk->disk->time; /* K = (tree->young_disk->time - tree->n_root->ldsk->disk->time)/10.; /\* Needs updating if new node age is above that of (old) root node *\/ */ K = (tree->young_disk->time - cur_t)/20.; /* Needs updating if new node age is above that of (old) root node */ new_t = Rnorm_Trunc(cur_t,K,-TWO_TO_THE_LARGE,prune_ldsk_daughter->disk->time,&err); hr -= Log_Dnorm_Trunc(new_t,cur_t,K,-TWO_TO_THE_LARGE,prune_ldsk_daughter->disk->time,&err); disk = prune_ldsk_daughter->disk; while(disk->time > new_t) disk = disk->prev; assert(disk); regraft_disk_next = disk->next; regraft_disk_prev = disk; /* Which lineage is going to be hit ? */ if(new_t < root_ldsk->disk->time) regraft_ldsk_next = root_ldsk; else { regraft_ldsk_next = PHYREX_Random_Select_Outgoing_Ldsk(regraft_disk_next); hr -= log(1./(PHYREX_Number_Of_Outgoing_Ldsks(regraft_disk_next))); if(new_t > cur_t && PHYREX_Is_On_Path(regraft_ldsk_next,prune_ldsk_daughter,prune_ldsk) == YES) { root_ldsk->prev = NULL; root_ldsk->disk->prev = NULL; continue; } } regraft_ldsk_prev = regraft_ldsk_next->prev; assert(regraft_ldsk_prev != regraft_ldsk_next); /* Direction from old to young ldsk */ dir_regraft_prev_next = PHYREX_Get_Next_Direction(regraft_ldsk_next,regraft_ldsk_prev); assert(dir_regraft_prev_next != -1); /* Create regraft disk */ regraft_disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(regraft_disk,tree->mmod->n_dim,tree->mmod); regraft_disk->time = new_t; /* Make and initialize regraft_ldsk */ regraft_ldsk = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(regraft_ldsk,regraft_disk,tree->mmod->n_dim); PHYREX_Make_Lindisk_Next(regraft_ldsk); regraft_disk->ldsk = regraft_ldsk; /* Range of disks that require updating */ oldest_disk = NULL; youngest_disk = NULL; ldsk = prune_ldsk; if(ldsk->prev) do { ldsk = ldsk->prev; } while(ldsk->prev && ldsk->n_next < 2); oldest_disk = ldsk->disk; ldsk = regraft_ldsk_prev; while(ldsk->prev && (ldsk->n_next < 2)) { ldsk = ldsk->prev; } if(ldsk->disk->time < oldest_disk->time) oldest_disk = ldsk->disk; disk = prune_ldsk_daughter->disk; while(disk->next && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) disk = disk->next; youngest_disk = disk; assert(youngest_disk); /* Connect regraft_ldsk */ regraft_ldsk->prev = regraft_ldsk_prev; regraft_ldsk->next[0] = regraft_ldsk_next; regraft_ldsk_next->prev = regraft_ldsk; regraft_ldsk_prev->next[dir_regraft_prev_next] = regraft_ldsk; regraft_ldsk->rr = prune_ldsk->rr; regraft_ldsk->sigsq = prune_ldsk->sigsq; /* Temporary connections */ PHYREX_Make_Lindisk_Next(regraft_ldsk); regraft_ldsk->next[1] = prune_ldsk->next[dir_prune_daughter]; prune_ldsk->next[dir_prune_daughter]->prev = regraft_ldsk; /* Insert regraft_disk */ PHYREX_Insert_Disk(regraft_disk,tree); assert(regraft_disk->next == regraft_disk_next); assert(regraft_disk->prev == regraft_disk_prev); /* Set new position of regraft_ldsk */ if(tree->mmod->use_locations == YES) { for(j=0;jmmod->n_dim;j++) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) SLFV_Generate_Ldsk_New_Location(regraft_ldsk,prune_ldsk,rad[j],&hr,j,tree); else if(RRW_Is_Rw(tree->mmod) == YES) { RRW_Generate_Ldsk_New_Location(regraft_ldsk,rad[j],j,NO,tree); hr -= RRW_Density_Ldsk_Location(regraft_ldsk,rad[j],j,NO,tree); } } } /* Remove temporary connections */ PHYREX_Remove_Lindisk_Next(regraft_ldsk,regraft_ldsk->next[1]); regraft_ldsk->next[1] = NULL; prune_ldsk->next[dir_prune_daughter]->prev = prune_ldsk; /* Prune and regraft */ cur_path_len = PHYREX_Path_Len(prune_ldsk_daughter,prune_ldsk)-2; if(tree->mmod->use_locations == YES) hr += PHYREX_Path_Logdensity(prune_ldsk_daughter,prune_ldsk,rad,tree); dt_orig = fabs(prune_ldsk_daughter->disk->time - prune_ldsk->disk->time); dt_new = fabs(prune_ldsk_daughter->disk->time - regraft_ldsk->disk->time); new_path = PHYREX_Generate_Path(prune_ldsk_daughter,regraft_ldsk,(int)(cur_path_len*dt_new/dt_orig),rad,tree); cur_path = PHYREX_Remove_Path(prune_ldsk_daughter,prune_ldsk,&cur_pos,tree); new_pos = Rand_Int(0,regraft_ldsk->n_next); hr -= log(1./(phydbl)(regraft_ldsk->n_next+1)); hr += log(1./(phydbl)(prune_ldsk->n_next+1)); PHYREX_Insert_Path(prune_ldsk_daughter,regraft_ldsk,new_path,new_pos,tree); if(tree->mmod->use_locations == YES) hr -= PHYREX_Path_Logdensity(prune_ldsk_daughter,regraft_ldsk,rad,tree); /* prune_ldsk had outdegree 2, now has outdegree 1 -> remove corresponding disk */ if(prune_ldsk->n_next == 1) { prune_ldsk_prev = prune_ldsk->prev; prune_ldsk_next = prune_ldsk->next[0]; dir_prune_prev_prune = PHYREX_Get_Next_Direction(prune_ldsk,prune_ldsk_prev); assert(dir_prune_prev_prune != -1); prune_ldsk_prev->next[dir_prune_prev_prune] = prune_ldsk_next; prune_ldsk_next->prev = prune_ldsk_prev; PHYREX_Remove_Disk(prune_ldsk->disk); } /* Temporarily disconnect a_root_ldsk and root_ldsk */ a_root_dsk->next->prev = NULL; a_root_ldsk->next[0]->prev = NULL; PHYREX_Update_Lindisk_List_Range(youngest_disk,oldest_disk,tree); PHYREX_Ldsk_To_Tree(tree); PHYREX_Update_Node_Times_Given_Disks(tree); PHYREX_Update_Edge_Rates_Given_Ldsks(tree); PHYREX_Update_Edge_Sigsq_Given_Ldsks(tree); RATES_Update_Edge_Lengths(tree); assert(tree->n_root->ldsk->disk->prev == NULL); if(tree->eval_glnL == YES) { new_glnL = (tree->mmod->use_locations == YES) ? LOCATION_Lk(NULL,tree) : 0.0; if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } else { new_glnL = 0.0; } if(tree->eval_tlnL == YES) { new_tlnL = TIMES_Lk(tree); } else { new_tlnL = 0.0; } if(tree->eval_alnL == YES && new_glnL > UNLIKELY) new_alnL = Lk(NULL,tree); if(tree->eval_rlnL == YES && new_glnL > UNLIKELY) new_rlnL = RATES_Lk(tree); root_ldsk = tree->n_root->ldsk; /* Remaining of Hastings ratio for regraft and prune node age. */ /* Note that root time may be distinct from that of current tree, hence the need to update K. */ /* K = (tree->young_disk->time - root_ldsk->disk->time)/10.; */ K = (tree->young_disk->time - new_t)/20.; hr += Log_Dnorm_Trunc(cur_t,new_t,K,-TWO_TO_THE_LARGE,prune_ldsk_daughter->disk->time,&err); /* Remaining of the Hastings ratio for the number of lineages the regraft edge can connect to */ if(cur_t > root_ldsk->disk->time) { disk = prune_ldsk_daughter->disk; while(disk->time > cur_t) disk = disk->prev; assert(disk); regraft_disk_next = disk->next; hr += log(1./(PHYREX_Number_Of_Outgoing_Ldsks(regraft_disk_next))); } ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_alnL - cur_alnL); if(tree->eval_rlnL == YES) ratio += (new_rlnL - cur_rlnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); if(tree->eval_glnL == YES && tree->mmod->use_locations == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* if(tree->eval_alnL == YES) */ /* { */ /* phydbl delta1 = new_alnL - cur_alnL; */ /* phydbl delta2 = Lk(NULL,tree) - cur_alnL; */ /* PhyML_Printf("\n<<>> delta1=%f delta2=%f [%15f]",delta1,delta2,Lk(NULL,tree)); */ /* if(Are_Equal(delta1,delta2,1.E-5)==NO) { */ /* { */ /* PhyML_Printf("\n<> delta1=%f delta2=%f",delta1,delta2); */ /* PhyML_Printf("\n<> new_alnL=%f cur_alnL=%f",new_alnL,cur_alnL); */ /* assert(FALSE); */ /* } */ /* } */ /* } */ /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; if(print == YES) PhyML_Printf("\n> SPR cycle: %d alnL: [%16f->%16f] glnL: [%16f->%16f] rlnL: [%16f->%16f] tlnL: [%16f->%16f] T: [%16f->%16f] root_rate: %f | hr: %14f alpha: %12f", tree->mcmc->run, cur_alnL,new_alnL, cur_glnL,new_glnL, cur_rlnL,new_rlnL, cur_tlnL,new_tlnL, prune_ldsk->disk->time,regraft_ldsk->disk->time, tree->rates->br_r[tree->n_root->num], hr,alpha); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* Reconnect a_root_ldsk and root_ldsk */ a_root_dsk->next->prev = a_root_dsk; a_root_ldsk->next[0]->prev = a_root_ldsk; if(prune_ldsk->n_next == 1) { prune_ldsk_prev->next[dir_prune_prev_prune] = prune_ldsk; prune_ldsk_next->prev = prune_ldsk; PHYREX_Insert_Disk(prune_ldsk->disk,tree); } new_path = PHYREX_Remove_Path(prune_ldsk_daughter,regraft_ldsk,&new_pos,tree); PHYREX_Insert_Path(prune_ldsk_daughter,prune_ldsk,cur_path,cur_pos,tree); assert(regraft_disk->ldsk->n_next == 1); regraft_ldsk_next->prev = regraft_ldsk_prev; regraft_ldsk_prev->next[dir_regraft_prev_next] = regraft_ldsk_next; PHYREX_Remove_Disk(regraft_disk); a_root_dsk->next->prev = NULL; a_root_ldsk->next[0]->prev = NULL; PHYREX_Update_Lindisk_List_Range(youngest_disk,oldest_disk,tree); PHYREX_Free_Ldisk(regraft_ldsk); PHYREX_Free_Disk(regraft_disk); PHYREX_Ldsk_To_Tree(tree); PHYREX_Update_Node_Times_Given_Disks(tree); PHYREX_Update_Edge_Rates_Given_Ldsks(tree); PHYREX_Update_Edge_Sigsq_Given_Ldsks(tree); RATES_Fill_Lca_Table(tree); RATES_Update_Edge_Lengths(tree); Reset_Lk(tree); ldsk = new_path; while(ldsk) { PHYREX_Free_Disk(ldsk->disk); ldsk_dum = ldsk; ldsk = ldsk->prev; PHYREX_Free_Ldisk(ldsk_dum); } } else { tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; if(!(new_tlnL > UNLIKELY && new_glnL > UNLIKELY)) { PhyML_Printf("\n. [%d/%d] tlnL: %f->%f glnL: %f->%f alnL: %f->%f rlnL: %f->%f hr: %f", n_iter,(int)(1+0.2*tree->n_otu), cur_tlnL,new_tlnL, cur_glnL,new_glnL, cur_alnL,new_alnL, cur_rlnL,new_rlnL, hr); assert(false); } ldsk = cur_path; while(ldsk) { PHYREX_Free_Disk(ldsk->disk); ldsk_dum = ldsk; ldsk = ldsk->prev; PHYREX_Free_Ldisk(ldsk_dum); } PHYREX_Free_Disk(prune_ldsk->disk); PHYREX_Free_Ldisk(prune_ldsk); /* Shouldn't be required, right ? */ PHYREX_Update_Ldsk_Rates_Given_Edges(tree); PHYREX_Update_Ldsk_Sigsq_Given_Edges(tree); tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_spr]++; } PHYREX_Remove_Disk(a_root_dsk); tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } assert(tree->n_root->ldsk->disk->prev == NULL); PHYREX_Free_Disk(a_root_dsk); PHYREX_Free_Ldisk(a_root_ldsk); Free(rad); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Obsolete. Won't work with Exchange_Ldsks and Exchange_Nodes functions. Should have zero weight. */ #ifdef PHYREX void MCMC_PHYREX_Prune_Regraft_Slide(t_tree *tree, int print) { phydbl u,alpha,ratio,hr; phydbl cur_glnL, new_glnL; phydbl cur_alnL, new_alnL; phydbl cur_rlnL, new_rlnL; phydbl cur_tlnL, new_tlnL; t_dsk *disk,*regraft_disk,*oldest_disk,*youngest_disk,*a_root_dsk; t_ldsk *prune_ldsk,*regraft_ldsk,*prune_ldsk_daughter,*cur_path,*new_path,*ldsk,*ldsk_dum,*regraft_ldsk_prev,*regraft_ldsk_next,*prune_ldsk_prev,*prune_ldsk_next, *a_root_ldsk,*root_ldsk; int i,j,n_prune_ldsks; short int dir_regraft_prev_next,dir_prune_prev_prune,dir_prune_daughter; int cur_path_len; int n_iter,err; int cur_pos,new_pos; phydbl *rad; phydbl dt_orig,dt_new; phydbl cur_t,new_t,K; if(tree->mod->s_opt->opt_topo == NO) return; /* n_iter = (int)(1+Rand_Int(0,0.2*tree->n_otu)); */ n_iter = (int)(1+0.2*tree->n_otu); rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ /* for(j=0;jmmod->n_dim;++j) rad[j] = (0.1)*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]); */ for(j=0;jmmod->n_dim;++j) rad[j] = 1.*tree->mmod->sigsq[j]; /* Disk and lineage sitting on top of actual root */ a_root_dsk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(a_root_dsk,tree->mmod->n_dim,tree->mmod); a_root_ldsk = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(a_root_ldsk,a_root_dsk,tree->mmod->n_dim); PHYREX_Make_Lindisk_Next(a_root_ldsk); a_root_dsk->ldsk = a_root_ldsk; for(j=0;jmmod->n_dim;++j) a_root_ldsk->coord->lonlat[j] = 0.5*(tree->mmod->lim_up->lonlat[j] + tree->mmod->lim_do->lonlat[j]);; PHYREX_Update_Ldsk_Rates_Given_Edges(tree); PHYREX_Update_Ldsk_Sigsq_Given_Edges(tree); while(n_iter--) { tree->mcmc->run_move[tree->mcmc->num_move_phyrex_spr_slide]++; Set_Lk(tree); disk = NULL; prune_ldsk_next = NULL; prune_ldsk_prev = NULL; regraft_ldsk_next = NULL; regraft_ldsk_prev = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; cur_alnL = tree->c_lnL; new_alnL = UNLIKELY; cur_rlnL = tree->rates->c_lnL; new_rlnL = UNLIKELY; hr = 0.0; ratio = 0.0; cur_pos = -1; new_pos = -1; dir_prune_prev_prune = -1; dir_regraft_prev_next = -1; dir_prune_daughter = -1; root_ldsk = tree->n_root->ldsk; err = NO; if(tree->eval_tlnL == YES) assert(cur_tlnL > UNLIKELY); if(tree->eval_glnL == YES) assert(cur_glnL > UNLIKELY); if(tree->eval_alnL == YES) assert(cur_alnL > UNLIKELY); if(tree->eval_rlnL == YES) assert(cur_rlnL > UNLIKELY); if(tree->young_disk->next) assert(FALSE); /* Connect a_root_ldsk to root_ldsk */ a_root_ldsk->next[0] = root_ldsk; a_root_dsk->next = root_ldsk->disk; root_ldsk->prev = a_root_ldsk; root_ldsk->disk->prev = a_root_dsk; a_root_dsk->time = -TWO_TO_THE_LARGE; disk = tree->young_disk->prev; n_prune_ldsks = 0; do { /* Include only disks with displacement that are coalescent events with out-degree==2 */ if(disk->ldsk != NULL && disk->ldsk->n_next == 2 && disk->ldsk->prev != NULL) for(i=0;ildsk->n_next;++i) n_prune_ldsks++; disk = disk->prev; } while(disk); if(!n_prune_ldsks) { root_ldsk->prev = NULL; root_ldsk->disk->prev = NULL; Free(rad); return; } prune_ldsk_daughter = NULL; do { u = Uni(); } while(!(u<1.0)); // 0 <= u < 1 j = 0; disk = tree->young_disk->prev; do { if(disk->ldsk != NULL && disk->ldsk->n_next == 2 && disk->ldsk->prev != NULL) { for(i=0;ildsk->n_next;++i) { j++; if((phydbl)j/n_prune_ldsks > u) { prune_ldsk_daughter = disk->ldsk->next[i]; dir_prune_daughter = i; break; } } if(i != disk->ldsk->n_next) break; } disk = disk->prev; } while(disk); assert(prune_ldsk_daughter != NULL); prune_ldsk = prune_ldsk_daughter->prev; /* prune_ldsk_daughter is the next coalescent event or tip node */ while(prune_ldsk_daughter->n_next == 1) prune_ldsk_daughter = prune_ldsk_daughter->next[0]; /* dir_prune_daughter = PHYREX_Get_Next_Direction(prune_ldsk_daughter,prune_ldsk); */ assert(dir_prune_daughter > -1); if(RRW_Is_Rw(tree->mmod) == YES && tree->mmod->use_locations == YES) for(j=0;jmmod->n_dim;j++) hr += RRW_Density_Ldsk_Location(prune_ldsk,rad[j],j,NO,tree); // TO DO: add similar function for SLFV /* Set time of regraft_ldsk */ cur_t = prune_ldsk->disk->time; /* K = (tree->young_disk->time - tree->n_root->ldsk->disk->time)/10. ; /\* Needs updating if new node age is above that of (old) root node *\/ */ K = (tree->young_disk->time - cur_t)/10.; /* Needs updating if new node age is above that of (old) root node */ new_t = Rnorm_Trunc(cur_t,K,-TWO_TO_THE_LARGE,prune_ldsk_daughter->disk->time,&err); hr -= Log_Dnorm_Trunc(new_t,cur_t,K,-TWO_TO_THE_LARGE,prune_ldsk_daughter->disk->time,&err); /* new_t = Rnorm_Trunc(cur_t,K,2.*cur_t-prune_ldsk_daughter->disk->time,prune_ldsk_daughter->disk->time,&err); */ /* hr -= Log_Dnorm_Trunc(new_t,cur_t,K,2.*cur_t-prune_ldsk_daughter->disk->time,prune_ldsk_daughter->disk->time,&err); */ regraft_ldsk_next = prune_ldsk; regraft_ldsk_prev = prune_ldsk->prev; /* New time is older than current time, climb up the tree */ if(new_t < cur_t) { ldsk = prune_ldsk; do { if(ldsk->prev->disk->time < new_t) break; hr += log(1./ldsk->prev->n_next); ldsk = ldsk->prev; } while(ldsk->prev); regraft_ldsk_next = ldsk; regraft_ldsk_prev = ldsk->prev; } else /* New time is younger, randomly descend the tree */ { ldsk = NULL; for(i=0;in_next;++i) { if(i != dir_prune_daughter) { ldsk = prune_ldsk->next[i]; break; } } while(ldsk->disk->time < new_t) { if(ldsk->n_next == 0) { ldsk = NULL; break; } i = Rand_Int(0,ldsk->n_next-1); hr -= log(1./ldsk->n_next); ldsk = ldsk->next[i]; } if(ldsk == NULL) { root_ldsk->prev = NULL; root_ldsk->disk->prev = NULL; continue; } else { regraft_ldsk_next = ldsk; regraft_ldsk_prev = ldsk->prev; } } /* if(regraft_ldsk_next == prune_ldsk) */ /* { */ /* root_ldsk->prev = NULL; */ /* root_ldsk->disk->prev = NULL; */ /* continue; */ /* } */ assert(regraft_ldsk_prev != regraft_ldsk_next); /* Direction from old to young ldsk */ dir_regraft_prev_next = PHYREX_Get_Next_Direction(regraft_ldsk_next,regraft_ldsk_prev); assert(dir_regraft_prev_next != -1); /* Create regraft disk */ regraft_disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(regraft_disk,tree->mmod->n_dim,tree->mmod); regraft_disk->time = new_t; /* Make and initialize regraft_ldsk */ regraft_ldsk = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(regraft_ldsk,regraft_disk,tree->mmod->n_dim); PHYREX_Make_Lindisk_Next(regraft_ldsk); regraft_disk->ldsk = regraft_ldsk; /* Range of disks that require updating */ oldest_disk = NULL; youngest_disk = NULL; ldsk = prune_ldsk; if(ldsk->prev) do { ldsk = ldsk->prev; } while(ldsk->prev && ldsk->n_next < 2); oldest_disk = ldsk->disk; ldsk = regraft_ldsk_prev; while(ldsk->prev && ldsk->n_next < 2) { ldsk = ldsk->prev; } if(ldsk->disk->time < oldest_disk->time) oldest_disk = ldsk->disk; disk = prune_ldsk_daughter->disk; while(disk->next && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) disk = disk->next; youngest_disk = disk; assert(youngest_disk); /* Connect regraft_ldsk */ regraft_ldsk->prev = regraft_ldsk_prev; regraft_ldsk->next[0] = regraft_ldsk_next; regraft_ldsk_next->prev = regraft_ldsk; regraft_ldsk_prev->next[dir_regraft_prev_next] = regraft_ldsk; regraft_ldsk->rr = prune_ldsk->rr; regraft_ldsk->sigsq = prune_ldsk->sigsq; /* Temporary connections */ PHYREX_Make_Lindisk_Next(regraft_ldsk); regraft_ldsk->next[1] = prune_ldsk->next[dir_prune_daughter]; prune_ldsk->next[dir_prune_daughter]->prev = regraft_ldsk; /* Insert regraft_disk */ PHYREX_Insert_Disk(regraft_disk,tree); /* Set new position of regraft_ldsk */ if(tree->mmod->use_locations == YES) { for(j=0;jmmod->n_dim;j++) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) SLFV_Generate_Ldsk_New_Location(regraft_ldsk,prune_ldsk,rad[j],&hr,j,tree); else if(RRW_Is_Rw(tree->mmod) == YES) { RRW_Generate_Ldsk_New_Location(regraft_ldsk,rad[j],j,NO,tree); hr -= RRW_Density_Ldsk_Location(regraft_ldsk,rad[j],j,NO,tree); } } } /* Remove temporary connections */ PHYREX_Remove_Lindisk_Next(regraft_ldsk,regraft_ldsk->next[1]); regraft_ldsk->next[1] = NULL; prune_ldsk->next[dir_prune_daughter]->prev = prune_ldsk; /* Prune and regraft */ cur_path_len = PHYREX_Path_Len(prune_ldsk_daughter,prune_ldsk)-2; if(tree->mmod->use_locations == YES) hr += PHYREX_Path_Logdensity(prune_ldsk_daughter,prune_ldsk,rad,tree); dt_orig = fabs(prune_ldsk_daughter->disk->time - prune_ldsk->disk->time); dt_new = fabs(prune_ldsk_daughter->disk->time - regraft_ldsk->disk->time); new_path = PHYREX_Generate_Path(prune_ldsk_daughter,regraft_ldsk,(int)(cur_path_len*dt_new/dt_orig),rad,tree); cur_path = PHYREX_Remove_Path(prune_ldsk_daughter,prune_ldsk,&cur_pos,tree); new_pos = Rand_Int(0,regraft_ldsk->n_next); hr -= log(1./(phydbl)(regraft_ldsk->n_next+1)); hr += log(1./(phydbl)(prune_ldsk->n_next+1)); PHYREX_Insert_Path(prune_ldsk_daughter,regraft_ldsk,new_path,new_pos,tree); if(tree->mmod->use_locations == YES) hr -= PHYREX_Path_Logdensity(prune_ldsk_daughter,regraft_ldsk,rad,tree); /* prune_ldsk had outdegree 2, now has outdegree 1 -> remove corresponding disk */ if(prune_ldsk->n_next == 1) { prune_ldsk_prev = prune_ldsk->prev; prune_ldsk_next = prune_ldsk->next[0]; dir_prune_prev_prune = PHYREX_Get_Next_Direction(prune_ldsk,prune_ldsk_prev); assert(dir_prune_prev_prune != -1); prune_ldsk_prev->next[dir_prune_prev_prune] = prune_ldsk_next; prune_ldsk_next->prev = prune_ldsk_prev; PHYREX_Remove_Disk(prune_ldsk->disk); } /* Disconnect a_root_ldsk and root_ldsk */ a_root_dsk->next->prev = NULL; a_root_ldsk->next[0]->prev = NULL; PHYREX_Update_Lindisk_List_Range(youngest_disk,oldest_disk,tree); PHYREX_Ldsk_To_Tree(tree); PHYREX_Update_Node_Times_Given_Disks(tree); PHYREX_Update_Edge_Rates_Given_Ldsks(tree); PHYREX_Update_Edge_Sigsq_Given_Ldsks(tree); RATES_Update_Edge_Lengths(tree); assert(tree->n_root->ldsk->disk->prev == NULL); if(tree->eval_glnL == YES) { new_glnL = (tree->mmod->use_locations == YES) ? LOCATION_Lk(NULL,tree) : 0.0; if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } else { new_glnL = 0.0; } if(tree->eval_tlnL == YES) { new_tlnL = TIMES_Lk(tree); } else { new_tlnL = 0.0; } /* Remaining of Hastings ratio for regraft and prune node age */ /* Note that root time may be distinct from that of current tree, hence the need to update K. */ /* K = (tree->young_disk->time - tree->n_root->ldsk->disk->time)/10.; */ K = (tree->young_disk->time - new_t)/10.; hr += Log_Dnorm_Trunc(cur_t,new_t,K,-TWO_TO_THE_LARGE,prune_ldsk_daughter->disk->time,&err); /* K = (tree->young_disk->time - tree->n_root->ldsk->disk->time)/10.; */ /* hr += Log_Dnorm_Trunc(cur_t,new_t,K,2.*new_t-prune_ldsk_daughter->disk->time,prune_ldsk_daughter->disk->time,&err); */ if(tree->eval_alnL == YES && new_glnL > UNLIKELY) new_alnL = Lk(NULL,tree); if(tree->eval_rlnL == YES && new_glnL > UNLIKELY) new_rlnL = RATES_Lk(tree); ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_alnL - cur_alnL); if(tree->eval_rlnL == YES) ratio += (new_rlnL - cur_rlnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* { */ /* phydbl delta1 = new_glnL - cur_glnL; */ /* phydbl delta2 = LOCATION_Lk(NULL,tree) - cur_glnL; */ /* /\* PhyML_Printf("\n<<>> delta1=%f delta2=%f",delta1,delta2); *\/ */ /* if(Are_Equal(delta1,delta2,1.E-5)==NO) { */ /* { */ /* PhyML_Printf("\n<> delta1=%f delta2=%f",delta1,delta2); */ /* assert(FALSE); */ /* } */ /* } */ /* } */ /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; /* printf("\n. %3d %3d alpha:%12f %3d",prune_ldsk->n_next+1,regraft_ldsk->n_next-1,alpha,new_n_coal); */ /* if(tree->eval_alnL == YES) */ /* if(above_root == YES) */ if(print == YES) { PhyML_Printf("\n SLIDE %5d alnL[%16f->%16f] glnL[%16f->%16f] rlnL[%16f->%16f] tlnL[%16f->%16f] t[%10f->%10f] hr: %14f alpha: %12f K=%15f", tree->mcmc->run, cur_alnL,new_alnL, cur_glnL,new_glnL, cur_rlnL,new_rlnL, cur_tlnL,new_tlnL, cur_t,new_t, hr,alpha,K); } u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* Reconnect a_root_ldsk and root_ldsk */ a_root_dsk->next->prev = a_root_dsk; a_root_ldsk->next[0]->prev = a_root_ldsk; if(prune_ldsk->n_next == 1) { prune_ldsk_prev->next[dir_prune_prev_prune] = prune_ldsk; prune_ldsk_next->prev = prune_ldsk; PHYREX_Insert_Disk(prune_ldsk->disk,tree); } new_path = PHYREX_Remove_Path(prune_ldsk_daughter,regraft_ldsk,&new_pos,tree); PHYREX_Insert_Path(prune_ldsk_daughter,prune_ldsk,cur_path,cur_pos,tree); assert(regraft_disk->ldsk->n_next == 1); regraft_ldsk_next->prev = regraft_ldsk_prev; regraft_ldsk_prev->next[dir_regraft_prev_next] = regraft_ldsk_next; PHYREX_Remove_Disk(regraft_disk); a_root_dsk->next->prev = NULL; a_root_ldsk->next[0]->prev = NULL; PHYREX_Update_Lindisk_List_Range(youngest_disk,oldest_disk,tree); PHYREX_Free_Ldisk(regraft_ldsk); PHYREX_Free_Disk(regraft_disk); PHYREX_Ldsk_To_Tree(tree); PHYREX_Update_Node_Times_Given_Disks(tree); PHYREX_Update_Edge_Rates_Given_Ldsks(tree); PHYREX_Update_Edge_Sigsq_Given_Ldsks(tree); RATES_Fill_Lca_Table(tree); RATES_Update_Edge_Lengths(tree); Reset_Lk(tree); ldsk = new_path; while(ldsk) { PHYREX_Free_Disk(ldsk->disk); ldsk_dum = ldsk; ldsk = ldsk->prev; PHYREX_Free_Ldisk(ldsk_dum); } } else { /* PhyML_Printf("\n. Accept --> %f %f",LOCATION_Lk(NULL,tree),new_glnL); */ tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; ldsk = cur_path; while(ldsk) { PHYREX_Free_Disk(ldsk->disk); ldsk_dum = ldsk; ldsk = ldsk->prev; PHYREX_Free_Ldisk(ldsk_dum); } PHYREX_Free_Disk(prune_ldsk->disk); PHYREX_Free_Ldisk(prune_ldsk); /* Shouldn't be required, right ? */ PHYREX_Update_Ldsk_Rates_Given_Edges(tree); PHYREX_Update_Ldsk_Sigsq_Given_Edges(tree); tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_spr_slide]++; } PHYREX_Remove_Disk(a_root_dsk); assert(tree->n_root->ldsk->disk->prev == NULL); tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } assert(tree->n_root->ldsk->disk->prev == NULL); PHYREX_Free_Disk(a_root_dsk); PHYREX_Free_Ldisk(a_root_ldsk); Free(rad); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Lineage_Traj(t_tree *tree) { phydbl u,alpha,ratio,hr; phydbl cur_glnL, new_glnL; phydbl cur_tlnL, new_tlnL; t_dsk *disk,**valid_disks; t_ldsk *old_ldsk,*young_ldsk,*cur_path,*new_path,*ldsk,*ldsk_dum; int j,block,n_valid_disks; int n_iter,cur_path_len,new_path_len; int pos,*permut,dir_next; phydbl *rad; if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) return; if(tree->mmod->use_locations == NO) return; n_iter = 0; valid_disks = NULL; disk = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; hr = 0.0; ratio = 0.0; block = 100; pos = -1; dir_next = -1; rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; disk = tree->young_disk->prev; n_valid_disks = 0; do { if(disk->ldsk && disk->ldsk->n_next >= 2) { if(!n_valid_disks) valid_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_valid_disks+1)%block)) valid_disks = (t_dsk **)mRealloc(valid_disks,n_valid_disks+block,sizeof(t_dsk *)); valid_disks[n_valid_disks] = disk; n_valid_disks++; } disk = disk->prev; } while(disk); if(!n_valid_disks) { Free(rad); return; } permut = Permutate(n_valid_disks); /* n_iter = (int)(1+Rand_Int(0,0.2*n_valid_disks)); */ n_iter = (int)(1+0.2*n_valid_disks); for(j=0;jmcmc->run_move[tree->mcmc->num_move_phyrex_traj]++; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; hr = 0.0; ratio = 0.0; dir_next = -1; old_ldsk = valid_disks[permut[Rand_Int(0,n_valid_disks-1)]]->ldsk; assert(old_ldsk != NULL); dir_next = Rand_Int(0,old_ldsk->n_next-1); young_ldsk = old_ldsk->next[dir_next]; while(young_ldsk->n_next == 1) young_ldsk = young_ldsk->next[0]; /* dt = fabs(young_ldsk->disk->time - old_ldsk->disk->time); */ assert(young_ldsk != NULL); new_glnL = cur_glnL; new_tlnL = cur_tlnL; if(tree->eval_tlnL == YES) { new_tlnL -= TIMES_Lk_Range(young_ldsk->disk,old_ldsk->disk,tree); } /* phydbl dist = Euclidean_Dist(young_ldsk->coord,old_ldsk->coord); */ cur_path_len = PHYREX_Path_Len(young_ldsk,old_ldsk)-2; /* new_path_len = Rpois(dt * 2. * PI * tree->mmod->lbda * tree->mmod->mu * pow(rad,2) / area); */ /* new_path_len = Rpois(cur_path_len+0.01); // To be avoided as create non-irreducible markov chain when new_path_len = 0 (since Pr(cur_path_len|new_path_len)=0) */ /* new_path_len = Rpois((int)(pow(dist,2)/(4.*pow(rad,2)))+0.01); */ /* hr -= Dpois(new_path_len,dt * 2.* PI * tree->mmod->lbda * tree->mmod->mu * pow(rad,2) / area,YES); */ /* hr += Dpois(cur_path_len,dt * 2.* PI * tree->mmod->lbda * tree->mmod->mu * pow(rad,2) / area,YES); */ /* hr -= Dpois(new_path_len,cur_path_len+0.01,YES); */ /* hr += Dpois(cur_path_len,new_path_len+0.01,YES); */ /* hr -= Dpois(new_path_len,(int)(pow(dist,2)/(4.*pow(rad,2)))+0.01,YES); */ /* hr += Dpois(cur_path_len,(int)(pow(dist,2)/(4.*pow(rad,2)))+0.01,YES); */ /* hr -= (new_path_len) * log(1./dt); */ /* hr += (cur_path_len) * log(1./dt); */ /* hr -= LnFact(new_path_len); */ /* hr += LnFact(cur_path_len); */ new_path_len = cur_path_len; hr += PHYREX_Path_Logdensity(young_ldsk,old_ldsk,rad,tree); new_path = PHYREX_Generate_Path(young_ldsk,old_ldsk,new_path_len,rad,tree); cur_path = PHYREX_Remove_Path(young_ldsk,old_ldsk,&pos,tree); PHYREX_Insert_Path(young_ldsk,old_ldsk,new_path,pos,tree); hr -= PHYREX_Path_Logdensity(young_ldsk,old_ldsk,rad,tree); PHYREX_Update_Lindisk_List_Range(young_ldsk->disk,old_ldsk->disk,tree); if(tree->eval_glnL == YES) { new_glnL = LOCATION_Lk(NULL,tree); if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) { new_tlnL += TIMES_Lk_Range(young_ldsk->disk,old_ldsk->disk,tree); } if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* PhyML_Printf("\nXXX %12f %4d %4d %12f %12f", */ /* young_ldsk->disk->time - old_ldsk->disk->time, */ /* cur_path_len,new_path_len,alpha,Euclidean_Dist(young_ldsk->coord,old_ldsk->coord)); */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); if(u > alpha) /* Reject */ { new_path = PHYREX_Remove_Path(young_ldsk,old_ldsk,&pos,tree); PHYREX_Insert_Path(young_ldsk,old_ldsk,cur_path,pos,tree); PHYREX_Update_Lindisk_List_Range(young_ldsk->disk,old_ldsk->disk,tree); ldsk = new_path; while(ldsk) { PHYREX_Free_Disk(ldsk->disk); ldsk_dum = ldsk; ldsk = ldsk->prev; PHYREX_Free_Ldisk(ldsk_dum); } } else { tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; ldsk = cur_path; while(ldsk) { PHYREX_Free_Disk(ldsk->disk); ldsk_dum = ldsk; ldsk = ldsk->prev; PHYREX_Free_Ldisk(ldsk_dum); } tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_traj]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } Free(valid_disks); Free(permut); Free(rad); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Disk_Multi(t_tree *tree) { phydbl u,alpha,ratio,hr; phydbl cur_glnL, new_glnL; phydbl *rad; t_dsk *disk,**target_disk,**all_disks; int i,j,block,n_all_disks,n_move_disks,*permut; int err; if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) return; if(tree->mmod->use_locations == NO) return; if(tree->mmod->integrateAncestralLocations == YES) return; Set_Lk(tree); disk = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; hr = 0.0; ratio = 0.0; block = 100; all_disks = NULL; tree->mcmc->run_move[tree->mcmc->num_move_phyrex_disk_multi]++; rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; disk = tree->young_disk->prev; n_all_disks = 0; do { if(disk->age_fixed == NO) { if(!n_all_disks) all_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_all_disks+1)%block)) all_disks = (t_dsk **)mRealloc(all_disks,n_all_disks+block,sizeof(t_dsk *)); all_disks[n_all_disks] = disk; n_all_disks++; } disk = disk->prev; } while(disk); if(!n_all_disks) return; target_disk = (t_dsk **)mCalloc(n_all_disks,sizeof(t_dsk *)); /* n_move_disks = Rand_Int(1,1+(int)(n_all_disks/10)); */ /* n_move_disks = MIN(10,(int)(1.+0.1*n_all_disks)); */ n_move_disks = (int)(1+n_all_disks/50); permut = Permutate(n_all_disks); for(i=0;icentr); if(target_disk[i]->ldsk != NULL) { for(j=0;jmmod->n_dim;j++) { err = NO; target_disk[i]->centr->lonlat[j] = Rnorm_Trunc(target_disk[i]->centr->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); if(err == YES) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); hr -= Log_Dnorm_Trunc(target_disk[i]->centr->lonlat[j], target_disk[i]->centr->cpy->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); hr += Log_Dnorm_Trunc(target_disk[i]->centr->cpy->lonlat[j], target_disk[i]->centr->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } } else { for(j=0;jmmod->n_dim;j++) { err = NO; target_disk[i]->centr->lonlat[j] = Rnorm_Trunc(target_disk[i]->centr->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); if(err == YES) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); hr -= Log_Dnorm_Trunc(target_disk[i]->centr->lonlat[j], target_disk[i]->centr->cpy->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); hr += Log_Dnorm_Trunc(target_disk[i]->centr->cpy->lonlat[j], target_disk[i]->centr->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } } } Free(permut); if(tree->eval_glnL == YES) new_glnL = LOCATION_Lk(NULL,tree); if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); /* printf("\n- Delete new_glnL: %f [%f] hr: %f u:%f alpha: %f",new_glnL,cur_glnL,hr,u,alpha); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { for(i=0;icentr); Reset_Lk(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_disk_multi]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); Free(all_disks); Free(target_disk); Free(rad); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Move ldsk on landscape */ #ifdef PHYREX void MCMC_PHYREX_Ldsk_Multi(t_tree *tree) { phydbl u,alpha,ratio; phydbl cur_glnL,new_glnL,hr; phydbl *rad; t_dsk *disk,**target_disk,**all_disks; int i,j,block,n_all_disks,n_move_ldsk,*permut; if(tree->mmod->use_locations == NO) return; if(tree->mmod->integrateAncestralLocations == YES) return; Set_Lk(tree); disk = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; hr = 0.0; ratio = 0.0; block = 100; all_disks = NULL; rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; tree->mcmc->run_move[tree->mcmc->num_move_phyrex_ldsk_multi]++; if(tree->young_disk->next) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); disk = tree->young_disk->prev; n_all_disks = 0; do { if(disk->ldsk != NULL && ((disk->ldsk->nd != NULL && disk->ldsk->nd->tax == NO) || (disk->ldsk->nd == NULL))) { if(!n_all_disks) all_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_all_disks+1)%block)) all_disks = (t_dsk **)mRealloc(all_disks,n_all_disks+block,sizeof(t_dsk *)); all_disks[n_all_disks] = disk; n_all_disks++; } disk = disk->prev; } while(disk); if(!n_all_disks) return; n_move_ldsk = (int)(1+n_all_disks/50); target_disk = (t_dsk **)mCalloc(n_all_disks,sizeof(t_dsk *)); permut = Permutate(n_all_disks); for(i=0;ildsk->coord); for(j=0;jmmod->n_dim;j++) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) SLFV_Generate_Ldsk_New_Location(target_disk[i]->ldsk,target_disk[i]->ldsk,rad[j],&hr,j,tree); else if(RRW_Is_Rw(tree->mmod) == YES) { hr += RRW_Density_Ldsk_Location(target_disk[i]->ldsk,rad[j],j,NO,tree); RRW_Generate_Ldsk_New_Location(target_disk[i]->ldsk,rad[j],j,NO,tree); hr -= RRW_Density_Ldsk_Location(target_disk[i]->ldsk,rad[j],j,NO,tree); } } } Free(permut); if(tree->eval_glnL == YES) new_glnL = LOCATION_Lk(NULL,tree); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { for(i=0;ildsk->coord); Reset_Lk(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_ldsk_multi]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); Free(rad); Free(all_disks); Free(target_disk); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Ldsk_And_Disk(t_tree *tree) { phydbl u,alpha,ratio; phydbl cur_glnL, new_glnL, hr; phydbl *rad; t_dsk *disk,**target_disk,**all_disks; int i,j,block,n_all_disks,n_move_ldsk,*permut; int err; if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) return; if(tree->mmod->use_locations == NO) return; if(tree->mmod->integrateAncestralLocations == YES) return; Set_Lk(tree); disk = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; hr = 0.0; ratio = 0.0; block = 100; all_disks = NULL; rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; tree->mcmc->run_move[tree->mcmc->num_move_phyrex_ldsk_and_disk]++; if(tree->young_disk->next) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); disk = tree->young_disk->prev; n_all_disks = 0; do { if(disk->ldsk != NULL && disk->ldsk->n_next >= 1 && ((disk->ldsk->nd != NULL && disk->ldsk->nd->tax == NO) || disk->ldsk->nd == NULL)) { if(!n_all_disks) all_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_all_disks+1)%block)) all_disks = (t_dsk **)mRealloc(all_disks,n_all_disks+block,sizeof(t_dsk *)); all_disks[n_all_disks] = disk; n_all_disks++; } disk = disk->prev; } while(disk); if(!n_all_disks) return; n_move_ldsk = (int)(1+n_all_disks/20); /* n_move_ldsk = n_all_disks; */ target_disk = (t_dsk **)mCalloc(n_all_disks,sizeof(t_dsk *)); permut = Permutate(n_all_disks); for(i=0;ildsk->coord); PHYREX_Store_Geo_Coord(target_disk[i]->centr); for(j=0;jmmod->n_dim;j++) { err = NO; target_disk[i]->centr->lonlat[j] = Rnorm_Trunc(target_disk[i]->ldsk->coord->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); target_disk[i]->ldsk->coord->lonlat[j] = Rnorm_Trunc(target_disk[i]->centr->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); hr -= Log_Dnorm_Trunc(target_disk[i]->centr->lonlat[j], target_disk[i]->ldsk->coord->cpy->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); hr += Log_Dnorm_Trunc(target_disk[i]->centr->cpy->lonlat[j], target_disk[i]->ldsk->coord->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); hr -= Log_Dnorm_Trunc(target_disk[i]->ldsk->coord->lonlat[j], target_disk[i]->centr->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); hr += Log_Dnorm_Trunc(target_disk[i]->ldsk->coord->cpy->lonlat[j], target_disk[i]->centr->cpy->lonlat[j], rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } } Free(permut); if(tree->eval_glnL == YES) new_glnL = LOCATION_Lk(NULL,tree); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); /* printf("\n- Move_ldsk %15f",new_glnL-cur_glnL); */ assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { for(i=0;ildsk->coord); for(i=0;icentr); Reset_Lk(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_ldsk_and_disk]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); Free(rad); Free(all_disks); Free(target_disk); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Ldsk_Given_Disk(t_tree *tree, int print) { phydbl u,alpha,ratio,hr; phydbl cur_glnL, new_glnL; phydbl *rad; t_dsk *disk,**all_disks; int i,j,n_all_disks,block,n_move_ldsk,*permut; // phydbl K; if(tree->mmod->use_locations == NO) return; if(tree->mmod->integrateAncestralLocations == YES) return; block = 100; all_disks = NULL; n_all_disks = 0; hr = 0.0; ratio = 0.0; rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); // K = tree->mcmc->tune_move[tree->mcmc->num_move_phyrex_ldsk_given_disk]; /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ /* for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; */ /* for(j=0;jmmod->n_dim;++j) rad[j] = (1./K)*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; */ // for(j=0;jmmod->n_dim;++j) rad[j] = 2.0*tree->mmod->sigsq[j]; // for(j=0;jmmod->n_dim;++j) rad[j] = K*tree->mmod->sigsq[j];; for(j=0;jmmod->n_dim;++j) rad[j] = 1.E-2; disk = tree->young_disk->prev; do { if(disk->ldsk != NULL) { if(!n_all_disks) all_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_all_disks+1)%block)) all_disks = (t_dsk **)mRealloc(all_disks,n_all_disks+block,sizeof(t_dsk *)); all_disks[n_all_disks] = disk; n_all_disks++; } disk = disk->prev; } while(disk); if(!n_all_disks) return; n_move_ldsk = (int)(1+0.2*n_all_disks); permut = Permutate(n_all_disks); for(i=0;immod->c_lnL; new_glnL = tree->mmod->c_lnL; /* if(tree->eval_glnL == YES) */ /* { */ /* if(disk->ldsk->prev != NULL) new_glnL -= LOCATION_Lk_Range(disk,disk->ldsk->prev->disk,tree); */ /* else new_glnL -= LOCATION_Lk_Core(disk,tree); */ /* } */ PHYREX_Store_Geo_Coord(disk->ldsk->coord); tree->mcmc->run_move[tree->mcmc->num_move_phyrex_ldsk_given_disk]++; hr = 0.0; /* j = Rand_Int(0,tree->mmod->n_dim-1); */ for(j=0;jmmod->n_dim;j++) { /* Set new position of regraft_ldsk */ if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) SLFV_Generate_Ldsk_New_Location(disk->ldsk,disk->ldsk,rad[j],&hr,j,tree); else if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) { hr += RRW_Density_Ldsk_Location(disk->ldsk,rad[j],j,NO,tree); RRW_Generate_Ldsk_New_Location(disk->ldsk,rad[j],j,NO,tree); hr -= RRW_Density_Ldsk_Location(disk->ldsk,rad[j],j,NO,tree); /* int err; */ /* disk->ldsk->coord->lonlat[j] = Rnorm_Trunc(disk->ldsk->coord->lonlat[j],rad[j],tree->mmod->lim_do->lonlat[j],tree->mmod->lim_up->lonlat[j],&err); */ /* hr -= Log_Dnorm_Trunc(disk->ldsk->coord->lonlat[j],disk->ldsk->coord->cpy->lonlat[j],rad[j],tree->mmod->lim_do->lonlat[j],tree->mmod->lim_up->lonlat[j],&err); */ /* hr += Log_Dnorm_Trunc(disk->ldsk->coord->cpy->lonlat[j],disk->ldsk->coord->lonlat[j],rad[j],tree->mmod->lim_do->lonlat[j],tree->mmod->lim_up->lonlat[j],&err); */ } } if(tree->eval_glnL == YES) { /* if(disk->ldsk->prev != NULL) new_glnL += LOCATION_Lk_Range(disk,disk->ldsk->prev->disk,tree); */ /* else new_glnL += LOCATION_Lk_Core(disk,tree); */ new_glnL = LOCATION_Lk(NULL,tree); } ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; if(print == YES) PhyML_Printf("\n. LDSK_GIVEN_DISK. lnL: %f->%f root ? %d (%f %f) hr:%f ratio:%f", cur_glnL, new_glnL, disk->ldsk->prev ? 0 : 1, disk->ldsk->coord->lonlat[0], disk->ldsk->coord->lonlat[1], hr,exp(ratio)); ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { PHYREX_Restore_Geo_Coord(disk->ldsk->coord); tree->mmod->c_lnL = cur_glnL; } else { tree->mmod->c_lnL = new_glnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_ldsk_given_disk]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } Free(rad); Free(permut); Free(all_disks); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Disk_Given_Ldsk(t_tree *tree) { phydbl u,alpha,ratio,hr; phydbl cur_glnL, new_glnL; t_dsk *disk,**all_disks; int i,j,n_all_disks,block,n_move_ldsk,*permut; if((RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES)) return; if(tree->mmod->use_locations == NO) return; block = 100; all_disks = NULL; n_all_disks = 0; disk = tree->young_disk->prev; do { if(!n_all_disks) all_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_all_disks+1)%block)) all_disks = (t_dsk **)mRealloc(all_disks,n_all_disks+block,sizeof(t_dsk *)); all_disks[n_all_disks] = disk; n_all_disks++; disk = disk->prev; } while(disk); if(!n_all_disks) return; n_move_ldsk = (int)(1+0.2*n_all_disks); permut = Permutate(n_all_disks); for(i=0;imcmc->run_move[tree->mcmc->num_move_phyrex_disk_given_ldsk]++; disk = all_disks[permut[i]]; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; hr = 0.0; if(tree->eval_glnL == YES) new_glnL -= LOCATION_Lk_Core(disk,tree); PHYREX_Store_Geo_Coord(disk->centr); for(j=0;jmmod->n_dim;j++) { disk->centr->lonlat[j] = Uni()*(tree->mmod->lim_up->lonlat[j]-tree->mmod->lim_do->lonlat[j])+tree->mmod->lim_do->lonlat[j]; } if(tree->eval_glnL == YES) new_glnL += LOCATION_Lk_Core(disk,tree); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { PHYREX_Restore_Geo_Coord(disk->centr); } else { tree->mmod->c_lnL = new_glnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_disk_given_ldsk]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } Free(permut); Free(all_disks); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Indel_Hit_Serial(t_tree *tree) { t_dsk *disk,*new_disk,*target_disk,*young_disk,*old_disk,**valid_disks,*youngest_disk,*oldest_disk; t_ldsk *young_ldsk, *old_ldsk, *new_ldsk; int i,j,n_trials,dir_old_young,err,block; phydbl ratio, u, alpha, hr, type; phydbl cur_glnL, new_glnL; phydbl cur_tlnL, new_tlnL; phydbl T,t,pindel,*rad,c; int n_valid_disks,num_prec_issue; if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) return; if(tree->mmod->use_locations == NO) return; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; hr = 0.0; ratio = 0.0; type = -1.0; n_trials = 1 + (int)(0.1*PHYREX_Total_Number_Of_Intervals(tree)); T = PHYREX_Tree_Height(tree); pindel = 0.5; block = 50; num_prec_issue = NO; rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; for(i=0;imcmc->run_move[tree->mcmc->num_move_phyrex_indel_hit_serial]++; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; hr = 0.0; ratio = 0.0; type = Uni(); if(type < pindel) /* Insert */ { do { num_prec_issue = NO; t = Uni()*(tree->young_disk->time-T) + T; disk = tree->young_disk->prev; while(disk && disk->time > t) disk = disk->prev; if(!(disk->time != t)) { PhyML_Printf("\n. Numerical precision issue in indel_hit_serial"); PhyML_Printf("\n. t=%g disk->time=%g",t,disk->time); num_prec_issue = YES; } } while(num_prec_issue == YES); assert(disk->next); hr -= log(1./(tree->young_disk->time-T)); young_disk = disk->next; assert(young_disk->n_ldsk_a); old_disk = disk; assert(old_disk->n_ldsk_a); new_disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(new_disk,tree->mmod->n_dim,tree->mmod); new_disk->time = t; /* Which lineage is going to be hit ? */ hr -= log(1./PHYREX_Number_Of_Outgoing_Ldsks(young_disk)); /* young_ldsk = old_disk->ldsk_a[hit_ldsk_idx]; */ young_ldsk = PHYREX_Random_Select_Outgoing_Ldsk(young_disk); old_ldsk = young_ldsk->prev; assert(young_disk != old_ldsk->disk); oldest_disk = NULL; youngest_disk = NULL; if(tree->mmod->model_id == SLFV_UNIFORM || tree->mmod->model_id == SLFV_GAUSSIAN) { oldest_disk = old_ldsk->disk; youngest_disk = young_ldsk->disk; } else if(RRW_Is_Rw(tree->mmod) == YES) { disk = old_ldsk->disk; if(disk->prev) while(disk->prev && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) { disk = disk->prev; } oldest_disk = disk; assert(oldest_disk); disk = young_ldsk->disk; while(disk->next && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) { disk = disk->next; } youngest_disk = disk; assert(youngest_disk); } new_glnL = cur_glnL; new_tlnL = cur_tlnL; if(tree->eval_glnL == YES) new_glnL -= LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); if(tree->eval_tlnL == YES) new_tlnL -= TIMES_Lk_Range(youngest_disk,oldest_disk,tree); /* Direction from old to young ldsk */ dir_old_young = PHYREX_Get_Next_Direction(young_ldsk,old_ldsk); assert(dir_old_young != -1); /* Make and initialize new ldsk */ new_ldsk = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(new_ldsk,new_disk,tree->mmod->n_dim); PHYREX_Make_Lindisk_Next(new_ldsk); new_disk->ldsk = new_ldsk; /* Connect it */ new_ldsk->prev = old_ldsk; new_ldsk->next[0] = young_ldsk; young_ldsk->prev = new_ldsk; old_ldsk->next[dir_old_young] = new_ldsk; /* Insert disk */ PHYREX_Insert_Disk(new_disk,tree); assert(new_disk->next == young_disk); assert(new_disk->prev == old_disk); for(j=0;jmmod->n_dim;j++) { new_disk->centr->lonlat[j] = Uni()*(tree->mmod->lim_up->lonlat[j]-tree->mmod->lim_do->lonlat[j])+tree->mmod->lim_do->lonlat[j]; hr -= log(1./(tree->mmod->lim_up->lonlat[j]-tree->mmod->lim_do->lonlat[j])); if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) { c = new_disk->centr->lonlat[j]; err = NO; new_ldsk->coord->lonlat[j] = Rnorm_Trunc(c, rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); if(err == YES) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); hr -= Log_Dnorm_Trunc(new_ldsk->coord->lonlat[j], c, rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } else if(RRW_Is_Rw(tree->mmod) == YES) { phydbl dta,dtd,sum,sd; dta = fabs(new_ldsk->prev->disk->time - new_ldsk->disk->time); dtd = fabs(new_ldsk->disk->time - new_ldsk->next[0]->disk->time); sum = dta+dtd; c = (dtd/sum)*new_ldsk->prev->coord->lonlat[j] + (dta/sum)*new_ldsk->next[0]->coord->lonlat[j]; sd = sqrt((dta*dtd)/sum*tree->mmod->sigsq[j]); err = NO; new_ldsk->coord->lonlat[j] = Rnorm_Trunc(c, sd, tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); if(err == YES) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); hr -= Log_Dnorm_Trunc(new_ldsk->coord->lonlat[j], c, sd, tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } else c = -1.; } PHYREX_Update_Lindisk_List_Range(young_ldsk->disk,old_ldsk->disk,tree); if(tree->eval_glnL == YES) { new_glnL += LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) new_tlnL += TIMES_Lk_Range(youngest_disk,oldest_disk,tree); n_valid_disks = 0; disk = tree->young_disk; while(disk->prev) { if(disk->ldsk && disk->ldsk->n_next == 1) n_valid_disks++; disk = disk->prev; } assert(n_valid_disks); hr += log(1./n_valid_disks); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* PhyML_Printf("\n+ new_glnL: %f cur_glnL: %f hr: %f alpha: %f",new_glnL,cur_glnL,hr,alpha); */ /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { old_ldsk->next[dir_old_young] = young_ldsk; young_ldsk->prev = old_ldsk; PHYREX_Remove_Disk(new_disk); assert(old_disk->next == young_disk); assert(young_disk->prev == old_disk); PHYREX_Update_Lindisk_List_Range(young_ldsk->disk,old_ldsk->disk,tree); // !!!!!!! Really necessary? LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); TIMES_Lk_Range(youngest_disk,oldest_disk,tree); if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) cur_glnL = UNLIKELY; PHYREX_Free_Disk(new_disk); PHYREX_Free_Ldisk(new_ldsk); } else { tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_indel_hit_serial]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } else /* Remove hit */ { disk = tree->young_disk->prev; valid_disks = NULL; n_valid_disks = 0; do { if(disk->ldsk && disk->ldsk->n_next == 1) { if(!n_valid_disks) valid_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_valid_disks+1)%block)) valid_disks = (t_dsk **)mRealloc(valid_disks,n_valid_disks+block,sizeof(t_dsk *)); valid_disks[n_valid_disks] = disk; n_valid_disks++; } disk = disk->prev; } while(disk); if(n_valid_disks == 0) continue; hr -= log(1./n_valid_disks); target_disk = valid_disks[Rand_Int(0,n_valid_disks-1)]; Free(valid_disks); young_disk = target_disk->next; old_disk = target_disk->prev; assert(target_disk->age_fixed == NO); old_ldsk = target_disk->ldsk->prev; young_ldsk = target_disk->ldsk->next[0]; dir_old_young = PHYREX_Get_Next_Direction(target_disk->ldsk,old_ldsk); assert(dir_old_young != -1); /* Part of the Hastings ratio corresponding to the probability of selecting */ /* one of target_disk->n_ldsk_a to be hit (reverse move) */ hr += log(1./target_disk->next->n_ldsk_a); /* Density for position of the displaced ldsk */ for(j=0;jmmod->n_dim;j++) { hr += log(1./(tree->mmod->lim_up->lonlat[j]-tree->mmod->lim_do->lonlat[j])); if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) { c = target_disk->centr->lonlat[j]; hr += Log_Dnorm_Trunc(target_disk->ldsk->coord->lonlat[j], c, rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } else if(RRW_Is_Rw(tree->mmod) == YES) { phydbl dta,dtd,sum,sd; dta = fabs(target_disk->ldsk->prev->disk->time - target_disk->time); dtd = fabs(target_disk->time - target_disk->ldsk->next[0]->disk->time); sum = dta+dtd; c = (dtd/sum)*target_disk->ldsk->prev->coord->lonlat[j] + (dta/sum)*target_disk->ldsk->next[0]->coord->lonlat[j]; sd = sqrt((dta*dtd)/sum*tree->mmod->sigsq[j]); hr += Log_Dnorm_Trunc(target_disk->ldsk->coord->lonlat[j], c, sd, tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } else c = -1.; } assert(target_disk->next); oldest_disk = NULL; youngest_disk = NULL; if(tree->mmod->model_id == SLFV_UNIFORM || tree->mmod->model_id == SLFV_GAUSSIAN) { oldest_disk = target_disk->ldsk->prev->disk; youngest_disk = target_disk->next; } else if(RRW_Is_Rw(tree->mmod) == YES) { disk = target_disk->ldsk->prev->disk; if(disk->prev) while(disk->prev && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) { disk = disk->prev; } oldest_disk = disk; assert(oldest_disk); disk = target_disk->next; while(disk->next && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) { disk = disk->next; } youngest_disk = disk; assert(youngest_disk); } new_glnL = cur_glnL; new_tlnL = cur_tlnL; if(tree->eval_glnL == YES) new_glnL -= LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); if(tree->eval_tlnL == YES) new_tlnL -= TIMES_Lk_Range(youngest_disk,oldest_disk,tree); /* New connections between old_ldsk and young_ldsk */ old_ldsk->next[dir_old_young] = young_ldsk; young_ldsk->prev = old_ldsk; hr += log(1./(tree->young_disk->time-T)); PHYREX_Remove_Disk(target_disk); PHYREX_Update_Lindisk_List_Range(target_disk->next,target_disk->ldsk->prev->disk,tree); if(tree->eval_glnL == YES) { new_glnL += LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) new_tlnL += TIMES_Lk_Range(youngest_disk,oldest_disk,tree); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* PhyML_Printf("\n- new_glnL: %f cur_glnL: %f hr: %f alpha: %f target->time: %f",new_glnL,cur_glnL,hr,alpha,target_disk->time); */ /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { PHYREX_Insert_Disk(target_disk,tree); assert(target_disk->next == young_disk); assert(target_disk->prev == old_disk); old_ldsk->next[dir_old_young] = target_disk->ldsk; young_ldsk->prev = target_disk->ldsk; PHYREX_Update_Lindisk_List_Range(target_disk->next,target_disk->ldsk->prev->disk,tree); // !!!!!!! Really necessary? LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); TIMES_Lk_Range(youngest_disk,oldest_disk,tree); } else { tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; PHYREX_Free_Ldisk(target_disk->ldsk); PHYREX_Free_Disk(target_disk); tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_indel_hit_serial]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } } Free(rad); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Indel_Disk_Serial(t_tree *tree) { t_dsk *disk,*new_disk,*target_disk,**valid_disks,*young_disk,*old_disk; int i,j,n_trials,n_valid_disks,block,num_prec_issue; phydbl ratio, u, alpha, hr, type; phydbl cur_glnL, new_glnL; phydbl cur_tlnL, new_tlnL; phydbl log_lk_centr; phydbl T,t,pindel; if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) return; if(tree->mmod->use_locations == NO) return; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; hr = 0.0; ratio = 0.0; type = -1.0; n_trials = (int)(1.+0.1*PHYREX_Total_Number_Of_Intervals(tree)); T = PHYREX_Tree_Height(tree); pindel = 0.5; disk = NULL; new_disk = NULL; target_disk = NULL; young_disk = NULL; old_disk = NULL; block = 50; num_prec_issue = NO; disk = NULL; log_lk_centr = 0.0; for(j=0;jmmod->n_dim;j++) log_lk_centr += log(1./(tree->mmod->lim_up->lonlat[j]-tree->mmod->lim_do->lonlat[j])); for(i=0;imcmc->run_move[tree->mcmc->num_move_phyrex_indel_disk_serial]++; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; hr = 0.0; ratio = 0.0; type = Uni(); if(type < pindel) /* Insert */ { do { num_prec_issue = NO; t = Uni()*(tree->young_disk->time-T) + T; disk = tree->young_disk->prev; while(disk && disk->time > t) disk = disk->prev; if(!(disk->time != t)) { PhyML_Printf("\n. Numerical precision issue in indel_disk_serial"); PhyML_Printf("\n. t=%g disk->time=%g diff=%d",t,disk->time,t-disk->time); num_prec_issue = YES; } }while(num_prec_issue == YES); young_disk = disk->next; old_disk = disk; assert(disk->next); hr -= log(1./(tree->young_disk->time-T)); hr -= log_lk_centr; new_glnL = cur_glnL; new_tlnL = cur_tlnL; if(tree->eval_glnL == YES) new_glnL -= LOCATION_Lk_Range(young_disk,old_disk,tree); if(tree->eval_tlnL == YES) new_tlnL -= TIMES_Lk_Range(young_disk,old_disk,tree); new_disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(new_disk,tree->mmod->n_dim,tree->mmod); new_disk->time = t; PHYREX_Insert_Disk(new_disk,tree); PHYREX_Update_Lindisk_List_Core(new_disk,tree); assert(new_disk->next == young_disk); assert(new_disk->prev == old_disk); for(j=0;jmmod->n_dim;j++) new_disk->centr->lonlat[j] = Uni()*(tree->mmod->lim_up->lonlat[j]-tree->mmod->lim_do->lonlat[j])+tree->mmod->lim_do->lonlat[j]; n_valid_disks = 0; disk = tree->young_disk->prev; do { if(!disk->ldsk && disk->age_fixed == NO) n_valid_disks++; disk = disk->prev; } while(disk); assert(n_valid_disks); hr += log(1./n_valid_disks); if(tree->eval_glnL == YES) { new_glnL += LOCATION_Lk_Range(young_disk,old_disk,tree); if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) new_tlnL += TIMES_Lk_Range(young_disk,old_disk,tree); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { PHYREX_Remove_Disk(new_disk); PHYREX_Free_Disk(new_disk); } else { tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_indel_disk_serial]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } else /* Remove disk */ { disk = tree->young_disk->prev; valid_disks = NULL; n_valid_disks = 0; do { if(!disk->ldsk && disk->age_fixed == NO) { if(!n_valid_disks) valid_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_valid_disks+1)%block)) valid_disks = (t_dsk **)mRealloc(valid_disks,n_valid_disks+block,sizeof(t_dsk *)); valid_disks[n_valid_disks] = disk; n_valid_disks++; } disk = disk->prev; } while(disk); if(n_valid_disks == 0) continue; assert(n_valid_disks); hr -= log(1./n_valid_disks); target_disk = valid_disks[Rand_Int(0,n_valid_disks-1)]; Free(valid_disks); hr += log(1./(tree->young_disk->time-T)); hr += log_lk_centr; assert(target_disk->next->prev); new_glnL = cur_glnL; new_tlnL = cur_tlnL; if(tree->eval_glnL == YES) new_glnL -= LOCATION_Lk_Range(target_disk->next,target_disk->prev,tree); if(tree->eval_tlnL == YES) new_tlnL -= TIMES_Lk_Range(target_disk->next,target_disk->prev,tree); PHYREX_Remove_Disk(target_disk); assert(target_disk->next->prev); if(tree->eval_glnL == YES) { new_glnL += LOCATION_Lk_Range(target_disk->next,target_disk->prev,tree); if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) new_tlnL += TIMES_Lk_Range(target_disk->next,target_disk->prev,tree); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { PHYREX_Insert_Disk(target_disk,tree); } else { tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_indel_disk_serial]++; PHYREX_Free_Disk(target_disk); } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Add or remove hit but leave corresponding disk unchanged #ifdef PHYREX void MCMC_PHYREX_Add_Remove_Jump(t_tree *tree) { t_dsk *disk,*target_disk,**valid_disks,*oldest_disk,*youngest_disk; int i,j,n_trials,n_valid_disks,block,err; phydbl ratio, u,alpha, hr; phydbl cur_glnL, new_glnL; phydbl cur_tlnL, new_tlnL; int target_ldsk_idx,dir_next; t_ldsk *new_ldsk,*target_ldsk; phydbl *rad,c; phydbl n_no_hit; if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) return; if(tree->mmod->use_locations == NO) return; if(tree->mmod->integrateAncestralLocations == YES) return; n_trials = (int)(1.+0.1*PHYREX_Total_Number_Of_Intervals(tree)); block = 50; rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; for(i=0;imcmc->run_move[tree->mcmc->num_move_phyrex_add_remove_jump]++; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; hr = 0.0; ratio = 0.0; disk = NULL; target_disk = NULL; target_ldsk = NULL; new_ldsk = NULL; disk = tree->young_disk->prev; valid_disks = NULL; n_valid_disks = 0; n_no_hit = 0.0; do { if(disk->prev != NULL && disk->age_fixed == NO && ((disk->ldsk != NULL && disk->ldsk->n_next == 1) || disk->ldsk == NULL)) { if(!n_valid_disks) valid_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_valid_disks+1)%block)) valid_disks = (t_dsk **)mRealloc(valid_disks,n_valid_disks+block,sizeof(t_dsk *)); valid_disks[n_valid_disks] = disk; n_valid_disks++; if(disk->ldsk == NULL) n_no_hit += 1.0; } disk = disk->prev; } while(disk); if(n_valid_disks == 0) return; target_disk = valid_disks[Rand_Int(0,n_valid_disks-1)]; Free(valid_disks); if(target_disk->ldsk == NULL) // Add hit { assert(target_disk->n_ldsk_a); target_ldsk_idx = Rand_Int(0,target_disk->n_ldsk_a-1); target_ldsk = target_disk->ldsk_a[target_ldsk_idx]; // Part of HR ratio corresponding to prob to of selecting add or remove hr -= log(n_no_hit); hr += log(n_valid_disks - (n_no_hit - 1)); hr -= log(1./(phydbl)target_disk->n_ldsk_a); oldest_disk = NULL; youngest_disk = NULL; if(tree->mmod->model_id == SLFV_UNIFORM || tree->mmod->model_id == SLFV_GAUSSIAN) { oldest_disk = target_ldsk->prev->disk; youngest_disk = target_disk; } else if(RRW_Is_Rw(tree->mmod) == YES) { disk = target_ldsk->prev->disk; if(disk->prev) while(disk->prev && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) { disk = disk->prev; } oldest_disk = disk; assert(oldest_disk); disk = target_disk; while(disk->next && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) { disk = disk->next; } youngest_disk = disk; assert(youngest_disk); } new_glnL = cur_glnL; new_tlnL = cur_tlnL; if(tree->eval_glnL == YES) new_glnL -= LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); if(tree->eval_tlnL == YES) new_tlnL -= TIMES_Lk_Range(youngest_disk,oldest_disk,tree); dir_next = PHYREX_Get_Next_Direction(target_ldsk,target_ldsk->prev); assert(dir_next != -1); /* Make and initialize new ldsk */ new_ldsk = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(new_ldsk,target_disk,tree->mmod->n_dim); PHYREX_Make_Lindisk_Next(new_ldsk); target_disk->ldsk = new_ldsk; new_ldsk->prev = target_ldsk->prev; new_ldsk->next[0] = target_ldsk; new_ldsk->prev->next[dir_next] = new_ldsk; target_ldsk->prev = new_ldsk; for(j=0;jmmod->n_dim;j++) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) { c = target_disk->centr->lonlat[j]; err = NO; new_ldsk->coord->lonlat[j] = Rnorm_Trunc(c, rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); if(err == YES) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); hr -= Log_Dnorm_Trunc(new_ldsk->coord->lonlat[j], c, rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } else if(RRW_Is_Rw(tree->mmod) == YES) { phydbl dta,dtd,sum,sd; dta = fabs(new_ldsk->prev->disk->time - new_ldsk->disk->time); dtd = fabs(new_ldsk->disk->time - new_ldsk->next[0]->disk->time); sum = dta+dtd; c = (dtd/sum)*new_ldsk->prev->coord->lonlat[j] + (dta/sum)*new_ldsk->next[0]->coord->lonlat[j]; sd = sqrt((dta*dtd)/sum*tree->mmod->sigsq[j]); err = NO; new_ldsk->coord->lonlat[j] = Rnorm_Trunc(c, sd, tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); assert(!Are_Equal(new_ldsk->coord->lonlat[j],0.0,1.E-5)); if(err == YES) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); hr -= Log_Dnorm_Trunc(new_ldsk->coord->lonlat[j], c, sd, tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } else c = -1.; } PHYREX_Update_Lindisk_List_Range(target_disk,new_ldsk->prev->disk,tree); if(tree->eval_glnL == YES) { new_glnL += LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) { new_tlnL += TIMES_Lk_Range(youngest_disk,oldest_disk,tree); } ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* PhyML_Printf("\n. ADD [%14f->%14f] alpha=%14f acc.rate=%14f [%14f->%14f] [%14f->%14f]", */ /* cur_glnL, */ /* new_glnL, */ /* alpha, */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_add_remove_jump], */ /* cur_rrw,new_rrw, */ /* cur_coal,new_coal); */ /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { target_ldsk->prev = new_ldsk->prev; new_ldsk->prev->next[dir_next] = target_ldsk; target_disk->ldsk = NULL; PHYREX_Update_Lindisk_List_Range(target_disk,new_ldsk->prev->disk,tree); // !!!!!!!! Really necessary? LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); TIMES_Lk_Range(youngest_disk,oldest_disk,tree); PHYREX_Free_Ldisk(new_ldsk); } else { tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_add_remove_jump]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } else // Remove jump { target_ldsk = target_disk->ldsk; // Part of HR ratio corresponding to prob to of selecting add or remove hr -= log(n_valid_disks - n_no_hit); hr += log(n_no_hit + 1); hr += log(1./(phydbl)target_disk->n_ldsk_a); oldest_disk = NULL; youngest_disk = NULL; if(tree->mmod->model_id == SLFV_UNIFORM || tree->mmod->model_id == SLFV_GAUSSIAN) { oldest_disk = target_ldsk->prev->disk; youngest_disk = target_disk; } else if(RRW_Is_Rw(tree->mmod) == YES) { disk = target_ldsk->prev->disk; if(disk->prev) while(disk->prev && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) { disk = disk->prev; } oldest_disk = disk; assert(oldest_disk); disk = target_disk; while(disk->next && ((disk->ldsk && disk->ldsk->n_next < 2) || !disk->ldsk)) { disk = disk->next; } youngest_disk = disk; assert(youngest_disk); } new_glnL = cur_glnL; new_tlnL = cur_tlnL; if(tree->eval_glnL == YES) new_glnL -= LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); if(tree->eval_tlnL == YES) new_tlnL -= TIMES_Lk_Range(youngest_disk,oldest_disk,tree); for(j=0;jmmod->n_dim;j++) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) { c = target_disk->centr->lonlat[j]; hr += Log_Dnorm_Trunc(target_ldsk->coord->lonlat[j], c, rad[j], tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } else if(RRW_Is_Rw(tree->mmod) == YES) { phydbl dta,dtd,sum,sd; dta = fabs(target_disk->ldsk->prev->disk->time - target_disk->time); dtd = fabs(target_disk->time - target_disk->ldsk->next[0]->disk->time); sum = dta+dtd; c = (dtd/sum)*target_disk->ldsk->prev->coord->lonlat[j] + (dta/sum)*target_disk->ldsk->next[0]->coord->lonlat[j]; sd = sqrt((dta*dtd)/sum*tree->mmod->sigsq[j]); hr += Log_Dnorm_Trunc(target_disk->ldsk->coord->lonlat[j], c, sd, tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } else c = -1.; } dir_next = PHYREX_Get_Next_Direction(target_ldsk,target_ldsk->prev); assert(dir_next != -1); target_ldsk->prev->next[dir_next] = target_ldsk->next[0]; target_ldsk->next[0]->prev = target_ldsk->prev; target_disk->ldsk = NULL; PHYREX_Update_Lindisk_List_Range(target_disk,target_ldsk->prev->disk,tree); if(tree->eval_glnL == YES) { new_glnL += LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } if(tree->eval_tlnL == YES) new_tlnL += TIMES_Lk_Range(youngest_disk,oldest_disk,tree); ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* PhyML_Printf("\n. REMOVE [%14f->%14f] alpha=%14f acc.rate=%14f [%14f->%14f] [%14f->%14f]", */ /* cur_glnL, */ /* new_glnL, */ /* alpha, */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_add_remove_jump], */ /* cur_rrw,new_rrw, */ /* cur_coal,new_coal); */ /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { target_ldsk->prev->next[dir_next] = target_ldsk; target_ldsk->next[0]->prev = target_ldsk; target_disk->ldsk = target_ldsk; PHYREX_Update_Lindisk_List_Range(target_disk,target_ldsk->prev->disk,tree); // !!!!!!!! Really necessary? LOCATION_Lk_Range(youngest_disk,oldest_disk,tree); TIMES_Lk_Range(youngest_disk,oldest_disk,tree); } else { tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; PHYREX_Free_Ldisk(target_ldsk); tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_add_remove_jump]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } } Free(rad); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Ldsk_Tip_To_Root(t_tree *tree, int print) { phydbl u,alpha,ratio,hr,*rad; phydbl cur_glnL, new_glnL; t_ldsk *ldsk; int i,j,n_moves,*permut; phydbl K; if(tree->mmod->use_locations == NO) return; if(tree->mmod->integrateAncestralLocations == YES) return; ldsk = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); K = tree->mcmc->tune_move[tree->mcmc->num_move_phyrex_ldsk_tip_to_root]; /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ /* for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; */ /* for(j=0;jmmod->n_dim;++j) rad[j] = (1./K)*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; */ /* for(j=0;jmmod->n_dim;++j) rad[j] = 3.0*tree->mmod->sigsq[j]; */ /* for(j=0;jmmod->n_dim;++j) rad[j] = 2.0*tree->mmod->sigsq[j]; */ for(j=0;jmmod->n_dim;++j) rad[j] = K*tree->mmod->sigsq[j]; n_moves = (int)(1+0.2*sqrt(tree->n_otu)); permut = Permutate(tree->n_otu); for(i=0;ia_nodes[permut[i]]->ldsk->prev; do { cur_glnL = tree->mmod->c_lnL; new_glnL = cur_glnL; /* if(tree->eval_glnL == YES) */ /* { */ /* if(ldsk->prev != NULL) new_glnL -= LOCATION_Lk_Range(ldsk->disk,ldsk->prev->disk,tree); */ /* else new_glnL -= LOCATION_Lk_Core(ldsk->disk,tree); */ /* } */ PHYREX_Store_Geo_Coord(ldsk->coord); tree->mcmc->run_move[tree->mcmc->num_move_phyrex_ldsk_tip_to_root]++; hr = 0.0; for(j=0;jmmod->n_dim;j++) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) SLFV_Generate_Ldsk_New_Location(ldsk,ldsk,rad[j],&hr,j,tree); else if(RRW_Is_Rw(tree->mmod) == YES) { hr += RRW_Density_Ldsk_Location(ldsk,rad[j],j,YES,tree); RRW_Generate_Ldsk_New_Location(ldsk,rad[j],j,YES,tree); hr -= RRW_Density_Ldsk_Location(ldsk,rad[j],j,YES,tree); /* PhyML_Printf("\n. %f %f %f %f", */ /* ldsk->coord->lonlat[j],rad[j],tree->mmod->lim_do->lonlat[j],tree->mmod->lim_up->lonlat[j]); */ /* int err; */ /* ldsk->coord->lonlat[j] = Rnorm_Trunc(ldsk->coord->lonlat[j],rad[j],tree->mmod->lim_do->lonlat[j],tree->mmod->lim_up->lonlat[j],&err); */ /* hr -= Log_Dnorm_Trunc(ldsk->coord->lonlat[j],ldsk->coord->cpy->lonlat[j],rad[j],tree->mmod->lim_do->lonlat[j],tree->mmod->lim_up->lonlat[j],&err); */ /* hr += Log_Dnorm_Trunc(ldsk->coord->cpy->lonlat[j],ldsk->coord->lonlat[j],rad[j],tree->mmod->lim_do->lonlat[j],tree->mmod->lim_up->lonlat[j],&err); */ } } if(tree->eval_glnL == YES) { /* if(ldsk->prev != NULL) new_glnL += LOCATION_Lk_Range(ldsk->disk,ldsk->prev->disk,tree); */ /* else new_glnL += LOCATION_Lk_Core(ldsk->disk,tree); */ new_glnL = LOCATION_Lk(NULL,tree); } ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); if(print == YES) PhyML_Printf("\n. TIP-TO-ROOT -- lnL: %f->%f root ? %d alpha=%f",cur_glnL,new_glnL,ldsk->prev ? 1 : 0,alpha); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { PHYREX_Restore_Geo_Coord(ldsk->coord); tree->mmod->c_lnL = cur_glnL; } else { tree->mmod->c_lnL = new_glnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_ldsk_tip_to_root]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); ldsk = ldsk->prev; } while(ldsk != NULL); } Free(rad); Free(permut); /* phydbl u,alpha,ratio,hr,*rad; */ /* phydbl cur_glnL, new_glnL; */ /* t_ldsk *ldsk; */ /* int i,j,n_moves,*permut; */ /* if(tree->mmod->use_locations == NO) return; */ /* ldsk = NULL; */ /* cur_glnL = tree->mmod->c_lnL; */ /* new_glnL = UNLIKELY; */ /* rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); */ /* /\* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase *\/ */ /* /\* for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; *\/ */ /* /\* for(j=0;jmmod->n_dim;++j) rad[j] = (1./K)*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; *\/ */ /* for(j=0;jmmod->n_dim;++j) rad[j] = 1.0*tree->mmod->sigsq[j]; */ /* n_moves = (int)(1+0.05*tree->n_otu); */ /* permut = Permutate(tree->n_otu); */ /* for(i=0;ia_nodes[permut[i]]->ldsk->prev; */ /* cur_glnL = tree->mmod->c_lnL; */ /* new_glnL = UNLIKELY; */ /* tree->mcmc->run_move[tree->mcmc->num_move_phyrex_ldsk_tip_to_root]++; */ /* hr = 0.0; */ /* do */ /* { */ /* PHYREX_Store_Geo_Coord(ldsk->coord,NULL); */ /* for(j=0;jmmod->n_dim;j++) */ /* { */ /* if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) */ /* SLFV_Generate_Ldsk_New_Location(ldsk,ldsk,rad[j],&hr,j,tree); */ /* else if(RRW_Is_Rw(tree->mmod) == YES) */ /* { */ /* hr += RRW_Density_Ldsk_Location(ldsk,rad[j],j,YES,tree); */ /* RRW_Generate_Ldsk_New_Location(ldsk,rad[j],j,YES,tree); */ /* hr -= RRW_Density_Ldsk_Location(ldsk,rad[j],j,YES,tree); */ /* } */ /* } */ /* ldsk = ldsk->prev; */ /* } */ /* while(ldsk != NULL); */ /* if(tree->eval_glnL == YES) */ /* { */ /* new_glnL = LOCATION_Lk(NULL,tree); */ /* } */ /* ratio = 0.0; */ /* if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); */ /* ratio += hr; */ /* ratio = exp(ratio); */ /* alpha = MIN(1.,ratio); */ /* /\* PhyML_Printf("\n. Tip-to-root -- lnL: %f->%f alpha=%f",cur_glnL,new_glnL,alpha); *\/ */ /* u = Uni(); */ /* assert(isnan(u) == NO && isinf(fabs(u)) == NO); */ /* if(u > alpha) /\* Reject *\/ */ /* { */ /* ldsk = tree->a_nodes[permut[i]]->ldsk->prev; */ /* do */ /* { */ /* PHYREX_Restore_Geo_Coord(ldsk->coord,NULL); */ /* ldsk = ldsk->prev; */ /* } */ /* while(ldsk != NULL); */ /* tree->mmod->c_lnL = cur_glnL; */ /* } */ /* else */ /* { */ /* tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_ldsk_tip_to_root]++; */ /* } */ /* tree->mcmc->run++; */ /* PHYREX_Print_MCMC_Stats(tree); */ /* PHYREX_Print_MCMC_Tree(tree); */ /* PHYREX_Print_MCMC_Summary(tree); */ /* } */ /* Free(rad); */ /* Free(permut); */ } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Ldsk_Tips(t_tree *tree) { phydbl u,alpha,ratio,hr,*rad; phydbl cur_glnL, new_glnL; t_ldsk *ldsk; int i,j,n_moves,*permut; if(tree->mmod->use_locations == NO) return; if(tree->mmod->integrateAncestralLocations == YES) return; ldsk = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); /* Make sure rad[j], which is a tuning parameter, does not keep on changing after burnin phase */ for(j=0;jmmod->n_dim;++j) rad[j] = 0.1*(tree->mmod->lim_up->lonlat[j] - tree->mmod->lim_do->lonlat[j]);; n_moves = (int)(1+0.2*tree->n_otu); permut = Permutate(tree->n_otu); for(i=0;ia_nodes[permut[i]]->ldsk; cur_glnL = tree->mmod->c_lnL; new_glnL = cur_glnL; if(tree->eval_glnL == YES) { if(ldsk->prev != NULL) new_glnL -= LOCATION_Lk_Range(ldsk->disk,ldsk->prev->disk,tree); else new_glnL -= LOCATION_Lk_Core(ldsk->disk,tree); } PHYREX_Store_Geo_Coord(ldsk->coord); tree->mcmc->run_move[tree->mcmc->num_move_phyrex_ldsk_tips]++; hr = 0.0; for(j=0;jmmod->n_dim;j++) { if(tree->mmod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) SLFV_Generate_Ldsk_New_Location(ldsk,ldsk,rad[j],&hr,j,tree); else if(RRW_Is_Rw(tree->mmod) == YES) { hr += RRW_Density_Ldsk_Location(ldsk,rad[j],j,NO,tree); RRW_Generate_Ldsk_New_Location(ldsk,rad[j],j,NO,tree); hr -= RRW_Density_Ldsk_Location(ldsk,rad[j],j,NO,tree); } } if(tree->eval_glnL == YES) { if(ldsk->prev != NULL) new_glnL += LOCATION_Lk_Range(ldsk->disk,ldsk->prev->disk,tree); else new_glnL += LOCATION_Lk_Core(ldsk->disk,tree); } ratio = 0.0; if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* PhyML_Printf("\n. ldsk-tips -- lnL: %f->%f node %d [%f %f] alpha=%f",cur_glnL,new_glnL,permut[i],ldsk->coord->lonlat[0],ldsk->coord->lonlat[1],alpha); */ u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { /* PhyML_Printf(" -- reject"); */ PHYREX_Restore_Geo_Coord(ldsk->coord); } else { /* PhyML_Printf(" -- accept"); */ tree->mmod->c_lnL = new_glnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_ldsk_tips]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } Free(rad); Free(permut); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Exchange_Core(t_tree *aux_tree, t_tree *tree, int print) { phydbl u,sum; int move,n_mcmc_steps,run,failed; int aux_lnL_mmod_ok_run,aux_lnL_times_ok_run; int i; int init_topo_opt, init_node_times_opt; init_topo_opt = aux_tree->mod->s_opt->opt_topo; init_node_times_opt = aux_tree->mod->s_opt->opt_node_ages; aux_tree->mod->s_opt->opt_topo = YES; aux_tree->mod->s_opt->opt_node_ages = YES; for(move=0;movemcmc->n_moves;move++) aux_tree->mcmc->move_prob[move] = 0.0; for(move=0;movemcmc->n_moves;move++) { if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_scale_times")) aux_tree->mcmc->move_prob[move] = tree->mcmc->move_prob[move]; if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_node_times")) aux_tree->mcmc->move_prob[move] = tree->mcmc->move_prob[move]; if(!strcmp(aux_tree->mcmc->move_name[move],"root_time")) aux_tree->mcmc->move_prob[move] = tree->mcmc->move_prob[move]; if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_spr")) aux_tree->mcmc->move_prob[move] = tree->mcmc->move_prob[move]; if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_spr_slide")) aux_tree->mcmc->move_prob[move] = tree->mcmc->move_prob[move]; if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_narrow_exchange")) aux_tree->mcmc->move_prob[move] = tree->mcmc->move_prob[move]; if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_wide_exchange")) aux_tree->mcmc->move_prob[move] = tree->mcmc->move_prob[move]; if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_ldsk_tip_to_root")) aux_tree->mcmc->move_prob[move] = tree->mcmc->move_prob[move]; if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_ldsk_given_disk")) aux_tree->mcmc->move_prob[move] = tree->mcmc->move_prob[move]; } sum = 0.0; for(move=0;movemcmc->n_moves;move++) sum += aux_tree->mcmc->move_prob[move]; for(move=0;movemcmc->n_moves;move++) aux_tree->mcmc->move_prob[move] /= sum; for(move=1;movemcmc->n_moves;move++) aux_tree->mcmc->move_weight[move] = aux_tree->mcmc->move_weight[move-1] + aux_tree->mcmc->move_prob[move]; aux_tree->eval_alnL = NO; aux_tree->eval_rlnL = NO; aux_tree->eval_glnL = YES; run = aux_tree->mcmc->run; aux_tree->mcmc->sample_interval = -1; aux_tree->mcmc->print_every = -1; n_mcmc_steps = aux_tree->n_otu*10; LOCATION_Lk(NULL,aux_tree); TIMES_Lk(aux_tree); if(aux_tree->times->c_lnL < UNLIKELY || aux_tree->mmod->c_lnL < UNLIKELY) return; aux_lnL_mmod_ok_run = -1; aux_lnL_times_ok_run = -1; print = NO; /* MH-within-MH step */ do { if(aux_tree->mcmc->run > aux_tree->mcmc->chain_len_burnin) for(i=0;imcmc->n_moves;i++) aux_tree->mcmc->adjust_tuning[i] = NO; else { for(i=0;imcmc->n_moves;i++) aux_tree->mcmc->adjust_tuning[i] = YES; aux_tree->mcmc->is_burnin = NO; } u = Uni(); for(move=0;movemcmc->n_moves;move++) if(aux_tree->mcmc->move_weight[move] > u-1.E-10) break; aux_tree->mcmc->move_idx = move; if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_scale_times")) MCMC_PHYREX_Scale_Times(aux_tree,print); if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_node_times")) MCMC_PHYREX_Node_Times(aux_tree,print); if(!strcmp(aux_tree->mcmc->move_name[move],"root_time")) MCMC_Root_Time(aux_tree,print); if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_spr")) MCMC_PHYREX_Prune_Regraft(aux_tree,print); if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_spr_slide")) MCMC_PHYREX_Prune_Regraft_Slide(aux_tree,print); if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_narrow_exchange")) MCMC_PHYREX_Narrow_Exchange(aux_tree,print); if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_wide_exchange")) MCMC_PHYREX_Wide_Exchange(aux_tree,print); if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_ldsk_tip_to_root")) MCMC_PHYREX_Ldsk_Tip_To_Root(aux_tree,print); if(!strcmp(aux_tree->mcmc->move_name[move],"phyrex_ldsk_given_disk")) MCMC_PHYREX_Ldsk_Given_Disk(aux_tree,print); if(aux_tree->mmod->c_lnL > tree->mmod->c_lnL && aux_lnL_mmod_ok_run < 0) aux_lnL_mmod_ok_run = aux_tree->mcmc->run-run; if(aux_tree->times->c_lnL > tree->times->c_lnL && aux_lnL_times_ok_run < 0) aux_lnL_times_ok_run = aux_tree->mcmc->run-run; if(!(aux_tree->mmod->c_lnL > UNLIKELY)) { PhyML_Fprintf(stdout,"\n. move: %s",aux_tree->mcmc->move_name[move]); PhyML_Fprintf(stdout,"\n. glnL=%f",aux_tree->mmod->c_lnL); assert(FALSE); } /* PhyML_Printf("\n> %30s %15f %15f", */ /* aux_tree->mcmc->move_name[move], */ /* aux_tree->mmod->c_lnL, */ /* aux_tree->times->c_lnL); */ failed = NO; if(aux_tree->mmod->safe_phyrex == YES) { phydbl g_lnL = aux_tree->mmod->c_lnL; LOCATION_Lk(NULL,aux_tree); if(Are_Equal(g_lnL,aux_tree->mmod->c_lnL,1.E-8) == NO) { PhyML_Fprintf(stdout,"\n. g_lnL: %f -> %f [%g]",g_lnL,aux_tree->mmod->c_lnL,g_lnL-aux_tree->mmod->c_lnL); PhyML_Fprintf(stdout,"\n. tune scale: %f",aux_tree->mcmc->tune_move[aux_tree->mcmc->num_move_phyrex_scale_times]); failed = YES; } phydbl t_lnL = aux_tree->times->c_lnL; TIMES_Lk(aux_tree); if(Are_Equal(t_lnL,aux_tree->times->c_lnL,1.E-8) == NO) { PhyML_Fprintf(stdout,"\n. t_lnL: %f -> %f [%g]",g_lnL,aux_tree->times->c_lnL,g_lnL-aux_tree->times->c_lnL); failed = YES; } if(failed == YES) { PhyML_Fprintf(stdout,"\n. Problem detected with move %s [%s]. Iteration %d",aux_tree->mcmc->move_name[move],tree->mcmc->move_name[tree->mcmc->move_idx],aux_tree->mcmc->run); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } MCMC_Get_Acc_Rates(aux_tree->mcmc); } while(!(aux_tree->mcmc->run-run > n_mcmc_steps && aux_tree->mcmc->run > tree->mcmc->run + 1E+3)); /* while(aux_tree->mcmc->run-run < n_mcmc_steps); */ aux_tree->mod->s_opt->opt_topo = init_topo_opt; aux_tree->mod->s_opt->opt_node_ages = init_node_times_opt; /* PhyML_Printf("\n. run: %6d/%6d (%6d) [%6d;%6d] %20s [%15f,%15f]", */ /* aux_tree->mcmc->run-run, */ /* n_mcmc_steps, */ /* tree->mcmc->run, */ /* aux_lnL_mmod_ok_run, */ /* aux_lnL_times_ok_run, */ /* tree->mcmc->move_name[tree->mcmc->move_idx], */ /* aux_tree->mcmc->tune_move[aux_tree->mcmc->num_move_phyrex_ldsk_tip_to_root], */ /* aux_tree->mcmc->tune_move[aux_tree->mcmc->num_move_phyrex_ldsk_given_disk]); */ } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Narrow_Exchange(t_tree *tree, int print) { phydbl u,alpha,ratio,hr; phydbl cur_glnL, new_glnL; phydbl cur_alnL, new_alnL; phydbl cur_rlnL, new_rlnL; phydbl cur_tlnL, new_tlnL; t_ldsk *d,*a,*v,*w; int j; int n_iter; int dv,aw; phydbl *rad; if(tree->mod->s_opt->opt_topo == NO) return; n_iter = (int)(1+0.2*tree->n_otu); rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); for(j=0;jmmod->n_dim;++j) rad[j] = 1.*tree->mmod->sigsq[j]; while(n_iter--) { tree->mcmc->run_move[tree->mcmc->num_move_phyrex_narrow_exchange]++; Set_Lk(tree); d = NULL; a = NULL; v = NULL; w = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; cur_alnL = tree->c_lnL; new_alnL = UNLIKELY; cur_rlnL = tree->rates->c_lnL; new_rlnL = UNLIKELY; hr = 0.0; ratio = 0.0; if(tree->eval_tlnL == YES) assert(cur_tlnL > UNLIKELY); if(tree->eval_glnL == YES) assert(cur_glnL > UNLIKELY); if(tree->eval_alnL == YES) assert(cur_alnL > UNLIKELY); if(tree->eval_rlnL == YES) assert(cur_rlnL > UNLIKELY); if(tree->young_disk->next) assert(FALSE); do { d = tree->a_nodes[Rand_Int(tree->n_otu,2*tree->n_otu-2)]->ldsk; } while(d == tree->n_root->ldsk); a = d->prev; assert(a); dv = Rand_Int(0,d->n_next-1); do { aw = Rand_Int(0,a->n_next-1); } while(a->next[aw] == d); v = d->next[dv]; w = a->next[aw]; if(w->disk->time < d->disk->time) continue; PHYREX_Exchange_Ldsk(a,d,w,v,aw,dv,tree); Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); /* PHYREX_Swap_Coords(a,d,tree); */ if(w->disk->time > v->disk->time) PHYREX_Update_Lindisk_List_Range(w->disk,a->disk,tree); else PHYREX_Update_Lindisk_List_Range(v->disk,a->disk,tree); PHYREX_Update_Node_Times_Given_Disks(tree); RATES_Update_Edge_Lengths(tree); assert(tree->n_root->ldsk->disk->prev == NULL); if(tree->eval_glnL == YES) { new_glnL = (tree->mmod->use_locations == YES) ? LOCATION_Lk(NULL,tree) : 0.0; if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } else { new_glnL = 0.0; } if(tree->eval_tlnL == YES) { new_tlnL = TIMES_Lk(tree); } else { new_tlnL = 0.0; } if(tree->eval_alnL == YES && new_glnL > UNLIKELY) new_alnL = Lk(NULL,tree); if(tree->eval_rlnL == YES && new_glnL > UNLIKELY) new_rlnL = RATES_Lk(tree); ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_alnL - cur_alnL); if(tree->eval_rlnL == YES) ratio += (new_rlnL - cur_rlnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* { */ /* phydbl delta1 = new_alnL - cur_alnL; */ /* phydbl delta2 = Lk(NULL,tree) - cur_alnL; */ /* /\* PhyML_Printf("\n<<>> delta1=%f delta2=%f",delta1,delta2); *\/ */ /* if(Are_Equal(delta1,delta2,1.E-5)==NO) { */ /* { */ /* PhyML_Printf("\n<> delta1=%f delta2=%f",delta1,delta2); */ /* assert(FALSE); */ /* } */ /* } */ /* } */ /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; /* printf("\n. %3d %3d alpha:%12f %3d",prune_ldsk->n_next+1,regraft_ldsk->n_next-1,alpha,new_n_coal); */ /* if(tree->eval_alnL == YES) */ if(print == YES) PhyML_Printf("\n NARROW cycle: %d alnL: [%16f->%16f] glnL: [%16f->%16f] rlnL: [%16f->%16f] tlnL: [%16f->%16f] hr: %14f alpha: %12f", tree->mcmc->run, cur_alnL,new_alnL, cur_glnL,new_glnL, cur_rlnL,new_rlnL, cur_tlnL,new_tlnL, hr,alpha); u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { PHYREX_Exchange_Ldsk(a,d,v,w,aw,dv,tree); /* PHYREX_Swap_Coords(a,d,tree); */ if(w->disk->time > v->disk->time) PHYREX_Update_Lindisk_List_Range(w->disk,a->disk,tree); else PHYREX_Update_Lindisk_List_Range(v->disk,a->disk,tree); PHYREX_Update_Node_Times_Given_Disks(tree); RATES_Fill_Lca_Table(tree); RATES_Update_Edge_Lengths(tree); Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); Reset_Lk(tree); } else { tree->mmod->c_lnL = new_glnL; tree->times->c_lnL = new_tlnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_narrow_exchange]++; } assert(tree->n_root->ldsk->disk->prev == NULL); tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } Free(rad); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Wide_Exchange(t_tree *tree, int print) { phydbl u,alpha,ratio,hr; phydbl cur_glnL, new_glnL; phydbl cur_alnL, new_alnL; phydbl cur_rlnL, new_rlnL; phydbl cur_tlnL, new_tlnL; t_ldsk *d,*a,*v,*w; int j; int n_iter; int dv,aw; phydbl *rad; int d_idx,a_idx; if(tree->mod->s_opt->opt_topo == NO) return; n_iter = (int)(1+0.2*tree->n_otu); rad = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); for(j=0;jmmod->n_dim;++j) rad[j] = 1.*tree->mmod->sigsq[j]; while(n_iter--) { tree->mcmc->run_move[tree->mcmc->num_move_phyrex_wide_exchange]++; Set_Lk(tree); d = NULL; a = NULL; v = NULL; w = NULL; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_tlnL = tree->times->c_lnL; new_tlnL = UNLIKELY; cur_alnL = tree->c_lnL; new_alnL = UNLIKELY; cur_rlnL = tree->rates->c_lnL; new_rlnL = UNLIKELY; hr = 0.0; ratio = 0.0; if(tree->eval_tlnL == YES) assert(cur_tlnL > UNLIKELY); if(tree->eval_glnL == YES) assert(cur_glnL > UNLIKELY); if(tree->eval_alnL == YES) assert(cur_alnL > UNLIKELY); if(tree->eval_rlnL == YES) assert(cur_rlnL > UNLIKELY); if(tree->young_disk->next) assert(FALSE); do { d_idx = Rand_Int(tree->n_otu,2*tree->n_otu-2); a_idx = Rand_Int(tree->n_otu,2*tree->n_otu-2); d = tree->a_nodes[d_idx]->ldsk; a = tree->a_nodes[a_idx]->ldsk; } while(d == a); if(a->disk->time > d->disk->time) { t_ldsk *dum; dum = a; a = d; d = dum; } if(d->prev == a) continue; dv = Rand_Int(0,d->n_next-1); aw = Rand_Int(0,a->n_next-1); v = d->next[dv]; w = a->next[aw]; assert(w != d); int wv_dist = 0; Find_Lca_Pair_Of_Nodes(v->nd,w->nd,&wv_dist,tree); if(w->disk->time < d->disk->time || v->disk->time < a->disk->time) continue; /* if(w->disk->time < d->disk->time || v->disk->time < a->disk->time || wv_dist > 7) continue; */ PHYREX_Exchange_Ldsk(a,d,w,v,aw,dv,tree); Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); /* PHYREX_Swap_Coords(a,d,tree); */ if(w->disk->time > v->disk->time) PHYREX_Update_Lindisk_List_Range(w->disk,a->disk,tree); else PHYREX_Update_Lindisk_List_Range(v->disk,a->disk,tree); PHYREX_Update_Node_Times_Given_Disks(tree); RATES_Update_Edge_Lengths(tree); assert(tree->n_root->ldsk->disk->prev == NULL); if(tree->eval_glnL == YES) { new_glnL = (tree->mmod->use_locations == YES) ? LOCATION_Lk(NULL,tree) : 0.0; if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; } else { new_glnL = 0.0; } if(tree->eval_tlnL == YES) { new_tlnL = TIMES_Lk(tree); } else { new_tlnL = 0.0; } if(tree->eval_alnL == YES && new_glnL > UNLIKELY) new_alnL = Lk(NULL,tree); if(tree->eval_rlnL == YES && new_glnL > UNLIKELY) new_rlnL = RATES_Lk(tree); ratio = 0.0; if(tree->eval_alnL == YES) ratio += (new_alnL - cur_alnL); if(tree->eval_rlnL == YES) ratio += (new_rlnL - cur_rlnL); if(tree->eval_tlnL == YES) ratio += (new_tlnL - cur_tlnL); if(tree->eval_glnL == YES) ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* { */ /* phydbl delta1 = new_glnL - cur_glnL; */ /* phydbl delta2 = LOCATION_Lk(NULL,tree) - cur_glnL; */ /* /\* PhyML_Printf("\n<<>> delta1=%f delta2=%f",delta1,delta2); *\/ */ /* if(Are_Equal(delta1,delta2,1.E-8)==NO) { */ /* { */ /* PhyML_Printf("\n<> delta1=%f delta2=%f",delta1,delta2); */ /* assert(FALSE); */ /* } */ /* } */ /* } */ /* Always accept move */ if(tree->mcmc->always_yes == YES && new_glnL > UNLIKELY) alpha = 1.0; /* PhyML_Printf("\n. LOCATION_Lk: %f",LOCATION_Lk(NULL,tree)); */ /* if(print == YES) */ /* PhyML_Printf("\n WIDE cycle: %d alnL: [%16f->%16f] glnL: [%16f->%16f] rlnL: [%16f->%16f] tlnL: [%16f->%16f] hr: %14f alpha: %12f", */ /* tree->mcmc->run, */ /* cur_alnL,new_alnL, */ /* cur_glnL,new_glnL, */ /* cur_rlnL,new_rlnL, */ /* cur_tlnL,new_tlnL, */ /* hr,alpha); */ u = Uni(); assert(isnan(u) == NO && isinf(fabs(u)) == NO); if(u > alpha) /* Reject */ { PHYREX_Exchange_Ldsk(a,d,v,w,aw,dv,tree); /* PHYREX_Swap_Coords(a,d,tree); */ if(w->disk->time > v->disk->time) PHYREX_Update_Lindisk_List_Range(w->disk,a->disk,tree); else PHYREX_Update_Lindisk_List_Range(v->disk,a->disk,tree); /* if(tree->eval_glnL == YES && (IBM_Is_Ibm(tree->mmod) == YES)) PHYREX_Restore_Coord(tree); */ PHYREX_Update_Node_Times_Given_Disks(tree); RATES_Fill_Lca_Table(tree); RATES_Update_Edge_Lengths(tree); Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); Reset_Lk(tree); } else { tree->times->c_lnL = new_tlnL; tree->mmod->c_lnL = new_glnL; tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_wide_exchange]++; } assert(tree->n_root->ldsk->disk->prev == NULL); tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } Free(rad); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Node_Velocity(t_tree *tree) { if(tree->mmod->use_locations == NO) return; if(VELOC_Is_Integrated_Velocity(tree->mmod) == NO) return; tree->contmod->both_sides[LOCATION] = YES; tree->contmod->both_sides[VELOCITY] = YES; LOCATION_Lk(NULL,tree); MCMC_PHYREX_Node_Velocity_Pre(NULL,tree->n_root,tree); tree->contmod->both_sides[LOCATION] = NO; tree->contmod->both_sides[VELOCITY] = NO; LOCATION_Lk(NULL,tree); // /* Velocities */ // int *permut; // int i, j; // t_node *n; // phydbl cur_glnL, new_glnL; // phydbl hr,u,alpha,ratio; // phydbl cur, new; // int err; // permut = Permutate(2 * tree->n_otu - 1); // for (i = 0; i < 2 * tree->n_otu - 1; ++i) // { // tree->mcmc->run_move[tree->mcmc->num_move_phyrex_node_veloc]++; // cur_glnL = tree->mmod->c_lnL; // new_glnL = UNLIKELY; // hr = 0.0; // n = tree->a_nodes[permut[i]]; // PHYREX_Store_Veloc(n->ldsk->veloc); // for (j = 0; j < tree->mmod->n_dim; ++j) // { // cur = n->ldsk->veloc->deriv[j]; // /* new = Rnorm(cur,sqrt(fabs(cur)/5.+1.E-6)); */ // /* hr -= Log_Dnorm(new,cur,sqrt(fabs(cur)/5.+1.E-6),&err); */ // /* hr += Log_Dnorm(cur,new,sqrt(fabs(new)/5.+1.E-6),&err); */ // /* new = Rnorm(cur,sqrt(fabs(mean_v[j]/2.))); */ // /* hr -= Log_Dnorm(new,cur,sqrt(fabs(mean_v[j]/2.)),&err); */ // /* hr += Log_Dnorm(cur,new,sqrt(fabs(mean_v[j]/2.)),&err); */ // /* new = Rnorm(cur,0.1); */ // /* hr -= Log_Dnorm(new,cur,0.1,&err); */ // /* hr += Log_Dnorm(cur,new,0.1,&err); */ // new = Rnorm(cur, 1.E-1); // hr -= Log_Dnorm(new, cur, 1.E-1, &err); // hr += Log_Dnorm(cur, new, 1.E-1, &err); // /* if(n->ldsk->prev != NULL) */ // /* { */ // /* phydbl dt,sd; */ // /* dt = fabs(n->ldsk->disk->time-n->ldsk->prev->disk->time); */ // /* sd = */ // /* log(tree->mmod->sigsq[j])+ */ // /* log(tree->mmod->sigsq_scale[n->num])+ */ // /* log(tree->mmod->sigsq_scale_norm_fact)+ */ // /* log(dt); */ // /* sd = sqrt(exp(sd)); */ // /* new = Rnorm(n->ldsk->prev->veloc->deriv[j],sd); */ // /* hr -= Log_Dnorm(new,n->ldsk->prev->veloc->deriv[j],sd,&err); */ // /* hr += Log_Dnorm(cur,n->ldsk->prev->veloc->deriv[j],sd,&err); */ // /* } */ // /* else */ // /* { */ // /* new = Rnorm(cur,sqrt(fabs(cur)/5.+1.E-6)); */ // /* hr -= Log_Dnorm(new,cur,sqrt(fabs(cur)/5.+1.E-6),&err); */ // /* hr += Log_Dnorm(cur,new,sqrt(fabs(new)/5.+1.E-6),&err); */ // /* } */ // n->ldsk->veloc->deriv[j] = new; // } // new_glnL = LOCATION_Lk(NULL,tree); // ratio = 0.0; // ratio += (new_glnL - cur_glnL); // ratio += hr; // ratio = exp(ratio); // alpha = MIN(1., ratio); // /* if(Are_Equal(ratio,1.,1.E-5) == NO) */ // /* { */ // /* PhyML_Printf("\n. LOCATION -- Node %3d tip? %d root? %d ratio: %14f sigsq_scale: %f", */ // /* n->num, */ // /* n->tax ? 1 : 0, */ // /* (n == tree->n_root) ? 1 : 0, */ // /* ratio, */ // /* tree->mmod->sigsq_scale[n->num]); */ // /* assert(NO); */ // /* } */ // u = Uni(); // if (u > alpha) /* Reject */ // { // PHYREX_Restore_Veloc(n->ldsk->veloc); // tree->mmod->c_lnL = cur_glnL; // } // else // { // tree->mmod->c_lnL = new_glnL; // tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_node_veloc]++; // } // tree->mcmc->run++; // PHYREX_Print_MCMC_Stats(tree); // PHYREX_Print_MCMC_Tree(tree); // PHYREX_Print_MCMC_Summary(tree); // } // Free(permut); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void MCMC_PHYREX_Node_Velocity_Pre(t_node *a, t_node *d, t_tree *tree) { phydbl cur_glnL, new_glnL; phydbl cur_vel, new_vel; phydbl hr, u, alpha, ratio; int i, err; t_node *dad, *son, *bro; phydbl var_dad, var_son, var_bro; phydbl mu_dad, mu_son, mu_bro; phydbl mu, var; phydbl dt_dad, dt_son, dt_bro; cur_glnL = tree->mmod->c_lnL; new_glnL = tree->mmod->c_lnL; hr = 0.0; tree->mcmc->run_move[tree->mcmc->num_move_phyrex_node_veloc]++; PHYREX_Store_Veloc(d->ldsk->veloc); dad = d; son = bro = NULL; if (dad->tax == NO) { for (i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if (son == NULL) son = d->v[i]; else bro = d->v[i]; } } } if (dad != tree->n_root) dt_dad = tree->times->nd_t[dad->num] - tree->times->nd_t[a->num]; else dt_dad = -1.; if (dad->tax == NO) { dt_son = tree->times->nd_t[son->num] - tree->times->nd_t[dad->num]; dt_bro = tree->times->nd_t[bro->num] - tree->times->nd_t[dad->num]; } for (i = 0; i < tree->mmod->n_dim; ++i) { cur_vel = d->ldsk->veloc->deriv[i]; var = mu = var_dad = mu_dad = var_son = mu_son = var_bro = mu_bro = -1.; // new_vel = Rnorm(cur_vel,1.E-3); // hr -= Log_Dnorm(new_vel,cur_vel,1.E-3,&err); // hr += Log_Dnorm(cur_vel,new_vel,1.E-3,&err); // if (dad != tree->n_root) // { // new_vel = Rnorm(cur_vel, VELOC_Velocity_Variance_Along_Edge(dad, i, tree)); // hr -= Log_Dnorm(new_vel, cur_vel, VELOC_Velocity_Variance_Along_Edge(dad, i, tree), &err); // hr += Log_Dnorm(cur_vel, new_vel, VELOC_Velocity_Variance_Along_Edge(dad, i, tree), &err); // } // else // { // new_vel = Rnorm(cur_vel, tree->mmod->rw_root_var[VELOCITY]); // hr -= Log_Dnorm(new_vel, cur_vel, tree->mmod->rw_root_var[VELOCITY], &err); // hr += Log_Dnorm(cur_vel, new_vel, tree->mmod->rw_root_var[VELOCITY], &err); // } // new_vel = Rnorm(cur_vel,.05*cur_vel); // hr -= Log_Dnorm(new_vel,cur_vel,.05*cur_vel,&err); // hr += Log_Dnorm(cur_vel,new_vel,.05*new_vel,&err); // new_vel = Rnorm(cur_vel,1.E-3); // hr -= Log_Dnorm(new_vel,cur_vel,1.E-3,&err); // hr += Log_Dnorm(cur_vel,new_vel,1.E-3,&err); if (dad != tree->n_root) { var_dad = dt_dad * tree->mmod->sigsq[i]; mu_dad = dad->anc->ldsk->veloc->deriv[i]; } else { var_dad = tree->mmod->rw_root_var[VELOCITY]; mu_dad = dad->ldsk->veloc->deriv[i]; } if (dad->tax == YES) { var = var_dad; mu = mu_dad; } else { var_son = dt_son * tree->mmod->sigsq[i]; var_bro = dt_bro * tree->mmod->sigsq[i]; mu_son = son->ldsk->veloc->deriv[i]; mu_bro = bro->ldsk->veloc->deriv[i]; if (var_dad > SMALL && var_son > SMALL && var_bro > SMALL) { var = 1. / (1. / var_dad + 1. / var_son + 1. / var_bro); mu = var * (mu_dad / var_dad + mu_son / var_son + mu_bro / var_bro); } else if (var_dad < SMALL) { var = 0.0; mu = mu_dad; } else if (var_son < SMALL) { var = 0.0; mu = mu_son; } else if (var_bro < SMALL) { var = 0.0; mu = mu_bro; } else { var = 0.0; mu = mu_dad; } } if (isnan(mu)) assert(false); if (isnan(var)) assert(false); if (dad == tree->n_root) { new_vel = Rnorm(cur_vel, 1.E-0); } else { new_vel = Rnorm(mu, 1.5 * sqrt(var)); hr -= Log_Dnorm(new_vel, mu, 1.5 * sqrt(var), &err); hr += Log_Dnorm(cur_vel, mu, 1.5 * sqrt(var), &err); } d->ldsk->veloc->deriv[i] = new_vel; } if (a != NULL) { VELOC_Update_Lk_Velocity_Up(a, d, tree); VELOC_Update_Lk_Location_Up(a, d, tree); } if (d->tax == NO) { VELOC_Update_Lk_Velocity_Down(a, d, tree); VELOC_Update_Lk_Location_Down(a, d, tree); } new_glnL = LOCATION_Lk(d, tree); // new_glnL = LOCATION_Lk(NULL,tree); /* !!!!!!!!!!!!!!!!! */ ratio = 0.0; ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1., ratio); // if (dad == tree->n_root) // PhyML_Printf("\n. a: %3d d: %3d (%d%d%d) hr: %13f alpha: %13f cur_glnL: %13f new_glnL: %13f vel: %12f %12f lnLv(%13f %13f) lnLl(%13f %13f) VEL down:(%13f %13f) up:(%13f %13f) dt: %f", // a ? a->num : -1, d->num, // d == tree->n_root ? 1 : 0, // d == tree->n_root->v[1] ? 1 : 0, // d == tree->n_root->v[2] ? 1 : 0, // hr, // alpha, // cur_glnL, new_glnL, // d->ldsk->veloc->deriv[0], // d->ldsk->veloc->deriv[1], // tree->contmod->lnL[VELOCITY * tree->mmod->n_dim + 0], // tree->contmod->lnL[VELOCITY * tree->mmod->n_dim + 1], // tree->contmod->lnL[LOCATION * tree->mmod->n_dim + 0], // tree->contmod->lnL[LOCATION * tree->mmod->n_dim + 1], // tree->contmod->lnL_down[Contmod_Start(VELOCITY, 0, tree) + d->num], // tree->contmod->lnL_down[Contmod_Start(VELOCITY, 1, tree) + d->num], // tree->contmod->lnL_up[Contmod_Start(VELOCITY, 0, tree) + d->num], // tree->contmod->lnL_up[Contmod_Start(VELOCITY, 1, tree) + d->num], // a ? (d->ldsk->disk->time - a->ldsk->disk->time) : -1.); u = Uni(); if (u > alpha) /* Reject */ { PHYREX_Restore_Veloc(d->ldsk->veloc); tree->mmod->c_lnL = cur_glnL; if (a != NULL) { VELOC_Update_Lk_Velocity_Up(a, d, tree); VELOC_Update_Lk_Location_Up(a, d, tree); } if (d->tax == NO) { VELOC_Update_Lk_Velocity_Down(a, d, tree); VELOC_Update_Lk_Location_Down(a, d, tree); } } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_node_veloc]++; } tree->mcmc->run++; tree->mmod->do_location_sampling = NO; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); tree->mmod->do_location_sampling = YES; if (d->tax == YES) return; else { for (i = 0; i < 3; ++i) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { VELOC_Update_Lk_Velocity_Up(d, d->v[i], tree); VELOC_Update_Lk_Location_Up(d, d->v[i], tree); MCMC_PHYREX_Node_Velocity_Pre(d, d->v[i], tree); } } VELOC_Update_Lk_Velocity_Down(a, d, tree); VELOC_Update_Lk_Location_Down(a, d, tree); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Correlated_Node_Velocity(t_tree *tree) { if(tree->mmod->use_locations == NO) return; if(VELOC_Is_Integrated_Velocity(tree->mmod) == NO) return; tree->contmod->both_sides[LOCATION] = YES; tree->contmod->both_sides[VELOCITY] = YES; LOCATION_Lk(NULL,tree); MCMC_PHYREX_Correlated_Node_Velocity_Pre(NULL,tree->n_root,tree); tree->contmod->both_sides[LOCATION] = NO; tree->contmod->both_sides[VELOCITY] = NO; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void MCMC_PHYREX_Correlated_Node_Velocity_Pre(t_node *a, t_node *d, t_tree *tree) { phydbl cur_glnL, new_glnL; phydbl *cur_vel, *new_vel; phydbl hr,u,alpha,ratio; int i,err; t_node *dad,*son,*bro,*n; phydbl var; t_ll *tgt,*x; cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; if(d->tax == YES) return; hr = 0.0; n = NULL; dad = d; son = bro = NULL; if(dad->tax == NO) { for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(son == NULL) son = d->v[i]; else bro = d->v[i]; } } } cur_vel = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); new_vel = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); for(i=0;immod->n_dim;++i) { if(a == NULL) { cur_vel[i] = dad->ldsk->veloc->deriv[i]; new_vel[i] = Rnorm(cur_vel[i],sqrt(tree->mmod->rw_root_var[VELOCITY])); hr -= Log_Dnorm(new_vel[i],cur_vel[i],sqrt(tree->mmod->rw_root_var[VELOCITY]),&err); hr += Log_Dnorm(cur_vel[i],new_vel[i],sqrt(tree->mmod->rw_root_var[VELOCITY]),&err); } else { var = VELOC_Velocity_Variance_Along_Edge(dad,i,tree); cur_vel[i] = dad->ldsk->veloc->deriv[i]; if(isnan(dad->anc->ldsk->veloc->deriv[i])) assert(false); if(isnan(var)) assert(false); new_vel[i] = Rnorm(dad->anc->ldsk->veloc->deriv[i],sqrt(var)); hr -= Log_Dnorm(new_vel[i],dad->anc->ldsk->veloc->deriv[i],sqrt(var),&err); hr += Log_Dnorm(cur_vel[i],dad->anc->ldsk->veloc->deriv[i],sqrt(var),&err); } } tgt = NULL; tgt = Get_Velocity_Targets(a,d,tree); if(tgt != NULL) { PHYREX_Store_All_Veloc(tree); n = (t_node *)(tgt->head->v); assert((t_node *)tgt->head->v == d); assert(d->tax == NO); tree->mcmc->run_move[tree->mcmc->num_move_phyrex_correlated_node_veloc]++; x = tgt->head; do { n = (t_node *)x->v; for(i=0;immod->n_dim;++i) n->ldsk->veloc->deriv[i] += (new_vel[i]-cur_vel[i]); x = x->next; } while(x); x = tgt->tail; do { n = (t_node *)x->v; VELOC_Update_Lk_Velocity_Down(n->anc,n,tree); VELOC_Update_Lk_Location_Down(n->anc,n,tree); x = x->prev; } while(x); if(a != NULL) { VELOC_Update_Lk_Velocity_Up(a,d,tree); VELOC_Update_Lk_Location_Up(a,d,tree); } new_glnL = LOCATION_Lk(d,tree); // new_glnL = LOCATION_Lk(NULL,tree); /* !!!!!!!!!!!!!!!!!!!! */ ratio = 0.0; ratio += (new_glnL - cur_glnL); ratio += hr; ratio = exp(ratio); alpha = MIN(1.,ratio); /* PhyML_Printf("\n. Node %d cur_lnL: %12f new_lnL: %12f cur_vel: %12f new_vel: %12f", */ /* d->num, */ /* cur_glnL,new_glnL, */ /* cur_vel[0],new_vel[0]); */ u = Uni(); if(u > alpha) /* Reject */ { PHYREX_Restore_All_Veloc(tree); tree->mmod->c_lnL = cur_glnL; x = tgt->tail; do { n = (t_node *)x->v; VELOC_Update_Lk_Velocity_Down(n->anc,n,tree); VELOC_Update_Lk_Location_Down(n->anc,n,tree); x = x->prev; } while(x); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_correlated_node_veloc]++; } } tree->mcmc->run++; tree->mmod->do_location_sampling = NO; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); tree->mmod->do_location_sampling = YES; if(tgt) Free_Linked_List(tgt); Free(cur_vel); Free(new_vel); for(i=0;i<3;++i) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { VELOC_Update_Lk_Velocity_Up(d,d->v[i],tree); VELOC_Update_Lk_Location_Up(d,d->v[i],tree); MCMC_PHYREX_Correlated_Node_Velocity_Pre(d,d->v[i],tree); } VELOC_Update_Lk_Velocity_Down(a,d,tree); VELOC_Update_Lk_Location_Down(a,d,tree); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_All_Velocities(t_tree *tree) { if (tree->mmod->use_locations == NO) return; if (VELOC_Is_Integrated_Velocity(tree->mmod) == NO) return; int i, j, n_nodes; phydbl u, alpha, ratio, mult; phydbl cur_glnL, new_glnL; phydbl cur_glnP, new_glnP; t_node *n; phydbl cur_sigsq, new_sigsq; phydbl cur_iou_theta, new_iou_theta; /* Scale all velocities */ for (i = 0; i < tree->n_otu - 1; ++i) { for (j = 0; j < tree->mmod->n_dim; ++j) { tree->mcmc->run_move[tree->mcmc->num_move_phyrex_all_veloc]++; PHYREX_Store_All_Veloc(tree); Set_Lk(tree); Set_Prior(tree); cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_glnP = tree->mmod->c_lnP; new_glnP = UNLIKELY; cur_sigsq = tree->mmod->sigsq[j]; new_sigsq = tree->mmod->sigsq[j]; cur_iou_theta = tree->mmod->ou_theta; new_iou_theta = tree->mmod->ou_theta; n = tree->n_root; u = Uni(); mult = exp((u - 0.5)); n_nodes = 0; Scale_Subtree_Veloc(n, mult, &n_nodes, j, tree); if (IOU_Is_Iou(tree->mmod) == YES) { new_iou_theta = cur_iou_theta * mult; tree->mmod->ou_theta = new_iou_theta; } new_sigsq = cur_sigsq * mult; tree->mmod->sigsq[j] = new_sigsq; new_glnL = LOCATION_Lk(NULL, tree); new_glnP = LOCATION_Prior(tree); ratio = 0.0; ratio += (new_glnL - cur_glnL); ratio += (new_glnP - cur_glnP); ratio += n_nodes * log(mult); ratio += log(mult); if(IOU_Is_Iou(tree->mmod) == YES) ratio += log(mult); ratio = exp(ratio); alpha = MIN(1., ratio); // PhyML_Printf("\n. lnL: %f->%f scale: %f alpha: %f",cur_glnL,new_glnL,mult,alpha); u = Uni(); if (u > alpha) /* Reject */ { PHYREX_Restore_All_Veloc(tree); tree->mmod->sigsq[j] = cur_sigsq; tree->mmod->ou_theta = cur_iou_theta; Reset_Lk(tree); Reset_Prior(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_all_veloc]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_IWN_Update_Omega(t_tree *tree) { if(VELOC_Is_Integrated_Velocity(tree->mmod) == YES) MCMC_Single_Param_Generic(&(tree->mmod->omega), tree->mmod->min_omega, tree->mmod->max_omega, tree->mcmc->num_move_phyrex_iwn_omega, &(tree->mmod->c_lnP),&(tree->mmod->c_lnL), LOCATION_Wrap_Prior,LOCATION_Wrap_Lk, tree->mcmc->move_type[tree->mcmc->num_move_phyrex_iwn_omega], NO,NO,NULL,tree,NULL); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_IOU_Update_Theta(t_tree *tree) { if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES && IOU_Is_Iou(tree->mmod) == YES) { // MCMC_Single_Param_Generic(&(tree->mmod->ou_theta), // tree->mmod->min_ou_theta, // tree->mmod->max_ou_theta, // tree->mcmc->num_move_phyrex_iou_theta, // &(tree->mmod->c_lnP),&(tree->mmod->c_lnL), // LOCATION_Wrap_Prior,LOCATION_Wrap_Lk, // tree->mcmc->move_type[tree->mcmc->num_move_phyrex_iou_theta], // NO,NO,NULL,tree,NULL); int j; phydbl u, alpha, ratio, mult; phydbl cur_glnL, new_glnL; phydbl cur_glnP, new_glnP; phydbl cur_theta, new_theta; // LOCATION_Lk(NULL, tree); // LOCATION_Prior(tree); for (j = 0; j < tree->mmod->n_dim; ++j) { tree->mcmc->run_move[tree->mcmc->num_move_phyrex_iou_theta]++; Set_Lk(tree); Set_Prior(tree); cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_glnP = tree->mmod->c_lnP; new_glnP = UNLIKELY; cur_theta = tree->mmod->ou_theta; new_theta = tree->mmod->ou_theta; u = Uni(); mult = exp((u - 0.5)); new_theta = cur_theta * mult; tree->mmod->ou_theta = new_theta; new_glnL = LOCATION_Lk(NULL, tree); new_glnP = LOCATION_Prior(tree); ratio = 0.0; ratio += (new_glnL - cur_glnL); ratio += (new_glnP - cur_glnP); ratio += 1 * log(mult); ratio = exp(ratio); alpha = MIN(1., ratio); // PhyML_Printf("\n. lnL: %13f->%13f scale: %13f alpha: %13f theta: %13g->%13g [%13g %13g %13g %13g]", // cur_glnL, new_glnL, // mult, alpha, // cur_theta, new_theta, // tree->contmod->lnL[VELOCITY*tree->mmod->n_dim+0], // tree->contmod->lnL[VELOCITY*tree->mmod->n_dim+1], // tree->contmod->lnL[LOCATION*tree->mmod->n_dim+0], // tree->contmod->lnL[LOCATION*tree->mmod->n_dim+1]); u = Uni(); if (u > alpha) /* Reject */ { tree->mmod->ou_theta = cur_theta; Reset_Lk(tree); Reset_Prior(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_iou_theta]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_IOU_Update_Mu(t_tree *tree) { if(VELOC_Is_Integrated_Velocity(tree->mmod) == YES && IOU_Is_Iou(tree->mmod) == YES) { for(int i=0; immod->n_dim; ++i) MCMC_Single_Param_Generic(&(tree->mmod->ou_mu[i]), tree->mmod->min_ou_mu, tree->mmod->max_ou_mu, tree->mcmc->num_move_phyrex_iou_mu, &(tree->mmod->c_lnP),&(tree->mmod->c_lnL), LOCATION_Wrap_Prior,LOCATION_Wrap_Lk, tree->mcmc->move_type[tree->mcmc->num_move_phyrex_iou_mu], NO,NO,NULL,tree,NULL); } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_IOU_Update_Theta_Sigsq(t_tree *tree) { if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES && IOU_Is_Iou(tree->mmod) == YES) { int j; phydbl u, alpha, ratio, mult; phydbl cur_glnL, new_glnL; phydbl cur_glnP, new_glnP; phydbl cur_sigsq, new_sigsq; phydbl cur_theta, new_theta; for (j = 0; j < tree->mmod->n_dim; ++j) { tree->mcmc->run_move[tree->mcmc->num_move_phyrex_iou_theta_sigsq]++; Set_Lk(tree); Set_Prior(tree); cur_glnL = tree->mmod->c_lnL; new_glnL = UNLIKELY; cur_glnP = tree->mmod->c_lnP; new_glnP = UNLIKELY; cur_sigsq = tree->mmod->sigsq[j]; new_sigsq = tree->mmod->sigsq[j]; cur_theta = tree->mmod->ou_theta; new_theta = tree->mmod->ou_theta; u = Uni(); mult = exp((u - 0.5)); new_sigsq = cur_sigsq * mult; tree->mmod->sigsq[j] = new_sigsq; new_theta = cur_theta * mult; tree->mmod->ou_theta = new_theta; new_glnL = LOCATION_Lk(NULL, tree); new_glnP = LOCATION_Prior(tree); ratio = 0.0; ratio += (new_glnL - cur_glnL); ratio += (new_glnP - cur_glnP); ratio += 2 * log(mult); ratio = exp(ratio); alpha = MIN(1., ratio); // PhyML_Printf("\n. lnL: %f->%f scale: %f alpha: %f",cur_glnL,new_glnL,mult,alpha); u = Uni(); if (u > alpha) /* Reject */ { tree->mmod->sigsq[j] = cur_sigsq; tree->mmod->ou_theta = cur_theta; Reset_Lk(tree); Reset_Prior(tree); } else { tree->mcmc->acc_move[tree->mcmc->num_move_phyrex_iou_theta_sigsq]++; } tree->mcmc->run++; PHYREX_Print_MCMC_Stats(tree); PHYREX_Print_MCMC_Tree(tree); PHYREX_Print_MCMC_Summary(tree); } } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_Obs_Var(t_tree *tree) { if(tree->contmod->obs_model == YES && tree->contmod->obs_model_est == YES) { for(int i=0;immod->n_dim;++i) { MCMC_Single_Param_Generic(&(tree->contmod->obs_var[i]), tree->contmod->obs_var_min, tree->contmod->obs_var_max, tree->mcmc->num_move_obs_var, &(tree->mmod->c_lnP),&(tree->mmod->c_lnL), LOCATION_Wrap_Prior,LOCATION_Wrap_Lk, tree->mcmc->move_type[tree->mcmc->num_move_obs_var], NO,NO,NULL,tree,NULL); } } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #ifdef PHYREX void MCMC_PHYREX_Tip_Location(int tip_num, t_tree *tree) { short int print; print = NO; for(int j=0;jmmod->n_dim;++j) MCMC_Single_Param_Generic(&(tree->a_nodes[tip_num]->ldsk->coord->lonlat[j]), tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j], tree->mcmc->num_move_phyrex_tip_loc, NULL,&(tree->mmod->c_lnL), NULL,LOCATION_Wrap_Lk, tree->mcmc->move_type[tree->mcmc->num_move_phyrex_tip_loc], NO,print,NULL,tree,NULL); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if (defined PHYREX) void MCMC_Crossvalidate_Locations(t_tree *tree) { t_mcmc *mcmc; phydbl mse; int i; MCMC_Run(tree); mcmc = tree->mcmc; for(i=0;in_otu;++i) { PhyML_Printf("\n. Posterior prediction of location for tip '%s'...",tree->a_nodes[i]->name); // Store location PHYREX_Store_Geo_Coord(tree->a_nodes[i]->ldsk->coord); LOCATION_Lk(NULL,tree); PhyML_Printf("\n. Location lk: %f",tree->mmod->c_lnL); // Run shortish MCMC, printing error in predicted location at every step mcmc->run = 0; mcmc->chain_len = 1E+6; mcmc->sample_interval = -1; // no sampling of parameters mcmc->print_every = -1; mcmc->chain_len_burnin = 0; mcmc->is_burnin = NO; mcmc->tune_move[mcmc->num_move_phyrex_tip_loc] = 1.0; do { MCMC_Run_Core(tree); MCMC_PHYREX_Tip_Location(i,tree); mse = 0.0; /* for(j=0;jmmod->n_dim;++j) */ /* mse += */ /* POW(tree->a_nodes[i]->ldsk->coord->lonlat[j]- */ /* tree->a_nodes[i]->ldsk->coord->cpy->lonlat[j],2); */ mse += Haversine_Distance(tree->a_nodes[i]->ldsk->coord,tree->a_nodes[i]->ldsk->coord->cpy); if(!(mcmc->run%50)) PhyML_Printf("\nCV %20s %15f %15f %15f %15f %15f %15f", tree->a_nodes[i]->name, mse, tree->a_nodes[i]->ldsk->coord->lonlat[0], tree->a_nodes[i]->ldsk->coord->lonlat[1], tree->a_nodes[i]->ldsk->coord->cpy->lonlat[0], tree->a_nodes[i]->ldsk->coord->cpy->lonlat[1], LOCATION_Lk(NULL,tree)); PHYREX_Check_Lk(tree); (void)signal(SIGINT,MCMC_Terminate); } while(mcmc->run < mcmc->chain_len); PHYREX_Restore_Geo_Coord(tree->a_nodes[i]->ldsk->coord); } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ stephaneguindon-phyml-76a39c8/src/mcmc.h000066400000000000000000000232751501136442400202720ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef MCMC_H #define MCMC_H #include "utilities.h" void MCMC_Lexp(t_tree *tree); void MCMC_Print_Param(t_mcmc *mcmc, t_tree *tree); void MCMC_Free_MCMC(t_mcmc *mcmc); void MCMC_Alpha(t_tree *tree); void MCMC_Randomize_Branch_Lengths(t_tree *tree); void MCMC_Randomize_Node_Times(t_tree *tree); void MCMC_Randomize_Node_Times_Pre(t_node *a, t_node *d, t_tree *tree); void MCMC_Randomize_Lexp(t_tree *tree); void MCMC_Randomize_Jumps(t_tree *tree); void MCMC_Randomize_Alpha(t_tree *tree); void MCMC_One_Rate(t_node *a, t_node *d, int traversal, t_tree *tree); void MCMC_No_Change(t_tree *tree); void MCMC_Nu(t_tree *tree); void MCMC_Randomize_Nu(t_tree *tree); t_node *MCMC_Select_Random_Node_Pair(phydbl t_sup, t_tree *tree); void MCMC_Modify_Rates(t_tree *tree); void MCMC_Modify_Subtree_Rate(t_node *a, t_node *d, phydbl new_rate, t_tree *tree); void MCMC_Randomize_Rates(t_tree *tree); void MCMC_Stick_Rates(t_tree *tree); void MCMC_Stick_Rates_Pre(t_node *a, t_node *d, t_tree *tree); void MCMC_Times_Global(t_tree *tree); void MCMC_Times_Local(t_tree *tree); void MCMC_Time_Recur(t_node *a, t_node *d, int traversal, t_tree *tree); void MCMC_Rates_Global(t_tree *tree); void MCMC_Rates_Local(t_tree *tree); void MCMC_Rates_Pre(t_node *a, t_node *d, t_tree *tree); void MCMC_Mixing_Step(t_tree *tree); void MCMC_Jumps_Local(t_tree *tree); void MCMC_Jumps_Pre(t_node *a, t_node *d, int local, t_tree *tree); void MCMC_Randomize_Clock_Rate(t_tree *tree); void MCMC_Clock_Rate(t_tree *tree); void MCMC_Time_Root(t_tree *tree); void MCMC_Randomize_Node_Times_Bottom_Up(t_node *a, t_node *d, t_tree *tree); void MCMC_Randomize_Node_Times_Top_Down(t_node *a, t_node *d, t_tree *tree); void MCMC_Randomize_Rates_Pre(t_node *a, t_node *d, t_tree *tree); void MCMC_Print_Means(t_mcmc *mcmc, t_tree *tree); void MCMC_Print_Last(t_mcmc *mcmc, t_tree *tree); void MCMC_Close_MCMC(t_mcmc *mcmc); void MCMC_Rates_Global(t_tree *tree); void MCMC_Omega(t_tree *tree); void MCMC_Adjust_Tuning_Parameter(int move, t_mcmc *mcmc); void MCMC_Copy_MCMC_Struct(t_mcmc *ori, t_mcmc *cpy, char *filename); void MCMC_Randomize_Node_Times_Bottom_Up(t_node *a, t_node *d, t_tree *tree); void MCMC_One_Length(t_edge *b, t_tree *tree); void MCMC_Br_Lens(t_tree *tree); void MCMC_Br_Lens_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void MCMC_Tree_Height(t_tree *tree); void MCMC_Subtree_Height(t_tree *tree); void MCMC_Swing(t_tree *tree); void MCMC_Single_Param_Generic(phydbl *val, phydbl lim_inf, phydbl lim_sup, int move_num, phydbl *lnPrior, phydbl *lnLike, phydbl (*prior_func)(t_edge *,t_tree *,supert_tree *), phydbl (*like_func)(t_edge *,t_tree *,supert_tree *), int move_type, int _log, short int print, t_edge *branch, t_tree *tree, supert_tree *stree); void MCMC_Scale_Br_Lens(t_tree *tree); void MCMC_Update_Mean_Br_Len(t_tree *tree); void MCMC_Update_Cov_Br_Len(t_tree *tree); void MCMC_Sim_Rate(t_node *a, t_node *d, t_tree *tree); void Fill_All_Param(t_mcmc *mcmc, t_rate *rate, t_tree *tree); int Get_Param_Num(t_mcmc *mcmc, phydbl *param); void MCMC_Complete_MCMC(t_mcmc *mcmc, t_tree *tree); void MCMC_Sample_Joint_Rates_Prior(t_tree *tree); void MCMC_Sample_Joint_Rates_Posterior(t_tree *tree); void MCMC_Pair_Rates_Constraint(t_node *a, t_node *d, int random, int traversal, t_tree *tree); void MCMC_Times_And_Rates(t_node *a, t_node *d, int random, int traversal, t_tree *tree); void MCMC_Tree_Rates(t_tree *tree); void MCMC_Pause(t_mcmc *mcmc); void MCMC_Print_Param_Stdin(t_mcmc *mcmc, t_tree *tree); void MCMC_Subtree_Rates(t_tree *tree); void MCMC_Get_Acc_Rates(t_mcmc *mcmc); void MCMC_Update_Effective_Sample_Size(int move_num, t_mcmc *mcmc, t_tree *tree); void MCMC_Terminate(int signum); void MCMC_Copy_To_New_Param_Val(t_mcmc *mcmc, t_tree *tree); void MCMC_Randomize_Node_Rates(t_tree *tree); void MCMC_One_Node_Rate(t_node *a, t_node *d, int traversal, t_tree *tree); void MCMC_Tree_Rates_Bis(t_tree *tree); void MCMC_Slice_One_Rate(t_node *a, t_node *d, int traversal, t_tree *tree); void MCMC_Alpha(t_tree *tree); void MCMC_Kappa(t_tree *tree); void MCMC_Rate_Across_Sites(t_tree *tree); void MCMC_Free_Mixt_Rate(t_tree *tree); void MCMC_Make_Move(phydbl *cur, phydbl *new, phydbl inf, phydbl sup, phydbl *loghr, phydbl tune, int move_type); void MCMC_Randomize_Rate_Across_Sites(t_tree *tree); void MCMC_Randomize_Kappa(t_tree *tree); void MCMC_Updown_T_Cr(t_tree *tree); void MCMC_Linreg_Par(t_tree *tree); void MCMC_Covarion_Rates(t_tree *tree); void MCMC_Covarion_Switch(t_tree *tree); void MCMC_Randomize_Covarion_Rates(t_tree *tree); void MCMC_Randomize_Covarion_Switch(t_tree *tree); void MCMC_Read_Param_Vals(t_tree *tree); void MCMC_Birth_Rate(t_tree *tree); void MCMC_Randomize_Birth(t_tree *tree); void MCMC_Clock_R(t_tree *mixt_tree); void MCMC_Free_MCMC(t_mcmc *mcmc); void MCMC_Updown_T_Br(t_tree *tree); void MCMC_Root_Time(t_tree *tree, int print); void MCMC_Jump_Calibration(t_tree *tree); void MCMC_GEO_Lbda(t_tree *mixt_tree); void MCMC_GEO_Sigma(t_tree *mixt_tree); void MCMC_GEO_Tau(t_tree *mixt_tree); void MCMC_GEO_Loc(t_tree *tree); void MCMC_GEO_Dum(t_tree *mixt_tree); void MCMC_PHYREX_Lbda(t_tree *mixt_tree); void MCMC_PHYREX_Mu(t_tree *mixt_tree); void MCMC_PHYREX_Radius(t_tree *mixt_tree); void MCMC_PHYREX_Triplet(t_tree *tree); void MCMC_PHYREX_Move_Disk_Updown(t_tree *tree, int print); void MCMC_PHYREX_Swap_Disk(t_tree *tree, int print); void MCMC_PHYREX_Prune_Regraft(t_tree *tree, int print); void MCMC_PHYREX_Prune_Regraft_Slide(t_tree *tree, int print); void MCMC_PHYREX_Scale_Times(t_tree *tree, int print); void MCMC_PHYREX_Ldscape_Limits(t_tree *tree); void MCMC_PHYREX_Indel_Disk(t_tree *tree); void MCMC_PHYREX_Delete_Disk(phydbl hr, int n_delete_disks, phydbl cur_lbda, phydbl cur_mu, phydbl cur_rad, t_tree *tree); void MCMC_PHYREX_Insert_Disk(phydbl hr, int n_insert_disks, phydbl cur_lbda, phydbl cur_mu, phydbl cur_rad, t_tree *tree); void MCMC_PHYREX_Indel_Hit(t_tree *tree); void MCMC_PHYREX_Insert_Hit(phydbl hr, int n_delete_disks, phydbl cur_lbda, phydbl cur_rad, phydbl cur_mu, t_tree *tree); void MCMC_PHYREX_Delete_Hit(phydbl hr, int n_delete_disks, phydbl cur_lbda, phydbl cur_rad, phydbl cur_mu, t_tree *tree); void MCMC_PHYREX_Simulate_Backward(t_tree *tree); void MCMC_Update_Mode(int move_num, t_mcmc *mcmc, t_tree *tree); void MCMC_PHYREX_Lineage_Traj(t_tree *tree); void MCMC_PHYREX_Delete_Disk_Serial(t_tree *tree); void MCMC_PHYREX_Insert_Disk_Serial(t_tree *tree); void MCMC_PHYREX_Indel_Disk_Serial(t_tree *tree); void MCMC_PHYREX_Simulate_Backward_Plus(t_tree *tree); void MCMC_PHYREX_Indel_Hit_Serial(t_tree *tree); void MCMC_PHYREX_Disk_Multi(t_tree *tree); void MCMC_PHYREX_Ldsk_Multi(t_tree *tree); void MCMC_PHYREX_Ldsk_Given_Disk(t_tree *tree, int print); void MCMC_PHYREX_Disk_Given_Ldsk(t_tree *tree); void MCMC_PHYREX_Ldsk_And_Disk(t_tree *tree); void MCMC_PHYREX_Add_Remove_Jump(t_tree *tree); void MCMC_Death_Rate(t_tree *tree); void MCMC_Times_All(t_tree *tree); void MCMC_Prune_Regraft(t_tree *tree); void MCMC_Randomize_Death(t_tree *tree); void MCMC_Time_Slice(t_tree *tree); void MCMC_Prune_Regraft_Local(t_tree *tree); void MCMC_Prune_Regraft_Weighted(t_tree *tree); void MCMC_Prune_Regraft_Root(t_tree *tree); void MCMC_Birth_Death_Updown(t_tree *tree); void MCMC_Rates_All(t_tree *tree); void MCMC_Times_And_Rates_Recur(t_node *a, t_node *d, int traversal, t_tree *tree); void MCMC_Times_And_Rates_All(t_tree *tree); void MCMC_Times_And_Rates_Root(t_tree *tree); void MCMC_Clade_Change(t_tree *tree); void MCMC_PHYREX_Simulate_Backward(t_tree *tree); void MCMC_RR(t_tree *mixt_tree); void MCMC_PHYREX_Ldsk_Tip_To_Root(t_tree *tree, int print); void MCMC_PHYREX_Neff(t_tree *tree, int print); void MCMC_PHYREX_Sigsq_Scale(t_tree *tree, int print); void MCMC_PHYREX_Ldsk_Tips(t_tree *tree); void MCMC_PHYREX_Exchange_Core(t_tree *aux_tree, t_tree *tree, int print); void MCMC_Randomize_Sigsq_Scale(t_tree *tree); void MCMC_PHYREX_Neff_Growth(t_tree *tree, int print); void MCMC_PHYREX_Narrow_Exchange(t_tree *tree, int print); void MCMC_PHYREX_Narrow_Exchange(t_tree *tree, int print); void MCMC_PHYREX_Wide_Exchange(t_tree *tree, int print); void MCMC_PHYREX_Node_Times_Pre(t_ldsk *a_ldsk, t_ldsk *d_ldsk, t_tree *tree, int print); void MCMC_PHYREX_Node_Times(t_tree *tree, int print); void MCMC_PHYREX_Sigsq(t_tree *tree, int print); void MCMC_PHYREX_Node_Velocity(t_tree *tree); void MCMC_PHYREX_Node_Velocity_Pre(t_node *a, t_node *d, t_tree *tree); void MCMC_PHYREX_All_Velocities(t_tree *tree); void MCMC_PHYREX_Shuffle_Node_Times(t_tree *tree, int print); void MCMC_Randomize_Veloc(t_tree *tree); void MCMC_Randomize_Veloc_Pre(t_node *a, t_node *d, t_tree *tree); void MCMC_Randomize_Locations(t_tree *tree); void MCMC_Randomize_Locations_Pre(t_node *a, t_node *d, t_tree *tree); void MCMC_PHYREX_IWN_Update_Omega(t_tree *tree); void MCMC_PHYREX_IOU_Update_Theta(t_tree *tree); void MCMC_PHYREX_IOU_Update_Mu(t_tree *tree); void MCMC_Rates_Shrink(t_tree *tree); void MCMC_Obs_Var(t_tree *tree); void MCMC_Randomize_Contmod(t_tree *tree); int MCMC_Run(t_tree *tree); void MCMC_Run_Core(t_tree *tree); t_mcmc *MCMC_Preprocess(t_tree *tree); void MCMC_PHYREX_Tip_Location(int tip_num, t_tree *tree); void MCMC_Crossvalidate_Locations(t_tree *tree); void MCMC_Randomize_Sigsq(t_tree *tree); void MCMC_PHYREX_Correlated_Node_Velocity(t_tree *tree); void MCMC_PHYREX_Correlated_Node_Velocity_Pre(t_node *a, t_node *d, t_tree *tree); void MCMC_PHYREX_IOU_Update_Theta_Sigsq(t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/mg.c000066400000000000000000000012021501136442400177330ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #include "mg.h" #include "free.h" #include "help.h" #include "utilities.h" #include "optimiz.h" #include "models.h" #include "simu.h" #include "lk.h" #include "pars.h" #include "interface.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/mg.h000066400000000000000000000001241501136442400177420ustar00rootroot00000000000000#include #ifndef PART_H #define PART_H #include "utilities.h" #endif stephaneguindon-phyml-76a39c8/src/mixt.c000066400000000000000000003517401501136442400203300ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "mixt.h" int n_sec1 = 0; ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_All(t_tree *mixt_tree) { t_tree *curr, *next; int i; curr = mixt_tree; next = mixt_tree->next; do { MIXT_Chain_String(curr->mod->aa_rate_mat_file, next->mod->aa_rate_mat_file); MIXT_Chain_String(curr->mod->modelname, next->mod->modelname); MIXT_Chain_String(curr->mod->custom_mod_string, next->mod->custom_mod_string); MIXT_Chain_Scalar_Dbl(curr->mod->kappa, next->mod->kappa); MIXT_Chain_Scalar_Dbl(curr->mod->lambda, next->mod->lambda); MIXT_Chain_Scalar_Dbl(curr->mod->br_len_mult, next->mod->br_len_mult); MIXT_Chain_Scalar_Dbl(curr->mod->br_len_mult_unscaled, next->mod->br_len_mult_unscaled); MIXT_Chain_Scalar_Dbl(curr->mod->mr, next->mod->mr); MIXT_Chain_Vector_Dbl(curr->mod->Pij_rr, next->mod->Pij_rr); MIXT_Chain_Vector_Dbl(curr->mod->e_frq->user_b_freq, next->mod->e_frq->user_b_freq); MIXT_Chain_Vector_Dbl(curr->mod->e_frq->pi, next->mod->e_frq->pi); MIXT_Chain_Vector_Dbl(curr->mod->e_frq->pi_unscaled, next->mod->e_frq->pi_unscaled); for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) MIXT_Chain_Scalar_Dbl(curr->a_edges[i]->l, next->a_edges[i]->l); for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) MIXT_Chain_Scalar_Dbl(curr->a_edges[i]->l_old, next->a_edges[i]->l_old); for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) MIXT_Chain_Scalar_Dbl(curr->a_edges[i]->l_var, next->a_edges[i]->l_var); for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) MIXT_Chain_Scalar_Dbl(curr->a_edges[i]->l_var_old, next->a_edges[i]->l_var_old); MIXT_Chain_Rmat(curr->mod->r_mat, next->mod->r_mat); MIXT_Chain_RAS(curr->mod->ras, next->mod->ras); MIXT_Chain_Efrq(curr->mod->e_frq, next->mod->e_frq); MIXT_Chain_Eigen(curr->mod->eigen, next->mod->eigen); curr = next; next = next->next; } while (next); MIXT_Chain_Models(mixt_tree); MIXT_Chain_Edges(mixt_tree); MIXT_Chain_Nodes(mixt_tree); MIXT_Chain_Sprs(mixt_tree); Make_Rmat_Weight(mixt_tree); Make_Efrq_Weight(mixt_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Edges(t_tree *mixt_tree) { int i; t_edge *b; t_tree *tree; tree = mixt_tree; do { for (i = 0; i < 2 * tree->n_otu - 1; ++i) { b = tree->a_edges[i]; if (tree->next) b->next = tree->next->a_edges[i]; if (tree->prev) b->prev = tree->prev->a_edges[i]; if (tree->next_mixt) b->next_mixt = tree->next_mixt->a_edges[i]; if (tree->prev_mixt) b->prev_mixt = tree->prev_mixt->a_edges[i]; } if (tree->e_root != NULL) { b = tree->e_root; if (tree->next) b->next = tree->next->e_root; if (tree->prev) b->prev = tree->prev->e_root; if (tree->next_mixt) b->next_mixt = tree->next_mixt->e_root; if (tree->prev_mixt) b->prev_mixt = tree->prev_mixt->e_root; } tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Models(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree; do { if (tree->next != NULL) { tree->mod->next = tree->next->mod; tree->next->mod->prev = tree->mod; } else { tree->mod->next = NULL; } tree = tree->next; } while (tree); tree = mixt_tree; do { if (tree->next_mixt != NULL) { tree->mod->next_mixt = tree->next_mixt->mod; tree->next_mixt->mod->prev_mixt = tree->mod; } else { tree->mod->next_mixt = NULL; } tree = tree->next_mixt; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Nodes(t_tree *mixt_tree) { int i; t_node *n; t_tree *tree; tree = mixt_tree; do { for (i = 0; i < 2 * tree->n_otu - 2; ++i) { n = tree->a_nodes[i]; if (tree->next) n->next = tree->next->a_nodes[i]; if (tree->prev) n->prev = tree->prev->a_nodes[i]; if (tree->next_mixt) n->next_mixt = tree->next_mixt->a_nodes[i]; if (tree->prev_mixt) n->prev_mixt = tree->prev_mixt->a_nodes[i]; } if (tree->n_root != NULL) { n = tree->n_root; if (tree->next) n->next = tree->next->n_root; if (tree->prev) n->prev = tree->prev->n_root; if (tree->next_mixt) n->next_mixt = tree->next_mixt->n_root; if (tree->prev_mixt) n->prev_mixt = tree->prev_mixt->n_root; } tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Sprs(t_tree *mixt_tree) { int i; t_tree *tree; tree = mixt_tree; do { if (tree->next) tree->best_spr->next = tree->next->best_spr; if (tree->prev) tree->best_spr->prev = tree->prev->best_spr; if (tree->next_mixt) tree->best_spr->next_mixt = tree->next_mixt->best_spr; if (tree->prev_mixt) tree->best_spr->prev_mixt = tree->prev_mixt->best_spr; for (i = 0; i < 2 * tree->n_otu - 2; ++i) { if (tree->next) tree->spr_list_one_edge[i]->next = tree->next->spr_list_one_edge[i]; if (tree->prev) tree->spr_list_one_edge[i]->prev = tree->prev->spr_list_one_edge[i]; if (tree->next_mixt) tree->spr_list_one_edge[i]->next_mixt = tree->next_mixt->spr_list_one_edge[i]; if (tree->prev_mixt) tree->spr_list_one_edge[i]->prev_mixt = tree->prev_mixt->spr_list_one_edge[i]; if (tree->next) tree->spr_list_all_edge[i]->next = tree->next->spr_list_all_edge[i]; if (tree->prev) tree->spr_list_all_edge[i]->prev = tree->prev->spr_list_all_edge[i]; if (tree->next_mixt) tree->spr_list_all_edge[i]->next_mixt = tree->next_mixt->spr_list_all_edge[i]; if (tree->prev_mixt) tree->spr_list_all_edge[i]->prev_mixt = tree->prev_mixt->spr_list_all_edge[i]; } tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_String(t_string *curr, t_string *next) { if (!next) { return; } else { t_string *buff, *last; last = NULL; /*! Search backward */ buff = curr; while (buff) { if (buff == next) break; buff = buff->prev; } /*! Search forward */ if (!buff) { buff = curr; while (buff) { if (buff == next) break; buff = buff->next; } } if (!buff) { last = curr; while (last->next) { last = last->next; } last->next = next; next->prev = last; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Vector_Dbl(vect_dbl *curr, vect_dbl *next) { if (!next) { return; } else { vect_dbl *buff, *last; last = NULL; buff = curr; while (buff) { if (buff == next) break; buff = buff->prev; } /*! Search forward */ if (!buff) { buff = curr; while (buff) { if (buff == next) break; buff = buff->next; } } if (!buff) { last = curr; while (last->next) { last = last->next; } last->next = next; next->prev = last; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Scalar_Dbl(scalar_dbl *curr, scalar_dbl *next) { if (!next) { return; } else { scalar_dbl *buff, *last; last = NULL; /*! Search backward */ buff = curr; while (buff) { if (buff == next) break; buff = buff->prev; } /*! Search forward */ if (!buff) { buff = curr; while (buff) { if (buff == next) break; buff = buff->next; } } /*! Not chained yet. Add next at the end of chained list */ if (!buff) { last = curr; while (last->next) { last = last->next; } last->next = next; next->prev = last; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Rmat(t_rmat *curr, t_rmat *next) { if (!next) { return; } else { t_rmat *buff, *last; last = NULL; buff = curr; while (buff) { if (buff == next) break; buff = buff->prev; } /*! Search forward */ if (!buff) { buff = curr; while (buff) { if (buff == next) break; buff = buff->next; } } if (!buff) { last = curr; while (last->next) { last = last->next; } last->next = next; next->prev = last; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Efrq(t_efrq *curr, t_efrq *next) { if (!next) { return; } else { t_efrq *buff, *last; last = NULL; buff = curr; while (buff) { if (buff == next) break; buff = buff->prev; } /*! Search forward */ if (!buff) { buff = curr; while (buff) { if (buff == next) break; buff = buff->next; } } if (!buff) { last = curr; while (last->next) { last = last->next; } last->next = next; next->prev = last; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Eigen(eigen *curr, eigen *next) { if (!next) { return; } else { eigen *buff, *last; last = NULL; buff = curr; while (buff) { if (buff == next) break; buff = buff->prev; } /*! Search forward */ if (!buff) { buff = curr; while (buff) { if (buff == next) break; buff = buff->next; } } if (!buff) { last = curr; while (last->next) { last = last->next; } last->next = next; next->prev = last; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_RAS(t_ras *curr, t_ras *next) { if (!next) return; else { t_ras *buff, *last; last = NULL; buff = curr; while (buff) { if (buff == next) break; buff = buff->prev; } /*! Search forward */ if (!buff) { buff = curr; while (buff) { if (buff == next) break; buff = buff->next; } } if (!buff) { last = curr; while (last->next) { last = last->next; } last->next = next; next->prev = last; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Rates(t_rate *curr, t_rate *next) { if (!next) return; else { t_rate *buff, *last; last = NULL; buff = curr; while (buff) { if (buff == next) break; buff = buff->prev; } /*! Search forward */ if (!buff) { buff = curr; while (buff) { if (buff == next) break; buff = buff->next; } } if (!buff) { last = curr; while (last->next) { last = last->next; } last->next = next; next->prev = last; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Chain_Cal(t_tree *mixt_tree) { int i; for (i = 0; i < mixt_tree->times->n_cal - 1; i++) { mixt_tree->times->a_cal[i]->next = mixt_tree->times->a_cal[i + 1]; mixt_tree->times->a_cal[i + 1]->prev = mixt_tree->times->a_cal[i]; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Turn_Branches_OnOff_In_All_Elem(int onoff, t_tree *mixt_tree) { t_tree *tree; /*! Turn all branches to ON state */ tree = mixt_tree; do { MIXT_Turn_Branches_OnOff_In_One_Elem(ON, tree); tree = tree->next_mixt; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Turn_Branches_OnOff_In_One_Elem(int onoff, t_tree *mixt_tree) { int i; t_tree *tree; if (mixt_tree->is_mixt_tree == NO) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s') \n", __FILE__, __LINE__, __FUNCTION__); Exit("\n"); } tree = mixt_tree; do { for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l->onoff = onoff; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Post_Order_Lk(t_node *mixt_a, t_node *mixt_d, t_tree *mixt_tree) { t_tree *tree; t_node *a, *d; tree = mixt_tree; a = mixt_a; d = mixt_d; assert(a); assert(d); assert(tree); do { if (tree->is_mixt_tree) { tree = tree->next; a = a->next; d = d->next; } assert(a); assert(d); assert(tree); if (tree->mod->ras->invar == NO) Post_Order_Lk(a, d, tree); tree = tree->next; a = a->next; d = d->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Pre_Order_Lk(t_node *mixt_a, t_node *mixt_d, t_tree *mixt_tree) { t_tree *tree; t_node *a, *d; tree = mixt_tree; a = mixt_a; d = mixt_d; assert(a); assert(d); assert(tree); do { if (tree->is_mixt_tree) { tree = tree->next; a = a->next; d = d->next; } assert(a); assert(d); assert(tree); if (tree->mod->ras->invar == NO) Pre_Order_Lk(a, d, tree); tree = tree->next; a = a->next; d = d->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl MIXT_Lk(t_edge *mixt_b, t_tree *mixt_tree) { t_tree *tree, *cpy_mixt_tree; t_edge *b, *cpy_mixt_b; phydbl sum_lnL; unsigned int site, br, ns; phydbl *sum_scale_left_cat, *sum_scale_rght_cat; phydbl sum; phydbl site_lk_cat, site_lk, log_site_lk, inv_site_lk; int num_prec_issue; int ambiguity_check, state; int l; phydbl r_mat_weight_sum, e_frq_weight_sum, sum_probas; phydbl len; phydbl *expl, *dot_prod; tree = NULL; b = NULL; expl = NULL; cpy_mixt_tree = mixt_tree; cpy_mixt_b = mixt_b; len = -1.; ns = 0; if (mixt_b == NULL) { /* Update RAS structure (mixt_tree level) */ tree = mixt_tree; do { Update_RAS(tree->mod); tree = tree->next_mixt; } while (tree); /* Update other model structure (tree level) */ tree = mixt_tree->next; do { if (tree->is_mixt_tree == YES) tree = tree->next; if (!cpy_mixt_b) { if (!Update_Boundaries(tree->mod) || !Update_Efrq(tree->mod) || !Update_Eigen(tree->mod)) { PhyML_Fprintf(stderr, "\n. move: %s", mixt_tree->mcmc->move_name[mixt_tree->mcmc->move_idx]); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } tree = tree->next; } while (tree); } if (!cpy_mixt_b) { for (br = 0; br < 2 * mixt_tree->n_otu - 3; ++br) MIXT_Update_PMat_At_Given_Edge(mixt_tree->a_edges[br], mixt_tree); if (mixt_tree->n_root && mixt_tree->ignore_root == NO) { MIXT_Update_PMat_At_Given_Edge(mixt_tree->n_root->b[1], mixt_tree); MIXT_Update_PMat_At_Given_Edge(mixt_tree->n_root->b[2], mixt_tree); } } else { if (mixt_tree->n_root != NULL && (mixt_b == mixt_tree->n_root->b[1] || mixt_b == mixt_tree->n_root->b[2]) && mixt_tree->ignore_root == YES) { MIXT_Update_PMat_At_Given_Edge(mixt_tree->e_root, mixt_tree); } else { MIXT_Update_PMat_At_Given_Edge(mixt_b, mixt_tree); } } if (!cpy_mixt_b) { if (mixt_tree->n_root != NULL) { if (mixt_tree->ignore_root == NO) { MIXT_Post_Order_Lk(mixt_tree->n_root, mixt_tree->n_root->v[1], mixt_tree); MIXT_Post_Order_Lk(mixt_tree->n_root, mixt_tree->n_root->v[2], mixt_tree); MIXT_Update_Partial_Lk(mixt_tree, mixt_tree->n_root->b[1], mixt_tree->n_root); MIXT_Update_Partial_Lk(mixt_tree, mixt_tree->n_root->b[2], mixt_tree->n_root); if (mixt_tree->both_sides == YES) { MIXT_Pre_Order_Lk(mixt_tree->n_root, mixt_tree->n_root->v[1], mixt_tree); MIXT_Pre_Order_Lk(mixt_tree->n_root, mixt_tree->n_root->v[2], mixt_tree); } } else { MIXT_Post_Order_Lk(mixt_tree->e_root->rght, mixt_tree->e_root->left, mixt_tree); MIXT_Post_Order_Lk(mixt_tree->e_root->left, mixt_tree->e_root->rght, mixt_tree); if (mixt_tree->both_sides == YES) { MIXT_Pre_Order_Lk(mixt_tree->e_root->rght, mixt_tree->e_root->left, mixt_tree); MIXT_Pre_Order_Lk(mixt_tree->e_root->left, mixt_tree->e_root->rght, mixt_tree); } } } else { MIXT_Post_Order_Lk(mixt_tree->a_nodes[0], mixt_tree->a_nodes[0]->v[0], mixt_tree); if (mixt_tree->both_sides == YES) { MIXT_Pre_Order_Lk(mixt_tree->a_nodes[0], mixt_tree->a_nodes[0]->v[0], mixt_tree); } } } do /*! Consider each element of the data partition */ { mixt_tree->c_lnL = 0.0; tree = mixt_tree->next; do { tree->c_lnL = 0.0; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); Set_Br_Len_Var(mixt_b, mixt_tree); if (!cpy_mixt_b) { if (mixt_tree->n_root) { if (mixt_tree->ignore_root == NO) mixt_b = (mixt_tree->n_root->v[1]->tax == NO) ? (mixt_tree->n_root->b[2]) : (mixt_tree->n_root->b[1]); else mixt_b = mixt_tree->e_root; } else { mixt_b = mixt_tree->a_nodes[0]->b[0]; } } sum_scale_left_cat = (phydbl *)mCalloc( MAX(mixt_tree->mod->ras->n_catg, mixt_tree->mod->n_mixt_classes), sizeof(phydbl)); sum_scale_rght_cat = (phydbl *)mCalloc( MAX(mixt_tree->mod->ras->n_catg, mixt_tree->mod->n_mixt_classes), sizeof(phydbl)); r_mat_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->r_mat_weight); e_frq_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->e_frq_weight); sum_probas = MIXT_Get_Sum_Of_Probas_Across_Mixtures( r_mat_weight_sum, e_frq_weight_sum, mixt_tree); b = mixt_b->next; tree = mixt_tree->next; do { while (tree->mod->ras->invar == YES) { tree = tree->next; b = b->next; if (tree == NULL || tree->is_mixt_tree == YES) { PhyML_Fprintf(stderr, "\n. %p", (void *)tree); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s') \n", __FILE__, __LINE__, __FUNCTION__); Exit("\n"); } } if (tree->update_eigen_lr == YES) Update_Eigen_Lr(b, tree); if (tree->use_eigen_lr == YES) { len = b->l->v; len *= tree->mod->br_len_mult->v; len *= tree->mixt_tree->mod->ras->gamma_rr ->v[tree->mod->ras->parent_class_number]; if (len < tree->mod->l_min) len = tree->mod->l_min; else if (len > tree->mod->l_max) len = tree->mod->l_max; expl = tree->expl; for (l = 0; l < tree->mod->ns; l++) expl[l] = (phydbl)POW(tree->mod->eigen->e_val[l], len); } tree = tree->next; b = b->next; } while (tree && tree->is_mixt_tree == NO); tree = mixt_tree; do { tree->numerical_warning = NO; tree = tree->next; } while (tree); mixt_tree->c_lnL = .0; for (site = 0; site < mixt_tree->data->n_pattern; ++site) { b = mixt_b->next; tree = mixt_tree->next; /*! Skip calculations if model has zero rate */ while (tree->mod->ras->invar == YES) { tree = tree->next; b = b->next; if (tree == NULL || tree->is_mixt_tree == YES) { PhyML_Fprintf(stderr, "\n. %p", (void *)tree); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s') \n", __FILE__, __LINE__, __FUNCTION__); Exit("\n"); } } ambiguity_check = -1; state = -1; if ((b->rght->tax) && (!mixt_tree->mod->s_opt->greedy) && (mixt_tree->data->wght[site] > SMALL)) { ambiguity_check = b->rght->c_seq->is_ambigu[site]; if (!ambiguity_check) state = b->rght->c_seq->d_state[site]; } /*! For all classes in the mixture */ do { if (tree->is_mixt_tree == YES) { tree = tree->next; b = b->next; } ns = tree->mod->ns; tree->curr_site = site; tree->apply_lk_scaling = NO; site_lk_cat = 0.0; expl = tree->expl; dot_prod = tree->dot_prod; if (!(tree->mod->ras->invar == YES && mixt_tree->is_mixt_tree == YES) && (tree->data->wght[tree->curr_site] > SMALL)) { if ((b->rght->tax) && (tree->mod->s_opt->greedy == NO)) { ambiguity_check = b->rght->c_seq->is_ambigu[tree->curr_site]; if (ambiguity_check == NO) state = b->rght->c_seq->d_state[tree->curr_site]; } if (tree->use_eigen_lr == YES) { site_lk_cat = Lk_Core_Eigen_Lr(expl, dot_prod + site * ns, b, tree); } else { if (b->rght->tax == YES) site_lk_cat = Lk_Core( state, ambiguity_check, b->p_lk_left + site * ns, b->p_lk_tip_r + site * ns, b->Pij_rr, b->tPij_rr, b, tree); else site_lk_cat = Lk_Core( state, ambiguity_check, b->p_lk_left + site * ns, b->p_lk_rght + site * ns, b->Pij_rr, b->tPij_rr, b, tree); } } tree->apply_lk_scaling = YES; sum_scale_left_cat[tree->mod->ras->parent_class_number] = (b->sum_scale_left) ? (b->sum_scale_left[site]) : (0.0); sum_scale_rght_cat[tree->mod->ras->parent_class_number] = (b->sum_scale_rght) ? (b->sum_scale_rght[site]) : (0.0); sum = sum_scale_left_cat[tree->mod->ras->parent_class_number] + sum_scale_rght_cat[tree->mod->ras->parent_class_number]; if (sum > 1024.) { /* PhyML_Fprintf(stderr,"\n. Numerical precision issue detected (sum = * %g)!!!",sum); */ sum = 1023.; tree->mixt_tree->numerical_warning = YES; tree->numerical_warning = YES; } tree->unscaled_site_lk_cat[site] = site_lk_cat; site_lk_cat /= pow(2, sum); tree->site_lk_cat[0] = site_lk_cat; tree = tree->next; b = b->next; } while (tree && tree->is_mixt_tree == NO); // done with all trees in the mixture for this partition element. // All likelihood values are in site_lk_cat[0] tree = mixt_tree->next; b = mixt_b->next; site_lk = .0; do { if (tree->mod->ras->invar == YES) { tree = tree->next; b = b->next; if (!(tree && tree->is_mixt_tree == NO)) break; } site_lk += tree->site_lk_cat[0] * mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number] * tree->mod->r_mat_weight->v / r_mat_weight_sum * tree->mod->e_frq_weight->v / e_frq_weight_sum / sum_probas; tree = tree->next; b = b->next; } while (tree && tree->is_mixt_tree == NO); /* Scaling for invariants */ if (mixt_tree->mod->ras->invar == YES) { num_prec_issue = NO; tree = mixt_tree->next; while (tree->mod->ras->invar == NO) { tree = tree->next; if (tree == NULL || tree->is_mixt_tree == YES) { PhyML_Fprintf(stderr, "\n. tree: %p", tree); PhyML_Fprintf(stderr, "\n. Err in file %s at line %d", __FILE__, __LINE__); Exit("\n"); } } /*! 'tree' will give the correct state frequencies (as opposed to * mixt_tree) */ inv_site_lk = Invariant_Lk(0, site, &num_prec_issue, tree); if (num_prec_issue == YES) // inv_site_lk >> site_lk { site_lk = inv_site_lk * mixt_tree->mod->ras->pinvar->v; } else { site_lk = site_lk * (1. - mixt_tree->mod->ras->pinvar->v) + inv_site_lk * mixt_tree->mod->ras->pinvar->v; } } if (site_lk < SMALL) { /* PhyML_Fprintf(stderr,"\n. site = %d",site); */ /* PhyML_Fprintf(stderr,"\n. invar = %d",mixt_tree->data->invar[site]); */ /* PhyML_Fprintf(stderr,"\n. mixt = %d",mixt_tree->is_mixt_tree); */ /* PhyML_Fprintf(stderr,"\n. lk = %G log(lk) = %f < * %G",site_lk,log_site_lk,-BIG); */ /* for(class=0;classmod->ras->n_catg;class++) * PhyML_Fprintf(stderr,"\n. rr=%f * p=%f",mixt_tree->mod->ras->gamma_rr->v[class],mixt_tree->mod->ras->gamma_r_proba->v[class]); */ /* PhyML_Fprintf(stderr,"\n. pinv = %G",mixt_tree->mod->ras->pinvar->v); */ /* PhyML_Fprintf(stderr,"\n. bl mult = * %G",mixt_tree->mod->br_len_mult->v); */ /* PhyML_Fprintf(stderr,"\n. Err. in file %s at line * %d.\n",__FILE__,__LINE__); */ /* Exit("\n"); */ site_lk = SMALL; mixt_tree->numerical_warning = YES; } log_site_lk = log(site_lk); // ... or using the log-likelihood if (isinf(site_lk) || isnan(site_lk)) { mixt_tree->cur_site_lk[site] = exp(log_site_lk); } else { mixt_tree->cur_site_lk[site] = site_lk; } mixt_tree->c_lnL_sorted[site] = log_site_lk; mixt_tree->c_lnL += mixt_tree->data->wght[site] * log_site_lk; } Free(sum_scale_left_cat); Free(sum_scale_rght_cat); mixt_tree = mixt_tree->next_mixt; mixt_b = mixt_b->next_mixt; } while (mixt_tree); mixt_tree = cpy_mixt_tree; mixt_b = cpy_mixt_b; sum_lnL = .0; do { sum_lnL += mixt_tree->c_lnL; mixt_tree = mixt_tree->next_mixt; } while (mixt_tree); mixt_tree = cpy_mixt_tree; do { mixt_tree->c_lnL = sum_lnL; mixt_tree = mixt_tree->next_mixt; } while (mixt_tree); mixt_tree = cpy_mixt_tree; return mixt_tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Update_Partial_Lk(t_tree *mixt_tree, t_edge *mixt_b, t_node *mixt_d) { t_tree *tree; t_edge *b; t_node *d; tree = mixt_tree; b = mixt_b; d = mixt_d; do { if (tree->is_mixt_tree) { tree = tree->next; b = b->next; d = d->next; } if (tree->mod->ras->invar == NO) Update_Partial_Lk(tree, b, d); tree = tree->next; b = b->next; d = d->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Update_Partial_Pars(t_tree *mixt_tree, t_edge *mixt_b, t_node *mixt_d) { t_tree *tree; t_edge *b; t_node *d; tree = mixt_tree; b = mixt_b; d = mixt_d; do { if (tree->is_mixt_tree) { tree = tree->next; b = b->next; d = d->next; } Update_Partial_Pars(tree, b, d); tree = tree->next; b = b->next; d = d->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Update_PMat_At_Given_Edge(t_edge *mixt_b, t_tree *mixt_tree) { t_tree *tree; t_edge *b; tree = mixt_tree; b = mixt_b; do { if (tree->is_mixt_tree) { tree = tree->next; b = b->next; } if (tree->mod->ras->invar == NO) Update_PMat_At_Given_Edge(b, tree); tree = tree->next; b = b->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int *MIXT_Get_Number_Of_Classes_In_All_Mixtures(t_tree *mixt_tree) { int *n_catg; t_tree *tree; int class; if (mixt_tree->is_mixt_tree == YES) { n_catg = NULL; tree = mixt_tree; class = 0; do { if (!class) n_catg = (int *)mCalloc(1, sizeof(int)); else n_catg = (int *)realloc(n_catg, (class + 1) * sizeof(int)); tree = tree->next; n_catg[class] = 0; do { n_catg[class]++; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); class ++; } while (tree); } else { n_catg = (int *)mCalloc(1, sizeof(int)); n_catg[0] = mixt_tree->mod->ras->n_catg; if (mixt_tree->mod->ras->invar == YES) n_catg[0]++; } return (n_catg); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree **MIXT_Record_All_Mixtures(t_tree *mixt_tree) { t_tree **tree_list; int n_trees; t_tree *tree; tree_list = NULL; n_trees = 0; tree = mixt_tree; do { if (!tree_list) tree_list = (t_tree **)mCalloc(1, sizeof(t_tree *)); else tree_list = (t_tree **)realloc(tree_list, (n_trees + 1) * sizeof(t_tree *)); tree_list[n_trees] = tree; n_trees++; tree = tree->next; } while (tree); tree_list = (t_tree **)realloc(tree_list, (n_trees + 1) * sizeof(t_tree *)); tree_list[n_trees] = NULL; return (tree_list); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Break_All_Mixtures(int *c_max, t_tree *mixt_tree) { t_tree *tree; int c, i, n; if (mixt_tree->is_mixt_tree == NO) return; c = 0; n = -1; tree = mixt_tree; do { if (tree->is_mixt_tree == YES) { c = 0; n++; tree = tree->next; } if (c == (c_max[n] - 1) && tree->next != NULL && tree->next->is_mixt_tree == NO) { if (tree->mixt_tree->next_mixt == NULL) { tree->next = NULL; for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->next = NULL; for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_nodes[i]->next = NULL; for (i = 0; i < 2 * tree->n_otu - 2; ++i) tree->spr_list_one_edge[i]->next = NULL; } else { tree->next = tree->mixt_tree->next_mixt; for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->next = tree->mixt_tree->next_mixt->a_edges[i]; for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_nodes[i]->next = tree->mixt_tree->next_mixt->a_nodes[i]; for (i = 0; i < 2 * tree->n_otu - 2; ++i) tree->spr_list_one_edge[i]->next = tree->mixt_tree->next_mixt->spr_list_one_edge[i]; } } tree = tree->next; c++; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Reconnect_All_Mixtures(t_tree **tree_list, t_tree *mixt_tree) { t_tree *tree; int n_trees; if (mixt_tree->is_mixt_tree == NO) return; tree = mixt_tree; n_trees = 0; do { tree = tree_list[n_trees]; if (tree->is_mixt_tree == NO) tree->next = tree_list[n_trees + 1]; n_trees++; tree = tree->next; } while (tree); MIXT_Chain_All(mixt_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int *MIXT_Record_Has_Invariants(t_tree *mixt_tree) { int *has_invariants; t_tree *tree; int n_trees; has_invariants = NULL; tree = mixt_tree; n_trees = 0; do { if (!n_trees) has_invariants = (int *)mCalloc(1, sizeof(int)); else has_invariants = (int *)realloc(has_invariants, (n_trees + 1) * sizeof(int)); has_invariants[n_trees] = (tree->mod->ras->invar == YES) ? 1 : 0; n_trees++; tree = tree->next; } while (tree); return (has_invariants); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Reset_Has_Invariants(int *has_invariants, t_tree *mixt_tree) { t_tree *tree; int n_trees; tree = mixt_tree; n_trees = 0; do { tree->mod->ras->invar = has_invariants[n_trees]; n_trees++; tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Check_Invar_Struct_In_Each_Partition_Elem(t_tree *mixt_tree) { if (mixt_tree->is_mixt_tree == NO) return; else { t_tree *tree; int n_inv; n_inv = 0; tree = mixt_tree; do { if (tree->is_mixt_tree) { tree = tree->next; n_inv = 0; } if (tree->mod->ras->invar == YES) n_inv++; if (n_inv > 1) { PhyML_Fprintf( stderr, "\n. Found %d classes of the mixture for file '%s' set to", n_inv, tree->mixt_tree->io->in_align_file); PhyML_Fprintf( stderr, "\n. invariable. Only one such class per mixture is allowed."); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit("\n"); } if (tree->mixt_tree->mod->ras->invar == NO && tree->mod->ras->invar == YES) { PhyML_Fprintf(stderr, "\n. Unexpected settings for 'siterates' in a partition " "element (file '%s')", tree->mixt_tree->io->in_align_file); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit("\n"); } tree = tree->next; } while (tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Check_RAS_Struct_In_Each_Partition_Elem(t_tree *mixt_tree) { if (mixt_tree->is_mixt_tree == NO) return; else { t_tree *tree; int n_classes; n_classes = 0; tree = mixt_tree; do { if (tree->is_mixt_tree) { if (tree->mod->ras->invar == YES) { if (tree->next->mod->ras->invar == NO) { PhyML_Fprintf( stderr, "\n. The invariant site class has to be the first element in"); PhyML_Fprintf( stderr, "\n. each component. Please amend you XML"); PhyML_Fprintf(stderr, "\n. file accordingly.\n"); Exit("\n."); } } tree = tree->next; n_classes = 0; } if (tree && tree->mod->ras->invar == NO) n_classes++; if ((tree->next && tree->next->is_mixt_tree == YES) || (!tree->next)) /*! current tree is the last element of this mixture */ { if (n_classes < tree->mixt_tree->mod->ras->n_catg) { PhyML_Fprintf( stderr, "\n. %d class%s found in 'partitionelem' for file '%s' while", n_classes, (n_classes > 1) ? "es\0" : "\0", tree->mixt_tree->io->in_align_file); PhyML_Fprintf( stderr, "\n. the corresponding 'siterates' element defined %d class%s.", tree->mixt_tree->mod->ras->n_catg, (tree->mixt_tree->mod->ras->n_catg > 1) ? "es\0" : "\0"); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit("\n"); } } tree = tree->next; } while (tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Prune_Subtree(t_node *mixt_a, t_node *mixt_d, t_edge **mixt_target, t_edge **mixt_residual, t_tree *mixt_tree) { t_node *a, *d; t_edge *target, *residual; t_tree *tree; MIXT_Turn_Branches_OnOff_In_One_Elem(OFF, mixt_tree); tree = mixt_tree; a = mixt_a; d = mixt_d; target = (mixt_target) ? (*mixt_target) : NULL; residual = (mixt_residual) ? (*mixt_residual) : NULL; do { if (tree->is_mixt_tree == YES) { tree = tree->next; a = a->next; d = d->next; target = target ? target->next : NULL; residual = residual ? residual->next : NULL; } Prune_Subtree(a, d, &target, &residual, tree); tree = tree->next; a = a->next; d = d->next; target = target ? target->next : NULL; residual = residual ? residual->next : NULL; } while (tree && tree->is_mixt_tree == NO); if (tree) Prune_Subtree(a, d, &target, &residual, tree); /*! Turn branches of this mixt_tree to ON after recursive call to Prune_Subtree such that, if branches of mixt_tree->next point to those of mixt_tree, they are set to OFF when calling Prune */ MIXT_Turn_Branches_OnOff_In_One_Elem(ON, mixt_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Graft_Subtree(t_edge *mixt_target, t_node *mixt_link, t_node *mixt_link_daughter, t_edge *mixt_residual, t_node *mixt_target_nd, t_tree *mixt_tree) { t_edge *target, *residual; t_node *link, *link_daughter, *target_nd; t_tree *tree; MIXT_Turn_Branches_OnOff_In_One_Elem(OFF, mixt_tree); tree = mixt_tree; target = mixt_target; residual = mixt_residual; link = mixt_link; link_daughter = mixt_link_daughter; target_nd = mixt_target_nd; do { if (tree->is_mixt_tree == YES) { tree = tree->next; target = target->next; residual = residual->next; link = link->next; link_daughter = link_daughter ? link_daughter->next : NULL; target_nd = target_nd ? target_nd->next : NULL; } Graft_Subtree(target, link, link_daughter, residual, target_nd, tree); tree = tree->next; target = target->next; residual = residual->next; link = link->next; link_daughter = link_daughter ? link_daughter->next : NULL; target_nd = target_nd ? target_nd->next : NULL; } while (tree && tree->is_mixt_tree == NO); if (tree) Graft_Subtree(target, link, link_daughter, residual, target_nd, tree); /*! Turn branches of this mixt_tree to ON after recursive call to Graft_Subtree such that, if branches of mixt_tree->next point to those of mixt_tree, they are set to OFF when calling Graft */ MIXT_Turn_Branches_OnOff_In_One_Elem(ON, mixt_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Multiply_Scalar_Dbl(scalar_dbl *this, phydbl scalar) { if (this == NULL) return; else { scalar_dbl *buff; buff = this; do { buff->v *= scalar; buff = buff->next; } while (buff); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Scalar_Dbl(scalar_dbl *this, phydbl value) { if (this == NULL) return; else { scalar_dbl *buff; buff = this; do { buff->v = value; buff = buff->next; } while (buff); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Br_Len_Opt(t_edge *mixt_b, t_tree *mixt_tree) { t_edge *b; scalar_dbl *l; MIXT_Turn_Branches_OnOff_In_All_Elem(ON, mixt_tree); mixt_tree->ignore_mixt_info = YES; b = mixt_b; l = b->l; do { if (l->onoff == ON) Br_Len_Opt(&(l->v), mixt_b, mixt_tree); l = l->next; } while (l); mixt_tree->ignore_mixt_info = NO; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void MIXT_Br_Len_Involving_Invar(t_tree *mixt_tree) { int i; scalar_dbl *l; for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) { l = mixt_tree->a_edges[i]->l; do { l->v *= (1. - mixt_tree->mod->ras->pinvar->v); l = l->next; } while (l); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Br_Len_Not_Involving_Invar(t_tree *mixt_tree) { int i; scalar_dbl *l; for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) { l = mixt_tree->a_edges[i]->l; do { l->v /= (1. - mixt_tree->mod->ras->pinvar->v); l = l->next; } while (l); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl MIXT_Unscale_Br_Len_Multiplier_Tree(t_tree *mixt_tree) { int i; scalar_dbl *l; for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) { l = mixt_tree->a_edges[i]->l; do { l->v /= mixt_tree->mod->br_len_mult->v; l = l->next; } while (l); } return (-1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl MIXT_Rescale_Br_Len_Multiplier_Tree(t_tree *mixt_tree) { int i; scalar_dbl *l; for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) { l = mixt_tree->a_edges[i]->l; do { l->v *= mixt_tree->mod->br_len_mult->v; l = l->next; } while (l); } return (-1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl MIXT_Rescale_Free_Rate_Tree(t_tree *mixt_tree) { int i, side_effect, at_boundary; t_edge *b; side_effect = NO; for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) { b = mixt_tree->a_edges[i]->next; at_boundary = NO; if (b->l->v > mixt_tree->mod->l_max - 1.E-100 && b->l->v < mixt_tree->mod->l_max + 1.E-100) at_boundary = YES; if (b->l->v > mixt_tree->mod->l_min - 1.E-100 && b->l->v < mixt_tree->mod->l_min + 1.E-100) at_boundary = YES; b->l->v *= mixt_tree->mod->ras->free_rate_mr->v; if (b->l->v > mixt_tree->mod->l_max && at_boundary == NO) side_effect = YES; if (b->l->v < mixt_tree->mod->l_min && at_boundary == NO) side_effect = YES; } return side_effect; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Ignore_Root(int yesno, t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree->next; if (tree != NULL) { do { Set_Ignore_Root(yesno, tree); tree = tree->next; } while (tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Alias_Subpatt(int onoff, t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree; do { tree->update_alias_subpatt = onoff; tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Check_Edge_Lens_In_All_Elem(t_tree *mixt_tree) { t_tree *tree; /*! Check that all the edges in a mixt_tree at pointing to a single set of lengths */ tree = mixt_tree; do { MIXT_Check_Edge_Lens_In_One_Elem(tree); tree = tree->next_mixt; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Check_Edge_Lens_In_One_Elem(t_tree *mixt_tree) { t_tree *tree; int i; tree = mixt_tree->next; do { if (tree->next && tree->next->is_mixt_tree == NO) { for (i = 0; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_edges[i]->l != tree->next->a_edges[i]->l) { PhyML_Fprintf(stderr, "\n. %p %p", tree->a_edges[i]->l, tree->next->a_edges[i]->l); PhyML_Fprintf(stderr, "\n. Only one set of edge lengths is allowed "); PhyML_Fprintf(stderr, "\n. in a 'partitionelem'. Please fix your XML file."); Exit("\n"); } } } tree = tree->next; } while (tree && tree->next && tree->next->is_mixt_tree == NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int MIXT_Pars(t_edge *mixt_b, t_tree *mixt_tree) { t_edge *b; t_tree *tree; b = mixt_b; tree = mixt_tree; mixt_tree->c_pars = 0; do { if (tree->next) { Pars(b ? b->next : NULL, tree->next); mixt_tree->c_pars += tree->next->c_pars; } if (mixt_b != NULL) b = b->next_mixt; tree = tree->next_mixt; } while (tree); tree = mixt_tree; do { tree->c_pars = mixt_tree->c_pars; tree = tree->next_mixt; } while (tree); return (mixt_tree->c_pars); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Bootstrap(char *best_tree, xml_node *root) { xml_node *n, *p_elem; char *bootstrap; assert(root); n = XML_Search_Node_Name("phyml", NO, root); bootstrap = XML_Get_Attribute_Value(n, "bootstrap"); if (!bootstrap) return; else { int n_boot, i, j, k; xml_attr *boot_attr, *seqfile_attr, *out_attr, *boot_out_attr; char *orig_align, *boot_out_file_name, *xml_boot_file_name, *buff; FILE *boot_fp_in_align, *xml_boot_file_fp; option *io, *dum; align **boot_data, **orig_data; int position, elem; xml_node *boot_root; int pid; char *s; orig_align = (char *)mCalloc(T_MAX_NAME, sizeof(char)); xml_boot_file_name = (char *)mCalloc(T_MAX_NAME, sizeof(char)); strcpy(xml_boot_file_name, "phyml_boot_config."); pid = (int)getpid(); sprintf(xml_boot_file_name + strlen(xml_boot_file_name), "%d", pid); strcat(xml_boot_file_name, ".xml"); out_attr = XML_Search_Attribute(root, "output.file"); assert(out_attr); boot_out_file_name = (char *)mCalloc(T_MAX_NAME, sizeof(char)); strcpy(boot_out_file_name, out_attr->value); s = XML_Get_Attribute_Value(root, "run.id"); if (s) { strcat(boot_out_file_name, "_"); strcat(boot_out_file_name, s); } n_boot = atoi(bootstrap); io = NULL; for (i = 0; i < n_boot; ++i) { boot_root = XML_Copy_XML_Graph(root); /*! Set the number of bootstrap repeats to 0 in each generated XML file */ boot_attr = XML_Search_Attribute(boot_root, "bootstrap"); assert(boot_attr); strcpy(boot_attr->value, "0"); /*! Set the output file name for each bootstrap analysis */ boot_out_attr = XML_Search_Attribute(boot_root, "output.file"); assert(boot_out_attr); buff = (char *)mCalloc(T_MAX_NAME, sizeof(char)); strcpy(buff, boot_out_attr->value); Free(boot_out_attr->value); boot_out_attr->value = buff; sprintf(boot_out_attr->value + strlen(boot_out_attr->value), "_boot.%d", pid); XML_Add_Attribute(boot_root, "add", "true"); // Add all trees in bootstrap outut tree file p_elem = boot_root; elem = 0; do { p_elem = XML_Search_Node_Name("partitionelem", YES, p_elem); if (!p_elem) break; io = (option *)Make_Input(); Set_Defaults_Input(io); /*! Get the original sequence file name and the corresponding attribute in the XML graph */ seqfile_attr = NULL; seqfile_attr = XML_Search_Attribute(p_elem, "file.name"); assert(seqfile_attr); strcpy(orig_align, seqfile_attr->value); /*! Open the original sequence file */ io->fp_in_align = Openfile(orig_align, 0); /*! Read in the original sequence file */ orig_data = Get_Seq(io); rewind(io->fp_in_align); /*! Read in the original sequence file and put it in 'boot_data' structure */ boot_data = Get_Seq(io); fclose(io->fp_in_align); /*! Bootstrap resampling: sample from original and put in boot */ for (j = 0; j < boot_data[0]->len; ++j) { position = Rand_Int(0, (int)(boot_data[0]->len - 1.0)); for (k = 0; k < io->n_otu; ++k) boot_data[k]->state[j] = orig_data[k]->state[position]; } /*! Modify the sequence file attribute in the original XML graph */ buff = (char *)mCalloc(T_MAX_NAME, sizeof(char)); Free(seqfile_attr->value); seqfile_attr->value = buff; sprintf(seqfile_attr->value, "%s_%d_%d", orig_align, elem, i); /*! Open a new sequence file with the modified attribute name */ boot_fp_in_align = Openfile(seqfile_attr->value, 1); /*! Print the bootstrap data set in it */ Print_Seq(boot_fp_in_align, boot_data, io->n_otu); fclose(boot_fp_in_align); Free_Seq(orig_data, io->n_otu); Free_Seq(boot_data, io->n_otu); Free_Input(io); elem++; } while (p_elem); /*! Open bootstrap XML file in writing mode */ xml_boot_file_fp = Openfile(xml_boot_file_name, 1); /*! Write the bootstrap XML graph */ XML_Write_XML_Graph(xml_boot_file_fp, boot_root); fclose(xml_boot_file_fp); /*! Reconstruct the tree */ dum = PhyML_XML(xml_boot_file_name); Free(dum); /*! Remove the bootstrap alignment files */ p_elem = boot_root; do { p_elem = XML_Search_Node_Name("partitionelem", YES, p_elem); if (!p_elem) break; seqfile_attr = XML_Search_Attribute(p_elem, "file.name"); unlink(seqfile_attr->value); } while (p_elem); XML_Free_XML_Tree(boot_root); } Free(xml_boot_file_name); Free(orig_align); Free(boot_out_file_name); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Pars_Thresh(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree; do { tree->mod->s_opt->pars_thresh = (tree->io->datatype == AA) ? (15) : (5); tree = tree->next_mixt; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl MIXT_Get_Mean_Edge_Len(t_edge *mixt_b, t_tree *mixt_tree) { phydbl sum; int n; t_tree *tree; t_edge *b; if (mixt_tree->is_mixt_tree == NO) return mixt_b->l->v; b = mixt_b; tree = mixt_tree; sum = .0; n = 0; do { if (tree->is_mixt_tree == YES) { tree = tree->next; b = b->next; } sum += b->l->v * (tree->mixt_tree ? tree->mixt_tree->mod->br_len_mult->v : 1.0); n++; b = b->next; tree = tree->next; } while (b); return (sum / (phydbl)n); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl MIXT_Get_Sum_Chained_Scalar_Dbl(scalar_dbl *s) { scalar_dbl *s_buff; phydbl sum; s_buff = s; sum = .0; do { sum += s_buff->v; s_buff = s_buff->next; } while (s_buff); return sum; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl MIXT_Get_Sum_Of_Probas_Across_Mixtures(phydbl r_mat_weight_sum, phydbl e_frq_weight_sum, t_tree *mixt_tree) { t_tree *tree; phydbl sum; sum = .0; tree = mixt_tree->next; do { // e.g., if mixture has two classes, one of these // corresponding to invariable sites. We need to skip it. if (tree->mod->ras->invar == YES) tree = tree->next; sum += mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number] * tree->mod->r_mat_weight->v / r_mat_weight_sum * tree->mod->e_frq_weight->v / e_frq_weight_sum; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); return (sum); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Br_Len_Var(t_edge *mixt_b, t_tree *mixt_tree) { t_tree *tree; if (mixt_b != NULL) { t_edge *b; tree = mixt_tree->next; b = mixt_b->next; do { Set_Br_Len_Var(b, tree); tree = tree->next; b = b->next; } while (tree); } else { tree = mixt_tree->next; do { Set_Br_Len_Var(NULL, tree); tree = tree->next; } while (tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Br_Len(phydbl val, t_edge *mixt_b, t_tree *mixt_tree) { scalar_dbl *l; l = mixt_b->l; do { l->v = val; l = l->next; } while (l); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Add_Root(t_edge *mixt_b, t_tree *mixt_tree) { t_tree *tree; t_edge *b; tree = mixt_tree; b = mixt_b; do { if (tree->is_mixt_tree) { tree = tree->next; b = b->next; } // Condition is true when tree is not chained if (b == NULL) break; Add_Root(b, tree); tree = tree->next; b = b->next; } while (tree); tree = mixt_tree; do { assert(tree->n_root != NULL); if (tree->next) tree->n_root->next = tree->next->n_root; if (tree->prev) tree->n_root->prev = tree->prev->n_root; if (tree->next_mixt) tree->n_root->next_mixt = tree->next_mixt->n_root; if (tree->prev_mixt) tree->n_root->prev_mixt = tree->prev_mixt->n_root; tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_RATES_Update_Edge_Lengths(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree->next; do { RATES_Update_Edge_Lengths(tree); tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_RATES_Update_One_Edge_Length(t_edge *mixt_b, t_tree *mixt_tree) { t_tree *tree; t_edge *b; b = mixt_tree->next->a_edges[mixt_b->num]; tree = mixt_tree->next; do { RATES_Update_One_Edge_Length(b, tree); tree = tree->next; if (tree != NULL) b = tree->a_edges[mixt_b->num]; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Update_Br_Len_Multipliers(t_mod *mod) { phydbl sum; t_mod *loc; int n_mixt; loc = mod; sum = 0.0; n_mixt = 0; do { /* if(loc->s_opt->opt_br_len_mult == YES) */ /* { */ sum += loc->br_len_mult_unscaled->v; n_mixt++; /* } */ loc = loc->next_mixt; } while (loc); loc = mod; do { if (loc->s_opt->opt_br_len_mult == YES) { loc->br_len_mult->v = loc->br_len_mult_unscaled->v / sum; loc->br_len_mult->v *= (phydbl)(n_mixt); /* printf("\n. HERE %f * %f\n",loc->br_len_mult_unscaled->v,loc->br_len_mult->v); */ } loc = loc->next_mixt; } while (loc); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Init_Model(t_mod *mod) { mod = mod->next; if (mod != NULL) { do { Init_Model(mod->io->cdata, mod, mod->io); if (mod->is_mixt_mod == YES) return; mod = mod->next; } while (mod); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Check_Model_Validity(t_tree *mixt_tree) { // Verify that models associated to distinct data partition elements do not // share the same empirical character frequencies. t_mod *mod_in, *mod_out; mod_out = mixt_tree->mod; do { mod_in = mod_out; do { if (mod_in->io->cdata != mod_out->io->cdata) { if (mod_in->e_frq == mod_out->e_frq) { if (mod_in->io->datatype == NT && mod_in->e_frq->type != USER && mod_in->whichmodel != JC69 && mod_in->whichmodel != K80) { PhyML_Fprintf(stderr, "\n. A vector of observed nucleotide " "frequencies should correspond "); PhyML_Fprintf(stderr, "\n. to one data set only. If you are using " "the XML interface, "); PhyML_Fprintf(stderr, "\n. please amend your file accordingly."); Exit("\n"); } else if (mod_in->io->datatype == AA && mod_in->e_frq->type == EMPIRICAL) { PhyML_Fprintf(stderr, "\n. A vector of observed amino-acid " "frequencies should correspond "); PhyML_Fprintf(stderr, "\n. to one data set only. If you are using " "the XML interface, "); PhyML_Fprintf(stderr, "\n. please amend your file accordingly."); Exit("\n"); } } } mod_in = mod_in->next; } while (mod_in); mod_out = mod_out->next; } while (mod_out); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *MIXT_Starting_Tree(t_tree *mixt_tree) { t_tree *tree; tree = NULL; if (mixt_tree->io->mod->s_opt->random_input_tree == NO) { switch (mixt_tree->io->in_tree) { case 2: // user-defined input tree { assert(mixt_tree->io->fp_in_tree); tree = Read_User_Tree(mixt_tree->io->cdata, mixt_tree->mod, mixt_tree->io); break; } case 1: case 0: { // Build a BioNJ tree from the analysis of // the first partition element tree = Dist_And_BioNJ(mixt_tree->data, mixt_tree->mod, mixt_tree->io); break; } default: assert(FALSE); } } else { tree = Make_Tree_From_Scratch(mixt_tree->n_otu, mixt_tree->data); Random_Tree(tree); } return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Connect_Cseqs_To_Nodes(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree->next; if (tree != NULL) { do { Connect_CSeqs_To_Nodes(tree->data, mixt_tree->io, tree); tree = tree->next; } while (tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Init_T_Beg(t_tree *mixt_tree) { t_tree *tree; /*! Initialize t_beg in each mixture tree */ tree = mixt_tree->next_mixt; if (tree != NULL) Init_T_Beg(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Init_T_End(t_tree *mixt_tree) { t_tree *tree; /*! Initialize t_beg in each mixture tree */ tree = mixt_tree; do { time(&(tree->t_current)); tree = tree->next_mixt; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Prepare_All(int num_rand_tree, t_tree *mixt_tree) { t_tree *tree; MIXT_Check_Model_Validity(mixt_tree); Init_Model(mixt_tree->mod->io->cdata, mixt_tree->mod, mixt_tree->mod->io); Set_Model_Parameters(mixt_tree->mod); Print_Data_Structure(NO, stdout, mixt_tree); tree = MIXT_Starting_Tree(mixt_tree); Copy_Tree(tree, mixt_tree); Free_Tree(tree); if (mixt_tree->io->mod->s_opt->random_input_tree) { PhyML_Printf("\n\n. [%3d/%3d]", num_rand_tree + 1, mixt_tree->io->mod->s_opt->n_rand_starts); Random_Tree(mixt_tree); } MIXT_Connect_Cseqs_To_Nodes(mixt_tree); MIXT_Init_T_Beg(mixt_tree); MIXT_Make_Tree_For_Pars(mixt_tree); Make_Tree_For_Lk(mixt_tree); Make_Spr(mixt_tree); MIXT_Chain_All(mixt_tree); MIXT_Check_Edge_Lens_In_All_Elem(mixt_tree); MIXT_Turn_Branches_OnOff_In_All_Elem(ON, mixt_tree); MIXT_Check_Invar_Struct_In_Each_Partition_Elem(mixt_tree); MIXT_Check_RAS_Struct_In_Each_Partition_Elem(mixt_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Make_Tree_For_Pars(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree; do { if (tree->is_mixt_tree == NO) Make_Tree_For_Pars(tree); tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Make_Tree_For_Lk(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree; do { if (tree->is_mixt_tree == NO) Make_Tree_For_Lk(tree); else { tree->c_lnL_sorted = (phydbl *)mCalloc(tree->data->n_pattern, sizeof(phydbl)); tree->cur_site_lk = (phydbl *)mCalloc(tree->data->n_pattern, sizeof(phydbl)); tree->old_site_lk = (phydbl *)mCalloc(tree->data->n_pattern, sizeof(phydbl)); tree->site_lk_cat = (phydbl *)mCalloc( MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes), sizeof(phydbl)); tree->unscaled_site_lk_cat = (phydbl *)mCalloc( MAX(tree->mod->ras->n_catg, tree->mod->n_mixt_classes) * tree->data->n_pattern, sizeof(phydbl)); tree->fact_sum_scale = (int *)mCalloc(tree->data->n_pattern, sizeof(int)); #if (defined(__AVX__) || defined(__SSE3__)) #ifndef WIN32 if (posix_memalign((void **)&tree->expl, BYTE_ALIGN, (size_t)2 * tree->mod->n_mixt_classes * tree->mod->ns * sizeof(phydbl))) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); #else tree->expl = _aligned_malloc(2 * tree->mod->n_mixt_classes * tree->mod->ns * sizeof(phydbl), BYTE_ALIGN); #endif #else tree->expl = (phydbl *)mCalloc( 2 * tree->mod->n_mixt_classes * tree->mod->ns, sizeof(phydbl)); #endif for (int i = 0; i < 2 * tree->n_otu - 1; ++i) Make_Edge_NNI(tree->a_edges[i]); tree->log_lks_aLRT = (phydbl **)mCalloc(3, sizeof(phydbl *)); for (int i = 0; i < 3; i++) tree->log_lks_aLRT[i] = (phydbl *)mCalloc(tree->data->init_len, sizeof(phydbl)); } tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Init_Partial_Lk_Tips_Double(t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree->next; do { Init_Partial_Lk_Tips_Double(tree); tree = tree->next; if (tree != NULL && tree->is_mixt_tree == YES) tree = tree->next; } while (tree != NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Init_Partial_Lk_Tips_Double_One_Character(int node_idx, int curr_site, t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree->next; do { Init_Partial_Lk_Tips_Double_One_Character(node_idx, curr_site,tree); tree = tree->next; if (tree != NULL && tree->is_mixt_tree == YES) tree = tree->next; } while (tree != NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Init_Partial_Lk_Tips_Double_One_Site(int site, t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree->next; do { Init_Partial_Lk_Tips_Double_One_Site(site, tree); tree = tree->next; if (tree != NULL && tree->is_mixt_tree == YES) tree = tree->next; } while (tree != NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Ancestral_Sequences_One_Node(t_node *mixt_d, t_tree *mixt_tree, int print) { if (mixt_d->tax) return; else { t_node *v0, *v1, *v2; // three neighbours of d t_edge *b0, *b1, *b2; int i, j; int catg; phydbl p0, p1, p2; phydbl *p; t_node *d, *curr_mixt_d; t_tree *tree, *curr_mixt_tree; int site, csite; phydbl *p_lk0, *p_lk1, *p_lk2; int *sum_scale0, *sum_scale1, *sum_scale2; phydbl r_mat_weight_sum, e_frq_weight_sum, sum_probas; phydbl *Pij0, *Pij1, *Pij2; int NsNs, Ns, NsNg; FILE *fp; if (!mixt_d) return; curr_mixt_tree = mixt_tree; curr_mixt_d = mixt_d; fp = mixt_tree->io->fp_out_ancestral_seq; do /* For each partition element */ { if (curr_mixt_tree->next) { r_mat_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl( curr_mixt_tree->next->mod->r_mat_weight); e_frq_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl( curr_mixt_tree->next->mod->e_frq_weight); sum_probas = MIXT_Get_Sum_Of_Probas_Across_Mixtures( r_mat_weight_sum, e_frq_weight_sum, curr_mixt_tree); } else { r_mat_weight_sum = 1.; e_frq_weight_sum = 1.; sum_probas = 1.; } Ns = curr_mixt_tree->next ? curr_mixt_tree->next->mod->ns : curr_mixt_tree->mod->ns; NsNs = Ns * Ns; NsNg = Ns * curr_mixt_tree->mod->ras->n_catg; p = (phydbl *)mCalloc(Ns, sizeof(phydbl)); /* for(site=0;siten_pattern;site++) // For each site in * the current partition element */ for (site = 0; site < curr_mixt_tree->data->init_len; site++) // For each site in the current partition element { csite = curr_mixt_tree->data->sitepatt[site]; d = curr_mixt_d->next ? curr_mixt_d->next : curr_mixt_d; tree = curr_mixt_tree->next ? curr_mixt_tree->next : curr_mixt_tree; for (i = 0; i < tree->mod->ns; i++) p[i] = .0; do // For each class of the mixture model that applies to the current // partition element { if (tree->is_mixt_tree == YES) { tree = tree->next; d = d->next; } v0 = d->v[0]; v1 = d->v[1]; v2 = d->v[2]; b0 = d->b[0]; b1 = d->b[1]; b2 = d->b[2]; Pij0 = b0->Pij_rr; Pij1 = b1->Pij_rr; Pij2 = b2->Pij_rr; if (v0 == b0->left) { p_lk0 = b0->p_lk_left; sum_scale0 = b0->sum_scale_left; } else { p_lk0 = b0->p_lk_rght; sum_scale0 = b0->sum_scale_rght; } if (v1 == b1->left) { p_lk1 = b1->p_lk_left; sum_scale1 = b1->sum_scale_left; } else { p_lk1 = b1->p_lk_rght; sum_scale1 = b1->sum_scale_rght; } if (v2 == b2->left) { p_lk2 = b2->p_lk_left; sum_scale2 = b2->sum_scale_left; } else { p_lk2 = b2->p_lk_rght; sum_scale2 = b2->sum_scale_rght; } for (catg = 0; catg < tree->mod->ras->n_catg; catg++) { for (i = 0; i < Ns; i++) { p0 = .0; if (v0->tax) for (j = 0; j < tree->mod->ns; j++) { p0 += v0->b[0]->p_lk_tip_r[csite * Ns + j] * Pij0[catg * NsNs + i * Ns + j]; /* printf("\n. p0 %d %f", */ /* v0->b[0]->p_lk_tip_r[site*Ns+j], */ /* Pij0[catg*NsNs+i*Ns+j]); */ } else for (j = 0; j < tree->mod->ns; j++) { p0 += p_lk0[csite * NsNg + catg * Ns + j] * Pij0[catg * NsNs + i * Ns + j] / (phydbl)POW( 2, sum_scale0[catg * curr_mixt_tree->data->n_pattern + csite]); /* p0 += p_lk0[site*NsNg+catg*Ns+j] * Pij0[catg*NsNs+i*Ns+j]; */ /* printf("\n. p0 %f %f", */ /* p_lk0[site*NsNg+catg*Ns+j], */ /* Pij0[catg*NsNs+i*Ns+j]); */ } p1 = .0; if (v1->tax) for (j = 0; j < tree->mod->ns; j++) { p1 += v1->b[0]->p_lk_tip_r[csite * Ns + j] * Pij1[catg * NsNs + i * Ns + j]; /* printf("\n. p1 %d %f", */ /* v1->b[0]->p_lk_tip_r[site*Ns+j], */ /* Pij1[catg*NsNs+i*Ns+j]); */ } else for (j = 0; j < tree->mod->ns; j++) { p1 += p_lk1[csite * NsNg + catg * Ns + j] * Pij1[catg * NsNs + i * Ns + j] / (phydbl)POW( 2, sum_scale1[catg * curr_mixt_tree->data->n_pattern + csite]); /* p1 += p_lk1[site*NsNg+catg*Ns+j] * Pij1[catg*NsNs+i*Ns+j]; */ /* printf("\n. p1 %f %f", */ /* p_lk1[site*NsNg+catg*Ns+j], */ /* Pij1[catg*NsNs+i*Ns+j]); */ } p2 = .0; if (v2->tax) for (j = 0; j < tree->mod->ns; j++) { p2 += v2->b[0]->p_lk_tip_r[csite * Ns + j] * Pij2[catg * NsNs + i * Ns + j]; /* printf("\n. p2 %d %f", */ /* v2->b[0]->p_lk_tip_r[site*Ns+j], */ /* Pij2[catg*NsNs+i*Ns+j]); */ } else for (j = 0; j < tree->mod->ns; j++) { p2 += p_lk2[csite * NsNg + catg * Ns + j] * Pij2[catg * NsNs + i * Ns + j] / (phydbl)POW( 2, sum_scale2[catg * curr_mixt_tree->data->n_pattern + csite]); /* p2 += p_lk2[site*NsNg+catg*Ns+j] * Pij2[catg*NsNs+i*Ns+j]; */ /* printf("\n. p2 %f %f", */ /* p_lk2[site*NsNg+catg*Ns+j], */ /* Pij2[catg*NsNs+i*Ns+j]); */ } p[i] += p0 * p1 * p2 * tree->mod->e_frq->pi->v[i] / tree->cur_site_lk[csite] * curr_mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number] * tree->mod->r_mat_weight->v / r_mat_weight_sum * tree->mod->e_frq_weight->v / e_frq_weight_sum / sum_probas; if (print == YES) printf("\n class: %d prob: %f", tree->mod->ras->parent_class_number, curr_mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number]); } } if (print == YES) { PhyML_Fprintf(fp, "%4d\t%4d\t", site + 1, d->num); for (i = 0; i < Ns; i++) { PhyML_Fprintf(fp, "%.4f\t", p[i]); } PhyML_Fprintf(fp, "\n"); fflush(NULL); } tree = tree->next; d = d->next; } while (tree && d && tree->is_mixt_tree == NO); } Free(p); curr_mixt_tree = curr_mixt_tree->next_mixt; curr_mixt_d = curr_mixt_d->next_mixt; } while (curr_mixt_tree != NULL); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // First and second derivative of the log-likelihood with respect // to the length of edge b phydbl MIXT_dLk(phydbl *l, t_edge *mixt_b, t_tree *mixt_tree) { t_tree *tree, *cpy_mixt_tree; t_edge *b, *cpy_mixt_b; unsigned int site, class, nclasses, ns, state; phydbl *sum_scale_left_cat, *sum_scale_rght_cat; phydbl sum, mult; phydbl *lk, *dlk; phydbl site_lk, site_dlk; phydbl log_site_lk, inv_site_lk; int num_prec_issue; phydbl r_mat_weight_sum, e_frq_weight_sum, sum_probas; phydbl len, var; phydbl *expl, *dot_prod; phydbl rr; phydbl ev, expevlen; phydbl one_m_pinv; short int length_found; tree = NULL; b = NULL; expl = NULL; lk = NULL; dlk = NULL; cpy_mixt_tree = mixt_tree; cpy_mixt_b = mixt_b; len = -1.; if (mixt_tree->update_eigen_lr == YES) MIXT_Update_Eigen_Lr(mixt_b, mixt_tree); /*! Make sure that l is one of the lengths of mixt_b */ b = mixt_b; while (b) { if (&(b->l->v) == l) break; b = b->next; } assert(b != NULL); do /*! Consider each element of the data partition */ { b = mixt_b; tree = mixt_tree; length_found = NO; do { if (&(b->l->v) == l) { length_found = YES; break; } b = b->next; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); /*! For computational efficiency, the dlk and lk computation for data partition elements corresponding to trees in which l is not found could be skipped. We compute dlk and lk nonetheless so that these two values are the derivative and lielihood computed for the whole data set, not juste the data partitions that "contain" l */ tree = mixt_tree; do { tree->c_lnL = .0; tree->c_dlnL = .0; tree = tree->next; } while (tree); ns = mixt_tree->mod->ns; nclasses = MIXT_Mixt_Size(mixt_tree); lk = (phydbl *)mCalloc(nclasses, sizeof(phydbl)); dlk = (phydbl *)mCalloc(nclasses, sizeof(phydbl)); sum_scale_left_cat = (phydbl *)mCalloc(nclasses, sizeof(phydbl)); sum_scale_rght_cat = (phydbl *)mCalloc(nclasses, sizeof(phydbl)); r_mat_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->r_mat_weight); e_frq_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->e_frq_weight); sum_probas = MIXT_Get_Sum_Of_Probas_Across_Mixtures( r_mat_weight_sum, e_frq_weight_sum, mixt_tree); // Fill in expl vector for each rate class tree = mixt_tree->next; b = mixt_b->next; class = 0; do { if (tree->mod->ras->invar == YES) rr = 0.0; else { rr = 1.0; rr *= tree->mod->br_len_mult->v; rr *= mixt_tree->mod->ras->gamma_rr ->v[tree->mod->ras->parent_class_number]; } if (length_found == YES) len = (*l) * rr; else len = b->l->v * rr; if (isinf(len) || isnan(len)) { PhyML_Fprintf(stderr, "\n. len=%f rr=%f l=%f", len, rr, *l); assert(FALSE); } if (tree->mod->ras->invar == NO) { if (len < tree->mod->l_min) len = tree->mod->l_min; else if (len > tree->mod->l_max) len = tree->mod->l_max; } else { len = 0.0; } if (length_found == YES) var = (*l) * tree->mod->l_var_sigma->v * rr * rr; else var = b->l->v * tree->mod->l_var_sigma->v * rr * rr; expl = mixt_tree->expl; for (state = 0; state < tree->mod->ns; ++state) { ev = tree->mod->eigen->e_val[state]; expevlen = exp(ev * len); if (tree->mod->gamma_mgf_bl == YES) { expl[class * 2 * ns + 2 * state] = POW(1. - ev * var / len, -len * len / var); expl[class * 2 * ns + 2 * state + 1] = expl[class * 2 * ns + 2 * state]; expl[class * 2 * ns + 2 * state + 1] *= -(ev * rr / (1. - ev * var / len) + 2. * len * rr * LOG(1. - ev * var / len) / var); } else { expl[class * 2 * ns + 2 * state] = expevlen; expl[class * 2 * ns + 2 * state + 1] = expevlen * ev * rr; } } class ++; tree = tree->next; b = b->next; } while (tree && tree->is_mixt_tree == NO); assert(class == nclasses); mixt_tree->c_lnL = .0; mixt_tree->c_dlnL = .0; for (site = 0; site < mixt_tree->data->n_pattern; ++site) { for (class = 0; class < nclasses; ++class) { dlk[class] = 0.0; lk[class] = 0.0; } b = mixt_b->next; tree = mixt_tree->next; class = 0; /*! For all classes in the mixture */ do { if (tree->mod->ras->invar == NO && tree->data->wght[tree->curr_site] > SMALL) { tree->curr_site = site; dot_prod = tree->dot_prod + site * ns; expl = mixt_tree->expl + 2 * ns * class; if (tree->mod->io->datatype == NT || tree->mod->io->datatype == AA) { #if (defined(__AVX__)) AVX_Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns, lk + class, dlk + class); #elif (defined(__SSE3__)) SSE_Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns, lk + class, dlk + class); #else Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns, lk + class, dlk + class); #endif } else { Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns, lk + class, dlk + class); } tree->apply_lk_scaling = YES; sum_scale_left_cat[tree->mod->ras->parent_class_number] = (b->sum_scale_left) ? (b->sum_scale_left[site]) : (0.0); sum_scale_rght_cat[tree->mod->ras->parent_class_number] = (b->sum_scale_rght) ? (b->sum_scale_rght[site]) : (0.0); sum = sum_scale_left_cat[tree->mod->ras->parent_class_number] + sum_scale_rght_cat[tree->mod->ras->parent_class_number]; if (sum > 1024.) { /* PhyML_Fprintf(stderr,"\n. Numerical precision issue detected (sum * = %g)!!!",sum); */ sum = 1023.; tree->mixt_tree->numerical_warning = YES; tree->numerical_warning = YES; } mult = pow(2, sum); /* PhyML_Printf("\n> tree: %p class: %d lk: %f dlk: %g sum: %g site: * %d dot_prod[0]: %g expl[0]: %g expl[1]: %g expl[2]: * %g",tree,class,log(lk[class]),dlk[class],sum,site,dot_prod[0],expl[0],expl[1],expl[2]); */ lk[class] /= mult; dlk[class] /= mult; } tree = tree->next; b = b->next; class ++; } while (tree && tree->is_mixt_tree == NO); // done with all trees in the mixture for this partition element. tree = mixt_tree->next; class = 0; site_lk = .0; site_dlk = .0; if (mixt_tree->mod->ras->invar == YES) one_m_pinv = 1. - mixt_tree->mod->ras->pinvar->v; else one_m_pinv = 1.; do { if (tree->mod->ras->invar == NO && mixt_tree->data->wght[tree->curr_site] > SMALL) { site_lk += lk[class] * mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number] * tree->mod->r_mat_weight->v / r_mat_weight_sum * tree->mod->e_frq_weight->v / e_frq_weight_sum / sum_probas; site_dlk += dlk[class] * one_m_pinv * mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number] * tree->mod->r_mat_weight->v / r_mat_weight_sum * tree->mod->e_frq_weight->v / e_frq_weight_sum / sum_probas; /* PhyML_Printf("\n. MIXT_DLK site: %d mixt_tree: %p tree: %p class: * %d l: %p lk: %g dlk: %g", */ /* site, */ /* mixt_tree, */ /* tree, */ /* class, */ /* l, */ /* lk[class], */ /* dlk[class]); */ } class ++; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); /* Scaling for invariants */ if (mixt_tree->mod->ras->invar == YES) { num_prec_issue = NO; tree = mixt_tree->next; while (tree->mod->ras->invar == NO) { tree = tree->next; if (!tree || tree->is_mixt_tree == YES) { PhyML_Fprintf(stderr, "\n. tree: %p", tree); PhyML_Fprintf(stderr, "\n. Err in file %s at line %d", __FILE__, __LINE__); Exit("\n"); } } tree->apply_lk_scaling = YES; /*! 'tree' will give the correct state frequencies (as opposed to * mixt_tree) */ inv_site_lk = Invariant_Lk(0, site, &num_prec_issue, tree); if (num_prec_issue == YES) // inv_site_lk >> site_lk { site_lk = inv_site_lk * mixt_tree->mod->ras->pinvar->v; } else { site_lk = site_lk * (1. - mixt_tree->mod->ras->pinvar->v) + inv_site_lk * mixt_tree->mod->ras->pinvar->v; } } log_site_lk = log(site_lk); if (isinf(log_site_lk) || isnan(log_site_lk)) { PhyML_Fprintf(stderr, "\n. site = %d", site); PhyML_Fprintf(stderr, "\n. invar = %d", mixt_tree->data->invar[site]); PhyML_Fprintf(stderr, "\n. mixt = %d", mixt_tree->is_mixt_tree); PhyML_Fprintf(stderr, "\n. lk = %G log(lk) = %f < %G", site_lk, log_site_lk, -BIG); for (class = 0; class < mixt_tree->mod->ras->n_catg; ++class) PhyML_Printf("\n. rr=%f p=%f", mixt_tree->mod->ras->gamma_rr->v[class], mixt_tree->mod->ras->gamma_r_proba->v[class]); PhyML_Fprintf(stderr, "\n. pinv = %G", mixt_tree->mod->ras->pinvar->v); PhyML_Fprintf(stderr, "\n. bl mult = %G", mixt_tree->mod->br_len_mult->v); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d.\n", __FILE__, __LINE__); Exit("\n"); } mixt_tree->c_lnL += mixt_tree->data->wght[site] * log_site_lk; mixt_tree->c_dlnL += mixt_tree->data->wght[site] * (site_dlk / site_lk); /* PhyML_Printf("\n. site: %4d lnL: %15f dlnL: * %15f",site,site_lk,site_dlk); */ } Free(sum_scale_left_cat); Free(sum_scale_rght_cat); Free(lk); Free(dlk); mixt_tree = mixt_tree->next_mixt; mixt_b = mixt_b->next_mixt; } while (mixt_tree); // Sum c_dlnL across all partition element and set each c_dlnL equal to // this sum sum = .0; mixt_tree = cpy_mixt_tree; do { sum += mixt_tree->c_dlnL; mixt_tree = mixt_tree->next_mixt; } while (mixt_tree); mixt_tree = cpy_mixt_tree; do { mixt_tree->c_dlnL = sum; mixt_tree = mixt_tree->next_mixt; } while (mixt_tree); // Do the same with likelihood values sum = .0; mixt_tree = cpy_mixt_tree; do { sum += mixt_tree->c_lnL; mixt_tree = mixt_tree->next_mixt; } while (mixt_tree); mixt_tree = cpy_mixt_tree; do { mixt_tree->c_lnL = sum; mixt_tree = mixt_tree->next_mixt; } while (mixt_tree); mixt_tree = cpy_mixt_tree; mixt_b = cpy_mixt_b; return mixt_tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Returns the number of trees (including mixt_trees) in the // whole model. int MIXT_Part_Mixt_Size(t_tree *mixt_tree) { if (mixt_tree->is_mixt_tree == NO) return 1; else { int num; t_tree *tree; num = 0; tree = mixt_tree; do { num++; tree = tree->next; } while (tree); return num; } return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Returns the number of trees in the partition element corresponding to // mixt_tree. int MIXT_Mixt_Size(t_tree *mixt_tree) { if (mixt_tree->is_mixt_tree == NO) return 1; else { int num; t_tree *tree; num = 0; tree = mixt_tree->next; do { num++; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); return num; } return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Both_Sides(int yesno, t_tree *mixt_tree) { t_tree *tree; assert(mixt_tree->is_mixt_tree == YES); tree = mixt_tree->next; if (tree != NULL) { do { Set_Both_Sides(yesno, tree); if (tree->is_mixt_tree == YES) return; tree = tree->next; } while (tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Model_Parameters(t_mod *mixt_mod) { t_mod *mod = mixt_mod->next; if (mod != NULL) { do { Set_Model_Parameters(mod); if (mod->is_mixt_mod == YES) return; mod = mod->next; } while (mod); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Update_Eigen(t_mod *mixt_mod) { t_mod *mod; mod = mixt_mod; do { if (mod->is_mixt_mod) mod = mod->next; if (!Update_Boundaries(mod)) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (!Update_Eigen(mod)) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); mod = mod->next; } while (mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Update_Eigen_Lr(t_edge *mixt_b, t_tree *mixt_tree) { t_edge *b; t_tree *tree; tree = mixt_tree->next; b = mixt_b->next; if (tree != NULL) { do { Update_Eigen_Lr(b, tree); if (tree->is_mixt_tree == YES) return; tree = tree->next; b = b->next; } while (tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Update_Eigen(int yn, t_mod *mixt_mod) { t_mod *mod; mod = mixt_mod; do { mod->update_eigen = yn; mod = mod->next; } while (mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Update_Eigen_Lr(int yn, t_tree *mixt_tree) { t_tree *tree; int dum; tree = mixt_tree->next; do { dum = mixt_tree->is_mixt_tree; mixt_tree->is_mixt_tree = NO; Set_Update_Eigen_Lr(yn, tree); mixt_tree->is_mixt_tree = dum; tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Use_Eigen_Lr(int yn, t_tree *mixt_tree) { t_tree *tree; int dum; tree = mixt_tree->next; do { dum = mixt_tree->is_mixt_tree; mixt_tree->is_mixt_tree = NO; Set_Use_Eigen_Lr(yn, tree); mixt_tree->is_mixt_tree = dum; tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Sample_Ancestral_Seq(int fullmutmap, int fromprior, t_tree *mixt_tree) { t_tree *tree, *loc_mixt_tree; phydbl r_mat_weight_sum, e_frq_weight_sum, sum_probas, *class_proba; int i; r_mat_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->r_mat_weight); e_frq_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->e_frq_weight); sum_probas = MIXT_Get_Sum_Of_Probas_Across_Mixtures( r_mat_weight_sum, e_frq_weight_sum, mixt_tree); tree = mixt_tree; loc_mixt_tree = tree; // For each element in the partition (i.e., each gene), select a // class of the mixture according to its post prob. do { tree = loc_mixt_tree->next; class_proba = NULL; i = 0; do { if (i == 0) class_proba = (phydbl *)mCalloc(1, sizeof(phydbl)); else class_proba = (phydbl *)mRealloc(class_proba, i + 1, sizeof(phydbl)); class_proba[i] = tree->site_lk_cat[0] * loc_mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number] * tree->mod->r_mat_weight->v / r_mat_weight_sum * tree->mod->e_frq_weight->v / e_frq_weight_sum / sum_probas; tree = tree->next; i++; } while (tree && tree->is_mixt_tree == NO); tree = loc_mixt_tree->next; i = Sample_i_With_Proba_pi(class_proba, i); do { i--; if (i < 0) break; tree = tree->next; assert(tree); } while (1); assert(tree->is_mixt_tree == NO); Sample_Ancestral_Seq(fullmutmap, fromprior, tree); Free(class_proba); loc_mixt_tree = loc_mixt_tree->next_mixt; } while (loc_mixt_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Propagate changes in the "master" tree to other trees. Partial // likelihood vectors (and scaling stuff) is not up-to-date here so // requires full tree traversal to be updated properly. void MIXT_Propagate_Tree_Update(t_tree *mixt_tree) { t_tree *tree; int i; assert(!mixt_tree->prev); tree = mixt_tree->next; if (!tree) return; do { for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) { tree->a_nodes[i]->v[0] = mixt_tree->a_nodes[i]->v[0] ? tree->a_nodes[mixt_tree->a_nodes[i]->v[0]->num] : NULL; tree->a_nodes[i]->v[1] = mixt_tree->a_nodes[i]->v[1] ? tree->a_nodes[mixt_tree->a_nodes[i]->v[1]->num] : NULL; tree->a_nodes[i]->v[2] = mixt_tree->a_nodes[i]->v[2] ? tree->a_nodes[mixt_tree->a_nodes[i]->v[2]->num] : NULL; if (tree->times != NULL) tree->times->nd_t[i] = mixt_tree->times->nd_t[i]; } /* Connect_Edges_To_Nodes_Serial(tree); */ for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) { if (mixt_tree->n_root == NULL || (mixt_tree->a_edges[i] != mixt_tree->n_root->b[1] && mixt_tree->a_edges[i] != mixt_tree->n_root->b[2])) Connect_One_Edge_To_Two_Nodes( tree->a_nodes[mixt_tree->a_edges[i]->left->num], tree->a_nodes[mixt_tree->a_edges[i]->rght->num], tree->a_edges[mixt_tree->a_edges[i]->num], tree); tree->a_edges[mixt_tree->a_edges[i]->num]->num = mixt_tree->a_edges[i]->num; } /* Necessary? Increase computation time due to large number of calls from * Ldsk_To_Tree function */ /* Reorganize_Edges_Given_Lk_Struct(tree); */ /* Init_Partial_Lk_Tips_Double(tree); */ if (mixt_tree->n_root != NULL) { assert(mixt_tree->e_root); assert(mixt_tree->n_root->v[1]); assert(mixt_tree->n_root->v[2]); assert(mixt_tree->n_root->b[1]); assert(mixt_tree->n_root->b[2]); tree->n_root = tree->a_nodes[mixt_tree->n_root->num]; tree->e_root = tree->a_edges[mixt_tree->e_root->num]; tree->n_root->v[1] = tree->a_nodes[mixt_tree->n_root->v[1]->num]; tree->n_root->v[2] = tree->a_nodes[mixt_tree->n_root->v[2]->num]; tree->n_root->b[1] = tree->a_edges[mixt_tree->n_root->b[1]->num]; tree->n_root->b[2] = tree->a_edges[mixt_tree->n_root->b[2]->num]; tree->n_root->b[1]->left = tree->n_root; tree->n_root->b[2]->left = tree->n_root; tree->n_root->b[1]->rght = tree->n_root->v[1]; tree->n_root->b[2]->rght = tree->n_root->v[2]; } Update_Ancestors(tree->n_root, tree->n_root->v[2], tree->n_root->b[2], tree); Update_Ancestors(tree->n_root, tree->n_root->v[1], tree->n_root->b[1], tree); tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Set_Bl_From_Rt(int yn, t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree->next; if (tree != NULL) { do { Set_Bl_From_Rt(yn, tree); if (tree->is_mixt_tree == YES) return; tree = tree->next; } while (tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Copy_Tree(t_tree *ori, t_tree *cpy) { assert(!((cpy && !ori) || (!cpy && ori))); if (cpy == NULL || ori == NULL) return; if (ori->is_mixt_tree == YES && cpy->is_mixt_tree == YES) { do { ori->ignore_mixt_info = YES; cpy->ignore_mixt_info = YES; Copy_Tree(ori, cpy); if (ori->is_mixt_tree == YES) ori->ignore_mixt_info = NO; if (cpy->is_mixt_tree == YES) cpy->ignore_mixt_info = NO; ori = ori->next; cpy = cpy->next; } while (cpy); } else if (ori->is_mixt_tree == NO && cpy->is_mixt_tree == YES) { do { cpy->ignore_mixt_info = YES; Copy_Tree(ori, cpy); if(cpy->is_mixt_tree == YES) cpy->ignore_mixt_info = NO; cpy = cpy->next; } while (cpy); } else if (ori->is_mixt_tree == YES && cpy->is_mixt_tree == NO) { ori->ignore_mixt_info = YES; Copy_Tree(ori, cpy); ori->ignore_mixt_info = NO; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// calign *MIXT_Copy_Cseq(calign *ori, option *io, t_tree *mixt_tree) { calign *cpy; t_tree *tree; cpy = Copy_Cseq(ori, io, NULL); // Propagate to trees in the mixture tree = mixt_tree->next; do { tree->data = cpy; tree = tree->next; } while (tree != NULL && tree->is_mixt_tree == NO); return (cpy); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Init_NNI_Score(phydbl val, t_edge *mixt_b, t_tree *mixt_tree) { t_edge *b; t_tree *tree; tree = mixt_tree->next; b = mixt_b->next; do { Init_NNI_Score(val, b, tree); if (tree->is_mixt_tree == YES) return; tree = tree->next; b = b->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *MIXT_Duplicate_Tree(t_tree *ori) { t_tree *tree, *cpy; int i; assert(ori->is_mixt_tree == YES); ori->is_mixt_tree = NO; cpy = Duplicate_Tree(ori); ori->is_mixt_tree = YES; cpy->is_mixt_tree = YES; cpy->prev = NULL; tree = ori; do { if (tree->next != NULL) { i = tree->next->is_mixt_tree; tree->next->is_mixt_tree = NO; cpy->next = Duplicate_Tree(tree->next); tree->next->is_mixt_tree = i; cpy->next->is_mixt_tree = tree->next->is_mixt_tree; cpy->next->prev = cpy; } else break; tree = tree->next; cpy = cpy->next; } while (tree != NULL); do cpy = cpy->prev; while (cpy->prev); do { for (i = 0; i < 2 * tree->n_otu - 1; ++i) { Free_Scalar_Dbl(cpy->a_edges[i]->l); Free_Scalar_Dbl(cpy->a_edges[i]->l_old); Free_Scalar_Dbl(cpy->a_edges[i]->l_var); Free_Scalar_Dbl(cpy->a_edges[i]->l_var_old); } if (cpy->next == NULL) break; cpy = cpy->next; } while (1); do cpy = cpy->prev; while (cpy->prev); for (i = 0; i < 2 * tree->n_otu - 1; ++i) { cpy->a_edges[i]->l = Duplicate_Scalar_Dbl(ori->a_edges[i]->l); cpy->a_edges[i]->l_old = Duplicate_Scalar_Dbl(ori->a_edges[i]->l_old); cpy->a_edges[i]->l_var = Duplicate_Scalar_Dbl(ori->a_edges[i]->l_var); cpy->a_edges[i]->l_var_old = Duplicate_Scalar_Dbl(ori->a_edges[i]->l_var_old); } tree = cpy; do { for (i = 0; i < 2 * tree->n_otu - 1; ++i) { cpy->a_edges[i]->l = tree->a_edges[i]->l; cpy->a_edges[i]->l_old = tree->a_edges[i]->l_old; cpy->a_edges[i]->l_var = tree->a_edges[i]->l_var; cpy->a_edges[i]->l_var_old = tree->a_edges[i]->l_var_old; } if (cpy->next == NULL) break; cpy = cpy->next; } while (1); do cpy = cpy->prev; while (cpy->prev); return (cpy); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Print_Site_Lk(t_tree *mixt_tree, FILE *fp) { t_tree *tree; int site, catg; char *s; phydbl postmean, sum; assert(mixt_tree->is_mixt_tree == YES); assert(mixt_tree->io->print_site_lnl == YES); if (!mixt_tree->io->print_trace) { tree = mixt_tree; do { PhyML_Fprintf(fp, "# Note : P(D|M) is the probability of site D given " "the model M (i.e., the site likelihood)\n"); if (tree->mod->ras->n_catg > 1 || tree->mod->ras->invar) { PhyML_Fprintf(fp, "# P*(D|M,rr[x]) is the scaled probability of site D " "given the model M and the relative rate\n"); PhyML_Fprintf(fp, "# of evolution rr[x], where x is the class of rate " "to be considered.\n"); PhyML_Fprintf(fp, "# The actual conditional probability is given by " "P*(D|M,rr[x])/2^F, where\n"); PhyML_Fprintf(fp, "# F is the scaling factor (see column 'Scaler').\n"); PhyML_Fprintf(fp, "# For invariant sites, P(D|M,rr[0]=0) is the actual " "conditional probability\n"); PhyML_Fprintf(fp, "# (i.e., it is not scaled).\n"); break; } tree = tree->next_mixt; } while (tree); PhyML_Fprintf(fp, "\n"); s = (char *)mCalloc(T_MAX_LINE, sizeof(char)); do { PhyML_Fprintf(fp, "# Alignment file name: %s\n\n", mixt_tree->io->in_align_file); if (mixt_tree->mod->ras->n_catg > 1) { PhyML_Fprintf(fp, "\n# Estimated class frequencies:"); for (catg = 0; catg < mixt_tree->mod->ras->n_catg; ++catg) { sprintf(s, "\n# P(rr[%d]=%5.4f)=%5.4f", catg + 1, mixt_tree->mod->ras->gamma_rr->v[catg], mixt_tree->mod->ras->gamma_r_proba->v[catg]); PhyML_Fprintf(fp, "%-23s", s); } PhyML_Fprintf(fp, "\n\n"); } sprintf(s, "Site"); PhyML_Fprintf(fp, "%-12s", s); sprintf(s, "P(D|M)"); PhyML_Fprintf(fp, "%-15s", s); sprintf(s, "Scaler"); PhyML_Fprintf(fp, "%-7s", s); sprintf(s, "Pattern"); PhyML_Fprintf(fp, "%-9s", s); if (mixt_tree->mod->ras->n_catg > 1) { for (catg = 0; catg < mixt_tree->mod->ras->n_catg; catg++) { sprintf(s, "P*(D|M,rr[%d]=%5.4f)", catg + 1, mixt_tree->mod->ras->gamma_rr->v[catg]); PhyML_Fprintf(fp, "%-23s", s); } sprintf(s, "Posterior mean"); PhyML_Fprintf(fp, "%-22s", s); } if (mixt_tree->mod->ras->invar) { sprintf(s, "P(D|M,rr[0]=0)"); PhyML_Fprintf(fp, "%-16s", s); } sprintf(s, "NDistinctStates"); PhyML_Fprintf(fp, "%-16s", s); PhyML_Fprintf(fp, "\n"); assert(mixt_tree->next->is_mixt_tree == NO); Init_Ui_Tips(mixt_tree->next); for (site = 0; site < mixt_tree->data->init_len; site++) { PhyML_Fprintf(fp, "%-12d", site + 1); PhyML_Fprintf(fp, "%-15g", mixt_tree->cur_site_lk[mixt_tree->data->sitepatt[site]]); PhyML_Fprintf( fp, "%-7d", mixt_tree->fact_sum_scale[mixt_tree->data->sitepatt[site]]); PhyML_Fprintf(fp, "%-9d", mixt_tree->data->sitepatt[site]); if (mixt_tree->mod->ras->n_catg > 1) { tree = mixt_tree->next; do { PhyML_Fprintf( fp, "%-23g", tree->unscaled_site_lk_cat[tree->data->sitepatt[site]]); tree = tree->next; } while (tree && tree->is_mixt_tree == NO); tree = mixt_tree->next; postmean = .0; sum = .0; do { postmean += mixt_tree->mod->ras->gamma_rr ->v[tree->mod->ras->parent_class_number] * tree->unscaled_site_lk_cat[tree->data->sitepatt[site]] * mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number]; sum += tree->unscaled_site_lk_cat[tree->data->sitepatt[site]] * mixt_tree->mod->ras->gamma_r_proba ->v[tree->mod->ras->parent_class_number]; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); postmean /= sum; PhyML_Fprintf(fp, "%-22g", postmean); } if (mixt_tree->mod->ras->invar) { if ((phydbl)mixt_tree->data->invar[mixt_tree->data->sitepatt[site]] > -0.5) PhyML_Fprintf( fp, "%-16g", mixt_tree->mod->e_frq->pi->v [mixt_tree->data->invar[mixt_tree->data->sitepatt[site]]]); else PhyML_Fprintf(fp, "%-16g", 0.0); } assert(mixt_tree->next != NULL); PhyML_Fprintf(fp, "%-16d", Number_Of_Diff_States_One_Site( mixt_tree->data->sitepatt[site], mixt_tree->next)); PhyML_Fprintf(fp, "\n"); } Free(s); mixt_tree = mixt_tree->next_mixt; } while (mixt_tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Exchange_Nodes(t_node *a, t_node *d, t_node *w, t_node *v, t_tree *mixt_tree) { t_tree *tree; tree = mixt_tree->next; do { Exchange_Nodes(tree->a_nodes[a->num], tree->a_nodes[d->num], tree->a_nodes[w->num], tree->a_nodes[v->num], tree); if (tree->is_mixt_tree == YES) return; tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Free_Tree(t_tree *mixt_tree) { t_tree *tree; t_tree *next; Free_All_Edges_Lens(mixt_tree); tree = mixt_tree; do { if (tree->mat) Free_Mat(tree->mat); if (tree->t_dir) Free(tree->t_dir); if (tree->short_l) Free(tree->short_l); if (tree->mutmap) Free(tree->mutmap); Free_Bip(tree); Free(tree->curr_path); Free_All_Nodes_Light(tree); Free_All_Edges_Light(tree); tree = tree->next; } while (tree); tree = mixt_tree; next = mixt_tree->next; do { Free(tree); tree = next; if (!tree) break; next = next->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Repeat_Task(void (*Task_Function)(t_tree *tree), t_tree *mixt_tree) { t_tree *tree, *next; tree = mixt_tree->next; if (tree != NULL) { do { next = tree->next; (*Task_Function)(tree); if (tree->is_mixt_tree == YES) return; tree = next; } while (tree != NULL); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MIXT_Cv(t_tree *mixt_tree) { PhyML_Printf("\n"); switch (mixt_tree->mod->cv_type) { case KFOLD_POS : { PhyML_Printf("\n. Performing K-fold cross-validation\n"); MIXT_Kfold_Pos_Cv(mixt_tree); break; } case KFOLD_COL: { PhyML_Printf("\n. Performing leave-one-column-out cross-validation\n"); MIXT_Kfold_Col_Cv(mixt_tree); break; } case MAXFOLD: { PhyML_Printf("\n. Performing leave-one-column x one-sequence-out cross-validation\n"); MIXT_Maxfold_Cv(mixt_tree); break; } default : return; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Cross-validation routine whereby each position (i.e., site x taxon) is // hidden, the corresponding external branch is optimized and the log-likelihood // of the tree is computed for that particular position, for the actual character // observed at that position. We also calculate here the probabity of each character // and provide the area under the ROC curve. void MIXT_Maxfold_Cv(t_tree *mixt_tree) { phydbl *state_probs, *site_loglk, *weights; short int *truth; int n_prob_vectors; char init_char; // state_probs = NULL; // site_loglk = NULL; // truth = NULL; // weights = NULL; n_prob_vectors = 0; do { Set_Both_Sides(YES, mixt_tree); Set_Update_Eigen(YES, mixt_tree->mod); Lk(NULL, mixt_tree); Set_Update_Eigen(NO, mixt_tree->mod); for (int site = 0; site < mixt_tree->data->n_pattern; ++site) { for (int tax_id = 0; tax_id < mixt_tree->data->n_otu; ++tax_id) { if (mixt_tree->data->c_seq[tax_id]->is_ambigu[site] == NO) { init_char = mixt_tree->data->c_seq[tax_id]->state[site]; // Hide characters in the original alignment uniformly at random CV_Hide_Align_At_Given_Pos(mixt_tree->data, tax_id, site); Init_Partial_Lk_Tips_Double_One_Character(tax_id, site, mixt_tree); MIXT_Br_Len_Opt(mixt_tree->a_nodes[tax_id]->b[0], mixt_tree); // PhyML_Printf("\n. site:%12d tax_id: %12d lnL: %15f", site, tax_id, mixt_tree->c_lnL); // Go back to the original alignment mixt_tree->data->c_seq[tax_id]->state[site] = init_char; mixt_tree->data->c_seq[tax_id]->d_state[site] = Assign_State( mixt_tree->data->c_seq[tax_id]->state + site, mixt_tree->mod->io->datatype, mixt_tree->mod->io->state_len); // Compute likelihoods on test set (i.e., probability of each possible // state at masked positions) CV_State_Probs_At_Hidden_Positions(&state_probs, &truth, &site_loglk, &weights, &n_prob_vectors, mixt_tree); mixt_tree->data->n_masked = 0; Free(mixt_tree->data->masked_pos); mixt_tree->data->masked_pos = NULL; Check_Ambiguities(mixt_tree->data, mixt_tree->mod->io->datatype, mixt_tree->mod->io->state_len); Init_Partial_Lk_Tips_Double_One_Character(tax_id, site, mixt_tree); } } } PhyML_Fprintf(mixt_tree->io->fp_out_stats, "\n"); PhyML_Fprintf(mixt_tree->io->fp_out_stats, "\n. CV type: fast k-fold position (aka maxfold)."); ROC(state_probs, truth, mixt_tree->mod->ns, n_prob_vectors, weights, "MAXFOLD", mixt_tree->io->fp_out_stats); Free(state_probs); Free(site_loglk); Free(truth); Free(weights); state_probs = NULL; site_loglk = NULL; truth = NULL; weights = NULL; mixt_tree = mixt_tree->next_mixt; } while (mixt_tree != NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Cross-validation routine whereby positions (i.e., one position = site x // taxon) are hidden uniformly at random. For each site, one taxon is chosen // uniformy at random and the corresponding position is masked. Do that for all // sites in the alignment and then optimize the phylogenetic model (tree // topology + edge length + etc.). The log-likelihood of the tree is computed // at each masked position, for the actual character observed at each of these positions. // We also calculate here the probabity of each character and provide the area under the ROC curve. void MIXT_Kfold_Pos_Cv(t_tree *mixt_tree) { phydbl *state_probs, *site_loglk, *weights; short int *truth; calign *c_seq_cpy; int kfold; int n_prob_vectors; t_tree *tree; state_probs = NULL; site_loglk = NULL; truth = NULL; weights = NULL; tree = NULL; kfold = 10; // kfold = 1; n_prob_vectors = 0; do { // for (int i = 0; i < kfold*5; ++i) for (int i = 0; i < 5; ++i) { // Create a copy of the original alignment c_seq_cpy = Copy_Cseq(mixt_tree->data, mixt_tree->io, mixt_tree); // Hide characters in the original alignment uniformly at random // CV_Hide_Align_At_Random_One_Per_Site(mixt_tree->data); CV_Hide_Align_At_Random_Pos(mixt_tree->data, (phydbl)(1. / kfold)); c_seq_cpy->n_masked = mixt_tree->data->n_masked; c_seq_cpy->masked_pos = (int *)mCalloc(c_seq_cpy->n_masked, sizeof(int)); for (int i = 0; i < c_seq_cpy->n_masked; i++) c_seq_cpy->masked_pos[i] = mixt_tree->data->masked_pos[i]; // Optimize all parameters on training data set (i.e., whole alignement // with masked positions) Init_Partial_Lk_Tips_Double(mixt_tree); // Global_Spr_Search(mixt_tree); Round_Optimize(mixt_tree,ROUND_MAX); // Optimize_Br_Len_Serie(mixt_tree->n_otu, mixt_tree); Set_Both_Sides(YES, mixt_tree); Set_Update_Eigen(YES, mixt_tree->mod); Lk(NULL, mixt_tree); Set_Update_Eigen(NO, mixt_tree->mod); // Go back to the original alignment Free_Calign(mixt_tree->data); mixt_tree->data = Copy_Cseq(c_seq_cpy, mixt_tree->io, mixt_tree); Free_Calign(c_seq_cpy); MIXT_Connect_Cseqs_To_Nodes(mixt_tree); Init_Partial_Lk_Tips_Double(mixt_tree); Set_Both_Sides(YES, mixt_tree); Set_Update_Eigen(YES, mixt_tree->mod); Lk(NULL, mixt_tree); // PhyML_Printf("\n. j:%d lnL: %f", i, mixt_tree->c_lnL); // Compute likelihoods on test set (i.e., probability of each possible // state at masked positions) CV_State_Probs_At_Hidden_Positions(&state_probs, &truth, &site_loglk, &weights, &n_prob_vectors, mixt_tree); mixt_tree->data->n_masked = 0; Free(mixt_tree->data->masked_pos); mixt_tree->data->masked_pos = NULL; tree = mixt_tree->next; do { tree->data = tree->mixt_tree->data; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); } Init_Partial_Lk_Tips_Double(mixt_tree); PhyML_Fprintf(mixt_tree->io->fp_out_stats, "\n"); PhyML_Fprintf(mixt_tree->io->fp_out_stats, "\n. CV type: k-fold position."); ROC(state_probs, truth, mixt_tree->mod->ns, n_prob_vectors, weights, "KFOLDPOS",mixt_tree->io->fp_out_stats); Free(state_probs); Free(site_loglk); Free(truth); Free(weights); state_probs = NULL; site_loglk = NULL; truth = NULL; weights = NULL; mixt_tree = mixt_tree->next_mixt; } while (mixt_tree != NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Plain cross-validation routine whereby columns are hidden uniformly at random. void MIXT_Kfold_Col_Cv(t_tree *mixt_tree) { phydbl *state_probs, *site_loglk, *weights; short int *truth; calign *c_seq_cpy; int kfold; int n_prob_vectors; t_tree *tree; state_probs = NULL; site_loglk = NULL; truth = NULL; weights = NULL; tree = NULL; kfold = 10; n_prob_vectors = 0; do { for (int i = 0; i < kfold; ++i) { // Create a copy of the original alignment c_seq_cpy = Copy_Cseq(mixt_tree->data, mixt_tree->io, mixt_tree); // Hide characters in the original alignment uniformly at random CV_Hide_Align_At_Random_Col(mixt_tree->data, 1. / (phydbl)kfold); c_seq_cpy->n_masked = mixt_tree->data->n_masked; c_seq_cpy->masked_pos = (int *)mCalloc(c_seq_cpy->n_masked, sizeof(int)); for (int i = 0; i < c_seq_cpy->n_masked; i++) c_seq_cpy->masked_pos[i] = mixt_tree->data->masked_pos[i]; // Optimize all parameters on training data set (i.e., whole alignement // with masked positions) Init_Partial_Lk_Tips_Double(mixt_tree); // Round_Optimize(mixt_tree,ROUND_MAX); Global_Spr_Search(mixt_tree); Set_Both_Sides(YES, mixt_tree); Set_Update_Eigen(YES, mixt_tree->mod); Lk(NULL, mixt_tree); Set_Update_Eigen(NO, mixt_tree->mod); // PhyML_Printf("\n. i:%d lnL: %f", i, mixt_tree->c_lnL); // Go back to the original alignment Free_Calign(mixt_tree->data); mixt_tree->data = Copy_Cseq(c_seq_cpy, mixt_tree->io, mixt_tree); Free_Calign(c_seq_cpy); MIXT_Connect_Cseqs_To_Nodes(mixt_tree); Init_Partial_Lk_Tips_Double(mixt_tree); Set_Both_Sides(NO, mixt_tree); Set_Update_Eigen(NO, mixt_tree->mod); Lk(NULL, mixt_tree); // PhyML_Printf("\n. j:%d lnL: %f", i, mixt_tree->c_lnL); // Compute likelihoods on test set (i.e., probability of each possible // state at masked positions) CV_Score_At_Hidden_Cols(&site_loglk, &weights, &n_prob_vectors, mixt_tree); mixt_tree->data->n_masked = 0; Free(mixt_tree->data->masked_pos); mixt_tree->data->masked_pos = NULL; tree = mixt_tree->next; do { tree->data = tree->mixt_tree->data; tree = tree->next; } while (tree && tree->is_mixt_tree == NO); } Init_Partial_Lk_Tips_Double(mixt_tree); phydbl sum = 0.0; phydbl sum_w = 0.0; for (int i = 0; i < n_prob_vectors; ++i) { // PhyML_Printf("\n. loglk: %15g", site_loglk[i]); sum += site_loglk[i] * weights[i]; sum_w += weights[i]; } PhyML_Fprintf(mixt_tree->io->fp_out_stats, "\n"); PhyML_Fprintf(mixt_tree->io->fp_out_stats, "\n. CV type: k-fold column."); PhyML_Fprintf(mixt_tree->io->fp_out_stats, "\n. CV score: %f ", sum / sum_w); Free(state_probs); Free(site_loglk); Free(truth); Free(weights); state_probs = NULL; site_loglk = NULL; truth = NULL; weights = NULL; mixt_tree = mixt_tree->next_mixt; } while (mixt_tree != NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/mixt.h000066400000000000000000000162121501136442400203250ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef MIXT_H #define MIXT_H #include "utilities.h" void MIXT_Connect_Edges_To_Next_Prev_Child_Parent(t_tree *tree); void MIXT_Connect_Nodes_To_Next_Prev_Child_Parent(t_tree *tree); void MIXT_Connect_Sprs_To_Next_Prev_Child_Parent(t_tree *tree); void MIXT_Turn_Branches_OnOff(int onoff,t_tree *tree); phydbl *MIXT_Get_Lengths_Of_This_Edge(t_edge *mixt_b, t_tree *tree); void MIXT_Set_Lengths_Of_This_Edge(phydbl *lens,t_edge *mixt_b, t_tree *tree); void MIXT_Post_Order_Lk(t_node *mixt_a,t_node *mixt_d,t_tree *mixt_tree); void MIXT_Pre_Order_Lk(t_node *mixt_a,t_node *mixt_d,t_tree *mixt_tree); phydbl MIXT_Lk(t_edge *mixt_b,t_tree *mixt_tree); void MIXT_Update_Partial_Lk(t_tree *mixt_tree,t_edge *mixt_b,t_node *mixt_d); void MIXT_Update_PMat_At_Given_Edge(t_edge *mixt_b,t_tree *mixt_tree); int *MIXT_Get_Number_Of_Classes_In_All_Mixtures(t_tree *mixt_tree); t_tree **MIXT_Record_All_Mixtures(t_tree *mixt_tree); void MIXT_Break_All_Mixtures(int *c_max,t_tree *mixt_tree); void MIXT_Reconnect_All_Mixtures(t_tree **tree_list,t_tree *mixt_tree); int *MIXT_Record_Has_Invariants(t_tree *mixt_tree); void MIXT_Reset_Has_Invariants(int *has_invariants,t_tree *mixt_tree); void MIXT_Check_Invar_Setup(t_tree *mixt_tree); void MIXT_Prune_Subtree(t_node *mixt_a,t_node *mixt_d,t_edge **mixt_target,t_edge **mixt_residual,t_tree *mixt_tree); void MIXT_Graft_Subtree(t_edge *mixt_target, t_node *mixt_link, t_node *mixt_link_daughter, t_edge *mixt_residual, t_node *mixt_target_nd, t_tree *mixt_tree); void MIXT_Br_Len_Opt(t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Check_Number_Of_Invar_Classes(t_tree *mixt_tree); void MIXT_Prepare_Tree_For_Lk(t_tree *tree); void MIXT_Check_Invar_Struct_In_Each_Partition_Elem(t_tree *mixt_tree); void MIXT_Check_RAS_Struct_In_Each_Partition_Elem(t_tree *mixt_tree); void MIXT_Br_Len_Involving_Invar(t_tree *mixt_tree); void MIXT_Br_Len_Not_Involving_Invar(t_tree *mixt_tree); phydbl MIXT_Unscale_Br_Len_Multiplier_Tree(t_tree *mixt_tree); phydbl MIXT_Rescale_Br_Len_Multiplier_Tree(t_tree *mixt_tree); void MIXT_Set_Alias_Subpatt(int onoff, t_tree *mixt_tree); void MIXT_Check_Single_Edge_Lens(t_tree *mixt_tree); void MIXT_Update_Eigen(t_mod *mixt_mod); int MIXT_Pars(t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Set_Pars_Thresh(t_tree *mixt_tree); void MIXT_Bootstrap(char *best_tree, xml_node *root); void MIXT_Chain_All(t_tree *mixt_tree); void MIXT_Chain_String(t_string *curr, t_string *next); void MIXT_Chain_Scalar_Dbl(scalar_dbl *curr, scalar_dbl *next); void MIXT_Chain_Rmat(t_rmat *curr, t_rmat *next); void MIXT_Chain_Rmat(t_rmat *curr, t_rmat *next); void MIXT_Chain_Efrq(t_efrq *curr, t_efrq *next); void MIXT_Chain_RAS(t_ras *curr, t_ras *next); void MIXT_Chain_Eigen(eigen *curr, eigen *next); void MIXT_Chain_Vector_Dbl(vect_dbl *curr, vect_dbl *next); void MIXT_Chain_Sprs(t_tree *tree); void MIXT_Chain_Nodes(t_tree *tree); void MIXT_Chain_Edges(t_tree *tree); phydbl MIXT_Get_Mean_Edge_Len(t_edge *mixt_b, t_tree *tree); phydbl MIXT_Get_Sum_Chained_Scalar_Dbl(scalar_dbl *s); phydbl MIXT_Get_Sum_Of_Probas_Across_Mixtures(phydbl r_mat_weight_sum, phydbl e_frq_weight_sum, t_tree *mixt_tree); phydbl MIXT_Rescale_Free_Rate_Tree(t_tree *mixt_tree); void MIXT_Set_Br_Len_Var(t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Optimize_Br_Len_Multiplier(t_tree *mixt_tree); void MIXT_Update_Br_Len_Multipliers(t_mod *mod); void MIXT_Init_Model(t_mod *mod); t_tree *MIXT_Starting_Tree(t_tree *mixt_tree); void MIXT_Connect_Cseqs_To_Nodes(t_tree *mixt_tree); void MIXT_Check_Edge_Lens_In_One_Elem(t_tree *mixt_tree); void MIXT_Check_Edge_Lens_In_All_Elem(t_tree *mixt_tree); void MIXT_Turn_Branches_OnOff_In_One_Elem(int onoff, t_tree *mixt_tree); void MIXT_Turn_Branches_OnOff_In_All_Elem(int onoff, t_tree *mixt_tree); void MIXT_Init_T_Beg(t_tree *mixt_tree); void MIXT_Prepare_All(int num_rand_tree, t_tree *mixt_tree); void MIXT_Init_T_End(t_tree *mixt_tree); void MIXT_Add_Root(t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Check_Model_Validity(t_tree *mixt_tree); void MIXT_Ancestral_Sequences_One_Node(t_node *mixt_d, t_tree *mixt_tree, int print); void MIXT_Update_Partial_Pars(t_tree *mixt_tree, t_edge *mixt_b, t_node *mixt_d); void MIXT_Chain_Cal(t_tree *mixt_tree); void MIXT_Chain_Rates(t_rate *curr, t_rate *next); void MIXT_RATES_Update_Edge_Lengths(t_tree *mixt_tree); phydbl MIXT_dLk(phydbl *l, t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Update_Eigen_Lr(t_edge *mixt_b, t_tree *mixt_tree); int MIXT_Part_Mixt_Size(t_tree *mixt_tree); int MIXT_Mixt_Size(t_tree *mixt_tree); void MIXT_Set_Use_Eigen_Lr(int yn, t_tree *mixt_tree); void MIXT_Set_Update_Eigen_Lr(int yn, t_tree *mixt_tree); void MIXT_Backup_Partial_Pars(t_node *mixt_d, t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Restore_Partial_Pars(t_node *mixt_d, t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Backup_Partial_Lk(t_node *mixt_d, t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Restore_Partial_Lk(t_node *mixt_d, t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Backup_Partial_Scale(t_node *mixt_d, t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Restore_Partial_Scale(t_node *mixt_d, t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Set_Both_Sides(int yesno, t_tree *mixt_tree); void MIXT_Set_Br_Len(phydbl val, t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Multiply_Scalar_Dbl(scalar_dbl *this, phydbl scalar); void MIXT_Sample_Ancestral_Seq(int mutmap, int fromprior, t_tree *mixt_tree); void MIXT_Set_Update_Eigen(int yn, t_mod *mixt_mod); void MIXT_Set_Ignore_Root(int yesno, t_tree *mixt_tree); void MIXT_Make_Spr(t_tree *mixt_tree); void MIXT_Make_Tree_For_Lk(t_tree *mixt_tree); void MIXT_Make_Tree_For_Pars(t_tree *mixt_tree); void MIXT_Connect_Tip_Disks(t_tree *mixt_tree); void MIXT_Propagate_Tree_Update(t_tree *mixt_tree); void MIXT_Set_Bl_From_Rt(int yn, t_tree *mixt_tree); void MIXT_Copy_Tree(t_tree *ori, t_tree *cpy); void MIXT_Init_NNI_Score(phydbl val, t_edge *mixt_b, t_tree *mixt_tree); t_tree *MIXT_Duplicate_Tree(t_tree *ori); void MIXT_Set_Model_Parameters(t_mod *mixt_mod); void MIXT_Print_Site_Lk(t_tree *mixt_tree, FILE *fp); void MIXT_Exchange_Nodes(t_node *a, t_node *d, t_node *w, t_node *v, t_tree *mixt_tree); void MIXT_Chain_Models(t_tree *mixt_tree); void MIXT_Repeat_Task(void (*Task_Function)(t_tree *tree),t_tree *mixt_tree); void MIXT_Free_Tree(t_tree *mixt_tree); void MIXT_RATES_Update_One_Edge_Length(t_edge *mixt_b, t_tree *mixt_tree); void MIXT_Set_Scalar_Dbl(scalar_dbl *this, phydbl value); void MIXT_Kfold_Pos_Cv(t_tree *mixt_tree); void MIXT_Kfold_Col_Cv(t_tree *mixt_tree); void MIXT_Maxfold_Cv(t_tree *mixt_tree); void MIXT_Init_Partial_Lk_Tips_Double(t_tree *mixt_tree); void MIXT_Init_Partial_Lk_Tips_Double_One_Character(int node_idx, int curr_site, t_tree *mixt_tree); void MIXT_Init_Partial_Lk_Tips_Double_One_Site(int site, t_tree *mixt_tree); void MIXT_Cv(t_tree *mixt_tree); calign *MIXT_Copy_Cseq(calign *ori, option *io, t_tree *mixt_tree); #endif stephaneguindon-phyml-76a39c8/src/models.c000066400000000000000000001226621501136442400206310ustar00rootroot00000000000000/* PhyML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "models.h" #ifdef BEAGLE #include "beagle_utils.h" #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Handle any number of states (>1) */ void PMat_JC69(phydbl l, int pos, phydbl *Pij, t_mod *mod) { int ns; int i, j; ns = mod->ns; for (i = 0; i < ns; i++) Pij[pos + ns * i + i] = 1. - ((ns - 1.) / ns) * (1. - exp(-ns * l / (ns - 1.))); for (i = 0; i < ns - 1; i++) for (j = i + 1; j < ns; j++) { Pij[pos + ns * i + j] = (1. / ns) * (1. - exp(-ns * l / (ns - 1.))); if (Pij[pos + ns * i + j] < SMALL_PIJ) Pij[pos + ns * i + j] = SMALL_PIJ; Pij[pos + ns * j + i] = Pij[pos + ns * i + j]; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PMat_K80(phydbl l, phydbl kappa, int pos, phydbl *Pij) { phydbl Ts, Tv, e1, e2, aux; int i, j; /*0 => A*/ /*1 => C*/ /*2 => G*/ /*3 => T*/ /* Ts -> transition*/ /* Tv -> transversion*/ aux = -2 * l / (kappa + 2); e1 = (phydbl)exp(aux * 2); e2 = (phydbl)exp(aux * (kappa + 1)); Tv = .25 * (1 - e1); Ts = .25 * (1 + e1 - 2 * e2); Pij[pos + 4 * 0 + 0] = Pij[pos + 4 * 1 + 1] = Pij[pos + 4 * 2 + 2] = Pij[pos + 4 * 3 + 3] = 1. - Ts - 2. * Tv; Pij[pos + 4 * 0 + 1] = Pij[pos + 4 * 1 + 0] = Tv; Pij[pos + 4 * 0 + 2] = Pij[pos + 4 * 2 + 0] = Ts; Pij[pos + 4 * 0 + 3] = Pij[pos + 4 * 3 + 0] = Tv; Pij[pos + 4 * 1 + 2] = Pij[pos + 4 * 2 + 1] = Tv; Pij[pos + 4 * 1 + 3] = Pij[pos + 4 * 3 + 1] = Ts; Pij[pos + 4 * 2 + 3] = Pij[pos + 4 * 3 + 2] = Tv; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) if (Pij[pos + 4 * i + j] < SMALL_PIJ) Pij[pos + 4 * i + j] = SMALL_PIJ; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PMat_TN93(phydbl l, t_mod *mod, int pos, phydbl *Pij) { int i, j; phydbl e1, e2, e3; phydbl a1t, a2t, bt; phydbl A, C, G, T, R, Y; phydbl kappa1, kappa2; A = mod->e_frq->pi->v[0]; C = mod->e_frq->pi->v[1]; G = mod->e_frq->pi->v[2]; T = mod->e_frq->pi->v[3]; R = A + G; Y = T + C; if (mod->kappa->v < .0) mod->kappa->v = 1.0e-5; if ((mod->whichmodel != F84) && (mod->whichmodel != TN93)) mod->lambda->v = 1.; else if (mod->whichmodel == F84) { mod->lambda->v = Get_Lambda_F84(mod->e_frq->pi->v, &mod->kappa->v); } kappa2 = mod->kappa->v * 2. / (1. + mod->lambda->v); kappa1 = kappa2 * mod->lambda->v; bt = l / (2. * (A * G * kappa1 + C * T * kappa2 + R * Y)); a1t = kappa1; a2t = kappa2; a1t *= bt; a2t *= bt; e1 = (phydbl)exp(-a1t * R - bt * Y); e2 = (phydbl)exp(-a2t * Y - bt * R); e3 = (phydbl)exp(-bt); /*A->A*/ Pij[pos + 4 * 0 + 0] = A + Y * A / R * e3 + G / R * e1; /*A->C*/ Pij[pos + 4 * 0 + 1] = C * (1 - e3); /*A->G*/ Pij[pos + 4 * 0 + 2] = G + Y * G / R * e3 - G / R * e1; /*A->T*/ Pij[pos + 4 * 0 + 3] = T * (1 - e3); /*C->A*/ Pij[pos + 4 * 1 + 0] = A * (1 - e3); /*C->C*/ Pij[pos + 4 * 1 + 1] = C + R * C / Y * e3 + T / Y * e2; /*C->G*/ Pij[pos + 4 * 1 + 2] = G * (1 - e3); /*C->T*/ Pij[pos + 4 * 1 + 3] = T + R * T / Y * e3 - T / Y * e2; /*G->A*/ Pij[pos + 4 * 2 + 0] = A + Y * A / R * e3 - A / R * e1; /*G->C*/ Pij[pos + 4 * 2 + 1] = C * (1 - e3); /*G->G*/ Pij[pos + 4 * 2 + 2] = G + Y * G / R * e3 + A / R * e1; /*G->T*/ Pij[pos + 4 * 2 + 3] = T * (1 - e3); /*T->A*/ Pij[pos + 4 * 3 + 0] = A * (1 - e3); /*T->C*/ Pij[pos + 4 * 3 + 1] = C + R * C / Y * e3 - C / Y * e2; /*T->G*/ Pij[pos + 4 * 3 + 2] = G * (1 - e3); /*T->T*/ Pij[pos + 4 * 3 + 3] = T + R * T / Y * e3 + C / Y * e2; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) if (Pij[pos + 4 * i + j] < SMALL_PIJ) Pij[pos + 4 * i + j] = SMALL_PIJ; /* /\*A->A*\/(*Pij)[0][0] = A+Y*A/R*e3+G/R*e1; */ /* /\*A->C*\/(*Pij)[0][1] = C*(1-e3); */ /* /\*A->G*\/(*Pij)[0][2] = G+Y*G/R*e3-G/R*e1; */ /* /\*A->T*\/(*Pij)[0][3] = T*(1-e3); */ /* /\*C->A*\/(*Pij)[1][0] = A*(1-e3); */ /* /\*C->C*\/(*Pij)[1][1] = C+R*C/Y*e3+T/Y*e2; */ /* /\*C->G*\/(*Pij)[1][2] = G*(1-e3); */ /* /\*C->T*\/(*Pij)[1][3] = T+R*T/Y*e3-T/Y*e2; */ /* /\*G->A*\/(*Pij)[2][0] = A+Y*A/R*e3-A/R*e1; */ /* /\*G->C*\/(*Pij)[2][1] = C*(1-e3); */ /* /\*G->G*\/(*Pij)[2][2] = G+Y*G/R*e3+A/R*e1; */ /* /\*G->T*\/(*Pij)[2][3] = T*(1-e3); */ /* /\*T->A*\/(*Pij)[3][0] = A*(1-e3); */ /* /\*T->C*\/(*Pij)[3][1] = C+R*C/Y*e3-C/Y*e2; */ /* /\*T->G*\/(*Pij)[3][2] = G*(1-e3); */ /* /\*T->T*\/(*Pij)[3][3] = T+R*T/Y*e3+C/Y*e2; */ /* for(i=0;i<4;i++) for(j=0;j<4;j++) */ /* if((*Pij)[i][j] < SMALL) (*Pij)[i][j] = SMALL; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Get_Lambda_F84(phydbl *pi, phydbl *kappa) { phydbl A, C, G, T, R, Y, lambda; int kappa_has_changed; A = pi[0]; C = pi[1]; G = pi[2]; T = pi[3]; R = A + G; Y = T + C; if (*kappa < .0) *kappa = 1.0e-5; kappa_has_changed = NO; do { lambda = (Y + (R - Y) / (2. * (*kappa))) / (R - (R - Y) / (2. * (*kappa))); if (lambda < .0) { *kappa += *kappa / 10.; kappa_has_changed = YES; } } while (lambda < .0); if (kappa_has_changed) { PhyML_Printf("\n. WARNING: This transition/transversion ratio\n"); PhyML_Printf(" is impossible with these base frequencies!\n"); PhyML_Printf(" The ratio is now set to %.3f\n", *kappa); } return lambda; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /********************************************************************/ /* void PMat_Empirical(phydbl l, t_mod *mod, phydbl ***Pij) */ /* */ /* Computes the substitution probability matrix */ /* from the initial substitution rate matrix and frequency vector */ /* and one specific branch length */ /* */ /* input : l , branch length */ /* input : mod , choosen model parameters, qmat and pi */ /* ouput : Pij , substitution probability matrix */ /* */ /* matrix P(l) is computed as follows : */ /* P(l) = exp(Q*t) , where : */ /* */ /* Q = substitution rate matrix = Vr*D*inverse(Vr) , where : */ /* */ /* Vr = right eigenvector matrix for Q */ /* D = diagonal matrix of eigenvalues for Q */ /* */ /* t = time interval = l / mr , where : */ /* */ /* mr = mean rate = branch length/time interval */ /* = sum(i)(pi[i]*p(i->j)) , where : */ /* */ /* pi = state frequency vector */ /* p(i->j) = subst. probability from i to a different state */ /* = -Q[ii] , as sum(j)(Q[ij]) +Q[ii] =0 */ /* */ /* the Taylor development of exp(Q*t) gives : */ /* P(l) = Vr*exp(D*t) *inverse(Vr) */ /* = Vr*POW(exp(D/mr),l)*inverse(Vr) */ /* */ /* for performance we compute only once the following matrixes : */ /* Vr, inverse(Vr), exp(D/mr) */ /* thus each time we compute P(l) we only have to : */ /* make 20 times the operation POW() */ /* make 2 20x20 matrix multiplications , that is : */ /* 16000 = 2x20x20x20 times the operation * */ /* 16000 = 2x20x20x20 times the operation + */ /* which can be reduced to (the central matrix being diagonal) : */ /* 8400 = 20x20 + 20x20x20 times the operation * */ /* 8000 = 20x20x20 times the operation + */ /********************************************************************/ void PMat_Empirical(phydbl l, const t_mod *mod, const int pos, phydbl *Pij, phydbl *tPij) { const unsigned int ns = mod->ns; unsigned int i, j, k; const phydbl *U, *V, *R; phydbl *expt; phydbl *uexpt; phydbl sum; assert(Pij); expt = mod->eigen->e_val_im; uexpt = mod->eigen->r_e_vect_im; U = mod->eigen->r_e_vect; V = mod->eigen->l_e_vect; R = mod->eigen->e_val; for (k = 0; k < ns; ++k) expt[k] = exp(R[k] * l); /* multiply Vr*POW(exp(D/mr),l)*Vi into Pij */ for (i = 0; i < ns; i++) for (k = 0; k < ns; k++) uexpt[i * ns + k] = U[i * ns + k] * expt[k]; Pij = Pij + pos; if (tPij != NULL) tPij = tPij + pos; for (i = 0; i < ns; ++i) { for (j = 0; j < ns; ++j) { Pij[j] = 0.0; for (k = 0; k < ns; ++k) { Pij[j] += (uexpt[i * ns + k] * V[k * ns + j]); } if (Pij[j] < SMALL_PIJ) Pij[j] = SMALL_PIJ; } /* Below is required ? */ sum = 0.0; for (j = 0; j < ns; ++j) sum += Pij[j]; for (j = 0; j < ns; ++j) Pij[j] /= sum; Pij += ns; } Pij -= ns * ns; if (tPij != NULL) { for (i = 0; i < ns; ++i) { for (j = 0; j < ns; ++j) { tPij[ns * i + j] = Pij[ns * j + i]; } } } /* PhyML_Printf("\n. Pmat len: %f",l); */ /* for(i=0;ins; int i, j; For(i, n) For(j, n) Pij[pos + mod->ns * i + j] = .0; For(i, n) Pij[pos + mod->ns * i + i] = 1.0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* *Update a rate specific Transition Prob matrix for a given *branch-length(already adjusted with the rate prior to this function being *called) * * Pij: the P-matrix that will be adjusted * l : branch length * rate * pos: offset into a specific rate-category * */ void PMat(phydbl l, t_mod *mod, int pos, phydbl *Pij, phydbl *tPij) { /* Warning: l is never the log of branch length here */ if (l < 0.0) { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif PMat_Zero_Br_Len(mod, pos, Pij); } else { #ifdef BEAGLE // when there is no active instance (i.e. when we are building the initial // tree) if (UNINITIALIZED == mod->b_inst) PMat_Empirical(l, mod, pos, Pij, tPij); #else PMat_Empirical(l, mod, pos, Pij, tPij); #endif } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int GetDaa(phydbl *daa, phydbl *pi, char *file_name) { /* Get the amino acid distance (or substitution rate) matrix (grantham, dayhoff, jones, etc). */ FILE *fdaa; int i, j, naa; phydbl dmax, dmin; phydbl sum; double val; naa = 20; dmax = .0; dmin = 1.E+40; fdaa = (FILE *)Openfile(file_name, 0); for (i = 0; i < naa; i++) for (j = 0; j < i; j++) { /* if(fscanf(fdaa, "%lf", &daa[i*naa+j])) Exit("\n. err * aaRatefile"); */ if (fscanf(fdaa, "%lf", &val)) Exit("\n. err aaRatefile"); daa[i * naa + j] = (phydbl)val; daa[j * naa + i] = daa[i * naa + j]; if (dmax < daa[i * naa + j]) dmax = daa[i * naa + j]; if (dmin > daa[i * naa + j]) dmin = daa[i * naa + j]; } for (i = 0; i < naa; i++) { /* if(fscanf(fdaa,"%lf",&pi[i])!=1) Exit("\n. err aaRatefile"); */ if (fscanf(fdaa, "%lf", &val) != 1) Exit("\n. err aaRatefile"); pi[i] = (phydbl)val; } sum = 0.0; for (i = 0; i < naa; ++i) sum += pi[i]; if (FABS(1. - sum) > 1e-4) { PhyML_Printf("\nSum of freq. = %.6f != 1 in aaRateFile\n", sum); exit(-1); } fclose(fdaa); return (0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Update_Qmat_Generic(phydbl *rr, phydbl *pi, int ns, phydbl *qmat) { int i, j; phydbl sum, mr; for (i = 0; i < ns * ns; ++i) qmat[i] = .0; /* if(rr[(int)(ns*(ns-1)/2)-1] < 0.00001) */ /* { */ /* PhyML_Fprintf(stderr,"\n. * rr[%d]=%f",(int)(ns*(ns-1)/2)-1,rr[(int)(ns*(ns-1)/2)-1]); */ /* assert(FALSE); */ /* } */ /* for(i=0;i<(int)(ns*(ns-1)/2);++i) */ /* { */ /* rr[i] /= rr[(int)(ns*(ns-1)/2)-1]; */ /* } */ /* Fill the non-diagonal parts */ for (i = 0; i < ns; i++) { for (j = i + 1; j < ns; j++) { qmat[i * ns + j] = rr[MIN(i, j) * ns + MAX(i, j) - (MIN(i, j) + 1 + (int)POW(MIN(i, j) + 1, 2)) / 2]; qmat[j * ns + i] = qmat[i * ns + j]; } } /* Multiply by pi */ for (i = 0; i < ns; i++) { for (j = 0; j < ns; j++) { qmat[i * ns + j] *= pi[j]; } } /* Compute diagonal elements */ mr = .0; for (i = 0; i < ns; i++) { sum = .0; for (j = 0; j < ns; j++) sum += qmat[i * ns + j]; qmat[i * ns + i] = -sum; mr += sum * pi[i]; } for (i = 0; i < ns * ns; i++) qmat[i] /= mr; return (mr); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Qmat_GTR(phydbl *rr, phydbl *rr_val, int *rr_num, phydbl *pi, phydbl *qmat) { int i; phydbl mr; for (i = 0; i < 6; i++) rr[i] = exp(rr_val[rr_num[i]]); /* for(i=0;i<6;i++) rr[i] = log(rr_val[rr_num[i]]); */ for (i = 0; i < 6; i++) if (rr[i] < 0.0) { PhyML_Fprintf(stderr, "\n. rr%d: %f", i, rr[i]); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s').\n", __FILE__, __LINE__, __FUNCTION__); Exit(""); } for (i = 0; i < 6; i++) rr[i] /= rr[5]; for (i = 0; i < 6; i++) if (rr[i] < RR_MIN) rr[i] = RR_MIN; for (i = 0; i < 6; i++) if (rr[i] > RR_MAX) rr[i] = RR_MAX; qmat[0 * 4 + 1] = (rr[0] * pi[1]); qmat[0 * 4 + 2] = (rr[1] * pi[2]); qmat[0 * 4 + 3] = (rr[2] * pi[3]); qmat[1 * 4 + 0] = (rr[0] * pi[0]); qmat[1 * 4 + 2] = (rr[3] * pi[2]); qmat[1 * 4 + 3] = (rr[4] * pi[3]); qmat[2 * 4 + 0] = (rr[1] * pi[0]); qmat[2 * 4 + 1] = (rr[3] * pi[1]); qmat[2 * 4 + 3] = (rr[5] * pi[3]); qmat[3 * 4 + 0] = (rr[2] * pi[0]); qmat[3 * 4 + 1] = (rr[4] * pi[1]); qmat[3 * 4 + 2] = (rr[5] * pi[2]); qmat[0 * 4 + 0] = -(rr[0] * pi[1] + rr[1] * pi[2] + rr[2] * pi[3]); qmat[1 * 4 + 1] = -(rr[0] * pi[0] + rr[3] * pi[2] + rr[4] * pi[3]); qmat[2 * 4 + 2] = -(rr[1] * pi[0] + rr[3] * pi[1] + rr[5] * pi[3]); qmat[3 * 4 + 3] = -(rr[2] * pi[0] + rr[4] * pi[1] + rr[5] * pi[2]); /* compute diagonal terms of Q and mean rate mr = l/t */ mr = .0; for (i = 0; i < 4; i++) mr += pi[i] * (-qmat[i * 4 + i]); for (i = 0; i < 16; i++) qmat[i] /= mr; /* PhyML_Printf("\n. rr[0]=%f rr[1]=%f rr[2]=%f rr[3]=%f rr[4]=%f rr[5]=%f", */ /* rr[0], */ /* rr[1], */ /* rr[2], */ /* rr[3], */ /* rr[4], */ /* rr[5]); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Qmat_HKY(phydbl kappa, phydbl *pi, phydbl *qmat) { int i; phydbl mr; /* A -> C */ qmat[0 * 4 + 1] = (phydbl)(pi[1]); /* A -> G */ qmat[0 * 4 + 2] = (phydbl)(kappa * pi[2]); /* A -> T */ qmat[0 * 4 + 3] = (phydbl)(pi[3]); /* C -> A */ qmat[1 * 4 + 0] = (phydbl)(pi[0]); /* C -> G */ qmat[1 * 4 + 2] = (phydbl)(pi[2]); /* C -> T */ qmat[1 * 4 + 3] = (phydbl)(kappa * pi[3]); /* G -> A */ qmat[2 * 4 + 0] = (phydbl)(kappa * pi[0]); /* G -> C */ qmat[2 * 4 + 1] = (phydbl)(pi[1]); /* G -> T */ qmat[2 * 4 + 3] = (phydbl)(pi[3]); /* T -> A */ qmat[3 * 4 + 0] = (phydbl)(pi[0]); /* T -> C */ qmat[3 * 4 + 1] = (phydbl)(kappa * pi[1]); /* T -> G */ qmat[3 * 4 + 2] = (phydbl)(pi[2]); qmat[0 * 4 + 0] = (phydbl)(-(qmat[0 * 4 + 1] + qmat[0 * 4 + 2] + qmat[0 * 4 + 3])); qmat[1 * 4 + 1] = (phydbl)(-(qmat[1 * 4 + 0] + qmat[1 * 4 + 2] + qmat[1 * 4 + 3])); qmat[2 * 4 + 2] = (phydbl)(-(qmat[2 * 4 + 0] + qmat[2 * 4 + 1] + qmat[2 * 4 + 3])); qmat[3 * 4 + 3] = (phydbl)(-(qmat[3 * 4 + 0] + qmat[3 * 4 + 1] + qmat[3 * 4 + 2])); /* compute diagonal terms of Q and mean rate mr = l/t */ mr = .0; for (i = 0; i < 4; ++i) mr += pi[i] * (-qmat[i * 4 + i]); for (i = 0; i < 16; i++) qmat[i] /= mr; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Qmat_TN93(phydbl kappa, phydbl lambda, phydbl *pi, phydbl *qmat) { int i; phydbl mr; /* A -> C */ qmat[0 * 4 + 1] = (phydbl)(pi[1]); /* A -> G */ qmat[0 * 4 + 2] = (phydbl)(kappa * lambda * pi[2]); /* A -> T */ qmat[0 * 4 + 3] = (phydbl)(pi[3]); /* C -> A */ qmat[1 * 4 + 0] = (phydbl)(pi[0]); /* C -> G */ qmat[1 * 4 + 2] = (phydbl)(pi[2]); /* C -> T */ qmat[1 * 4 + 3] = (phydbl)(kappa * pi[3]); /* G -> A */ qmat[2 * 4 + 0] = (phydbl)(kappa * lambda * pi[0]); /* G -> C */ qmat[2 * 4 + 1] = (phydbl)(pi[1]); /* G -> T */ qmat[2 * 4 + 3] = (phydbl)(pi[3]); /* T -> A */ qmat[3 * 4 + 0] = (phydbl)(pi[0]); /* T -> C */ qmat[3 * 4 + 1] = (phydbl)(kappa * pi[1]); /* T -> G */ qmat[3 * 4 + 2] = (phydbl)(pi[2]); qmat[0 * 4 + 0] = (phydbl)(-(qmat[0 * 4 + 1] + qmat[0 * 4 + 2] + qmat[0 * 4 + 3])); qmat[1 * 4 + 1] = (phydbl)(-(qmat[1 * 4 + 0] + qmat[1 * 4 + 2] + qmat[1 * 4 + 3])); qmat[2 * 4 + 2] = (phydbl)(-(qmat[2 * 4 + 0] + qmat[2 * 4 + 1] + qmat[2 * 4 + 3])); qmat[3 * 4 + 3] = (phydbl)(-(qmat[3 * 4 + 0] + qmat[3 * 4 + 1] + qmat[3 * 4 + 2])); /* compute diagonal terms of Q and mean rate mr = l/t */ mr = .0; for (i = 0; i < 4; ++i) mr += pi[i] * (-qmat[i * 4 + i]); for (i = 0; i < 16; i++) qmat[i] /= mr; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Translate_Custom_Mod_String(t_mod *mod) { int i, j; for (i = 0; i < 6; i++) mod->r_mat->n_rr_per_cat->v[i] = 0; mod->r_mat->n_diff_rr = 0; for (i = 0; i < 6; i++) { for (j = 0; j < i; j++) { if (mod->custom_mod_string->s[i] == mod->custom_mod_string->s[j]) { break; } } if (i == j) { mod->r_mat->rr_num->v[i] = mod->r_mat->n_diff_rr; mod->r_mat->n_diff_rr++; } else { mod->r_mat->rr_num->v[i] = mod->r_mat->rr_num->v[j]; } mod->r_mat->n_rr_per_cat->v[mod->r_mat->rr_num->v[j]]++; } /* PhyML_Printf("\n"); */ /* for(i=0;i<6;i++) PhyML_Printf("%d ",mod->r_mat->rr_num->v[i]); */ /* for(i=0;ir_mat->n_diff_rr;i++) PhyML_Printf("\n. Class %d size * %d",i+1,mod->r_mat->n_rr_per_cat->v[i]); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update rate across sites distribution settings. int Update_RAS(t_mod *mod) { phydbl sum; int i; if (mod->ras->free_mixt_rates == NO) { DiscreteGamma(mod->ras->gamma_r_proba->v, mod->ras->gamma_rr->v, mod->ras->alpha->v, mod->ras->alpha->v, mod->ras->n_catg, mod->ras->gamma_median); } else { // Update class frequencies #ifndef PHYML Qksort(mod->ras->gamma_r_proba_unscaled->v, NULL, 0, mod->ras->n_catg - 1); // Unscaled class frequencies sorted in increasing order mod->ras->gamma_r_proba->v[0] = mod->ras->gamma_r_proba_unscaled->v[0] / mod->ras->gamma_r_proba_unscaled->v[mod->ras->n_catg - 1]; for (i = 1; i < mod->ras->n_catg; i++) { mod->ras->gamma_r_proba->v[i] = (mod->ras->gamma_r_proba_unscaled->v[i] - mod->ras->gamma_r_proba_unscaled->v[i - 1]) / mod->ras->gamma_r_proba_unscaled->v[mod->ras->n_catg - 1]; } #endif #ifdef PHYML sum = 0.0; for (i = 0; i < mod->ras->n_catg; i++) sum += exp(mod->ras->gamma_r_proba_unscaled->v[i]); for (i = 0; i < mod->ras->n_catg; i++) mod->ras->gamma_r_proba->v[i] = exp(mod->ras->gamma_r_proba_unscaled->v[i]) / sum; #endif // Update class rates if (mod->ras->normalise_rr == YES) { #ifdef PHYML sum = .0; for (i = 0; i < mod->ras->n_catg; i++) sum += mod->ras->gamma_r_proba->v[i] * exp(mod->ras->gamma_rr_unscaled->v[i]); for (i = 0; i < mod->ras->n_catg; i++) mod->ras->gamma_rr->v[i] = exp(mod->ras->gamma_rr_unscaled->v[i]) / sum; #else sum = .0; for (i = 0; i < mod->ras->n_catg; i++) sum += mod->ras->gamma_r_proba->v[i] * fabs(mod->ras->gamma_rr_unscaled->v[i]); for (i = 0; i < mod->ras->n_catg; i++) mod->ras->gamma_rr->v[i] = fabs(mod->ras->gamma_rr_unscaled->v[i]) / sum; #endif } else { for (i = 0; i < mod->ras->n_catg; i++) mod->ras->gamma_rr->v[i] = exp(mod->ras->gamma_rr_unscaled->v[i]); } /* printf("\n"); */ /* for(i=0;iras->n_catg;i++) */ /* printf("\nx %3d %12f %12f xx %12f %12f", */ /* mod->ras->normalise_rr, */ /* mod->ras->gamma_r_proba->v[i], */ /* mod->ras->gamma_rr->v[i], */ /* mod->ras->gamma_r_proba_unscaled->v[i], */ /* mod->ras->gamma_rr_unscaled->v[i]); */ } #ifdef BEAGLE if (UNINITIALIZED != mod->b_inst) update_beagle_ras(mod); #endif /* for(i=0;iras->n_catg;i++) PhyML_Printf("\n. REALW%d: %12f [%12f] * (%12f;%12f--%2d)", */ /* i, */ /* mod->ras->gamma_r_proba->v[i], */ /* mod->ras->gamma_r_proba_unscaled->v[i], */ /* mod->ras->gamma_rr->v[i], */ /* mod->ras->gamma_rr_unscaled->v[i], */ /* mod->ras->normalise_rr); */ return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Update_Efrq(t_mod *mod) { unsigned int i; phydbl sum; if (mod->e_frq->type == ML) { for (i = 0; i < mod->ns; ++i) mod->e_frq->pi->v[i] = exp(mod->e_frq->pi_unscaled->v[i]); sum = 0.0; for (i = 0; i < mod->ns; ++i) sum += mod->e_frq->pi->v[i]; for (i = 0; i < mod->ns; ++i) mod->e_frq->pi->v[i] = mod->e_frq->pi->v[i] / sum; #ifdef BEAGLE if (UNINITIALIZED != mod->b_inst) update_beagle_efrqs(mod); #endif } for (i = 0; i < mod->ns; ++i) if (mod->e_frq->pi->v[i] < E_FRQ_MIN) mod->e_frq->pi->v[i] = E_FRQ_MIN; for (i = 0; i < mod->ns; ++i) if (mod->e_frq->pi->v[i] > E_FRQ_MAX) mod->e_frq->pi->v[i] = E_FRQ_MAX; return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Set_Model_Parameters(t_mod *mod) { if (!Update_RAS(mod)) return 0; if (!Update_Efrq(mod)) return 0; if (!Update_Eigen(mod)) return 0; if (!Update_Boundaries(mod)) return 0; if (mod->is_mixt_mod == YES) MIXT_Set_Model_Parameters(mod); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Update_Boundaries(t_mod *mod) { int i; if (mod->kappa->v > TSTV_MAX) mod->kappa->v = TSTV_MAX; if (mod->kappa->v < TSTV_MIN) mod->kappa->v = TSTV_MIN; if (mod->ras->alpha->v < ALPHA_MIN) mod->ras->alpha->v = ALPHA_MIN; if (mod->ras->alpha->v > ALPHA_MAX) mod->ras->alpha->v = ALPHA_MAX; if (mod->ras->free_mixt_rates == YES) { for (i = 0; i < mod->ras->n_catg; i++) { if (mod->ras->gamma_rr_unscaled->v[i] < GAMMA_RR_UNSCALED_MIN) mod->ras->gamma_rr_unscaled->v[i] = GAMMA_RR_UNSCALED_MIN; if (mod->ras->gamma_rr_unscaled->v[i] > GAMMA_RR_UNSCALED_MAX) mod->ras->gamma_rr_unscaled->v[i] = GAMMA_RR_UNSCALED_MAX; if (mod->ras->gamma_r_proba_unscaled->v[i] < GAMMA_R_PROBA_UNSCALED_MIN) mod->ras->gamma_r_proba_unscaled->v[i] = GAMMA_R_PROBA_UNSCALED_MIN; if (mod->ras->gamma_r_proba_unscaled->v[i] > GAMMA_R_PROBA_UNSCALED_MAX) mod->ras->gamma_r_proba_unscaled->v[i] = GAMMA_R_PROBA_UNSCALED_MAX; } } if (mod->whichmodel == CUSTOM || mod->whichmodel == GTR) { for (i = 0; i < 6; i++) if (mod->r_mat->rr_val->v[i] < UNSCALED_RR_MIN) mod->r_mat->rr_val->v[i] = UNSCALED_RR_MIN; for (i = 0; i < 6; i++) if (mod->r_mat->rr_val->v[i] > UNSCALED_RR_MAX) mod->r_mat->rr_val->v[i] = UNSCALED_RR_MAX; for (i = 0; i < 6; i++) if (mod->r_mat->rr->v[i] < RR_MIN) mod->r_mat->rr->v[i] = RR_MIN; for (i = 0; i < 6; i++) if (mod->r_mat->rr->v[i] > RR_MAX) mod->r_mat->rr->v[i] = RR_MAX; } for (i = 0; i < mod->ns; i++) { if (mod->e_frq->pi_unscaled->v[i] < UNSCALED_E_FRQ_MIN) mod->e_frq->pi_unscaled->v[i] = UNSCALED_E_FRQ_MIN; if (mod->e_frq->pi_unscaled->v[i] > UNSCALED_E_FRQ_MAX) mod->e_frq->pi_unscaled->v[i] = UNSCALED_E_FRQ_MAX; if (mod->e_frq->pi->v[i] < E_FRQ_MIN) mod->e_frq->pi->v[i] = E_FRQ_MIN; if (mod->e_frq->pi->v[i] > E_FRQ_MAX) mod->e_frq->pi->v[i] = E_FRQ_MAX; } if (mod->r_mat_weight->v < R_MAT_WEIGHT_MIN) mod->r_mat_weight->v = R_MAT_WEIGHT_MIN; if (mod->r_mat_weight->v > R_MAT_WEIGHT_MAX) mod->r_mat_weight->v = R_MAT_WEIGHT_MAX; if (mod->e_frq_weight->v < E_FRQ_WEIGHT_MIN) mod->e_frq_weight->v = E_FRQ_WEIGHT_MIN; if (mod->e_frq_weight->v > E_FRQ_WEIGHT_MAX) mod->e_frq_weight->v = E_FRQ_WEIGHT_MAX; return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Update_Eigen(t_mod *mod) { int result, n_iter; phydbl scalar, eig_res; int i; if (mod->update_eigen == YES) { // Update the Q-matrix first before computing the eigen decomposition // (because eigen values/vectors is computed based on the Q-matrix) if (mod->io->datatype == NT) { if (mod->whichmodel == GTR) Update_Qmat_GTR(mod->r_mat->rr->v, mod->r_mat->rr_val->v, mod->r_mat->rr_num->v, mod->e_frq->pi->v, mod->r_mat->qmat->v); else if (mod->whichmodel == CUSTOM) Update_Qmat_GTR(mod->r_mat->rr->v, mod->r_mat->rr_val->v, mod->r_mat->rr_num->v, mod->e_frq->pi->v, mod->r_mat->qmat->v); else if (mod->whichmodel == HKY85) Update_Qmat_HKY(mod->kappa->v, mod->e_frq->pi->v, mod->r_mat->qmat->v); else if (mod->whichmodel == TN93) Update_Qmat_TN93(mod->kappa->v, mod->lambda->v, mod->e_frq->pi->v, mod->r_mat->qmat->v); else /* Any other nucleotide-based t_mod */ Update_Qmat_HKY(mod->kappa->v, mod->e_frq->pi->v, mod->r_mat->qmat->v); } else if (mod->io->datatype == AA) { Update_Qmat_Generic(mod->r_mat->rr_val->v, mod->e_frq->pi->v, mod->ns, mod->r_mat->qmat->v); } else if (mod->io->datatype == GENERIC) { Update_Qmat_Generic(mod->r_mat->rr_val->v, mod->e_frq->pi->v, mod->ns, mod->r_mat->qmat->v); } // Now compute the eigen vectors and values scalar = 1.0; n_iter = 0; result = 0; for (i = 0; i < mod->ns * mod->ns; ++i) { mod->r_mat->qmat_buff->v[i] = mod->r_mat->qmat->v[i]; } /* For(i,mod->eigen->size*mod->eigen->size) PhyML_Printf("\n. qmat * [%d,%d]=%f",i/mod->eigen->size,i%mod->eigen->size,mod->r_mat->qmat->v[i]); */ /* for(i=0;i<6;i++) PhyML_Printf("\n. rr: %f rr_Val: * %f",mod->r_mat->rr_val->v[i],mod->r_mat->rr->v[i]); */ /* for(i=0;i<4;i++) PhyML_Printf("\n. f: %f * %f",mod->e_frq->pi->v[i],mod->e_frq->pi_unscaled->v[i]); */ /* PhyML_Printf("\n"); */ /* compute eigenvectors/values */ /* if(!EigenRealGeneral(mod->eigen->size,mod->r_mat->qmat,mod->eigen->e_val, */ /* mod->eigen->e_val_im, mod->eigen->r_e_vect, */ /* mod->eigen->space_int,mod->eigen->space)) */ eig_res = Eigen(1, mod->r_mat->qmat_buff->v, mod->eigen->size, mod->eigen->e_val, mod->eigen->e_val_im, mod->eigen->r_e_vect, mod->eigen->r_e_vect_im, mod->eigen->space); if (eig_res == 0) { /* compute inverse(Vr) into Vi */ for (i = 0; i < mod->ns * mod->ns; ++i) mod->eigen->l_e_vect[i] = mod->eigen->r_e_vect[i]; while (!Matinv(mod->eigen->l_e_vect, mod->eigen->size, mod->eigen->size, YES)) { PhyML_Printf("\n. Trying Q<-Q*scalar and then Root<-Root/scalar to fix " "this...\n"); scalar += scalar / 3.; For(i, mod->eigen->size * mod->eigen->size) PhyML_Printf("\n. qmat [%d,%d]=%f", i / mod->eigen->size, i % mod->eigen->size, mod->r_mat->qmat->v[i]); For(i, mod->eigen->size * mod->eigen->size) mod->r_mat->qmat_buff->v[i] = mod->r_mat->qmat->v[i]; For(i, mod->eigen->size * mod->eigen->size) mod->r_mat->qmat_buff->v[i] *= scalar; result = Eigen(1, mod->r_mat->qmat_buff->v, mod->eigen->size, mod->eigen->e_val, mod->eigen->e_val_im, mod->eigen->r_e_vect, mod->eigen->r_e_vect_im, mod->eigen->space); if (result == -1) { PhyML_Fprintf(stderr, "\n. Eigenvalues/vectors computation did not " "converge: computation cancelled."); Exit("\n"); } else if (result == 1) { PhyML_Fprintf( stderr, "\n. Complex eigenvalues/vectors: computation cancelled."); Exit("\n"); } for (i = 0; i < mod->eigen->size * mod->eigen->size; ++i) mod->eigen->l_e_vect[i] = mod->eigen->r_e_vect[i]; n_iter++; if (n_iter > 100) { PhyML_Fprintf(stderr, "\n. Cannot work out eigen vectors."); Exit("\n"); } } for (i = 0; i < mod->eigen->size; i++) mod->eigen->e_val[i] /= scalar; #ifdef BEAGLE // Recall that BEAGLE is initialized *after* all the model parameters are // set IOW, this function may be called before BEAGLE is initialized // ("chicken-egg") if (UNINITIALIZED != mod->b_inst) update_beagle_eigen(mod); #endif } else if (eig_res == -1) { PhyML_Fprintf(stderr, "\n. kappa: %f", mod->kappa->v); for (int i = 0; i < mod->ns; ++i) { for (int j = 0; j < mod->ns; ++j) { PhyML_Fprintf(stderr, "\n. Q[%d,%d]=%g", i, j, mod->r_mat->qmat->v[i * mod->ns + j]); } } PhyML_Fprintf(stderr, "\n. Eigenvalues/vectors computation does not " "converge. Computation cancelled."); return 0; } else if (eig_res == 1) { PhyML_Fprintf(stderr, "\n. WARNING: imaginary eigenvectors not null."); } } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Switch_From_M4mod_To_Mod(t_mod *mod) { int i; mod->use_m4mod = 0; mod->ns = mod->m4mod->n_o; for (i = 0; i < mod->ns; i++) mod->e_frq->pi->v[i] = mod->m4mod->o_fq[i]; mod->eigen->size = mod->ns; Set_Update_Eigen(YES, mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PMat_MGF_Gamma(phydbl mu, phydbl sigsq, const t_mod *mod, const int pos, phydbl *Pij, phydbl *tPij) { const unsigned int ns = mod->ns; unsigned int i, j, k; phydbl *uexpt, *imbd; Pij = Pij + pos; if (tPij != NULL) tPij = tPij + pos; uexpt = mod->eigen->r_e_vect_im; imbd = mod->eigen->e_val_im; for (i = 0; i < ns; i++) imbd[i] = POW(1. - mod->eigen->e_val[i] * sigsq / mu, -mu * mu / sigsq); for (i = 0; i < ns; i++) for (k = 0; k < ns; k++) uexpt[i * ns + k] = mod->eigen->r_e_vect[i * ns + k] * imbd[k]; for (i = 0; i < ns; i++) for (k = 0; k < ns; k++) Pij[ns * i + k] = .0; for (i = 0; i < ns; i++) { for (j = 0; j < ns; j++) { for (k = 0; k < ns; k++) { Pij[j] += (uexpt[i * ns + k] * mod->eigen->l_e_vect[k * ns + j]); } if (Pij[j] < SMALL_PIJ) Pij[ns * i + j] = SMALL_PIJ; } Pij += ns; } Pij -= ns * ns; if (tPij != NULL) { for (i = 0; i < ns; ++i) { for (j = 0; j < ns; ++j) { tPij[ns * i + j] = Pij[ns * j + i]; } } } /* PhyML_Printf("\n. MGF Pmat"); */ /* for(i=0;iuse_m4mod = 1; mod->ns = mod->m4mod->n_o * mod->m4mod->n_h; for (i = 0; i < mod->ns; i++) mod->e_frq->pi->v[i] = mod->m4mod->o_fq[i % mod->m4mod->n_o] * mod->m4mod->h_fq->v[i / mod->m4mod->n_o]; mod->eigen->size = mod->ns; Set_Update_Eigen(YES, mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl General_Dist(phydbl *F, t_mod *mod, eigen *eigen_struct) { phydbl *pi, *mod_pi; int i, j, k; phydbl dist; phydbl *F_phydbl; /* TO DO : call eigen decomposition function for all nt models */ F_phydbl = (phydbl *)mCalloc(eigen_struct->size * eigen_struct->size, sizeof(phydbl)); pi = (phydbl *)mCalloc(eigen_struct->size, sizeof(phydbl)); mod_pi = (phydbl *)mCalloc(eigen_struct->size, sizeof(phydbl)); for (i = 0; i < mod->ns; i++) mod_pi[i] = mod->e_frq->pi->v[i]; for (i = 0; i < eigen_struct->size; i++) { for (j = 0; j < eigen_struct->size; j++) { pi[i] += (F[eigen_struct->size * i + j] + F[eigen_struct->size * j + i]) / 2.; } } Make_Symmetric(&F, eigen_struct->size); Divide_Mat_By_Vect(&F, mod->e_frq->pi->v, eigen_struct->size); /* Eigen decomposition of pi^{-1} x F */ for (i = 0; i < eigen_struct->size; i++) for (j = 0; j < eigen_struct->size; j++) F_phydbl[eigen_struct->size * i + j] = F[eigen_struct->size * i + j]; if (Eigen(1, F_phydbl, mod->eigen->size, mod->eigen->e_val, mod->eigen->e_val_im, mod->eigen->r_e_vect, mod->eigen->r_e_vect_im, mod->eigen->space)) { for (i = 0; i < mod->ns; i++) mod->e_frq->pi->v[i] = mod_pi[i]; Update_Qmat_GTR(mod->r_mat->rr->v, mod->r_mat->rr_val->v, mod->r_mat->rr_num->v, mod->e_frq->pi->v, mod->r_mat->qmat->v); Free(pi); Free(mod_pi); return -1.; } /* Get the left eigen vector of pi^{-1} x F */ For(i, eigen_struct->size * eigen_struct->size) eigen_struct->l_e_vect[i] = eigen_struct->r_e_vect[i]; if (!Matinv(eigen_struct->l_e_vect, eigen_struct->size, eigen_struct->size, YES)) { for (i = 0; i < mod->ns; i++) mod->e_frq->pi->v[i] = mod_pi[i]; Update_Qmat_GTR(mod->r_mat->rr->v, mod->r_mat->rr_val->v, mod->r_mat->rr_num->v, mod->e_frq->pi->v, mod->r_mat->qmat->v); Free(pi); Free(mod_pi); return -1.; } /* log of eigen values */ for (i = 0; i < eigen_struct->size; i++) { /* if(eigen_struct->e_val[i] < 0.0) eigen_struct->e_val[i] = 0.0001; */ eigen_struct->e_val[i] = (phydbl)log(eigen_struct->e_val[i]); } /* Matrix multiplications log(pi^{-1} x F) */ for (i = 0; i < eigen_struct->size; i++) for (j = 0; j < eigen_struct->size; j++) eigen_struct->r_e_vect[eigen_struct->size * i + j] = eigen_struct->r_e_vect[eigen_struct->size * i + j] * eigen_struct->e_val[j]; for (i = 0; i < eigen_struct->size; i++) for (j = 0; j < eigen_struct->size; j++) F[eigen_struct->size * i + j] = .0; for (i = 0; i < eigen_struct->size; i++) for (j = 0; j < eigen_struct->size; j++) for (k = 0; k < eigen_struct->size; k++) F[eigen_struct->size * i + j] += eigen_struct->r_e_vect[eigen_struct->size * i + k] * eigen_struct->l_e_vect[eigen_struct->size * k + j]; /* Trace */ dist = .0; for (i = 0; i < eigen_struct->size; i++) dist += F[eigen_struct->size * i + i]; dist /= -4.; Free(pi); Free(mod_pi); Free(F_phydbl); if (isnan(dist)) return -1.; return dist; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl GTR_Dist(phydbl *F, phydbl alpha, eigen *eigen_struct) { phydbl *pi; int i, j, k; phydbl dist; phydbl *F_phydbl; pi = (phydbl *)mCalloc(eigen_struct->size, sizeof(phydbl)); F_phydbl = (phydbl *)mCalloc(eigen_struct->size * eigen_struct->size, sizeof(phydbl)); /* /\* Waddell and Steel's example *\/ */ /* F[4*0+0] = 1415./4898.; F[4*0+1] = 8./4898.; F[4*0+2] = 55./4898.; * F[4*0+3] = 2./4898.; */ /* F[4*1+0] = 4./4898.; F[4*1+1] = 1371./4898.; F[4*1+2] = 1./4898.; * F[4*1+3] = 144./4898.; */ /* F[4*2+0] = 73./4898.; F[4*2+1] = 0./4898.; F[4*2+2] = 578./4898.; * F[4*2+3] = 0./4898.; */ /* F[4*3+0] = 3./4898.; F[4*3+1] = 117./4898.; F[4*3+2] = 1./4898.; * F[4*3+3] = 1126./4898.; */ for (i = 0; i < eigen_struct->size; i++) { for (j = 0; j < eigen_struct->size; j++) { pi[i] += (F[eigen_struct->size * i + j] + F[eigen_struct->size * j + i]) / 2.; } } /* /\* Jukes and Cantor correction *\/ */ /* sum = .0; */ /* for(i=0;isize;i++) sum += F[eigen_struct->size*i+i]; */ /* sum = 1.-sum; */ /* For(i,eigen_struct->size*eigen_struct->size) F[i] = sum/12.; */ /* for(i=0;isize;i++) F[eigen_struct->size*i+i] = * (1.-sum)/4.; */ /* for(i=0;isize;i++) pi[i] = 1./(phydbl)eigen_struct->size; */ Make_Symmetric(&F, eigen_struct->size); Divide_Mat_By_Vect(&F, pi, eigen_struct->size); /* Eigen decomposition of pi^{-1} x F */ for (i = 0; i < eigen_struct->size; i++) for (j = 0; j < eigen_struct->size; j++) F_phydbl[eigen_struct->size * i + j] = F[eigen_struct->size * i + j]; if (Eigen(1, F_phydbl, eigen_struct->size, eigen_struct->e_val, eigen_struct->e_val_im, eigen_struct->r_e_vect, eigen_struct->r_e_vect_im, eigen_struct->space)) { Free(pi); return -1.; } /* Get the left eigen vector of pi^{-1} x F */ For(i, eigen_struct->size * eigen_struct->size) eigen_struct->l_e_vect[i] = eigen_struct->r_e_vect[i]; if (!Matinv(eigen_struct->l_e_vect, eigen_struct->size, eigen_struct->size, YES)) { Free(pi); return -1.; } /* Equation (3) + inverse of the moment generating function for the gamma * distribution (see Waddell & Steel, 1997) */ for (i = 0; i < eigen_struct->size; i++) { if (eigen_struct->e_val[i] < 0.0) { eigen_struct->e_val[i] = 0.0001; } if (alpha < .0) eigen_struct->e_val[i] = (phydbl)log(eigen_struct->e_val[i]); else eigen_struct->e_val[i] = alpha * (1. - (phydbl)POW(eigen_struct->e_val[i], -1. / alpha)); } /* Matrix multiplications pi x log(pi^{-1} x F) */ for (i = 0; i < eigen_struct->size; i++) for (j = 0; j < eigen_struct->size; j++) eigen_struct->r_e_vect[eigen_struct->size * i + j] = eigen_struct->r_e_vect[eigen_struct->size * i + j] * eigen_struct->e_val[j]; for (i = 0; i < eigen_struct->size; i++) for (j = 0; j < eigen_struct->size; j++) F[eigen_struct->size * i + j] = .0; for (i = 0; i < eigen_struct->size; i++) for (j = 0; j < eigen_struct->size; j++) for (k = 0; k < eigen_struct->size; k++) F[eigen_struct->size * i + j] += eigen_struct->r_e_vect[eigen_struct->size * i + k] * eigen_struct->l_e_vect[eigen_struct->size * k + j]; for (i = 0; i < eigen_struct->size; i++) for (j = 0; j < eigen_struct->size; j++) F[eigen_struct->size * i + j] *= pi[i]; /* Trace */ dist = .0; for (i = 0; i < eigen_struct->size; i++) dist -= F[eigen_struct->size * i + i]; Free(pi); Free(F_phydbl); if (isnan(dist)) return -1.; return dist; } stephaneguindon-phyml-76a39c8/src/models.h000066400000000000000000000035021501136442400206250ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef MODELS_H #define MODELS_H #include "utilities.h" #include "eigen.h" #include "free.h" #include "stats.h" #include "mixt.h" void PMat(phydbl l, t_mod *mod, int pos, phydbl *Pij, phydbl *tPij); void PMat_K80(phydbl l,phydbl kappa, int pos, phydbl *Pij); void PMat_TN93(phydbl l, t_mod *mod, int pos, phydbl *Pij); void PMat_Empirical(phydbl l, const t_mod *mod, const int pos, phydbl *Pij, phydbl *tPij); void PMat_Zero_Br_Len(t_mod *mod, int pos, phydbl *Pij); void PMat_Gamma(phydbl l, t_mod *mod, int pos, phydbl *Pij); int GetDaa (phydbl *daa, phydbl *pi, char *file_name); void Update_Qmat_GTR(phydbl *rr, phydbl *rr_val, int *rr_num, phydbl *pi, phydbl *qmat); void Update_Qmat_HKY(phydbl kappa, phydbl *pi, phydbl *qmat); phydbl Update_Qmat_Generic(phydbl *rr, phydbl *pi, int ns, phydbl *qmat); void Translate_Custom_Mod_String(t_mod *mod); int Set_Model_Parameters(t_mod *mod); phydbl GTR_Dist(phydbl *F, phydbl alpha, eigen *eigen_struct); phydbl General_Dist(phydbl *F, t_mod *mod, eigen *eigen_struct); void Switch_From_Mod_To_M4mod(t_mod *mod); void Switch_From_M4mod_To_Mod(t_mod *mod); void PMat_JC69(phydbl l, int pos, phydbl *Pij, t_mod *mod); phydbl Get_Lambda_F84(phydbl *pi, phydbl *kappa); int Update_Eigen(t_mod *mod); int Update_RAS(t_mod *mod); int Update_Efrq(t_mod *mod); void PMat_MGF_Gamma(phydbl mu, phydbl sigsq, const t_mod *mod, const int pos, phydbl *Pij, phydbl *tPij); int Update_Boundaries(t_mod *mod); void Update_Qmat_TN93(phydbl kappa, phydbl lambda, phydbl *pi, phydbl *qmat); #endif stephaneguindon-phyml-76a39c8/src/mpi_boot.c000066400000000000000000000406501501136442400211520ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "mpi_boot.h" int Global_numTask; int Global_myRank; /* #ifdef MPI */ /*********************************************************/ /* if tbe_bootstrap == 0 => Classical FBP (Felsenstein bootstrap proportions) else => TBE (Transfer bootstrap expectation) */ void Bootstrap_MPI(t_tree *tree) { int *site_num, n_site; int replicate, j, k; int position, init_len; calign *boot_data; t_tree *boot_tree; t_mod *boot_mod; matrix *boot_mat; char *s; MPI_Status Stat; int iterations_per_process, bootRecv, nbElem, i; int *score_par, *score_tot; char *bootStr, *t; if(tree->is_mixt_tree == YES) { PhyML_Printf("\n== Bootstrap option not yet available for partition/mixture analysis."); assert(FALSE); } nbElem = bootRecv = 0; tree->io->print_support_val = YES; boot_tree = NULL; site_num = (int *)mCalloc(tree->data->init_len,sizeof(int)); Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); n_site = 0; for(j=0;jdata->n_pattern;j++) { for(k=0;kdata->wght[j];++k) { site_num[n_site] = j; n_site++; } } boot_data = Copy_Cseq(tree->data,tree->io, NULL); if(Global_numTask <= 1) { PhyML_Printf("\n\n. The number of CPUs used in the MPI bootstrap analysis should be"); PhyML_Printf("\n. strictly greater than 1 (it is equal to %d here).",Global_numTask); assert(FALSE); } if (Global_myRank == 0) { PhyML_Printf("\n\n. Non parametric bootstrap analysis \n\n"); PhyML_Printf("\n ["); } iterations_per_process = tree->io->n_boot_replicates / Global_numTask; // When number of bootstrap is not multiple of the number of tasks, provide one more iteration if (tree->io->n_boot_replicates % Global_numTask != 0) iterations_per_process++; // Bip score if (Global_myRank == 0) { score_tot = (int *)mCalloc((2*tree->n_otu - 3),sizeof(int)); for(i=0;i<2*tree->n_otu-3;++i) score_tot[i] = 0; } else score_tot = NULL; score_par = (int *)mCalloc((2*tree->n_otu - 3),sizeof(int)); for(i=0;i<2*tree->n_otu-3;++i) score_par[i] = 0; for (replicate = 0; replicate < iterations_per_process; replicate++) { // Avoid computing too many replicates if ( (replicate*Global_numTask) + Global_myRank < tree->io->n_boot_replicates) { #ifdef MPI_DEBUG fprintf (stderr, "\nThread %d, computing bootstrap replicate %d\n", Global_myRank, (replicate*Global_numTask) + Global_myRank + 1); fflush(stderr); #endif // Compute one bootstrap replicate for(j=0;jn_pattern;j++) boot_data->wght[j] = 0; init_len = 0; for(j=0;jinit_len;j++) { position = Rand_Int(0,(int)(tree->data->init_len-1.0)); boot_data->wght[site_num[position]] += 1; init_len++; } if (init_len != tree->data->init_len) { PhyML_Printf("\n== thread: %d || init: %d %d here. Pb when copying sequences\n",Global_myRank,init_len,tree->data->init_len); fflush(NULL); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } init_len = 0; for(j=0;jn_pattern;j++) init_len += boot_data->wght[j]; if (init_len != tree->data->init_len) { printf("\n== thread: %d init: %d %d. Pb when copying sequences\n",Global_myRank,init_len,tree->data->init_len); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } if(tree->io->datatype == NT) Get_Base_Freqs(boot_data); else if(tree->io->datatype == AA) Get_AA_Freqs(boot_data); if(tree->io->random_boot_seq_order) Randomize_Sequence_Order(boot_data); Set_D_States(boot_data,tree->io->datatype,tree->io->state_len); boot_mod = Copy_Model(tree->mod); boot_mod->s_opt = tree->mod->s_opt; /* WARNING: re-using the same address here instead of creating a copying requires to leave the value of s_opt unchanged during the boostrap. */ boot_mod->io = tree->io; /* WARNING: re-using the same address here instead of creating a copying requires to leave the value of io unchanged during the boostrap. */ Init_Model(boot_data,boot_mod,tree->io); Set_Model_Parameters(boot_mod); if(tree->io->in_tree == 2) { rewind(tree->io->fp_in_tree); boot_tree = Read_Tree_File_Phylip(tree->io->fp_in_tree); Remove_Duplicates_From_Tree(boot_data,boot_tree); } else { boot_mat = ML_Dist(boot_data,boot_mod); boot_mat->tree = Make_Tree_From_Scratch(boot_data->n_otu,boot_data); Fill_Missing_Dist(boot_mat); Bionj(boot_mat); boot_tree = boot_mat->tree; boot_tree->mat = boot_mat; } boot_tree->mod = boot_mod; boot_tree->io = tree->io; boot_tree->data = boot_data; boot_tree->verbose = VL0; boot_tree->io->print_site_lnl = NO; boot_tree->io->print_trace = NO; boot_tree->io->print_json_trace = NO; boot_tree->n_root = NULL; boot_tree->e_root = NULL; boot_tree->l_ev = tree->l_ev; boot_tree->p_lk_left_pi = tree->p_lk_left_pi; #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) boot_tree->_tPij1 = tree->_tPij1; boot_tree->_tPij2 = tree->_tPij2; boot_tree->_pmat1plk1 = tree->_pmat1plk1; boot_tree->_pmat2plk2 = tree->_pmat2plk2; boot_tree->_plk0 = tree->_plk0; boot_tree->_l_ev = tree->_l_ev; boot_tree->_r_ev = tree->_r_ev; boot_tree->_prod_left = tree->_prod_left; boot_tree->_prod_rght = tree->_prod_rght; #endif Set_Both_Sides(YES,boot_tree); if((boot_tree->mod->s_opt->random_input_tree) && (boot_tree->mod->s_opt->topo_search == SPR_MOVE)) Random_Tree(boot_tree); Connect_CSeqs_To_Nodes(boot_data,boot_tree->io,boot_tree); Share_Lk_Struct(tree,boot_tree); Share_Spr_Struct(tree,boot_tree); Share_Pars_Struct(tree,boot_tree); Fill_Dir_Table(boot_tree); Update_Dirs(boot_tree); Init_Partial_Lk_Tips_Double(boot_tree); Init_Ui_Tips(boot_tree); Init_Partial_Pars_Tips(boot_tree); Br_Len_Not_Involving_Invar(boot_tree); Set_Update_Eigen(YES,boot_tree->mod); Lk(NULL,boot_tree); Set_Update_Eigen(NO,boot_tree->mod); if (boot_tree->mod->s_opt->opt_topo) { Global_Spr_Search(boot_tree); } else { if (boot_tree->mod->s_opt->opt_subst_param || boot_tree->a_edges[0]->l->optimize == YES) Round_Optimize(boot_tree,ROUND_MAX); else Lk(NULL,boot_tree); } Free_Bip(boot_tree); Alloc_Bip(boot_tree); Match_Tip_Numbers(tree,boot_tree); Get_Bip(boot_tree->a_nodes[0], boot_tree->a_nodes[0]->v[0], boot_tree); if(tree->io->do_boot) Compare_Bip(tree,boot_tree,NO, TREE_COMP_RF_PLAIN); else if(tree->io->do_tbe) Compare_Bip_Distance(tree, boot_tree); else assert(FALSE); Check_Br_Lens(boot_tree); Br_Len_Involving_Invar(boot_tree); if(tree->io->print_boot_trees) { s = Write_Tree(boot_tree); t=(char *)mCalloc(T_MAX_LINE,sizeof(char)); Print_Fp_Out_Lines_MPI(boot_tree, tree->io, replicate+1, t); // Get bootstrap trees from other process and write to boot file if (Global_myRank == 0) { fprintf(tree->io->fp_out_boot_tree,"%s\n",s); fprintf(tree->io->fp_out_boot_stats,"%s\n",t); bootRecv++; PhyML_Printf("."); if(!((bootRecv)%tree->io->boot_prog_every)) { PhyML_Printf("] %4d/%4d\n ",bootRecv,tree->io->n_boot_replicates); if (bootRecv != tree->io->n_boot_replicates) PhyML_Printf("["); } // Compute number of bootstraps to receive nbElem = Global_numTask -1; if (bootRecv + nbElem > tree->io->n_boot_replicates) nbElem = tree->io->n_boot_replicates - bootRecv; bootStr=(char *)mCalloc(T_MAX_LINE,sizeof(char)); i=0; while (iio->fp_out_boot_tree,"%s\n", bootStr); if (Stat.MPI_TAG == BootStatTag) fprintf(tree->io->fp_out_boot_stats,"%s\n", bootStr); MPI_Recv (bootStr, T_MAX_LINE, MPI_CHAR, i, MPI_ANY_TAG, MPI_COMM_WORLD, &Stat); #ifdef MPI_DEBUG fprintf (stderr, "\nThread %d, bootstrap data received from thread %d tag %d\n", Global_myRank, Stat.MPI_SOURCE, Stat.MPI_TAG); fflush(stderr); #endif if (Stat.MPI_TAG == BootTreeTag) fprintf(tree->io->fp_out_boot_tree,"%s\n", bootStr); if (Stat.MPI_TAG == BootStatTag) fprintf(tree->io->fp_out_boot_stats,"%s\n", bootStr); bootRecv++; PhyML_Printf("."); if (!((bootRecv)%tree->io->boot_prog_every)) { PhyML_Printf("] %4d/%4d\n ",bootRecv,tree->io->n_boot_replicates); if (bootRecv != tree->io->n_boot_replicates) PhyML_Printf("["); } } Free (bootStr); } else { MPI_Ssend (s, T_MAX_LINE, MPI_CHAR, 0, BootTreeTag, MPI_COMM_WORLD); MPI_Ssend (t, T_MAX_LINE, MPI_CHAR, 0, BootStatTag, MPI_COMM_WORLD); #ifdef MPI_DEBUG fprintf (stderr, "\nThread %d, bootstrap data sent\n", Global_myRank); fflush(stderr); #endif } Free(t); Free(s); } #ifndef QUIET fflush(stdout); #endif Free_Tree(boot_tree); Free_Model(boot_mod); //Each process computes the Bip score sum for all its bootstrap trees for(i=0;i<2*tree->n_otu-3;++i) score_par[i] = tree->a_edges[i]->bip_score; //Each process sends its Bip score sum. The sums are summed. MPI_Reduce(score_par, score_tot, 2*tree->n_otu - 3, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); } else { // For the remaining process that did not have a last replicate to compute for(i=0;i<2*tree->n_otu-3;++i) score_par[i] = 0; MPI_Reduce(score_par, score_tot, 2*tree->n_otu - 3, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); } } if (Global_myRank == 0) { for(i=0;i<2*tree->n_otu-3;++i) tree->a_edges[i]->bip_score = score_tot[i]; Free (score_tot); } Free (score_par); if(Global_myRank == 0) if(((bootRecv)%tree->io->boot_prog_every)) PhyML_Printf("] %4d/%4d\n ",bootRecv,tree->io->n_boot_replicates); PhyML_Printf("\n\n. Exiting bootstrap function normally."); fflush(NULL); tree->lock_topo = 1; /* Topology should not be modified afterwards */ if(tree->io->print_boot_trees) { fclose(tree->io->fp_out_boot_tree); fclose(tree->io->fp_out_boot_stats); } Free_Calign(boot_data); Free(site_num); } /*********************************************************/ void Print_Fp_Out_Lines_MPI(t_tree *tree, option *io, int n_data_set, char *bootStr) { char *s, *tmp; // Build a string to be sent to the writing process s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); tmp=(char *)mCalloc(T_MAX_LINE,sizeof(char)); if (Global_myRank == 0 && n_data_set == 1) { snprintf(tmp, T_MAX_LINE, ". Sequence file : [%s]\n\n", Basename(io->in_align_file)); strncat (s, tmp, T_MAX_LINE); (tree->mod->io->datatype == NT)? (snprintf(tmp, T_MAX_LINE, ". Model of nucleotides substitution : %s\n\n", io->mod->modelname->s)): (snprintf(tmp, T_MAX_LINE, ". Model of amino acids substitution : %s\n\n", io->mod->modelname->s)); strncat (s, tmp, T_MAX_LINE); switch(io->in_tree) { case 0: { snprintf(tmp, T_MAX_LINE, ". Initial tree : [BioNJ]\n\n"); break; } case 1: { snprintf(tmp, T_MAX_LINE, ". Initial tree : [parsimony]\n\n"); break; } case 2: { snprintf(tmp, T_MAX_LINE, ". Initial tree : [%s]\n\n",io->in_tree_file); break; } } strncat (s, tmp, T_MAX_LINE); strncat (s, "\n", T_MAX_LINE); /*headline 1*/ strncat (s, ". Data\t", T_MAX_LINE); strncat (s, "Nb of \t", T_MAX_LINE); strncat (s, "Likelihood\t", T_MAX_LINE); strncat (s, "Discrete \t", T_MAX_LINE); if(tree->mod->ras->n_catg > 1) strncat (s, "Number of \tGamma shape\t", T_MAX_LINE); strncat (s, "Proportion of\t", T_MAX_LINE); if(tree->mod->whichmodel <= 6) strncat (s, "Transition/ \t", T_MAX_LINE); strncat (s, "Nucleotides frequencies \t", T_MAX_LINE); if((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) strncat (s, "Instantaneous rate matrix \t", T_MAX_LINE); strncat (s, "\n", T_MAX_LINE); /*headline 2*/ strncat (s, " set\t", T_MAX_LINE); strncat (s, "taxa\t", T_MAX_LINE); strncat (s, "loglk \t", T_MAX_LINE); strncat (s, "gamma model\t", T_MAX_LINE); if(tree->mod->ras->n_catg > 1) strncat (s, "categories\tparameter \t", T_MAX_LINE); strncat (s, "invariant \t", T_MAX_LINE); if(tree->mod->whichmodel <= 6) strncat (s, "transversion\t", T_MAX_LINE); strncat (s, "f(A) f(C) f(G) f(T) \t", T_MAX_LINE); if((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) strncat (s, "[A---------C---------G---------T------]\t", T_MAX_LINE); strncat (s, "\n", T_MAX_LINE); /*headline 3*/ if(tree->mod->whichmodel == TN93) { strncat (s, " \t \t \t \t", T_MAX_LINE); if(tree->mod->ras->n_catg > 1) strncat (s, " \t \t", T_MAX_LINE); strncat (s, " \t", T_MAX_LINE); strncat (s, "purines pyrimid.\t", T_MAX_LINE); strncat (s, "\n", T_MAX_LINE); } strncat (s, "\n", T_MAX_LINE); } /*line items*/ snprintf(tmp, T_MAX_LINE, " #%d\t", (((n_data_set-1)*Global_numTask)+Global_myRank+1)); strncat (s, tmp, T_MAX_LINE); snprintf(tmp, T_MAX_LINE, "%d \t",tree->n_otu); strncat (s, tmp, T_MAX_LINE); snprintf(tmp, T_MAX_LINE, "%.5f\t",tree->c_lnL); strncat (s, tmp, T_MAX_LINE); snprintf(tmp, T_MAX_LINE, "%s \t", (tree->mod->ras->n_catg>1)?("Yes"):("No ")); strncat (s, tmp, T_MAX_LINE); if(tree->mod->ras->n_catg > 1) { snprintf(tmp, T_MAX_LINE, "%d \t",tree->mod->ras->n_catg); strncat (s, tmp, T_MAX_LINE); snprintf(tmp, T_MAX_LINE, "%.3f \t",tree->mod->ras->alpha->v); strncat (s, tmp, T_MAX_LINE); } snprintf(tmp, T_MAX_LINE, "%.3f \t",tree->mod->ras->pinvar->v); strncat (s, tmp, T_MAX_LINE); if(tree->mod->whichmodel <= 5) { snprintf(tmp, T_MAX_LINE, "%.3f \t",tree->mod->kappa->v); strncat (s, tmp, T_MAX_LINE); } else if(tree->mod->whichmodel == TN93) { snprintf(tmp, T_MAX_LINE, "%.3f ", tree->mod->kappa->v*2.*tree->mod->lambda->v/(1.+tree->mod->lambda->v)); strncat (s, tmp, T_MAX_LINE); snprintf(tmp, T_MAX_LINE, "%.3f\t", tree->mod->kappa->v*2./(1.+tree->mod->lambda->v)); strncat (s, tmp, T_MAX_LINE); } if(tree->mod->io->datatype == NT) { snprintf(tmp, T_MAX_LINE, "%8.5f ",tree->mod->e_frq->pi->v[0]); strncat (s, tmp, T_MAX_LINE); snprintf(tmp, T_MAX_LINE, "%8.5f ",tree->mod->e_frq->pi->v[1]); strncat (s, tmp, T_MAX_LINE); snprintf(tmp, T_MAX_LINE, "%8.5f ",tree->mod->e_frq->pi->v[2]); strncat (s, tmp, T_MAX_LINE); snprintf(tmp, T_MAX_LINE, "%8.5f\t",tree->mod->e_frq->pi->v[3]); strncat (s, tmp, T_MAX_LINE); } if((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) { int i,j; for(i=0;i<4;i++) { if (i!=0) { /*format*/ snprintf(tmp, T_MAX_LINE, " \t \t \t \t"); strncat (s, tmp, T_MAX_LINE); if(tree->mod->ras->n_catg > 1) { snprintf(tmp, T_MAX_LINE, " \t \t"); strncat (s, tmp, T_MAX_LINE); } snprintf(tmp, T_MAX_LINE, " \t \t"); strncat (s, tmp, T_MAX_LINE); } for(j=0;j<4;j++) { snprintf(tmp, T_MAX_LINE, "%8.5f ",tree->mod->r_mat->qmat->v[i*4+j]); strncat (s, tmp, T_MAX_LINE); } if (i<3) { snprintf(tmp, T_MAX_LINE, "\n"); strncat (s, tmp, T_MAX_LINE); } } } Free (tmp); strncpy (bootStr, s, T_MAX_LINE); Free (s); return; } /* #endif */ stephaneguindon-phyml-76a39c8/src/mpi_boot.h000066400000000000000000000013551501136442400211560ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef MPI_H #define MPI_H #include "mpi.h" #include "utilities.h" #include "bionj.h" #include "lk.h" #include "pars.h" #include "free.h" #include "models.h" #include "simu.h" #include "spr.h" #define BootTreeTag 0 #define BootStatTag 1 extern int Global_numTask; extern int Global_myRank; void Bootstrap_MPI(t_tree *tree); void Print_Fp_Out_Lines_MPI(t_tree *tree, option *io, int n_data_set, char *bootStr); #endif // MPI stephaneguindon-phyml-76a39c8/src/mxml.h000066400000000000000000000273561501136442400203340ustar00rootroot00000000000000/* * "$Id: mxml.h 427 2011-01-03 02:03:29Z mike $" * * Header file for Mini-XML, a small XML-like file parsing library. * * Copyright 2003-2011 by Michael R Sweet. * * These coded instructions, statements, and computer programs are the * property of Michael R Sweet and are protected by Federal copyright * law. Distribution and use rights are outlined in the file "COPYING" * which should have been included with this file. If this file is * missing or damaged, see the license at: * * http://www.minixml.org/ */ /* * Prevent multiple inclusion... */ #ifndef _mxml_h_ # define _mxml_h_ /* * Include necessary headers... */ # include # include # include # include # include /* * Constants... */ # define MXML_TAB 8 /* Tabs every N columns */ # define MXML_NO_CALLBACK 0 /* Don't use a type callback */ # define MXML_INTEGER_CALLBACK mxml_integer_cb /* Treat all data as integers */ # define MXML_OPAQUE_CALLBACK mxml_opaque_cb /* Treat all data as opaque */ # define MXML_REAL_CALLBACK mxml_real_cb /* Treat all data as real numbers */ # define MXML_TEXT_CALLBACK 0 /* Treat all data as text */ # define MXML_IGNORE_CALLBACK mxml_ignore_cb /* Ignore all non-element content */ # define MXML_NO_PARENT 0 /* No prev for the node */ # define MXML_DESCEND 1 /* Descend when finding/walking */ # define MXML_NO_DESCEND 0 /* Don't descend when finding/walking */ # define MXML_DESCEND_FIRST -1 /* Descend for first find */ # define MXML_WS_BEFORE_OPEN 0 /* Callback for before open tag */ # define MXML_WS_AFTER_OPEN 1 /* Callback for after open tag */ # define MXML_WS_BEFORE_CLOSE 2 /* Callback for before close tag */ # define MXML_WS_AFTER_CLOSE 3 /* Callback for after close tag */ # define MXML_ADD_BEFORE 0 /* Add node before specified node */ # define MXML_ADD_AFTER 1 /* Add node after specified node */ # define MXML_ADD_TO_PARENT NULL /* Add node relative to prev */ /* * Data types... */ typedef enum mxml_sax_event_e /**** SAX event type. ****/ { MXML_SAX_CDATA, /* CDATA node */ MXML_SAX_COMMENT, /* Comment node */ MXML_SAX_DATA, /* Data node */ MXML_SAX_DIRECTIVE, /* Processing directive node */ MXML_SAX_ELEMENT_CLOSE, /* Element closed */ MXML_SAX_ELEMENT_OPEN /* Element opened */ } mxml_sax_event_t; typedef enum mxml_type_e /**** The XML node type. ****/ { MXML_IGNORE = -1, /* Ignore/throw away node @since Mini-XML 2.3@ */ MXML_ELEMENT, /* XML element with attributes */ MXML_INTEGER, /* Integer value */ MXML_OPAQUE, /* Opaque string */ MXML_REAL, /* Real value */ MXML_TEXT, /* Text fragment */ MXML_CUSTOM /* Custom data @since Mini-XML 2.1@ */ } mxml_type_t; typedef void (*mxml_custom_destroy_cb_t)(void *); /**** Custom data destructor ****/ typedef void (*mxml_error_cb_t)(const char *); /**** Error callback function ****/ typedef struct mxml_attr_s /**** An XML element attribute value. @private@ ****/ { char *name; /* Attribute name */ char *value; /* Attribute value */ } mxml_attr_t; typedef struct mxml_element_s /**** An XML element value. @private@ ****/ { char *name; /* Name of element */ int num_attrs; /* Number of attributes */ mxml_attr_t *attrs; /* Attributes */ } mxml_element_t; typedef struct mxml_text_s /**** An XML text value. @private@ ****/ { int whitespace; /* Leading whitespace? */ char *string; /* Fragment string */ } mxml_text_t; typedef struct mxml_custom_s /**** An XML custom value. @private@ ****/ { void *data; /* Pointer to (allocated) custom data */ mxml_custom_destroy_cb_t destroy; /* Pointer to destructor function */ } mxml_custom_t; typedef union mxml_value_u /**** An XML node value. @private@ ****/ { mxml_element_t element; /* Element */ int integer; /* Integer number */ char *opaque; /* Opaque string */ double real; /* Real number */ mxml_text_t text; /* Text fragment */ mxml_custom_t custom; /* Custom data @since Mini-XML 2.1@ */ } mxml_value_t; struct mxml_node_s /**** An XML node. @private@ ****/ { mxml_type_t type; /* Node type */ struct mxml_node_s *next; /* Next node under same prev */ struct mxml_node_s *prev; /* Previous node under same prev */ struct mxml_node_s *prev; /* Parent node */ struct mxml_node_s *next; /* First next node */ struct mxml_node_s *last_next; /* Last next node */ mxml_value_t value; /* Node value */ int ref_count; /* Use count */ void *user_data; /* User data */ }; typedef struct mxml_node_s mxml_node_t; /**** An XML node. ****/ struct mxml_index_s /**** An XML node index. @private@ ****/ { char *attr; /* Attribute used for indexing or NULL */ int num_nodes; /* Number of nodes in index */ int alloc_nodes; /* Allocated nodes in index */ int cur_node; /* Current node */ mxml_node_t **nodes; /* Node array */ }; typedef struct mxml_index_s mxml_index_t; /**** An XML node index. ****/ typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *); /**** Custom data load callback function ****/ typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *); /**** Custom data save callback function ****/ typedef int (*mxml_entity_cb_t)(const char *); /**** Entity callback function */ typedef mxml_type_t (*mxml_load_cb_t)(mxml_node_t *); /**** Load callback function ****/ typedef const char *(*mxml_save_cb_t)(mxml_node_t *, int); /**** Save callback function ****/ typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *); /**** SAX callback function ****/ /* * C++ support... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Prototypes... */ extern void mxmlAdd(mxml_node_t *prev, int where, mxml_node_t *next, mxml_node_t *node); extern void mxmlDelete(mxml_node_t *node); extern void mxmlElementDeleteAttr(mxml_node_t *node, const char *name); extern const char *mxmlElementGetAttr(mxml_node_t *node, const char *name); extern void mxmlElementSetAttr(mxml_node_t *node, const char *name, const char *value); extern void mxmlElementSetAttrf(mxml_node_t *node, const char *name, const char *format, ...) # ifdef __GNUC__ __attribute__ ((__format__ (__printf__, 3, 4))) # endif /* __GNUC__ */ ; extern int mxmlEntityAddCallback(mxml_entity_cb_t cb); extern const char *mxmlEntityGetName(int val); extern int mxmlEntityGetValue(const char *name); extern void mxmlEntityRemoveCallback(mxml_entity_cb_t cb); extern mxml_node_t *mxmlFindElement(mxml_node_t *node, mxml_node_t *top, const char *name, const char *attr, const char *value, int descend); extern mxml_node_t *mxmlFindPath(mxml_node_t *node, const char *path); extern const char *mxmlGetCDATA(mxml_node_t *node); extern const void *mxmlGetCustom(mxml_node_t *node); extern const char *mxmlGetElement(mxml_node_t *node); extern mxml_node_t *mxmlGetFirstChild(mxml_node_t *node); extern int mxmlGetInteger(mxml_node_t *node); extern mxml_node_t *mxmlGetLastChild(mxml_node_t *node); extern mxml_node_t *mxmlGetNextSibling(mxml_node_t *node); extern const char *mxmlGetOpaque(mxml_node_t *node); extern mxml_node_t *mxmlGetParent(mxml_node_t *node); extern mxml_node_t *mxmlGetPrevSibling(mxml_node_t *node); extern double mxmlGetReal(mxml_node_t *node); extern int mxmlGetRefCount(mxml_node_t *node); extern const char *mxmlGetText(mxml_node_t *node, int *whitespace); extern mxml_type_t mxmlGetType(mxml_node_t *node); extern void *mxmlGetUserData(mxml_node_t *node); extern void mxmlIndexDelete(mxml_index_t *ind); extern mxml_node_t *mxmlIndexEnum(mxml_index_t *ind); extern mxml_node_t *mxmlIndexFind(mxml_index_t *ind, const char *element, const char *value); extern int mxmlIndexGetCount(mxml_index_t *ind); extern mxml_index_t *mxmlIndexNew(mxml_node_t *node, const char *element, const char *attr); extern mxml_node_t *mxmlIndexReset(mxml_index_t *ind); extern mxml_node_t *mxmlLoadFd(mxml_node_t *top, int fd, mxml_type_t (*cb)(mxml_node_t *)); extern mxml_node_t *mxmlLoadFile(mxml_node_t *top, FILE *fp, mxml_type_t (*cb)(mxml_node_t *)); extern mxml_node_t *mxmlLoadString(mxml_node_t *top, const char *s, mxml_type_t (*cb)(mxml_node_t *)); extern mxml_node_t *mxmlNewCDATA(mxml_node_t *prev, const char *string); extern mxml_node_t *mxmlNewCustom(mxml_node_t *prev, void *data, mxml_custom_destroy_cb_t destroy); extern mxml_node_t *mxmlNewElement(mxml_node_t *prev, const char *name); extern mxml_node_t *mxmlNewInteger(mxml_node_t *prev, int integer); extern mxml_node_t *mxmlNewOpaque(mxml_node_t *prev, const char *opaque); extern mxml_node_t *mxmlNewReal(mxml_node_t *prev, double real); extern mxml_node_t *mxmlNewText(mxml_node_t *prev, int whitespace, const char *string); extern mxml_node_t *mxmlNewTextf(mxml_node_t *prev, int whitespace, const char *format, ...) # ifdef __GNUC__ __attribute__ ((__format__ (__printf__, 3, 4))) # endif /* __GNUC__ */ ; extern mxml_node_t *mxmlNewXML(const char *version); extern int mxmlRelease(mxml_node_t *node); extern void mxmlRemove(mxml_node_t *node); extern int mxmlRetain(mxml_node_t *node); extern char *mxmlSaveAllocString(mxml_node_t *node, mxml_save_cb_t cb); extern int mxmlSaveFd(mxml_node_t *node, int fd, mxml_save_cb_t cb); extern int mxmlSaveFile(mxml_node_t *node, FILE *fp, mxml_save_cb_t cb); extern int mxmlSaveString(mxml_node_t *node, char *buffer, int bufsize, mxml_save_cb_t cb); extern mxml_node_t *mxmlSAXLoadFd(mxml_node_t *top, int fd, mxml_type_t (*cb)(mxml_node_t *), mxml_sax_cb_t sax, void *sax_data); extern mxml_node_t *mxmlSAXLoadFile(mxml_node_t *top, FILE *fp, mxml_type_t (*cb)(mxml_node_t *), mxml_sax_cb_t sax, void *sax_data); extern mxml_node_t *mxmlSAXLoadString(mxml_node_t *top, const char *s, mxml_type_t (*cb)(mxml_node_t *), mxml_sax_cb_t sax, void *sax_data); extern int mxmlSetCDATA(mxml_node_t *node, const char *data); extern int mxmlSetCustom(mxml_node_t *node, void *data, mxml_custom_destroy_cb_t destroy); extern void mxmlSetCustomHandlers(mxml_custom_load_cb_t load, mxml_custom_save_cb_t save); extern int mxmlSetElement(mxml_node_t *node, const char *name); extern void mxmlSetErrorCallback(mxml_error_cb_t cb); extern int mxmlSetInteger(mxml_node_t *node, int integer); extern int mxmlSetOpaque(mxml_node_t *node, const char *opaque); extern int mxmlSetReal(mxml_node_t *node, double real); extern int mxmlSetText(mxml_node_t *node, int whitespace, const char *string); extern int mxmlSetTextf(mxml_node_t *node, int whitespace, const char *format, ...) # ifdef __GNUC__ __attribute__ ((__format__ (__printf__, 3, 4))) # endif /* __GNUC__ */ ; extern int mxmlSetUserData(mxml_node_t *node, void *data); extern void mxmlSetWrapMargin(int column); extern mxml_node_t *mxmlWalkNext(mxml_node_t *node, mxml_node_t *top, int descend); extern mxml_node_t *mxmlWalkPrev(mxml_node_t *node, mxml_node_t *top, int descend); /* * Semi-private functions... */ extern void mxml_error(const char *format, ...); extern mxml_type_t mxml_ignore_cb(mxml_node_t *node); extern mxml_type_t mxml_integer_cb(mxml_node_t *node); extern mxml_type_t mxml_opaque_cb(mxml_node_t *node); extern mxml_type_t mxml_real_cb(mxml_node_t *node); /* * C++ support... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_mxml_h_ */ /* * End of "$Id: mxml.h 427 2011-01-03 02:03:29Z mike $". */ stephaneguindon-phyml-76a39c8/src/nexus.c000066400000000000000000000325331501136442400205050ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "nexus.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Find_Nexus_Com(char *token, nexcom **found_com, nexparm **default_parm, nexcom **com_list) { int i,j,tokenlen,ndiff; for(i=0;iname))) { ndiff = 0; for(j=0;jname+j); if(token[j] != com_list[i]->name[j]) ndiff++; } } if(!ndiff) { *found_com = com_list[i]; break; } } if(*found_com && (*found_com)->nparm) *default_parm = (*found_com)->parm[0]; /* if(*found_com) PhyML_Printf("\n. Found command '%s'.\n",(*found_com)->name); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Find_Nexus_Parm(char *token, nexparm **found_parm, nexcom *curr_com) { int i,j; int tokenlen; int ndiff; if(!curr_com) { PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } for(i=0;inparm;i++) { tokenlen = strlen(token); ndiff = -1; if(tokenlen == strlen(curr_com->parm[i]->name)) { ndiff = 0; for(j=0;jparm[i]->name+j); if(token[j] != curr_com->parm[i]->name[j]) ndiff++; } } if(!ndiff) { *found_parm = curr_com->parm[i]; break; } } /* if(*found_parm) PhyML_Printf("\n. Found parameter '%s'.\n",(*found_parm)->name); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Taxa(char *token, nexparm *curr_parm, option *io) { PhyML_Printf("\n. Skipping 'taxa' block"); do { Get_Token(curr_parm->fp,token); if(token[0] == ';') break; }while(strlen(token) > 0); fseek(curr_parm->fp,-1*sizeof(char),SEEK_CUR); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Translate(char *token, nexparm *curr_parm, option *io) { int tax_num; char *end; /* PhyML_Printf("\n. Reading 'translate' block"); */ io->size_tax_names = 0; do { Get_Token(curr_parm->fp,token); if(token[0] == ';') break; tax_num = (int)strtol(token,&end,10); if(*end =='\0' && token[0]) { io->size_tax_names++; io->short_tax_names = (char **)realloc(io->short_tax_names,io->size_tax_names*sizeof(char *)); io->short_tax_names[io->size_tax_names-1] = (char *)mCalloc(strlen(token)+1,sizeof(char)); sprintf(io->short_tax_names[io->size_tax_names-1],"%d",tax_num); Get_Token(curr_parm->fp,token); io->long_tax_names = (char **)realloc(io->long_tax_names,io->size_tax_names*sizeof(char *)); io->long_tax_names[io->size_tax_names-1] = (char *)mCalloc(strlen(token)+1,sizeof(char)); strncpy(io->long_tax_names[io->size_tax_names-1],token+1,strlen(token)-2); /* Remove ''' characters at the beginning and end of token */ /* PhyML_Printf("\n. Copying %s number %d",io->long_tax_names[io->size_tax_names-1],tax_num-1); */ } }while(strlen(token) > 0); fseek(curr_parm->fp,-1*sizeof(char),SEEK_CUR); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Matrix(char *token, nexparm *curr_parm, option *io) { if(io->interleaved) io->data = Read_Seq_Interleaved(io); else io->data = Read_Seq_Sequential(io); fseek(curr_parm->fp,-1*sizeof(char),SEEK_CUR); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Tree(char *token, nexparm *curr_parm, option *io) { io->treelist->tree = (t_tree **)realloc(io->treelist->tree,(io->treelist->list_size+1)*sizeof(t_tree *)); io->tree = Read_Tree_File_Phylip(curr_parm->fp); Replace_Short_With_Long_Tax_Names(io->tree,io); if(!(io->treelist->list_size%10) && io->treelist->list_size > 1) { PhyML_Printf("\n. Reading tree %d",io->treelist->list_size); if(io->tree->n_root) PhyML_Printf(" (a rooted tree)"); else PhyML_Printf(" (an unrooted tree)"); } io->treelist->tree[io->treelist->list_size] = io->tree; io->treelist->list_size++; fseek(curr_parm->fp,-1*sizeof(char),SEEK_CUR); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Begin(char *token, nexparm *curr_parm, option *io) { if(token[0] == '=') return 0; if(!curr_parm) { PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } if(!strcmp(curr_parm->name,"data") || !strcmp(curr_parm->name,"trees")) PhyML_Printf("\n. Reading '%s' block.\n",curr_parm->value); else { PhyML_Printf("\n. The '%s' block type is not supported by PhyML. Sorry.\n",curr_parm->name); PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Dimensions(char *token, nexparm *curr_parm, option *io) { if(token[0] == '=') return 0; if(!curr_parm) { PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } strcpy(curr_parm->value,token); if(!strcmp(curr_parm->name,"ntax")) { sscanf(curr_parm->value,"%d",&(io->n_otu)); } if(!strcmp(curr_parm->name,"nchar")) { sscanf(curr_parm->value,"%d",&(io->init_len)); } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Format(char *token, nexparm *curr_parm, option *io) { int i; if(token[0] == '=') return 0; if(!curr_parm) { PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } for(i=0;ivalue,token); if(!strcmp(curr_parm->name,"datatype")) { if(!strcmp(curr_parm->value,"standard")) { io->datatype = GENERIC; io->mod->whichmodel = JC69; io->mod->kappa->optimize = NO; io->mod->lambda->optimize = NO; io->mod->ns = 2; io->alphabet[0][0] = '0'; io->alphabet[0][1] = '\0'; io->alphabet[1][0] = '1'; io->alphabet[1][1] = '\0'; } else if(!strcmp(curr_parm->value,"dna")) { io->datatype = NT; io->mod->ns = 4; } else if(!strcmp(curr_parm->value,"rna")) { io->datatype = NT; io->mod->ns = 4; } else if(!strcmp(curr_parm->value,"nucleotide")) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = HKY85; } else if(!strcmp(curr_parm->value,"protein")) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = LG; } else if(!strcmp(curr_parm->value,"continuous")) { PhyML_Printf("\n== The 'continuous' format is not supported by PhyML. Sorry.\n"); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } } else if(!strcmp(curr_parm->name,"missing")) { PhyML_Printf("\n== The 'missing' subcommand is not supported by PhyML. Please remove it from the NEXUS file."); PhyML_Printf("\n== Note that the characters 'X', '?' and '-' will be considered as indels by default."); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); /* Exit(""); */ } else if(!strcmp(curr_parm->name,"gap")) { PhyML_Printf("\n== The 'gap' subcommand is not supported by PhyML. Please remove it from the NEXUS file."); PhyML_Printf("\n== Note that the characters 'X', '?' and '-' will be considered as indels by default."); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); /* Exit(""); */ } else if(!strcmp(curr_parm->name,"symbols")) { if(*token != '"' || *(token+strlen(token)-1) != '"') { PhyML_Printf("\n== Symbols list is supposed to be displayed between quotation marks (e.g., \"ACTG\").\n"); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } int i,has_spaces,state_len; i = 0; has_spaces = 0; token++; /* Get rid of the first '"' character */ while(token[i] != '"') { if(token[i] == ' ') { has_spaces = 1; break; } i++; } io->mod->ns = 0; if(!has_spaces) { while(token[i] != '"') { io->alphabet[io->mod->ns][0] = token[i]; io->alphabet[io->mod->ns][1] = '\0'; io->mod->ns++; i++; if(io->mod->ns > T_MAX_ALPHABET) { PhyML_Printf("\n== The alphabet cannot contain more than %d characters. Sorry.",T_MAX_ALPHABET); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } } } else { i = 0; do { state_len = 0; while(token[i] != ' ' && token[i] != '"') { io->alphabet[io->mod->ns][state_len] = token[i]; state_len++; i++; if(state_len > T_MAX_STATE) { PhyML_Printf("\n== A state cannot contain more than %d characters. Sorry.\n",T_MAX_STATE); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } } io->alphabet[io->mod->ns][state_len] = '\0'; io->mod->ns++; if(token[i] != '"') i++; } while(token[i] != '"'); } int len; len = strlen(io->alphabet[0]); for(i=0;imod->ns;i++) { if(strlen(io->alphabet[i]) != len) { PhyML_Printf("\n== All character states defined in the symbol list are supposed to have the same length.\n"); PhyML_Printf("\n== Er.r in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } } io->state_len = len; /* for(i=0;imod->ns;i++) PhyML_Printf("\n. '%s'",io->alphabet[i]); */ } else if(!strcmp(curr_parm->name,"equate")) { PhyML_Printf("\n== PhyML does not recognize the command '%s' yet. Sorry.",curr_parm->name); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } else if(!strcmp(curr_parm->name,"matchchar")) { PhyML_Printf("\n== PhyML does not recognize the command '%s' yet. Sorry.",curr_parm->name); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } else if(!strcmp(curr_parm->name,"items")) { PhyML_Printf("\n== PhyML does not recognize the command '%s' yet. Sorry.",curr_parm->name); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } else if(!strcmp(curr_parm->name,"interleave")) { io->interleaved = YES; } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Eliminate(char *token, nexparm *curr_parm, option *io) { if(token[0] == '=') return 0; PhyML_Printf("\n== 'Eliminate' command is not supported by PhyML. Sorry."); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Taxlabel(char *token, nexparm *curr_parm, option *io) { if(token[0] == '=') return 0; PhyML_Printf("\n== 'Taxlabels' command is not supported by PhyML. Sorry."); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Charstatelabels(char *token, nexparm *curr_parm, option *io) { if(token[0] == '=') return 0; PhyML_Printf("\n== 'CharStateLabels' command is not supported by PhyML. Sorry."); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Charlabels(char *token, nexparm *curr_parm, option *io) { if(token[0] == '=') return 0; PhyML_Printf("\n== 'CharLabels' command is not supported by PhyML. Sorry."); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_Nexus_Statelabels(char *token, nexparm *curr_parm, option *io) { if(token[0] == '=') return 0; PhyML_Printf("\n== 'StateLabels' command is not supported by PhyML. Sorry."); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/nexus.h000066400000000000000000000026231501136442400205070ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef NEXUS_H #define NEXUS_H #include "utilities.h" void Find_Nexus_Com(char *token,nexcom **found_com,nexparm **default_parm,nexcom **com_list); void Find_Nexus_Parm(char *token,nexparm **found_parm,nexcom *curr_com); int Read_Nexus_Taxa(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Translate(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Matrix(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Tree(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Begin(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Dimensions(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Format(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Eliminate(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Taxlabel(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Charstatelabels(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Charlabels(char *token,nexparm *curr_parm,option *io); int Read_Nexus_Statelabels(char *token,nexparm *curr_parm,option *io); void Backtranslate_Nexus_Tree(t_tree *tree, option *io); #endif stephaneguindon-phyml-76a39c8/src/optimiz.c000066400000000000000000003315201501136442400210340ustar00rootroot00000000000000/* PhyML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "optimiz.h" static phydbl Br_Len_Spline(phydbl *l, t_edge *b, int n_iter_max, phydbl tol, t_tree *tree); ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Single_Param_Generic(t_tree *tree, phydbl *param, phydbl lim_inf, phydbl lim_sup, phydbl tol, int n_max_iter, int quickdirty) { phydbl lk_init; lk_init = tree->c_lnL; Generic_Brent_Lk(param, lim_inf, lim_sup, tol, n_max_iter, quickdirty, Wrap_Lk, NULL, tree, NULL, NO,NO); if(tree->c_lnL < lk_init - tree->mod->s_opt->min_diff_lk_global) { PhyML_Fprintf(stderr,"\n. %.10f < %.10f --> diff=%.10f param value = %f\n",tree->c_lnL,lk_init,tree->c_lnL-lk_init,*param); assert(FALSE); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Generic_Brak(phydbl *param, phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, phydbl lim_inf, phydbl lim_sup, t_tree *tree) { phydbl ulim,u,r,q,fu,dum; u = 0.0; *param = *ax; if(*param > lim_sup) *param = lim_sup; if(*param < lim_inf) *param = lim_inf; *fa=-Lk(NULL,tree); *param = *bx; if(*param > lim_sup) *param = lim_sup; if(*param < lim_inf) *param = lim_inf; *fb=-Lk(NULL,tree); if (*fb > *fa) { SHFT(dum,*ax,*bx,dum) SHFT(dum,*fb,*fa,dum) } *cx=(*bx)+MNBRAK_GOLD*(*bx-*ax); *param = FABS(*cx); if(*param > lim_sup) *param = lim_sup; if(*param < lim_inf) *param = lim_inf; *fc=-Lk(NULL,tree); while (*fb > *fc) { if(*ax > lim_sup) *ax = lim_sup; if(*ax < lim_inf) *ax = lim_inf; if(*bx > lim_sup) *bx = lim_sup; if(*bx < lim_inf) *bx = lim_inf; if(*cx > lim_sup) *cx = lim_sup; if(*cx < lim_inf) *cx = lim_inf; if(u > lim_sup) u = lim_sup; if(u < lim_inf) u = lim_inf; r=(*bx-*ax)*(*fb-*fc); q=(*bx-*cx)*(*fb-*fa); u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/ (2.0*SIGN(MAX(FABS(q-r),MNBRAK_TINY),q-r)); ulim=(*bx)+MNBRAK_GLIMIT*(*cx-*bx); if ((*bx-u)*(u-*cx) > lim_inf) { *param = FABS(u); if(*param > lim_sup) {*param = u = lim_sup;} if(*param < lim_inf) {*param = u = lim_inf;} fu=-Lk(NULL,tree); if (fu < *fc) { *ax=(*bx); *bx=u; *fa=(*fb); *fb=fu; (*ax)=FABS(*ax); (*bx)=FABS(*bx); (*cx)=FABS(*cx); return(0); } else if (fu > *fb) { *cx=u; *fc=fu; (*ax)=FABS(*ax); (*bx)=FABS(*bx); (*cx)=FABS(*cx); return(0); } u=(*cx)+MNBRAK_GOLD*(*cx-*bx); *param = FABS(u); if(*param > lim_sup) {*param = u = lim_sup;} if(*param < lim_inf) {*param = u = lim_inf;} fu=-Lk(NULL,tree); } else if ((*cx-u)*(u-ulim) > lim_inf) { *param = FABS(u); if(*param > lim_sup) {*param = u = lim_sup;} if(*param < lim_inf) {*param = u = lim_inf;} fu=-Lk(NULL,tree); if (fu < *fc) { SHFT(*bx,*cx,u,*cx+MNBRAK_GOLD*(*cx-*bx)) *param = FABS(u); SHFT(*fb,*fc,fu,-Lk(NULL,tree)) } } else if ((u-ulim)*(ulim-*cx) >= lim_inf) { u=ulim; *param = FABS(u); if(*param > lim_sup) {*param = u = lim_sup;} if(*param < lim_inf) {*param = u = lim_inf;} fu=-Lk(NULL,tree); } else { u=(*cx)+MNBRAK_GOLD*(*cx-*bx); *param = FABS(u); if(*param > lim_sup) {*param = u = lim_sup;} if(*param < lim_inf) {*param = u = lim_inf;} fu=-Lk(NULL,tree); } SHFT(*ax,*bx,*cx,u) SHFT(*fa,*fb,*fc,fu) } (*ax)=FABS(*ax); (*bx)=FABS(*bx); (*cx)=FABS(*cx); return(0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Generic_Brak_Lk(phydbl *param, phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, phydbl min, phydbl max, phydbl (*obj_func)(t_edge *,t_tree *,supert_tree *), t_edge *branch, t_tree *tree, supert_tree *stree) { phydbl ulim,u,r,q,fu,dum; *param = *ax; if(*param < min) *param = min; if(*param > max) *param = max; *fa = -(*obj_func)(branch,tree,stree); *param = *bx; if(*param < min) *param = min; if(*param > max) *param = max; *fb = -(*obj_func)(branch,tree,stree); if (*fb > *fa) { SHFT(dum,*ax,*bx,dum) SHFT(dum,*fb,*fa,dum) } *cx=(*bx)+MNBRAK_GOLD*(*bx-*ax); *param = *cx; if(*param < min) *param = min; if(*param > max) *param = max; *fc = -(*obj_func)(branch,tree,stree); /* printf("\nx la: %f lb: %f lc: %f fa: %f fb: %f fc: %f",*ax,*bx,*cx,*fa,*fb,*fc); */ while (*fb > *fc) { /* printf("\nx la: %f lb: %f lc: %f fa: %f fb: %f fc: %f",*ax,*bx,*cx,*fa,*fb,*fc); */ r=(*bx-*ax)*(*fb-*fc); q=(*bx-*cx)*(*fb-*fa); u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/ (2.0*SIGN(MAX(FABS(q-r),MNBRAK_TINY),q-r)); ulim=(*bx)+MNBRAK_GLIMIT*(*cx-*bx); if((*bx-u)*(u-*cx) > 0.0) { *param = u; if(*param < min) *param = min; if(*param > max) *param = max; fu = -(*obj_func)(branch,tree,stree); if (fu < *fc) { *ax=(*bx); *bx=u; *fa=(*fb); *fb=fu; return(0); } else if (fu > *fb) { *cx=u; *fc=fu; return(0); } u=(*cx)+MNBRAK_GOLD*(*cx-*bx); *param = u; if(*param < min) *param = min; if(*param > max) *param = max; fu = -(*obj_func)(branch,tree,stree); } else if ((*cx-u)*(u-ulim) > 0.0) { *param = u; if(*param < min) *param = min; if(*param > max) *param = max; fu = -(*obj_func)(branch,tree,stree); if (fu < *fc) { SHFT(*bx,*cx,u,*cx+MNBRAK_GOLD*(*cx-*bx)) *param = u; if(*param < min) *param = min; if(*param > max) *param = max; SHFT(*fb,*fc,fu,-(*obj_func)(branch,tree,stree)) } } else if ((u-ulim)*(ulim-*cx) >= 0.0) { u=ulim; *param = u; if(*param < min) *param = min; if(*param > max) *param = max; fu = -(*obj_func)(branch,tree,stree); } else { u=(*cx)+MNBRAK_GOLD*(*cx-*bx); *param = u; if(*param < min) *param = min; if(*param > max) *param = max; fu = -(*obj_func)(branch,tree,stree); } SHFT(*ax,*bx,*cx,u) SHFT(*fa,*fb,*fc,fu) } return(0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Generic_Brent(phydbl *param, phydbl ax, phydbl cx, phydbl tol, int n_iter_max, phydbl (*obj_func)(t_tree *), t_tree *tree) { int iter; phydbl a,b,d,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm; phydbl e=0.0; phydbl old_score; phydbl bx = *param; d=0.0; a=((ax < cx) ? ax : cx); b=((ax > cx) ? ax : cx); x=w=v=bx; (*param) = bx; fw=fv=fx=fu=(*obj_func)(tree); old_score = fw; /* PhyML_Printf("\n. %p init_score=%f fu=%f ax=%f cx=%f param=%f",tree,init_score,fu,ax,cx,*param); */ for(iter=1;iter<=BRENT_IT_MAX;iter++) { xm=0.5*(a+b); tol2=2.0*(tol1=tol*x+BRENT_ZEPS); if((fabs(fu-old_score) < tol && iter > 1) || (iter > n_iter_max - 1)) { (*param) = x; fu = (*obj_func)(tree); /* printf("\n. return %f [%f] %d",*param,fu,iter); */ return fu; } if(fabs(e) > tol1) { r=(x-w)*(fx-fv); q=(x-v)*(fx-fw); p=(x-v)*q-(x-w)*r; q=2.0*(q-r); if(q > 0.0) p = -p; q=fabs(q); etemp=e; e=d; if(fabs(p) >= fabs(0.5*q*etemp) || p <= q*(a-x) || p >= q*(b-x)) { d=BRENT_CGOLD*(e=(x >= xm ? a-x : b-x)); /* PhyML_Printf("\n. Golden section step"); */ } else { d=p/q; u=x+d; if (u-a < tol2 || b-u < tol2) d=SIGN(tol1,xm-x); /* PhyML_Printf("\n. Parabolic step [e=%f]",e); */ } } else { d=BRENT_CGOLD*(e=(x >= xm ? a-x : b-x)); /* PhyML_Printf("\n. Golden section step (default) [e=%f tol1=%f a=%f b=%f d=%f x=%f]",e,tol1,a,b,d,x); */ } u=(fabs(d) >= tol1 ? x+d : x+SIGN(tol1,d)); (*param) = u; old_score = fu; fu = (*obj_func)(tree); /* PhyML_Printf("\n. iter=%d/%d param=%f lnL=%f u: %f x: %f d: %f logt: %d",iter,BRENT_IT_MAX,*param,fu,u,x,d,logt); */ if(fu <= fx) { if(u >= x) a=x; else b=x; SHFT(v,w,x,u) SHFT(fv,fw,fx,fu) } else { if (u < x) a=u; else b=u; if (fu < fw || fabs(w-x) < SMALL) { v=w; w=u; fv=fw; fw=fu; } /* else if (fu <= fv || v == x || v == w) */ else if (fu < fv || fabs(v-x) < SMALL || fabs(v-w) < SMALL) { v=u; fv=fu; } } } PhyML_Printf("\n. Too many iterations in Generic_Brent !"); assert(FALSE); return((*obj_func)(tree)); /* Not Reached ?? *param=x; */ /* Not Reached ?? return fx; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRparam_GTR_Golden(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_tree *tree, calign *cdata, phydbl *param, int n_iter_max) { phydbl f1,f2,x0,x1,x2,x3; int n_iter; x0=ax; x3=cx; if (FABS(cx-bx) > FABS(bx-ax)) { x1=bx; x2=bx+GOLDEN_C*(cx-bx); } else { x2=bx; x1=bx-GOLDEN_C*(bx-ax); } (*param)=x1; Lk(NULL,tree); f1=-tree->c_lnL; (*param)=x2; Lk(NULL,tree); f2=-tree->c_lnL; n_iter = 0; while (FABS(x3-x0) > tol*(FABS(x1)+FABS(x2))) { if (f2 < f1) { SHFT3(x0,x1,x2,GOLDEN_R*x1+GOLDEN_C*x3) (*param)=x2; Lk(NULL,tree); SHFT2(f1,f2,-tree->c_lnL) } else { SHFT3(x3,x2,x1,GOLDEN_R*x2+GOLDEN_C*x0) (*param)=x1; Lk(NULL,tree); SHFT2(f2,f1,-tree->c_lnL) } if(n_iter++ > n_iter_max) break; /* PhyML_Printf("p=%E %f\n",(*param),tree->c_lnL); */ } if (f1 < f2) { *xmin=x1; return f1; } else { *xmin=x2; return f2; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Br_Len_Golden(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_edge *b_fcus, t_tree *tree) { phydbl f1,f2,x0,x1,x2,x3; x0=ax; x3=cx; if(FABS(cx-bx) > FABS(bx-ax)) { x1=bx; x2=bx+GOLDEN_C*(cx-bx); } else { x2=bx; x1=bx-GOLDEN_C*(bx-ax); } b_fcus->l->v = x1; f1 = -Lk(b_fcus,tree); b_fcus->l->v = x2; f2 = -Lk(b_fcus,tree); while (FABS(x3-x0) > tol*(FABS(x1)+FABS(x2))) { if (f2 < f1) { SHFT3(x0,x1,x2,GOLDEN_R*x1+GOLDEN_C*x3) b_fcus->l->v = x2; SHFT2(f1,f2,-Lk(b_fcus,tree)) } else { SHFT3(x3,x2,x1,GOLDEN_R*x2+GOLDEN_C*x0) b_fcus->l->v = x1; SHFT2(f2,f1,-Lk(b_fcus,tree)) } } if (f1 < f2) { *xmin = x1; return -f1; } else { *xmin = x2; return -f2; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Br_Len_Brak(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, t_edge *b_fcus, t_tree *tree) { phydbl ulim,u,r,q,fu,dum; b_fcus->l->v = *ax; *fa=-Lk(b_fcus,tree); b_fcus->l->v = *bx; *fb=-Lk(b_fcus,tree); if (*fb > *fa) { SHFT(dum,*ax,*bx,dum) SHFT(dum,*fb,*fa,dum) } *cx=(*bx)+MNBRAK_GOLD*(*bx-*ax); b_fcus->l->v = *cx; *fc=-Lk(b_fcus,tree); while (*fb > *fc + tree->mod->s_opt->min_diff_lk_local) { r=(*bx-*ax)*(*fb-*fc); q=(*bx-*cx)*(*fb-*fa); u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/ (2.0*SIGN(MAX(FABS(q-r),MNBRAK_TINY),q-r)); ulim=(*bx)+MNBRAK_GLIMIT*(*cx-*bx); if ((*bx-u)*(u-*cx) > 0.0) { b_fcus->l->v = u; fu=-Lk(b_fcus,tree); if (fu < *fc) { *ax=(*bx); *bx=u; *fa=(*fb); *fb=fu; /* (*ax)=FABS(*ax); */ /* (*bx)=FABS(*bx); */ /* (*cx)=FABS(*cx); */ return(0); } else if (fu > *fb) { *cx=u; *fc=fu; /* (*ax)=FABS(*ax); */ /* (*bx)=FABS(*bx); */ /* (*cx)=FABS(*cx); */ return(0); } u=(*cx)+MNBRAK_GOLD*(*cx-*bx); b_fcus->l->v = u; fu=-Lk(b_fcus,tree); } else if ((*cx-u)*(u-ulim) > 0.0) { b_fcus->l->v = FABS(u); fu=-Lk(b_fcus,tree); if (fu < *fc) { SHFT(*bx,*cx,u,*cx+MNBRAK_GOLD*(*cx-*bx)) b_fcus->l->v = u; SHFT(*fb,*fc,fu,-Lk(b_fcus,tree)) } } else if ((u-ulim)*(ulim-*cx) >= 0.0) { u=ulim; b_fcus->l->v = u; fu=-Lk(b_fcus,tree); } else { u=(*cx)+MNBRAK_GOLD*(*cx-*bx); b_fcus->l->v = u; fu=-Lk(b_fcus,tree); } SHFT(*ax,*bx,*cx,u) SHFT(*fa,*fb,*fc,fu) } (*ax)=FABS(*ax); (*bx)=FABS(*bx); (*cx)=FABS(*cx); return(0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Fast_Br_Len(t_edge *b, t_tree *tree, int approx) { phydbl init_min_diff_lk_local = tree->mod->s_opt->min_diff_lk_local; tree->mod->s_opt->min_diff_lk_local = 1.E-1; if(tree->is_mixt_tree) MIXT_Br_Len_Opt(b,tree); else Br_Len_Opt(&(b->l->v),b,tree); tree->mod->s_opt->min_diff_lk_local = init_min_diff_lk_local; return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Br_Len_Opt(phydbl *l, t_edge *b, t_tree *tree) { phydbl lk_begin, lk_end; if(tree->is_mixt_tree == YES && tree->ignore_mixt_info == NO) { MIXT_Br_Len_Opt(b,tree); return tree->c_lnL; } if(b->l->onoff == OFF || b->l->optimize == NO) return tree->c_lnL; lk_begin = UNLIKELY; lk_end = UNLIKELY; Set_Update_Eigen_Lr(YES,tree); Set_Use_Eigen_Lr(NO,tree); lk_begin = Lk(b,tree); /* We can't assume that the log-lk value is up-to-date */ Set_Update_Eigen_Lr(NO,tree); Set_Use_Eigen_Lr(YES,tree); Br_Len_Spline(l,b,tree->mod->s_opt->brent_it_max,tree->mod->s_opt->min_diff_lk_local,tree); Update_PMat_At_Given_Edge(b,tree); Set_Update_Eigen_Lr(NO,tree); Set_Use_Eigen_Lr(NO,tree); /* Set_Update_Eigen_Lr(NO,tree); */ /* Set_Use_Eigen_Lr(NO,tree); */ /* lk_begin = Lk(b,tree); */ /* tree->n_tot_bl_opt += Generic_Brent_Lk(l, */ /* tree->mod->l_min, */ /* tree->mod->l_max, */ /* tree->mod->s_opt->min_diff_lk_local, */ /* tree->mod->s_opt->brent_it_max, */ /* tree->mod->s_opt->quickdirty, */ /* Wrap_Lk_At_Given_Edge, */ /* b,tree,NULL,NO,NO); */ /* lk_end = Lk(b,tree); /\* We can't assume that the log-lk value is up-to-date *\/ */ /* PhyML_Printf("\n. b->num: %4d l=%12G lnL: %12G",b->num,b->l->v,tree->c_lnL); */ lk_end = tree->c_lnL; if(lk_end < lk_begin - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. lk_beg = %f lk_end = %f",lk_begin, lk_end); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d",__FILE__,__LINE__); Exit("\n"); } return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Round_Optimize(t_tree *tree, int n_round_max) { int n_round,each,freq; phydbl lk_old, lk_new; lk_new = tree->c_lnL; lk_old = UNLIKELY; n_round = 0; each = 0; freq = 1; while(n_round < n_round_max) { if(tree->mod->s_opt->opt_bl_one_by_one || tree->mod->s_opt->constrained_br_len) Optimize_Br_Len_Serie(n_round_max,tree); if((tree->mod->s_opt->opt_bl_one_by_one || tree->mod->s_opt->constrained_br_len) && (tree->verbose > VL2) && (tree->io->quiet == NO)) Print_Lk(tree,"[Branch lengths ]"); if(!each) { each = freq; Optimiz_All_Free_Param(tree,(tree->io->quiet)?(0):(tree->verbose > VL2)); } lk_new = tree->c_lnL; if(lk_new < lk_old - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. lk_new = %f lk_old = %f diff = %f",lk_new,lk_old,lk_new-lk_old); assert(FALSE); } if((fabs(lk_new - lk_old) < tree->mod->s_opt->min_diff_lk_local) && (each == freq)) break; /* if(fabs(lk_new - lk_old) < tree->mod->s_opt->min_diff_lk_local) break; */ lk_old = lk_new; n_round++; each--; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Br_Len_Serie(int n_max_iter, t_tree *tree) { phydbl lk_init,lk_end; int iter; Set_Both_Sides(NO,tree); Lk(NULL,tree); lk_init = tree->c_lnL; Optimize_Lvar(tree,(tree->io->quiet)?(0):(tree->verbose > VL2)); iter = 0; do { lk_init = tree->c_lnL; if(tree->n_root && tree->ignore_root == NO) { Update_Partial_Lk(tree,tree->n_root->b[1],tree->n_root); Optimize_Br_Len_Serie_Post(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); Update_Partial_Lk(tree,tree->n_root->b[2],tree->n_root); Optimize_Br_Len_Serie_Post(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); } else if(tree->n_root && tree->ignore_root == YES) { Optimize_Br_Len_Serie_Post(tree->e_root->rght, tree->e_root->left, tree->e_root,tree); Optimize_Br_Len_Serie_Post(tree->e_root->left, tree->e_root->rght, tree->e_root,tree); } else { Optimize_Br_Len_Serie_Post(tree->a_nodes[tree->tip_root], tree->a_nodes[tree->tip_root]->v[0], tree->a_nodes[tree->tip_root]->b[0], tree); } lk_end = tree->c_lnL; if(lk_end < lk_init - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. lk_init: %f lk_end: %f",lk_init,lk_end); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } iter++; } while(iter < 1); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Optimize_Br_Len_Multiplier(t_tree *mixt_tree, int verbose) { phydbl lk_init; t_tree *tree; /* PhyML_Printf("\n. Optimizing Br_Len_Multiplier"); */ tree = mixt_tree; do { if(tree->mod->s_opt->opt_br_len_mult == YES) { lk_init = Get_Lk(tree); /* Generic_Brent_Lk(&(tree->mod->br_len_mult_unscaled->v), */ Generic_Brent_Lk(&(tree->mod->br_len_mult->v), 1.E-2,1.E+1, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); if(Get_Lk(tree) < lk_init - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. %f -- %f",lk_init,tree->c_lnL); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } tree = tree->next_mixt; } while(tree); tree = mixt_tree; do { if(verbose && tree->mod->s_opt->opt_br_len_mult == YES) { Print_Lk(tree,"[Tree scale ]"); PhyML_Printf("[%10f]",tree->mod->br_len_mult->v); } tree = tree->next_mixt; } while(tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Optimize_Br_Len_Serie_Post(t_node *a, t_node *d, t_edge *b_fcus, t_tree *tree) { int i; phydbl lk_init; lk_init = tree->c_lnL; if(tree->mod->s_opt->constrained_br_len == YES) { Generic_Brent_Lk(&(tree->mod->br_len_mult->v), 1.E-2,1.E+1, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,tree,NULL,NO,NO); if(tree->c_lnL < lk_init - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. %f -- %f",lk_init,tree->c_lnL); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } return; } if(tree->io->mod->s_opt->opt_bl_one_by_one == YES) Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); if(tree->c_lnL < lk_init - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. %f -- %f",lk_init,tree->c_lnL); PhyML_Fprintf(stderr,"\n. Edge: %d",b_fcus->num); PhyML_Fprintf(stderr,"\n. is_mixt_tree: %d",tree->is_mixt_tree); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } if(d->tax) return; if(tree->n_root && tree->ignore_root == NO) { for(i=0;i<3;++i) { if(d->v[i] != a && d->b[i] != tree->e_root) { Update_Partial_Lk(tree,d->b[i],d); Optimize_Br_Len_Serie_Post(d,d->v[i],d->b[i],tree); } } for(i=0;i<3;++i) if(d->v[i] == a || d->b[i] == tree->e_root) { Update_Partial_Lk(tree,d->b[i],d); if(tree->io->mod->s_opt->opt_bl_one_by_one == YES) Br_Len_Opt(&(d->b[i]->l->v),d->b[i],tree); } } else { // Ok if root exists but requires traversal to be initiated from a node != root for(i=0;i<3;++i) { if(d->v[i] != a) { Update_Partial_Lk(tree,d->b[i],d); Optimize_Br_Len_Serie_Post(d,d->v[i],d->b[i],tree); } } Update_Partial_Lk(tree,b_fcus,d); if(tree->io->mod->s_opt->opt_bl_one_by_one == YES) Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimiz_Ext_Br(t_tree *tree) { int i; t_edge *b; phydbl lk_init; scalar_dbl *l_init,*v_init; lk_init = tree->c_lnL; For(i,2*tree->n_otu-3) { b = tree->a_edges[i]; if((b->left->tax) || (b->rght->tax)) { l_init = Duplicate_Scalar_Dbl(b->l); v_init = Duplicate_Scalar_Dbl(b->l_var); Br_Len_Opt(&(b->l->v),b,tree); if(b->nni->best_l == NULL) { b->nni->best_l = Duplicate_Scalar_Dbl(b->l); b->nni->best_v = Duplicate_Scalar_Dbl(b->l_var); } else { Copy_Scalar_Dbl(b->l,b->nni->best_l); Copy_Scalar_Dbl(b->l_var,b->nni->best_v); } if(b->nni->l0 == NULL) { b->nni->l0 = Duplicate_Scalar_Dbl(b->l); b->nni->v0 = Duplicate_Scalar_Dbl(b->l_var); } else { Copy_Scalar_Dbl(b->l,b->nni->l0); Copy_Scalar_Dbl(b->l_var,b->nni->v0); } // Revert of original edge lengths Copy_Scalar_Dbl(l_init,b->l); Copy_Scalar_Dbl(v_init,b->l_var); Free_Scalar_Dbl(l_init); Free_Scalar_Dbl(v_init); /* ori = b; */ /* do */ /* { */ /* b->nni->best_l->v = b->l->v; */ /* b->nni->l0->v = b->l->v; */ /* b->nni->best_conf = 0; */ /* b->l->v = l_init; */ /* b = b->next; */ /* } */ /* while(b); */ /* b = ori; */ } } tree->c_lnL = lk_init; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimiz_All_Free_Param(t_tree *tree, int verbose) { int init_both_sides; if(!tree) return; if(tree->mixt_tree && tree->mod->ras->invar == YES) return; init_both_sides = tree->both_sides; Set_Both_Sides(NO,tree); Lk(NULL,tree); Optimize_RR_Params(tree,verbose); Optimize_TsTv(tree,verbose); Optimize_Lambda(tree,verbose); Optimiz_Alpha_And_Pinv(tree,verbose); Optimize_Pinv(tree,verbose); Optimize_Alpha(tree,verbose); Optimize_State_Freqs(tree,verbose); Optimize_Rmat_Weights(tree,verbose); Optimize_Efrq_Weights(tree,verbose); Optimize_Free_Rate(tree,verbose); Optimize_Br_Len_Multiplier(tree,verbose); Optimize_M4mod(tree, verbose); if(tree->io->print_json_trace == YES) JSON_Tree_Io(tree,tree->io->fp_out_json_trace); Set_Both_Sides(init_both_sides,tree); if(tree->both_sides == YES) Lk(NULL,tree); /* Needed to update all partial likelihoods */ /* if(tree->next) Optimiz_All_Free_Param(tree->next,verbose); */ /* else Optimiz_All_Free_Param(tree->next,verbose); */ /* if(tree->nextree) Optimiz_All_Free_Param(tree->nextree,verbose); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_M4mod(t_tree *tree, int verbose) { if (tree->mod->use_m4mod == YES) { int i; if (tree->mod->m4mod->delta->optimize == YES) { Set_Update_Eigen(YES,tree->mod); Generic_Brent_Lk( &(tree->mod->m4mod->delta->v), 0.01, 10., tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk, NULL, tree, NULL, NO, NO); if (verbose) { Print_Lk(tree, "[Switching param. ]"); PhyML_Printf("[%10f]", tree->mod->m4mod->delta->v); } Set_Update_Eigen(NO, tree->mod); } if (tree->mod->m4mod->multipl_unscaled->optimize == YES) { Set_Update_Eigen(YES,tree->mod); for (int rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) { /* Optimize_Single_Param_Generic(tree,&(tree->mod->m4mod->multipl_unscaled[rcat]), */ /* .01,10., */ /* tree->mod->s_opt->min_diff_lk_local, */ /* tree->mod->s_opt->brent_it_max, */ /* tree->mod->s_opt->quickdirty); */ Generic_Brent_Lk( &(tree->mod->m4mod->multipl_unscaled->v[rcat]), 0.1, 100., tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk, NULL, tree, NULL, NO, NO); if (verbose) { Print_Lk(tree, "[Rel. subst. rate ]"); PhyML_Printf("[%10f]", tree->mod->m4mod->multipl[rcat]); } } Set_Update_Eigen(NO, tree->mod); } if (tree->mod->m4mod->multipl_unscaled->optimize == YES) { Set_Update_Eigen(YES, tree->mod); for (int rcat = 0; rcat < tree->mod->m4mod->n_h; rcat++) { Generic_Brent_Lk( &(tree->mod->m4mod->h_fq_unscaled->v[rcat]), 0.1, 100., tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk, NULL, tree, NULL, NO, NO); if (verbose) { Print_Lk(tree, "[Subst. class freq ]"); PhyML_Printf("[%10f]", tree->mod->m4mod->h_fq[rcat]); } } Set_Update_Eigen(NO, tree->mod); } if (tree->mod->m4mod->alpha->optimize == YES) { Set_Update_Eigen(YES, tree->mod); Generic_Brent_Lk( &(tree->mod->m4mod->alpha->v), 0.01, 10., tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk, NULL, tree, NULL, NO, NO); if (verbose) { Print_Lk(tree, "[Alpha (covarion) ]"); PhyML_Printf("[%10f]", tree->mod->m4mod->alpha->v); } Set_Update_Eigen(NO, tree->mod); } /* Substitutions between nucleotides are considered to follow a GTR model */ if (tree->mod->io->datatype == NT && (tree->mod->whichmodel == GTR || tree->mod->whichmodel == CUSTOM) && tree->mod->m4mod->o_rr->optimize == YES) { Set_Update_Eigen(YES, tree->mod); int *permut = Permutate(tree->mod->r_mat->n_diff_rr); for (i = 0; i < 5; i++) if (permut[i] != 5) { Generic_Brent_Lk(&(tree->mod->m4mod->o_rr->v[permut[i]]), 1.E-4, 1.E+4, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk, NULL, tree, NULL, NO, NO); } Free(permut); if (verbose) Print_Lk(tree, "[GTR parameters ]"); Set_Update_Eigen(NO, tree->mod); } } } #define ITMAX 200 #define EPS 3.0e-8 #define TOLX (4*EPS) #define STPMX 100.0 static phydbl sqrarg; #define SQR(a) ((sqrarg=(a)) < SMALL ? 0.0 : sqrarg*sqrarg) void BFGS(t_tree *tree, phydbl *p, int n, phydbl gtol, phydbl difff, phydbl step_size, short int logt, short int expt, short int is_positive, phydbl(*func)(t_tree *tree), int(*dfunc)(t_tree *tree,phydbl *param,int n_param,phydbl stepsize, short int logt, short int expt, phydbl(*func)(t_tree *tree),phydbl *derivatives, int is_positive), int(*lnsrch)(t_tree *tree, int n, phydbl *xold, phydbl fold, phydbl *g, phydbl *p, phydbl *x,phydbl *f, phydbl stpmax, int *check, short int logt, short int expt, int is_positive), int *failed) { int check,i,its,j; phydbl den,fac,fad,fae,fp,stpmax,sum=0.0,sumdg,sumxi,temp,test,fret; phydbl *dg,*g,*hdg,**hessin,*pnew,*xi; phydbl fp_old; phydbl *init; hessin = (phydbl **)mCalloc(n,sizeof(phydbl *)); for(i=0;ic_lnL,stpmax,fret); */ fp_old = fp; fp = fret; for (i=0;i test) test=temp; } if (test < TOLX || (fabs(fp-fp_old) < difff && its > 1)) { if(fp > fp_old) { for(i=0;i test) test=temp; } if (test < gtol) { *failed = NO; if(expt == YES) for(i=0;i EPS*sumdg*sumxi) { fac=1.0/fac; fad=1.0/fae; for (i=0;i %f\n",tree->c_lnL); */ fp_old = fp; fp = fret; for (i=0;i test) test=temp; } if (test < TOLX || (FABS(fp_old-fp) < difff && its > 1)) { if(fp > fp_init) { for(i=0;i .0 ? 1. : -1.; if(is_positive == YES) for(i=0;i test) test=temp; } if (test < gtol) { if(expt == YES) for(i=0;i .0 ? 1. : -1.; if(is_positive == YES) for(i=0;i EPS*sumdg*sumxi) { fac=1.0/fac; fad=1.0/fae; for (i=0;i stpmax) for(i=0;i test) test=temp; } alamin=TOLX/test; alam=1.0; for (;;) { for(i=0;i> %f",xold[i]); */ *f=Return_Abs_Lk(tree); if(is_positive == YES) for(i=0;i 1.0-SMALL)) tmplam = -slope/(2.0*(*f-fold-slope)); else { rhs1 = *f-fold-alam*slope; rhs2=f2-fold2-alam2*slope; a=(rhs1/(alam*alam)-rhs2/(alam2*alam2))/(alam-alam2); b=(-alam2*rhs1/(alam*alam)+alam*rhs2/(alam2*alam2))/(alam-alam2); if (a < SMALL && a > -SMALL) tmplam = -slope/(2.0*b); else { disc=b*b-3.0*a*slope; if (disc<0.0) tmplam = 0.5*alam; else if(b <= 0.0) tmplam=(-b+SQRT(disc))/(3.0*a); else tmplam = -slope/(b+SQRT(disc)); } if (tmplam>0.5*alam) tmplam=0.5*alam; } } alam2=alam; f2 = *f; fold2=fold; alam=MAX(tmplam,0.1*alam); } return 1; } #undef ALF #undef TOLX #undef NRANSI ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #define ALF 1.0e-4 #define TOLX 1.0e-7 int Lnsrch_Nonaligned(t_tree *tree, int n, phydbl **xold, phydbl fold, phydbl *g, phydbl *p, phydbl *x, phydbl *f, phydbl stpmax, int *check, short int logt, short int expt, int is_positive) { int i; phydbl a,alam,alam2,alamin,b,disc,f2,fold2,rhs1,rhs2,slope,sum,temp,test,tmplam; phydbl *local_xold,*sign; alam = alam2 = f2 = fold2 = tmplam = .0; local_xold = (phydbl *)mCalloc(n,sizeof(phydbl)); sign = (phydbl *)mCalloc(n,sizeof(phydbl)); for(i=0;i stpmax) for(i=0;i test) test=temp; } alamin=TOLX/test; alam=1.0; for (;;) { for(i=0;i 1.0-SMALL)) tmplam = -slope/(2.0*(*f-fold-slope)); else { rhs1 = *f-fold-alam*slope; rhs2=f2-fold2-alam2*slope; a=(rhs1/(alam*alam)-rhs2/(alam2*alam2))/(alam-alam2); b=(-alam2*rhs1/(alam*alam)+alam*rhs2/(alam2*alam2))/(alam-alam2); if (a < SMALL && a > -SMALL) tmplam = -slope/(2.0*b); else { disc=b*b-3.0*a*slope; if (disc<0.0) tmplam = 0.5*alam; else if(b <= 0.0) tmplam=(-b+SQRT(disc))/(3.0*a); else tmplam = -slope/(b+SQRT(disc)); } if (tmplam>0.5*alam) tmplam=0.5*alam; } } alam2=alam; f2 = *f; fold2=fold; alam=MAX(tmplam,0.1*alam); } Free(local_xold); Free(sign); return 1; } #undef ALF #undef TOLX #undef NRANSI ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Dist_F_Brak(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *F, phydbl *param, t_mod *mod) { phydbl ulim,u,r,q,dum; phydbl fa, fb, fc, fu; fa = -Lk_Dist(F,FABS(*ax),mod); fb = -Lk_Dist(F,FABS(*bx),mod); if(fb > fa) { SHFT(dum,*ax,*bx,dum) SHFT(dum,fb,fa,dum) } *cx=(*bx)+MNBRAK_GOLD*(*bx-*ax); fc = -Lk_Dist(F,FABS(*cx),mod); while (fb > fc) { r=(*bx-*ax)*(fb-fc); q=(*bx-*cx)*(fb-fa); u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/ (2.0*SIGN(MAX(FABS(q-r),MNBRAK_TINY),q-r)); ulim=(*bx)+MNBRAK_GLIMIT*(*cx-*bx); if ((*bx-u)*(u-*cx) > 0.0) { fu = -Lk_Dist(F,FABS(u),mod); if (fu < fc) { *ax=(*bx); *bx=u; fa=fb; fb=fu; return(0); } else if (fu > fb) { *cx=u; fc=fu; return(0); } u=(*cx)+MNBRAK_GOLD*(*cx-*bx); fu = -Lk_Dist(F,FABS(u),mod); } else if ((*cx-u)*(u-ulim) > 0.0) { fu = -Lk_Dist(F,FABS(u),mod); if (fu < fc) { SHFT(*bx,*cx,u,*cx+MNBRAK_GOLD*(*cx-*bx)) SHFT(fb,fc,fu,-Lk_Dist(F,FABS(u),mod)) } } else if ((u-ulim)*(ulim-*cx) >= 0.0) { u = ulim; fu = -Lk_Dist(F,FABS(u),mod); } else { u =(*cx)+MNBRAK_GOLD*(*cx-*bx); fu = -Lk_Dist(F,FABS(u),mod); } SHFT(*ax,*bx,*cx,u) SHFT(fa,fb,fc,fu) } return(0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Dist_F_Brent(phydbl ax, phydbl bx, phydbl cx, phydbl tol, int n_iter_max, phydbl *param, phydbl *F, t_mod *mod) { int iter; phydbl a,b,d,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm; phydbl e=0.0; phydbl old_lnL,init_lnL, curr_lnL; d=0.0; a=((ax < cx) ? ax : cx); b=((ax > cx) ? ax : cx); x = w = v = bx; old_lnL = UNLIKELY; fw = fv = fx = -Lk_Dist(F,fabs(bx),mod); curr_lnL = init_lnL = -fw; /* PhyML_Printf("\n. bx=%f f: %f %f %f %f fx: %f",bx,mod->e_frq->pi->v[0],mod->e_frq->pi->v[1],mod->e_frq->pi->v[2],mod->e_frq->pi->v[3],fx); */ assert(isnan(fx) == FALSE); assert(isinf(fx) == FALSE); for(iter=1;iter<=BRENT_IT_MAX;iter++) { xm=0.5*(a+b); tol2=2.0*(tol1=tol*FABS(x)+BRENT_ZEPS); if( ((FABS(curr_lnL-old_lnL) < mod->s_opt->min_diff_lk_local) && (curr_lnL > init_lnL - mod->s_opt->min_diff_lk_local)) || (iter > n_iter_max - 1) ) { *param = x; curr_lnL = Lk_Dist(F,*param,mod); return -curr_lnL; } if(FABS(e) > tol1) { r=(x-w)*(fx-fv); q=(x-v)*(fx-fw); p=(x-v)*q-(x-w)*r; q=2.0*(q-r); if(q > 0.0) p = -p; q=FABS(q); etemp=e; e=d; if(FABS(p) >= FABS(0.5*q*etemp) || p <= q*(a-x) || p >= q*(b-x)) { d=BRENT_CGOLD*(e=(x >= xm ? a-x : b-x)); /* PhyML_Printf("Golden section step\n"); */ } else { d=p/q; u=x+d; if (u-a < tol2 || b-u < tol2) d=SIGN(tol1,xm-x); /* PhyML_Printf("Parabolic step\n"); */ } } else { d=BRENT_CGOLD*(e=(x >= xm ? a-x : b-x)); /* PhyML_Printf("Golden section step (default)\n"); */ } u=(FABS(d) >= tol1 ? x+d : x+SIGN(tol1,d)); (*param) = FABS(u); old_lnL = curr_lnL; fu = -Lk_Dist(F,FABS(u),mod); curr_lnL = -fu; /* PhyML_Printf("param=%f loglk=%f\n",*param,fu); */ /* if(fu <= fx) */ if(fu < fx) { if(iter > n_iter_max) return -fu; if(u >= x) a=x; else b=x; SHFT(v,w,x,u) SHFT(fv,fw,fx,fu) } else { if (u < x) a=u; else b=u; /* if (fu <= fw || w == x) */ if (fu < fw || FABS(w-x) < SMALL) { v=w; w=u; fv=fw; fw=fu; } /* else if (fu <= fv || v == x || v == w) */ else if (fu < fv || FABS(v-x) < SMALL || FABS(v-w) < SMALL) { v=u; fv=fu; } } } Exit("\n. Too many iterations in Dist_F_Brent !\n"); return(-1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Opt_Dist_F(phydbl *dist, phydbl *F, t_mod *mod) { phydbl ax,bx,cx; if(*dist < mod->l_min) *dist = mod->l_min; ax = mod->l_min; bx = (*dist); cx = mod->l_max; /* PhyML_Printf("\n. bx: %g",bx); */ /* Dist_F_Brak(&ax,&bx,&cx,F,dist,mod); */ Dist_F_Brent(ax,bx,cx,1.E-10,1000,dist,F,mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Missing_Dist_Brak(phydbl *ax, phydbl *bx, phydbl *cx, int x, int y, matrix *mat) { phydbl ulim,u,r,q,dum; phydbl fa, fb, fc, fu; fa = Least_Square_Missing_Dist_XY(x,y,FABS(*ax),mat); fb = Least_Square_Missing_Dist_XY(x,y,FABS(*bx),mat); if(fb > fa) { SHFT(dum,*ax,*bx,dum) SHFT(dum,fb,fa,dum) } *cx=(*bx)+MNBRAK_GOLD*((*bx)-(*ax)); fc = Least_Square_Missing_Dist_XY(x,y,FABS(*cx),mat); while (fb > fc) { r=((*bx)-(*ax))*(fb-fc); q=((*bx)-(*cx))*(fb-fa); u=(*bx)-(((*bx)-(*cx))*q-((*bx)-(*ax))*r)/ (2.0*SIGN(MAX(FABS(q-r),MNBRAK_TINY),q-r)); ulim=(*bx)+MNBRAK_GLIMIT*(*cx-*bx); if ((*bx-u)*(u-*cx) > 0.0) { fu = Least_Square_Missing_Dist_XY(x,y,FABS(u),mat); if (fu < fc) { *ax=(*bx); *bx=u; fa=fb; fb=fu; return(0); } else if (fu > fb) { *cx=u; fc=fu; return(0); } u=(*cx)+MNBRAK_GOLD*(*cx-*bx); fu = Least_Square_Missing_Dist_XY(x,y,FABS(u),mat); } else if ((*cx-u)*(u-ulim) > 0.0) { fu = Least_Square_Missing_Dist_XY(x,y,FABS(u),mat); if (fu < fc) { SHFT(*bx,*cx,u,*cx+MNBRAK_GOLD*(*cx-*bx)) SHFT(fb,fc,fu,Least_Square_Missing_Dist_XY(x,y,FABS(u),mat)) } } else if ((u-ulim)*(ulim-*cx) >= 0.0) { u = ulim; fu = Least_Square_Missing_Dist_XY(x,y,FABS(u),mat); } else { u =(*cx)+MNBRAK_GOLD*(*cx-*bx); fu = Least_Square_Missing_Dist_XY(x,y,FABS(u),mat); } SHFT(*ax,*bx,*cx,u) SHFT(fa,fb,fc,fu) } return(0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Missing_Dist_Brent(phydbl ax, phydbl bx, phydbl cx, phydbl tol, int n_iter_max, int x, int y, matrix *mat) { int iter; phydbl a,b,d,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,xx,xm; phydbl e=0.0; d=0.0; a=((ax < cx) ? ax : cx); b=((ax > cx) ? ax : cx); xx=w=v=bx; fx=Least_Square_Missing_Dist_XY(x,y,FABS(bx),mat); fw=fv=-fx; for(iter=1;iter<=BRENT_IT_MAX;iter++) { xm=0.5*(a+b); tol2=2.0*(tol1=tol*FABS(xx)+BRENT_ZEPS); if(FABS(xx-xm) <= (tol2-0.5*(b-a))) { mat->dist[x][y] = xx; Least_Square_Missing_Dist_XY(x,y,mat->dist[x][y],mat); return -fx; } if(FABS(e) > tol1) { r=(xx-w)*(fx-fv); q=(xx-v)*(fx-fw); p=(xx-v)*q-(xx-w)*r; q=2.0*(q-r); if(q > 0.0) p = -p; q=FABS(q); etemp=e; e=d; if(FABS(p) >= FABS(0.5*q*etemp) || p <= q*(a-xx) || p >= q*(b-xx)) { d=BRENT_CGOLD*(e=(xx >= xm ? a-xx : b-xx)); /* PhyML_Printf("Golden section step\n"); */ } else { d=p/q; u=xx+d; if (u-a < tol2 || b-u < tol2) d=SIGN(tol1,xm-xx); /* PhyML_Printf("Parabolic step\n"); */ } } else { d=BRENT_CGOLD*(e=(xx >= xm ? a-xx : b-xx)); /* PhyML_Printf("Golden section step (default)\n"); */ } u=(FABS(d) >= tol1 ? xx+d : xx+SIGN(tol1,d)); fu = Least_Square_Missing_Dist_XY(x,y,FABS(u),mat); /* PhyML_Printf("param=%f loglk=%f\n",u,fu); */ /* if(fu <= fx) */ if(fu < fx) { if(iter > n_iter_max) return -fu; if(u >= xx) a=xx; else b=xx; SHFT(v,w,xx,u) SHFT(fv,fw,fx,fu) } else { if (u < xx) a=u; else b=u; /* if (fu <= fw || w == xx) */ if (fu < fw || FABS(w-xx) < SMALL) { v=w; w=u; fv=fw; fw=fu; } /* else if (fu <= fv || v == xx || v == w) */ else if (fu < fv || FABS(v-xx) < SMALL || FABS(v-w) < SMALL) { v=u; fv=fu; } } } Exit("\n. Too many iterations in Missing_Dist_Brent !"); return(-1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Opt_Missing_Dist(int x, int y, matrix *mat) { phydbl ax,bx,cx; ax = DIST_MAX; bx = DIST_MAX/4.; Missing_Dist_Brak(&ax,&bx,&cx,x,y,mat); PhyML_Printf("ax=%f bx=%f cx=%f\n",FABS(ax),FABS(bx),FABS(cx)); Missing_Dist_Brent(FABS(ax),FABS(bx),FABS(cx),1.E-5,100,x,y,mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Optimiz_Alpha_And_Pinv(t_tree *mixt_tree, int verbose) { scalar_dbl **alpha; int n_alpha; t_tree *tree; int i; /* PhyML_Printf("\n. Optimizing Alpha and Inv"); */ Set_Update_Eigen(NO,mixt_tree->mod); alpha = NULL; n_alpha = 0; tree = mixt_tree; do { if(tree->mod->ras->alpha->optimize == YES && tree->mod->ras->n_catg > 1 && tree->mod->ras->pinvar->optimize == YES) { for(i=0;imod->ras->alpha == alpha[i]) break; if(i == n_alpha) { if(!alpha) alpha = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else alpha = (scalar_dbl **)mRealloc(alpha,n_alpha+1,sizeof(scalar_dbl *)); alpha[n_alpha] = tree->mod->ras->alpha; n_alpha++; if(tree->mod->ras->alpha->optimize == YES && tree->mod->ras->free_mixt_rates == NO) { if(tree->mod->ras->n_catg > 1) { Generic_Brent_Lk(&(tree->mod->ras->alpha->v), ALPHA_MIN,ALPHA_MAX, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); } if(verbose == YES) { Print_Lk(mixt_tree,"[Alpha ]"); PhyML_Printf("[%10f]",tree->mod->ras->alpha->v); } } if(tree->mod->ras->pinvar->optimize == YES && tree->mod->ras->free_mixt_rates == NO) { tree->mod->s_opt->skip_tree_traversal = YES; Optimize_Single_Param_Generic(mixt_tree,&(tree->mod->ras->pinvar->v),.0001,0.9999, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty); tree->mod->s_opt->skip_tree_traversal = NO; if(verbose == YES) { Print_Lk(mixt_tree,"[P-inv ]"); PhyML_Printf("[%10f]",tree->mod->ras->pinvar->v); } } } } tree = tree->next_mixt; } while(tree); if(alpha) Free(alpha); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// static phydbl Br_Len_Spline(phydbl *l, t_edge *b, int n_iter_max, phydbl tol, t_tree *tree) { short int converged; phydbl init_lnL,old_lnL; int iter; phydbl best_l, new_l, init_l, init_dl, best_lnL; phydbl u, v; phydbl fu, fv; phydbl dfu, dfv; phydbl mult; phydbl a_,b_,A_,B_,C_,D_,root1,root2; short int ok1, ok2; // Warning: make sure eigen_lr vectors are already up-to-date Set_Use_Eigen_Lr(YES,tree); best_l = init_l = *l; best_lnL = old_lnL = init_lnL = tree->c_lnL; mult = 1.2; ok1 = ok2 = NO; a_ = b_ = A_ = B_ = D_ = root1 = root2 = -1.; u = v = fu = fv = dfu = dfv = -1.; new_l = -1.; dLk(l,b,tree); init_dl = tree->c_dlnL; if(*l > tree->mod->l_max) *l = 0.5; if(*l < tree->mod->l_min) *l = 0.001; // Find value of l where first derivative is < 0; tree->c_dlnL = init_dl; while(tree->c_dlnL < 0.0) { *l /= mult; tree->n_tot_bl_opt++; if(*l < tree->mod->l_min) { *l = best_l; tree->c_lnL = best_lnL; return best_lnL; } dLk(l,b,tree); if(tree->c_lnL > best_lnL) { best_lnL = tree->c_lnL; best_l = *l; } } u = *l; fu = tree->c_lnL; dfu = tree->c_dlnL; // Find good upper bound *l = init_l; tree->c_dlnL = init_dl; tree->c_lnL = init_lnL; while(tree->c_dlnL > 0.0) { *l *= mult; tree->n_tot_bl_opt++; if(*l > tree->mod->l_max) { *l = best_l; tree->c_lnL = best_lnL; return best_lnL; } dLk(l,b,tree); if(tree->c_lnL > best_lnL) { best_lnL = tree->c_lnL; best_l = *l; } } v = *l; fv = tree->c_lnL; dfv = tree->c_dlnL; /* PhyML_Printf("\n Begin NR loop (lnL: %12G dlnL: %12G) l: %12G num: %d",tree->c_lnL,tree->c_dlnL,*l,b->num); */ converged = NO; iter = 0; do { /* PhyML_Printf("\n. l=%12f lnL=%12f iter:%d u=%12f v=%12f root1=%12f root2=%12f dfu=%12f dfv=%12f fu=%12f fv=%12f diff=%12f tol=%12f init=%12f", */ /* *l,tree->c_lnL,iter, */ /* u,v, */ /* root1,root2, */ /* dfu,dfv, */ /* fu,fv, */ /* tree->c_lnL-old_lnL, */ /* tol,init_l); */ /* PhyML_Printf("\n. l: %f dlnL: %f lnL: %f",*l,tree->c_dlnL,tree->c_lnL); */ // Spline interpolation (https://en.wikipedia.org/wiki/Spline_interpolation) a_ = dfu*(v-u) - (fv-fu); b_ = -dfv*(v-u) + (fv-fu); A_ = 3.*a_ - 3.*b_; B_ = -4.*a_ + 2.*b_; C_ = fv-fu+a_; D_ = sqrt(B_*B_-4.*A_*C_); root1 = (-B_-D_)/(2.*A_); root2 = (-B_+D_)/(2.*A_); root1 = root1*(v-u) + u; root2 = root2*(v-u) + u; ok1 = NO; ok2 = NO; if(root1 > u && root1 < v) ok1 = YES; if(root2 > u && root2 < v) ok2 = YES; if(Are_Equal(root1,u,1.E-5) == YES) ok1 = YES; if(Are_Equal(root2,u,1.E-5) == YES) ok2 = YES; if(Are_Equal(root1,v,1.E-5) == YES) ok1 = YES; if(Are_Equal(root2,v,1.E-5) == YES) ok2 = YES; if(ok1 == YES && ok2 == YES) new_l = root1 < root2 ? root1 : root2; else if(ok1 == YES) new_l = root1; else if(ok2 == YES) new_l = root2; else if(u/v > 1.1 || u/v < 0.9) { PhyML_Printf("\n. iter=%4d u=%12G fu=%12G dfu=%12G v=%12G fv=%12G dfv=%12G root1=%12G root2=%12G\n",iter,u,fu,dfu,v,fv,dfv,root1,root2); assert(FALSE); } *l = new_l; tree->n_tot_bl_opt++; old_lnL = tree->c_lnL; dLk(l,b,tree); if(tree->c_lnL > best_lnL) { best_lnL = tree->c_lnL; best_l = *l; } if(tree->c_dlnL > 0.0) { u = new_l; fu = tree->c_lnL; dfu = tree->c_dlnL; } else { v = new_l; fv = tree->c_lnL; dfv = tree->c_dlnL; } if(u - v < DBL_MIN) converged = YES; if(fabs(tree->c_lnL-old_lnL) < tol) converged = YES; if(++iter == n_iter_max+20) converged = YES; if(iter >= n_iter_max) PhyML_Fprintf(stderr,"\n. Edge length optimization took too long... l=%G lnL=%G iter:%d u=%G v=%G root1=%G root2=%G dfu=%G dfv=%G fu=%G fv=%G diff=%G tol=%G", *l,tree->c_lnL,iter, u,v, root1,root2, dfu,dfv, fu,fv, tree->c_lnL-old_lnL, tol); if(converged == NO) { if(!(u < v)) PhyML_Printf("\n. u=%g v=%g.\n",u,v); if(!(dfu > 0.0)) PhyML_Printf("\n. dfu=%g l=%g u=%g v=%g\n",dfu,*l,u,v); if(!(dfv < 0.0)) PhyML_Printf("\n. dfv=%g l=%g u=%g v=%g\n",dfv,*l); assert(u < v); assert(dfu > 0.0); assert(dfv < 0.0); } } while(converged == NO); /* PhyML_Printf("\n. l = %g l_max = %g diff=%g",*l,tree->mod->l_max,*l-tree->mod->l_max); */ assert(!(*l > tree->mod->l_max)); assert(!(*l < tree->mod->l_min)); /* if(dfu > 1.) */ /* { */ /* PhyML_Printf("\n> [%4d] l=%f lnL=%f iter:%d u=%f v=%f root1=%f root2=%f dfu=%f dfv=%f fu=%f fv=%f diff=%f tol=%f init=%f", */ /* tree->n_tot_bl_opt, */ /* *l,tree->c_lnL,iter, */ /* u,v, */ /* root1,root2, */ /* dfu,dfv, */ /* fu,fv, */ /* tree->c_lnL-old_lnL, */ /* tol,init_l); */ /* } */ /* if(dfv < -1) */ /* { */ /* PhyML_Printf("\n< [%4d] l=%f lnL=%f iter:%d u=%f v=%f root1=%f root2=%f dfu=%f dfv=%f fu=%f fv=%f diff=%f tol=%f init=%f", */ /* tree->n_tot_bl_opt, */ /* *l,tree->c_lnL,iter, */ /* u,v, */ /* root1,root2, */ /* dfu,dfv, */ /* fu,fv, */ /* tree->c_lnL-old_lnL, */ /* tol,init_l); */ /* } */ *l = best_l; tree->c_lnL = best_lnL; if(iter == n_iter_max) { PhyML_Printf("\n. Too many iterations in edge length optimization routine (l=%G init=%G).\n",best_l,init_l); assert(FALSE); } return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Generic_Brent_Lk(phydbl *param, phydbl ax, phydbl cx, phydbl tol, int n_iter_max, int quickdirty, phydbl (*obj_func)(t_edge *,t_tree *,supert_tree *), t_edge *branch, t_tree *tree, supert_tree *stree, short int logt, short int expt) { int iter; phydbl a,b,d,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm; phydbl e=0.0; phydbl old_lnL,init_lnL; phydbl bx = *param; int n_opt_step; n_opt_step = 0; d=0.0; a=((ax < cx) ? ax : cx); b=((ax > cx) ? ax : cx); x=w=v=bx; (*param) = bx; if(expt == YES) (*param) = log(*param); if(logt == YES) (*param) = exp(MIN(1.E+2,*param)); fw=fv=fx=fu=-(*obj_func)(branch,tree,stree); if(logt == YES) (*param) = log(*param); if(expt == YES) (*param) = exp(*param); init_lnL = old_lnL = fw; /* PhyML_Printf("\n. %p %p %p init_lnL=%f fu=%f ax=%f cx=%f param=%f",branch,tree,stree,init_lnL,fu,ax,cx,*param); */ for(iter=1;iter<=BRENT_IT_MAX;iter++) { xm=0.5*(a+b); tol2=2.0*(tol1=tol*x+BRENT_ZEPS); if((fu < init_lnL + tol) && (quickdirty == YES) && (iter > 1)) { (*param) = x; if(expt == YES) (*param) = log(*param); if(logt == YES) (*param) = exp(MIN(1.E+2,*param)); fu = (*obj_func)(branch,tree,stree); if(logt == YES) (*param) = log(*param); if(expt == YES) (*param) = exp(*param); /* printf("\n. return %f [%f] %d",fu,*param,iter); */ return n_opt_step; } if((FABS(fu-old_lnL) < tol && iter > 1) || (iter > n_iter_max - 1)) { (*param) = x; if(expt == YES) (*param) = log(*param); if(logt == YES) (*param) = exp(MIN(1.E+2,*param)); fu = (*obj_func)(branch,tree,stree); if(logt == YES) (*param) = log(*param); if(expt == YES) (*param) = exp(*param); /* printf("\n. return %f [%f] %d",*param,fu,iter); */ return n_opt_step; } if(FABS(e) > tol1) { r=(x-w)*(fx-fv); q=(x-v)*(fx-fw); p=(x-v)*q-(x-w)*r; q=2.0*(q-r); if(q > 0.0) p = -p; q=FABS(q); etemp=e; e=d; if(FABS(p) >= FABS(0.5*q*etemp) || p <= q*(a-x) || p >= q*(b-x)) { d=BRENT_CGOLD*(e=(x >= xm ? a-x : b-x)); /* PhyML_Printf("\n. Golden section step"); */ } else { d=p/q; u=x+d; if (u-a < tol2 || b-u < tol2) d=SIGN(tol1,xm-x); /* PhyML_Printf("\n. Parabolic step [e=%f]",e); */ } } else { d=BRENT_CGOLD*(e=(x >= xm ? a-x : b-x)); /* PhyML_Printf("\n. Golden section step (default) [e=%f tol1=%f a=%f b=%f d=%f x=%f]",e,tol1,a,b,d,x); */ } u=(FABS(d) >= tol1 ? x+d : x+SIGN(tol1,d)); (*param) = u; n_opt_step++; old_lnL = fu; if(expt == YES) (*param) = log(*param); if(logt == YES) (*param) = exp(MIN(1.E+2,*param)); fu = -(*obj_func)(branch,tree,stree); if(logt == YES) (*param) = log(*param); if(expt == YES) (*param) = exp(*param); /* PhyML_Printf("\n. iter=%d/%d param=%f lnL=%f u: %f x: %f d: %f logt: %d",iter,BRENT_IT_MAX,*param,fu,u,x,d,logt); */ if(fu <= fx) { if(u >= x) a=x; else b=x; SHFT(v,w,x,u) SHFT(fv,fw,fx,fu) } else { if (u < x) a=u; else b=u; if (fu < fw || FABS(w-x) < SMALL) { v=w; w=u; fv=fw; fw=fu; } /* else if (fu <= fv || v == x || v == w) */ else if (fu < fv || FABS(v-x) < SMALL || FABS(v-w) < SMALL) { v=u; fv=fu; } } } /* PhyML_Printf("\n. Too many iterations in Generic_Brent_Lk !"); */ assert(FALSE); return(n_opt_step); /* Not Reached ?? *param=x; */ /* Not Reached ?? return fx; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* find ML erstimates of node heights given fixed substitution rates on branches. Also optimizes the overall substitution rate */ void Round_Optimize_Node_Heights(t_tree *tree) { phydbl cur_lnL, new_lnL; int n_iter; cur_lnL = UNLIKELY; new_lnL = Lk(NULL,tree); n_iter = 0; while(fabs(new_lnL - cur_lnL) > tree->mod->s_opt->min_diff_lk_local) { cur_lnL = tree->c_lnL; Opt_Node_Heights_Recurr(tree); Generic_Brent_Lk(&(tree->rates->clock_r), tree->rates->min_clock, tree->rates->max_clock, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,tree,NULL,NO,NO); printf("\n. cur_lnL=%f new_lnL=%f clock_r=%G root height=%f", cur_lnL,new_lnL,tree->rates->clock_r,tree->times->nd_t[tree->n_root->num]); new_lnL = tree->c_lnL; n_iter++; if(n_iter > 100) break; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Opt_Node_Heights_Recurr(t_tree *tree) { Opt_Node_Heights_Recurr_Pre(tree->n_root,tree->n_root->v[2],tree); Opt_Node_Heights_Recurr_Pre(tree->n_root,tree->n_root->v[1],tree); Generic_Brent_Lk(&(tree->times->nd_t[tree->n_root->num]), MIN(tree->times->t_prior_max[tree->n_root->num], MIN(tree->times->nd_t[tree->n_root->v[2]->num], tree->times->nd_t[tree->n_root->v[1]->num])), tree->times->t_prior_min[tree->n_root->num], tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,tree,NULL,NO,NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Opt_Node_Heights_Recurr_Pre(t_node *a, t_node *d, t_tree *tree) { if(d->tax) return; else { int i; phydbl t0,t2,t3; phydbl t_min,t_max; t_node *v2,*v3; v2 = v3 = NULL; for(i=0;i<3;i++) if((d->v[i] != a) && (d->b[i] != tree->e_root)) { if(!v2) { v2 = d->v[i]; } else { v3 = d->v[i]; } } Opt_Node_Heights_Recurr_Pre(d,v2,tree); Opt_Node_Heights_Recurr_Pre(d,v3,tree); t0 = tree->times->nd_t[a->num]; t2 = tree->times->nd_t[v2->num]; t3 = tree->times->nd_t[v3->num]; t_min = t0; t_max = MIN(t2,t3); t_min = MAX(t_min,tree->times->t_prior_min[d->num]); t_max = MIN(t_max,tree->times->t_prior_max[d->num]); t_min += tree->rates->min_dt; t_max -= tree->rates->min_dt; if(t_min > t_max) { PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } Generic_Brent_Lk(&(tree->times->nd_t[d->num]), t_min,t_max, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,tree,NULL,NO,NO); /* printf("\n. t%d = %f [%f;%f] lnL = %f",d->num,tree->times->nd_t[d->num],t_min,t_max,tree->c_lnL); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_RR_Params(t_tree *mixt_tree, int verbose) { t_tree *tree; t_rmat **r_mat; int *permut; int n_r_mat; int i; phydbl lk_new,lk_old; phydbl a,b; phydbl *opt_val; /* PhyML_Printf("\n. Optimizing RR params"); */ Set_Update_Eigen(YES,mixt_tree->mod); n_r_mat = 0; tree = mixt_tree; r_mat = NULL; permut = NULL; lk_old = UNLIKELY; lk_new = UNLIKELY; do { if(tree->is_mixt_tree == YES) tree = tree->next; for(i=0;imod->r_mat == r_mat[i]) break; if(i == n_r_mat) // tree->mod->r_mat was not found before { if(!r_mat) r_mat = (t_rmat **)mCalloc(1,sizeof(t_rmat *)); else r_mat = (t_rmat **)mRealloc(r_mat,n_r_mat+1,sizeof(t_rmat *)); r_mat[n_r_mat] = tree->mod->r_mat; n_r_mat++; if((tree->mod->r_mat->optimize == YES) && ((tree->mod->whichmodel == GTR) || ((tree->mod->whichmodel == CUSTOM) && (tree->mod->r_mat->n_diff_rr > 1)))) { int i,iter; opt_val = (phydbl *)mCalloc(tree->mod->r_mat->n_diff_rr,sizeof(phydbl)); iter = 0; do { lk_old = mixt_tree->c_lnL; int failed = NO; if(tree->mod->r_mat->n_diff_rr > 2) { for(i=0;imod->r_mat->n_diff_rr;i++) opt_val[i] = tree->mod->r_mat->rr_val->v[i]; BFGS(mixt_tree,tree->mod->r_mat->rr_val->v,tree->mod->r_mat->n_diff_rr,1.e-5,tree->mod->s_opt->min_diff_lk_local,1.e-3,NO,NO,NO, &Return_Abs_Lk, &Num_Derivative_Several_Param, &Lnsrch,&failed); if(failed == YES) for(i=0;imod->r_mat->n_diff_rr;i++) tree->mod->r_mat->rr_val->v[i] = opt_val[i]; } permut = Permutate(tree->mod->r_mat->n_diff_rr); for(i=0;imod->r_mat->n_diff_rr;i++) opt_val[i] = tree->mod->r_mat->rr_val->v[i]; for(i=0;imod->r_mat->n_diff_rr;i++) { // Remember rr_val = log(rr) hence the upper and lower bounds below a = tree->mod->r_mat->rr_val->v[permut[i]]-10.; b = tree->mod->r_mat->rr_val->v[permut[i]]+10.; Generic_Brent_Lk(&(tree->mod->r_mat->rr_val->v[permut[i]]), a,b, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); } if(mixt_tree->c_lnL < lk_old) { for(i=0;imod->r_mat->n_diff_rr;i++) tree->mod->r_mat->rr_val->v[i] = opt_val[i]; Lk(NULL,mixt_tree); } if(verbose) Print_Lk(tree->mixt_tree? tree->mixt_tree: tree,"[GTR parameters ]"); lk_new = mixt_tree->c_lnL; Free(permut); if(lk_new < lk_old - tree->mod->s_opt->min_diff_lk_global) { PhyML_Printf("\n. lk_new: %f lk_old: %f",lk_new,lk_old); assert(FALSE); } if(fabs(lk_new-lk_old) < tree->mod->s_opt->min_diff_lk_local) break; } /* while(++iter < tree->mod->s_opt->brent_it_max); */ while(++iter < 1); Free(opt_val); if(iter == tree->mod->s_opt->brent_it_max) { if(tree->verbose > VL0) { PhyML_Printf("\n. Failed to optimize GTR parameters this round..."); } } } } tree = tree->next; if(!tree) break; } while(1); if(r_mat) Free(r_mat); Set_Update_Eigen(NO,mixt_tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_TsTv(t_tree *mixt_tree, int verbose) { scalar_dbl **tstv; int n_tstv; t_tree *tree; int i; if (mixt_tree->mod->io->datatype != NT) return; /* PhyML_Printf("\n. Optimizing Tstv"); */ Set_Update_Eigen(YES,mixt_tree->mod); tstv = NULL; n_tstv = 0; tree = mixt_tree; do { if(tree->is_mixt_tree == YES) tree = tree->next; for(i=0;imod->kappa == tstv[i]) break; if(i == n_tstv) { if(!tstv) tstv = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else tstv = (scalar_dbl **)mRealloc(tstv,n_tstv+1,sizeof(scalar_dbl *)); tstv[n_tstv] = tree->mod->kappa; n_tstv++; if(tree->mod->kappa->optimize == YES) { phydbl a,c; /* a = tree->mod->kappa->v * .1; */ /* c = tree->mod->kappa->v * 10.; */ a = TSTV_MIN; c = TSTV_MAX; Generic_Brent_Lk(&(tree->mod->kappa->v), a,c, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); if(verbose) { Print_Lk(mixt_tree,"[Ts/ts ratio ]"); PhyML_Printf("[%10f]",tree->mod->kappa->v); } } } tree = tree->next; } while(tree); if(tstv) Free(tstv); Set_Update_Eigen(NO,mixt_tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Lvar(t_tree *mixt_tree, int verbose) { t_tree *tree; scalar_dbl **l_var; int n_l_var; int i; tree = mixt_tree; n_l_var = 0; l_var = NULL; do { if(tree->is_mixt_tree == YES) tree = tree->next; for(i=0;imod->l_var_sigma == l_var[i]) break; if(i == n_l_var) { if(!l_var) l_var = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else l_var = (scalar_dbl **)mRealloc(l_var,n_l_var+1,sizeof(scalar_dbl *)); l_var[n_l_var] = tree->mod->l_var_sigma; n_l_var++; if(tree->mod->gamma_mgf_bl == YES && tree->mod->s_opt->opt_gamma_br_len == YES) { Generic_Brent_Lk(&(tree->mod->l_var_sigma->v), tree->mod->l_var_min, tree->mod->l_var_max, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); if(verbose) { Print_Lk(tree,"[Branch len. var. ]"); PhyML_Printf("[%10f]",tree->mod->l_var_sigma->v); } } } tree = tree->next; } while(tree); if(l_var) Free(l_var); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Pinv(t_tree *mixt_tree, int verbose) { scalar_dbl **pinv; int n_pinv; t_tree *tree; int i; /* PhyML_Printf("\n. Optimizing Pinv"); */ Set_Update_Eigen(NO,mixt_tree->mod); pinv = NULL; n_pinv = 0; tree = mixt_tree; do { for(i=0;imod->ras->pinvar == pinv[i]) break; if(i == n_pinv) { if(!pinv) pinv = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else pinv = (scalar_dbl **)mRealloc(pinv,n_pinv+1,sizeof(scalar_dbl *)); pinv[n_pinv] = tree->mod->ras->pinvar; n_pinv++; if(tree->mod->ras->pinvar->optimize == YES && (tree->mod->ras->alpha->optimize == NO || tree->mod->ras->n_catg == 1)) { Generic_Brent_Lk(&(tree->mod->ras->pinvar->v), PINV_MIN,PINV_MAX, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); if(verbose) { Print_Lk(tree,"[P-inv ]"); PhyML_Printf("[%10f]",tree->mod->ras->pinvar->v); } } } tree = tree->next_mixt; } while(tree); if(pinv) Free(pinv); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Alpha(t_tree *mixt_tree, int verbose) { scalar_dbl **alpha; int n_alpha; t_tree *tree; int i; /* PhyML_Printf("\n. Optimizing Alpha"); */ Set_Update_Eigen(NO,mixt_tree->mod); alpha = NULL; n_alpha = 0; tree = mixt_tree; do { if(tree->mod->ras->alpha->optimize == YES && tree->mod->ras->n_catg > 1) { for(i=0;imod->ras->alpha == alpha[i]) break; if(i == n_alpha) { if(!alpha) alpha = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else alpha = (scalar_dbl **)mRealloc(alpha,n_alpha+1,sizeof(scalar_dbl *)); alpha[n_alpha] = tree->mod->ras->alpha; n_alpha++; if(tree->mod->ras->alpha->optimize == YES && tree->mod->ras->free_mixt_rates == NO && tree->mod->ras->pinvar->optimize == NO) { if(tree->mod->ras->n_catg > 1) { Generic_Brent_Lk(&(tree->mod->ras->alpha->v), ALPHA_MIN,ALPHA_MAX, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); } if(verbose) { Print_Lk(mixt_tree,"[Alpha ]"); PhyML_Printf("[%10f]",tree->mod->ras->alpha->v); } } } } tree = tree->next_mixt; } while(tree); if(alpha) Free(alpha); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Free_Rate(t_tree *mixt_tree, int verbose) { t_tree *tree; int fast; int i,pos,failed; int *permut; phydbl lk_before, lk_after; tree = mixt_tree; lk_before = lk_after = UNLIKELY; do { if((tree->mod->s_opt->opt_free_mixt_rates == YES) && (tree->mod->ras->free_mixt_rates == YES) && (tree->mod->ras->n_catg > 1)) { if(tree->mod->s_opt->serial_free_rates == YES) { fast = NO; lk_before = mixt_tree->c_lnL; Optimize_Free_Rate_Weights(tree,fast,verbose); lk_after = mixt_tree->c_lnL; Optimize_Free_Rate_Rr(tree,fast,verbose); lk_after = mixt_tree->c_lnL; if (lk_after < lk_before - tree->mod->s_opt->min_diff_lk_global) { PhyML_Fprintf(stderr, "\n. lk_before: %f lk_after: %f diff: %G", lk_before, lk_after, lk_before - lk_after); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Exit(""); } } else { fast = YES; lk_before = mixt_tree->c_lnL; Optimize_Free_Rate_Weights(tree,fast,verbose); lk_after = mixt_tree->c_lnL; Optimize_Free_Rate_Rr(tree,fast,verbose); lk_after = mixt_tree->c_lnL; if (lk_after < lk_before - tree->mod->s_opt->min_diff_lk_global) { PhyML_Fprintf(stderr,"\n. lk_before: %f lk_after: %f diff: %G",lk_before,lk_after,lk_before-lk_after); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } } if(FABS(lk_before - lk_after) > 0.001) { phydbl **x,*cpy; x = (phydbl **)mCalloc(2*tree->mod->ras->n_catg,sizeof(phydbl *)); cpy = (phydbl *)mCalloc(2*tree->mod->ras->n_catg,sizeof(phydbl)); lk_before = mixt_tree->c_lnL; pos = 0; for(i=0;imod->ras->n_catg;i++) x[pos++] = tree->mod->ras->gamma_rr_unscaled->v+i; for(i=0;imod->ras->n_catg;i++) x[pos++] = tree->mod->ras->gamma_r_proba_unscaled->v+i; pos = 0; for(i=0;imod->ras->n_catg;i++) cpy[pos++] = tree->mod->ras->gamma_rr_unscaled->v[i]; for(i=0;imod->ras->n_catg;i++) cpy[pos++] = tree->mod->ras->gamma_r_proba_unscaled->v[i]; failed = YES; BFGS_Nonaligned(tree,x,2*tree->mod->ras->n_catg,1.e-5,tree->mod->s_opt->min_diff_lk_global,1.e-5,NO,NO,NO, &Return_Abs_Lk, &Num_Derivative_Several_Param_Nonaligned, &Lnsrch_Nonaligned,&failed); if(failed == YES) { pos = 0; for(i=0;imod->ras->n_catg;i++) tree->mod->ras->gamma_rr_unscaled->v[i] = cpy[pos++]; for(i=0;imod->ras->n_catg;i++) tree->mod->ras->gamma_r_proba_unscaled->v[i] = cpy[pos++]; permut = Permutate(tree->mod->ras->n_catg); for(i=0;imod->ras->n_catg;++i) { phydbl a,c; a = tree->mod->ras->gamma_rr_unscaled->v[permut[i]] - 2.0; c = tree->mod->ras->gamma_rr_unscaled->v[permut[i]] + 2.0; Generic_Brent_Lk(&(tree->mod->ras->gamma_rr_unscaled->v[permut[i]]), a,c, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); } for(i=0;imod->ras->n_catg;++i) { phydbl a,c; a = tree->mod->ras->gamma_r_proba_unscaled->v[permut[i]] - 2.0; c = tree->mod->ras->gamma_r_proba_unscaled->v[permut[i]] + 2.0; Generic_Brent_Lk(&(tree->mod->ras->gamma_r_proba_unscaled->v[permut[i]]), a,c, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); } Free(permut); } lk_after = mixt_tree->c_lnL; if(lk_after < lk_before - tree->mod->s_opt->min_diff_lk_global) { PhyML_Fprintf(stderr,"\n. lk_before: %f lk_after: %f diff: %G",lk_before,lk_after,lk_before-lk_after); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } Free(x); Free(cpy); } } tree = tree->next_mixt; } while(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Free_Rate_Rr(t_tree *tree, int fast, int verbose) { phydbl lk_before, lk_after; lk_before = tree->c_lnL; if(tree->prev == NULL && tree->next == NULL) { int i; for(i=0;imod->ras->n_catg;i++) { phydbl a,c; // a = tree->mod->ras->gamma_rr_unscaled->v[i] - 2.0; // c = tree->mod->ras->gamma_rr_unscaled->v[i] + 2.0; a = - 2.0; c = + 2.0; Generic_Brent_Lk(&(tree->mod->ras->gamma_rr_unscaled->v[i]), a,c, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,tree,NULL,NO,NO); lk_after = tree->c_lnL; if(lk_after < lk_before - tree->mod->s_opt->min_diff_lk_global) { PhyML_Fprintf(stderr,"\n. lk_before: %f lk_after: %f diff: %G",lk_before,lk_after,lk_before-lk_after); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } } } else { int i; for(i=0;imod->ras->n_catg;i++) { phydbl a,c; // a = tree->mod->ras->gamma_rr_unscaled->v[i] - 2.0; // c = tree->mod->ras->gamma_rr_unscaled->v[i] + 2.0; a = - 2.0; c = + 2.0; Generic_Brent_Lk(&(tree->mod->ras->gamma_rr_unscaled->v[i]), a,c, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,tree,NULL,NO,NO); } } lk_after = tree->c_lnL; if(lk_after < lk_before - tree->mod->s_opt->min_diff_lk_global) { PhyML_Fprintf(stderr,"\n. lk_before: %f lk_after: %f diff: %G",lk_before,lk_after,lk_before-lk_after); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } if(verbose) Print_Lk(tree,"[Rate class values ]"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Free_Rate_Weights(t_tree *tree, int fast, int verbose) { int i,j; phydbl wm, lk_before, lk_after; lk_before = tree->c_lnL; if(fast == YES) { tree->mod->ras->normalise_rr = NO; for(i=0;imod->ras->n_catg;i++) tree->mod->ras->gamma_rr_unscaled->v[i] = log(tree->mod->ras->gamma_rr->v[i]); } for(i=0;imod->ras->n_catg;i++) { phydbl a,c; // a = tree->mod->ras->gamma_r_proba_unscaled->v[i] - 2.0; // c = tree->mod->ras->gamma_r_proba_unscaled->v[i] + 2.0; a = - 2.0; c = + 2.0; Generic_Brent_Lk(&(tree->mod->ras->gamma_r_proba_unscaled->v[i]), a,c, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,tree,NULL,NO,NO); if(fast == YES) { wm = Weighted_Mean(tree->mod->ras->gamma_rr->v, tree->mod->ras->gamma_r_proba->v, tree->mod->ras->n_catg); for(j=0;j<2*tree->n_otu-1;++j) tree->a_edges[j]->l->v *= wm; for(j=0;jmod->ras->n_catg;j++) tree->mod->ras->gamma_rr->v[j] /= wm; for(j=0;jmod->ras->n_catg;j++) tree->mod->ras->gamma_rr_unscaled->v[j] = log(tree->mod->ras->gamma_rr->v[j]); } } tree->mod->ras->normalise_rr = YES; tree->mod->ras->gamma_rr_unscaled->v[0] = 0.0; for(j=1;jmod->ras->n_catg;j++) tree->mod->ras->gamma_rr_unscaled->v[j] = log(tree->mod->ras->gamma_rr->v[j]/tree->mod->ras->gamma_rr->v[0]); lk_after = tree->c_lnL; if(lk_after < lk_before - tree->mod->s_opt->min_diff_lk_global) { PhyML_Fprintf(stderr,"\n. lk_before: %f lk_after: %f diff: %G",lk_before,lk_after,lk_before-lk_after); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit(""); } if(verbose) Print_Lk(tree,"[Rate class freqs. ]"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_State_Freqs(t_tree *mixt_tree, int verbose) { /* vect_dbl **freqs; */ /* int n_freqs; */ t_tree *tree; int i; phydbl lk_new,lk_old; int *permut; phydbl *opt_val; /* PhyML_Printf("\n. Optimizing State Freqs"); */ Set_Update_Eigen(YES,mixt_tree->mod); /* freqs = NULL; */ /* n_freqs = 0; */ tree = mixt_tree; lk_old = UNLIKELY; lk_new = UNLIKELY; opt_val = NULL; do { if(tree == mixt_tree && tree->next != NULL) tree = tree->next; if(tree->mod->e_frq->type == ML) { int iter; opt_val = (phydbl *)mCalloc(tree->mod->ns,sizeof(phydbl)); iter = 0; do { lk_old = mixt_tree->c_lnL; int failed = NO; for(i=0;imod->ns;i++) opt_val[i] = tree->mod->e_frq->pi_unscaled->v[i]; /* PhyML_Printf("\n. -- BFGS lk=%f",mixt_tree->c_lnL); */ BFGS(mixt_tree,tree->mod->e_frq->pi_unscaled->v,tree->mod->ns,1.e-5,tree->mod->s_opt->min_diff_lk_local,1.e-2,NO,NO,NO, &Return_Abs_Lk, &Num_Derivative_Several_Param, &Lnsrch,&failed); /* PhyML_Printf("\n. ++ BFGS lk=%f",mixt_tree->c_lnL); */ /* for(i=0;imod->ns;i++) PhyML_Printf("\n. %p %f %f",tree,tree->mod->e_frq->pi_unscaled->v[i],tree->mod->e_frq->pi->v[i]); */ if(failed == YES) for(i=0;imod->ns;i++) tree->mod->e_frq->pi_unscaled->v[i] = opt_val[i]; permut = Permutate(tree->mod->ns); for(i=0;imod->ns;++i) { phydbl a,c; a = tree->mod->e_frq->pi_unscaled->v[permut[i]] / 2.; c = tree->mod->e_frq->pi_unscaled->v[permut[i]] * 2.+1; /* PhyML_Printf("\n. -- lk=%f",mixt_tree->c_lnL); */ Generic_Brent_Lk(&(tree->mod->e_frq->pi_unscaled->v[permut[i]]), /* UNSCALED_E_FRQ_MIN,UNSCALED_E_FRQ_MAX, */ a,c, tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); /* PhyML_Printf("\n. ++ lk=%f",mixt_tree->c_lnL); */ } Free(permut); if(verbose) { Print_Lk(mixt_tree,"[Character freqs. ]"); } lk_new = mixt_tree->c_lnL; /* PhyML_Printf("\n. lk_new=%f lk_old=%f",lk_new,lk_old); */ assert(lk_new > lk_old - tree->mod->s_opt->min_diff_lk_local); if(fabs(lk_new-lk_old) < tree->mod->s_opt->min_diff_lk_local) break; } /* while(++iter < tree->mod->s_opt->brent_it_max); */ while(++iter < 1); Free(opt_val); if(iter == tree->mod->s_opt->brent_it_max) { if(tree->verbose > VL0) { PhyML_Printf("\n. Failed to optimize frequency parameters this round..."); } } } tree = tree->next; } while(tree); Set_Update_Eigen(NO,mixt_tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Rmat_Weights(t_tree *mixt_tree, int verbose) { scalar_dbl *r_mat_weight; /* PhyML_Printf("\n. Optimizing Rmat Weights"); */ Set_Update_Eigen(NO,mixt_tree->mod); if(mixt_tree->is_mixt_tree == NO) return; r_mat_weight = mixt_tree->next->mod->r_mat_weight; if (mixt_tree->next->mod->s_opt->opt_rmat_weight == YES) { do { phydbl a, c; a = r_mat_weight->v * .1; c = r_mat_weight->v * 10.; Generic_Brent_Lk(&(r_mat_weight->v), a, c, mixt_tree->mod->s_opt->min_diff_lk_local, mixt_tree->mod->s_opt->brent_it_max, mixt_tree->mod->s_opt->quickdirty, Wrap_Lk, NULL, mixt_tree, NULL, NO, NO); if (verbose) Print_Lk(mixt_tree, "[Rate mat. weights ]"); r_mat_weight = r_mat_weight->next; } while (r_mat_weight); } Set_Update_Eigen(NO,mixt_tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Efrq_Weights(t_tree *mixt_tree, int verbose) { scalar_dbl *e_frq_weight; /* PhyML_Printf("\n. Optimizing Efrq Weights"); */ Set_Update_Eigen(NO,mixt_tree->mod); if(mixt_tree->is_mixt_tree == NO) return; e_frq_weight = mixt_tree->next->mod->e_frq_weight; if(mixt_tree->next->mod->s_opt->opt_efrq_weight == YES) { do { phydbl a,c; a = e_frq_weight->v * .1; c = e_frq_weight->v * 10.+1; Generic_Brent_Lk(&(e_frq_weight->v), a,c, mixt_tree->mod->s_opt->min_diff_lk_local, mixt_tree->mod->s_opt->brent_it_max, mixt_tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); if(verbose) { Print_Lk(mixt_tree,"[Equ. frq. weights ]"); } e_frq_weight = e_frq_weight->next; } while(e_frq_weight); } Set_Update_Eigen(NO,mixt_tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Optimize_Lambda(t_tree *mixt_tree, int verbose) { scalar_dbl **lambda; int n_lambda; t_tree *tree; int i; if (mixt_tree->mod->io->datatype != NT) return; /* PhyML_Printf("\n. Optimizing Lambda"); */ Set_Update_Eigen(YES,mixt_tree->mod); lambda = NULL; n_lambda = 0; tree = mixt_tree; do { if(tree->next) tree = tree->next; for(i=0;imod->lambda == lambda[i]) break; if(i == n_lambda) { if(!lambda) lambda = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else lambda = (scalar_dbl **)mRealloc(lambda,n_lambda+1,sizeof(scalar_dbl *)); lambda[n_lambda] = tree->mod->lambda; n_lambda++; if(tree->mod->lambda->optimize == YES) { /* PhyML_Printf("\n-- Lambda: %f",tree->c_lnL); */ Generic_Brent_Lk(&(tree->mod->lambda->v), 0.001,100., tree->mod->s_opt->min_diff_lk_local, tree->mod->s_opt->brent_it_max, tree->mod->s_opt->quickdirty, Wrap_Lk,NULL,mixt_tree,NULL,NO,NO); /* PhyML_Printf("\n++ Lambda: %f",tree->c_lnL); */ if(verbose) { Print_Lk(mixt_tree,"[Lambda ]"); PhyML_Printf("[%10f]",tree->mod->lambda->v); } } } tree = tree->next; } while(tree); if(lambda) Free(lambda); Set_Update_Eigen(NO,mixt_tree->mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYTIME) void Least_Square_Node_Ages(t_tree *tree) { phydbl new_error,cur_error,sum_error; int i,j; phydbl young,old; int dir1,dir2; t_node *n; Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); TIMES_Randomize_Node_Ages(tree); assert(fabs(tree->times->nd_t[tree->n_root->num]) > SMALL); cur_error = BIG; new_error = BIG; do { cur_error = new_error; sum_error = 0.0; for(i=0;i<2*tree->n_otu-1;++i) { if(tree->a_nodes[i]->tax == NO) { n = tree->a_nodes[i]; old = -1.; dir1 = dir2 = -1; for(j=0;j<3;++j) { if(n->v[j] != n->anc && n->b[j] != tree->e_root) { if(dir1 < 0) dir1 = j; else dir2 = j; } else { if(n != tree->n_root) old = tree->times->nd_t[n->anc->num]; else old = 2.*tree->times->nd_t[tree->n_root->num]; } } young = MIN(tree->times->nd_t[n->v[dir1]->num], tree->times->nd_t[n->v[dir2]->num]); sum_error += Generic_Brent(tree->times->nd_t + i, young,old,1.E-10,10000, TIMES_Least_Square_Criterion, tree); /* PhyML_Printf("\n. Node %3d%c time: %15f err: %15f young: %15f old: %15f %15f %15f", */ /* i, */ /* (n == tree->n_root)?'*':' ', */ /* tree->times->nd_t[i], */ /* sum_error, */ /* young,old, */ /* tree->times->nd_t[n->v[dir1]->num], */ /* tree->times->nd_t[n->v[dir2]->num]); */ } #if (defined PHYREX || PHYRIME) if(RATES_Check_Node_Times(tree)) Exit("\n"); #endif } sum_error += Generic_Brent(&(tree->rates->clock_r), tree->rates->min_clock, tree->rates->max_clock, 1.E-10,10000, TIMES_Least_Square_Criterion, tree); /* PhyML_Printf("\n clock_r: %g",tree->rates->clock_r); */ new_error = sum_error; /* assert(new_error < cur_error+SMALL); */ } while(fabs(new_error-cur_error) > 1.E-10); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/optimiz.h000066400000000000000000000231601501136442400210370ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef OPTIMIZ_H #define OPTIMIZ_H #include "free.h" #include "lk.h" #include "mg.h" #include "models.h" #include "tiporder.h" #include "utilities.h" void Optimize_Br_Len_Serie(int n_max_iter, t_tree *tree); void Optimiz_Ext_Br(t_tree *tree); void Optimize_Param_Parall(t_tree *tree); phydbl Optimize_Branch_Quad(t_tree *tree, calign *cdata, t_edge *b_fcus); void Optimize_After_Hide(t_tree *tree, calign *cdata, t_node *h); void Round_Optimize(t_tree *tree, int n_round_max); int Dist_Seq_Brak(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, calign *data, int num1, int num2, t_mod *mod); phydbl Dist_Seq_Brent(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, calign *data, int num1, int num2, t_mod *mod); phydbl Kappa_Golden(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_tree *tree, calign *cdata); phydbl Lambda_Golden(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_tree *tree, calign *cdata); phydbl Alpha_Golden_Br_Opt(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_tree *tree, calign *cdata, int n_opt, phydbl *init_l); phydbl Alpha_Golden(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_tree *tree, calign *cdata); phydbl Br_Len_Golden(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_edge *b_fcus, t_tree *tree); phydbl Br_Len_Opt(phydbl *l, t_edge *b, t_tree *tree); int Br_Len_Brak(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, t_edge *b_fcus, t_tree *tree); phydbl Optimize_Path_Length(t_mod *mod, calign *cdata, t_edge *a, int lra, t_edge *b, int lrb, phydbl i_len); void Optimize_Param_Serie(t_node *a, t_node *d, t_edge *b_fcus, t_tree *tree, calign *cdata, int n_passes); phydbl Optimize_Dist(t_mod *mod, phydbl init, calign *twoseqs); phydbl Pinvar_Golden(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_tree *tree, calign *cdata, int n_iter_max); void Optimize_Pinvar(t_tree *tree); int Lambda_Brak(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, t_tree *tree); int Kappa_Brak(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, t_tree *tree); int Alpha_Brak(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, t_tree *tree); int Pinvar_Brak(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, t_tree *tree); void Optimiz_All_Free_Param(t_tree *tree, int verbose); void Optimiz_RRparam_GTR(t_tree *tree, int num_param); phydbl RRparam_GTR_Golden(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_tree *tree, calign *cdata, phydbl *param, int n_iter_max); int Powell_GTR_Param(t_tree *tree, phydbl *p, int n, phydbl ftol); phydbl Linmin_GTR_Param(t_tree *tree, phydbl *p, phydbl *xi, int n); phydbl F1dim(t_tree *tree, phydbl x, phydbl *p, phydbl *xi, phydbl n); int Mnbrak_1dim(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, t_tree *tree, phydbl *p, phydbl *xi, phydbl n); phydbl Brent_1dim(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_tree *tree, phydbl *p, phydbl *xi, phydbl n); int Min_With_Derivatives(t_tree *tree, phydbl *p, int n, phydbl ftol, phydbl step_size, phydbl (*func)(void), void (*dfunc)(void), phydbl (*linmin)(void)); void BFGS(t_tree *tree, phydbl *p, int n, phydbl gtol, phydbl difff, phydbl step_size, short int logt, short int expt, short int is_positive, phydbl (*func)(t_tree *tree), int (*dfunc)(t_tree *tree, phydbl *param, int n_param, phydbl stepsize, short int logt, short int expt, phydbl (*func)(t_tree *tree), phydbl *derivatives, int is_positive), int (*lnsrch)(t_tree *tree, int n, phydbl *xold, phydbl fold, phydbl *g, phydbl *p, phydbl *x, phydbl *f, phydbl stpmax, int *check, short int logt, short int expt, int is_positive), int *failed); void BFGS_Nonaligned( t_tree *tree, phydbl **p, int n, phydbl gtol, phydbl difff, phydbl step_size, short int logt, short int expt, short int is_positive, phydbl (*func)(t_tree *tree), int (*dfunc_nonaligned)(t_tree *tree, phydbl **param, int n_param, phydbl stepsize, short int logt, short int expt, phydbl (*func)(t_tree *tree), phydbl *derivatives, int is_positive), int (*lnsrch_nonaligned)(t_tree *tree, int n, phydbl **xold, phydbl fold, phydbl *g, phydbl *p, phydbl *x, phydbl *f, phydbl stpmax, int *check, short int logt, short int expt, int is_positive), int *failed); void Optimize_Single_Param_Generic(t_tree *tree, phydbl *param, phydbl lim_inf, phydbl lim_sup, phydbl tol, int n_max_iter, int quickdirty); int Generic_Brak_Lk(phydbl *param, phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, phydbl min, phydbl max, phydbl (*obj_func)(t_edge *, t_tree *, supert_tree *), t_edge *branch, t_tree *tree, supert_tree *stree); int Generic_Brak(phydbl *param, phydbl *ax, phydbl *bx, phydbl *cx, phydbl *fa, phydbl *fb, phydbl *fc, phydbl lim_inf, phydbl lim_sup, t_tree *tree); void Optimize_Br_Len_Serie_Post(t_node *a, t_node *d, t_edge *b_fcus, t_tree *tree); void Optimize_Global_Rate(t_tree *tree); phydbl Fast_Br_Len(t_edge *b, t_tree *tree, int approx); void EM_Dist(t_mod *mod, calign *data); phydbl Dist_F_Brent(phydbl ax, phydbl bx, phydbl cx, phydbl tol, int n_iter_max, phydbl *param, phydbl *F, t_mod *mod); int Dist_F_Brak(phydbl *ax, phydbl *bx, phydbl *cx, phydbl *F, phydbl *param, t_mod *mod); void Opt_Dist_F(phydbl *dist, phydbl *F, t_mod *mod); phydbl Missing_Dist_Brent(phydbl ax, phydbl bx, phydbl cx, phydbl tol, int n_iter_max, int x, int y, matrix *mat); int Missing_Dist_Brak(phydbl *ax, phydbl *bx, phydbl *cx, int x, int y, matrix *mat); void Opt_Missing_Dist(int x, int y, matrix *mat); int Optimiz_Alpha_And_Pinv(t_tree *tree, int verbose); phydbl Node_Time_Brent(phydbl ax, phydbl bx, phydbl cx, phydbl tol, t_node *anc, t_node *des, t_tree *tree, int n_iter_max); phydbl Time_Stamps_Mult_Brent(phydbl ax, phydbl bx, phydbl cx, phydbl tol, t_tree *tree, int n_iter_max); phydbl Branch_Rate_Shape_Brent(phydbl ax, phydbl bx, phydbl cx, phydbl tol, phydbl *xmin, t_tree *tree, int n_iter_max); phydbl Node_Time_Brent_Fixed_Br_Len(phydbl ax, phydbl bx, phydbl cx, phydbl tol, t_node *n, t_tree *tree, int n_iter_max); int Generic_Brent_Lk(phydbl *param, phydbl ax, phydbl cx, phydbl tol, int n_iter_max, int quickdirty, phydbl (*obj_func)(t_edge *, t_tree *, supert_tree *), t_edge *branch, t_tree *tree, supert_tree *stree, short int logt, short int expt); void Round_Optimize_Node_Heights(t_tree *tree); void Opt_Node_Heights_Recurr_Pre(t_node *a, t_node *d, t_tree *tree); void Opt_Node_Heights_Recurr(t_tree *tree); int Lnsrch(t_tree *tree, int n, phydbl *xold, phydbl fold, phydbl *g, phydbl *p, phydbl *x, phydbl *f, phydbl stpmax, int *check, short int logt, short int expt, int is_positive); int Lnsrch_Nonaligned(t_tree *tree, int n, phydbl **xold, phydbl fold, phydbl *g, phydbl *p, phydbl *x, phydbl *f, phydbl stpmax, int *check, short int logt, short int expt, int is_positive); void Optimize_RR_Params(t_tree *mixt_tree, int verbose); void Optimize_TsTv(t_tree *mixt_tree, int verbose); void Optimize_Lambda(t_tree *mixt_tree, int verbose); void Optimize_Alpha(t_tree *mixt_tree, int verbose); void Optimize_Pinv(t_tree *mixt_tree, int verbose); void Optimize_State_Freqs(t_tree *mixt_tree, int verbose); void Optimize_Rmat_Weights(t_tree *mixt_tree, int verbose); void Optimize_Efrq_Weights(t_tree *mixt_tree, int verbose); void Optimize_Free_Rate(t_tree *mixt_tree, int verbose); void Optimize_Free_Rate_Weights(t_tree *tree, int fast, int verbose); void Optimize_Free_Rate_Rr(t_tree *tree, int fast, int verbose); void Optimize_Br_Len_Multiplier(t_tree *tree, int verbose); phydbl Generic_Brent(phydbl *param, phydbl ax, phydbl cx, phydbl tol, int n_iter_max, phydbl (*obj_func)(t_tree *), t_tree *tree); void Least_Square_Node_Ages(t_tree *tree); void Optimize_Lvar(t_tree *mixt_tree, int verbose); void Optimize_M4mod(t_tree *tree, int verbose); #endif stephaneguindon-phyml-76a39c8/src/p1.nxs000066400000000000000000001414321501136442400202500ustar00rootroot0000000000000087 561 p1c066-126 TAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGCCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGAAAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAAGATCATACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTACGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGTTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c003-24 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATCTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c045-440 GAAGAGGTAGTAACTAGATCTGAAAATTTAACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGCCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAGCTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c003-18 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c061-11 NAAGAGGTAGTAATTAGATCTGAAAATTTCACGAACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGGAATAATAGGAAATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAAAACTTTAACACGGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAAAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGACACGGACGAAATCTTCAGACCTGGA p1c077-308 NAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAACGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACATTAGTAAAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGACGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAACGGACAAATTAGATGTTCATCAAATATTGCAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c061-05 NAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATGGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGAAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAGCAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAAGGAATATCACACTCCCATGCAAAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c024-52 NAAGAGGTAGTAATTAGATCTGACAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGCCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTAGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGGCGAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACGAGAGATGGTGGTAACATGAGCGAAGTCTTCAGACCTGGA p1c045-93 NAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACATGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGGGATATAAGAAAAGCACATTGTAACCTTAGTAGAACAGAATGGGATAACACTTTAAAACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTCCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c014-05 NAAGAGGTAGTAATTAGATCTGAAAAGTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c068-150 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGCATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGACAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c068-144 CAAGAGGTAGTAATTAGATCTGAGAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGAAAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGGGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c034-64 TAAGAGGTAGTAATTAGATCTGAAAATTTAACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGCTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAAGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c003-17 CAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAGGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTGTTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c014-22 NAAGAGGTAGTAATTAGATCCGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAAAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAGAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c024-57 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAACGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATCAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAAAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAAAGCAAAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGCGGAGGGAAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAGCGAAATCTTCAGACCTGGA p1c077-313 TAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGAAGAGCATTTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAACAGCATGGAATAACACTTTGAGACAGATAGTTGAAAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGATCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGACGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAACGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACATAAACGAAATCTTCAGACCTGGA p1c061-10 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAAATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTGAGAAATTAAGAGAACAATCTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTAAAGGGAATATCACACTCCCATGCAAAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c045-98 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAACAACACTTTAACACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCGGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAAAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGACACGAACGAAATCTTCAGACCTGGA p1c034-81 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGACAACACGAACGAAATCTTCAGACCTGGA p1c077-307 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAACGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAACAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGCAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGACGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAACGGACAAATTAGATGTTCATCAGATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c061-04 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAGAAGTATACATGTAGGACCAGGGAGAGCAATTTATGCAACAGGAAGAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAACCAGGTAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAGCGAAACCTTCAGACCTGGA p1c066-136 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCATACTCCAATGCAGAATAAAACAAATCATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c045-81 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATGCAGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGCTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c034-75 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACGGCTGAAGGAGCCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c077-176 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGCAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGAAGAGCATTTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAACAGCATGGAATAACACTTTGAGACAGATAGTTGAAAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGATCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGACGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCCCCCATCAGCGGACAAATTAGATGTTCATCAAATACTACAGGGCTGCTATTAACAAGAGATGGTGGCAACATAGACGAAATCTTCAGACCTGGA p1c068-149 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAGAAGTATATCGGTAGGACCAGGGAGAGCAATTTATGCAACAGAAAGAATAATAGGAGATATAAGAAAAGCACATTGTAACATTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGGATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCACGCTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGG p1c014-33 GAAGAGGTAGTAATTAGATCTGAAAATTTCATGGACAACGCTAAAACTATAATAGTACAGCTGAGGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACGAGAGATGGTGGTAACACGAGCGAAGTTTTCAGACCTGGA p1c014-27 GAAGAGGTAGTAATTAGATCTGAGAATTTCATGGACAATGCTAAAACCATAATAGTACAGCTGAGGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAGATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGATCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGCTGAATACTGAAGGGAATATCACACTCCCATGTAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAGTCTTCAGACCTGGA p1c051-115 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAGGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGTAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATTTTCAGACCTGGA p1c034-86 GTAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c045-92 GAAGAGGTAGTAATTAGATCTGAAAATTTAACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGCCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATACGACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c045-86 TAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGGCAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAACACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCCCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAAAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c051-326 GAAGAGATAGTAATTAGATCTGAAAATTTAACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGGCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACATGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAAATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGCTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCTAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAAGGATGAAGGGACTATCACGCTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGGAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTACTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c014-38 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAACGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACCATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGATGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c024-62 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGACACGAGCGAAATCTTCAGACCTGGA p1c003-16 GAAGAGGTAGTAATTAGATCTGAAAATTCCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c077-306 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGGGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAACGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACACTAGTAAAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGACGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAGACGAAATCTTCAGACCTGGA p1c061-03 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAGCAGATAGTCGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAAGATCATGCTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAGGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAAATTAGATGTTCATCAAATATTACAGGGTTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c014-32 TAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c051-120 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGAAAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c077-317 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACTATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCATTTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGACGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTCCAGACCTGGA p1c051-114 ACAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGCCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGAAAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAAGATCATACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTACGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGTTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c024-44 GAAGAGGTAGTAATTAGATCTGACAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATGCAGGTAGGACCAGGGAGAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGGAGGAAAAGCATTGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGGCACGAACGAAATCTTCAGACCTGGA p1c061-08 AAAGAGGTAGTAATTAGATCTGAAAATTTCACAGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAGAAGTATATCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAAGAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c068-159 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTATTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAAAGAATATCACACTCCCATGCAGAGTAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c034-79 GAAGAGGTAGTAATTAGATCTGACAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGCCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAATCTTTAACCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATGGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTACGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c066-123 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGACAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAGTTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAAGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c024-61 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATGATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAGGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGACACGAGCGAAATCTTCAGACCTGGA p1c003-15 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATTTAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTGAATTGTAGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c024-55 GAAGAGGTAGTAATTAGATCTGAAAATTTAACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAGAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACGAGAGATGGTGGTAACACGAGTGAAATCTTCAGACCTGGA p1c077-311 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAACGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAACAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAACATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAACGGACAAATTAGATGTTCATCAAATATTACAGGGCTACTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c045-96 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGCCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTACAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGGAGGGAATATCACACTCCCATGCAAAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGACACGAACGAAATCTTCAGACCTGGA p1c066-134 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTATACAAGACCCAGTAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCTTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAAGGAATATCATACTCCCATGCAAAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c066-128 GAAGAGTTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGTAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATTTTCAGACCTGGA p1c068-147 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAGGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGACACAAACGAAATCTTCAGACCTGGA p1c034-67 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACGATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGGGGGGGATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c014-25 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACGCTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c061-13 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAGAAGTATACGTGTAGGACCAGGGAGAGCAATTTATGCAACAGGAAGAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAACCAGGTAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAAGATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGTTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c045-90 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGCCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACCGGTAGGATCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAGCAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCCCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c068-158 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGAAGCAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACCTTAAAACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAACAGTCTTTAATCGACCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAACGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c045-84 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACGCTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATCCTGAAAGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATTAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c068-141 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTTAGACCTGGA p1c003-20 GTATTGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c024-60 GAAGAGGTAGTAATTAGATCTGACAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTATTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTGTAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCTCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGGCACGAACGAAATCTTCAGACCTGGA p1c061-01 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGAAAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAAGATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAGCGAAACCTTCAGACCTGGA p1c077-173 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAACGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGGAGATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAGATGAAATCTTCAGACCTGGA p1c066-127 TAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAGGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGTAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATTTTCAGACCTGGA p1c068-146 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c034-66 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAATATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c077-167 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAACGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATGTAAGAAAAGCACATTGTAACCTTAGTAGAACAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGGAGGGACGACCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAACGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAGACGAAATCTTCAGACCTGGA p1c024-71 GAAGAGGTAGTAATTAGATCTGACAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGAGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGGCACGAACGAAATCTTCAGACCTGGA p1c014-30 TTAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGACACGAGCGAAATCTTCAGACCTGGA p1c003-19 TAAGGGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c014-24 GAAGAGATAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGCGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGGATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACGAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c077-315 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAACGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAACAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGAGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGATGATCATACTCCAATGCAGAATAAAACAAATTGTAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGCGGACAGATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c061-12 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGAAGCCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAAATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAGCAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAAGGAATATCACACTCCCATGCAAAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTGACACGAGCGAAATCTTCAGACCTGGA p1c045-435 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACGATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAACTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTGGAATACTGCAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c061-06 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAGAAGTATATCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAAGAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAAGATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGCATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAGCGAAACCTTCAGACCTGGA p1c051-106 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCCAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACCGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGGAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c034-77 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAGAGCAATTTATGCAACAGGAGAAATAATAGGAGATATAAGACAAGCACACTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAATATGTGGCAGGAAGTAGGAAAAGCAGTGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c051-323 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGCCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAACAACACTTTAACACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTAAAGGGAATATCACACTCACATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAGGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c066-121 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGGAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAAGATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGTTGCTATTAACAAGAGATGGTGGCAACACGAACGAAATCTTCAGACCTGGA p1c024-53 GAAGAGGTAGTAATTAGATCTGACAATTTCATGGACAATGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTGTACAGGTAGGACCAGGGAGAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGCTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCGGCACGAACGAAATCTTCAGACCTGGA p1c014-12 GAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAACGCTAAAACCATAATAGTACAGCTGAAGGAGTCTGTAGTAATTAATTGTACAAGACCCAATAACAATACAAGAAAAAGTATACAGGTAGGACCAGGGAAAGCAATTTATACAACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAGCAGAATGGAATAACACTTTAAAACAGATAGTTAAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCAATCCTCAGGAGGGGACCCAGAAATTGTAATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATTCAACACAACTGTTTAATAGTACTTGGTTGAATACTGAAGGGAATATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGAGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGTAACACGAGCGAAATCTTCAGACCTGGA p1c066-132 TTAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGAAAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAATACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCACACTCCCATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA p1c068-151 AAAGAGGTAGTAATTAGATCTGAAAATTTCACGGACAATGCTAAAACCATAATAGTACAGCTGAATGAGTCTGTAGTAATTAATTGTACAAGACCCAGTAACAATACAAGAAGAAGTATAGCGGTAGGACCAGGGAGAGCAATTTATGCAACAGATAAAATAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAGCAGCATGGAATAACACTTTAAGACAGATAGTTGAGAAATTAAGAGAACAATTTGGGAATAAAACAATAGTCTTTAATCGATCCTCAGGAGGGGACCCAGAAATTGTGATGCACAGTTTTAATTGTGGAGGGGAATTTTTCTACTGTAGTACAACACAACTGTTTAATAGTACTTGGTTAAATACTGAAGGGAAGATCATACTCCAATGCAGAATAAAACAAATTATAAACATGTGGCAGGAAGTAGGAAAAGCAATGTATGCCCCTCCCATCAGTGGACAAATTAGATGTTCATCAAATATTACAGGGCTGCTATTAACAAGAGATGGTGGCAACACAAACGAAATCTTCAGACCTGGA stephaneguindon-phyml-76a39c8/src/pars.c000066400000000000000000001164241501136442400203120ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "pars.h" /*********************************************************/ int Pars(t_edge *b, t_tree *tree) { int site,n_patterns; if(tree->is_mixt_tree == YES) { MIXT_Pars(b,tree); return tree->c_pars; } n_patterns = tree->data->n_pattern; if(b == NULL) { Post_Order_Pars(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); if(tree->both_sides == YES) Pre_Order_Pars(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); } if(b == NULL) b = tree->a_nodes[0]->b[0]; tree->c_pars = 0; for(site=0;sitesite_pars[site] = 0; tree->curr_site = site; tree->site_pars[site] = Pars_Core(b,tree); tree->c_pars += tree->site_pars[site] * tree->data->wght[site]; /* printf("\n. site %d pars: %d",site,tree->c_pars); */ } return tree->c_pars; } /*********************************************************/ void Post_Order_Pars(t_node *a, t_node *d, t_tree *tree) { int i,dir; dir = -1; if(d->tax) return; else { for(i=0;i<3;i++) { if(d->v[i] != a) Post_Order_Pars(d,d->v[i],tree); else dir = i; } Get_All_Partial_Pars(tree,d->b[dir],a,d); } } /*********************************************************/ void Pre_Order_Pars(t_node *a, t_node *d, t_tree *tree) { int i; if(d->tax) return; else { for(i=0;i<3;i++) { if(d->v[i] != a) { Get_All_Partial_Pars(tree,d->b[i],d->v[i],d); Pre_Order_Pars(d,d->v[i],tree); } } } } /*********************************************************/ void Get_All_Partial_Pars(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d) { Update_Partial_Pars(tree,b_fcus,d); } /*********************************************************/ void Site_Pars(t_tree *tree) { tree->site_pars[tree->curr_site] = Pars_Core(tree->a_nodes[0]->b[0],tree); } /*********************************************************/ void Init_Partial_Pars_Tips(t_tree *tree) { int curr_site,i,j; short int *state_v; int dim1; dim1 = tree->mod->ns; state_v = (short int *)mCalloc(tree->mod->ns,sizeof(short int)); for(curr_site=0;curr_sitedata->n_pattern;curr_site++) { for(i=0;in_otu;i++) { if(tree->a_nodes[i]->b[0]->rght->tax != 1) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } if(tree->io->datatype == NT) { Init_Tips_At_One_Site_Nucleotides_Int(tree->a_nodes[i]->c_seq->state[curr_site], 0, state_v); for(j=0;jmod->ns;j++) tree->a_nodes[i]->b[0]->p_pars_r[curr_site*dim1+j] = MAX_PARS; for(j=0;jmod->ns;j++) if(state_v[j] > 0.5) tree->a_nodes[i]->b[0]->p_pars_r[curr_site*dim1+j] = 0; } else if(tree->io->datatype == AA) { Init_Tips_At_One_Site_AA_Int(tree->a_nodes[i]->c_seq->state[curr_site], 0, state_v); for(j=0;jmod->ns;j++) tree->a_nodes[i]->b[0]->p_pars_r[curr_site*dim1+j] = MAX_PARS; for(j=0;jmod->ns;j++) if(state_v[j] > 0.5) tree->a_nodes[i]->b[0]->p_pars_r[curr_site*dim1+j] = 0; } else if(tree->io->datatype == GENERIC) { Init_Tips_At_One_Site_Generic_Int(tree->a_nodes[i]->c_seq->state+curr_site*tree->mod->io->state_len, tree->mod->ns, tree->mod->io->state_len, 0, state_v); for(j=0;jmod->ns;j++) tree->a_nodes[i]->b[0]->p_pars_r[curr_site*dim1+j] = MAX_PARS; for(j=0;jmod->ns;j++) if(state_v[j] > 0.5) tree->a_nodes[i]->b[0]->p_pars_r[curr_site*dim1+j] = 0; } } } Free(state_v); } /*********************************************************/ void Init_Ui_Tips(t_tree *tree) { int curr_site,i,j,br; short int *state_v; state_v = (short int *)mCalloc(tree->mod->ns,sizeof(short int)); for(curr_site=0;curr_sitedata->n_pattern;curr_site++) { for(i=0;in_otu;++i) { if(tree->io->datatype == NT) { if (tree->a_nodes[i]->b[0]->rght->tax == NO) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); assert(FALSE); } Init_Tips_At_One_Site_Nucleotides_Int(tree->a_nodes[i]->c_seq->state[curr_site], 0, state_v); /* Init_Tips_At_One_Site_Nucleotides_Int(tree->data->c_seq[i]->state[curr_site], */ /* 0, */ /* state_v); */ tree->a_nodes[i]->b[0]->ui_r[curr_site] = 0; for(j=0;jmod->ns;j++) tree->a_nodes[i]->b[0]->ui_r[curr_site] += (int)(state_v[j] * POW(2,j)); } else if(tree->io->datatype == AA) { Init_Tips_At_One_Site_AA_Int(tree->a_nodes[i]->c_seq->state[curr_site], 0, state_v); /* Init_Tips_At_One_Site_AA_Int(tree->data->c_seq[i]->state[curr_site], */ /* 0, */ /* state_v); */ tree->a_nodes[i]->b[0]->ui_r[curr_site] = 0; for(j=0;jmod->ns;j++) tree->a_nodes[i]->b[0]->ui_r[curr_site] += (int)(state_v[j] * POW(2,j)); } else if(tree->io->datatype == GENERIC) { Init_Tips_At_One_Site_Generic_Int(tree->a_nodes[i]->c_seq->state+curr_site*tree->mod->io->state_len, tree->mod->ns, tree->mod->io->state_len, 0, state_v); /* Init_Tips_At_One_Site_Generic_Int(tree->data->c_seq[i]->state+curr_site*tree->mod->io->state_len, */ /* tree->mod->ns, */ /* tree->mod->io->state_len, */ /* 0, */ /* state_v); */ tree->a_nodes[i]->b[0]->ui_r[curr_site] = 0; for(j=0;jmod->ns;j++) tree->a_nodes[i]->b[0]->ui_r[curr_site] += (int)(state_v[j] * POW(2,j)); } } } for(br=0;br<2*tree->n_otu-3;++br) { for(curr_site=0;curr_sitedata->n_pattern;++curr_site) { tree->a_edges[br]->pars_r[curr_site] = 0; tree->a_edges[br]->pars_l[curr_site] = 0; } } Free(state_v); } /*********************************************************/ void Update_Partial_Pars(t_tree *tree, t_edge *b_fcus, t_node *n) { /* | |<- b_fcus | n / \ / \ / \ */ unsigned int i,j; unsigned int site; int *ui, *ui_v1, *ui_v2; int *p_pars_v1, *p_pars_v2, *p_pars; int *pars, *pars_v1, *pars_v2; int min_v1,min_v2; int v; const unsigned int ns = tree->mod->ns; const unsigned int n_patterns = tree->data->n_pattern; if(tree->is_mixt_tree) { MIXT_Update_Partial_Pars(tree,b_fcus,n); return; } if((tree->io->do_alias_subpatt == YES) && (tree->update_alias_subpatt == YES)) Alias_One_Subpatt((n==b_fcus->left)?(b_fcus->rght):(b_fcus->left),n,tree); if(n->tax) return; ui = ui_v1 = ui_v2 = NULL; p_pars = p_pars_v1 = p_pars_v2 = NULL; pars = pars_v1 = pars_v2 = NULL; if(n == b_fcus->left) { ui = b_fcus->ui_l; pars = b_fcus->pars_l; p_pars = b_fcus->p_pars_l; ui_v1 = (n == n->b[b_fcus->l_v1]->left)? (n->b[b_fcus->l_v1]->ui_r): (n->b[b_fcus->l_v1]->ui_l); ui_v2 = (n == n->b[b_fcus->l_v2]->left)? (n->b[b_fcus->l_v2]->ui_r): (n->b[b_fcus->l_v2]->ui_l); p_pars_v1 = (n == n->b[b_fcus->l_v1]->left)? (n->b[b_fcus->l_v1]->p_pars_r): (n->b[b_fcus->l_v1]->p_pars_l); p_pars_v2 = (n == n->b[b_fcus->l_v2]->left)? (n->b[b_fcus->l_v2]->p_pars_r): (n->b[b_fcus->l_v2]->p_pars_l); pars_v1 = (n == n->b[b_fcus->l_v1]->left)? (n->b[b_fcus->l_v1]->pars_r): (n->b[b_fcus->l_v1]->pars_l); pars_v2 = (n == n->b[b_fcus->l_v2]->left)? (n->b[b_fcus->l_v2]->pars_r): (n->b[b_fcus->l_v2]->pars_l); } else { ui = b_fcus->ui_r; pars = b_fcus->pars_r; p_pars = b_fcus->p_pars_r; ui_v1 = (n == n->b[b_fcus->r_v1]->left)? (n->b[b_fcus->r_v1]->ui_r): (n->b[b_fcus->r_v1]->ui_l); ui_v2 = (n == n->b[b_fcus->r_v2]->left)? (n->b[b_fcus->r_v2]->ui_r): (n->b[b_fcus->r_v2]->ui_l); p_pars_v1 = (n == n->b[b_fcus->r_v1]->left)? (n->b[b_fcus->r_v1]->p_pars_r): (n->b[b_fcus->r_v1]->p_pars_l); p_pars_v2 = (n == n->b[b_fcus->r_v2]->left)? (n->b[b_fcus->r_v2]->p_pars_r): (n->b[b_fcus->r_v2]->p_pars_l); pars_v1 = (n == n->b[b_fcus->r_v1]->left)? (n->b[b_fcus->r_v1]->pars_r): (n->b[b_fcus->r_v1]->pars_l); pars_v2 = (n == n->b[b_fcus->r_v2]->left)? (n->b[b_fcus->r_v2]->pars_r): (n->b[b_fcus->r_v2]->pars_l); } if(tree->mod->s_opt->general_pars) { for(site=0;sitestep_mat[i*ns+j]; if(v < min_v1) min_v1 = v; } min_v2 = MAX_PARS; for(j=0;jstep_mat[i*ns+j]; if(v < min_v2) min_v2 = v; } p_pars[site*ns+i] = min_v1 + min_v2; } } } else { for(site=0;sitemod->ns; site = tree->curr_site; site_pars = MAX_PARS; if(tree->mod->s_opt->general_pars) { for(i=0;ip_pars_l[site*ns+j] + tree->step_mat[i*ns+j]; if(v < min_l) min_l = v; } min_r = MAX_PARS; for(j=0;jp_pars_r[site*ns+j] + tree->step_mat[i*ns+j]; if(v < min_r) min_r = v; } if((min_l + min_r) < site_pars) site_pars = min_l + min_r; } } else { site_pars = b->pars_l[site] + b->pars_r[site]; if(!(b->ui_l[site] & b->ui_r[site])) site_pars++; } return site_pars; } /*********************************************************/ /* Is there one or more parsimoniy step(s) along this t_edge ? 0 -> NO; 1 -> YES */ int One_Pars_Step(t_edge *b,t_tree *tree) { int site; int init_general_pars; init_general_pars = tree->mod->s_opt->general_pars; tree->mod->s_opt->general_pars = 0; Set_Both_Sides(YES,tree); Pars(NULL,tree); for(site=0;sitedata->n_pattern;site++) { if(!(b->ui_l[site] & b->ui_r[site])) break; } tree->mod->s_opt->general_pars = init_general_pars; if(site == tree->data->n_pattern) return 0; else { PhyML_Printf("\n. One parsimony step ocurred at site %4d",site); return 1; } } /*********************************************************/ int Pars_At_Given_Edge(t_edge *b, t_tree *tree) { int site,n_patterns; /* n_patterns = (int)FLOOR(tree->n_pattern*tree->prop_of_sites_to_consider); */ n_patterns = tree->data->n_pattern; tree->c_pars = .0; for(site=0;sitesite_pars[site] = 0; tree->curr_site = site; tree->site_pars[site] = Pars_Core(b,tree); tree->c_pars += tree->site_pars[site] * tree->data->wght[site]; } return tree->c_pars; } /*********************************************************/ int Update_Pars_At_Given_Edge(t_edge *b_fcus, t_tree *tree) { Update_Partial_Pars(tree,b_fcus,b_fcus->left); Update_Partial_Pars(tree,b_fcus,b_fcus->rght); tree->c_pars = Pars(b_fcus,tree); return tree->c_pars; } /*********************************************************/ void Get_Step_Mat(t_tree *tree) { int i; if(tree->io->datatype == AA) { tree->step_mat[ 0*tree->mod->ns+ 0] = 0 ; tree->step_mat[ 0*tree->mod->ns+ 1] = 3 ; tree->step_mat[ 0*tree->mod->ns+ 2] = 3 ; tree->step_mat[ 0*tree->mod->ns+ 3] = 2 ; tree->step_mat[ 0*tree->mod->ns+ 4] = 3 ; tree->step_mat[ 0*tree->mod->ns+ 5] = 3 ; tree->step_mat[ 0*tree->mod->ns+ 6] = 2 ; tree->step_mat[ 0*tree->mod->ns+ 7] = 2 ; tree->step_mat[ 0*tree->mod->ns+ 8] = 3 ; tree->step_mat[ 0*tree->mod->ns+ 9] = 3 ; tree->step_mat[ 0*tree->mod->ns+10] = 3 ; tree->step_mat[ 0*tree->mod->ns+11] = 3 ; tree->step_mat[ 0*tree->mod->ns+12] = 3 ; tree->step_mat[ 0*tree->mod->ns+13] = 3 ; tree->step_mat[ 0*tree->mod->ns+14] = 2 ; tree->step_mat[ 0*tree->mod->ns+15] = 2 ; tree->step_mat[ 0*tree->mod->ns+16] = 2 ; tree->step_mat[ 0*tree->mod->ns+17] = 3 ; tree->step_mat[ 0*tree->mod->ns+18] = 3 ; tree->step_mat[ 0*tree->mod->ns+19] = 2 ; tree->step_mat[ 1*tree->mod->ns+ 0] = 3 ; tree->step_mat[ 1*tree->mod->ns+ 1] = 0 ; tree->step_mat[ 1*tree->mod->ns+ 2] = 2 ; tree->step_mat[ 1*tree->mod->ns+ 3] = 3 ; tree->step_mat[ 1*tree->mod->ns+ 4] = 2 ; tree->step_mat[ 1*tree->mod->ns+ 5] = 2 ; tree->step_mat[ 1*tree->mod->ns+ 6] = 3 ; tree->step_mat[ 1*tree->mod->ns+ 7] = 2 ; tree->step_mat[ 1*tree->mod->ns+ 8] = 2 ; tree->step_mat[ 1*tree->mod->ns+ 9] = 2 ; tree->step_mat[ 1*tree->mod->ns+10] = 2 ; tree->step_mat[ 1*tree->mod->ns+11] = 2 ; tree->step_mat[ 1*tree->mod->ns+12] = 2 ; tree->step_mat[ 1*tree->mod->ns+13] = 3 ; tree->step_mat[ 1*tree->mod->ns+14] = 2 ; tree->step_mat[ 1*tree->mod->ns+15] = 2 ; tree->step_mat[ 1*tree->mod->ns+16] = 2 ; tree->step_mat[ 1*tree->mod->ns+17] = 2 ; tree->step_mat[ 1*tree->mod->ns+18] = 3 ; tree->step_mat[ 1*tree->mod->ns+19] = 3 ; tree->step_mat[ 2*tree->mod->ns+ 0] = 3 ; tree->step_mat[ 2*tree->mod->ns+ 1] = 2 ; tree->step_mat[ 2*tree->mod->ns+ 2] = 0 ; tree->step_mat[ 2*tree->mod->ns+ 3] = 2 ; tree->step_mat[ 2*tree->mod->ns+ 4] = 2 ; tree->step_mat[ 2*tree->mod->ns+ 5] = 2 ; tree->step_mat[ 2*tree->mod->ns+ 6] = 2 ; tree->step_mat[ 2*tree->mod->ns+ 7] = 3 ; tree->step_mat[ 2*tree->mod->ns+ 8] = 2 ; tree->step_mat[ 2*tree->mod->ns+ 9] = 2 ; tree->step_mat[ 2*tree->mod->ns+10] = 3 ; tree->step_mat[ 2*tree->mod->ns+11] = 1 ; tree->step_mat[ 2*tree->mod->ns+12] = 2 ; tree->step_mat[ 2*tree->mod->ns+13] = 2 ; tree->step_mat[ 2*tree->mod->ns+14] = 3 ; tree->step_mat[ 2*tree->mod->ns+15] = 2 ; tree->step_mat[ 2*tree->mod->ns+16] = 2 ; tree->step_mat[ 2*tree->mod->ns+17] = 3 ; tree->step_mat[ 2*tree->mod->ns+18] = 2 ; tree->step_mat[ 2*tree->mod->ns+19] = 3 ; tree->step_mat[ 3*tree->mod->ns+ 0] = 2 ; tree->step_mat[ 3*tree->mod->ns+ 1] = 3 ; tree->step_mat[ 3*tree->mod->ns+ 2] = 2 ; tree->step_mat[ 3*tree->mod->ns+ 3] = 0 ; tree->step_mat[ 3*tree->mod->ns+ 4] = 2 ; tree->step_mat[ 3*tree->mod->ns+ 5] = 2 ; tree->step_mat[ 3*tree->mod->ns+ 6] = 1 ; tree->step_mat[ 3*tree->mod->ns+ 7] = 2 ; tree->step_mat[ 3*tree->mod->ns+ 8] = 2 ; tree->step_mat[ 3*tree->mod->ns+ 9] = 3 ; tree->step_mat[ 3*tree->mod->ns+10] = 3 ; tree->step_mat[ 3*tree->mod->ns+11] = 2 ; tree->step_mat[ 3*tree->mod->ns+12] = 3 ; tree->step_mat[ 3*tree->mod->ns+13] = 2 ; tree->step_mat[ 3*tree->mod->ns+14] = 3 ; tree->step_mat[ 3*tree->mod->ns+15] = 3 ; tree->step_mat[ 3*tree->mod->ns+16] = 3 ; tree->step_mat[ 3*tree->mod->ns+17] = 3 ; tree->step_mat[ 3*tree->mod->ns+18] = 2 ; tree->step_mat[ 3*tree->mod->ns+19] = 2 ; tree->step_mat[ 4*tree->mod->ns+ 0] = 3 ; tree->step_mat[ 4*tree->mod->ns+ 1] = 2 ; tree->step_mat[ 4*tree->mod->ns+ 2] = 2 ; tree->step_mat[ 4*tree->mod->ns+ 3] = 2 ; tree->step_mat[ 4*tree->mod->ns+ 4] = 0 ; tree->step_mat[ 4*tree->mod->ns+ 5] = 3 ; tree->step_mat[ 4*tree->mod->ns+ 6] = 3 ; tree->step_mat[ 4*tree->mod->ns+ 7] = 2 ; tree->step_mat[ 4*tree->mod->ns+ 8] = 2 ; tree->step_mat[ 4*tree->mod->ns+ 9] = 3 ; tree->step_mat[ 4*tree->mod->ns+10] = 2 ; tree->step_mat[ 4*tree->mod->ns+11] = 3 ; tree->step_mat[ 4*tree->mod->ns+12] = 3 ; tree->step_mat[ 4*tree->mod->ns+13] = 2 ; tree->step_mat[ 4*tree->mod->ns+14] = 3 ; tree->step_mat[ 4*tree->mod->ns+15] = 2 ; tree->step_mat[ 4*tree->mod->ns+16] = 3 ; tree->step_mat[ 4*tree->mod->ns+17] = 1 ; tree->step_mat[ 4*tree->mod->ns+18] = 2 ; tree->step_mat[ 4*tree->mod->ns+19] = 3 ; tree->step_mat[ 5*tree->mod->ns+ 0] = 3 ; tree->step_mat[ 5*tree->mod->ns+ 1] = 2 ; tree->step_mat[ 5*tree->mod->ns+ 2] = 2 ; tree->step_mat[ 5*tree->mod->ns+ 3] = 2 ; tree->step_mat[ 5*tree->mod->ns+ 4] = 3 ; tree->step_mat[ 5*tree->mod->ns+ 5] = 0 ; tree->step_mat[ 5*tree->mod->ns+ 6] = 2 ; tree->step_mat[ 5*tree->mod->ns+ 7] = 3 ; tree->step_mat[ 5*tree->mod->ns+ 8] = 1 ; tree->step_mat[ 5*tree->mod->ns+ 9] = 3 ; tree->step_mat[ 5*tree->mod->ns+10] = 2 ; tree->step_mat[ 5*tree->mod->ns+11] = 2 ; tree->step_mat[ 5*tree->mod->ns+12] = 2 ; tree->step_mat[ 5*tree->mod->ns+13] = 3 ; tree->step_mat[ 5*tree->mod->ns+14] = 2 ; tree->step_mat[ 5*tree->mod->ns+15] = 3 ; tree->step_mat[ 5*tree->mod->ns+16] = 3 ; tree->step_mat[ 5*tree->mod->ns+17] = 2 ; tree->step_mat[ 5*tree->mod->ns+18] = 2 ; tree->step_mat[ 5*tree->mod->ns+19] = 3 ; tree->step_mat[ 6*tree->mod->ns+ 0] = 2 ; tree->step_mat[ 6*tree->mod->ns+ 1] = 3 ; tree->step_mat[ 6*tree->mod->ns+ 2] = 2 ; tree->step_mat[ 6*tree->mod->ns+ 3] = 1 ; tree->step_mat[ 6*tree->mod->ns+ 4] = 3 ; tree->step_mat[ 6*tree->mod->ns+ 5] = 2 ; tree->step_mat[ 6*tree->mod->ns+ 6] = 0 ; tree->step_mat[ 6*tree->mod->ns+ 7] = 2 ; tree->step_mat[ 6*tree->mod->ns+ 8] = 2 ; tree->step_mat[ 6*tree->mod->ns+ 9] = 3 ; tree->step_mat[ 6*tree->mod->ns+10] = 3 ; tree->step_mat[ 6*tree->mod->ns+11] = 2 ; tree->step_mat[ 6*tree->mod->ns+12] = 2 ; tree->step_mat[ 6*tree->mod->ns+13] = 3 ; tree->step_mat[ 6*tree->mod->ns+14] = 3 ; tree->step_mat[ 6*tree->mod->ns+15] = 3 ; tree->step_mat[ 6*tree->mod->ns+16] = 3 ; tree->step_mat[ 6*tree->mod->ns+17] = 2 ; tree->step_mat[ 6*tree->mod->ns+18] = 2 ; tree->step_mat[ 6*tree->mod->ns+19] = 2 ; tree->step_mat[ 7*tree->mod->ns+ 0] = 2 ; tree->step_mat[ 7*tree->mod->ns+ 1] = 2 ; tree->step_mat[ 7*tree->mod->ns+ 2] = 3 ; tree->step_mat[ 7*tree->mod->ns+ 3] = 2 ; tree->step_mat[ 7*tree->mod->ns+ 4] = 2 ; tree->step_mat[ 7*tree->mod->ns+ 5] = 3 ; tree->step_mat[ 7*tree->mod->ns+ 6] = 2 ; tree->step_mat[ 7*tree->mod->ns+ 7] = 0 ; tree->step_mat[ 7*tree->mod->ns+ 8] = 3 ; tree->step_mat[ 7*tree->mod->ns+ 9] = 3 ; tree->step_mat[ 7*tree->mod->ns+10] = 3 ; tree->step_mat[ 7*tree->mod->ns+11] = 3 ; tree->step_mat[ 7*tree->mod->ns+12] = 3 ; tree->step_mat[ 7*tree->mod->ns+13] = 3 ; tree->step_mat[ 7*tree->mod->ns+14] = 3 ; tree->step_mat[ 7*tree->mod->ns+15] = 2 ; tree->step_mat[ 7*tree->mod->ns+16] = 3 ; tree->step_mat[ 7*tree->mod->ns+17] = 2 ; tree->step_mat[ 7*tree->mod->ns+18] = 3 ; tree->step_mat[ 7*tree->mod->ns+19] = 2 ; tree->step_mat[ 8*tree->mod->ns+ 0] = 3 ; tree->step_mat[ 8*tree->mod->ns+ 1] = 2 ; tree->step_mat[ 8*tree->mod->ns+ 2] = 2 ; tree->step_mat[ 8*tree->mod->ns+ 3] = 2 ; tree->step_mat[ 8*tree->mod->ns+ 4] = 2 ; tree->step_mat[ 8*tree->mod->ns+ 5] = 1 ; tree->step_mat[ 8*tree->mod->ns+ 6] = 2 ; tree->step_mat[ 8*tree->mod->ns+ 7] = 3 ; tree->step_mat[ 8*tree->mod->ns+ 8] = 0 ; tree->step_mat[ 8*tree->mod->ns+ 9] = 3 ; tree->step_mat[ 8*tree->mod->ns+10] = 2 ; tree->step_mat[ 8*tree->mod->ns+11] = 2 ; tree->step_mat[ 8*tree->mod->ns+12] = 3 ; tree->step_mat[ 8*tree->mod->ns+13] = 2 ; tree->step_mat[ 8*tree->mod->ns+14] = 2 ; tree->step_mat[ 8*tree->mod->ns+15] = 3 ; tree->step_mat[ 8*tree->mod->ns+16] = 3 ; tree->step_mat[ 8*tree->mod->ns+17] = 3 ; tree->step_mat[ 8*tree->mod->ns+18] = 2 ; tree->step_mat[ 8*tree->mod->ns+19] = 3 ; tree->step_mat[ 9*tree->mod->ns+ 0] = 3 ; tree->step_mat[ 9*tree->mod->ns+ 1] = 2 ; tree->step_mat[ 9*tree->mod->ns+ 2] = 2 ; tree->step_mat[ 9*tree->mod->ns+ 3] = 3 ; tree->step_mat[ 9*tree->mod->ns+ 4] = 3 ; tree->step_mat[ 9*tree->mod->ns+ 5] = 3 ; tree->step_mat[ 9*tree->mod->ns+ 6] = 3 ; tree->step_mat[ 9*tree->mod->ns+ 7] = 3 ; tree->step_mat[ 9*tree->mod->ns+ 8] = 3 ; tree->step_mat[ 9*tree->mod->ns+ 9] = 0 ; tree->step_mat[ 9*tree->mod->ns+10] = 2 ; tree->step_mat[ 9*tree->mod->ns+11] = 2 ; tree->step_mat[ 9*tree->mod->ns+12] = 1 ; tree->step_mat[ 9*tree->mod->ns+13] = 2 ; tree->step_mat[ 9*tree->mod->ns+14] = 3 ; tree->step_mat[ 9*tree->mod->ns+15] = 2 ; tree->step_mat[ 9*tree->mod->ns+16] = 2 ; tree->step_mat[ 9*tree->mod->ns+17] = 3 ; tree->step_mat[ 9*tree->mod->ns+18] = 3 ; tree->step_mat[ 9*tree->mod->ns+19] = 2 ; tree->step_mat[10*tree->mod->ns+ 0] = 3 ; tree->step_mat[10*tree->mod->ns+ 1] = 2 ; tree->step_mat[10*tree->mod->ns+ 2] = 3 ; tree->step_mat[10*tree->mod->ns+ 3] = 3 ; tree->step_mat[10*tree->mod->ns+ 4] = 2 ; tree->step_mat[10*tree->mod->ns+ 5] = 2 ; tree->step_mat[10*tree->mod->ns+ 6] = 3 ; tree->step_mat[10*tree->mod->ns+ 7] = 3 ; tree->step_mat[10*tree->mod->ns+ 8] = 2 ; tree->step_mat[10*tree->mod->ns+ 9] = 2 ; tree->step_mat[10*tree->mod->ns+10] = 0 ; tree->step_mat[10*tree->mod->ns+11] = 3 ; tree->step_mat[10*tree->mod->ns+12] = 2 ; tree->step_mat[10*tree->mod->ns+13] = 2 ; tree->step_mat[10*tree->mod->ns+14] = 2 ; tree->step_mat[10*tree->mod->ns+15] = 3 ; tree->step_mat[10*tree->mod->ns+16] = 3 ; tree->step_mat[10*tree->mod->ns+17] = 2 ; tree->step_mat[10*tree->mod->ns+18] = 2 ; tree->step_mat[10*tree->mod->ns+19] = 2 ; tree->step_mat[11*tree->mod->ns+ 0] = 3 ; tree->step_mat[11*tree->mod->ns+ 1] = 2 ; tree->step_mat[11*tree->mod->ns+ 2] = 1 ; tree->step_mat[11*tree->mod->ns+ 3] = 2 ; tree->step_mat[11*tree->mod->ns+ 4] = 3 ; tree->step_mat[11*tree->mod->ns+ 5] = 2 ; tree->step_mat[11*tree->mod->ns+ 6] = 2 ; tree->step_mat[11*tree->mod->ns+ 7] = 3 ; tree->step_mat[11*tree->mod->ns+ 8] = 2 ; tree->step_mat[11*tree->mod->ns+ 9] = 2 ; tree->step_mat[11*tree->mod->ns+10] = 3 ; tree->step_mat[11*tree->mod->ns+11] = 0 ; tree->step_mat[11*tree->mod->ns+12] = 2 ; tree->step_mat[11*tree->mod->ns+13] = 3 ; tree->step_mat[11*tree->mod->ns+14] = 3 ; tree->step_mat[11*tree->mod->ns+15] = 2 ; tree->step_mat[11*tree->mod->ns+16] = 2 ; tree->step_mat[11*tree->mod->ns+17] = 2 ; tree->step_mat[11*tree->mod->ns+18] = 2 ; tree->step_mat[11*tree->mod->ns+19] = 3 ; tree->step_mat[12*tree->mod->ns+ 0] = 3 ; tree->step_mat[12*tree->mod->ns+ 1] = 2 ; tree->step_mat[12*tree->mod->ns+ 2] = 2 ; tree->step_mat[12*tree->mod->ns+ 3] = 3 ; tree->step_mat[12*tree->mod->ns+ 4] = 3 ; tree->step_mat[12*tree->mod->ns+ 5] = 2 ; tree->step_mat[12*tree->mod->ns+ 6] = 2 ; tree->step_mat[12*tree->mod->ns+ 7] = 3 ; tree->step_mat[12*tree->mod->ns+ 8] = 3 ; tree->step_mat[12*tree->mod->ns+ 9] = 1 ; tree->step_mat[12*tree->mod->ns+10] = 2 ; tree->step_mat[12*tree->mod->ns+11] = 2 ; tree->step_mat[12*tree->mod->ns+12] = 0 ; tree->step_mat[12*tree->mod->ns+13] = 2 ; tree->step_mat[12*tree->mod->ns+14] = 3 ; tree->step_mat[12*tree->mod->ns+15] = 2 ; tree->step_mat[12*tree->mod->ns+16] = 2 ; tree->step_mat[12*tree->mod->ns+17] = 2 ; tree->step_mat[12*tree->mod->ns+18] = 3 ; tree->step_mat[12*tree->mod->ns+19] = 2 ; tree->step_mat[13*tree->mod->ns+ 0] = 3 ; tree->step_mat[13*tree->mod->ns+ 1] = 3 ; tree->step_mat[13*tree->mod->ns+ 2] = 2 ; tree->step_mat[13*tree->mod->ns+ 3] = 2 ; tree->step_mat[13*tree->mod->ns+ 4] = 2 ; tree->step_mat[13*tree->mod->ns+ 5] = 3 ; tree->step_mat[13*tree->mod->ns+ 6] = 3 ; tree->step_mat[13*tree->mod->ns+ 7] = 3 ; tree->step_mat[13*tree->mod->ns+ 8] = 2 ; tree->step_mat[13*tree->mod->ns+ 9] = 2 ; tree->step_mat[13*tree->mod->ns+10] = 2 ; tree->step_mat[13*tree->mod->ns+11] = 3 ; tree->step_mat[13*tree->mod->ns+12] = 2 ; tree->step_mat[13*tree->mod->ns+13] = 0 ; tree->step_mat[13*tree->mod->ns+14] = 3 ; tree->step_mat[13*tree->mod->ns+15] = 2 ; tree->step_mat[13*tree->mod->ns+16] = 3 ; tree->step_mat[13*tree->mod->ns+17] = 2 ; tree->step_mat[13*tree->mod->ns+18] = 2 ; tree->step_mat[13*tree->mod->ns+19] = 2 ; tree->step_mat[14*tree->mod->ns+ 0] = 2 ; tree->step_mat[14*tree->mod->ns+ 1] = 2 ; tree->step_mat[14*tree->mod->ns+ 2] = 3 ; tree->step_mat[14*tree->mod->ns+ 3] = 3 ; tree->step_mat[14*tree->mod->ns+ 4] = 3 ; tree->step_mat[14*tree->mod->ns+ 5] = 2 ; tree->step_mat[14*tree->mod->ns+ 6] = 3 ; tree->step_mat[14*tree->mod->ns+ 7] = 3 ; tree->step_mat[14*tree->mod->ns+ 8] = 2 ; tree->step_mat[14*tree->mod->ns+ 9] = 3 ; tree->step_mat[14*tree->mod->ns+10] = 2 ; tree->step_mat[14*tree->mod->ns+11] = 3 ; tree->step_mat[14*tree->mod->ns+12] = 3 ; tree->step_mat[14*tree->mod->ns+13] = 3 ; tree->step_mat[14*tree->mod->ns+14] = 0 ; tree->step_mat[14*tree->mod->ns+15] = 2 ; tree->step_mat[14*tree->mod->ns+16] = 2 ; tree->step_mat[14*tree->mod->ns+17] = 3 ; tree->step_mat[14*tree->mod->ns+18] = 3 ; tree->step_mat[14*tree->mod->ns+19] = 3 ; tree->step_mat[15*tree->mod->ns+ 0] = 2 ; tree->step_mat[15*tree->mod->ns+ 1] = 2 ; tree->step_mat[15*tree->mod->ns+ 2] = 2 ; tree->step_mat[15*tree->mod->ns+ 3] = 3 ; tree->step_mat[15*tree->mod->ns+ 4] = 2 ; tree->step_mat[15*tree->mod->ns+ 5] = 3 ; tree->step_mat[15*tree->mod->ns+ 6] = 3 ; tree->step_mat[15*tree->mod->ns+ 7] = 2 ; tree->step_mat[15*tree->mod->ns+ 8] = 3 ; tree->step_mat[15*tree->mod->ns+ 9] = 2 ; tree->step_mat[15*tree->mod->ns+10] = 3 ; tree->step_mat[15*tree->mod->ns+11] = 2 ; tree->step_mat[15*tree->mod->ns+12] = 2 ; tree->step_mat[15*tree->mod->ns+13] = 2 ; tree->step_mat[15*tree->mod->ns+14] = 2 ; tree->step_mat[15*tree->mod->ns+15] = 0 ; tree->step_mat[15*tree->mod->ns+16] = 2 ; tree->step_mat[15*tree->mod->ns+17] = 2 ; tree->step_mat[15*tree->mod->ns+18] = 2 ; tree->step_mat[15*tree->mod->ns+19] = 3 ; tree->step_mat[16*tree->mod->ns+ 0] = 2 ; tree->step_mat[16*tree->mod->ns+ 1] = 2 ; tree->step_mat[16*tree->mod->ns+ 2] = 2 ; tree->step_mat[16*tree->mod->ns+ 3] = 3 ; tree->step_mat[16*tree->mod->ns+ 4] = 3 ; tree->step_mat[16*tree->mod->ns+ 5] = 3 ; tree->step_mat[16*tree->mod->ns+ 6] = 3 ; tree->step_mat[16*tree->mod->ns+ 7] = 3 ; tree->step_mat[16*tree->mod->ns+ 8] = 3 ; tree->step_mat[16*tree->mod->ns+ 9] = 2 ; tree->step_mat[16*tree->mod->ns+10] = 3 ; tree->step_mat[16*tree->mod->ns+11] = 2 ; tree->step_mat[16*tree->mod->ns+12] = 2 ; tree->step_mat[16*tree->mod->ns+13] = 3 ; tree->step_mat[16*tree->mod->ns+14] = 2 ; tree->step_mat[16*tree->mod->ns+15] = 2 ; tree->step_mat[16*tree->mod->ns+16] = 0 ; tree->step_mat[16*tree->mod->ns+17] = 3 ; tree->step_mat[16*tree->mod->ns+18] = 3 ; tree->step_mat[16*tree->mod->ns+19] = 3 ; tree->step_mat[17*tree->mod->ns+ 0] = 3 ; tree->step_mat[17*tree->mod->ns+ 1] = 2 ; tree->step_mat[17*tree->mod->ns+ 2] = 3 ; tree->step_mat[17*tree->mod->ns+ 3] = 3 ; tree->step_mat[17*tree->mod->ns+ 4] = 1 ; tree->step_mat[17*tree->mod->ns+ 5] = 2 ; tree->step_mat[17*tree->mod->ns+ 6] = 2 ; tree->step_mat[17*tree->mod->ns+ 7] = 2 ; tree->step_mat[17*tree->mod->ns+ 8] = 3 ; tree->step_mat[17*tree->mod->ns+ 9] = 3 ; tree->step_mat[17*tree->mod->ns+10] = 2 ; tree->step_mat[17*tree->mod->ns+11] = 2 ; tree->step_mat[17*tree->mod->ns+12] = 2 ; tree->step_mat[17*tree->mod->ns+13] = 2 ; tree->step_mat[17*tree->mod->ns+14] = 3 ; tree->step_mat[17*tree->mod->ns+15] = 2 ; tree->step_mat[17*tree->mod->ns+16] = 3 ; tree->step_mat[17*tree->mod->ns+17] = 0 ; tree->step_mat[17*tree->mod->ns+18] = 2 ; tree->step_mat[17*tree->mod->ns+19] = 3 ; tree->step_mat[18*tree->mod->ns+ 0] = 3 ; tree->step_mat[18*tree->mod->ns+ 1] = 3 ; tree->step_mat[18*tree->mod->ns+ 2] = 2 ; tree->step_mat[18*tree->mod->ns+ 3] = 2 ; tree->step_mat[18*tree->mod->ns+ 4] = 2 ; tree->step_mat[18*tree->mod->ns+ 5] = 2 ; tree->step_mat[18*tree->mod->ns+ 6] = 2 ; tree->step_mat[18*tree->mod->ns+ 7] = 3 ; tree->step_mat[18*tree->mod->ns+ 8] = 2 ; tree->step_mat[18*tree->mod->ns+ 9] = 3 ; tree->step_mat[18*tree->mod->ns+10] = 2 ; tree->step_mat[18*tree->mod->ns+11] = 2 ; tree->step_mat[18*tree->mod->ns+12] = 3 ; tree->step_mat[18*tree->mod->ns+13] = 2 ; tree->step_mat[18*tree->mod->ns+14] = 3 ; tree->step_mat[18*tree->mod->ns+15] = 2 ; tree->step_mat[18*tree->mod->ns+16] = 3 ; tree->step_mat[18*tree->mod->ns+17] = 2 ; tree->step_mat[18*tree->mod->ns+18] = 0 ; tree->step_mat[18*tree->mod->ns+19] = 3 ; tree->step_mat[19*tree->mod->ns+ 0] = 2 ; tree->step_mat[19*tree->mod->ns+ 1] = 3 ; tree->step_mat[19*tree->mod->ns+ 2] = 3 ; tree->step_mat[19*tree->mod->ns+ 3] = 2 ; tree->step_mat[19*tree->mod->ns+ 4] = 3 ; tree->step_mat[19*tree->mod->ns+ 5] = 3 ; tree->step_mat[19*tree->mod->ns+ 6] = 2 ; tree->step_mat[19*tree->mod->ns+ 7] = 2 ; tree->step_mat[19*tree->mod->ns+ 8] = 3 ; tree->step_mat[19*tree->mod->ns+ 9] = 2 ; tree->step_mat[19*tree->mod->ns+10] = 2 ; tree->step_mat[19*tree->mod->ns+11] = 3 ; tree->step_mat[19*tree->mod->ns+12] = 2 ; tree->step_mat[19*tree->mod->ns+13] = 2 ; tree->step_mat[19*tree->mod->ns+14] = 3 ; tree->step_mat[19*tree->mod->ns+15] = 3 ; tree->step_mat[19*tree->mod->ns+16] = 3 ; tree->step_mat[19*tree->mod->ns+17] = 3 ; tree->step_mat[19*tree->mod->ns+18] = 3 ; tree->step_mat[19*tree->mod->ns+19] = 0 ; } else if(tree->io->datatype == NT) { tree->step_mat[0*tree->mod->ns+0] = 0; tree->step_mat[0*tree->mod->ns+1] = 2; tree->step_mat[0*tree->mod->ns+2] = 1; tree->step_mat[0*tree->mod->ns+3] = 2; tree->step_mat[1*tree->mod->ns+0] = 2; tree->step_mat[1*tree->mod->ns+1] = 0; tree->step_mat[1*tree->mod->ns+2] = 2; tree->step_mat[1*tree->mod->ns+3] = 1; tree->step_mat[2*tree->mod->ns+0] = 1; tree->step_mat[2*tree->mod->ns+1] = 2; tree->step_mat[2*tree->mod->ns+2] = 0; tree->step_mat[2*tree->mod->ns+3] = 2; tree->step_mat[3*tree->mod->ns+0] = 2; tree->step_mat[3*tree->mod->ns+1] = 1; tree->step_mat[3*tree->mod->ns+2] = 2; tree->step_mat[3*tree->mod->ns+3] = 0; } else if(tree->io->datatype == GENERIC) { int j; for(i=0;imod->ns;i++) for(j=0;jmod->ns;j++) if(j!=i) tree->step_mat[i*tree->mod->ns+j] = 1; } for(i=0;imod->ns;i++) tree->step_mat[i*tree->mod->ns+i] = 0; } /*********************************************************/ /*********************************************************/ /*********************************************************/ /*********************************************************/ /*********************************************************/ /*********************************************************/ /*********************************************************/ // Tree should be ready for likelihood analysis when calling // this function. void Stepwise_Add_Pars(t_tree *tree) { t_edge **residuals,**targets,*best_target; int *nd_idx,i,j,n_targets,*tg_idx; residuals = (t_edge **)mCalloc(tree->n_otu-3,sizeof(t_edge *)); targets = (t_edge **)mCalloc(2*tree->n_otu-3,sizeof(t_edge *)); best_target = NULL; nd_idx = Permutate(tree->n_otu-3); // Remove all tips except that corresponding to a_nodes[0], // a_nodes[1] and a_nodes[2]. for(i=0;in_otu-3;++i) { Prune_Subtree(tree->a_nodes[i+3]->v[0], tree->a_nodes[i+3], NULL, residuals+i, tree); } // Initial targets n_targets = 3; for(i=0;ia_nodes[i]->b[0]; // Regraft each tip on the tree at most parsimonious position for(i=0;in_otu-3;++i) { Set_Both_Sides(YES,tree); Pars(NULL,tree); /* printf("\n. [%d/%d]",i,tree->n_otu-3); */ tree->best_pars = 1E+8; best_target = NULL; tg_idx = Permutate(n_targets); for(j=0;ja_nodes[nd_idx[i]+3]->v[0], NULL, residuals[i], NULL, tree); Update_Partial_Pars(tree, tree->a_nodes[nd_idx[i]+3]->b[0], tree->a_nodes[nd_idx[i]+3]->v[0]); Pars(tree->a_nodes[nd_idx[i]+3]->b[0],tree); if(tree->c_pars < tree->best_pars) { tree->best_pars = tree->c_pars; best_target = targets[tg_idx[j]]; } Prune_Subtree(tree->a_nodes[nd_idx[i]+3]->v[0], tree->a_nodes[nd_idx[i]+3], NULL, residuals+i, tree); } assert(best_target); Graft_Subtree(best_target, tree->a_nodes[nd_idx[i]+3]->v[0], NULL, residuals[i], NULL, tree); targets[n_targets] = residuals[i]; targets[n_targets+1] = tree->a_nodes[nd_idx[i]+3]->b[0]; Free(tg_idx); n_targets+=2; } /* printf("\n. pars: %d",tree->c_pars); */ /* Exit("\n"); */ Free(nd_idx); Free(residuals); Free(targets); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/pars.h000066400000000000000000000024571501136442400203170ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef PARS_H #define PARS_H #include "utilities.h" #include "lk.h" #include "optimiz.h" #include "models.h" #include "free.h" int Pars(t_edge *b, t_tree *tree); void Post_Order_Pars(t_node *a, t_node *d, t_tree *tree); void Pre_Order_Pars(t_node *a, t_node *d, t_tree *tree); void Get_Partial_Pars(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); void Site_Pars(t_tree *tree); void Init_Ui_Tips(t_tree *tree); void Update_Partial_Pars(t_tree *tree, t_edge *b_fcus, t_node *n); int Pars_At_Given_Edge(t_edge *b, t_tree *tree); void Get_All_Partial_Pars(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); int Update_Pars_At_Given_Edge(t_edge *b_fcus, t_tree *tree); void Init_Partial_Pars_Tips(t_tree *tree); void Get_Step_Mat(t_tree *tree); int Pars_Core(t_edge *b, t_tree *tree); int One_Pars_Step(t_edge *b,t_tree *tree); void Stepwise_Add_Pars(t_tree *tree); void Backup_Partial_Pars(t_node *d, t_edge *b, t_tree *tree); void Restore_Partial_Pars(t_node *d, t_edge *b, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/phyrex.c000066400000000000000000004542271501136442400206720ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines that implement routines that deal with PhyREX data structure */ #include "phyrex.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int PHYREX_Main(int argc, char *argv[]) { #if (defined PHYREXSIM) PHYREX_Main_Simulate(argc,argv); #elif (defined PHYREX) option *io; io = Get_Input(argc,argv); Free(io); #endif return(0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX) void PHYREX_XML(char *xml_filename) { FILE *fp_xml_in; xml_node *xnd,*xroot; t_tree *mixt_tree,*tree; phydbl *res; int seed; char *dum_string; res = NULL; mixt_tree = XML_Process_Base(xml_filename); assert(mixt_tree); mixt_tree->rates = RATES_Make_Rate_Struct(mixt_tree->n_otu); RATES_Init_Rate_Struct(mixt_tree->rates,NULL,mixt_tree->n_otu); mixt_tree->times = TIMES_Make_Time_Struct(mixt_tree->n_otu); TIMES_Init_Time_Struct(mixt_tree->times,NULL,mixt_tree->n_otu); mixt_tree->mmod = PHYREX_Make_Migrep_Model(mixt_tree->n_otu,2); mixt_tree->mmod->n_dim = 2; PHYREX_Set_Default_Migrep_Mod(mixt_tree->n_otu,mixt_tree->mmod); Make_Contrasts(mixt_tree); Make_Contmod(mixt_tree); Set_Defaults_Contmod(mixt_tree); tree = mixt_tree; do { // All rate stuctures point to the same object tree->rates = mixt_tree->rates; tree->times = mixt_tree->times; tree->contmod = mixt_tree->contmod; tree = tree->next; } while(tree); fp_xml_in = fopen(xml_filename,"r"); if(!fp_xml_in) { PhyML_Fprintf(stderr,"\n. Could not find the XML file '%s'.\n",xml_filename); Exit("\n"); } /* xroot = XML_Load_File(fp_xml_in); */ xroot = mixt_tree->xml_root; if(xroot == NULL) { PhyML_Fprintf(stderr,"\n. Encountered an issue while loading the XML file.\n"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } xnd = XML_Search_Node_Name("phyrex",NO,xroot); if(xnd == NULL) { PhyML_Fprintf(stderr,"\n. Cound not find the \"root\" of the XML file (it should have \'phyrex\' as tag name).\n"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } dum_string = XML_Get_Attribute_Value(xnd,"mcmc.chain.len"); if(dum_string != NULL) mixt_tree->io->mcmc->chain_len = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.sample.every"); if(dum_string != NULL) mixt_tree->io->mcmc->sample_interval = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.print.every"); if(dum_string != NULL) mixt_tree->io->mcmc->print_every = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.burnin"); if(dum_string != NULL) mixt_tree->io->mcmc->chain_len_burnin = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.output.times"); if(dum_string != NULL) { int select = XML_Validate_Attr_Int(dum_string,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->io->mcmc_output_times = YES; else mixt_tree->io->mcmc_output_times = NO; } dum_string = XML_Get_Attribute_Value(xnd,"mcmc.output.trees"); if(dum_string != NULL) { int select = XML_Validate_Attr_Int(dum_string,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->io->mcmc_output_trees = YES; else mixt_tree->io->mcmc_output_trees = NO; } dum_string = XML_Get_Attribute_Value(xnd,"mcmc.verbose"); if(dum_string != NULL) { int select = XML_Validate_Attr_Int(dum_string,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->io->mcmc->out_verbose = 1; else mixt_tree->io->mcmc->out_verbose = 0; } dum_string = XML_Get_Attribute_Value(xnd,"ignore.sequences"); if(!dum_string) dum_string = XML_Get_Attribute_Value(xnd,"ignore.seq"); if(!dum_string) dum_string = XML_Get_Attribute_Value(xnd,"ignore.data"); if(dum_string != NULL) { int select = XML_Validate_Attr_Int(dum_string,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->eval_alnL = NO; else mixt_tree->eval_alnL = YES; } dum_string = XML_Get_Attribute_Value(xnd,"mutmap"); if(dum_string != NULL) { int select = XML_Validate_Attr_Int(dum_string,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->io->mutmap = YES; else mixt_tree->io->mutmap = NO; } // Looking for XML node with rate-across-lineage info xnd = XML_Search_Node_Name("lineagerates",YES,xroot); if(xnd == NULL) { PhyML_Fprintf(stdout,"\n. The model of rate variation across lineages is not specified."); PhyML_Fprintf(stdout,"\n. Using the geometric Brownian model (see Guindon, 2012, Syst. Biol.).\n"); mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"geometric Brownian"); } else { char *model_name; model_name = XML_Get_Attribute_Value(xnd,"model"); if(model_name == NULL) { PhyML_Fprintf(stderr,"\n. Please specify a model of rate variation across lineages,"); PhyML_Fprintf(stderr,"\n. e.g., ."); PhyML_Fprintf(stderr,"\n. See the manual for more options."); assert(FALSE); } else { if(!strcmp(model_name,"geometricbrownian")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"geometric Brownian"); } else if(!strcmp(model_name,"geometric")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"geometric Brownian"); } else if(!strcmp(model_name,"brownian")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"geometric Brownian"); } else if(!strcmp(model_name,"integrated")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"geometric Brownian"); } else if(!strcmp(model_name,"geo")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"geometric Brownian"); } else if(!strcmp(model_name,"lognormal")) { mixt_tree->rates->model_id = LOGNORMAL; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"lognormal (uncorrelated)"); } else if(!strcmp(model_name,"uncorrelated")) { mixt_tree->rates->model_id = LOGNORMAL; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"lognormal (uncorrelated)"); } else if(!strcmp(model_name,"uncorr")) { mixt_tree->rates->model_id = LOGNORMAL; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"lognormal (uncorrelated)"); } else if(!strcmp(model_name,"normal")) { mixt_tree->rates->model_id = LOGNORMAL; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"lognormal (uncorrelated)"); } else if(!strcmp(model_name,"gamma")) { mixt_tree->rates->model_id = GAMMA; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"gamma (uncorrelated)"); } else if(!strcmp(model_name,"strictclock")) { mixt_tree->rates->model_id = STRICTCLOCK; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"strict clock"); } else if(!strcmp(model_name,"clock")) { mixt_tree->rates->model_id = STRICTCLOCK; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"strict clock"); } else if(!strcmp(model_name,"thorne")) { mixt_tree->rates->model_id = THORNE; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"autocorrelated"); } else if(!strcmp(model_name,"autocorrelated")) { mixt_tree->rates->model_id = THORNE; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"autocorrelated"); } else if(!strcmp(model_name,"autocorr")) { mixt_tree->rates->model_id = THORNE; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"autocorrelated"); } else { assert(FALSE); } } char *autocor_prior; autocor_prior = XML_Get_Attribute_Value(xnd,"autocor.prior.rate"); if(autocor_prior != NULL) { mixt_tree->rates->autocor_rate_prior = String_To_Dbl(autocor_prior); if(mixt_tree->rates->autocor_rate_prior < 0.0) { PhyML_Printf("\n. Autocorrelation prior needs to be stricly positive."); assert(false); } } } // Spatial model xnd = XML_Search_Node_Name("spatialmodel",YES,xroot); if(xnd != NULL) { char *modname; modname = XML_Get_Attribute_Value(xnd,"name"); XML_Set_Attribute_Value(xnd,"name",modname); mixt_tree->mmod->use_locations = YES; if(modname != NULL) { if(!strcmp(modname,"slfv")) mixt_tree->mmod->model_id = SLFV_GAUSSIAN; else if(!strcmp(modname,"rw")) mixt_tree->mmod->model_id = RW; else if(!strcmp(modname,"rrw+gamma")) mixt_tree->mmod->model_id = RRW_GAMMA; else if(!strcmp(modname,"rrw+lognormal")) mixt_tree->mmod->model_id = RRW_LOGNORMAL; else if(!strcmp(modname,"ibm")) mixt_tree->mmod->model_id = IBM; else if(!strcmp(modname,"ribm")) mixt_tree->mmod->model_id = RIBM; else if(!strcmp(modname,"iwn")) mixt_tree->mmod->model_id = IWNc; else if(!strcmp(modname,"riwn")) mixt_tree->mmod->model_id = RIWNc; else if(!strcmp(modname,"iwnu")) mixt_tree->mmod->model_id = IWNu; else if(!strcmp(modname,"riwnu")) mixt_tree->mmod->model_id = RIWNu; else if(!strcmp(modname,"iou")) mixt_tree->mmod->model_id = IOU; else { PhyML_Printf("\n. Unknown spatial model name '%s'. Aborting. ",modname); assert(FALSE); } } char *dist_type; dist_type = XML_Get_Attribute_Value(xnd,"distance.type"); XML_Set_Attribute_Value(xnd,"distance.type",dist_type); if(dist_type != NULL) { if(!strcmp(dist_type,"great circle")) mixt_tree->mmod->dist_type = HAVERSINE; if(!strcmp(dist_type,"greatcircle")) mixt_tree->mmod->dist_type = HAVERSINE; else if(!strcmp(dist_type,"haversine")) mixt_tree->mmod->dist_type = HAVERSINE; else if(!strcmp(dist_type,"manhattan")) mixt_tree->mmod->dist_type = MANHATTAN; else if(!strcmp(dist_type,"euclidean")) mixt_tree->mmod->dist_type = EUCLIDEAN; else { PhyML_Printf("\n. Unknown distance type '%s'. Aborting. ",dist_type); assert(FALSE); } } char *sampling; sampling = XML_Get_Attribute_Value(xnd,"sampling"); XML_Set_Attribute_Value(xnd,"sampling",sampling); if(sampling != NULL) { if(!strcmp(sampling,"detection")) mixt_tree->mmod->sampling_scheme = SPATIAL_SAMPLING_DETECTION; else if(!strcmp(sampling,"survey")) mixt_tree->mmod->sampling_scheme = SPATIAL_SAMPLING_SURVEY; else { PhyML_Printf("\n. Unknown sampling scheme '%s'. Aborting. ",sampling); assert(FALSE); } } char *integrateAncestralLocations; integrateAncestralLocations = XML_Get_Attribute_Value(xnd,"integrateAncestralLocations"); if(integrateAncestralLocations != NULL) { int select = XML_Validate_Attr_Int(integrateAncestralLocations,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->mmod->integrateAncestralLocations = YES; else mixt_tree->mmod->integrateAncestralLocations = NO; } char *rrw_prior_sd; rrw_prior_sd = XML_Get_Attribute_Value(xnd,"rrw.prior.sd"); if(rrw_prior_sd != NULL) { char *val; val = XML_Get_Attribute_Value(xnd,"rrw.prior.sd"); if(val != NULL) mixt_tree->mmod->rrw_prior_sd = String_To_Dbl(val); } char *rw_prior_sd; rw_prior_sd = XML_Get_Attribute_Value(xnd,"rw.prior.sd"); if(rw_prior_sd != NULL) { mixt_tree->mmod->rw_prior_sd = String_To_Dbl(rw_prior_sd); } char *rw_prior_mean; rw_prior_mean = XML_Get_Attribute_Value(xnd,"rw.prior.mean"); if(rw_prior_mean != NULL) { mixt_tree->mmod->rw_prior_mean = String_To_Dbl(rw_prior_mean); } char *prior_distrib; prior_distrib = XML_Get_Attribute_Value(xnd,"rw.prior.distrib"); if(prior_distrib != NULL) { if(!strcmp(prior_distrib,"exponential")) mixt_tree->mmod->rw_prior_distrib = EXPONENTIAL_PRIOR; else if(!strcmp(prior_distrib,"normal")) mixt_tree->mmod->rw_prior_distrib = NORMAL_PRIOR; else if(!strcmp(prior_distrib,"flat")) mixt_tree->mmod->rw_prior_distrib = FLAT_PRIOR; else { PhyML_Printf("\n. Unknown prior distribution '%s'. Aborting. ",prior_distrib); assert(FALSE); } } char *rw_root_mean; char *rw_root_var; rw_root_mean = XML_Get_Attribute_Value(xnd,"rw.root.mean.location"); if(rw_root_mean != NULL) { mixt_tree->mmod->rw_root_mean[LOCATION] = String_To_Dbl(rw_root_mean); } rw_root_var = XML_Get_Attribute_Value(xnd,"rw.root.var.location"); if(rw_root_var != NULL) { mixt_tree->mmod->rw_root_var[LOCATION] = String_To_Dbl(rw_root_var); } rw_root_mean = XML_Get_Attribute_Value(xnd,"rw.root.mean.velocity"); if(rw_root_mean != NULL) { mixt_tree->mmod->rw_root_mean[VELOCITY] = String_To_Dbl(rw_root_mean); } rw_root_var = XML_Get_Attribute_Value(xnd,"rw.root.var.velocity"); if(rw_root_var != NULL) { mixt_tree->mmod->rw_root_var[VELOCITY] = String_To_Dbl(rw_root_var); } char *observational_model; observational_model = XML_Get_Attribute_Value(xnd,"observational.model"); if(observational_model != NULL) { int select = XML_Validate_Attr_Int(observational_model,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->contmod->obs_model = YES; else mixt_tree->contmod->obs_model = NO; } char *observational_var; observational_var = XML_Get_Attribute_Value(xnd,"observational.var"); if(observational_var != NULL) { phydbl v = String_To_Dbl(observational_var); mixt_tree->contmod->obs_var[0] = v; mixt_tree->contmod->obs_var[1] = v; } char *observational_est; observational_est = XML_Get_Attribute_Value(xnd,"observational.var.est"); if(observational_est != NULL) { int select = XML_Validate_Attr_Int(observational_est,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->contmod->obs_model_est = YES; else mixt_tree->contmod->obs_model_est = NO; } } else { mixt_tree->mmod->use_locations = NO; mixt_tree->mmod->sampling_scheme = SPATIAL_SAMPLING_DETECTION; mixt_tree->mmod->model_id = RRW_GAMMA; } // Looking for XML node with tree generating model info xnd = XML_Search_Node_Name("treegenerating",YES,xroot); if(xnd != NULL) { char *treemodel; treemodel = XML_Get_Attribute_Value(xnd,"model"); if(!strcmp(treemodel,"none")) mixt_tree->eval_tlnL = NO; else mixt_tree->eval_tlnL = YES; char *prior_mean; prior_mean = XML_Get_Attribute_Value(xnd,"neff.prior.mean"); if(prior_mean != NULL) mixt_tree->times->neff_prior_mean = String_To_Dbl(prior_mean); char *prior_var; prior_var = XML_Get_Attribute_Value(xnd,"neff.prior.var"); if(prior_var != NULL) mixt_tree->times->neff_prior_var = String_To_Dbl(prior_var); char *prior_distrib; prior_distrib = XML_Get_Attribute_Value(xnd,"neff.prior.distrib"); if(prior_distrib != NULL) { if(!strcmp(prior_distrib,"exponential")) mixt_tree->times->neff_prior_distrib = EXPONENTIAL_PRIOR; else if(!strcmp(prior_distrib,"normal")) mixt_tree->times->neff_prior_distrib = NORMAL_PRIOR; else if(!strcmp(prior_distrib,"flat")) mixt_tree->times->neff_prior_distrib = FLAT_PRIOR; else { PhyML_Printf("\n. Unknown prior distribution '%s'. Aborting. ",prior_distrib); assert(FALSE); } } char *expgrowth; expgrowth = XML_Get_Attribute_Value(xnd,"expgrowth"); if(expgrowth != NULL) { int select = XML_Validate_Attr_Int(expgrowth,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->times->coalescent_model_id = EXPCOALESCENT; else mixt_tree->times->coalescent_model_id = STRICTCOALESCENT; } char *powgrowth; powgrowth = XML_Get_Attribute_Value(xnd,"powgrowth"); if(powgrowth != NULL) { int select = XML_Validate_Attr_Int(powgrowth,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->times->coalescent_model_id = POWLAW; else mixt_tree->times->coalescent_model_id = STRICTCOALESCENT; } char *fix_node_ages; fix_node_ages = XML_Get_Attribute_Value(xnd,"fix.node.ages"); if(fix_node_ages != NULL) { int select = XML_Validate_Attr_Int(fix_node_ages,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->mod->s_opt->opt_node_ages = NO; else mixt_tree->mod->s_opt->opt_node_ages = YES; } char *fix_neff; fix_neff = XML_Get_Attribute_Value(xnd,"fix.neff"); if(fix_neff != NULL) { int select = XML_Validate_Attr_Int(fix_neff,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->mod->s_opt->opt_neff = NO; else mixt_tree->mod->s_opt->opt_neff = YES; } } // Cross validation xnd = XML_Search_Node_Name("phyrex",YES,xroot); short int do_cv = YES; if(xnd != NULL) { char *crossvald; crossvald = XML_Get_Attribute_Value(xnd,"cross.validation"); if(crossvald != NULL) { int select = XML_Validate_Attr_Int(crossvald,6, "true","yes","y", "false","no","n"); if(select < 3) do_cv = YES; else do_cv = NO; } } // Looking for XML node with rate-across-lineage info xnd = XML_Search_Node_Name("clockrate",YES,xroot); if(xnd != NULL) { char *clock_r; clock_r = XML_Get_Attribute_Value(xnd,"value"); if(clock_r == NULL) clock_r = XML_Get_Attribute_Value(xnd,"clock.val"); if(clock_r == NULL) clock_r = XML_Get_Attribute_Value(xnd,"val"); if(clock_r != NULL) { mixt_tree->rates->clock_r = String_To_Dbl(clock_r); } char *opt_clock; opt_clock = XML_Get_Attribute_Value(xnd,"optimise.clock"); if(opt_clock == NULL) opt_clock = XML_Get_Attribute_Value(xnd,"optimize.clock"); if(opt_clock == NULL) opt_clock = XML_Get_Attribute_Value(xnd,"optimize.rate"); if(opt_clock == NULL) opt_clock = XML_Get_Attribute_Value(xnd,"opt.clock"); if(opt_clock != NULL) { int select = XML_Validate_Attr_Int(opt_clock,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->mod->s_opt->opt_clock_r = YES; else mixt_tree->mod->s_opt->opt_clock_r = NO; } char *prior_mean; prior_mean = XML_Get_Attribute_Value(xnd,"prior.mean"); if(prior_mean != NULL) { mixt_tree->rates->clock_r_has_prior = YES; mixt_tree->rates->clock_r_prior_mean = String_To_Dbl(prior_mean); if(mixt_tree->rates->clock_r_prior_mean < 0.0 || mixt_tree->rates->clock_r_prior_mean > 1000.) { PhyML_Printf("\n. Prior mean for clock rate should be set to a value in [0,1000.]"); assert(false); } } char *prior_var; prior_var = XML_Get_Attribute_Value(xnd,"prior.var"); if(prior_var != NULL) { mixt_tree->rates->clock_r_has_prior = YES; mixt_tree->rates->clock_r_prior_var = String_To_Dbl(prior_var); if(mixt_tree->rates->clock_r_prior_var < 0.0 || mixt_tree->rates->clock_r_prior_var > 1000.) { PhyML_Printf("\n. Prior variance for clock rate should be set to a value in [0,1000.]"); assert(false); } } if((prior_var && !prior_mean) || (!prior_var && prior_mean)) { PhyML_Printf("\n. Could not read the prior mean or variance for the clock rate in your XML file."); PhyML_Printf("\n. Please use ``prior.mean='value', prior.var='value'."); assert(false); } char *init_value; init_value = XML_Get_Attribute_Value(xnd,"init.value"); if(init_value != NULL) { mixt_tree->rates->init_clock_r = YES; mixt_tree->rates->clock_r = String_To_Dbl(init_value); if(mixt_tree->rates->clock_r < 0.0) { PhyML_Printf("\n. Initial value for clock rate should be positive."); assert(false); } } } // Looking for calibration info xnd = XML_Search_Node_Name("calibration",YES,xroot); if(xnd == NULL) { PhyML_Fprintf(stderr,"\n. No calibration information seems to be provided."); PhyML_Fprintf(stderr,"\n. Please amend your XML file. \n"); assert(FALSE); } else { assert(xnd->child); if(XML_Search_Node_Name("upper",NO,xnd->child) == NULL && XML_Search_Node_Name("lower",NO,xnd->child) == NULL) { PhyML_Fprintf(stderr,"\n. There is no calibration information provided. \n"); PhyML_Fprintf(stderr,"\n. Please check your data. \n"); assert(FALSE); } } // Looking for coordinate file xnd = XML_Search_Node_Name("coordinates",YES,xroot); if(xnd == NULL) { PhyML_Fprintf(stderr,"\n. No spatial information (i.e., coordinates) seems to be provided."); PhyML_Fprintf(stderr,"\n. Please amend your XML file. \n"); Exit("\n"); } else { char *coord_file; coord_file = XML_Get_Attribute_Value(xnd,"file.name"); strcpy(mixt_tree->io->in_coord_file,coord_file); mixt_tree->io->fp_in_coord = Openfile(mixt_tree->io->in_coord_file,READ); } seed = (mixt_tree->io->r_seed < 0)?(time(NULL)):(mixt_tree->io->r_seed); srand(seed); mixt_tree->io->r_seed = seed; MIXT_Check_Model_Validity(mixt_tree); MIXT_Chain_Models(mixt_tree); Init_Model(mixt_tree->mod->io->cdata,mixt_tree->mod,mixt_tree->mod->io); Set_Model_Parameters(mixt_tree->mod); Print_Data_Structure(NO,stdout,mixt_tree); tree = MIXT_Starting_Tree(mixt_tree); if(mixt_tree->io->in_tree < 2) Add_Root(tree->a_edges[0],tree); Copy_Tree(tree,mixt_tree); Free_Tree(tree); if(mixt_tree->mod->io->edge_len_unit == CALENDAR) Convert_Lengths_From_Calendar_To_Substitutions(mixt_tree); Copy_Tree(mixt_tree,mixt_tree->next); Connect_CSeqs_To_Nodes(mixt_tree->mod->io->cdata,mixt_tree->mod->io,mixt_tree); Init_T_Beg(mixt_tree); Make_Tree_For_Lk(mixt_tree); Make_Tree_For_Pars(mixt_tree); Make_Spr(mixt_tree); MIXT_Chain_All(mixt_tree); MIXT_Check_Edge_Lens_In_All_Elem(mixt_tree); MIXT_Turn_Branches_OnOff_In_All_Elem(ON,mixt_tree); MIXT_Check_Invar_Struct_In_Each_Partition_Elem(mixt_tree); MIXT_Check_RAS_Struct_In_Each_Partition_Elem(mixt_tree); XML_Read_Calibration(xroot,mixt_tree); MIXT_Chain_Cal(mixt_tree); if(TIMES_Calibrations_Apply_To_Tips_Only(mixt_tree) == YES && mixt_tree->mod->s_opt->opt_topo == NO) { TIMES_Randomize_Tip_Times_Given_Calibrations(mixt_tree); // Topology is unchanged TIMES_Bl_To_Times(1, mixt_tree); // TIMES_Bl_To_Times(0, mixt_tree); // for (int i = 0; i < mixt_tree->n_otu; ++i) // { // PhyML_Printf("\n", i + 1); // PhyML_Printf("\n\t", mixt_tree->a_nodes[i]->name); // PhyML_Printf("\n"); // PhyML_Printf("\n", i + 1); // PhyML_Printf("\n\t%f", mixt_tree->times->nd_t[i]); // PhyML_Printf("\n\t%f", mixt_tree->times->nd_t[i]); // PhyML_Printf("\n\t", i + 1); // PhyML_Printf("\n"); // } // Exit("\n"); Update_Ancestors(mixt_tree->n_root, mixt_tree->n_root->v[2], mixt_tree->n_root->b[2], mixt_tree); Update_Ancestors(mixt_tree->n_root, mixt_tree->n_root->v[1], mixt_tree->n_root->b[1], mixt_tree); } else { TIMES_Randomize_Tree_With_Time_Constraints(mixt_tree->times->a_cal[0],mixt_tree); } MIXT_Propagate_Tree_Update(mixt_tree); if(RRW_Is_Rw(mixt_tree->mmod) == YES || VELOC_Is_Integrated_Velocity(mixt_tree->mmod) == YES) { mixt_tree->aux_tree = (t_tree **)mCalloc(3,sizeof(t_tree *)); /* Auxilliary tree for updating dispersal parameter in RRW and RW models first (i=0) and pop. size after (i=1) */ for(int i=0;i<3;++i) { t_tree *aux_tree; mixt_tree->aux_tree[i] = Make_Tree_From_Scratch(mixt_tree->n_otu,mixt_tree->data); aux_tree = mixt_tree->aux_tree[i]; aux_tree->mod = mixt_tree->mod; aux_tree->io = mixt_tree->io; aux_tree->mmod = PHYREX_Make_Migrep_Model(mixt_tree->n_otu,2); aux_tree->mmod->n_dim = 2; PHYREX_Set_Default_Migrep_Mod(mixt_tree->n_otu,aux_tree->mmod); aux_tree->mmod->model_id = mixt_tree->mmod->model_id; aux_tree->mmod->use_locations = mixt_tree->mmod->use_locations; aux_tree->mmod->integrateAncestralLocations = mixt_tree->mmod->integrateAncestralLocations; Copy_Tree(mixt_tree,aux_tree); aux_tree->rates = RATES_Make_Rate_Struct(mixt_tree->n_otu); RATES_Init_Rate_Struct(aux_tree->rates,NULL,mixt_tree->n_otu); RATES_Copy_Rate_Struct(mixt_tree->rates,aux_tree->rates,mixt_tree->n_otu); aux_tree->rates->model_id = LOGNORMAL; aux_tree->times = TIMES_Make_Time_Struct(mixt_tree->n_otu); TIMES_Init_Time_Struct(aux_tree->times,NULL,mixt_tree->n_otu); TIMES_Copy_Time_Struct(mixt_tree->times,aux_tree->times,mixt_tree->n_otu); RATES_Duplicate_Calib_Struct(mixt_tree,aux_tree); MIXT_Chain_Cal(aux_tree); DATE_Assign_Primary_Calibration(aux_tree); aux_tree->data = mixt_tree->data; Connect_CSeqs_To_Nodes(mixt_tree->data,mixt_tree->io,aux_tree); Share_Lk_Struct(mixt_tree->next,aux_tree); aux_tree->mcmc = MCMC_Make_MCMC_Struct(); MCMC_Init_MCMC_Struct(NULL,NULL,aux_tree->mcmc); MCMC_Complete_MCMC(aux_tree->mcmc,aux_tree); aux_tree->mcmc->chain_len_burnin = mixt_tree->io->mcmc->chain_len_burnin; aux_tree->mcmc->run = 1; Make_Contrasts(aux_tree); Make_Contmod(aux_tree); aux_tree->contmod->obs_var = mixt_tree->contmod->obs_var; aux_tree->contmod->obs_model = mixt_tree->contmod->obs_model; aux_tree->contmod->obs_model_est = mixt_tree->contmod->obs_model_est; } } /* Create ldsks and connect tree tips to them */ /* once tip dates have been set properly (in */ /* TIMES_Randomize_Tree_With_Time_Constraints) */ PHYREX_Make_And_Connect_Tip_Disks(mixt_tree); for(int i=0;i<3;++i) if(mixt_tree->aux_tree && mixt_tree->aux_tree[i]) PHYREX_Make_And_Connect_Tip_Disks(mixt_tree->aux_tree[i]); /* Read spatial coordinates */ PHYREX_Read_Tip_Coordinates(mixt_tree); for(int i=0;i<3;++i) if(mixt_tree->aux_tree && mixt_tree->aux_tree[i]) PHYREX_Read_Tip_Coordinates(mixt_tree->aux_tree[i]); PHYREX_Init_Migrep_Mod(mixt_tree->mmod,2, mixt_tree->mmod->lim_do->lonlat[0], mixt_tree->mmod->lim_do->lonlat[1], mixt_tree->mmod->lim_up->lonlat[0], mixt_tree->mmod->lim_up->lonlat[1]); /* Initialize parameters of migrep model */ mixt_tree->mmod->lbda = 0.1; mixt_tree->mmod->mu = 1.0; if(mixt_tree->mmod->model_id == SLFV_GAUSSIAN || mixt_tree->mmod->model_id == SLFV_UNIFORM) mixt_tree->mmod->rad = 0.05*((mixt_tree->mmod->lim_up->lonlat[0]-mixt_tree->mmod->lim_do->lonlat[0])+ (mixt_tree->mmod->lim_up->lonlat[1]-mixt_tree->mmod->lim_do->lonlat[1])); else if(RRW_Is_Rw(mixt_tree->mmod) == YES || VELOC_Is_Integrated_Velocity(mixt_tree->mmod) == YES) mixt_tree->mmod->rad = mixt_tree->mmod->sigsq[0]; mixt_tree->mmod->sigsq[0] = PHYREX_Update_Sigsq(mixt_tree); for(int i=1;immod->n_dim;++i) mixt_tree->mmod->sigsq[i] = mixt_tree->mmod->sigsq[0]; for(int i=0;i<3;++i) { if(mixt_tree->aux_tree && mixt_tree->aux_tree[i]) { mixt_tree->aux_tree[i]->mmod->lbda = mixt_tree->mmod->lbda; mixt_tree->aux_tree[i]->mmod->mu = mixt_tree->mmod->mu; mixt_tree->aux_tree[i]->mmod->rad = mixt_tree->mmod->rad; mixt_tree->aux_tree[i]->mmod->sigsq[0] = mixt_tree->mmod->sigsq[0]; for(int j=1;jmmod->n_dim;++j) mixt_tree->aux_tree[i]->mmod->sigsq[j] = mixt_tree->mmod->sigsq[0]; } } /* Random genealogy or user-defined tree */ switch(mixt_tree->io->in_tree) { case 0 : case 1 : { if(RRW_Is_Rw(mixt_tree->mmod) == YES || VELOC_Is_Integrated_Velocity(mixt_tree->mmod) == YES) PHYREX_Simulate_Backward_Core(mixt_tree->young_disk,YES,mixt_tree); else PHYREX_Simulate_Backward_Core(mixt_tree->young_disk,NO,mixt_tree); PHYREX_Ldsk_To_Tree(mixt_tree); break; } case 2: { PHYREX_Tree_To_Ldsk(mixt_tree); break; } } Update_Ancestors(mixt_tree->n_root,mixt_tree->n_root->v[2],mixt_tree->n_root->b[2],mixt_tree); Update_Ancestors(mixt_tree->n_root,mixt_tree->n_root->v[1],mixt_tree->n_root->b[1],mixt_tree); MCMC_Randomize_Rate_Across_Sites(mixt_tree); MCMC_Randomize_Rates(mixt_tree); MCMC_Randomize_Clock_Rate(mixt_tree); MCMC_Randomize_Sigsq_Scale(mixt_tree); MCMC_Randomize_Sigsq(mixt_tree); MCMC_Randomize_Locations(mixt_tree); MCMC_Randomize_Veloc(mixt_tree); MCMC_Randomize_Contmod(mixt_tree); Set_Ignore_Root(YES,mixt_tree); Set_Bl_From_Rt(YES,mixt_tree); PHYREX_Oldest_Sampled_Disk(mixt_tree); for(int i=0;i<3;++i) if(mixt_tree->aux_tree && mixt_tree->aux_tree[i]) PHYREX_Oldest_Sampled_Disk(mixt_tree->aux_tree[i]); if(RRW_Is_Rw(mixt_tree->mmod) == YES || VELOC_Is_Integrated_Velocity(mixt_tree->mmod) == YES) { mixt_tree->times->augmented_coalescent = NO; for(int i=0;i<3;++i) mixt_tree->aux_tree[i]->times->augmented_coalescent = NO; PHYREX_Remove_All_Disks_Except_Coal_And_Tips(mixt_tree); for(int i=0;i<3;++i) { PHYREX_Simulate_Backward_Core(mixt_tree->aux_tree[i]->young_disk,YES,mixt_tree->aux_tree[i]); PHYREX_Ldsk_To_Tree(mixt_tree->aux_tree[i]); PHYREX_Remove_All_Disks_Except_Coal_And_Tips(mixt_tree->aux_tree[i]); Update_Ancestors(mixt_tree->aux_tree[i]->n_root,mixt_tree->aux_tree[i]->n_root->v[2],mixt_tree->aux_tree[i]->n_root->b[2],mixt_tree->aux_tree[i]); Update_Ancestors(mixt_tree->aux_tree[i]->n_root,mixt_tree->aux_tree[i]->n_root->v[1],mixt_tree->aux_tree[i]->n_root->b[1],mixt_tree->aux_tree[i]); } } assert(PHYREX_Check_Struct(mixt_tree,YES)); TIMES_Lk(mixt_tree); RATES_Lk(mixt_tree); LOCATION_Prior(mixt_tree); TIMES_Prior(mixt_tree); RATES_Prior(mixt_tree); Set_Update_Eigen(YES,mixt_tree->mod); RATES_Update_Edge_Lengths(mixt_tree); mixt_tree->contmod->both_sides[LOCATION] = NO; mixt_tree->contmod->both_sides[VELOCITY] = NO; LOCATION_Lk(NULL,mixt_tree); Lk(NULL,mixt_tree); Set_Update_Eigen(NO,mixt_tree->mod); char *s = LOCATION_Model_Id(mixt_tree->mmod); PhyML_Printf("\n. Spatial diffusion model: %s",s); Free(s); PhyML_Printf("\n. Ne prior mean: %f",mixt_tree->times->neff_prior_mean); PhyML_Printf("\n. Exponential growth of Ne: %s",(mixt_tree->times->coalescent_model_id == EXPCOALESCENT)?"yes":"no"); PhyML_Printf("\n. Init lnL(seq|phylo): %f",mixt_tree->c_lnL); PhyML_Printf("\n. Init lnL(rates|phylo): %f",mixt_tree->rates->c_lnL); PhyML_Printf("\n. Init lnL(coord|phylo): %f",mixt_tree->mmod->c_lnL); PhyML_Printf("\n. Init lnL(phylo): %f",mixt_tree->times->c_lnL); PhyML_Printf("\n. Init lnP(rates|phylo): %f",mixt_tree->rates->c_lnP); PhyML_Printf("\n. Init lnP(coord|phylo): %f",mixt_tree->mmod->c_lnP); PhyML_Printf("\n. Init lnP(phylo): %f",mixt_tree->times->c_lnP); PhyML_Printf("\n. Init clock rate: %f",mixt_tree->rates->clock_r); PhyML_Printf("\n. Random seed: %d",mixt_tree->io->r_seed); if (do_cv == YES) MCMC_Crossvalidate_Locations(mixt_tree); else { res = PHYREX_MCMC(mixt_tree); Free(res); } // Cleaning up... PHYREX_Free_Ldsk_Struct(mixt_tree); for(int i=0;i<3;++i) if(mixt_tree->aux_tree && mixt_tree->aux_tree[i]) PHYREX_Free_Ldsk_Struct(mixt_tree->aux_tree[i]); RATES_Free_Rates(mixt_tree->rates); for(int i=0;i<3;++i) if(mixt_tree->aux_tree && mixt_tree->aux_tree[i]) RATES_Free_Rates(mixt_tree->aux_tree[i]->rates); TIMES_Free_Times(mixt_tree->times); for(int i=0;i<3;++i) if(mixt_tree->aux_tree && mixt_tree->aux_tree[i]) TIMES_Free_Times(mixt_tree->aux_tree[i]->times); /* MCMC_Free_MCMC(mixt_tree->mcmc); */ for(int i=0;i<3;++i) if(mixt_tree->aux_tree && mixt_tree->aux_tree[i]) MCMC_Free_MCMC(mixt_tree->aux_tree[i]->mcmc); Free_Mmod(mixt_tree->mmod); Free_Spr_List_One_Edge(mixt_tree); Free_Tree_Pars(mixt_tree); Free_Tree_Lk(mixt_tree); if(mixt_tree->io->fp_out_trees) fclose(mixt_tree->io->fp_out_trees); if(mixt_tree->io->fp_out_tree) fclose(mixt_tree->io->fp_out_tree); if(mixt_tree->io->fp_out_stats) fclose(mixt_tree->io->fp_out_stats); if(mixt_tree->io->fp_out_json_trace) fclose(mixt_tree->io->fp_out_json_trace); Free_Input(mixt_tree->io); tree = mixt_tree; do { Free_Calign(tree->data); tree = tree->next_mixt; } while(tree); tree = mixt_tree; do { Free_Optimiz(tree->mod->s_opt); tree = tree->next; } while(tree); Free_Model_Complete(mixt_tree->mod); Free_Model_Basic(mixt_tree->mod); for(int i=0;i<3;++i) if(mixt_tree->aux_tree && mixt_tree->aux_tree[i]) Free_Tree(mixt_tree->aux_tree[i]); Free_Tree(mixt_tree); Free(res); XML_Free_XML_Tree(xroot); fclose(fp_xml_in); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int PHYREX_Main_Simulate(int argc, char *argv[]) { t_tree *tree; int seed,i,modid; char *s; t_dsk *disk; int n_sites,n_otus; phydbl width,height; phydbl lbda, rad,mu; char *datadir; s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); n_otus = (int)atoi(argv[1]); n_sites = 1; width = (phydbl)atof(argv[2]); height = (phydbl)atof(argv[3]); lbda = (phydbl)atof(argv[4]); rad = (phydbl)atof(argv[5]); mu = (phydbl)atof(argv[6]); seed = (int)atoi(argv[7]); modid = (int)atoi(argv[8]); datadir = argv[9]; printf("\n. seed: %d",seed); srand(seed); tree = PHYREX_Simulate(n_otus,n_sites,width,height,lbda,rad,mu,seed,modid,datadir); /* tree = PHYREX_Simulate_Independent_Loci(n_otus,500,20.,20.,seed); */ disk = tree->young_disk; for(i=0;in_ldsk_a;i++) PHYREX_Free_Ldisk(disk->ldsk_a[i]); while(disk->prev) { disk = disk->prev; if(disk->next->ldsk != NULL) PHYREX_Free_Ldisk(disk->next->ldsk); PHYREX_Free_Disk(disk->next); } /* Root */ PHYREX_Free_Ldisk(disk->ldsk); PHYREX_Free_Disk(disk); RATES_Free_Rates(tree->rates); /* MCMC_Free_MCMC(tree->mcmc); */ Free_Mmod(tree->mmod); Free_Spr_List_One_Edge(tree); Free_Spr_List_All_Edge(tree); Free_Tree_Pars(tree); Free_Tree_Lk(tree); Free_Input(tree->io); Free_Optimiz(tree->mod->s_opt); Free_Model_Complete(tree->mod); Free_Model_Basic(tree->mod); Free_Calign(tree->data); Free_Tree(tree); Free(s); return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Test whether coord is in disk. Will actually only works in disk */ /* is a rectangle... */ int PHYREX_Is_In_Disk(t_geo_coord *coord, t_dsk *disk, t_phyrex_mod *mmod) { int i; assert(disk->centr->dim); if(mmod->model_id == SLFV_UNIFORM) { for(i=0;icentr->dim;i++) { if(fabs(coord->lonlat[i] - disk->centr->lonlat[i]) > disk->mmod->rad + 1.E-20) { return(NO); } } return(YES); } else if(mmod->model_id == SLFV_GAUSSIAN) { return(YES); } return(-1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl PHYREX_Lk(t_tree *tree) { phydbl lnP; switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : case SLFV_UNIFORM : { lnP = SLFV_Lk_Gaussian(tree) + TIMES_Lk_SLFV(tree); break; } case RW : { lnP = RW_Lk(tree) + TIMES_Lk_Coalescent(tree); break; } case RRW_GAMMA : case RRW_LOGNORMAL : { lnP = RRW_Lk(tree) + TIMES_Lk_Coalescent(tree); break; } case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { lnP = VELOC_Lk(NULL,tree) + TIMES_Lk_Coalescent(tree); break; } default : assert(FALSE); } return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl PHYREX_Lk_Core(t_dsk *disk, t_tree *tree) { phydbl lnL; lnL = UNLIKELY; switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : case SLFV_UNIFORM : { lnL = SLFV_Lk_Gaussian_Core(disk,tree); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { lnL = RRW_Lk_Core(disk,tree); break; } case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { PhyML_Printf("\n. PHYREX_Lk_Core function not implemented for IBM not IWN model"); Exit("\n"); break; } default : assert(FALSE); } return lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Warning: the calculation below does not incoporate time information // since things get messy when considering serial samples phydbl PHYREX_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : case SLFV_UNIFORM : { return(SLFV_Lk_Gaussian_Range(young,old,tree) + TIMES_Lk_SLFV_Range(young,old,tree)); break; } case RW : { return(RW_Lk_Range(young,old,tree) + TIMES_Lk_Coalescent_Range(young,old,tree)); break; } case RRW_GAMMA : case RRW_LOGNORMAL : { return(RRW_Lk_Range(young,old,tree) + TIMES_Lk_Coalescent_Range(young,old,tree)); break; } case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { PhyML_Printf("\n. PHYREX_Lk_Core function not implemented for IBM nor IWN models"); Exit("\n"); break; } default : assert(FALSE); } return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX) phydbl *PHYREX_MCMC(t_tree *tree) { MCMC_Run(tree); return(NULL); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl PHYREX_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { return PHYREX_Lk(tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Remove_Disk(t_dsk *disk) { t_dsk *prev; t_dsk *next; prev = disk->prev; next = disk->next; if(prev != NULL) prev->next = next; if(next != NULL) next->prev = prev; disk->next = NULL; disk->prev = NULL; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Insert disk event based on its time. Insertion above the root is permitted */ void PHYREX_Insert_Disk(t_dsk *ins, t_tree *tree) { t_dsk *disk; assert(ins != NULL); disk = tree->young_disk; while(disk->prev != NULL && disk->prev->time > ins->time) { /* PhyML_Printf("\n disk->prev->time: %f ins->time: %f",disk->prev->time,ins->time); */ disk = disk->prev; } PHYREX_Insert_Disk_At(ins,disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Move_Disk_Updown(t_dsk *this, phydbl target_time, t_tree *tree) { t_dsk *disk; if(target_time < this->time) { disk = this->prev; while(disk && target_time < disk->time) { if((disk->prev != NULL && disk->prev->time < target_time) || (disk->prev == NULL)) { PHYREX_Remove_Disk(this); PHYREX_Insert_Disk_At(this,disk); break; } disk = disk->prev; } } else { disk = this->next; while(disk && target_time > disk->time) { if(disk->next != NULL && disk->next->time > target_time) { PHYREX_Remove_Disk(this); PHYREX_Insert_Disk_At(this,disk->next); break; } disk = disk->next; assert(disk); } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Insert_Disk_At(t_dsk *ins, t_dsk *disk) { ins->prev = disk->prev; ins->next = disk; disk->prev = ins; if(ins->prev != NULL) ins->prev->next = ins; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_ldsk *PHYREX_Prev_Coal_Lindisk(t_ldsk *t) { if(t == NULL) return NULL; if(t->n_next > 1) { return t; } else { return PHYREX_Prev_Coal_Lindisk(t->prev); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_ldsk *PHYREX_Next_Coal_Lindisk(t_ldsk *t) { assert(!(t == NULL)); if(t->n_next > 1 || t->next == NULL) return t; else { if(t->n_next > 1) // Should have t->is_coal = YES { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit(""); } return PHYREX_Next_Coal_Lindisk(t->next[0]); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Generate a new trajectory, including disk event centers, between 'y_ldsk' a ``young'' lindisk event and 'o_ldsk' an old one. 'y_ldsk and 'o_ldsk' remain unaffected. No disk events should be present between y_ldsk and o_ldsk: we need to generate some first. n_cur_disk is the current number of disks between y_ldsk and o_ldsk. */ int PHYREX_One_New_Traj(t_ldsk *y_ldsk, t_ldsk *o_ldsk, int dir_o_y, t_dsk *xtra_dsk, int n_cur_disk, t_tree *tree) { t_phyrex_mod *mmod; t_dsk *disk,**disk_new; int i,n,K; int min_n_disk,n_new_disk,n_disk; mmod = tree->mmod; disk = NULL; disk_new = NULL; K = 2; /* printf("\n# New traj from %s to %s",y_ldsk->coord->id,o_ldsk->coord->id); */ /* fflush(NULL); */ /* Minimum number of disks between y_ldsk and o_ldsk */ min_n_disk = 0; for(i=0;in_dim;i++) { /* PhyML_Printf("\n# y_ldsk %s : %f o_ldsk->disk->centr: %f rad: %f", */ /* y_ldsk->coord->id, */ /* y_ldsk->coord->lonlat[i], */ /* o_ldsk->disk->centr->lonlat[i], */ /* mmod->rad); */ if(y_ldsk->coord->lonlat[i] < o_ldsk->disk->centr->lonlat[i]) { n_disk = 0; while(y_ldsk->coord->lonlat[i] + (2*n_disk-1)*mmod->rad < o_ldsk->disk->centr->lonlat[i] - mmod->rad) n_disk++; if(n_disk > min_n_disk) min_n_disk = n_disk; } else { n_disk = 0; while(y_ldsk->coord->lonlat[i] - (2*n_disk-1)*mmod->rad > o_ldsk->disk->centr->lonlat[i] + mmod->rad) n_disk++; if(n_disk > min_n_disk) min_n_disk = n_disk; } /* printf(" -- min_n_disk: %d",min_n_disk); */ } /* printf("\n# min_n_disk: %d cur_n_disk: %d",min_n_disk,n_cur_disk); */ /* fflush(NULL); */ /* How many disks along the new path between y_ldsk and o_ldsk */ n_new_disk = Rand_Int(n_cur_disk-K,n_cur_disk+K); if(n_new_disk < min_n_disk) n_new_disk = min_n_disk; if(xtra_dsk != NULL) n_new_disk++; /* printf("\n# Add n_new_disk: %d",n_new_disk); fflush(NULL); */ if(n_new_disk > 0) { /* Make new disks to create a new path between ldsk_left and ldsk_up */ disk_new = (t_dsk **)mCalloc(n_new_disk,sizeof(t_dsk *)); for(i=0;in_dim,tree->n_otu); if(xtra_dsk != NULL) disk_new[n_new_disk-1] = xtra_dsk; else disk_new[n_new_disk-1] = PHYREX_Make_Disk_Event(mmod->n_dim,tree->n_otu); for(i=0;in_dim,mmod); /* Times of these new disks. If xtra_dsk != NULL, then make sure you do not */ /* reset the time of that disk */ n = (xtra_dsk != NULL) ? (n_new_disk-1) : (n_new_disk); for(i=0;itime = Uni()*(y_ldsk->disk->time - o_ldsk->disk->time) + o_ldsk->disk->time; /* Insert these events */ for(i=0;iyoung_disk->next); disk = tree->young_disk; while(disk->time > disk_new[i]->time) disk = disk->prev; PHYREX_Insert_Disk(disk_new[i],tree); } /* for(i=0;i disk_new: %f [%s]",disk_new[i]->time,disk_new[i]->id); fflush(NULL); */ /* } */ /* Add new lindisks to the new disk events */ for(i=0;ildsk = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(disk_new[i]->ldsk,disk_new[i],tree->mmod->n_dim); PHYREX_Make_Lindisk_Next(disk_new[i]->ldsk); /* printf("\n# Add ldsk %s to %s",disk_new[i]->ldsk->coord->id,disk_new[i]->id); fflush(NULL); */ } /* Connect them */ PHYREX_Connect_Ldsk_Given_Disk(disk_new,n_new_disk,y_ldsk,o_ldsk,dir_o_y); Free(disk_new); } else { o_ldsk->next[dir_o_y] = y_ldsk; y_ldsk->prev = o_ldsk; } /* Generate a trajectory */ PHYREX_One_New_Traj_Given_Disk(y_ldsk,o_ldsk,tree); return(n_new_disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Generate a new trajectory, including disk event centers, between 'y_ldsk' a ``young'' lindisk event and 'o_ldsk' an old one. 'y_ldsk and 'o_ldsk' remain unaffected. Disk events between these two ldsk should already be set. */ void PHYREX_One_New_Traj_Given_Disk(t_ldsk *y_ldsk, t_ldsk *o_ldsk, t_tree *tree) { int n_disk_btw; t_ldsk *ldsk; phydbl min, max; phydbl *min_disk_coord, *max_disk_coord; int i,k; phydbl rad; /* Number of disks between y_ldsk and o_ldsk */ ldsk = y_ldsk; n_disk_btw = 0; while(ldsk->prev != o_ldsk) { n_disk_btw++; ldsk = ldsk->prev; } if(n_disk_btw == 0) return; ldsk = y_ldsk; rad = ldsk->disk->mmod->rad; k = 0; while(ldsk != o_ldsk) { if(!ldsk->disk->next) /* Don't change location at tip node */ { ldsk = ldsk->prev; continue; } PHYREX_Store_Geo_Coord(ldsk->coord); PHYREX_Store_Geo_Coord(ldsk->disk->centr); for(i=0;immod->n_dim;i++) { min = MAX(ldsk->disk->mmod->lim_do->lonlat[i], MAX(ldsk->coord->lonlat[i] - 2.*rad, o_ldsk->disk->centr->lonlat[i] - rad*(2.*(n_disk_btw-k)-1.))); max = MIN(ldsk->disk->mmod->lim_up->lonlat[i], MIN(ldsk->coord->lonlat[i] + 2.*rad, o_ldsk->disk->centr->lonlat[i] + rad*(2.*(n_disk_btw-k)-1.))); assert(!(max < min)); /* New coordinates for the lindisk */ ldsk->coord->lonlat[i] = Uni()*(max - min) + min; } /* New coordinate for the centre of the corresponding disk event */ PHYREX_Get_Min_Max_Disk_Given_Ldsk(ldsk->disk,&min_disk_coord,&max_disk_coord,tree); for(i=0;immod->n_dim;i++) ldsk->disk->centr->lonlat[i] = Uni()*(max_disk_coord[i] - min_disk_coord[i]) + min_disk_coord[i]; Free(min_disk_coord); Free(max_disk_coord); ldsk = ldsk->prev; k++; } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Uniform_Path_Density(t_ldsk *y_ldsk, t_ldsk *o_ldsk, t_tree *tree) { int n_disk_btw; t_ldsk *ldsk; phydbl min, max; int i,k; phydbl rad; phydbl log_dens; phydbl *min_disk_coord, *max_disk_coord; if(y_ldsk == o_ldsk) return .0; /* Number of disks between y_ldsk and o_ldsk */ ldsk = y_ldsk; n_disk_btw = 0; while(ldsk->prev != o_ldsk) { n_disk_btw++; ldsk = ldsk->prev; } if(n_disk_btw == 0) return .0; log_dens = 0.0; ldsk = y_ldsk; rad = ldsk->disk->mmod->rad; k = 0; while(ldsk != o_ldsk) { if(!ldsk->disk->next) { ldsk = ldsk->prev; continue; } for(i=0;idisk->mmod->n_dim;i++) { min = MAX(ldsk->disk->mmod->lim_do->lonlat[i], MAX(ldsk->coord->lonlat[i] - 2.*rad, o_ldsk->disk->centr->lonlat[i] - rad*(2.*(n_disk_btw-k)-1.))); max = MIN(ldsk->disk->mmod->lim_up->lonlat[i], MIN(ldsk->coord->lonlat[i] + 2.*rad, o_ldsk->disk->centr->lonlat[i] + rad*(2.*(n_disk_btw-k)-1.))); assert(!(max < min)); log_dens -= log(max - min); } PHYREX_Get_Min_Max_Disk_Given_Ldsk(ldsk->disk,&min_disk_coord,&max_disk_coord,tree); for(i=0;immod->n_dim;i++) log_dens -= log(max_disk_coord[i] - min_disk_coord[i]); Free(min_disk_coord); Free(max_disk_coord); ldsk = ldsk->prev; k++; } return(log_dens); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Return the index of the 'next' element of 'old' that should be used in order to reach 'young'. */ int PHYREX_Get_Next_Direction(t_ldsk *young, t_ldsk *old) { if(young->disk->time < old->disk->time) { PhyML_Printf("\n. young (%s) @ time: %f; old (%s) @ time: %f delta: %G", young->coord->id,young->disk->time, old->coord->id,old->disk->time, old->disk->time-young->disk->time); assert(FALSE); } assert(!(young == NULL)); if(young->prev == old) { int i; for(i=0;in_next;i++) if(old->next[i] == young) return i; } else { return PHYREX_Get_Next_Direction(young->prev,old); } return(-1); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Lindisk_List_Range(t_dsk *young, t_dsk *old, t_tree *tree) { t_dsk *disk; assert(young->time > old->time); disk = young; do { assert(disk); PHYREX_Update_Lindisk_List_Core(disk,tree); if(disk == old) break; disk = disk->prev; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Lindisk_List(t_tree *tree) { PHYREX_Update_Lindisk_List_Pre(tree->young_disk->prev,tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Lindisk_List_Pre(t_dsk *disk, t_tree *tree) { if(!disk) return; else { PHYREX_Update_Lindisk_List_Core(disk,tree); PHYREX_Update_Lindisk_List_Pre(disk->prev,tree); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Lindisk_List_Core(t_dsk *disk, t_tree *tree) { int i; if(!disk) return; if(!disk->next) return; /* PhyML_Printf("\n. Time: %f",disk->time); */ assert(disk->ldsk_a); // Set ldsk_a[i] to NULL if it does not point to a tip node for(i=0;in_otu;++i) if(disk->ldsk_a[i] && !(disk->ldsk_a[i]->nd != NULL && disk->ldsk_a[i]->nd->tax == YES && disk->age_fixed == YES && disk->ldsk_a[i]->disk == disk)) { disk->ldsk_a[i] = NULL; } disk->n_ldsk_a = 0; for(i=0;in_otu;++i) if(disk->ldsk_a[i] != NULL) { disk->n_ldsk_a++; } /* PhyML_Printf(" [%d]",disk->n_ldsk_a); */ // Make sure the tip nodes are all at the top of ldsk_a for(i=0;in_ldsk_a;++i) assert(disk->ldsk_a[i] != NULL); for(i=disk->n_ldsk_a;in_otu;++i) assert(disk->ldsk_a[i] == NULL); for(i=0;inext->n_ldsk_a;++i) { // disk->next->ldsk_a[i] does not coalesce or jump on disk->next // --> add it disk->ldsk_a array if((disk->next->ldsk_a[i]->prev != NULL && disk->next->ldsk_a[i]->prev != disk->next->ldsk) || (disk->next->ldsk_a[i]->prev == NULL)) { disk->ldsk_a[disk->n_ldsk_a] = disk->next->ldsk_a[i]; disk->n_ldsk_a++; } } /* PhyML_Printf(" <%d>",disk->n_ldsk_a); */ // A jump or coalescence has occurred on disk->next // --> add the lineage to disk->ldsk_a array if(disk->next->ldsk != NULL) { disk->ldsk_a[disk->n_ldsk_a] = disk->next->ldsk; disk->n_ldsk_a++; } /* PhyML_Printf(" !%d!",disk->n_ldsk_a); */ /* PhyML_Printf("\n"); */ /* for(i=0;in_ldsk_a;++i) PhyML_Printf("\n. Disk %s [%12f] ldsk_a: %s (%3d)",disk->id,disk->time,disk->ldsk_a[i]->coord->id,disk->ldsk_a[i]->nd ? disk->ldsk_a[i]->nd->tax : -1); */ /* if(disk->ldsk != NULL) PhyML_Printf("\n* Has %s on it (next: %s @ %12f %s)", */ /* disk->ldsk->coord->id, */ /* disk->ldsk->next[0]->coord->id, */ /* disk->ldsk->next[0]->disk->time, */ /* disk->ldsk->next[0]->prev->coord->id); */ if(disk->n_ldsk_a == 0 || disk->n_ldsk_a > tree->n_otu) { PhyML_Fprintf(stderr,"\n. disk: %s (%p,%d) time: %f next: %s (%f,%d,%c,%d) prev: %s (%f,%d) disk->n_ldsk_a: %d coord: %s n_otu: %d", disk->id, disk, disk->age_fixed, disk->time, disk->next ? disk->next->id : "??", disk->next ? disk->next->time : 0.0, disk->next ? disk->next->n_ldsk_a : -1, disk->next->ldsk ? 'y' : 'n', disk->next->ldsk ? disk->next->ldsk->n_next : -1, disk->prev ? disk->prev->id : "??", disk->prev ? disk->prev->time : 0.0, disk->prev ? disk->prev->n_ldsk_a : -1, disk->n_ldsk_a, disk->ldsk?disk->ldsk->coord->id:"??", tree->n_otu); assert(FALSE); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Connect all the ldsk between y_ldsk (young ldsk) and o_ldsk (old ldsk). The disk between y_ldsk and o_ldsk should have all been set already Note: the disks in **disk are sorted in ascending order of their times */ void PHYREX_Connect_Ldsk_Given_Disk(t_dsk **disk, int n_disk, t_ldsk *y_ldsk, t_ldsk *o_ldsk, int dir_o_y) { int i,j; t_dsk *disk_tmp; /* Sort these events by ascending order of their times */ for(i=0;itime > disk[i]->time) { disk_tmp = disk[i]; disk[i] = disk[j]; disk[j] = disk_tmp; } } } for(i=0;ildsk->next[0] = y_ldsk; y_ldsk->prev = disk[i]->ldsk; /* printf("\n. connect %s to %s",disk[i]->ldsk->coord->id,y_ldsk->coord->id); fflush(NULL); */ } else { disk[i]->ldsk->next[0] = disk[i-1]->ldsk; disk[i-1]->ldsk->prev = disk[i]->ldsk; /* printf("\n. connect %s to %s",disk[i]->ldsk->coord->id,disk[i-1]->ldsk->coord->id); fflush(NULL); */ } } /* printf("\n. connect %s next dir: %d [%d] to %s",o_ldsk->coord->id,dir_o_y,o_ldsk->n_next,disk[n_disk-1]->ldsk->coord->id); fflush(NULL); */ o_ldsk->next[dir_o_y] = disk[n_disk-1]->ldsk; disk[n_disk-1]->ldsk->prev = o_ldsk; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Print_Struct(char sign, t_tree *tree) { t_dsk *disk; int i; t_ldsk *ldisk; /* PHYREX_Update_Lindisk_List(tree); */ disk = tree->young_disk; /* while(disk->prev) disk = disk->prev; */ do { PhyML_Printf("\n%c Disk: %s @ %7.3f has %3s on it is_coal? %2d rad: %f age fixed? %d #out: %d", sign, disk->id, disk->time,disk->ldsk?disk->ldsk->coord->id:NULL, disk->ldsk?disk->ldsk->n_next:-1, tree->mmod->rad, disk->age_fixed, PHYREX_Number_Of_Outgoing_Ldsks(disk)); /* for(j=0;jmmod->n_dim;j++) PhyML_Printf(" %f",disk->centr->lonlat[j]); */ /* fflush(NULL); */ for(i=0;in_ldsk_a;i++) { ldisk = disk->ldsk_a[i]; PhyML_Printf("\n%c ldisk: %s%c prev: %s", sign, ldisk->coord->id, (ldisk->nd && ldisk->nd->tax == YES && ldisk->disk == disk) ? '*' : ' ', ldisk->prev ? ldisk->prev->coord->id : NULL); fflush(NULL); /* for(j=0;jmmod->n_dim;j++) */ /* { */ /* PhyML_Printf(" %f",ldisk->coord->lonlat[j]); */ /* fflush(NULL); */ /* if(FABS(ldisk->coord->lonlat[j] - ldisk->disk->centr->lonlat[j]) > 2.*tree->mmod->rad && */ /* ldisk->disk->ldsk == ldisk) PhyML_Printf(" ! "); */ /* if(ldisk->prev) */ /* { */ /* if(ldisk->coord->lonlat[j] < ldisk->prev->disk->centr->lonlat[j] - tree->mmod->rad) PhyML_Printf(" #a "); */ /* if(ldisk->coord->lonlat[j] > ldisk->prev->disk->centr->lonlat[j] + tree->mmod->rad) PhyML_Printf(" #b "); */ /* } */ /* if(ldisk->next) */ /* { */ /* if(ldisk->coord->lonlat[j] < ldisk->disk->centr->lonlat[j] - tree->mmod->rad) PhyML_Printf(" $a "); */ /* if(ldisk->coord->lonlat[j] > ldisk->disk->centr->lonlat[j] + tree->mmod->rad) PhyML_Printf(" $b "); */ /* } */ } disk = disk->prev; } while(disk); PhyML_Printf("\n. End of struct"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Check_Struct(t_tree *tree, int exit) { int i; t_dsk *disk; disk = tree->young_disk; do { if(disk->n_ldsk_a == 0) { if(exit == YES) { PhyML_Printf("\n. disk %s time %f has n_ldsk_a=0 (next has %d prev has %d)", disk->id, disk->time, disk->next ? disk->next->n_ldsk_a : -1, disk->prev ? disk->prev->n_ldsk_a : -1); assert(FALSE); } return 0; } disk = disk->prev; } while(disk); // Check times /* for(i=0;in_otu;++i) */ /* { */ /* ldisk = tree->a_nodes[i]->ldsk; */ /* assert(ldisk); */ /* do */ /* { */ /* if(ldisk->prev->disk->time > ldisk->disk->time) */ /* { */ /* if(exit == YES) */ /* { */ /* PhyML_Printf("\n. ldisk->id: %s ldisk->prev->id: %s ldsk->disk->time: %f ldsk->prev->disk->time: %f diff: %g ldisk->prev->disk: %s ldisk->disk: %s", */ /* ldisk->coord->id, */ /* ldisk->prev->coord->id, */ /* ldisk->disk->time, */ /* ldisk->prev->disk->time, */ /* ldisk->prev->disk->time-ldisk->disk->time, */ /* ldisk->prev->disk->id, */ /* ldisk->disk->id); */ /* assert(FALSE); */ /* } */ /* return 0; */ /* } */ /* ldisk = ldisk->prev; */ /* } */ /* while(ldisk->prev); */ /* } */ disk = tree->young_disk; do { if(disk->ldsk != NULL) { for(i=0;ildsk->n_next;++i) { if(disk->ldsk->next[i]->disk->time < disk->time) { if(exit == YES) { PhyML_Printf("\n. disk->time: %f [%f] disk->ldsk->next[i]->disk->time: %f [%f]", disk->time, disk->ldsk->base_line, disk->ldsk->next[i]->disk->time, disk->ldsk->next[i]->disk->ldsk->base_line); assert(FALSE); } return(0); } } } disk = disk->prev; } while(disk); return(1); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Store_All_Geo_Coord(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-1;++i) { PHYREX_Store_Geo_Coord(tree->a_nodes[i]->ldsk->coord); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Restore_All_Geo_Coord(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-1;++i) { PHYREX_Restore_Geo_Coord(tree->a_nodes[i]->ldsk->coord); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Store_Geo_Coord(t_geo_coord *t) { int i; for(i=0;idim;i++) t->cpy->lonlat[i] = t->lonlat[i]; t->cpy->dim = t->dim; strcpy(t->cpy->id,t->id); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Restore_Geo_Coord(t_geo_coord *t) { int i; for(i=0;idim;i++) t->lonlat[i] = t->cpy->lonlat[i]; t->dim = t->cpy->dim; strcpy(t->id,t->cpy->id); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Store_All_Veloc(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-1;++i) { PHYREX_Store_Veloc(tree->a_nodes[i]->ldsk->veloc); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Restore_All_Veloc(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-1;++i) { PHYREX_Restore_Veloc(tree->a_nodes[i]->ldsk->veloc); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Store_Veloc(t_geo_veloc *v) { int i; for(i=0;idim;i++) v->cpy->deriv[i] = v->deriv[i]; v->cpy->dim = v->dim; strcpy(v->cpy->id,v->id); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Restore_Veloc(t_geo_veloc *v) { int i; for(i=0;idim;i++) v->deriv[i] = v->cpy->deriv[i]; v->dim = v->cpy->dim; strcpy(v->id,v->cpy->id); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Total_Number_Of_Floating_Disks(t_tree *tree) { t_dsk *disk; int n_disks; disk = tree->young_disk->prev; n_disks = 0; do { if(disk->age_fixed == NO) n_disks++; disk = disk->prev; } while(disk); return(n_disks); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Total_Number_Of_Intervals(t_tree *tree) { t_dsk *disk; int n_intervals; assert(!(tree->young_disk->next)); disk = tree->young_disk; n_intervals = 0; while(disk->prev) { n_intervals++; disk = disk->prev; } return(n_intervals); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Number_Of_Intervals_Range(t_dsk *young, t_dsk *old, t_tree *tree) { t_dsk *disk; int n_intervals; disk = young; n_intervals = 0; do { n_intervals++; disk = disk->prev; assert(disk); } while(disk != old); return(n_intervals); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Total_Number_Of_Hit_Disks(t_tree *tree) { t_dsk *disk; int n_hit_disks; assert(!(tree->young_disk->next)); disk = tree->young_disk; n_hit_disks = 0; while(disk) { if(disk->ldsk) n_hit_disks++; disk = disk->prev; } return(n_hit_disks); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Total_Number_Of_Single_Hit_Disks(t_tree *tree) { t_dsk *disk; int n_hit_disks; assert(!(tree->young_disk->next)); disk = tree->young_disk; n_hit_disks = 0; while(disk) { if(disk->ldsk && disk->ldsk->n_next == 1) n_hit_disks++; disk = disk->prev; } return(n_hit_disks); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Total_Number_Of_Coal_Disks(t_tree *tree) { t_dsk *disk; int n_coal_disks; assert(!(tree->young_disk->next)); disk = tree->young_disk; n_coal_disks = 0; while(disk) { if(disk->ldsk && disk->ldsk->n_next > 1) n_coal_disks++; disk = disk->prev; } return(n_coal_disks); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Log_Dunif_Rectangle_Overlap(t_ldsk *ldsk, t_dsk *disk, t_phyrex_mod *mmod) { phydbl up, down, left, rght; phydbl log_dens; log_dens = 0.0; up = MIN(disk->centr->lonlat[0] + mmod->rad, mmod->lim_up->lonlat[0]); down = MAX(disk->centr->lonlat[0] - mmod->rad, mmod->lim_do->lonlat[0]); rght = MIN(disk->centr->lonlat[1] + mmod->rad, mmod->lim_up->lonlat[1]); left = MAX(disk->centr->lonlat[1] - mmod->rad, mmod->lim_do->lonlat[1]); if(ldsk->coord->lonlat[0] < down) return UNLIKELY; if(ldsk->coord->lonlat[0] > up) return UNLIKELY; if(ldsk->coord->lonlat[1] < left) return UNLIKELY; if(ldsk->coord->lonlat[1] > rght) return UNLIKELY; log_dens = -log(up-down)-log(rght-left); return(log_dens); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Samples uniformly within a rectangle (with truncation for border) */ /* and returns the corresponding log density */ phydbl PHYREX_Runif_Rectangle_Overlap(t_ldsk *ldsk, t_dsk *disk, t_phyrex_mod *mmod) { phydbl up, down, left, rght; up = MIN(disk->centr->lonlat[0] + mmod->rad, mmod->lim_up->lonlat[0]); down = MAX(disk->centr->lonlat[0] - mmod->rad, mmod->lim_do->lonlat[0]); rght = MIN(disk->centr->lonlat[1] + mmod->rad, mmod->lim_up->lonlat[1]); left = MAX(disk->centr->lonlat[1] - mmod->rad, mmod->lim_do->lonlat[1]); ldsk->coord->lonlat[0] = Uni()*(up - down) + down; ldsk->coord->lonlat[1] = Uni()*(rght - left) + left; /* printf("\n. disk %s (%f %f) rad: %f up: %f down: %f rght: %f left: %f", */ /* disk->id, */ /* disk->centr->lonlat[0], */ /* disk->centr->lonlat[1], */ /* mmod->rad, */ /* up,down,rght,left); */ return(log(up-down)+log(rght-left)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Rnorm_Trunc(t_ldsk *ldsk, t_dsk *disk, t_phyrex_mod *mmod) { int i,err; err = NO; for(i=0;in_dim;++i) { ldsk->coord->lonlat[i] = Rnorm_Trunc(disk->centr->lonlat[i], mmod->rad, mmod->lim_do->lonlat[i], mmod->lim_up->lonlat[i],&err); assert(err != YES); } return(0.0); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Initial_Ldsk_Pos(t_tree *tree) { t_dsk *disk; int i,j; phydbl mean; disk = tree->young_disk->prev; do { if(disk->ldsk) { for(i=0;immod->n_dim;i++) { mean = 0.0; for(j=0;jldsk->n_next;j++) mean += disk->ldsk->next[j]->coord->lonlat[i]; disk->ldsk->coord->lonlat[i] = mean / (phydbl)disk->ldsk->n_next; } } disk = disk->prev; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Min_Radius(t_tree *tree) { phydbl ori_rad, min_rad; ori_rad = tree->mmod->rad; tree->mmod->rad = tree->mmod->max_rad; do { PHYREX_Lk(tree); tree->mmod->rad -= 1.0; } while(tree->mmod->c_lnL > UNLIKELY + 0.1); min_rad = tree->mmod->rad + 2.0; tree->mmod->rad = ori_rad; PHYREX_Lk(tree); return(min_rad); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Get the minimum and maximum values a ldsk can take, given the position of the disk centre */ void PHYREX_Get_Min_Max_Ldsk_Given_Disk(t_ldsk *ldsk, phydbl **min, phydbl **max, t_tree *tree) { phydbl *loc_min,*loc_max; int i; if(!ldsk->disk->next) return; loc_min = (phydbl *)mCalloc(tree->mmod->n_dim, sizeof(phydbl)); loc_max = (phydbl *)mCalloc(tree->mmod->n_dim, sizeof(phydbl)); for(i=0;immod->n_dim;i++) { loc_min[i] = ldsk->disk->centr->lonlat[i] - tree->mmod->rad; loc_max[i] = ldsk->disk->centr->lonlat[i] + tree->mmod->rad; if(ldsk->prev) { loc_min[i] = MAX(loc_min[i],ldsk->prev->disk->centr->lonlat[i] - tree->mmod->rad); loc_max[i] = MIN(loc_max[i],ldsk->prev->disk->centr->lonlat[i] + tree->mmod->rad); } loc_min[i] = MAX(tree->mmod->lim_do->lonlat[i],loc_min[i]); loc_max[i] = MIN(tree->mmod->lim_up->lonlat[i],loc_max[i]); } (*min) = loc_min; (*max) = loc_max; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Get the minimum and maximum values a disk centre can take, given the position of the ldsk */ void PHYREX_Get_Min_Max_Disk_Given_Ldsk(t_dsk *disk, phydbl **min, phydbl **max, t_tree *tree) { phydbl *loc_min,*loc_max; int i,j; phydbl tmp_min, tmp_max; if(!disk->next) return; loc_min = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); loc_max = (phydbl *)mCalloc(tree->mmod->n_dim,sizeof(phydbl)); if(!disk->ldsk || tree->mmod->model_id == SLFV_GAUSSIAN) { for(i=0;immod->n_dim;i++) { loc_min[i] = tree->mmod->lim_do->lonlat[i]; loc_max[i] = tree->mmod->lim_up->lonlat[i]; } } else { for(i=0;immod->n_dim;i++) { tmp_min = +INFINITY; tmp_max = -INFINITY; for(j=0;jldsk->n_next;j++) { if(disk->ldsk->next[j]->coord->lonlat[i] < tmp_min) tmp_min = disk->ldsk->next[j]->coord->lonlat[i]; if(disk->ldsk->next[j]->coord->lonlat[i] > tmp_max) tmp_max = disk->ldsk->next[j]->coord->lonlat[i]; } if(disk->ldsk->coord->lonlat[i] < tmp_min) tmp_min = disk->ldsk->coord->lonlat[i]; if(disk->ldsk->coord->lonlat[i] > tmp_max) tmp_max = disk->ldsk->coord->lonlat[i]; loc_min[i] = MAX(tree->mmod->lim_do->lonlat[i], tmp_max - tree->mmod->rad); loc_max[i] = MIN(tree->mmod->lim_up->lonlat[i], tmp_min + tree->mmod->rad); assert(!(loc_max[i] < loc_min[i])); } } (*min) = loc_min; (*max) = loc_max; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Disk_Ldsk_Subtree(t_ldsk *root_ldsk, t_tree *tree) { int i; for(i=0;in_next;i++) PHYREX_Update_Disk_Ldsk_Subtree_Pre(root_ldsk,root_ldsk->next[i],root_ldsk,tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Disk_Ldsk_Subtree_Pre(t_ldsk *old_ldsk, t_ldsk *young_ldsk, t_ldsk *root_ldsk, t_tree *tree) { if(!young_ldsk->disk->next) { PHYREX_One_New_Traj_Given_Disk(young_ldsk,root_ldsk,tree); return; } else { int i; PHYREX_Update_Disk_Ldsk_Subtree_Pre(young_ldsk,young_ldsk->next[0],root_ldsk,tree); if(young_ldsk->n_next > 1) { for(i=1;in_next;i++) PHYREX_Update_Disk_Ldsk_Subtree_Pre(young_ldsk,young_ldsk->next[i],young_ldsk,tree); } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Restore_Disk_Ldsk_Subtree(t_ldsk *root_ldsk, t_tree *tree) { int i; for(i=0;in_next;i++) PHYREX_Restore_Disk_Ldsk_Subtree_Pre(root_ldsk,root_ldsk->next[i],tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Restore_Disk_Ldsk_Subtree_Pre(t_ldsk *old_ldsk, t_ldsk *young_ldsk, t_tree *tree) { if(!young_ldsk->disk->next) return; else { int i; PHYREX_Restore_Geo_Coord(young_ldsk->coord); PHYREX_Restore_Geo_Coord(young_ldsk->disk->centr); for(i=0;in_next;i++) { PHYREX_Restore_Disk_Ldsk_Subtree_Pre(young_ldsk,young_ldsk->next[i],tree); } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Proposal_Disk_Ldsk_Subtree(t_ldsk *root_ldsk, phydbl *logdens, t_tree *tree) { int i; (*logdens) = 0.0; for(i=0;in_next;i++) PHYREX_Proposal_Disk_Ldsk_Subtree_Pre(root_ldsk,root_ldsk->next[i],root_ldsk,logdens,tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Proposal_Disk_Ldsk_Subtree_Pre(t_ldsk *old_ldsk, t_ldsk *young_ldsk, t_ldsk *root_ldsk, phydbl *logdens, t_tree *tree) { if(!young_ldsk->disk->next) { (*logdens) += PHYREX_Uniform_Path_Density(young_ldsk,root_ldsk,tree); return; } else { int i; for(i=0;in_next;i++) { PHYREX_Proposal_Disk_Ldsk_Subtree_Pre(young_ldsk,young_ldsk->next[i],root_ldsk,logdens,tree); } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Update the tree structure given the whole set of ldsk events */ /* Coalescent events involving multiple lineages are resolved using */ /* very short internal edges. Tip nodes in the tree are always connected */ /* to the corresponding ldsks. */ void PHYREX_Ldsk_To_Tree(t_tree *tree) { int i,j; t_dsk *disk; t_ldsk *root_ldsk; /* Reset */ for(i=0;i<2*tree->n_otu-1;++i) { for(j=0;j<3;++j) { tree->a_nodes[i]->v[j] = NULL; tree->a_nodes[i]->b[j] = NULL; } } // Erase all connections to internal nodes disk = tree->young_disk; do { if(disk->ldsk) { disk->ldsk->nd = NULL; assert(disk->age_fixed == NO); } disk = disk->prev; } while(disk->prev); // Make sure oldest disk has a ldsk on it assert(disk->ldsk); root_ldsk = disk->ldsk; if(tree->n_root == NULL) tree->n_root = tree->a_nodes[2*tree->n_otu-2]; assert(tree->n_root); i = 2*tree->n_otu-3; tree->num_curr_branch_available = 0; PHYREX_Ldsk_To_Tree_Post(tree->n_root,root_ldsk,&i,tree); for(i=0;in_otu;++i) assert(tree->a_nodes[i]->v[0]); for(i=0;i<3;++i) if(tree->n_root->v[1]->v[i] == tree->n_root) { tree->n_root->v[1]->v[i] = tree->n_root->v[2]; break; } for(i=0;i<3;++i) if(tree->n_root->v[2]->v[i] == tree->n_root) { tree->n_root->v[2]->v[i] = tree->n_root->v[1]; break; } Connect_Edges_To_Nodes_Serial(tree); tree->e_root = NULL; for(i=0;i<2*tree->n_otu-3;++i) { if((tree->a_edges[i]->left == tree->n_root->v[1] && tree->a_edges[i]->rght == tree->n_root->v[2]) || (tree->a_edges[i]->left == tree->n_root->v[2] && tree->a_edges[i]->rght == tree->n_root->v[1])) { tree->e_root = tree->a_edges[i]; break; } } assert(!(tree->e_root == NULL)); tree->n_root->b[1] = tree->a_edges[2*tree->n_otu-3]; tree->n_root->b[2] = tree->a_edges[2*tree->n_otu-2]; tree->n_root->b[1]->left = tree->n_root; tree->n_root->b[1]->rght = tree->n_root->v[1]; tree->n_root->b[2]->left = tree->n_root; tree->n_root->b[2]->rght = tree->n_root->v[2]; Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); MIXT_Propagate_Tree_Update(tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Ldsk_To_Tree_Post(t_node *a, t_ldsk *ldsk, int *available, t_tree *tree) { assert(ldsk); assert(a); ldsk->nd = a; a->ldsk = ldsk; tree->times->nd_t[a->num] = ldsk->disk->time; if(!ldsk->next) return; // Tip node else { t_node *parent,*son; int idx_next; t_ldsk *t; parent = a; parent->v[1] = NULL; parent->v[2] = NULL; idx_next = 0; do { t = ldsk->next[idx_next]; // Descend along that lineage as long as // one has not reached a tip (t->next == NULL) // or a coalescent event (t->n_next > 1) while(t->next && t->n_next <= 1) t = t->next[0]; if(t->nd == NULL) // t->disk is not a sampled disk { assert(t->disk->age_fixed == NO); son = tree->a_nodes[*available]; (*available) = (*available)-1; } else { assert(t->disk->age_fixed == YES); son = t->nd; } PHYREX_Ldsk_To_Tree_Post(son,t,available,tree); // Resolve multifurcation if(parent->v[2] != NULL && idx_next >= 2) { t_node *new_parent; new_parent = tree->a_nodes[*available]; new_parent->ldsk = ldsk; (*available) = (*available)-1; new_parent->v[0] = parent; new_parent->v[1] = parent->v[2]; new_parent->v[2] = son; parent->v[2] = new_parent; son->v[0] = new_parent; new_parent->v[1]->v[0] = new_parent; /* PhyML_Printf("\n[] connect %d to %d",parent->num,new_parent->num); */ /* PhyML_Printf("\n[] connect %d to %d",new_parent->num,new_parent->v[1]->num); */ /* PhyML_Printf("\n[] connect %d to %d",new_parent->num,new_parent->v[2]->num); */ tree->times->nd_t[new_parent->num] = ldsk->disk->time; parent = new_parent; } else { son->v[0] = parent; if(!parent->v[1]) parent->v[1] = son; else parent->v[2] = son; /* printf("\n[] connect %d to %d",parent->num,son->num); */ } idx_next++; } while(idx_next != ldsk->n_next); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Make sure PHYREX_Make_And_Connect_Tip_Disks was called beforehand void PHYREX_Tree_To_Ldsk(t_tree *tree) { t_dsk *a_disk,*disk; t_node *n; assert(tree->n_root); assert(tree->young_disk); // Initialise root disk a_disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(a_disk,tree->mmod->n_dim,NULL); a_disk->prev = NULL; // last (i.e., oldest) disk a_disk->ldsk = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(a_disk->ldsk,a_disk,tree->mmod->n_dim); tree->n_root->ldsk = a_disk->ldsk; a_disk->ldsk->nd = tree->n_root; // Initialize centre of event on the root disk a_disk->centr->lonlat[0] = Uni()*(tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0])+tree->mmod->lim_do->lonlat[0]; a_disk->centr->lonlat[1] = Uni()*(tree->mmod->lim_up->lonlat[1]-tree->mmod->lim_do->lonlat[1])+tree->mmod->lim_do->lonlat[1]; /* Its location */ switch(tree->mmod->model_id) { case SLFV_UNIFORM: { PHYREX_Runif_Rectangle_Overlap(a_disk->ldsk,a_disk,tree->mmod); break; } case SLFV_GAUSSIAN : { PHYREX_Rnorm_Trunc(a_disk->ldsk,a_disk,tree->mmod); break; } default : { PHYREX_Rnorm_Trunc(a_disk->ldsk,a_disk,tree->mmod); break; } } a_disk->ldsk->nd = tree->n_root; a_disk->time = tree->times->nd_t[tree->n_root->num]; /* Inflate_Times_To_Get_Reasonnable_Edge_Lengths(1.E-3,tree); */ Get_Node_Ranks_From_Times(tree); PHYREX_Tree_To_Ldsk_Post(tree->n_root,tree->n_root->v[1],a_disk,tree); PHYREX_Tree_To_Ldsk_Post(tree->n_root,tree->n_root->v[2],a_disk,tree); // Create a doubly-chained list of disks disk = a_disk; disk->time = tree->times->nd_t[tree->n_root->num]; n = tree->n_root; while(n->rk_next) { // Only jump to next disk if n and n->rk_next are on distinct disks // If n->ldsk == n->rk_next->ldsk then n->ldsk->disk and n->rk_next->ldsk->disk // are the same disk (multiple merger) if((n->ldsk->disk != n->rk_next->ldsk->disk) && (n->ldsk != n->rk_next->ldsk)) { disk->next = n->rk_next->ldsk->disk; disk->next->prev = disk; disk->next->time = tree->times->nd_t[n->rk_next->num]; disk = disk->next; } n = n->rk_next; } // Fill in ldsk_a arrays throughout the tree PHYREX_Update_Lindisk_List(tree); assert(tree->young_disk->prev); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Tree_To_Ldsk_Post(t_node *a, t_node *d, t_dsk *a_disk, t_tree *tree) { int i; assert(a); assert(d); assert(a_disk); if(d->tax) { assert(d->ldsk); PHYREX_Make_Lindisk_Next(a_disk->ldsk); d->ldsk->prev = a_disk->ldsk; a_disk->ldsk->next[a_disk->ldsk->n_next-1] = d->ldsk; a_disk->ldsk->next[a_disk->ldsk->n_next-1]->nd = d; return; } else { /* if(tree->times->nd_t[d->num] > tree->times->nd_t[a->num]) */ { t_dsk *d_disk; PHYREX_Make_Lindisk_Next(a_disk->ldsk); // Make and initialize descendent disk d_disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); assert(d_disk); PHYREX_Init_Disk_Event(d_disk,tree->mmod->n_dim,NULL); d_disk->time = tree->times->nd_t[d->num]; d_disk->ldsk = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(d_disk->ldsk,d_disk,tree->mmod->n_dim); // Initialize centre of event on the root disk d_disk->centr->lonlat[0] = Uni()*(tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0])+tree->mmod->lim_do->lonlat[0]; d_disk->centr->lonlat[1] = Uni()*(tree->mmod->lim_up->lonlat[1]-tree->mmod->lim_do->lonlat[1])+tree->mmod->lim_do->lonlat[1]; /* Its location */ switch(tree->mmod->model_id) { case SLFV_UNIFORM: { PHYREX_Runif_Rectangle_Overlap(d_disk->ldsk,d_disk,tree->mmod); break; } case SLFV_GAUSSIAN: { PHYREX_Rnorm_Trunc(d_disk->ldsk,d_disk,tree->mmod); break; } default : { PHYREX_Rnorm_Trunc(d_disk->ldsk,d_disk,tree->mmod); break; } } d_disk->ldsk->nd = d; d->ldsk = d_disk->ldsk; a_disk->ldsk->next[a_disk->ldsk->n_next-1] = d_disk->ldsk; d_disk->ldsk->prev = a_disk->ldsk; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { PHYREX_Tree_To_Ldsk_Post(d,d->v[i],d_disk,tree); } } } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Simulate_Disk_And_Node_Times(t_tree *tree) { t_dsk *disk; disk = tree->young_disk; assert(disk->age_fixed == YES); // age of youngest disk should be fixed do { // disk->prev is not a sample --> simulate its age by sampling in exp distribution if(disk->prev->age_fixed == NO) { disk->prev->time = disk->time - Rexp(tree->mmod->lbda); // set time of internal node sitting on disk->prev if(disk->prev->ldsk != NULL) tree->times->nd_t[disk->prev->ldsk->nd->num] = disk->prev->time; } PhyML_Printf("\n. Simulate times disk %s time: %f",disk->id,disk->time); disk = disk->prev; } while(disk->prev); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Connections between tip nodes and corresponding ldsks (plus the // associated disks) should be made early on and never modified // after that. void PHYREX_Make_And_Connect_Tip_Disks(t_tree *tree) { t_dsk *disk,*new_disk; t_node *n; Get_Node_Ranks_From_Tip_Times(tree); // Find most recent tip n = tree->a_nodes[0]; while(n->rk_next) n = n->rk_next; // Create most recent disk assert(tree->mmod); disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(disk,tree->mmod->n_dim,NULL); disk->age_fixed = YES; // Sample disks have their ages fixed disk->time = tree->times->nd_t[n->num]; // Set time of youngest disk PhyML_Fprintf(stdout,"\n. Youngest sampled disk time set to %f (disk id: %s)",disk->time,disk->id); // ldsk_a[0] is connected to youngest tip disk->ldsk_a[0] = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(disk->ldsk_a[0],disk,tree->mmod->n_dim); disk->n_ldsk_a = 1; disk->ldsk_a[0]->nd = n; n->ldsk = disk->ldsk_a[0]; n->ldsk->disk = disk; // Set pointer to young_disk here and not elsewhere! tree->young_disk = disk; new_disk = NULL; do { assert(n->rk_prev); // n and n->rk_prev have distinct time stamps -> they should be on two distinct disks if(Are_Equal(tree->times->nd_t[n->num],tree->times->nd_t[n->rk_prev->num],SMALL) == NO) { new_disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(new_disk,tree->mmod->n_dim,NULL); new_disk->age_fixed = YES; new_disk->ldsk_a[0] = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(new_disk->ldsk_a[0],new_disk,tree->mmod->n_dim); new_disk->ldsk_a[0]->nd = n->rk_prev; new_disk->ldsk_a[0]->disk = new_disk; new_disk->n_ldsk_a = 1; new_disk->next = disk; disk->prev = new_disk; disk = new_disk; } // n and n->rk_prev have the same time stamp -> they sit on the same disk else { disk->ldsk_a[disk->n_ldsk_a] = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(disk->ldsk_a[disk->n_ldsk_a],disk,tree->mmod->n_dim); disk->ldsk_a[disk->n_ldsk_a]->nd = n->rk_prev; disk->ldsk_a[disk->n_ldsk_a]->disk = disk; disk->n_ldsk_a++; } // Set sampled disk time disk->time = tree->times->nd_t[n->rk_prev->num]; PhyML_Fprintf(stdout,"\n. Set sampled disk (id: %s) time to %15f",disk->id,disk->time); n->rk_prev->ldsk = disk->ldsk_a[disk->n_ldsk_a-1]; n = n->rk_prev; } while(n->rk_prev); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Remove_Lindisk_Next(t_ldsk *ldsk, t_ldsk *rm) { t_ldsk **new_next; int i,pos; new_next = (t_ldsk **)mCalloc(ldsk->n_next-1+NEXT_BLOCK_SIZE,sizeof(t_ldsk *)); pos = 0; for(i=0;in_next;i++) { if(ldsk->next[i] != rm) { new_next[pos] = ldsk->next[i]; pos++; } } ldsk->n_next--; Free(ldsk->next); ldsk->next = new_next; /* printf("\n. remove next for ldsk %s n_next set to %d",ldsk->coord->id,ldsk->n_next); */ /* fflush(NULL); */ } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Returns the vector of average pairwise distances between ldsk on each disk */ phydbl *PHYREX_Mean_Pairwise_Distance_Between_Lineage_Locations(t_tree *tree) { phydbl *dist; int block,n_disks,i,j, k; t_dsk *disk; PHYREX_Update_Lindisk_List(tree); dist = NULL; block = 100; disk = tree->young_disk; n_disks = 0; do { if(!n_disks) dist = (phydbl *)mCalloc(block,sizeof(phydbl)); else if(!((n_disks+1)%block)) dist = (phydbl *)mRealloc(dist,n_disks+block,sizeof(phydbl)); dist[n_disks] = 0.0; for(i=0;in_ldsk_a-1;i++) { for(j=i+1;jn_ldsk_a;j++) { for(k=0;kmmod->n_dim;k++) { dist[n_disks] += FABS(disk->ldsk_a[i]->coord->lonlat[k] - disk->ldsk_a[j]->coord->lonlat[k]); printf("\n * %d %f %f %f", k, disk->ldsk_a[i]->coord->lonlat[k], disk->ldsk_a[j]->coord->lonlat[k], tree->mmod->lim_up->lonlat[k]); } } } dist[n_disks] /= (phydbl)(disk->n_ldsk_a * (disk->n_ldsk_a-1) / 2.); printf("\n %d %f %f",disk->n_ldsk_a,disk->time,dist[n_disks]); n_disks++; disk = disk->prev; } while(disk->prev); return(dist); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Random_Select_Time_Between_Jumps(t_tree *tree) { t_dsk *disk,**valid_disks; int n_valid_disks,block,select; phydbl time; valid_disks = NULL; disk = NULL; block = 100; assert(!(tree->young_disk->next)); disk = tree->young_disk->prev; n_valid_disks = 0; do { if(disk->ldsk != NULL && disk->prev != NULL) { if(!n_valid_disks) valid_disks = (t_dsk **)mCalloc(block,sizeof(t_dsk *)); else if(!((n_valid_disks+1)%block)) valid_disks = (t_dsk **)mRealloc(valid_disks,n_valid_disks+block,sizeof(t_dsk *)); valid_disks[n_valid_disks] = disk; n_valid_disks++; } disk = disk->prev; } while(disk->prev); if(!n_valid_disks) return -1.0; select = Rand_Int(0,n_valid_disks-1); time = valid_disks[select]->time - valid_disks[select]->ldsk->prev->disk->time; Free(valid_disks); return(time); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Is_In_Ldscape(t_ldsk *ldsk, t_phyrex_mod *mmod) { int j; for(j=0;jn_dim;j++) if(ldsk->coord->lonlat[j] > mmod->lim_up->lonlat[j] || ldsk->coord->lonlat[j] < mmod->lim_do->lonlat[j]) return NO; return YES; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Mean_Time_Between_Events(t_tree *tree) { int n_inter; phydbl T; n_inter = PHYREX_Total_Number_Of_Intervals(tree); T = -tree->times->nd_t[tree->n_root->num]; return((phydbl)(T/n_inter)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Rand_Pairs_Coal_Times_Dist(t_tree *tree) { t_node *anc; phydbl dist; int i,j,ij_dist; i = Rand_Int(0,tree->n_otu-1); j = Rand_Int(0,tree->n_otu-1); ij_dist = 0; if(i == j) PhyML_Printf("\nxxWxx 0.0 0.0"); else { anc = Find_Lca_Pair_Of_Nodes(tree->a_nodes[i],tree->a_nodes[j],&ij_dist,tree); if(anc == NULL) { PhyML_Fprintf(stderr,"\n. %s",Write_Tree(tree)); PhyML_Fprintf(stderr,"\n. %s %s",tree->a_nodes[i]->name,tree->a_nodes[j]->name); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } PhyML_Printf("\nxxWxx %12f",tree->times->nd_t[anc->num]); dist = Euclidean_Distance(tree->a_nodes[i]->ldsk->coord,tree->a_nodes[j]->ldsk->coord); PhyML_Printf(" %f",dist); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Read_Tip_Coordinates(t_tree *tree) { char *s; FILE *fp; int i,*done,found_sw,found_ne; phydbl sw_lon, sw_lat, ne_lon, ne_lat; t_node *n; assert(tree->young_disk); s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); fp = tree->io->fp_in_coord; done = (int *)mCalloc(tree->n_otu,sizeof(int)); sw_lon = sw_lat = 0.0; ne_lon = ne_lat = 1.0; rewind(fp); found_sw = NO; found_ne = NO; for(i=0;in_otu;i++) done[i] = NO; do { if(fscanf(fp,"%s",s) == EOF) break; for(i=0;in_otu;i++) if(!strcmp(tree->a_nodes[i]->name,s)) break; if(i != tree->n_otu) /* Found a match */ { assert(tree->a_nodes[i]->ldsk); // First column: latitude, second one: longitude if(fscanf(fp,"%lf",&(tree->a_nodes[i]->ldsk->coord->lonlat[1])) == EOF) break; if(fscanf(fp,"%lf",&(tree->a_nodes[i]->ldsk->coord->lonlat[0])) == EOF) break; done[i] = YES; } else { if(!strcmp(s,"|SouthWest|") || !strcmp(s,"|southwest|") || !strcmp(s,"|Southwest|")) { found_sw = YES; if(fscanf(fp,"%lf",&(sw_lat)) == EOF) break; if(fscanf(fp,"%lf",&(sw_lon)) == EOF) break; } else if(!strcmp(s,"|NorthEast|") || !strcmp(s,"|northeast|") || !strcmp(s,"|Northeast|")) { found_ne = YES; if(fscanf(fp,"%lf",&(ne_lat)) == EOF) break; if(fscanf(fp,"%lf",&(ne_lon)) == EOF) break; } } } while(1); if(found_ne == NO && (tree->mmod->model_id == SLFV_UNIFORM || tree->mmod->model_id == SLFV_GAUSSIAN)) { PhyML_Fprintf(stderr,"\n. Could not find coordinates for northernmost point."); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } if(found_sw == NO && (tree->mmod->model_id == SLFV_UNIFORM || tree->mmod->model_id == SLFV_GAUSSIAN)) { PhyML_Fprintf(stderr,"\n. Could not find coordinates for southernmost point."); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } for(i=0;in_otu;i++) if(done[i] == NO) { PhyML_Fprintf(stderr,"\n. Could not find coordinates for '%s'.",tree->a_nodes[i]->name); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } n = NULL; for(i=0;in_otu;i++) { n = tree->a_nodes[i]; PhyML_Printf("\n. Coordinates of '%-50s': %12f\t %12f", tree->a_nodes[i]->name, n->ldsk->coord->lonlat[0], n->ldsk->coord->lonlat[1]); } tree->mmod->lim_up->lonlat[0] = ne_lon; tree->mmod->lim_up->lonlat[1] = ne_lat; tree->mmod->lim_do->lonlat[0] = sw_lon; tree->mmod->lim_do->lonlat[1] = sw_lat; Free(s); Free(done); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Tree_Height(t_tree *tree) { t_dsk *disk; disk = tree->young_disk; while(disk && disk->prev) disk = disk->prev; return(disk->time); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Random_Insert_Ldsk_In_Next_List(t_ldsk *ins, t_ldsk *where) { int size, pos, i, *rk; t_ldsk **next_cpy; size = where->n_next; rk = (int *)mCalloc(size,sizeof(int)); next_cpy = (t_ldsk **)mCalloc(size,sizeof(t_ldsk *)); for(i=0;inext[i]; pos = Rand_Int(0,size); for(i=0;inext[rk[i]] = next_cpy[i]; where->next[pos]= ins; Free(rk); Free(next_cpy); return pos; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Insert_Ldsk_In_Next_List(t_ldsk *ins, int pos, t_ldsk *where) { int size, i, *rk; t_ldsk **next_cpy; size = where->n_next; rk = (int *)mCalloc(size,sizeof(int)); next_cpy = (t_ldsk **)mCalloc(size,sizeof(t_ldsk *)); for(i=0;inext[i]; for(i=0;inext[rk[i]] = next_cpy[i]; where->next[pos]= ins; Free(rk); Free(next_cpy); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Remove path between young ldsk and old ldsk. If young->prev == old, */ /* then young->prev set to NULL and old->next[dir_to_young] set */ /* to NULL as well. */ t_ldsk *PHYREX_Remove_Path(t_ldsk *young, t_ldsk *old, int *pos_old, t_tree *tree) { t_ldsk *path,*ldsk; int dir_old_young,jumps; path = NULL; dir_old_young = PHYREX_Get_Next_Direction(young,old); assert(dir_old_young >= 0); *pos_old = dir_old_young; PHYREX_Remove_Lindisk_Next(old,old->next[dir_old_young]); jumps = 1; ldsk = young->prev; while(ldsk != old) { if(jumps == 1) path = ldsk; PHYREX_Remove_Disk(ldsk->disk); ldsk = ldsk->prev; jumps++; } if(jumps == 1) path = NULL; else { /* Set end of path to NULL */ ldsk = path; while(ldsk->prev != old) { ldsk = ldsk->prev; assert(ldsk); } ldsk->prev = NULL; } /* path == NULL if young->prev = old, otherwise path points to the first ldsk */ /* after jump away from young towards the past (i.e., towards old) */ return(path); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Insert_Path(t_ldsk *young, t_ldsk *old, t_ldsk *path, int pos, t_tree *tree) { t_ldsk *ldsk; assert(path != young); if(path == NULL) { young->prev = old; PHYREX_Insert_Ldsk_In_Next_List(young,pos,old); } else { /* Attach path to the young ldsk */ path->next[0] = young; young->prev = path; ldsk = path; do { PHYREX_Insert_Disk(ldsk->disk,tree); ldsk = ldsk->prev; } while(ldsk); /* Get to the end of path */ ldsk = path; while(ldsk->prev != NULL) { ldsk = ldsk->prev; assert(ldsk); } /* Attach it to old ldsk (both ways)*/ PHYREX_Insert_Ldsk_In_Next_List(ldsk,pos,old); ldsk->prev = old; } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Time_Tree_Length(t_tree *tree) { phydbl len; int i; t_dsk *disk; disk = tree->young_disk; while(disk->prev) disk = disk->prev; len = 0.0; for(i=0;ildsk->n_next;i++) PHYREX_Time_Tree_Length_Pre(disk->ldsk,disk->ldsk->next[i],&len,tree); assert(!(isnan(len) || isinf(len))); return(len); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Time_Tree_Length_Pre(t_ldsk *a, t_ldsk *d, phydbl *len, t_tree *tree) { int i; (*len) += FABS(a->disk->time - d->disk->time); if(d->disk->next == NULL) return; else for(i=0;in_next;i++) PHYREX_Time_Tree_Length_Pre(d,d->next[i],len,tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Is_On_Path(t_ldsk *target, t_ldsk *young, t_ldsk *old) { t_ldsk *ldsk; if(target == young || target == old) return YES; assert(!(young->disk->time < old->disk->time)); ldsk = young->prev; while(ldsk != old) { if(ldsk == target) return YES; ldsk = ldsk->prev; assert(!(ldsk == NULL)); } return NO; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Path_Len(t_ldsk *young, t_ldsk *old) { t_ldsk *ldsk; int len; len = 0; ldsk = young; while(ldsk != old) { len++; ldsk = ldsk->prev; } len++; return len; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Print_Disk_Lk(t_tree *tree) { t_dsk *disk; PHYREX_Update_Lindisk_List(tree); disk = tree->young_disk->prev; do { PhyML_Printf("\n. Disk: %s time: %12f lk: %12f cumlk: %12f", disk->id, disk->time, PHYREX_Lk_Core(disk,tree), -1.); disk = disk->prev; } while(disk->prev); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Print_Disk(t_tree *tree) { t_dsk *disk; disk = tree->n_root->ldsk->disk; do { PhyML_Printf("\n. Disk: %s time: %12f %2d", disk->id, disk->time, disk->age_fixed ? 1 : 0); disk = disk->next; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_ldsk *PHYREX_Find_Lca_Pair_Of_Ldsk(t_ldsk *n1, t_ldsk *n2, t_tree *tree) { t_ldsk **list1, **list2, *lca; int len1, len2; assert(n1); assert(n2); if(n1 == n2) return(n1); PHYREX_Get_List_Of_Ancestors(n1,&list1,&len1,tree); PHYREX_Get_List_Of_Ancestors(n2,&list2,&len2,tree); len1 = len1-1; len2 = len2-1; assert(list1[len1] == list2[len2]); do { if((len1 < 0 || len2 < 0) || (list1[len1] != list2[len2])) break; len1--; len2--; } while(len1 && len2); lca = list1[len1+1]; Free(list1); Free(list2); assert(lca); return(lca); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Get_List_Of_Ancestors(t_ldsk *start, t_ldsk ***list, int *len, t_tree *tree) { int block,i; t_ldsk *ldsk; assert(start); block = 100; *list = (t_ldsk **)mCalloc(block,sizeof(t_ldsk *)); ldsk = start; i = 0; do { (*list)[i] = ldsk; if(!((i+1)%block)) *list = (t_ldsk **)mRealloc(*list,i+block,sizeof(t_ldsk *)); i++; ldsk = ldsk->prev; } while(ldsk); (*len) = i; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Dist_To_Lca(t_ldsk *d, t_ldsk *lca) { return(fabs(d->disk->time - lca->disk->time)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Dist_Between_Two_Ldsk(t_ldsk *n1, t_ldsk *n2, t_tree *tree) { t_ldsk *lca; lca = PHYREX_Find_Lca_Pair_Of_Ldsk(n1,n2,tree); return(PHYREX_Dist_To_Lca(n1,lca)+PHYREX_Dist_To_Lca(n2,lca)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Number_Of_Sampled_Demes(t_tree *tree) { int i,j,n_demes; t_dsk *disk; char **deme_list; deme_list = (char **)mCalloc(tree->n_otu,sizeof(char *)); disk = tree->young_disk; n_demes = 0; for(i=0;in_otu;i++) { for(j=0;jldsk_a[i]->coord->id,"_deme"),deme_list[j])) { break; } } if(j == n_demes) { deme_list[j] = strstr(disk->ldsk_a[i]->coord->id,"_deme"); /* printf("\n. deme_list[%d]: %s",j,deme_list[j]); */ n_demes++; } } Free(deme_list); return(n_demes); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Returns the number of ldsks going from disk towards the past */ int PHYREX_Number_Of_Outgoing_Ldsks(t_dsk *disk) { int i; if(disk->ldsk == NULL) return disk->n_ldsk_a; else { int n_out; n_out = 0; for(i=0;in_ldsk_a;++i) { if(disk->ldsk_a[i] && disk->ldsk_a[i]->prev != disk->ldsk) { n_out++; } } return(n_out+1); /* +1 so as to count disk->ldsk in */ } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Select uniformly at random a lineage going "out of" disk (towards the past) */ t_ldsk *PHYREX_Random_Select_Outgoing_Ldsk(t_dsk *disk) { int i,*permut,n_ldsk_a_out; t_ldsk **ldsk_a_out,*target_ldsk; ldsk_a_out = (t_ldsk **)mCalloc(disk->n_ldsk_a,sizeof(t_ldsk *)); n_ldsk_a_out = 0; if(disk->ldsk != NULL) { ldsk_a_out[0] = disk->ldsk; n_ldsk_a_out = 1; } for(i=0;in_ldsk_a;++i) { if(disk->ldsk_a[i] && disk->ldsk_a[i]->prev != disk->ldsk) { ldsk_a_out[n_ldsk_a_out] = disk->ldsk_a[i]; n_ldsk_a_out++; } } permut = Permutate(n_ldsk_a_out); target_ldsk = ldsk_a_out[permut[0]]; Free(permut); Free(ldsk_a_out); return(target_ldsk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Remove and free all disks and ldsks except for sampled disks. Connect the sampled disks together */ void PHYREX_Strip_And_Reconnect_Tree(t_tree *tree) { t_dsk *disk,*prev; int i,orig_size; disk = tree->young_disk; do { if(disk->age_fixed == YES) { orig_size = disk->n_ldsk_a; for(i=0;ildsk_a[i] && disk->ldsk_a[i]->disk != disk) { disk->ldsk_a[i] = NULL; disk->n_ldsk_a--; } } for(i=0;in_ldsk_a;++i) disk->ldsk_a[i]->prev = NULL; } disk = disk->prev; } while(disk); disk = tree->young_disk; do { prev = disk->prev; if(disk->age_fixed == NO) { PHYREX_Remove_Disk(disk); PHYREX_Free_Ldisk(disk->ldsk); PHYREX_Free_Disk(disk); } disk = prev; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Get_Baseline_Times(t_ldsk *ldsk, t_tree *tree) { if(ldsk->next == NULL) { ldsk->base_line = ldsk->disk->time; return(ldsk->disk->time); } else { phydbl base_line, min_base_line; base_line = +INFINITY; min_base_line = +INFINITY; for(int i=0;in_next;++i) { base_line = PHYREX_Get_Baseline_Times(ldsk->next[i],tree); if(base_line < min_base_line) min_base_line = base_line; } ldsk->base_line = min_base_line; return(min_base_line); } return(+INFINITY); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int PHYREX_Scale_All(phydbl scale, t_dsk *start_disk, t_tree *tree) { t_dsk *disk; int n_disks_scaled,n_nodes_scaled,n_hits_scaled,i,n_samp_disks; t_dsk **samp_disks_a; n_disks_scaled = 0; n_nodes_scaled = 0; n_hits_scaled = 0; n_samp_disks = 0; samp_disks_a = NULL; disk = start_disk->prev; assert(disk); disk = start_disk->prev; do { if(disk->age_fixed == NO) { n_disks_scaled++; if(disk->ldsk && disk->ldsk->n_next > 1) n_nodes_scaled++; if(disk->ldsk && disk->ldsk->n_next == 1) n_hits_scaled++; } else { n_samp_disks++; } disk = disk->prev; } while(disk); samp_disks_a = (t_dsk **)mCalloc(n_samp_disks,sizeof(t_dsk *)); i = 0; disk = start_disk->prev; do { if(disk->age_fixed == YES) { samp_disks_a[i] = disk; i++; } disk = disk->prev; } while(disk); disk = start_disk->prev; do { if(disk->age_fixed == NO) { disk->time = disk->time * scale + start_disk->time * (1.-scale); } disk = disk->prev; } while(disk); for(i=0;immod->model_id == SLFV_GAUSSIAN || tree->mmod->model_id == SLFV_UNIFORM) return(n_disks_scaled); else { if(tree->times->model_id == COALESCENT) { if(tree->times->augmented_coalescent == NO) return(n_nodes_scaled); else return(n_hits_scaled + n_nodes_scaled); } } return(-1); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_dsk *PHYREX_Next_Floating_Disk(t_dsk *disk) { t_dsk *next; next = disk->next; while(next) { if(next->age_fixed == NO) return(next); next = next->next; } return(NULL); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // For a given ldsk, its age cannot be younger than the age of its baseline disk. // The time of the baseline is the age of the oldest tip that descends from the // node under scrutiny. void PHYREX_Get_Baselines(t_tree *tree) { PHYREX_Get_Baselines_Post(tree->n_root->ldsk,tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Get_Baselines_Post(t_ldsk *ldsk, t_tree *tree) { if(ldsk->next == NULL) ldsk->baseline = ldsk->disk; else { phydbl min_t; int i,min_idx; min_t = +INFINITY; min_idx = -1; for(i=0;in_next;++i) PHYREX_Get_Baselines_Post(ldsk->next[i],tree); for(i=0;in_next;++i) { if(ldsk->next[i]->baseline->time < min_t) { min_t = ldsk->next[i]->baseline->time; min_idx = i; } ldsk->baseline = ldsk->next[min_idx]->baseline; assert(ldsk->baseline->time > ldsk->disk->time); } } return; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Oldest_Sampled_Disk(t_tree *tree) { t_dsk *disk; disk = tree->young_disk; do { if(disk->age_fixed == YES) tree->old_samp_disk = disk; disk = disk->prev; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Time_Of_Descendants(t_ldsk *ldsk, t_tree *tree) { if(ldsk->disk->age_fixed == YES || ldsk->disk == tree->young_disk) return ldsk->disk->time; else { int i; phydbl t,min; min = tree->young_disk->time; for(i=0;in_next;++i) { t = PHYREX_Time_Of_Descendants(ldsk->next[i],tree); if(t < min) min = t; } return(min); } return(1.); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Time_Of_Prev_Sampled_Disk(t_dsk *disk, t_tree *tree) { if(disk->prev == NULL) return -INFINITY; else { disk = disk->prev; while(disk && disk->age_fixed == NO) disk = disk->prev; if(!disk) return -INFINITY; else return(disk->time); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Time_Of_Next_Sampled_Disk(t_dsk *disk, t_tree *tree) { if(disk->next == NULL) return tree->young_disk->time; else { disk = disk->next; while(disk && disk->age_fixed == NO) disk = disk->next; if(!disk) return tree->young_disk->time; else return(disk->time); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_ldsk *PHYREX_Find_Ldsk_From_Id(char *id, t_ldsk *root) { t_ldsk *ldsk; ldsk = NULL; if(!strcmp(root->coord->id,id)) return(root); if(root->n_next == 0) return(NULL); for(int i=0;in_next;++i) { ldsk = PHYREX_Find_Ldsk_From_Id(id,root->next[i]); if(ldsk != NULL) break; } return(ldsk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_geo_coord *PHYREX_Mean_Next_Loc(t_ldsk *ldsk, t_tree *tree) { t_geo_coord *mean; int i,j; mean = GEO_Make_Geo_Coord(tree->mmod->n_dim); GEO_Init_Coord(mean,tree->mmod->n_dim); assert(ldsk->n_next > 0); for(i=0;in_next;++i) { for(j=0;jmmod->n_dim;++j) { mean->lonlat[j] += ldsk->next[i]->coord->lonlat[j]; } } for(j=0;jmmod->n_dim;++j) { mean->lonlat[j] /= (phydbl)ldsk->n_next; } return(mean); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // realized sigsq = (1/d) E(\sum_x D_x^2), where $D_x$ is the // square euclidean distance along the x-axis between the // location of a lineage at time $t$ and time $t+1$. phydbl PHYREX_Root_To_Tip_Realized_Sigsq(t_tree *tree) { t_dsk *disk,*root_disk; int i; phydbl res,*sigsq; phydbl t_root, t_tip; sigsq = (phydbl *)mCalloc(tree->young_disk->n_ldsk_a,sizeof(phydbl)); disk = tree->young_disk; while(disk->prev) disk = disk->prev; root_disk = disk; t_root = root_disk->time; t_tip = tree->young_disk->time; assert(t_tip - t_root > 0.0); disk = tree->young_disk; for(i=0;in_ldsk_a;++i) sigsq[i] = pow(Euclidean_Distance(root_disk->ldsk->coord,disk->ldsk_a[i]->coord) / (t_tip - t_root),2); res = Quantile(sigsq,disk->n_ldsk_a,0.5); Free(sigsq); return(res/tree->mmod->n_dim); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Sum of displacements as derived from the comparison between coordinates at the two ends of each branch */ phydbl PHYREX_Realized_Displacement_Dist(short int dist_type, t_tree *tree) { int i; phydbl disp; if (RRW_Is_Rw(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) RRW_Sample_Node_Locations_Joint(tree); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) VELOC_Sample_Node_Locations_Joint(tree); disp = 0.0; for(i=0;i<2*tree->n_otu-1;++i) { if(tree->a_nodes[i] != tree->n_root) { switch(dist_type) { case HAVERSINE : { disp += Haversine_Distance(tree->a_nodes[i]->anc->ldsk->coord,tree->a_nodes[i]->ldsk->coord); break; } case MANHATTAN : { disp += Manhattan_Distance(tree->a_nodes[i]->anc->ldsk->coord,tree->a_nodes[i]->ldsk->coord); break; } case EUCLIDEAN : { disp += Euclidean_Distance(tree->a_nodes[i]->anc->ldsk->coord,tree->a_nodes[i]->ldsk->coord); break; } default : assert(false); } } } return(disp); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Sum of actual distances travelled between the two ends of each branch. May differ from dispersal distance when "jumps" take place along edges, such as with the SLFV model */ phydbl PHYREX_Realized_Dispersal_Dist(short int dist_type, t_tree *tree) { t_dsk *disk,*root_disk; phydbl dist; int i; if (RRW_Is_Rw(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) RRW_Sample_Node_Locations_Joint(tree); if (VELOC_Is_Integrated_Velocity(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) VELOC_Sample_Node_Locations_Joint(tree); disk = tree->young_disk; while(disk->prev) disk = disk->prev; root_disk = disk; dist = 0.0; disk = root_disk; do { if(disk->ldsk != NULL) { for(i=0;ildsk->n_next;++i) { switch(dist_type) { case HAVERSINE : { dist += Haversine_Distance(disk->ldsk->coord,disk->ldsk->next[i]->coord); break; } case MANHATTAN : { dist += Manhattan_Distance(disk->ldsk->coord,disk->ldsk->next[i]->coord); break; } case EUCLIDEAN : { dist += Euclidean_Distance(disk->ldsk->coord,disk->ldsk->next[i]->coord); break; } default : assert(false); } } } disk = disk->next; } while(disk); return(dist); } //////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Mean Haversine distance (in km) per year (measured on all paths between each internal node and its children) phydbl PHYREX_Realized_Dispersal_Dist_Alt(t_tree *tree) { t_dsk *disk,*root_disk; phydbl dt,sum_dist; phydbl mean,var; int n,i,j; t_geo_coord *new_coord; new_coord = GEO_Make_Geo_Coord(tree->mmod->n_dim); GEO_Init_Coord(new_coord,tree->mmod->n_dim); disk = tree->young_disk; while(disk->prev) disk = disk->prev; root_disk = disk; n = 0; sum_dist = 0.0; disk = root_disk; do { if(disk->ldsk != NULL) { for(i=0;ildsk->n_next;++i) { dt = disk->ldsk->next[i]->disk->time - disk->time; if(dt > 1.0) { for(j=0;jmmod->n_dim;++j) { mean = disk->ldsk->coord->lonlat[j] + (disk->ldsk->next[i]->coord->lonlat[j] - disk->ldsk->coord->lonlat[j]) * 1.0 / dt; var = tree->mmod->sigsq[j] * (dt - 1.)/dt; new_coord->lonlat[j] = Rnorm(mean,sqrt(var)); } sum_dist += Haversine_Distance(disk->ldsk->coord,new_coord); n++; } } } disk = disk->next; } while(disk); Free_Geo_Coord(new_coord); if(n == 0) return(0.0); else return(sum_dist / n); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Tip_To_Root_Realized_Sigsq(t_tree *tree) { t_dsk *disk; phydbl *sigsq,res; int i; sigsq = (phydbl *)mCalloc(tree->young_disk->n_ldsk_a,sizeof(phydbl)); disk = tree->young_disk; for(i=0;in_ldsk_a;++i) { sigsq[i] = pow(Euclidean_Distance(disk->ldsk_a[i]->coord, disk->ldsk_a[i]->prev->coord)/fabs(disk->time - disk->ldsk_a[i]->prev->disk->time),2); } res = Quantile(sigsq,disk->n_ldsk_a,0.5); Free(sigsq); return(res/tree->mmod->n_dim); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Tip_To_Root_Realized_Bis_Sigsq(t_tree *tree) { t_dsk *disk; phydbl sumdist,sumt; int i; sumdist = 0.0; sumt = 0.0; disk = tree->young_disk; for(i=0;in_ldsk_a;++i) { sumdist += pow(Euclidean_Distance(disk->ldsk_a[i]->coord, disk->ldsk_a[i]->prev->coord),2); sumt += tree->mmod->n_dim * fabs(disk->time - disk->ldsk_a[i]->prev->disk->time); } return(sumdist/sumt); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Tip_To_Root_Realized_Ter_Sigsq(t_tree *tree) { t_ldsk *ldsk; phydbl mean,dist; int i; mean = 0.0; for(i=0;iyoung_disk->n_ldsk_a;++i) { ldsk = tree->young_disk->ldsk_a[i]; while(ldsk && ldsk->prev && fabs(ldsk->prev->disk->time-tree->young_disk->ldsk_a[i]->disk->time) < 1.0) { ldsk = ldsk->prev; if(ldsk == NULL) return(-1.); } dist = Euclidean_Distance(ldsk->coord,tree->young_disk->ldsk_a[i]->coord); mean += pow(dist,2); /* PhyML_Printf("\n. %3d (%12f %12f) (%12f %12f) dist: %12f mean: %12f", */ /* i, */ /* tree->young_disk->ldsk_a[i]->coord->lonlat[0], */ /* tree->young_disk->ldsk_a[i]->coord->lonlat[1], */ /* ldsk->coord->lonlat[0], */ /* ldsk->coord->lonlat[1], */ /* Euclidean_Distance(ldsk->coord,tree->young_disk->ldsk_a[i]->coord), */ /* mean); */ } return(mean/(tree->young_disk->n_ldsk_a*tree->mmod->n_dim)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Remove_All_Disks_Except_Coal_And_Tips(t_tree *tree) { t_dsk *disk,*dum; disk = tree->young_disk; dum = NULL; do { dum = disk->prev; if(disk->age_fixed == NO) { if(disk->ldsk == NULL) { t_dsk *prev,*next; prev = disk->prev; next = disk->next; assert(next && prev); PHYREX_Remove_Disk(disk); PHYREX_Update_Lindisk_List_Range(next,prev,tree); PHYREX_Free_Disk(disk); } else if(disk->ldsk != NULL && disk->ldsk->nd == NULL) { t_ldsk *old_ldsk,*young_ldsk; int dir_old_young; assert(disk->ldsk->n_next == 1); old_ldsk = disk->ldsk->prev; young_ldsk = disk->ldsk->next[0]; dir_old_young = PHYREX_Get_Next_Direction(disk->ldsk,old_ldsk); assert(dir_old_young != -1); /* New connections between old_ldsk and young_ldsk */ old_ldsk->next[dir_old_young] = young_ldsk; young_ldsk->prev = old_ldsk; PHYREX_Remove_Disk(disk); PHYREX_Update_Lindisk_List_Range(young_ldsk->disk,old_ldsk->disk,tree); PHYREX_Free_Ldisk(disk->ldsk); PHYREX_Free_Disk(disk); } } disk = dum; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Path_Logdensity(t_ldsk *young, t_ldsk *old, phydbl *sd, t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_UNIFORM : case SLFV_GAUSSIAN : { return(SLFV_Path_Logdensity(young,old,sd,tree)); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { return(0.0); break; } default : assert(FALSE); } return(-1.); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Sample_Path(t_ldsk *young, t_ldsk *old, phydbl *sd, phydbl *global_hr, t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_UNIFORM : case SLFV_GAUSSIAN : { SLFV_Sample_Path(young,old,sd,global_hr,tree); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { assert(FALSE); break; } default : assert(FALSE); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_ldsk *PHYREX_Generate_Path(t_ldsk *young, t_ldsk *old, phydbl n_evt, phydbl *sd, t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_UNIFORM : case SLFV_GAUSSIAN : { return(SLFV_Generate_Path(young,old,n_evt,sd,tree)); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { return(SLFV_Generate_Path(young,old,0,sd,tree)); break; } default : assert(FALSE); } return(NULL); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_tree *PHYREX_Simulate(int n_otu, int n_sites, phydbl w, phydbl h, phydbl lbda, phydbl rad, phydbl mu, int r_seed, int modid, char *datadir) { switch(modid) { case SLFV_UNIFORM : case SLFV_GAUSSIAN : { return(SLFV_Simulate(n_otu,n_sites,w,h,lbda,rad,mu,r_seed,datadir)); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { assert(FALSE); break; } default : assert(FALSE); } return(NULL); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Simulate_Backward_Core(t_dsk *disk,int avoid_multiple_mergers, t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_UNIFORM : case SLFV_GAUSSIAN : { SLFV_Simulate_Backward_Core(disk,avoid_multiple_mergers,tree); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { SLFV_Simulate_Backward_Core(disk,avoid_multiple_mergers,tree); break; } default : assert(FALSE); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Update_Sigsq(t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_UNIFORM : case SLFV_GAUSSIAN : { return(SLFV_Update_Sigsq(tree)); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { return(tree->mmod->sigsq[0]); break; } default : assert(FALSE); } return(-1.); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Return the edge sitting between two ldsks. Should work for multifurcating trees */ /* Make sure node ranks are up-to-date */ t_edge *PHYREX_Edge_Between_Two_Ldsks(t_ldsk *a, t_ldsk *d, t_tree *tree) { if(d->n_next == 2) // d is has out-degree 2 { assert(d->nd->anc->ldsk == a); return(d->nd->b_anc); } else { t_node *n; n = d->nd; while(n->ldsk == d) { if(n->prev != d->nd) break; n = n->prev; } assert(n->anc->ldsk == a); return(n->b_anc); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Node_Times_Given_Disks(t_tree *tree) { for(int i=0;i<2*tree->n_otu-1;++i) tree->times->nd_t[i] = tree->a_nodes[i]->ldsk->disk->time; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Disk_Times_Given_Nodes(t_tree *tree) { for(int i=0;i<2*tree->n_otu-1;++i) tree->a_nodes[i]->ldsk->disk->time = tree->times->nd_t[i]; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Make sure node times and tree topology are in sync with ldsk structure */ void PHYREX_Update_Edge_Rates_Given_Ldsks(t_tree *tree) { t_dsk *disk; int i; t_node *n; disk = tree->young_disk; if(disk == NULL) return; Get_Node_Ranks_From_Times(tree); do { if(disk->age_fixed == YES) { for(i=0;in_ldsk_a;++i) { if(disk->ldsk_a[i]->nd != NULL && disk->ldsk_a[i]->nd->tax == YES) { tree->rates->br_r[disk->ldsk_a[i]->nd->num] = disk->ldsk_a[i]->rr; } } } else if(disk->ldsk->n_next > 1) { n = disk->ldsk->nd; while(n && n->ldsk == disk->ldsk) { tree->rates->br_r[n->num] = disk->ldsk->rr; n = n->rk_next; } n = disk->ldsk->nd; while(n && n->ldsk == disk->ldsk) { tree->rates->br_r[n->num] = disk->ldsk->rr; n = n->rk_prev; } } disk = disk->prev; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Make sure node times and tree topology are in sync with ldsk structure */ void PHYREX_Update_Edge_Sigsq_Given_Ldsks(t_tree *tree) { t_dsk *disk; int i; t_node *n; disk = tree->young_disk; if(disk == NULL) return; Get_Node_Ranks_From_Times(tree); do { if(disk->age_fixed == YES) { for(i=0;in_ldsk_a;++i) { if(disk->ldsk_a[i]->nd != NULL && disk->ldsk_a[i]->nd->tax == YES) { tree->mmod->sigsq_scale[disk->ldsk_a[i]->nd->num] = disk->ldsk_a[i]->sigsq; } } } else if(disk->ldsk->n_next > 1) { n = disk->ldsk->nd; while(n && n->ldsk == disk->ldsk) { tree->mmod->sigsq_scale[n->num] = disk->ldsk->sigsq; n = n->rk_next; } n = disk->ldsk->nd; while(n && n->ldsk == disk->ldsk) { tree->mmod->sigsq_scale[n->num] = disk->ldsk->sigsq; n = n->rk_prev; } } disk = disk->prev; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Make sure node times and tree topology are in sync with ldsk structure */ void PHYREX_Update_Ldsk_Rates_Given_Edges(t_tree *tree) { int i; if(tree->young_disk == NULL) return; for(i=0;i<2*tree->n_otu-1;++i) { PHYREX_Update_Ldsk_Rates_Given_One_Edge(tree->a_nodes[i],tree); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Make sure node times and tree topology are in sync with ldsk structure */ void PHYREX_Update_Ldsk_Sigsq_Given_Edges(t_tree *tree) { int i; if(tree->young_disk == NULL) return; for(i=0;i<2*tree->n_otu-1;++i) { PHYREX_Update_Ldsk_Sigsq_Given_One_Edge(tree->a_nodes[i],tree); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Ldsk_Rates_Given_One_Edge(t_node *d, t_tree *tree) { t_ldsk *ldsk; t_node *a; if(tree->young_disk == NULL) return; a = d->anc; ldsk = d->ldsk; assert(ldsk); while(ldsk && ldsk->nd != a) { ldsk->rr = tree->rates->br_r[d->num]; ldsk = ldsk->prev; } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Update_Ldsk_Sigsq_Given_One_Edge(t_node *d, t_tree *tree) { t_ldsk *ldsk; t_node *a; if(tree->young_disk == NULL) return; a = d->anc; ldsk = d->ldsk; assert(ldsk); while(ldsk && ldsk->nd != a) { ldsk->sigsq = tree->mmod->sigsq_scale[d->num]; ldsk = ldsk->prev; } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Duplicate_Ldsk_Struct(t_tree *from, t_tree *where) { t_dsk *disk; int i,j; disk = from->n_root->ldsk->disk; do { disk->img = PHYREX_Make_Disk_Event(from->mmod->n_dim,from->n_otu); PHYREX_Init_Disk_Event(disk->img,from->mmod->n_dim,from->mmod); disk->img->n_ldsk_a = disk->n_ldsk_a; disk->img->age_fixed = disk->age_fixed; disk->img->time = disk->time; for(i=0;immod->n_dim;++i) disk->img->centr->lonlat[i] = disk->centr->lonlat[i]; if(disk->ldsk != NULL) { disk->img->ldsk = PHYREX_Make_Lindisk_Node(from->mmod->n_dim); PHYREX_Init_Lindisk_Node(disk->img->ldsk,disk->img,from->mmod->n_dim); disk->ldsk->img = disk->img->ldsk; disk->ldsk->img->disk = disk->img; for(i=0;immod->n_dim;++i) disk->ldsk->img->coord->lonlat[i] = disk->ldsk->coord->lonlat[i]; for(i=0;ildsk->n_next;++i) PHYREX_Make_Lindisk_Next(disk->ldsk->img); if(disk->ldsk->prev != NULL) disk->ldsk->img->prev = disk->ldsk->prev->img; else disk->ldsk->img->prev = NULL; if(disk->ldsk->nd != NULL) { disk->ldsk->img->nd = where->a_nodes[disk->ldsk->nd->num]; where->a_nodes[disk->ldsk->nd->num]->ldsk = disk->ldsk->img; } disk->ldsk->img->rr = disk->ldsk->rr; disk->ldsk->img->sigsq = disk->ldsk->sigsq; } if(disk->age_fixed == YES) { for(i=0;in_otu;++i) { if(disk->ldsk_a[i] && disk->ldsk_a[i]->n_next == 0 && disk->ldsk_a[i]->disk == disk) { assert(disk->ldsk_a[i]->nd != NULL); disk->img->ldsk_a[i] = PHYREX_Make_Lindisk_Node(from->mmod->n_dim); PHYREX_Init_Lindisk_Node(disk->img->ldsk_a[i],disk->img,from->mmod->n_dim); disk->ldsk_a[i]->img = disk->img->ldsk_a[i]; disk->img->ldsk_a[i]->prev = disk->ldsk_a[i]->prev->img; disk->img->ldsk_a[i]->next = NULL; disk->img->ldsk_a[i]->n_next = 0; disk->img->ldsk_a[i]->disk = disk->img; for(j=0;jmmod->n_dim;++j) disk->img->ldsk_a[i]->coord->lonlat[j] = disk->ldsk_a[i]->coord->lonlat[j]; disk->img->ldsk_a[i]->nd = where->a_nodes[disk->ldsk_a[i]->nd->num]; where->a_nodes[disk->ldsk_a[i]->nd->num]->ldsk = disk->img->ldsk_a[i]; disk->ldsk_a[i]->img->rr = disk->ldsk_a[i]->rr; disk->ldsk_a[i]->img->sigsq = disk->ldsk_a[i]->sigsq; } } } if(disk->prev != NULL) { disk->img->prev = disk->prev->img; disk->prev->img->next = disk->img; } else disk->img->prev = NULL; disk = disk->next; } while(disk != NULL); disk = from->n_root->ldsk->disk; do { if(disk->ldsk != NULL) { assert(disk->ldsk->img->n_next == disk->ldsk->n_next); for(i=0;ildsk->n_next;++i) { assert(disk->ldsk->next[i]->img != NULL); disk->ldsk->img->next[i] = disk->ldsk->next[i]->img; } } disk = disk->next; } while(disk); where->old_samp_disk = from->old_samp_disk->img; where->young_disk = from->young_disk->img; PHYREX_Update_Lindisk_List(where); PHYREX_Ldsk_To_Tree(where); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl PHYREX_Get_Posterior(t_tree *tree) { phydbl lnP; lnP = 0.0; // Likelihoods lnP += tree->c_lnL; lnP += tree->rates->c_lnL; lnP += tree->times->c_lnL; lnP += tree->mmod->c_lnL; // Priors lnP += tree->rates->c_lnP; lnP += tree->times->c_lnP; lnP += tree->mmod->c_lnP; return(lnP); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Evolve_All(t_tree *tree) { int i; RRW_Generate(tree); PhyML_Printf("\n. Done with RRW_Generate"); for(i=0;in_otu;++i) { PhyML_Printf("\n",i+1); PhyML_Printf("\n\t",tree->a_nodes[i]->name); PhyML_Printf("\n"); PhyML_Printf("\n",i+1); PhyML_Printf("\n\t%f",tree->times->nd_t[tree->a_nodes[i]->num]); PhyML_Printf("\n\t%f",tree->times->nd_t[tree->a_nodes[i]->num]); PhyML_Printf("\n\t",i+1); PhyML_Printf("\n"); } PhyML_Printf("#traits\t latMg\t longMg"); PhyML_Printf("\n|SouthWest| -26 +40"); PhyML_Printf("\n|NorthEast| -11 +53"); for(i=0;in_otu;++i) { PhyML_Printf("\n%s\t%f\t%f", tree->a_nodes[i]->name, tree->a_nodes[i]->ldsk->coord->lonlat[1], tree->a_nodes[i]->ldsk->coord->lonlat[0]); } PhyML_Printf("\n. dispDist: %f",PHYREX_Realized_Dispersal_Dist(HAVERSINE,tree)); PhyML_Printf("\n. sigSqLon: %f",tree->mmod->sigsq[0]); PhyML_Printf("\n. sigSqLat: %f",tree->mmod->sigsq[1]); PhyML_Printf("\n. neff: %f",tree->times->scaled_pop_size); PhyML_Printf("\n. growth: %f",tree->times->neff_growth); PhyML_Printf("\n. root time: %f",tree->times->nd_t[tree->n_root->num]); PhyML_Printf("\n. root lon: %f",tree->n_root->ldsk->coord->lonlat[0]); PhyML_Printf("\n. root lat: %f",tree->n_root->ldsk->coord->lonlat[1]); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Record_Disk_Times(t_tree *tree) { t_dsk *disk; disk = tree->n_root->ldsk->disk; do { disk->time_bkp = disk->time; disk = disk->next; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Restore_Disk_Times(t_tree *tree) { t_dsk *disk; int i,n_samp_disks; t_dsk **samp_disks_a; n_samp_disks = 0; samp_disks_a = NULL; disk = tree->young_disk->prev; assert(disk); disk = tree->young_disk->prev; do { if(disk->age_fixed == YES) { n_samp_disks++; } disk = disk->prev; } while(disk); samp_disks_a = (t_dsk **)mCalloc(n_samp_disks,sizeof(t_dsk *)); i = 0; disk = tree->young_disk->prev; do { if(disk->age_fixed == YES) { samp_disks_a[i] = disk; i++; } disk = disk->prev; } while(disk); disk = tree->young_disk->prev; do { if(disk->age_fixed == NO) { disk->time = disk->time_bkp; } disk = disk->prev; } while(disk); for(i=0;immod->n_dim;++i) { buff = a->coord->lonlat[i]; a->coord->lonlat[i] = b->coord->lonlat[i]; b->coord->lonlat[i] = buff; buff = a->veloc->deriv[i]; a->veloc->deriv[i] = b->veloc->deriv[i]; b->veloc->deriv[i] = buff; } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Check_Disk_Times(t_tree *tree) { t_dsk *disk; disk = tree->young_disk; do { if(Are_Equal(disk->time,disk->time_bkp,1.E-10) == NO) { PhyML_Printf("\n. Disk %s time inconsistency detected (t: %f t.bkup: %f -- diff: %g).",disk->id,disk->time,disk->time_bkp,disk->id,disk->time-disk->time_bkp); } disk = disk->prev; } while(disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Exchange_Ldsk(t_ldsk *a, t_ldsk *d, t_ldsk *w, t_ldsk *v, int aw, int dv, t_tree *tree) { t_ldsk *zv,*zw; assert(!(a->disk->time > d->disk->time)); zv = v; while(zv->n_next == 1) zv = zv->next[0]; assert(zv->nd); zw = w; while(zw->n_next == 1) zw = zw->next[0]; assert(zw->nd); /* Connect ldsks */ v->prev = a; a->next[aw] = v; w->prev = d; d->next[dv] = w; Exchange_Nodes(a->nd,d->nd,zw->nd,zv->nd,tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ short int PHYREX_Check_Lk(t_tree *tree) { if(tree->mmod->safe_phyrex == YES) { short int failed = NO; /* if(Are_Equal(RATES_Realized_Substitution_Rate(tree),tree->rates->clock_r,1.E-1)== NO) */ /* { */ /* PhyML_Fprintf(stderr,"\n. Problem detected with move %s",tree->mcmc->move_name[move]); */ /* assert(false); */ /* } */ phydbl c_lnL = tree->c_lnL; RATES_Update_Edge_Lengths(tree); if(tree->eval_alnL == YES) Lk(NULL,tree); if(Are_Equal(c_lnL,tree->c_lnL,1.E-3) == NO) { PhyML_Fprintf(stdout,"\n. a_lnL: %f -> %f [%g]",c_lnL,tree->c_lnL,c_lnL-tree->c_lnL); failed = YES; } if(tree->mmod->use_locations == YES) { phydbl g_lnL = tree->mmod->c_lnL; LOCATION_Lk(NULL,tree); if(Are_Equal(g_lnL,tree->mmod->c_lnL,1.E-3) == NO) { PhyML_Fprintf(stdout,"\n. g_lnL: %f -> %f [%g]",g_lnL,tree->mmod->c_lnL,g_lnL-tree->mmod->c_lnL); failed = YES; } } phydbl r_lnL = tree->rates->c_lnL; RATES_Lk(tree); if(Are_Equal(r_lnL,tree->rates->c_lnL,1.E-3) == NO) { PhyML_Fprintf(stderr,"\n. r_lnL: %f -> %f [%g]",r_lnL,tree->rates->c_lnL,r_lnL-tree->rates->c_lnL); failed = YES; } phydbl t_lnL = tree->times->c_lnL; TIMES_Lk(tree); if(Are_Equal(t_lnL,tree->times->c_lnL,1.E-3) == NO) { PhyML_Fprintf(stdout,"\n. t_lnL: %f -> %f [%g]",t_lnL,tree->times->c_lnL,t_lnL-tree->times->c_lnL); failed = YES; } /* RATES_Check_Rates(tree); */ /* phydbl subsrate = RATES_Realized_Substitution_Rate(tree); */ /* if(Are_Equal(subsrate,tree->rates->clock_r,1.E-8) == NO) */ /* { */ /* PhyML_Fprintf(stderr,"\n. Problem detected with move %s",tree->mcmc->move_name[move]); */ /* PhyML_Fprintf(stderr,"\n. rate : %f -> %f",subsrate,tree->rates->clock_r); */ /* Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ /* } */ for(int i=0;i<2*tree->n_otu-1;++i) { if(Are_Equal(tree->a_nodes[i]->ldsk->rr,tree->rates->br_r[tree->a_nodes[i]->num],1.E-6) == NO) { PhyML_Fprintf(stderr,"\n. Problem detected with move %s",tree->mcmc->move_name[tree->mcmc->move_idx]); PhyML_Fprintf(stderr,"\n. rate : %f -> %f",tree->a_nodes[i]->ldsk->rr,tree->rates->br_r[tree->a_nodes[i]->num]); failed = YES; } } for(int i=0;i<2*tree->n_otu-1;++i) { if(Are_Equal(tree->a_nodes[i]->ldsk->disk->time, tree->times->nd_t[tree->a_nodes[i]->num],1.E-6) == NO) { PhyML_Fprintf(stderr,"\n. Problem detected with move %s",tree->mcmc->move_name[tree->mcmc->move_idx]); PhyML_Fprintf(stderr,"\n. time : %f -> %f", tree->a_nodes[i]->ldsk->disk->time, tree->times->nd_t[tree->a_nodes[i]->num]); failed = YES; } } assert(PHYREX_Check_Struct(tree,YES)); if(failed == YES) { PhyML_Fprintf(stderr,"\n. Problem detected with move %s; mcmc step # %d",tree->mcmc->move_name[tree->mcmc->move_idx],tree->mcmc->run); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); return(0); } } return(1); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Check_Lk_Nodes(t_tree *tree) { tree->contmod->both_sides[LOCATION] = YES; tree->contmod->both_sides[VELOCITY] = YES; LOCATION_Lk(NULL,tree); PhyML_Printf("\n. Reference lk: %f",tree->mmod->c_lnL); for(int i=0; i < 2*tree->n_otu-1; ++i) { LOCATION_Lk(tree->a_nodes[i],tree); PhyML_Printf("\n. Node %d lk: %f",i,LOCATION_Lk(tree->a_nodes[i],tree)); } tree->contmod->both_sides[LOCATION] = NO; tree->contmod->both_sides[VELOCITY] = NO; } stephaneguindon-phyml-76a39c8/src/phyrex.h000066400000000000000000000215071501136442400206660ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef PHYREX_H #define PHYREX_H #include "utilities.h" void PHYREX_XML(char *xml_filename); int PHYREX_Main(int argc, char **argv); int PHYREX_Main_Simulate(int argc, char **argv); phydbl PHYREX_Lk(t_tree *tree); phydbl PHYREX_Lk_RW(t_tree *tree); phydbl PHYREX_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree); phydbl *PHYREX_MCMC(t_tree *tree); int PHYREX_Is_In_Disk(t_geo_coord *coord, t_dsk *disk, t_phyrex_mod *mmod); void PHYREX_Remove_Disk(t_dsk *disk); void PHYREX_Insert_Disk(t_dsk *ins, t_tree *tree); t_ldsk *PHYREX_Prev_Coal_Lindisk(t_ldsk *t); t_ldsk *PHYREX_Next_Coal_Lindisk(t_ldsk *t); int PHYREX_Get_Next_Direction(t_ldsk *young, t_ldsk *old); void PHYREX_Update_Lindisk_List(t_tree *tree); void PHYREX_Update_Lindisk_List_Pre(t_dsk *disk, t_tree *tree); /* void PHYREX_Update_Lindisk_List(phydbl time, t_ldsk **list, int *pos, t_dsk *disk); */ /* void PHYREX_Update_Lindisk_List_Pre(t_ldsk *ldsk, phydbl time, t_ldsk **list, int *pos); */ void PHYREX_Connect_Ldsk_Given_Disk(t_dsk **disk, int n_disk, t_ldsk *y_ldsk, t_ldsk *o_ldsk, int dir_o_y); void PHYREX_Print_Struct(char sign, t_tree *tree); phydbl PHYREX_Uniform_Path_Density(t_ldsk *y_ldsk, t_ldsk *o_ldsk, t_tree *tree); int PHYREX_Check_Struct(t_tree *tree, int exit); int PHYREX_Total_Number_Of_Intervals(t_tree *tree); int PHYREX_Total_Number_Of_Coal_Disks(t_tree *tree); int PHYREX_Total_Number_Of_Hit_Disks(t_tree *tree); int PHYREX_Total_Number_Of_Floating_Disks(t_tree *tree); phydbl PHYREX_Log_Dunif_Rectangle_Overlap(t_ldsk *ldsk, t_dsk *disk, t_phyrex_mod *mmod); phydbl PHYREX_Runif_Rectangle_Overlap(t_ldsk *ldsk, t_dsk *disk, t_phyrex_mod *mod); int PHYREX_One_New_Traj(t_ldsk *y_ldsk, t_ldsk *o_ldsk, int dir_o_y, t_dsk *xtra_dsk, int n_cur_disk, t_tree *tree); void PHYREX_Initial_Ldsk_Pos(t_tree *tree); phydbl PHYREX_Min_Radius(t_tree *tree); void PHYREX_Get_Min_Max_Disk_Given_Ldsk(t_dsk *disk, phydbl **min, phydbl **max, t_tree *tree); void PHYREX_Get_Min_Max_Ldsk_Given_Disk(t_ldsk *ldsk, phydbl **min, phydbl **max, t_tree *tree); void PHYREX_One_New_Traj_Given_Disk(t_ldsk *y_ldsk, t_ldsk *o_ldsk, t_tree *tree); void PHYREX_Update_Disk_Ldsk_Subtree(t_ldsk *root_ldsk, t_tree *tree); void PHYREX_Update_Disk_Ldsk_Subtree_Pre(t_ldsk *old_ldsk, t_ldsk *young_ldsk, t_ldsk *root_ldsk, t_tree *tree); void PHYREX_Restore_Disk_Ldsk_Subtree(t_ldsk *root_ldsk, t_tree *tree); void PHYREX_Restore_Disk_Ldsk_Subtree_Pre(t_ldsk *old_ldsk, t_ldsk *young_ldsk, t_tree *tree); void PHYREX_Proposal_Disk_Ldsk_Subtree(t_ldsk *root_ldsk, phydbl *logdens, t_tree *tree); void PHYREX_Proposal_Disk_Ldsk_Subtree_Pre(t_ldsk *old_ldsk, t_ldsk *young_ldsk, t_ldsk *root_ldsk, phydbl *logdens, t_tree *tree); void PHYREX_Ldsk_To_Tree(t_tree *tree); void PHYREX_Ldsk_To_Tree_Post(t_node *a, t_ldsk *ldsk, int *available, t_tree *tree); phydbl PHYREX_Rnorm_Trunc(t_ldsk *ldsk, t_dsk *disk, t_phyrex_mod *mod); void PHYREX_Remove_Lindisk_Next(t_ldsk *ldsk, t_ldsk *rm); phydbl *PHYREX_Mean_Pairwise_Distance_Between_Lineage_Locations(t_tree *tree); phydbl PHYREX_Random_Select_Time_Between_Jumps(t_tree *tree); int PHYREX_Is_In_Ldscape(t_ldsk *ldsk, t_phyrex_mod *mmod); void PHYREX_Update_Lindisk_List_Core(t_dsk *disk, t_tree *tree); phydbl PHYREX_Mean_Time_Between_Events(t_tree *tree); void PHYREX_All_Pairs_Coal_Times_Dist(t_tree *tree); void PHYREX_Rand_Pairs_Coal_Times_Dist(t_tree *tree); void PHYREX_Read_Tip_Coordinates(t_tree *tree); phydbl PHYREX_LnPrior_Sigsq(t_tree *tree); phydbl PHYREX_Tree_Height(t_tree *tree); int PHYREX_Random_Insert_Ldsk_In_Next_List(t_ldsk *ins, t_ldsk *where); void PHYREX_Insert_Ldsk_In_Next_List(t_ldsk *ins, int pos, t_ldsk *where); t_ldsk *PHYREX_Remove_Path(t_ldsk *beg, t_ldsk *end, int *pos_end, t_tree *tree); void PHYREX_Insert_Path(t_ldsk *beg, t_ldsk *end, t_ldsk *path, int pos, t_tree *tree); phydbl PHYREX_Time_Tree_Length(t_tree *tree); void PHYREX_Time_Tree_Length_Pre(t_ldsk *a, t_ldsk *d, phydbl *len, t_tree *tree); int PHYREX_Is_On_Path(t_ldsk *target, t_ldsk *beg, t_ldsk *end); int PHYREX_Path_Len(t_ldsk *beg, t_ldsk *end); phydbl PHYREX_Lk_Core(t_dsk *disk, t_tree *tree); phydbl PHYREX_Lk_RW_Core(t_dsk *disk, t_tree *tree); void PHYREX_Print_Disk_Lk(t_tree *tree); t_ldsk *PHYREX_Find_Lca_Pair_Of_Ldsk(t_ldsk *n1, t_ldsk *n2, t_tree *tree); void PHYREX_Get_List_Of_Ancestors(t_ldsk *start, t_ldsk ***list, int *len, t_tree *tree); phydbl PHYREX_Dist_To_Lca(t_ldsk *d, t_ldsk *lca); phydbl PHYREX_Dist_Between_Two_Ldsk(t_ldsk *n1, t_ldsk *n2, t_tree *tree); phydbl PHYREX_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree); int PHYREX_Number_Of_Sampled_Demes(t_tree *tree); void PHYREX_Tree_To_Ldsk(t_tree *tree); void PHYREX_Tree_To_Ldsk_Post(t_node *a, t_node *d, t_dsk *a_disk, t_tree *tree); void PHYREX_Make_And_Connect_Tip_Disks(t_tree *tree); void PHYREX_Simulate_Disk_And_Node_Times(t_tree *tree); int PHYREX_Number_Of_Outgoing_Ldsks(t_dsk *disk); t_ldsk *PHYREX_Random_Select_Outgoing_Ldsk(t_dsk *disk); void PHYREX_Strip_And_Reconnect_Tree(t_tree *tree); int PHYREX_Scale_All(phydbl scale, t_dsk *start_disk, t_tree *tree); void PHYREX_Update_Lindisk_List_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl PHYREX_Lk_Core_Range(t_dsk *young, t_dsk *old, t_tree *tree); int PHYREX_Number_Of_Intervals_Range(t_dsk *young, t_dsk *old, t_tree *tree); void PHYREX_Oldest_Sampled_Disk(t_tree *tree); phydbl PHYREX_Time_Of_Descendants(t_ldsk *ldsk, t_tree *tree); phydbl PHYREX_Time_Of_Prev_Sampled_Disk(t_dsk *disk, t_tree *tree); phydbl PHYREX_Time_Of_Next_Sampled_Disk(t_dsk *disk, t_tree *tree); phydbl PHYREX_Lk_Time_Component(t_tree *tree); phydbl PHYREX_Lk_Space_Component(t_tree *tree); t_ldsk *PHYREX_Find_Ldsk_From_Id(char *id, t_ldsk *root); t_geo_coord *PHYREX_Mean_Next_Loc(t_ldsk *ldsk, t_tree *tree); phydbl PHYREX_Root_To_Tip_Realized_Sigsq(t_tree *tree); phydbl PHYREX_Tip_To_Root_Realized_Sigsq(t_tree *tree); phydbl PHYREX_Realized_Dispersal_Dist(short int dist_type, t_tree *tree); phydbl PHYREX_Tip_To_Root_Realized_Bis_Sigsq(t_tree *tree); phydbl PHYREX_Tip_To_Root_Realized_Ter_Sigsq(t_tree *tree); void PHYREX_Remove_All_Disks_Except_Coal_And_Tips(t_tree *tree); phydbl PHYREX_Path_Logdensity(t_ldsk *young, t_ldsk *old, phydbl *sd, t_tree *tree); void PHYREX_Sample_Path(t_ldsk *young, t_ldsk *old, phydbl *sd, phydbl *global_hr, t_tree *tree); t_ldsk *PHYREX_Generate_Path(t_ldsk *young, t_ldsk *old, phydbl n_evt, phydbl *sd, t_tree *tree); void PHYREX_Simulate_Backward_Core(t_dsk *disk,int avoid_multiple_mergers, t_tree *tree); t_tree *PHYREX_Simulate(int n_otu, int n_sites, phydbl w, phydbl h, phydbl lbda, phydbl rad, phydbl mu, int r_seed, int modid, char *datadir); phydbl PHYREX_Update_Sigsq(t_tree *tree); void PHYREX_Get_Baselines(t_tree *tree); void PHYREX_Get_Baselines_Post(t_ldsk *ldsk, t_tree *tree); int PHYREX_Total_Number_Of_Single_Hit_Disks(t_tree *tree); t_edge *PHYREX_Edge_Between_Two_Ldsks(t_ldsk *a, t_ldsk *d, t_tree *tree); void PHYREX_Update_Node_Times_Given_Disks(t_tree *tree); void PHYREX_Update_Ldsk_Rates_Given_Edges(t_tree *tree); void PHYREX_Update_Edge_Rates_Given_Ldsks(t_tree *tree); void PHYREX_Update_Ldsk_Rates_Given_One_Edge(t_node *d, t_tree *tree); void PHYREX_Update_Edge_Sigsq_Given_Ldsks(t_tree *tree); void PHYREX_Update_Ldsk_Sigsq_Given_One_Edge(t_node *d, t_tree *tree); void PHYREX_Update_Ldsk_Sigsq_Given_Edges(t_tree *tree); void PHYREX_Duplicate_Ldsk_Struct(t_tree *from, t_tree *where); phydbl PHYREX_Get_Posterior(t_tree *tree); phydbl PHYREX_Realized_Dispersal_Dist_Alt(t_tree *tree); void PHYREX_Evolve_All(t_tree *tree); void PHYREX_Insert_Disk_At(t_dsk *ins, t_dsk *disk); void PHYREX_Move_Disk_Updown(t_dsk *this, phydbl target_time, t_tree *tree); void PHYREX_Restore_Disk_Times(t_tree *tree); void PHYREX_Record_Disk_Times(t_tree *tree); t_dsk *PHYREX_Next_Floating_Disk(t_dsk *disk); void PHYREX_Swap_Coords(t_ldsk *a, t_ldsk *b, t_tree *tree); void PHYREX_Print_Disk(t_tree *tree); void PHYREX_Check_Disk_Times(t_tree *tree); void PHYREX_Exchange_Ldsk(t_ldsk *a, t_ldsk *d, t_ldsk *w, t_ldsk *v, int aw, int dv, t_tree *tree); void PHYREX_Update_Disk_Times_Given_Nodes(t_tree *tree); void PHYREX_Label_Nodes_With_Velocities(t_tree *tree); void PHYREX_Restore_All_Geo_Coord(t_tree *tree); void PHYREX_Store_All_Geo_Coord(t_tree *tree); void PHYREX_Store_Geo_Coord(t_geo_coord *t); void PHYREX_Restore_Geo_Coord(t_geo_coord *t); void PHYREX_Restore_All_Veloc(t_tree *tree); void PHYREX_Store_All_Veloc(t_tree *tree); void PHYREX_Store_Veloc(t_geo_veloc *t); void PHYREX_Restore_Veloc(t_geo_veloc *t); phydbl PHYREX_Realized_Displacement_Dist(short int dist_type, t_tree *tree); short int PHYREX_Check_Lk(t_tree *tree); void PHYREX_Check_Lk_Nodes(t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/rates.c000066400000000000000000001774751501136442400205000ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines for molecular clock trees and molecular dating */ #include "rates.h" #ifdef RWRAPPER #include #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM || TEST || EVOLVE) phydbl RATES_Lk(t_tree *tree) { if(tree->eval_rlnL == NO) return UNLIKELY; tree->rates->c_lnL = .0; RATES_Lk_Pre(tree->n_root,tree->n_root->v[2],NULL,tree); RATES_Lk_Pre(tree->n_root,tree->n_root->v[1],NULL,tree); if(isnan(tree->rates->c_lnL)) assert(false); return tree->rates->c_lnL; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Prior(t_tree *tree) { // Priors on clock rate and rate autocorrelation. tree->rates->c_lnP = 0.0; tree->rates->c_lnP += RATES_Clock_R_Prior(tree); tree->rates->c_lnP += RATES_Autocor_Prior(tree); return(tree->rates->c_lnP); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Clock_R_Prior(t_tree *tree) { phydbl mean,sd,lnP; int err; if(tree->rates->clock_r_has_prior == NO) return(0.0); err = NO; lnP = 0.0; mean = log(tree->rates->clock_r_prior_mean); sd = sqrt(tree->rates->clock_r_prior_var); lnP += Log_Dnorm(log(tree->rates->clock_r),mean-sd*sd/2.,sd,&err); lnP -= log(tree->rates->clock_r); /* PhyML_Printf("\n. prior mean: %f var: %f || mean: %f sd: %f [%f;%f] lnL: %f", */ /* tree->rates->clock_r_prior_mean, */ /* tree->rates->clock_r_prior_var, */ /* mean, */ /* sd, */ /* tree->rates->clock_r, */ /* log(tree->rates->clock_r), */ /* lnP); */ return(lnP); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Autocor_Prior(t_tree *tree) { phydbl lnP; phydbl lbda; lbda = tree->rates->autocor_rate_prior; lnP = 0.0; if(tree->rates->model_id == THORNE || tree->rates->model_id == GUINDON || tree->rates->model_id == LOGNORMAL || tree->rates->model_id == GAMMA) lnP += log(lbda) - lbda * tree->rates->nu; return(lnP); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM || TEST || EVOLVE) void RATES_Lk_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { int i; phydbl log_dens,mu_a,mu_d,r_a,r_d,dt_a,dt_d; int n_a,n_d; log_dens = -1.; if(d->anc != a) { PhyML_Fprintf(stderr,"\n. d=%d d->anc=%d a=%d root=%d",d->num,d->anc->num,a->num,tree->n_root->num); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); assert(FALSE); } dt_a = -1.; if(a != tree->n_root) dt_a = tree->times->nd_t[a->num] - tree->times->nd_t[a->anc->num]; mu_a = tree->rates->br_r[a->num]; r_a = tree->rates->nd_r[a->num]; n_a = tree->times->n_jps[a->num]; dt_d = FABS(tree->times->nd_t[d->num] - tree->times->nd_t[a->num]); mu_d = tree->rates->br_r[d->num]; r_d = tree->rates->nd_r[d->num]; n_d = tree->times->n_jps[d->num]; log_dens = RATES_Lk_Core(mu_a,mu_d,r_a,r_d,n_a,n_d,dt_a,dt_d,tree); tree->rates->c_lnL += log_dens; if(isnan(tree->rates->c_lnL)) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); MCMC_Print_Param(tree->mcmc,tree); Exit("\n"); } tree->rates->triplet[a->num] += log_dens; if(d->tax) return; else { for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { RATES_Lk_Pre(d,d->v[i],d->b[i],tree); } } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM || TEST || EVOLVE) phydbl RATES_Lk_Core(phydbl br_r_a, phydbl br_r_d, phydbl nd_r_a, phydbl nd_r_d, int n_a, int n_d, phydbl dt_a, phydbl dt_d, t_tree *tree) { phydbl log_dens,mean,sd,min_r, max_r,cr; log_dens = UNLIKELY; mean = sd = -1.; min_r = tree->rates->min_rate; max_r = tree->rates->max_rate; cr = tree->rates->clock_r; if(br_r_d > tree->rates->max_rate) return UNLIKELY; if(br_r_d < tree->rates->min_rate) return UNLIKELY; /* dt_d = MAX(0.5,dt_d); // We give only one decimal when printing out node heights. It is therefore a fair approximation */ switch(tree->rates->model_id) { case THORNE : { int err; phydbl log_br_r_d = log(br_r_d); phydbl log_br_r_a = log(br_r_a); /* log_dens = Log_Dnorm_Trunc(log_br_r_d,log_br_r_a,sqrt(tree->rates->nu*dt_d),log(tree->rates->min_rate),log(tree->rates->max_rate),&err); */ log_dens = Log_Dnorm(log_br_r_d,log_br_r_a,sqrt(tree->rates->nu*dt_d),&err); log_dens -= log_br_r_d; break; } case GUINDON : { int err; min_r = tree->rates->min_rate; max_r = tree->rates->max_rate; nd_r_d = log(nd_r_d*cr); nd_r_a = log(nd_r_a*cr); min_r = log(min_r*cr); max_r = log(max_r*cr); sd = sqrt(tree->rates->nu*dt_d); mean = nd_r_a - .5*sd*sd; // log(density(log(Rate))) log_dens = Log_Dnorm_Trunc(nd_r_d,mean,sd,min_r,max_r,&err); // log(density(Rate)) log_dens -= log(exp(nd_r_d)/cr); if(err) { PhyML_Fprintf(stderr,"\n. Run: %d",tree->mcmc->run); PhyML_Fprintf(stderr,"\n. br_r_d=%f mean=%f sd=%f min_r=%f max_r=%f dt_d=%f",br_r_d,mean,sd,min_r,max_r,dt_d); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } break; } case LOGNORMAL : { int err; phydbl log_br_r_d = log(br_r_d); log_dens = Log_Dnorm(log_br_r_d,-tree->rates->nu*tree->rates->nu/2.,tree->rates->nu,&err); log_dens -= log_br_r_d; break; } case GAMMA : { log_dens = log(Dgamma(br_r_d,1./tree->rates->nu,tree->rates->nu)); break; } case STRICTCLOCK : { log_dens = 0.0; break; } default : { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } } if(isnan(log_dens)) { PhyML_Fprintf(stderr,"\n. Run=%4d br_r_d=%f br_r_a=%f dt_d=%f dt_a=%f nu=%f log_dens=%G sd=%f mean=%f\n", tree->mcmc->run, br_r_d,br_r_a,dt_d,dt_a,tree->rates->nu,log_dens, sd,mean); assert(false); } return log_dens; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Lk_Change_One_Rate(t_node *d, phydbl new_rate, t_tree *tree) { tree->rates->br_r[d->num] = new_rate; RATES_Update_Triplet(d,tree); RATES_Update_Triplet(d->anc,tree); return(tree->rates->c_lnL); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Lk_Change_One_Time(t_node *n, phydbl new_t, t_tree *tree) { if(n == tree->n_root) { PhyML_Fprintf(stderr,"\n. Moving the time of the root t_node is not permitted."); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } else { int i; tree->times->nd_t[n->num] = new_t; RATES_Update_Triplet(n,tree); for(i=0;i<3;i++) { if(n->b[i] != tree->e_root) RATES_Update_Triplet(n->v[i],tree); else RATES_Update_Triplet(tree->n_root,tree); } } return(tree->rates->c_lnL); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Update_Triplet(t_node *n, t_tree *tree) { phydbl curr_triplet,new_triplet; phydbl dt0,dt1,dt2; phydbl mu1_mu0,mu2_mu0; phydbl mu0,mu1,mu2; phydbl r0,r1,r2; int n0,n1,n2; int i; t_node *v1,*v2; if(n->tax) return; curr_triplet = tree->rates->triplet[n->num]; dt0 = dt1 = dt2 = -100.0; r0 = r1 = r2 = 0.0; if(n == tree->n_root) { phydbl log_dens; log_dens = 0.0; dt0 = tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]; dt1 = tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]; mu0 = tree->rates->br_r[tree->n_root->v[2]->num]; mu1 = tree->rates->br_r[tree->n_root->v[1]->num]; r0 = tree->rates->nd_r[tree->n_root->v[2]->num]; r1 = tree->rates->nd_r[tree->n_root->v[1]->num]; n0 = tree->times->n_jps[tree->n_root->v[2]->num]; n1 = tree->times->n_jps[tree->n_root->v[1]->num]; switch(tree->rates->model_id) { case COMPOUND_COR : case COMPOUND_NOCOR : { log_dens = RATES_Dmu(mu0,n0,dt0,tree->rates->nu,1./tree->rates->nu,tree->rates->lexp,0,1); log_dens *= RATES_Dmu(mu1,n1,dt1,tree->rates->nu,1./tree->rates->nu,tree->rates->lexp,0,1); log_dens = log(log_dens); break; } case EXPONENTIAL : { log_dens = Dexp(mu0,tree->rates->lexp) * Dexp(mu1,tree->rates->lexp); log_dens = log(log_dens); break; } case LOGNORMAL : { log_dens = Dgamma(mu0,tree->rates->nu,1./tree->rates->nu) * Dgamma(mu1,tree->rates->nu,1./tree->rates->nu); log_dens = log(log_dens); break; } case THORNE : { int err; phydbl mean0,sd0; phydbl mean1,sd1; sd0 = SQRT(tree->rates->nu*dt0); mean0 = 1.0; sd1 = SQRT(tree->rates->nu*dt1); mean1 = 1.0; log_dens = Log_Dnorm_Trunc(mu0,mean0,sd0,tree->rates->min_rate,tree->rates->max_rate,&err) + Log_Dnorm_Trunc(mu1,mean1,sd1,tree->rates->min_rate,tree->rates->max_rate,&err); break; } case GUINDON : { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n. Not implemented yet.\n"); break; } default : { Exit("\n. Model not implemented yet.\n"); break; } } new_triplet = log_dens; if(isnan(log_dens) || isinf(FABS(log_dens))) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); MCMC_Print_Param(tree->mcmc,tree); Exit("\n"); } } else { mu0 = mu1 = mu2 = -1.; n0 = n1 = n2 = -1; mu0 = tree->rates->br_r[n->num]; dt0 = FABS(tree->times->nd_t[n->num] - tree->times->nd_t[n->anc->num]); n0 = tree->times->n_jps[n->num]; r0 = tree->rates->nd_r[n->num]; v1 = v2 = NULL; for(i=0;i<3;i++) { if((n->v[i] != n->anc) && (n->b[i] != tree->e_root)) { if(!v1) { v1 = n->v[i]; mu1 = tree->rates->br_r[v1->num]; dt1 = FABS(tree->times->nd_t[v1->num] - tree->times->nd_t[n->num]); n1 = tree->times->n_jps[v1->num]; r1 = tree->rates->nd_r[v1->num]; } else { v2 = n->v[i]; mu2 = tree->rates->br_r[v2->num]; dt2 = FABS(tree->times->nd_t[v2->num] - tree->times->nd_t[n->num]); n2 = tree->times->n_jps[v2->num]; r2 = tree->rates->nd_r[v2->num]; } } } mu1_mu0 = RATES_Lk_Core(mu0,mu1,r0,r1,n0,n1,dt0,dt1,tree); mu2_mu0 = RATES_Lk_Core(mu0,mu2,r0,r1,n0,n2,dt0,dt2,tree); new_triplet = mu1_mu0 + mu2_mu0; } tree->rates->c_lnL = tree->rates->c_lnL + new_triplet - curr_triplet; tree->rates->triplet[n->num] = new_triplet; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Print_Triplets(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-1;++i) PhyML_Printf("\n. Node %3d t=%f",i,tree->rates->triplet[i]); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Print_Rates(t_tree *tree) { RATES_Print_Rates_Pre(tree->n_root,tree->n_root->v[2],NULL,tree); RATES_Print_Rates_Pre(tree->n_root,tree->n_root->v[1],NULL,tree); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Copy_Rate_Struct(t_rate *from, t_rate *to, int n_otu) { int i; to->lexp = from->lexp; to->alpha = from->alpha; to->less_likely = from->less_likely; to->nu = from->nu; to->min_nu = from->min_nu; to->max_nu = from->max_nu; to->clock_r_has_prior = from->clock_r_has_prior; to->clock_r_prior_mean = from->clock_r_prior_mean; to->clock_r_prior_var = from->clock_r_prior_var; to->min_rate = from->min_rate; to->max_rate = from->max_rate; to->c_lnL1 = from->c_lnL1; to->c_lnL2 = from->c_lnL2; to->c_lnL = from->c_lnL; to->clock_r = from->clock_r; to->min_clock = from->min_clock; to->max_clock = from->max_clock; to->lbda_nu = from->lbda_nu; to->min_dt = from->min_dt; to->step_rate = from->step_rate; to->true_tree_size = from->true_tree_size; to->p_max = from->p_max; to->norm_fact = from->norm_fact; to->adjust_rates = from->adjust_rates; to->use_rates = from->use_rates; to->bl_from_rt = from->bl_from_rt; to->approx = from->approx; to->model_id = from->model_id; to->is_allocated = from->is_allocated; to->met_within_gibbs = from->met_within_gibbs; to->update_mean_l = from->update_mean_l; to->update_cov_l = from->update_cov_l; to->br_r_recorded = from->br_r_recorded; to->log_K_cur = from->log_K_cur; to->cur_comb_numb = from->cur_comb_numb; to->norm_fact = from->norm_fact; for(i=0;i<2*n_otu-1;++i) to->nd_r[i] = from->nd_r[i]; for(i=0;i<2*n_otu-1;++i) to->br_r[i] = from->br_r[i]; for(i=0;i<2*n_otu-1;++i) to->buff_br_r[i] = from->buff_br_r[i]; for(i=0;i<2*n_otu-1;++i) to->buff_nd_r[i] = from->buff_nd_r[i]; for(i=0;i<2*n_otu-1;++i) to->true_r[i] = from->true_r[i]; for(i=0;i<2*n_otu-2;++i) to->dens[i] = from->dens[i]; for(i=0;i<2*n_otu-1;++i) to->triplet[i] = from->triplet[i]; for(i=0;i<(2*n_otu-2)*(2*n_otu-2);++i) to->cov_l[i] = from->cov_l[i]; for(i=0;i<(2*n_otu-2)*(2*n_otu-2);++i) to->invcov[i] = from->invcov[i]; for(i=0;i<2*n_otu-2;++i) to->mean_l[i] = from->mean_l[i]; for(i=0;i<2*n_otu-2;++i) to->ml_l[i] = from->ml_l[i]; for(i=0;i<2*n_otu-2;++i) to->cur_l[i] = from->cur_l[i]; for(i=0;i<2*n_otu-3;++i) to->u_ml_l[i] = from->u_ml_l[i]; for(i=0;i<2*n_otu-3;++i) to->u_cur_l[i] = from->u_cur_l[i]; for(i=0;i<(2*n_otu-2)*(2*n_otu-2);++i) to->cov_r[i] = from->cov_r[i]; for(i=0;i<2*n_otu-2;++i) to->cond_var[i] = from->cond_var[i]; for(i=0;i<2*n_otu-2;++i) to->mean_r[i] = from->mean_r[i]; for(i=0;i<(2*n_otu-1)*(2*n_otu-1);++i) to->lca[i] = from->lca[i]; for(i=0;i<(2*n_otu-2)*(2*n_otu-2);++i) to->reg_coeff[i] = from->reg_coeff[i]; for(i=0;i<(2*n_otu-2)*(6*n_otu-9);++i) to->trip_reg_coeff[i] = from->trip_reg_coeff[i]; for(i=0;i<(2*n_otu-2)*9;++i) to->trip_cond_cov[i] = from->trip_cond_cov[i]; for(i=0;i<2*n_otu;++i) to->_2n_vect1[i] = from->_2n_vect1[i]; for(i=0;i<2*n_otu;++i) to->_2n_vect2[i] = from->_2n_vect2[i]; for(i=0;i<2*n_otu;++i) to->_2n_vect3[i] = from->_2n_vect3[i]; for(i=0;i<2*n_otu;++i) to->_2n_vect4[i] = from->_2n_vect4[i]; for(i=0;i<2*n_otu;++i) to->_2n_vect5[i] = from->_2n_vect5[i]; for(i=0;i<4*n_otu*n_otu;++i) to->_2n2n_vect1[i] = from->_2n2n_vect1[i]; for(i=0;i<4*n_otu*n_otu;++i) to->_2n2n_vect2[i] = from->_2n2n_vect2[i]; for(i=0;i<2*n_otu-1;++i) to->br_do_updt[i] = from->br_do_updt[i]; for(i=0;i<2*n_otu-1;++i) to->cur_gamma_prior_mean[i] = from->cur_gamma_prior_mean[i]; for(i=0;i<2*n_otu-1;++i) to->cur_gamma_prior_var[i] = from->cur_gamma_prior_var[i]; for(i=0;i<2*n_otu-1;++i) to->n_tips_below[i] = from->n_tips_below[i]; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Duplicate_Calib_Struct(t_tree *from, t_tree *to) { int i,j; to->times->n_cal = from->times->n_cal; for(i=0;itimes->n_cal;i++) { to->times->a_cal[i] = Duplicate_Calib(from->times->a_cal[i]); for(j=0;jtimes->a_cal[i]->clade_list_size;j++) Init_Target_Tip(to->times->a_cal[i]->clade_list[j],to); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Print_Rates_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if((d == tree->n_root->v[2] && d->tax) || (d == tree->n_root->v[1] && d->tax)) PhyML_Printf("\n. a=%3d ++d=%3d rate=%12f t_left=%12f t_rght=%12f ml=%12f l=%12f %12f", a->num,d->num, tree->rates->br_r[d->num], tree->times->nd_t[a->num],tree->times->nd_t[d->num], tree->rates->ml_l[d->num], tree->rates->cur_l[d->num], (tree->times->nd_t[d->num]-tree->times->nd_t[a->num])*tree->rates->clock_r*tree->rates->br_r[d->num]); else if((d == tree->n_root->v[2]) || (d == tree->n_root->v[1])) PhyML_Printf("\n. a=%3d __d=%3d rate=%12f t_left=%12f t_rght=%12f ml=%12f l=%12f %12f", a->num,d->num, tree->rates->br_r[d->num], tree->times->nd_t[a->num],tree->times->nd_t[d->num], tree->rates->ml_l[d->num], tree->rates->cur_l[d->num], (tree->times->nd_t[d->num]-tree->times->nd_t[a->num])*tree->rates->clock_r*tree->rates->br_r[d->num]); else PhyML_Printf("\n. a=%3d d=%3d rate=%12f t_left=%12f t_rght=%12f ml=%12f l=%12f %12f", a->num,d->num, tree->rates->br_r[d->num], tree->times->nd_t[a->num],tree->times->nd_t[d->num], tree->rates->ml_l[d->num], tree->rates->cur_l[d->num], (tree->times->nd_t[d->num]-tree->times->nd_t[a->num])*tree->rates->clock_r*tree->rates->br_r[d->num]); if(d->tax) return; else { int i; for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { RATES_Print_Rates_Pre(d,d->v[i],d->b[i],tree); } } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Average_Rate(t_tree *tree) { int i; phydbl sum; sum = 0.0; for(i=0;i<2*tree->n_otu-2;++i) sum += tree->rates->br_r[i]; return sum/(2*tree->n_otu-2); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Average_Substitution_Rate(t_tree *tree) { phydbl l,dt; int i; l = 0.0; dt = 0.0; for(i=0;i<2*tree->n_otu-1;++i) { if(tree->a_nodes[i] != tree->n_root) { dt += FABS(tree->times->nd_t[tree->a_nodes[i]->num] - tree->times->nd_t[tree->a_nodes[i]->anc->num]); l += tree->rates->cur_l[tree->a_nodes[i]->num]; } } return(l/dt); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Check_Mean_Rates_True(t_tree *tree) { phydbl sum; int i; sum = 0.0; for(i=0;i<2*tree->n_otu-2;++i) sum += tree->rates->true_r[i]; return(sum/(phydbl)(2*tree->n_otu-2)); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) int RATES_Check_Node_Times(t_tree *tree) { int err; err = NO; RATES_Check_Node_Times_Pre(tree->n_root,tree->n_root->v[2],&err,tree); RATES_Check_Node_Times_Pre(tree->n_root,tree->n_root->v[1],&err,tree); return err; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Check_Node_Times_Pre(t_node *a, t_node *d, int *err, t_tree *tree) { if(tree->times->nd_t[d->num] < tree->times->nd_t[a->num]) { PhyML_Printf("\n. a->t=%f d->t=%f diff: %g",tree->times->nd_t[a->num],tree->times->nd_t[d->num],tree->times->nd_t[a->num]-tree->times->nd_t[d->num]); PhyML_Printf("\n. a->t_prior_min=%f a->t_prior_max=%f",tree->times->t_prior_min[a->num],tree->times->t_prior_max[a->num]); PhyML_Printf("\n. d->t_prior_min=%f d->t_prior_max=%f",tree->times->t_prior_min[d->num],tree->times->t_prior_max[d->num]); *err = YES; } if(d->tax) return; else { int i; for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) RATES_Check_Node_Times_Pre(d,d->v[i],err,tree); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Bracket_N_Jumps(int *up, int *down, phydbl param) { phydbl cdf,eps,a,b,c; int step; step = 10; eps = 1.E-10; cdf = 0.0; c = 1; while(cdf < 1.-eps) { c = (int)FLOOR(c * step); cdf = Ppois(c,param); } a = 0.0; b = (c-a)/2.; step = 0; do { step++; cdf = Ppois(b,param); if(cdf < eps) a = b; else { break; } b = (c-a)/2.; } while(step < 1000); if(step == 1000) { PhyML_Fprintf(stderr,"\n. a=%f b=%f c=%f param=%f",a,b,c,param); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } *up = c; *down = a; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* mu : average rate of the time period dt dt : time period to be considered a : rate at a given time point is gamma distributed. a is the shape parameter b : rate at a given time point is gamma distributed. b is the scale parameter lexp : the number of rate switches is Poisson distributed with parameter lexp * dt */ /* compute f(mu;dt,a,b,lexp), the probability density of mu. We need to integrate over the possible number of jumps (n) during the time interval dt */ #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Dmu(phydbl mu, int n_jumps, phydbl dt, phydbl a, phydbl b, phydbl lexp, int min_n, int jps_dens) { if(n_jumps < 0) /* Marginal, i.e., the number of jumps is not fixed */ { phydbl var,cumpoissprob,dens,mean,poissprob,ab2,gammadens,lexpdt; int n,up,down; var = 0.0; cumpoissprob = 0.0; dens = 0.0; n = 0; mean = a*b; ab2 = a*b*b; lexpdt = lexp*dt; RATES_Bracket_N_Jumps(&up,&down,lexpdt); For(n,MAX(down,min_n)-1) cumpoissprob += Dpois(n,lexpdt,NO); for(n=MAX(down,min_n);n 1.-1.E-04) break; } if(dens < 1.E-70) dens = 1.E-70; return(dens); } else /* Joint, i.e., return P(mu | dt, n_jumps) */ { phydbl mean, var, density; mean = 1.0; var = (2./(n_jumps+2.))*a*b*b; if(jps_dens) density = Dgamma_Moments(mu,mean,var) * Dpois(n_jumps,dt*lexp,NO); else density = Dgamma_Moments(mu,mean,var); if(density < 1.E-70) density = 1.E-70; return density; } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Given the times of nodes a (ta) and d (td), the shape of the gamma distribution of instantaneous rates, the parameter of the exponential distribution of waiting times between rate jumps and the instantaneous rate at t_node a, this function works out an expected number of (amino-acids or nucleotide) substitutions per site. */ #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Expect_Number_Subst(phydbl t_beg, phydbl t_end, phydbl r_beg, int *n_jumps, phydbl *mean_r, phydbl *r_end, t_rate *rates, t_tree *tree) { phydbl curr_r, curr_t, next_t; switch(rates->model_id) { case COMPOUND_COR:case COMPOUND_NOCOR: { /* Compound Poisson */ if(rates->model_id == COMPOUND_COR) { curr_r = r_beg; *mean_r = r_beg; } else { curr_r = Rgamma(rates->nu,1./rates->nu);; *mean_r = curr_r; } curr_t = t_beg + Rexp(rates->lexp); /* Exponentially distributed waiting times */ next_t = curr_t; *n_jumps = 0; while(curr_t < t_end) { curr_r = Rgamma(rates->nu,1./rates->nu); /* Gamma distributed random instantaneous rate */ (*n_jumps)++; next_t = curr_t + Rexp(rates->lexp); if(next_t < t_end) { *mean_r = (1./(next_t - t_beg)) * (*mean_r * (curr_t - t_beg) + curr_r * (next_t - curr_t)); } else { *mean_r = (1./(t_end - t_beg)) * (*mean_r * (curr_t - t_beg) + curr_r * (t_end - curr_t)); } curr_t = next_t; } /* PhyML_Printf("\n. [%3d %f %f]",*n_jumps,*mean_r,r_beg); */ if(*mean_r < rates->min_rate) *mean_r = rates->min_rate; if(*mean_r > rates->max_rate) *mean_r = rates->max_rate; *r_end = curr_r; break; } case EXPONENTIAL: { *mean_r = Rexp(rates->nu); if(*mean_r < rates->min_rate) *mean_r = rates->min_rate; if(*mean_r > rates->max_rate) *mean_r = rates->max_rate; *r_end = *mean_r; break; } case LOGNORMAL: { *mean_r = Rgamma(rates->nu,1./rates->nu); if(*mean_r < rates->min_rate) *mean_r = rates->min_rate; if(*mean_r > rates->max_rate) *mean_r = rates->max_rate; *r_end = *mean_r; break; } case THORNE: { phydbl sd,mean; int err; sd = SQRT(rates->nu*FABS(t_beg-t_end)); mean = r_beg; *mean_r = Rnorm_Trunc(mean,sd,rates->min_rate,rates->max_rate,&err); if(err) PhyML_Printf("\n. %s %d %d",__FILE__,__LINE__,tree->mcmc->run); *r_end = *mean_r; break; } default: { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n. Model not implemented yet.\n"); break; } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Get_Mean_Rates_Pre(t_node *a, t_node *d, t_edge *b, phydbl r_a, t_tree *tree) { phydbl a_t,d_t; phydbl mean_r; int n_jumps; phydbl r_d; a_t = tree->times->nd_t[a->num]; d_t = tree->times->nd_t[d->num]; mean_r = -1.; n_jumps = -1; r_d = -1.; RATES_Expect_Number_Subst(a_t,d_t,r_a,&n_jumps,&mean_r,&r_d,tree->rates,tree); tree->rates->br_r[d->num] = mean_r; tree->rates->true_r[d->num] = mean_r; tree->times->t_jps[d->num] = n_jumps; /* Move to the next branches */ if(d->tax) return; else { int i; for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { RATES_Get_Mean_Rates_Pre(d,d->v[i],d->b[i],r_d,tree); } } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Random_Branch_Lengths(t_tree *tree) { phydbl r0; r0 = 1.0; tree->rates->br_r[tree->n_root->num] = r0; RATES_Get_Mean_Rates_Pre(tree->n_root,tree->n_root->v[2],NULL,r0,tree); RATES_Get_Mean_Rates_Pre(tree->n_root,tree->n_root->v[1],NULL,r0,tree); RATES_Check_Rates(tree); RATES_Update_Edge_Lengths(tree); RATES_Initialize_True_Rates(tree); tree->n_root_pos = tree->rates->cur_l[tree->n_root->v[2]->num] / (tree->rates->cur_l[tree->n_root->v[2]->num] + tree->rates->cur_l[tree->n_root->v[1]->num]); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Scale relative rates (on edges) so that they average to one */ void RATES_Update_Normalization_Factor(t_tree *tree) { phydbl dt,rdt,T,RT; int i; rdt = 0.0; dt = 0.0; T = 0.0; RT = 0.0; for(i=0;i<2*tree->n_otu-2;++i) { assert(tree->a_nodes[i] != tree->n_root); dt = fabs(tree->times->nd_t[i] - tree->times->nd_t[tree->a_nodes[i]->anc->num]); /* dt = 1.0; */ rdt = dt*tree->rates->br_r[i]; T+=dt; RT+=rdt; } assert(RT!=0.0); tree->rates->norm_fact = T/RT; /* !!!!!!!!!!!!!!!!!!!!!!!!! */ tree->rates->norm_fact = 1.0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Normalize_Rates(t_tree *tree) { phydbl dt,rdt,T,RT,Z; int i; rdt = 0.0; dt = 0.0; T = 0.0; RT = 0.0; for(i=0;i<2*tree->n_otu-2;++i) { assert(tree->a_nodes[i] != tree->n_root); /* dt = fabs(tree->times->nd_t[i] - tree->times->nd_t[tree->a_nodes[i]->anc->num]); */ /* rdt = dt*tree->rates->br_r[i]; */ dt = 1.0; rdt = dt*tree->rates->br_r[i]; T+=dt; RT+=rdt; } assert(RT!=0.0); Z = RT/T; for(i=0;i<2*tree->n_otu-2;++i) { tree->rates->br_r[i] /= Z; if(tree->rates->br_r[i] < tree->rates->min_rate) tree->rates->br_r[i] = tree->rates->min_rate; if(tree->rates->br_r[i] > tree->rates->max_rate) tree->rates->br_r[i] = tree->rates->max_rate; } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Test whether rates are normalized */ #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Check_Rates(t_tree *tree) { phydbl scale,dt,T,eps; int i; eps = 1.E-6; scale = 0.0; dt = 0.0; T = 0.0; for(i=0;i<2*tree->n_otu-2;++i) { assert(tree->a_nodes[i] != tree->n_root); dt = fabs(tree->times->nd_t[i] - tree->times->nd_t[tree->a_nodes[i]->anc->num]); T+=dt; scale += tree->rates->br_r[i] * dt; } scale /= T; if(scale > 1.+eps || scale < 1.-eps) { PhyML_Fprintf(stderr,"\n. Relative rates are not normalised!..."); assert(false); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Init_Triplets(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-1;++i) tree->rates->triplet[i] = 0.0; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Initialize_True_Rates(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-2;++i) tree->rates->true_r[i] = tree->rates->br_r[i]; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Get_Rates_From_Bl(t_tree *tree) { phydbl dt,cr; t_node *left, *rght; int i; dt = -1.0; cr = tree->rates->clock_r; if(tree->n_root) { dt = FABS(tree->times->nd_t[tree->n_root->num] - tree->times->nd_t[tree->n_root->v[2]->num]); tree->rates->br_r[tree->n_root->v[2]->num] = 0.5 * tree->e_root->l->v / (dt*cr); dt = FABS(tree->times->nd_t[tree->n_root->num] - tree->times->nd_t[tree->n_root->v[1]->num]); tree->rates->br_r[tree->n_root->v[1]->num] = 0.5 * tree->e_root->l->v / (dt*cr); } for(i=0;i<2*tree->n_otu-3;++i) { if(tree->a_edges[i] != tree->e_root) { left = tree->a_edges[i]->left; rght = tree->a_edges[i]->rght; dt = FABS(tree->times->nd_t[left->num] - tree->times->nd_t[rght->num]); if(left->anc == rght) tree->rates->br_r[left->num] = tree->a_edges[i]->l->v / (dt*cr); else tree->rates->br_r[rght->num] = tree->a_edges[i]->l->v / (dt*cr); } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Lk_Jumps(t_tree *tree) { int i,n_jps; phydbl dens,dt,lexp; t_node *n; n = NULL; lexp = tree->rates->lexp; n_jps = 0; dt = 0.0; dens = 0.0; for(i=0;i<2*tree->n_otu-2;++i) { n = tree->a_nodes[i]; dt = FABS(tree->times->nd_t[n->num]-tree->times->nd_t[n->anc->num]); n_jps = tree->times->n_jps[n->num]; dens += Dpois(n_jps,lexp*dt,YES); } tree->times->c_lnL_jps = dens; return dens; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RATES_Update_Edge_Lengths(t_tree *tree) { if(tree->is_mixt_tree == YES) { MIXT_RATES_Update_Edge_Lengths(tree); return; } RATES_Update_Normalization_Factor(tree); RATES_Update_Edge_Lengths_Pre(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); RATES_Update_Edge_Lengths_Pre(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); RATES_Update_One_Edge_Length(tree->e_root,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RATES_Update_Edge_Lengths_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { RATES_Update_One_Edge_Length(b,tree); if(d->tax) return; else { int i; for(i=0;i<3;++i) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) RATES_Update_Edge_Lengths_Pre(d,d->v[i],d->b[i],tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RATES_Update_One_Edge_Length(t_edge *b, t_tree *tree) { if(tree->is_mixt_tree == YES) { MIXT_RATES_Update_One_Edge_Length(b,tree); return; } if(b == tree->e_root || b == tree->n_root->b[1] || b == tree->n_root->b[2]) { if(b == tree->e_root) { RATES_Update_One_Edge_Length_Core(tree->n_root->b[1],tree); RATES_Update_One_Edge_Length_Core(tree->n_root->b[2],tree); } else if(b == tree->n_root->b[1]) { RATES_Update_One_Edge_Length_Core(tree->n_root->b[1],tree); } else if(b == tree->n_root->b[2]) { RATES_Update_One_Edge_Length_Core(tree->n_root->b[2],tree); } if(tree->mod && tree->mod->log_l == YES) { tree->e_root->l->v = exp(tree->n_root->b[1]->l->v) + exp(tree->n_root->b[2]->l->v) ; tree->e_root->l->v = log(tree->e_root->l->v); } else { tree->e_root->l->v = tree->n_root->b[1]->l->v + tree->n_root->b[2]->l->v; } tree->rates->u_cur_l[tree->e_root->num] = tree->e_root->l->v; tree->n_root_pos = tree->n_root->b[2]->l->v / tree->e_root->l->v; if(tree->rates->model_id == GUINDON) { phydbl t0,t1,t2; t_node *n0, *n1; n0 = tree->n_root->v[2]; n1 = tree->n_root->v[1]; t1 = tree->times->nd_t[tree->n_root->v[2]->num]; t2 = tree->times->nd_t[tree->n_root->v[1]->num]; t0 = tree->times->nd_t[tree->n_root->num]; tree->e_root->l->v = (t1-t0)/(t1+t2-2.*t0)*tree->rates->cur_gamma_prior_mean[n0->num] + (t2-t0)/(t1+t2-2.*t0)*tree->rates->cur_gamma_prior_mean[n1->num]; tree->e_root->l_var->v = pow((t1-t0)/(t1+t2-2.*t0),2)*tree->rates->cur_gamma_prior_var[n0->num] + pow((t2-t0)/(t1+t2-2.*t0),2)*tree->rates->cur_gamma_prior_var[n1->num]; } } else { RATES_Update_One_Edge_Length_Core(b,tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RATES_Update_One_Edge_Length_Core(t_edge *b, t_tree *tree) { phydbl dt,rr,ra,rd,ta,td,nu,cr,Z; t_node *a, *d; if(b->left->anc == b->rght) { d = b->left; a = b->rght; } else { d = b->rght; a = b->left; } if(d->anc != a) { PhyML_Printf("\n. a->num: %d d->num: %d d->anc: %d b->left: %d b->rght: %d b->num: %d", a->num, d->num, d->anc->num, b->left->num, b->rght->num, b->num); } assert(a); assert(d); assert(d->anc == a); ra = rd = -1.; if(tree->rates->model_id == LOGNORMAL || tree->rates->model_id == THORNE || tree->rates->model_id == GAMMA || tree->rates->model_id == STRICTCLOCK) { rd = tree->rates->br_r[d->num]; ra = tree->rates->br_r[a->num]; } else if(tree->rates->model_id == GUINDON) { rd = tree->rates->nd_r[d->num]; ra = tree->rates->nd_r[a->num]; } else assert(FALSE); dt = fabs(tree->times->nd_t[d->num] - tree->times->nd_t[a->num]); cr = tree->rates->clock_r; td = tree->times->nd_t[d->num]; ta = tree->times->nd_t[a->num]; nu = tree->rates->nu; Z = tree->rates->norm_fact; rr = -1.0; if(tree->rates->model_id == LOGNORMAL || tree->rates->model_id == GAMMA) { tree->rates->cur_l[d->num] = dt*rd*cr*Z; } if(tree->rates->model_id == THORNE) { rr = (ra+rd)/2.; tree->rates->cur_l[d->num] = dt*rr*cr*Z; } if(tree->rates->model_id == GUINDON) { phydbl m,v; Integrated_Geometric_Brownian_Bridge_Moments(dt,ra,rd,nu,&m,&v); if(isnan(m) || isnan(v) || m < 0.0 || v < 0.0) { PhyML_Fprintf(stderr,"\n. dt: %G ra: %G rd: %G nu: %G m: %G v: %G a is root ? %d d is root ? %d", dt,ra,rd,nu,m,v, a==tree->n_root, d==tree->n_root); } m *= dt*cr; // the actual rate average is m * dt. We multiply by dt in order to derive the value for the branch length v *= (dt*dt)*(cr*cr); tree->rates->cur_gamma_prior_mean[d->num] = m; tree->rates->cur_gamma_prior_var[d->num] = v; tree->rates->cur_l[d->num] = tree->rates->cur_gamma_prior_mean[d->num]; // Required for having proper branch lengths in Write_Tree function } if(tree->rates->model_id == STRICTCLOCK) { tree->rates->cur_l[d->num] = dt*cr; } if(tree->mod && tree->mod->log_l == YES) tree->rates->cur_l[d->num] = log(tree->rates->cur_l[d->num]); if(b) { b->l->v = tree->rates->cur_l[d->num]; tree->rates->u_cur_l[b->num] = tree->rates->cur_l[d->num]; b->l_var->v = tree->rates->cur_gamma_prior_var[d->num]; } if(b && (isnan(b->l->v) || isnan(b->l_var->v))) { PhyML_Fprintf(stderr,"\n. dt=%G rr=%G cr=%G ra=%G rd=%G nu=%G b->l_var=%f b->l=%f Z=%f",dt,rr,tree->rates->clock_r,ra,rd,nu,b->l_var->v,b->l->v,Z); PhyML_Fprintf(stderr,"\n. ta=%G td=%G ra*cr=%G rd*cr=%G sd=%G",ta,td,ra,rd,SQRT(dt*nu)); /* assert(FALSE); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Bl_To_Bl(t_tree *tree) { RATES_Bl_To_Bl_Pre(tree->n_root,tree->n_root->v[2],NULL,tree); RATES_Bl_To_Bl_Pre(tree->n_root,tree->n_root->v[1],NULL,tree); /* tree->rates->cur_l[tree->n_root->v[2]->num] = tree->a_edges[tree->e_root->num]->l->v * tree->n_root_pos; */ /* tree->rates->cur_l[tree->n_root->v[1]->num] = tree->a_edges[tree->e_root->num]->l->v * (1. - tree->n_root_pos); */ tree->rates->cur_l[tree->n_root->v[2]->num] = tree->a_edges[tree->e_root->num]->l->v * 0.5; tree->rates->cur_l[tree->n_root->v[1]->num] = tree->a_edges[tree->e_root->num]->l->v * (1. - 0.5); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Bl_To_Bl_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if(b) { tree->rates->cur_l[d->num] = b->l->v; } if(d->tax) return; else { int i; for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) RATES_Bl_To_Bl_Pre(d,d->v[i],d->b[i],tree); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Bl_To_Ml(t_tree *tree) { RATES_Bl_To_Ml_Pre(tree->n_root,tree->n_root->v[2],NULL,tree); RATES_Bl_To_Ml_Pre(tree->n_root,tree->n_root->v[1],NULL,tree); tree->rates->u_ml_l[tree->e_root->num] = tree->a_edges[tree->e_root->num]->l->v; tree->rates->ml_l[tree->n_root->v[2]->num] = tree->rates->u_ml_l[tree->e_root->num] * tree->n_root_pos; tree->rates->ml_l[tree->n_root->v[1]->num] = tree->rates->u_ml_l[tree->e_root->num] * (1. - tree->n_root_pos); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Bl_To_Ml_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if(b) { tree->rates->u_ml_l[b->num] = b->l->v; tree->rates->ml_l[d->num] = b->l->v; } if(d->tax) return; else { int i; for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) RATES_Bl_To_Ml_Pre(d,d->v[i],d->b[i],tree); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Get_Cov_Matrix_Rooted(phydbl *unroot_cov, t_tree *tree) { int i,dim; dim = 2*tree->n_otu-3; RATES_Get_Cov_Matrix_Rooted_Pre(tree->n_root,tree->n_root->v[2],NULL,unroot_cov,tree); RATES_Get_Cov_Matrix_Rooted_Pre(tree->n_root,tree->n_root->v[1],NULL,unroot_cov,tree); for(i=0;irates->cov_l[i*(dim+1)+tree->n_root->v[2]->num] /= 2.; for(i=0;irates->cov_l[i*(dim+1)+tree->n_root->v[1]->num] /= 2.; for(i=0;irates->cov_l[tree->n_root->v[2]->num*(dim+1)+i] /= 2.; for(i=0;irates->cov_l[tree->n_root->v[1]->num*(dim+1)+i] /= 2.; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Get_Cov_Matrix_Rooted_Pre(t_node *a, t_node *d, t_edge *b, phydbl *cov, t_tree *tree) { int i, dim; t_node *n; dim = 2*tree->n_otu-3; n = NULL; for(i=0;ia_edges[i] != tree->e_root) { n = (tree->a_edges[i]->left->anc == tree->a_edges[i]->rght)? (tree->a_edges[i]->left): (tree->a_edges[i]->rght); if(b) { tree->rates->cov_l[d->num*(dim+1) + n->num] = cov[b->num*dim + i]; } else { tree->rates->cov_l[d->num*(dim+1) + n->num] = cov[tree->e_root->num*dim + i]; } } else { n = tree->e_root->left; if(b) tree->rates->cov_l[d->num*(dim+1) + n->num] = cov[b->num*dim + i]; else tree->rates->cov_l[d->num*(dim+1) + n->num] = cov[tree->e_root->num*dim + i]; n = tree->e_root->rght; if(b) tree->rates->cov_l[d->num*(dim+1) + n->num] = cov[b->num*dim + i]; else tree->rates->cov_l[d->num*(dim+1) + n->num] = cov[tree->e_root->num*dim + i]; } } if(d->tax) return; else { for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) RATES_Get_Cov_Matrix_Rooted_Pre(d,d->v[i],d->b[i],cov,tree); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Covariance_Mu(t_tree *tree) { int i,j; phydbl dt,var; int dim; int lca_num; dim = 2*tree->n_otu-2; for(i=0;irates->cov_r[i] = 0.0; dt = tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]; var = dt * tree->rates->nu; tree->rates->cov_r[tree->n_root->v[2]->num*dim+tree->n_root->v[2]->num] = var; dt = tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]; var = dt * tree->rates->nu; tree->rates->cov_r[tree->n_root->v[1]->num*dim+tree->n_root->v[1]->num] = var; RATES_Variance_Mu_Pre(tree->n_root,tree->n_root->v[2],tree); RATES_Variance_Mu_Pre(tree->n_root,tree->n_root->v[1],tree); for(i=0;irates->lca[i*(dim+1)+j]->num; if(lca_num < dim) { tree->rates->cov_r[i*dim+j] = tree->rates->cov_r[lca_num*dim+lca_num]; tree->rates->cov_r[j*dim+i] = tree->rates->cov_r[i*dim+j]; } else if(lca_num == dim) { tree->rates->cov_r[i*dim+j] = 0.0; tree->rates->cov_r[j*dim+i] = 0.0; } else { PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Variance_Mu_Pre(t_node *a, t_node *d, t_tree *tree) { int dim; phydbl var0; phydbl dt1,var1; phydbl dt2,var2; int i; int dir1, dir2; dim = 2*tree->n_otu-2; if(d->tax) return; dir1 = dir2 = -1; for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(dir1 < 0) dir1 = i; else dir2 = i; } } var0 = tree->rates->cov_r[d->num*dim+d->num]; dt1 = tree->times->nd_t[d->v[dir1]->num] - tree->times->nd_t[d->num]; var1 = tree->rates->nu*dt1; dt2 = tree->times->nd_t[d->v[dir2]->num] - tree->times->nd_t[d->num]; var2 = tree->rates->nu*dt2; tree->rates->cov_r[d->v[dir1]->num*dim+d->v[dir1]->num] = var0+var1; tree->rates->cov_r[d->v[dir2]->num*dim+d->v[dir2]->num] = var0+var2; for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { RATES_Variance_Mu_Pre(d,d->v[i],tree); } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RATES_Fill_Lca_Table(t_tree *tree) { int i, j, dist; int dim; dist = 0; dim = 2 * tree->n_otu - 1; for (i = 0; i < dim; i++) { for (j = i; j < dim; j++) { tree->rates->lca[i * dim + j] = Find_Lca_Pair_Of_Nodes(tree->a_nodes[i], tree->a_nodes[j], &dist, tree); tree->rates->lca[j * dim + i] = tree->rates->lca[i * dim + j]; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) /* Get V(L_{i} | L_{-i}) for all i */ void RATES_Get_Conditional_Variances(t_tree *tree) { int i,j; short int *is_1; phydbl *a; int dim; t_edge *b; phydbl *cond_mu, *cond_cov; dim = 2*tree->n_otu-3; a = tree->rates->_2n_vect1; is_1 = tree->rates->_2n_vect5; b = NULL; cond_mu = tree->rates->_2n_vect2; cond_cov = tree->rates->_2n2n_vect1; for(i=0;irates->mean_l[i] * (Uni() * 0.2 + 0.9); for(i=0;ia_edges[i]; for(j=0;jnum] = 1; For(j,dim*dim) cond_cov[j] = 0.0; for(j=0;jrates->mean_l,tree->rates->cov_l,a,dim,is_1,1,cond_mu,cond_cov); tree->rates->cond_var[b->num] = cond_cov[b->num*dim+b->num]; } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Get_All_Reg_Coeff(t_tree *tree) { int i,j; short int *is_1; phydbl *a; int dim; t_edge *b; dim = 2*tree->n_otu-3; a = tree->rates->_2n_vect1; is_1 = tree->rates->_2n_vect5; b = NULL; for(i=0;irates->mean_l[i] * (Uni() * 0.2 + 0.9); for(i=0;ia_edges[i]; for(j=0;jnum] = 1; Get_Reg_Coeff(tree->rates->mean_l,tree->rates->cov_l,a,dim,is_1,1,tree->rates->reg_coeff+b->num*dim); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) /* Get V(L_{i} | L_{-i}) for all i */ void RATES_Get_Trip_Conditional_Variances(t_tree *tree) { int i,j; short int *is_1; phydbl *a; phydbl *cond_mu, *cond_cov; t_node *n; int n_otu; a = tree->rates->_2n_vect1; is_1 = tree->rates->_2n_vect5; cond_mu = tree->rates->_2n_vect2; cond_cov = tree->rates->_2n2n_vect1; n = NULL; n_otu = tree->n_otu; For(i,2*n_otu-3) a[i] = tree->rates->mean_l[i] * (Uni() * 0.2 + 0.9); for(i=0;i<2*n_otu-2;++i) { n = tree->a_nodes[i]; if(!n->tax) { For(j,2*n_otu-3) is_1[j] = 0; is_1[n->b[0]->num] = 1; is_1[n->b[1]->num] = 1; is_1[n->b[2]->num] = 1; Normal_Conditional_Unsorted(tree->rates->mean_l,tree->rates->cov_l,a,2*n_otu-3,is_1,3,cond_mu,cond_cov); for(j=0;j<9;j++) tree->rates->trip_cond_cov[n->num*9+j] = cond_cov[j]; } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Get_All_Trip_Reg_Coeff(t_tree *tree) { int i,j; short int *is_1; phydbl *a; t_node *n; int n_otu; a = tree->rates->_2n_vect1; is_1 = tree->rates->_2n_vect5; n = NULL; n_otu = tree->n_otu; for(i=0;i<2*n_otu-3;++i) a[i] = tree->rates->mean_l[i] * (Uni() * 0.2 + 0.9); for(i=0;i<2*n_otu-2;++i) { n = tree->a_nodes[i]; if(!n->tax) { For(j,2*n_otu-3) is_1[j] = 0; is_1[n->b[0]->num] = 1; is_1[n->b[1]->num] = 1; is_1[n->b[2]->num] = 1; Get_Reg_Coeff(tree->rates->mean_l,tree->rates->cov_l,a,2*n_otu-3,is_1,3,tree->rates->trip_reg_coeff+n->num*(6*n_otu-9)); } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Check_Lk_Rates(t_tree *tree, int *err) { int i; phydbl u,u_anc; phydbl t,t_anc; *err = 0; For(i,2*tree->n_otu-2) { u = tree->rates->br_r[i]; u_anc = tree->rates->br_r[tree->a_nodes[i]->anc->num]; t = tree->times->nd_t[i]; t_anc = tree->times->nd_t[tree->a_nodes[i]->anc->num]; if(t_anc > t) { PhyML_Printf("\n. %d %d u=%f u_anc=%f t=%f t_anc=%f",i,tree->a_nodes[i]->anc->num,u,u_anc,t,t_anc); PhyML_Printf("\n. %d %d %d",tree->n_root->num,tree->n_root->v[2]->num,tree->n_root->v[1]->num); *err = 1; } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RATES_Realized_Substitution_Rate(t_tree *tree) { RATES_Update_Edge_Lengths(tree); return(Tree_Length(tree)/TIMES_Tree_Length(tree)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Expected_Tree_Length(t_tree *tree) { int n; phydbl mean; n = 0; mean = 0.0; RATES_Expected_Tree_Length_Pre(tree->n_root,tree->n_root->v[2],1.0,&mean,&n,tree); RATES_Expected_Tree_Length_Pre(tree->n_root,tree->n_root->v[1],1.0,&mean,&n,tree); if(n != 2*tree->n_otu-2) { PhyML_Fprintf(stderr,"\n. n=%d 2n-2=%d",n,2*tree->n_otu-2); PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } return mean; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Expected_Tree_Length_Pre(t_node *a, t_node *d, phydbl eranc, phydbl *mean, int *n, t_tree *tree) { phydbl erdes; int i; phydbl loc_mean; int loc_n; /* erdes = u_anc - */ /* sd*(Dnorm((tree->rates->min_rate-u_anc)/sd,.0,1.) - Dnorm((tree->rates->max_rate-u_anc)/sd,.0,1.))/ */ /* (Pnorm((tree->rates->max_rate-u_anc)/sd,.0,1.) - Pnorm((tree->rates->min_rate-u_anc)/sd,.0,1.)); */ /* erdes = Norm_Trunc_Mean(eranc,sd,tree->rates->min_rate,tree->rates->max_rate); */ erdes = 1.0; loc_mean = *mean; loc_n = *n; loc_mean *= loc_n; loc_mean += erdes; loc_mean /= (loc_n + 1); *mean = loc_mean; *n = loc_n + 1; if(d->tax) return; else for(i=0;i<3;i++) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) RATES_Expected_Tree_Length_Pre(d,d->v[i],erdes,mean,n,tree); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Sample_Average_Rate(t_node *a, t_node *d, t_tree *tree) { return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Update_Mean_Br_Len(int iter, t_tree *tree) { int i,dim; phydbl *mean; if(tree->rates->update_mean_l == NO) return; dim = 2*tree->n_otu-3; mean = tree->rates->mean_l; for(i=0;ia_edges[i]->l->v; mean[i] /= (phydbl)(iter+1); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Update_Cov_Br_Len(int iter, t_tree *tree) { int i,j,dim; phydbl *mean,*cov; if(tree->rates->update_cov_l == NO) return; dim = 2*tree->n_otu-3; mean = tree->rates->mean_l; cov = tree->rates->cov_l; for(i=0;imcmc->run; cov[i*dim+j] += tree->a_edges[i]->l->v * tree->a_edges[j]->l->v; cov[i*dim+j] /= (phydbl)(tree->mcmc->run+1); cov[i*dim+j] -= mean[i]*mean[j]; if(i == j && cov[i*dim+j] < MIN_VAR_BL) cov[i*dim+j] = MIN_VAR_BL; } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Set_Mean_L(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-3;++i) { tree->rates->mean_l[i] = tree->a_edges[i]->l->v; } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Record_Rates(t_tree *tree) { int i; if(tree->rates->br_r_recorded == YES) { PhyML_Fprintf(stderr,"\n. Overwriting recorded rates is forbidden.\n"); PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } for(i=0;i<2*tree->n_otu-2;++i) tree->rates->buff_br_r[i] = tree->rates->br_r[i]; for(i=0;i<2*tree->n_otu-1;++i) tree->rates->buff_nd_r[i] = tree->rates->nd_r[i]; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Reset_Rates(t_tree *tree) { int i; tree->rates->br_r_recorded = NO; for(i=0;i<2*tree->n_otu-2;++i) tree->rates->br_r[i] = tree->rates->buff_br_r[i]; for(i=0;i<2*tree->n_otu-1;++i) tree->rates->nd_r[i] = tree->rates->buff_nd_r[i]; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Set_Clock_And_Nu_Max(t_tree *tree) { phydbl dt,nu; phydbl min_t; int i; phydbl step; phydbl l_max; phydbl max_clock; phydbl r_max; phydbl tune; phydbl pa,pb; if(tree->rates->model_id == THORNE || tree->rates->model_id == GUINDON) { tune = 1.05; r_max = tree->rates->max_rate; l_max = tree->mod->l_max; min_t = .0; for(i=0;i<2*tree->n_otu-1;++i) if(tree->times->t_prior_min[i] < min_t) min_t = tree->times->t_prior_min[i]; dt = FABS(min_t); max_clock = l_max / dt; nu = 1.E-10; step = 1.E-1; do { do { nu += step; pa = Dnorm(0.0, 0.0,SQRT(nu*dt)); pb = Dnorm(r_max,0.0,SQRT(nu*dt)); }while(pa/pb > tune); nu -= step; step /= 10.; }while(step > 1.E-10); tree->rates->max_nu = nu; /* tree->rates->max_nu = 1.0; */ tree->rates->max_clock = max_clock; PhyML_Printf("\n. Clock rate parameter upper bound set to %f expected subst./site/time unit",tree->rates->max_clock); PhyML_Printf("\n. Autocorrelation parameter upper bound set to %f",tree->rates->max_nu); } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Set_Birth_Rate_Boundaries(t_tree *tree) { phydbl lbda; phydbl p_above_min,p_below_max; phydbl min,max; int assign = YES; min = -0.01*tree->times->t_prior_max[tree->n_root->num]; max = -100.*tree->times->t_prior_min[tree->n_root->num]; for(lbda = 0.0001; lbda < 10; lbda+=0.0001) { p_above_min = 1. - POW(1.-exp(-lbda*min),tree->n_otu); p_below_max = POW(1.-exp(-lbda*max),tree->n_otu); if(p_above_min < 1.E-10) { tree->times->birth_rate_max = lbda; break; } if(p_below_max > 1.E-10 && assign==YES) { assign = NO; tree->times->birth_rate_min = lbda; } } /* tree->times->birth_rate_min = 1.E-6; */ /* tree->times->birth_rate_max = 1.; */ PhyML_Printf("\n. Birth rate lower bound set to %f.",tree->times->birth_rate_min); PhyML_Printf("\n. Birth rate upper bound set to %f.",tree->times->birth_rate_max); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Get_Mean_Rate_In_Subtree(t_node *root, t_tree *tree) { phydbl sum; int n; sum = 0.0; n = 0; if(root->tax == NO) { if(root == tree->n_root) { RATES_Get_Mean_Rate_In_Subtree_Pre(root,root->v[2],&sum,&n,tree); RATES_Get_Mean_Rate_In_Subtree_Pre(root,root->v[1],&sum,&n,tree); } else { int i; for(i=0;i<3;i++) { if(root->v[i] != root->anc && root->b[i] != tree->e_root) { RATES_Get_Mean_Rate_In_Subtree_Pre(root,root->v[i],&sum,&n,tree); } } } return sum/(phydbl)n; } else { return 0.0; } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Get_Mean_Rate_In_Subtree_Pre(t_node *a, t_node *d, phydbl *sum, int *n, t_tree *tree) { /* (*sum) += exp(tree->rates->nd_r[d->num]); */ if(tree->rates->model_id == LOGNORMAL || tree->rates->model_id == GAMMA || tree->rates->model_id == THORNE || tree->rates->model_id == STRICTCLOCK) { (*sum) += tree->rates->br_r[d->num]; } else if(tree->rates->model_id == GUINDON) { (*sum) += tree->rates->nd_r[d->num]; } else assert(FALSE); (*n) += 1; if(d->tax == YES) return; else { int i; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { RATES_Get_Mean_Rate_In_Subtree_Pre(d,d->v[i],sum,n,tree); } } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) char *RATES_Get_Model_Name(int model) { char *s; s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); switch(model) { case GUINDON : {strcpy(s,"integrated"); break;} case THORNE : {strcpy(s,"autocorrelated"); break;} case LOGNORMAL : {strcpy(s,"uncorrelated"); break;} case GAMMA : {strcpy(s,"uncorrelated"); break;} case STRICTCLOCK : {strcpy(s,"strict clock"); break;} default : { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); break; } } return s; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) int RATES_Check_Edge_Length_Consistency(t_tree *mixt_tree) { int i; t_tree *tree; tree = mixt_tree; do { if(tree->is_mixt_tree == YES) tree = tree->next; for(i=0;i<2*tree->n_otu-3;++i) { if(tree->a_edges[i]->left->anc == tree->a_edges[i]->rght) { if(Are_Equal(tree->rates->cur_l[tree->a_edges[i]->left->num], tree->a_edges[i]->l->v, 1.E-5) == NO) { PhyML_Fprintf(stderr,"\n. cur_l: %G l: %G is_root: %d", tree->rates->cur_l[tree->a_edges[i]->left->num], tree->a_edges[i]->l->v, tree->a_edges[i] == tree->e_root); return 0; } } if(tree->a_edges[i]->rght->anc == tree->a_edges[i]->left) { if(Are_Equal(tree->rates->cur_l[tree->a_edges[i]->rght->num], tree->a_edges[i]->l->v, 1.E-5) == NO) { PhyML_Fprintf(stderr,"\n. cur_l: %G l: %G is_root: %d", tree->rates->cur_l[tree->a_edges[i]->rght->num], tree->a_edges[i]->l->v, tree->a_edges[i] == tree->e_root); return 0; } } } tree = tree->next; } while(tree); return 1; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) phydbl RATES_Mean_Rate_Multiplier(t_tree *tree) { int i; phydbl mean; mean = 0.0; for(i=0;i<2*tree->n_otu-2;++i) { assert(tree->a_nodes[i] != tree->n_root); /* mean += tree->rates->norm_fact * tree->rates->br_r[tree->a_nodes[i]->num]; */ mean += tree->rates->br_r[tree->a_nodes[i]->num]; } return(mean / (2*tree->n_otu-2)); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined PHYREX || PHYTIME || PHYREXSIM) void RATES_Swap_Rates(t_node *x, t_node *y, t_tree *tree) { phydbl buff; buff = tree->rates->br_r[x->num]; tree->rates->br_r[x->num] = tree->rates->br_r[y->num]; tree->rates->br_r[y->num] = buff; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/rates.h000066400000000000000000000255771501136442400205000ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef RATES_H #define RATES_H #include "utilities.h" #include "spr.h" #include "lk.h" #include "optimiz.h" #include "bionj.h" #include "models.h" #include "free.h" #include "help.h" #include "simu.h" #include "eigen.h" #include "pars.h" #include "alrt.h" #include "time.h" #include "m4.h" #include "draw.h" #include "mcmc.h" #include "stats.h" void RATES_Monte_Carlo_Mean_Rates(t_tree *tree); void RATES_Monte_Carlo_Mean_Rates_Pre(t_node *a, t_node *d, t_edge *b, phydbl curr_rate, t_tree *tree); void RATES_Print_Rates(t_tree *tree); void RATES_Print_Rates_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); t_rate *RATES_Make_Rate_Struct(int n_otu); void RATES_Init_Rate_Struct(t_rate *rates, t_rate *existing_rates, int n_otu); void RATES_Classify_Branches(t_tree *tree); void RATES_Adjust_Rates(t_tree *tree); void RATES_Adjust_Rates_Local_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void RATES_Adjust_Rates_Local(t_node *a, t_node *d, t_edge *b1, t_tree *tree); void RATES_Record_T(t_tree *tree); void RATES_Restore_T(t_tree *tree); void RATES_Monte_Carlo_Mean_Rates_Core(phydbl t_lim_sup, phydbl t_lim_inf, phydbl *curr_rate, phydbl *mean_rate, phydbl lexp, phydbl alpha); phydbl RATES_Lk(t_tree *tree); void RATES_Lk_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void RATES_Fill_Node_Rates_Pre(t_node *a, t_node *d, t_edge *b, phydbl *node_r, t_tree *tree); void RATES_Fill_Node_Rates(phydbl *node_r, t_tree *tree); void RATES_Optimize_Node_Times_Serie_Fixed_Br_Len(t_node *a, t_node *d, t_tree *tree); void RATES_Optimize_Lexp(t_tree *tree); void RATES_Round_Optimize(t_tree *tree); void RATES_Optimize_Lexp(t_tree *tree); void RATES_Optimize_Alpha(t_tree *tree); phydbl RATES_Dmu(phydbl mu, int n_jumps, phydbl dt, phydbl a, phydbl b, phydbl lexp, int min_n, int jps_dens); phydbl RATES_Dr_X_Dx(phydbl r, phydbl mu, phydbl y, phydbl dt, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu_Given_Y_Trpzd(phydbl mu, phydbl y, phydbl dt, phydbl a, phydbl b, phydbl lexp, int nsteps, phydbl beg, phydbl end, phydbl prevs); phydbl RATES_Dmu_Given_Y_Std(phydbl mu, phydbl y, phydbl dt, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu_Given_Y_Romb(phydbl mu, phydbl y, phydbl dt, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu_Given_Y(phydbl mu, phydbl y, phydbl dt, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dy_Given_Mu(phydbl mu, phydbl y, phydbl dt, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu2_Given_Y_X_Dy_Given_Mu1(phydbl mu1, phydbl mu2, phydbl y, phydbl dt1, phydbl dt2, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu2_Given_Mu1_Trpz(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, phydbl a, phydbl b, phydbl lexp, int nsteps, phydbl beg, phydbl end, phydbl prevs); phydbl RATES_Dmu2_And_Mu1(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu2_Given_Mu1(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu2_Given_Mu1_Romb(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, phydbl a, phydbl b, phydbl lexp); void RATES_Random_Branch_Lengths(t_tree *tree); void RATES_Bracket_N_Jumps(int *up, int *down, phydbl param); void RATES_Set_Node_Times(t_tree *tree); void RATES_Set_Node_Times_Pre(t_node *a, t_node *d, t_tree *tree); void RATES_Optimize_Node_Times(t_tree *tree); phydbl RATES_Exp_Y(phydbl mu1, phydbl mu2, phydbl dt1, phydbl lexp); phydbl RATES_Dmu2_Given_Mu1_Bis(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, phydbl alpha, phydbl beta, phydbl lexp); void RATES_Replace_Br_Lengths_By_Rates_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void RATES_Replace_Br_Lengths_By_Rates(t_tree *tree); void RATES_Get_Mean_Rates(t_tree *tree); void RATES_Get_Mean_Rates_Pre(t_node *a, t_node *d, t_edge *b, phydbl r_a, t_tree *tree); void RATES_Expect_Number_Subst(phydbl t_beg, phydbl t_end, phydbl r_beg, int *n_jumps, phydbl *mean_r, phydbl *r_end, t_rate *rates, t_tree *tree); void RATES_Optimize_Clock_Rate(t_tree *tree); phydbl RATES_Dmu1_Given_Lbda_And_Mu2(phydbl lbda, phydbl mu1, phydbl mu2, phydbl alpha, phydbl beta); phydbl RATES_Dmu1_And_Mu2_One_Jump_Trpz(phydbl mu1, phydbl mu2, phydbl a, phydbl b, int nsteps, phydbl beg, phydbl end, phydbl prevs); phydbl RATES_Dmu1_And_Mu2_One_Jump_One_Interval(phydbl mu1, phydbl mu2, phydbl a, phydbl b); phydbl RATES_Dmu1_And_Mu2_One_Jump_Two_Intervals(phydbl dt1, phydbl dt2, phydbl mu1, phydbl mu2, phydbl a, phydbl b); phydbl RATES_Dmu1_And_Mu2_One_Jump_Old(phydbl mu1, phydbl mu2, phydbl a, phydbl b); phydbl RATES_Dmu2_And_Min_N_Given_Mu1(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, int n_min, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu2_And_Mu1_Given_N(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, int n, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Lk_Core(phydbl br_r_a, phydbl br_r_d, phydbl nd_r_a, phydbl nd_r_d, int n_a, int n_d, phydbl dt_a, phydbl dt_d, t_tree *tree); void RATES_Init_Triplets(t_tree *tree); phydbl RATES_Lk_Change_One_Time(t_node *n, phydbl new_t, t_tree *tree); void RATES_Update_Triplet(t_node *n, t_tree *tree); void RATES_Print_Triplets(t_tree *tree); phydbl RATES_Lk_Change_One_Rate(t_node *d, phydbl new_rate, t_tree *tree); phydbl RATES_Dmu2_And_Mu1_Given_Min_N(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, int n_min, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu2_And_Mu1_Given_N_Normal(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, int n, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Coeff_Corr(phydbl alpha, phydbl beta, int n1, int n2); phydbl RATES_Dmu2_And_Mu1_Given_N_Full(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, int n, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu1_Given_V_And_N(phydbl mu1, phydbl v, int n, phydbl dt1, phydbl a, phydbl b); phydbl RATES_Yule(t_tree *tree); phydbl RATES_Check_Mean_Rates(t_tree *tree); void RATES_Check_Mean_Rates_Pre(t_node *a, t_node *d, t_edge *b, phydbl *sum, t_tree *tree); void RATES_Discretize_Rates(t_tree *tree); void RATES_Discretize_Rates_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); phydbl RATES_Dmu_Given_V_And_MinN(phydbl mu, phydbl dt, phydbl v, int minn, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Dmu_One(phydbl mu, phydbl dt, phydbl a, phydbl b, phydbl lexp); phydbl RATES_Compound_Core(phydbl mu1, phydbl mu2, int n1, int n2, phydbl dt1, phydbl dt2, phydbl alpha, phydbl beta, phydbl lexp, phydbl eps, int approx); void RATES_Record_Rates(t_tree *tree); void RATES_Reset_Rates(t_tree *tree); void RATES_Update_T_Rates_Pre(t_node *a, t_node *d, t_tree *tree); void RATES_Update_T_Rates(t_tree *tree); void RATES_Get_Rates_From_Bl(t_tree *tree); phydbl RATES_Compound_Core_Joint(phydbl mu1, phydbl mu2, int n1, int n2, phydbl dt1, phydbl dt2, phydbl alpha, phydbl beta, phydbl lexp, phydbl eps, int approx); phydbl RATES_Dmu_Joint(phydbl mu, int n, phydbl dt, phydbl a, phydbl b, phydbl lexp, int min_n); phydbl RATES_Compound_Core_Marginal(phydbl mu1, phydbl mu2, phydbl dt1, phydbl dt2, phydbl alpha, phydbl beta, phydbl lexp, phydbl eps, int approx); phydbl RATES_Lk_Jumps(t_tree *tree); void RATES_Posterior_Rates(t_tree *tree); void RATES_Posterior_One_Rate(t_node *a, t_node *d, int traversal, t_tree *tree); void RATES_Free_Rates(t_rate *rates); void RATES_Initialize_True_Rates(t_tree *tree); void RATES_Posterior_Times(t_tree *tree); void RATES_Posterior_One_Time(t_node *a, t_node *d, int traversal, t_tree *tree); void RATES_Update_Edge_Lengths(t_tree *tree); void RATES_Update_Edge_Lengths_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void RATES_Get_Cov_Matrix_Rooted(phydbl *unroot_cov, t_tree *tree); void RATES_Get_Cov_Matrix_Rooted_Pre(t_node *a, t_node *d, t_edge *b, phydbl *cov, t_tree *tree); void RATES_Bl_To_Ml(t_tree *tree); void RATES_Bl_To_Ml_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); int RATES_Check_Node_Times(t_tree *tree); void RATES_Check_Node_Times_Pre(t_node *a, t_node *d, int *err, t_tree *tree); void RATES_Covariance_Mu(t_tree *tree); void RATES_Variance_Mu_Pre(t_node *a, t_node *d, t_tree *tree); void RATES_Fill_Lca_Table(t_tree *tree); void RATES_Posterior_Clock_Rate(t_tree *tree); void RATES_Get_Conditional_Variances(t_tree *tree); void RATES_Get_All_Reg_Coeff(t_tree *tree); void RATES_Posterior_Time_Root(t_tree *tree); void RATES_Get_Trip_Conditional_Variances(t_tree *tree); void RATES_Get_All_Trip_Reg_Coeff(t_tree *tree); void RATES_Check_Lk_Rates(t_tree *tree, int *err); phydbl RATES_Expected_Tree_Length(t_tree *tree); void RATES_Expected_Tree_Length_Pre(t_node *a, t_node *d, phydbl eranc, phydbl *mean, int *n, t_tree *tree); void RATES_Normalise_Rates(t_tree *tree); phydbl RATES_Check_Mean_Rates_True(t_tree *tree); phydbl RATES_Find_Min_Dt_Bisec(phydbl r0, phydbl r1, phydbl t0, phydbl t1, phydbl nu, phydbl threshp, int inf); phydbl RATES_Find_Max_Dt_Bisec(phydbl r0, phydbl r1, phydbl t0, phydbl t1, phydbl nu, phydbl threshp, int inf); void RATES_Min_Max_Interval(phydbl u0, phydbl u1, phydbl u2, phydbl u3, phydbl t0, phydbl t2, phydbl t3, phydbl *t_min, phydbl *t_max, phydbl nu, phydbl p_thresh, t_tree *tree); phydbl RATES_Get_Correction_Factor(phydbl mode, phydbl sd, int *err, t_tree *tree); phydbl RATES_Average_Substitution_Rate(t_tree *tree); void RATES_Update_Norm_Fact(t_tree *tree); void RATES_Update_Mean_Br_Len(int iter, t_tree *tree); void RATES_Update_Cov_Br_Len(int iter, t_tree *tree); void RATES_Set_Mean_L(t_tree *tree); void RATES_Fill_All_Param(t_rate *rate, t_tree *tree); void RATES_Record_Rates(t_tree *tree); void RATES_Reset_Rates(t_tree *tree); phydbl RATES_Average_Rate(t_tree *tree); void RATES_Set_Clock_And_Nu_Max(t_tree *tree); phydbl RATES_Lk_Linreg(t_tree *tree); phydbl RATES_Get_Mean_Rate_In_Subtree(t_node *root, t_tree *tree); void RATES_Get_Mean_Rate_In_Subtree_Pre(t_node *a, t_node *d, phydbl *sum, int *n, t_tree *tree); char *RATES_Get_Model_Name(int model); void RATES_Get_Survival_Ranks(t_tree *tree); void RATES_Bl_To_Bl(t_tree *tree); void RATES_Bl_To_Bl_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void RATES_Set_Birth_Rate_Boundaries(t_tree *tree); void RATES_Copy_Rate_Struct(t_rate *from, t_rate *to, int n_otu); void RATES_Duplicate_Calib_Struct(t_tree *from, t_tree *to); int RATES_Check_Edge_Length_Consistency(t_tree *tree); phydbl RATES_Realized_Substitution_Rate(t_tree *tree); void RATES_Update_One_Edge_Length(t_edge *b, t_tree *tree); void RATES_Check_Rates(t_tree *tree); void RATES_Update_Normalization_Factor(t_tree *tree); phydbl RATES_Clock_R_Prior(t_tree *tree); phydbl RATES_Prior(t_tree *tree); void RATES_Update_One_Edge_Length_Core(t_edge *b, t_tree *tree); phydbl RATES_Autocor_Prior(t_tree *tree); void RATES_Normalize_Rates(t_tree *tree); phydbl RATES_Mean_Rate_Multiplier(t_tree *tree); void RATES_Swap_Rates(t_node *x, t_node *y, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/rrw.c000066400000000000000000001004471501136442400201550ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "rrw.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Relaxed random walk log-likelihood + log-prior densities for relative diffusion rates on every edge */ phydbl RRW_Lk(t_tree *tree) { phydbl d_fwd; if(tree->mmod->integrateAncestralLocations == YES) { tree->mmod->c_lnL = RRW_Integrated_Lk(tree); } else { d_fwd = UNLIKELY; assert(RRW_Is_Rw(tree->mmod) == YES); RRW_Update_Normalization_Factor(tree); d_fwd = RRW_Forward_Lk_Range(tree->young_disk,NULL,tree); #ifdef PHYREX if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) { tree->mmod->c_lnL = UNLIKELY; return(UNLIKELY); } #endif tree->mmod->c_lnL = d_fwd; } return(tree->mmod->c_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Prior(t_tree *tree) { tree->mmod->c_lnP = RW_Prior_Sigsq(tree) + RRW_Prior_Sigsq_Scale(tree); return(tree->mmod->c_lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Relaxed random walk log-likelihood + log-prior densities for relative diffusion rates on a range of disks */ phydbl RRW_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree) { RRW_Update_Normalization_Factor(tree); return(RRW_Forward_Lk_Range(young,old,tree)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Forward_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree) { phydbl lnP,disk_lnP; t_dsk *disk; disk_lnP = 0.0; lnP = 0.0; disk = young; do { disk_lnP = RRW_Lk_Core(disk,tree); lnP += disk_lnP; if(old && disk == old) break; disk = disk->prev; } while(disk); return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Prior_Sigsq_Scale(t_tree *tree) { phydbl lnP,sd; int err; if(tree->mmod->sigsq_scale == NULL) return(-1.); lnP = 0.0; err = NO; sd = tree->mmod->rrw_prior_sd; // Value of hyper-prior governing the variance of relative dispersal rates across lineages if(tree->mmod->model_id == RW) return(-1.0); PhyML_Printf("\n . rrw_prior_sd: %f",tree->mmod->rrw_prior_sd); for(int i=0;i<2*tree->n_otu-2;++i) { if(tree->mmod->model_id == RRW_GAMMA) { lnP += log(Dgamma(tree->mmod->sigsq_scale[i],1./sd,sd)); } else if(tree->mmod->model_id == RRW_LOGNORMAL) { lnP += Log_Dnorm(log(tree->mmod->sigsq_scale[i]),-sd*sd/2.,sd,&err); lnP -= log(tree->mmod->sigsq_scale[i]); } } return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Lk_Core(t_dsk *disk, t_tree *tree) { phydbl lnP; int i; assert(disk); if(disk == tree->young_disk) return 0.0; if(disk->age_fixed == YES) return 0.0; lnP = 0.0; if(disk->ldsk != NULL) { for(i=0;ildsk->n_next;++i) { lnP += RRW_Forward_Lk_Path(disk->ldsk,disk->ldsk->next[i],tree); } } return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Forward_Lk_Path(t_ldsk *a, t_ldsk *d, t_tree *tree) { t_ldsk *ldsk; phydbl lnP,ld,la,disk_lnP,sd,dt; int i,err; t_node *nd_d; assert(a != NULL); assert(d != NULL); lnP = 0.0; ldsk = d; while(ldsk->n_next == 1) ldsk = ldsk->next[0]; nd_d = ldsk->nd; ldsk = d; assert(a!=d); do { assert(ldsk->prev); disk_lnP = 0.0; for(i=0;immod->n_dim;++i) { dt = fabs(ldsk->disk->time-ldsk->prev->disk->time); sd = log(tree->mmod->sigsq[i]) + log(tree->mmod->sigsq_scale[nd_d->num]) + log(tree->mmod->sigsq_scale_norm_fact) + log(dt); sd = sqrt(exp(sd)); ld = ldsk->coord->lonlat[i]; la = ldsk->prev->coord->lonlat[i]; disk_lnP += Log_Dnorm(ld,la,sd,&err); if(isinf(lnP) || isnan(lnP)) return(UNLIKELY); if(isnan(lnP)) { PhyML_Printf("\n. la=%f ld=%f sd=%f dt=[%f,%f] sigsq=%f",la,ld,sd,ldsk->disk->time,ldsk->prev->disk->time,tree->mmod->sigsq); assert(FALSE); } /* PhyML_Printf("\n. RRW_PATH time: %12f (%12f) disk_lnP: %12f sd: %12f [%12f %12f] [%12f %12f %12f %12f] %12f", */ /* ldsk->disk->time,ldsk->prev->disk->time, */ /* disk_lnP, */ /* sd, */ /* ld,la, */ /* tree->mmod->sigsq[i], */ /* tree->mmod->sigsq_scale[nd_d->num], */ /* tree->mmod->sigsq_scale_norm_fact, */ /* ldsk->disk->time-ldsk->prev->disk->time,Log_Dnorm(ld,la,sd,&err)); */ } lnP += disk_lnP; ldsk = ldsk->prev; assert(ldsk); } while(ldsk != a); return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Independent_Contrasts(t_tree *tree) { phydbl lnL; RRW_Update_Normalization_Factor(tree); TIMES_Record_Times(tree); RRW_Rescale_Times(YES,tree); lnL = RW_Independent_Contrasts(tree); TIMES_Reset_Times(tree); return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Rescale_Times(int prod, t_tree *tree) { RRW_Rescale_Times_Pre(tree->n_root,tree->n_root->v[1],tree->times->nd_t[tree->n_root->num],prod,tree); RRW_Rescale_Times_Pre(tree->n_root,tree->n_root->v[2],tree->times->nd_t[tree->n_root->num],prod,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Rescale_Times_Pre(t_node *a, t_node *d, phydbl cur_ta, int prod, t_tree *tree) { phydbl ta,td; int i; td = tree->times->nd_t[d->num]; ta = tree->times->nd_t[a->num]; assert(!(cur_ta > td)); if(prod == YES) tree->times->nd_t[d->num] = ta + (td-cur_ta) * (tree->mmod->sigsq_scale[d->num] * tree->mmod->sigsq_scale_norm_fact); else tree->times->nd_t[d->num] = ta + (td-cur_ta) / (tree->mmod->sigsq_scale[d->num] * tree->mmod->sigsq_scale_norm_fact); assert(!(tree->times->nd_t[d->num] < ta)); if(d->tax == YES) return; else for(i=0;i<3;++i) if(d->v[i] != a && d->b[i] != tree->e_root) RRW_Rescale_Times_Pre(d,d->v[i],td,prod,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Density_Ldsk_Location(t_ldsk *l, phydbl rad, int dim_idx, int child_only, t_tree *tree) { phydbl dta,dtd,sd,c,sumd,sum; int err,i; err = NO; if(l->prev != NULL && l->next != NULL) { dta = fabs(l->prev->disk->time - l->disk->time); if(child_only == YES) dta = TWO_TO_THE_LARGE; if(dtan_next;++i) { dtd = fabs(l->disk->time - l->next[i]->disk->time); sumd += dtd; } sum = 0.0; for(i=0;in_next;++i) { dtd = fabs(l->disk->time - l->next[i]->disk->time); sum += exp(-dtd/sumd); } c = 0.0; sd = 0.0; for(i=0;in_next;++i) { dtd = fabs(l->disk->time - l->next[i]->disk->time); /* c += (1./(phydbl)l->n_next)*((dtd/(dta+dtd))*l->prev->coord->lonlat[dim_idx] + (dta/(dta+dtd))*l->next[i]->coord->lonlat[dim_idx]); */ /* sd += (1./(phydbl)l->n_next)*sqrt((dta*dtd)/(dta+dtd)*rad); */ c += (exp(-dtd/sumd)/sum)*((dtd/(dta+dtd))*l->prev->coord->lonlat[dim_idx] + (dta/(dta+dtd))*l->next[i]->coord->lonlat[dim_idx]); sd += (exp(-dtd/sumd)/sum)*sqrt((dta*dtd)/(dta+dtd)*rad); } assert((isnan(c) && isnan(sd)) == false); /* PhyML_Printf("\n. loc: %f c: %f sd: %f dens=%f",l->coord->lonlat[dim_idx],c,sd,Log_Dnorm(l->coord->lonlat[dim_idx],c,sd,&err)); */ return(Log_Dnorm(l->coord->lonlat[dim_idx],c,sd,&err)); } else if(l->prev == NULL && l->next != NULL) { sd = sqrt(rad); c = l->coord->lonlat[dim_idx]; return(Log_Dnorm(l->coord->lonlat[dim_idx],c,sd,&err)); } else if(l->prev != NULL && l->next == NULL) { sd = sqrt(rad); c = l->coord->lonlat[dim_idx]; return(Log_Dnorm(l->coord->lonlat[dim_idx],c,sd,&err)); } else assert(false); assert(err == NO); return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Generate_Ldsk_New_Location(t_ldsk *l, phydbl rad, int dim_idx, int child_only, t_tree *tree) { phydbl dta,dtd,sd,c,new_loc,sum,sumd; int err,i; err = NO; if(l->prev != NULL && l->next != NULL) { dta = fabs(l->prev->disk->time - l->disk->time); if(child_only == YES) dta = TWO_TO_THE_LARGE; if(dtacoord->lonlat[dim_idx] = l->prev->coord->lonlat[dim_idx]; return; } sumd = 0.0; for(i=0;in_next;++i) { dtd = fabs(l->disk->time - l->next[i]->disk->time); sumd += dtd; } sum = 0.0; for(i=0;in_next;++i) { dtd = fabs(l->disk->time - l->next[i]->disk->time); sum += exp(-dtd/sumd); } c = 0.0; sd = 0.0; for(i=0;in_next;++i) { dtd = fabs(l->disk->time - l->next[i]->disk->time); c += (exp(-dtd/sumd)/sum)*((dtd/(dta+dtd))*l->prev->coord->lonlat[dim_idx] + (dta/(dta+dtd))*l->next[i]->coord->lonlat[dim_idx]); sd += (exp(-dtd/sumd)/sum)*sqrt((dta*dtd)/(dta+dtd)*rad); /* c += (1./(phydbl)l->n_next)*((dtd/(dta+dtd))*l->prev->coord->lonlat[dim_idx] + (dta/(dta+dtd))*l->next[i]->coord->lonlat[dim_idx]); */ /* sd += (1./(phydbl)l->n_next)*sqrt((dta*dtd)/(dta+dtd)*rad); */ } assert((isnan(c) && isnan(sd)) == false); new_loc = Rnorm(c,sd); l->coord->lonlat[dim_idx] = new_loc; } else if(l->prev == NULL && l->next != NULL) { sd = sqrt(rad); c = l->coord->lonlat[dim_idx]; new_loc = Rnorm(c,sd); l->coord->lonlat[dim_idx] = new_loc; } else if(l->prev != NULL && l->next == NULL) { sd = sqrt(rad); c = l->coord->lonlat[dim_idx]; new_loc = Rnorm(c,sd); l->coord->lonlat[dim_idx] = new_loc; } else assert(false); assert(err == NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// short int RRW_Is_Rw(t_phyrex_mod *mod) { if(mod->model_id == RW || mod->model_id == RRW_GAMMA || mod->model_id == RRW_LOGNORMAL) return(YES); return(NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Update_Normalization_Factor(t_tree *tree) { /* !!!!!!!!!!!!!!!!!!!!! */ tree->mmod->sigsq_scale_norm_fact = 1.0; /* phydbl dt,rdt,T,RT; */ /* int i; */ /* rdt = 0.0; */ /* dt = 0.0; */ /* T = 0.0; */ /* RT = 0.0; */ /* for(i=0;i<2*tree->n_otu-2;++i) */ /* { */ /* assert(tree->a_nodes[i] != tree->n_root); */ /* dt = fabs(tree->times->nd_t[i] - tree->times->nd_t[tree->a_nodes[i]->anc->num]); */ /* rdt = dt*tree->mmod->sigsq_scale[tree->a_nodes[i]->num]; */ /* T+=dt; */ /* RT+=rdt; */ /* } */ /* tree->mmod->sigsq_scale_norm_fact = T/RT; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Mean_Displacement_Rate(t_tree *tree) { phydbl dt,disp; disp = 0.0; dt = 0.0; for(int i=0;i<2*tree->n_otu-2;++i) { assert(tree->a_nodes[i] != tree->n_root); dt += fabs(tree->times->nd_t[i] - tree->times->nd_t[tree->a_nodes[i]->anc->num]); disp += fabs(tree->times->nd_t[i] - tree->times->nd_t[tree->a_nodes[i]->anc->num]) * tree->mmod->sigsq_scale[tree->a_nodes[i]->num]* (tree->mmod->sigsq[0]+tree->mmod->sigsq[1])* tree->mmod->sigsq_scale_norm_fact; } return(disp/dt); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Generate(t_tree *tree) { t_ldsk *ldsk; t_dsk *disk; int i,j; ldsk = tree->n_root->ldsk; disk = tree->n_root->ldsk->disk; for(j=0;jmmod->n_dim;++j) ldsk->coord->lonlat[j] = 0.5*(tree->mmod->lim_up->lonlat[j] + tree->mmod->lim_do->lonlat[j]);; /* disk = disk->next; */ do { if(disk->ldsk != NULL) { ldsk = disk->ldsk; for(i=0;in_next;++i) { for(j=0;jmmod->n_dim;++j) { ldsk->next[i]->coord->lonlat[j] = Rnorm(ldsk->coord->lonlat[j], sqrt((ldsk->next[i]->disk->time - ldsk->disk->time)*tree->mmod->sigsq[j])); } } } disk = disk->next; } while(disk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Sample_Arealin_Plot(t_tree *tree) { int i,j; t_ldsk *ldsk; t_dsk *disk; t_geo_coord **coord_array; coord_array = (t_geo_coord **)mCalloc(tree->n_otu,sizeof(t_geo_coord *)); for(j=0;jn_otu;++j) { coord_array[j] = GEO_Make_Geo_Coord(tree->mmod->n_dim); GEO_Init_Coord(coord_array[j],tree->mmod->n_dim); } RRW_Update_Normalization_Factor(tree); Init_Contmod_Locations(tree); for(i=0;immod->n_dim;++i) { RRW_Integrated_Lk_Location_Post(NULL,tree->n_root,tree); RRW_Integrated_Lk_Location_Pre(tree->n_root,tree->n_root->v[1],tree); RRW_Integrated_Lk_Location_Pre(tree->n_root,tree->n_root->v[2],tree); } /* Sample location on every ldsk */ disk = tree->young_disk; do { for(j=0;jn_ldsk_a;++j) { if(disk->ldsk_a[j] == disk->ldsk) { assert(disk->ldsk->nd != NULL && disk->ldsk->nd->tax == NO); for(i=0;immod->n_dim;++i) { coord_array[j]->lonlat[i] = Sample_Ancestral_Trait_Contmod(disk->ldsk->nd->anc, disk->ldsk->nd, fabs(tree->times->nd_t[disk->ldsk->nd->anc->num]-tree->times->nd_t[disk->ldsk->nd->num]), 0.0, log(tree->mmod->sigsq[i]) + log(tree->mmod->sigsq_scale[disk->ldsk->nd->num]) + log(tree->mmod->sigsq_scale_norm_fact), NO, tree); } } else if(disk->age_fixed == NO || (disk->age_fixed == YES && disk->ldsk_a[j]->disk != disk)) { t_ldsk *ldsk_a,*ldsk_d; ldsk_a = NULL; ldsk_d = NULL; ldsk = disk->ldsk_a[j]; do ldsk = ldsk->prev; while(ldsk->nd == NULL); ldsk_a = ldsk; ldsk_d = disk->ldsk_a[j]; assert(ldsk_d->nd != NULL); for(i=0;immod->n_dim;++i) { coord_array[j]->lonlat[i] = Sample_Ancestral_Trait_Contmod(ldsk_a->nd, ldsk_d->nd, fabs(disk->time-tree->times->nd_t[ldsk_a->nd->num]), fabs(disk->time-tree->times->nd_t[ldsk_d->nd->num]), log(tree->mmod->sigsq[i]) + log(tree->mmod->sigsq_scale[ldsk_d->nd->num]) + log(tree->mmod->sigsq_scale_norm_fact), NO, tree); } } else { assert(disk->age_fixed == YES); for(i=0;immod->n_dim;++i) coord_array[j]->lonlat[i] = disk->ldsk_a[j]->coord->lonlat[i]; } } /* Get barycenter, radius and then area for every disk */ phydbl max_dist,dist; t_geo_coord *barycentr; /* PhyML_Printf("\n<> "); */ barycentr = GEO_Make_Geo_Coord(tree->mmod->n_dim); GEO_Init_Coord(barycentr,tree->mmod->n_dim); for(i=0;immod->n_dim;++i) { barycentr->lonlat[i] = 0.0; for(j=0;jn_ldsk_a;++j) barycentr->lonlat[i] += coord_array[j]->lonlat[i]; barycentr->lonlat[i] /= disk->n_ldsk_a; } max_dist = -1.; dist = -1.; for(j=0;jn_ldsk_a;++j) { dist = Euclidean_Distance(barycentr,coord_array[j]); if(dist > max_dist) max_dist = dist; } assert(!(max_dist < 0.0)); /* PhyML_Printf("(%f;%f;%d)",area,disk->time,disk->n_ldsk_a); */ Free_Geo_Coord(barycentr); disk = disk->prev; } while(disk); for(j=0;jn_otu;++j) Free_Geo_Coord(coord_array[j]); Free(coord_array); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Sample_Node_Locations_Joint(t_tree *tree) { int i,start; phydbl root_var, root_mean, var, mean; root_var = tree->mmod->rw_root_var[LOCATION]; root_mean = -BIG; RRW_Update_Normalization_Factor(tree); Init_Contmod_Locations(tree); RRW_Integrated_Lk_Location_Post(NULL, tree->n_root, tree); for(i=0;immod->n_dim;++i) { start = Contmod_Start(LOCATION,i,tree); var = 1./tree->contmod->var_down[start+tree->n_root->num] + 1./root_var; var = 1./var; root_mean = LOCATION_Mean_Lonlat(i,tree); mean = (tree->contmod->mu_down[start+tree->n_root->num]/tree->contmod->var_down[start+tree->n_root->num] + root_mean / root_var)*var; tree->n_root->ldsk->coord->lonlat[i] = Rnorm(mean,sqrt(var)); assert(isnan(tree->contmod->var_down[start + tree->n_root->num]) == NO); } RRW_Sample_Node_Locations_Joint_Post(tree->n_root, tree->n_root->v[1], tree); RRW_Sample_Node_Locations_Joint_Post(tree->n_root, tree->n_root->v[2], tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Sample_Node_Locations_Joint_Post(t_node *a, t_node *d, t_tree *tree) { if(d->tax == TRUE) return; else { int start, i; phydbl son_a, son_b, son_var, son_var_down, son_mu, son_mu_down, var, mean; for (int i = 0; i < 3; ++i) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) RRW_Sample_Node_Locations_Joint_Post(d, d->v[i], tree); for (i = 0; i < tree->mmod->n_dim; ++i) { start = Contmod_Start(LOCATION, i, tree); son_a = 1.0; son_b = 0.0; son_var = RRW_Location_Variance_Along_Edge(d, i, tree); son_var_down = tree->contmod->var_down[start + d->num]; son_mu = son_a * a->ldsk->coord->lonlat[i] + son_b; son_mu_down = tree->contmod->mu_down[start + d->num]; if (son_var > SMALL && son_var_down > SMALL) { var = 1. / son_var + 1. / son_var_down; var = 1. / var; mean = (son_mu_down / son_var_down + son_mu / son_var) * var; } else if (son_var_down > SMALL) { var = 0.0; mean = son_mu; } else if (son_var > SMALL) { var = 0.0; mean = son_mu_down; } else { var = 0.0; mean = son_mu; } assert(!(var < 0.0)); d->ldsk->coord->lonlat[i] = Rnorm(mean, sqrt(var)); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Sample_Node_Locations_Marginal(t_tree *tree) { int i,j,start; t_node *n; phydbl var,mean; phydbl root_var, root_mean; n = NULL; var = mean = -1; root_var = tree->mmod->rw_root_var[LOCATION]; root_mean = -BIG; RRW_Update_Normalization_Factor(tree); Init_Contmod_Locations(tree); RRW_Integrated_Lk_Location_Post(NULL, tree->n_root, tree); RRW_Integrated_Lk_Location_Pre(tree->n_root, tree->n_root->v[1], tree); RRW_Integrated_Lk_Location_Pre(tree->n_root, tree->n_root->v[2], tree); for(i=0;immod->n_dim;++i) { start = Contmod_Start(LOCATION,i,tree); for(j=0;j<2*tree->n_otu-2;++j) { if(tree->a_nodes[j]->tax == NO && tree->a_nodes[j] != tree->n_root) { n = tree->a_nodes[j]; if(tree->contmod->var_down[start+n->num] > SMALL && tree->contmod->var_up[start+n->num] > SMALL) { var = 1./tree->contmod->var_down[start+n->num] + 1. / tree->contmod->var_up[start+n->num]; var = 1./var; mean = (tree->contmod->mu_down[start+n->num]/tree->contmod->var_down[start+n->num] + tree->contmod->mu_up[start+n->num]/tree->contmod->var_up[start+n->num])*var; } else if(tree->contmod->var_down[start+n->num] > SMALL) { var = 0.0; mean = tree->contmod->mu_up[start+n->num]; } else if(tree->contmod->var_up[start+n->num] > SMALL) { var = 0.0; mean = tree->contmod->mu_down[start+n->num]; } else { var = 0.0; mean = tree->contmod->mu_down[start+n->num]; } /* Below is only valid if prior distribution of location at that node is flat */ tree->a_nodes[j]->ldsk->coord->lonlat[i] = Rnorm(mean,sqrt(var)); } } assert(isnan(tree->contmod->var_down[start+tree->n_root->num]) == NO); var = 1./tree->contmod->var_down[start+tree->n_root->num] + 1./root_var; var = 1./var; root_mean = LOCATION_Mean_Lonlat(i,tree); mean = (tree->contmod->mu_down[start+tree->n_root->num]/tree->contmod->var_down[start+tree->n_root->num] + root_mean / root_var)*var; tree->n_root->ldsk->coord->lonlat[i] = Rnorm(mean,var); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Integrated_Lk(t_tree *tree) { phydbl lnL,root_mean,root_var; int i,err,start; RRW_Update_Normalization_Factor(tree); lnL = 0.0; Init_Contmod_Locations(tree); RRW_Integrated_Lk_Location_Post(NULL, tree->n_root, tree); if (tree->contmod->both_sides[LOCATION] == YES) { RRW_Integrated_Lk_Location_Pre(tree->n_root, tree->n_root->v[1], tree); RRW_Integrated_Lk_Location_Pre(tree->n_root, tree->n_root->v[2], tree); } for (i = 0; i < tree->mmod->n_dim; ++i) { root_var = tree->mmod->rw_root_var[LOCATION]; root_mean = LOCATION_Mean_Lonlat(i,tree); start = Contmod_Start(LOCATION, i, tree); tree->contmod->lnL[LOCATION * tree->mmod->n_dim + i] = 0.0; tree->contmod->lnL[LOCATION * tree->mmod->n_dim + i] += tree->contmod->logrem_down[start + tree->n_root->num]; tree->contmod->lnL[LOCATION * tree->mmod->n_dim + i] += Log_Dnorm(tree->contmod->mu_down[start + tree->n_root->num], root_mean, sqrt(root_var + tree->contmod->var_down[start + tree->n_root->num]), &err); lnL += tree->contmod->lnL[LOCATION * tree->mmod->n_dim + i]; } return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RRW_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree) { phydbl logvar; assert(d != tree->n_root); logvar = log(tree->mmod->sigsq[dim]) + log(tree->mmod->sigsq_scale[d->num]) + log(tree->mmod->sigsq_scale_norm_fact) + log(fabs(tree->times->nd_t[d->num]-tree->times->nd_t[d->anc->num])); return(exp(logvar)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // See Pybus et al. 10.1073/pnas.1206598109 + see my technical notes void RRW_Integrated_Lk_Location_Post(t_node *a, t_node *d, t_tree *tree) { if(d->tax == TRUE)return; else { int i; for (i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { RRW_Integrated_Lk_Location_Post(d, d->v[i], tree); } } RRW_Update_Lk_Location_Down(a, d, tree); } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Integrated_Lk_Location_Pre(t_node *a, t_node *d, t_tree *tree) { int i; if (d == tree->n_root) { RRW_Integrated_Lk_Location_Pre(tree->n_root, tree->n_root->v[1], tree); RRW_Integrated_Lk_Location_Pre(tree->n_root, tree->n_root->v[2], tree); return; } RRW_Update_Lk_Location_Up(a, d, tree); if (d->tax == TRUE) return; else { for (i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { RRW_Integrated_Lk_Location_Pre(d, d->v[i], tree); } } } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Update_Lk_Location_Down(t_node *a, t_node *d, t_tree *tree) { int i,start; t_node *son, *bro, *dad; phydbl son_mu_down,bro_mu_down; phydbl son_var_down,bro_var_down; phydbl son_var,bro_var; phydbl son_logrem_down,bro_logrem_down; phydbl son_a, bro_a; phydbl son_b, bro_b; if(d->tax) return; dad = d; son = bro = NULL; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(son == NULL) son = d->v[i]; else bro = d->v[i]; } } for(i=0;immod->n_dim;++i) { start = Contmod_Start(LOCATION, i, tree); son_mu_down = tree->contmod->mu_down[start + son->num]; bro_mu_down = tree->contmod->mu_down[start + bro->num]; son_var_down = tree->contmod->var_down[start + son->num]; bro_var_down = tree->contmod->var_down[start + bro->num]; son_logrem_down = tree->contmod->logrem_down[start + son->num]; bro_logrem_down = tree->contmod->logrem_down[start + bro->num]; son_var = RRW_Location_Variance_Along_Edge(son, i, tree); bro_var = RRW_Location_Variance_Along_Edge(bro, i, tree); son_a = 1.0; bro_a = 1.0; son_b = 0.0; bro_b = 0.0; RW_Integrated_Lk_Down(son_a, son_b, son_mu_down, son_var_down, son_var, bro_a, bro_b, bro_mu_down, bro_var_down, bro_var, son_logrem_down, bro_logrem_down, tree->contmod->mu_down + start + dad->num, tree->contmod->var_down + start + dad->num, tree->contmod->logrem_down + start + dad->num); // PhyML_Printf("\n. node %d mu_down: %g var_down: %g logrem_down: %g", dad->num, tree->contmod->mu_down[start+dad->num], tree->contmod->var_down[start+dad->num], tree->contmod->logrem_down[start+dad->num]); assert(isnan(tree->contmod->logrem_down[start + dad->num]) == NO); assert(isnan(tree->contmod->mu_down[start + dad->num]) == NO); assert(isnan(tree->contmod->var_down[start + dad->num]) == NO && !(tree->contmod->var_down[start + dad->num] < 0.0)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RRW_Update_Lk_Location_Up(t_node *a, t_node *d, t_tree *tree) { int i,start; t_node *dad, *son, *bro; phydbl dad_mu_up, dad_var_up, dad_logrem_up; phydbl son_a, son_b, son_var; phydbl bro_a, bro_b, bro_mu_down, bro_var_down, bro_var, bro_logrem_down; dad = a; son = d; bro = NULL; for(i=0;i<3;++i) if(a->v[i] != d && a->v[i] != a->anc && a->b[i] != tree->e_root) { bro = a->v[i]; break; } assert(bro->anc == dad); assert(bro != son); for(i=0;immod->n_dim;++i) { start = Contmod_Start(LOCATION,i,tree); bro_mu_down = tree->contmod->mu_down[start+bro->num]; bro_var_down = tree->contmod->var_down[start+bro->num]; bro_logrem_down = tree->contmod->logrem_down[start+bro->num]; bro_var = RRW_Location_Variance_Along_Edge(bro,i,tree); bro_a = 1.0; bro_b = 0.0; son_var = RRW_Location_Variance_Along_Edge(son,i,tree); son_a = 1.0; son_b = 0.0; if(dad != tree->n_root) { dad_mu_up = tree->contmod->mu_up[start+dad->num]; dad_var_up = tree->contmod->var_up[start+dad->num]; dad_logrem_up = tree->contmod->logrem_up[start+dad->num]; } else { dad_mu_up = LOCATION_Mean_Lonlat(i,tree); // dad_mu_up = tree->mmod->rw_root_mean; dad_var_up = tree->mmod->rw_root_var[LOCATION]; dad_logrem_up = 0.0; } RW_Integrated_Lk_Up(dad_mu_up, dad_var_up, dad_logrem_up, son_a, son_b, son_var, bro_a, bro_b, bro_mu_down, bro_var_down, bro_var, bro_logrem_down, tree->contmod->mu_up + start + son->num, tree->contmod->var_up + start + son->num, tree->contmod->logrem_up + start + son->num); assert(isnan(tree->contmod->logrem_down[start + d->num]) == NO); assert(isnan(tree->contmod->mu_up[start + d->num]) == NO); assert(isnan(tree->contmod->var_up[start + d->num]) == NO && !(tree->contmod->var_down[start + d->num] < 0.0)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Compute the velocity at each tip under the RRW model. For each dimension, compute the slope of the line through the tip and the ancestor. Divide by the time difference to get the velocity */ void RRW_Tip_Velocities(t_tree *tree) { int i,j; t_node *n; phydbl dt; RRW_Sample_Node_Locations_Joint(tree); for (i = 0; i < tree->n_otu; ++i) { n = tree->a_nodes[i]; dt = tree->times->nd_t[n->num] - tree->times->nd_t[n->anc->num]; for (j = 0; j < tree->mmod->n_dim; ++j) { n->ldsk->veloc->deriv[j] = n->ldsk->coord->lonlat[j] - n->anc->ldsk->coord->lonlat[j]; n->ldsk->veloc->deriv[j] /= dt; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/rrw.h000066400000000000000000000037221501136442400201600ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef RRW_H #define RRW_H #include "utilities.h" phydbl RRW_Lk(t_tree *tree); phydbl RRW_Forward_Lk_Path(t_ldsk *a, t_ldsk *d, t_tree *tree); void RRW_Rescale_Times(int prod, t_tree *tree); void RRW_Rescale_Times_Pre(t_node *a, t_node *d, phydbl cur_ta, int prod, t_tree *tree); phydbl RRW_Independent_Contrasts(t_tree *tree); phydbl RRW_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl RRW_Forward_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl RRW_Lk_Core(t_dsk *disk, t_tree *tree); void RRW_Generate_Ldsk_New_Location(t_ldsk *l, phydbl rad, int dim_idx, int child_only, t_tree *tree); phydbl RRW_Density_Ldsk_Location(t_ldsk *l, phydbl rad, int dim_idx, int child_only, t_tree *tree); short int RRW_Is_Rw(t_phyrex_mod *mod); phydbl RRW_Prior_Sigsq_Scale(t_tree *tree); void RRW_Update_Normalization_Factor(t_tree *tree); phydbl RRW_Mean_Displacement_Rate(t_tree *tree); phydbl RRW_Prior_Sigsq(t_tree *tree); phydbl RRW_Prior(t_tree *tree); void RRW_Generate(t_tree *tree); void RRW_Sample_Node_Locations_Marginal(t_tree *tree); void RRW_Sample_Node_Locations_Joint(t_tree *tree); void RRW_Sample_Node_Locations_Joint_Post(t_node *a, t_node *d, t_tree *tree); void RRW_Sample_Arealin_Plot(t_tree *tree); phydbl RRW_Integrated_Lk(t_tree *tree); void RRW_Integrated_Lk_Location_Pre(t_node *a, t_node *d, t_tree *tree); void RRW_Integrated_Lk_Location_Post(t_node *a, t_node *d, t_tree *tree); phydbl RRW_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree); void RRW_Update_Lk_Location_Up(t_node *a, t_node *d, t_tree *tree); void RRW_Update_Lk_Location_Down(t_node *a, t_node *d, t_tree *tree); void RRW_Tip_Velocities(t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/rw.c000066400000000000000000000232631501136442400177730ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "rw.h" #include "rrw.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RW_Lk(t_tree *tree) { RRW_Lk(tree); return(tree->mmod->c_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RW_Prior(t_tree *tree) { tree->mmod->c_lnP = RW_Prior_Sigsq(tree); tree->mmod->c_lnP += RW_Prior_Observational_Model(tree); return(tree->mmod->c_lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RW_Prior_Observational_Model(t_tree *tree) { phydbl lnP; int i; lnP = 0.0; if (tree->contmod->obs_model == NO) return (0.0); for (i = 0; i < tree->mmod->n_dim; ++i) { lnP += Log_Dexp(tree->contmod->obs_var[i], 1. / tree->contmod->obs_var_prior_mean); } return (lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RW_Prior_Sigsq(t_tree *tree) { phydbl lnP; int i,err; lnP = 0.0; if(tree->mmod->rw_prior_distrib == EXPONENTIAL_PRIOR) { for(i=0;immod->n_dim;++i) { lnP += Log_Dexp(tree->mmod->sigsq[i], 1./tree->mmod->rw_prior_mean); } } else if(tree->mmod->rw_prior_distrib == NORMAL_PRIOR) { for(i=0;immod->n_dim;++i) { lnP += Log_Dnorm(tree->mmod->sigsq[i], tree->mmod->rw_prior_mean, tree->mmod->rw_prior_sd, &err); } } else if(tree->mmod->rw_prior_distrib == FLAT_PRIOR) { lnP += 0.0; } else assert(false); return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl RW_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree) { phydbl lnP; lnP = RRW_Lk_Range(young,old,tree); return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Returns probability density of observed lineage location as defined in Felsenstein's (1973) independent contrasts article. */ phydbl RW_Independent_Contrasts(t_tree *tree) { phydbl lnP; t_node *n1,*n2; phydbl v1,v2,v1pv2,u,s; lnP = 0.0; for(int i=0;immod->n_dim;++i) { RW_Init_Contrasts(i,tree); RW_Independent_Contrasts_Post(tree->n_root,tree->n_root->v[1],tree->mmod->sigsq[i],&lnP,tree); RW_Independent_Contrasts_Post(tree->n_root,tree->n_root->v[2],tree->mmod->sigsq[i],&lnP,tree); n1 = tree->n_root->v[1]; n2 = tree->n_root->v[2]; // v1 and v2 in Equation (7) of Felsenstein's article v1 = fabs(tree->ctrst->tprime[n1->num]-tree->times->nd_t[tree->n_root->num]); v2 = fabs(tree->ctrst->tprime[n2->num]-tree->times->nd_t[tree->n_root->num]); v1pv2 = v1+v2; if(v1pv2 < SMALL) { v1 = v2 = 1.; v1pv2 = 2.; } // x6 tree->ctrst->x[tree->n_root->num] = (v2/(v1pv2))*tree->ctrst->x[n1->num] + (v1/(v1pv2))*tree->ctrst->x[n2->num] ; // u1 u = tree->ctrst->x[n1->num] - tree->ctrst->x[n2->num]; // t6' tree->ctrst->tprime[tree->n_root->num] = tree->times->nd_t[tree->n_root->num] + (v1*v2)/(v1pv2); s = tree->mmod->sigsq[i]; lnP -= log(sqrt(2.*PI*s*(v1pv2))); lnP -= (1./(2.*s*(v1pv2)))*u*u; if(lnP < UNLIKELY) { PhyML_Printf("\n. v1: %f v2: %f",v1,v2); PhyML_Printf("\n. ctrst1: %f ctrst2: %f",tree->ctrst->x[n1->num],tree->ctrst->x[n2->num]); PhyML_Printf("\n. tprime: %f",tree->ctrst->tprime[tree->n_root->num]); PhyML_Printf("\n. t: %f",tree->times->nd_t[tree->n_root->num]); assert(false); } } return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RW_Independent_Contrasts_Post(t_node *a, t_node *d, phydbl sd, phydbl *lnP, t_tree *tree) { if(d->tax == YES) return; else { t_node *n1,*n2; phydbl v1,v2,v1pv2,u; n1 = n2 = NULL; for(int i=0;i<3;++i) { if(d->v[i] != a && d->b[i] != tree->e_root) { if(!n1) n1 = d->v[i]; else n2 = d->v[i]; RW_Independent_Contrasts_Post(d,d->v[i],sd,lnP,tree); } } // v1 and v2 in Equation (7) of Felsenstein's article v1 = fabs(tree->ctrst->tprime[n1->num]-tree->times->nd_t[d->num]); v2 = fabs(tree->ctrst->tprime[n2->num]-tree->times->nd_t[d->num]); v1pv2 = v1+v2; if(v1pv2 < SMALL) { v1 = v2 = 1.; v1pv2 = 2.; } // x6 tree->ctrst->x[d->num] = (v2/(v1pv2))*tree->ctrst->x[n1->num] + (v1/(v1pv2))*tree->ctrst->x[n2->num] ; // u1 u = tree->ctrst->x[n1->num] - tree->ctrst->x[n2->num]; // t6' tree->ctrst->tprime[d->num] = tree->times->nd_t[d->num] + (v1*v2)/(v1pv2); *lnP -= log(sqrt(2.*PI*sd*(v1pv2))); *lnP -= (1./(2.*sd*(v1pv2)))*u*u; if(*lnP < UNLIKELY) { PhyML_Printf("\n. v1: %f v2: %f",v1,v2); PhyML_Printf("\n. ctrst1: %f ctrst2: %f",tree->ctrst->x[n1->num],tree->ctrst->x[n2->num]); PhyML_Printf("\n. tprime: %f",tree->ctrst->tprime[d->num]); PhyML_Printf("\n. t: %f",tree->times->nd_t[d->num]); assert(false); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RW_Integrated_Lk_Down(phydbl son_a, phydbl son_b, phydbl son_mu_down, phydbl son_var_down, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl son_logrem, phydbl bro_logrem, phydbl *mean, phydbl *var, phydbl *logrem) { phydbl m,v,logr; int err; err = 0; v = 0.0; logr = son_logrem + bro_logrem; logr -= log(fabs(bro_a*son_a)); logr += Log_Dnorm((son_mu_down-son_b)/son_a,(bro_mu_down-bro_b)/bro_a,sqrt((son_var_down+son_var)/pow(son_a,2)+(bro_var_down+bro_var)/pow(bro_a,2)),&err); if((son_var + son_var_down > SMALL) && (bro_var + bro_var_down > SMALL)) // Standard case { v = pow(son_a,2)/(son_var_down + son_var) + pow(bro_a,2)/(bro_var_down + bro_var); v = 1/v; m = (son_a*(son_mu_down-son_b)/(son_var_down + son_var) + bro_a*(bro_mu_down-bro_b)/(bro_var_down + bro_var)) * v; } else if(son_var + son_var_down > SMALL) // Null variance along d - v2 { m = (bro_mu_down-bro_b)/bro_a; } else if(bro_var + bro_var_down > SMALL) // Null variance along d - v1 { m = (son_mu_down-son_b)/son_a; } else { m = (son_mu_down-son_b)/son_a; } *mean = m; *var = v; *logrem = logr; // PhyML_Printf("\n. m: %g v: %g logr: %g son_var_down: %g son_var: %g bro_var_down: %g bro_var: %g",m,v,logr,son_var_down,son_var,bro_var_down,bro_var); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RW_Integrated_Lk_Up(phydbl dad_mu_up, phydbl dad_var_up, phydbl dad_logrem_up, phydbl son_a, phydbl son_b, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl bro_logrem_down, phydbl *mean, phydbl *var, phydbl *logrem) { phydbl m, v, logr; int err; v = logr = 0.0; err = 0; logr = dad_logrem_up + bro_logrem_down; logr -= log(fabs(bro_a)); logr += Log_Dnorm((bro_mu_down - bro_b) / bro_a, dad_mu_up, sqrt((bro_var_down + bro_var) / (bro_a * bro_a) + dad_var_up), &err); if (err == YES) { PhyML_Printf("\n. bro_mu_down: %f bro_b: %f bro_a: %f dad_mu_up: %f bro_var_down: %f bro_var: %f dad_var_up: %f", bro_mu_down, bro_b, bro_a, dad_mu_up, bro_var_down, bro_var, dad_var_up); assert(false); } if ((bro_var_down + bro_var) > SMALL && dad_var_up > SMALL) // Standard case { v += dad_var_up * (bro_var_down + bro_var); v /= bro_a * bro_a * dad_var_up + bro_var_down + bro_var; m = v * (bro_a * (bro_mu_down - bro_b) / (bro_var_down + bro_var) + dad_mu_up / dad_var_up); m = son_a * m + son_b; v = son_a * son_a * v + son_var; } else if (dad_var_up > SMALL) // Null variance along bro { v = son_var; m = son_a * bro_mu_down / bro_a + son_b; } else if ((bro_var_down + bro_var) > SMALL) // Null variance along dad { v = son_var; m = son_a * dad_mu_up + son_b; } else { v = son_var; m = son_a * bro_mu_down / bro_a + son_b; /* m = son_b; */ } *mean = m; *var = v; *logrem = logr; /* !!!!!!!!!!!!!!!!!!!! */ /* assert(v>0.0); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/rw.h000066400000000000000000000026431501136442400177770ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef RW_H #define RW_H #include "utilities.h" phydbl RW_Independent_Contrasts(t_tree *tree); void RW_Independent_Contrasts_Post(t_node *a, t_node *d, phydbl sd, phydbl *lnP, t_tree *tree); phydbl RW_Lk(t_tree *tree); phydbl RW_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl RW_Prior(t_tree *tree); phydbl RW_Prior_Sigsq(t_tree *tree); void RW_Integrated_Lk_Down(phydbl son_a, phydbl son_b, phydbl son_mu_down, phydbl son_var_down, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl son_logrem, phydbl bro_logrem, phydbl *mean, phydbl *var, phydbl *logrem); void RW_Integrated_Lk_Up(phydbl dad_mu_up, phydbl dad_var_up, phydbl dad_logrem_up, phydbl son_a, phydbl son_b, phydbl son_var, phydbl bro_a, phydbl bro_b, phydbl bro_mu_down, phydbl bro_var_down, phydbl bro_var, phydbl bro_logrem_down, phydbl *mean, phydbl *var, phydbl *logrem); phydbl RW_Prior_Observational_Model(t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/rwrapper.c000066400000000000000000000132221501136442400211770ustar00rootroot00000000000000#include "rwrapper.h" /* #include */ /* #include */ /*********************************************************/ /*********************************************************/ /*********************************************************/ /*********************************************************/ /*********************************************************/ /* void RWRAPPER_Min_Number_Of_Tip_Permut(char **tree_file_name, char **coord_file_name, phydbl *res) */ /* { */ /* t_tree *tree; */ /* option *io; */ /* FILE *fp_tree_file, *fp_coord_file; */ /* int i; */ /* srand(time(NULL)); rand(); */ /* /\\* Rprintf("%s\n",tree_file_name[0]); *\\/ */ /* /\\* Rprintf("%s\n",coord_file_name[0]); *\\/ */ /* fp_tree_file = (FILE *)fopen(tree_file_name[0],"r"); */ /* fp_coord_file = (FILE *)fopen(coord_file_name[0],"r"); */ /* io = (option *)Make_Input(); */ /* io->fp_in_tree = fp_tree_file; */ /* Read_Tree_File(io); */ /* tree = io->treelist->tree[0]; */ /* tree->io = io; */ /* tree->io->z_scores = (phydbl *)mCalloc(tree->n_otu,sizeof(phydbl)); */ /* /\\* for(i=0;in_otu;i++) tree->io->z_scores[i] = TIPO_Read_One_Taxon_Zscore(fp_coord_file,tree->noeud[i]->name,1,tree); *\\/ */ /* /\\* TIPO_Normalize_Zscores(tree); *\\/ */ /* /\\* TIPO_Get_Min_Number_Of_Tip_Permut(tree); *\\/ */ /* /\\* res[0] = (phydbl)tree->tip_order_score; *\\/ */ /* for(i=0;in_otu;i++) tree->io->z_scores[i] = TIPO_Read_One_Taxon_Zscore(fp_coord_file,tree->a_nodes[i]->name,1,tree); */ /* Free_Bip(tree); */ /* Alloc_Bip(tree); */ /* Get_Bip(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); */ /* TIPO_Get_Tips_Y_Rank_From_Zscores(tree); */ /* /\\* TIPO_Get_Tips_Y_Rank(tree); *\\/ */ /* tree->geo_mig_sd = 1.; */ /* Generic_Brent_Lk(&(tree->geo_mig_sd), */ /* 1.E-5,1.E+2,1.E-6, */ /* 100,NO, */ /* &Optwrap_Geo_Lk, */ /* NULL,tree,NULL); */ /* res[0] = (phydbl)tree->geo_mig_sd; */ /* /\\* for(i=0;in_otu;i++) Rprintf("\n.. %f",tree->io->z_scores[i]); *\\/ */ /* /\\* printf("\n>> sd: %f",tree->geo_mig_sd); *\\/ */ /* fclose(fp_tree_file); */ /* fclose(fp_coord_file); */ /* } */ /*********************************************************/ void RWRAPPER_Log_Dnorm(phydbl *x, phydbl *mean, phydbl *sd, phydbl *res) { int err; err = NO; *res = Log_Dnorm(*x,*mean,*sd,&err); } /*********************************************************/ void RWRAPPER_Integrated_Geometric_Brownian_Bridge_Mean(phydbl *T, phydbl *A, phydbl *B, phydbl *u, phydbl *mean) { Integrated_Geometric_Brownian_Bridge_Mean(*T,*A,*B,*u,mean); } /*********************************************************/ void RWRAPPER_Integrated_Geometric_Brownian_Bridge_Var(phydbl *T, phydbl *A, phydbl *B, phydbl *u, phydbl *var) { Integrated_Geometric_Brownian_Bridge_Var(*T,*A,*B,*u,var); } /* /\*********************************************************\/ */ /* void RWRAPPER_Rnorm_Trunc(phydbl *mean, phydbl *sd, phydbl *min, phydbl *max, phydbl *res) */ /* { */ /* *res = Rnorm_Trunc(*mean,*sd,*min,*max); */ /* } */ /* void RWRAPPER_Cholesky_Decomp(double *A, int *dim) */ /* { */ /* Cholesky_Decomp(A,*dim); */ /* } */ /*********************************************************/ /* void RWRAPPER_Bivariate_Normal_Density(phydbl *x, phydbl *y, phydbl *mux, phydbl *muy, phydbl *sdx, phydbl *sdy, phydbl *rho, phydbl *dens) */ /* { */ /* *dens = Bivariate_Normal_Density(*x,*y,*mux,*muy,*sdx,*sdy,*rho); */ /* } */ /* /\*********************************************************\/ */ /* void RWRAPPER_Dmu2_And_Mu1_Given_Min_N(phydbl *mu1, phydbl *mu2, phydbl *dt1, phydbl *dt2, int *n_min, phydbl *a, phydbl *b, phydbl *lexp, phydbl *dens) */ /* { */ /* *dens = RATES_Dmu2_And_Mu1_Given_Min_N(*mu1, *mu2, *dt1, *dt2, *n_min, *a, *b, *lexp); */ /* } */ /* /\*********************************************************\/ */ /* void RWRAPPER_Dgamma(phydbl *x, phydbl *shape, phydbl *scale, phydbl *dens) */ /* { */ /* *dens = Dgamma(*x,*shape,*scale); */ /* } */ /* /\*********************************************************\/ */ /* void RWRAPPER_Dnorm(phydbl *x, phydbl *mean, phydbl *var, double *dens) */ /* { */ /* *dens = Dnorm_Moments(*x,*mean,*var); */ /* } */ /* /\*********************************************************\/ */ /* void RWRAPPER_Dmu_One(phydbl *mu, phydbl *dt, phydbl *a, phydbl *b, phydbl *lexp, double *dens) */ /* { */ /* *dens = RATES_Dmu_One(*mu,*dt,*a,*b,*lexp); */ /* } */ /* /\*********************************************************\/ */ /* void RWRAPPER_Dr_X_Dx(double *r, double *mu, double *y, double *dt, double *a, double *b, double *lexp, double *dens) */ /* { */ /* *dens = RATES_Dr_X_Dx(*r,*mu,*y,*dt,*a,*b,*lexp); */ /* } */ /* /\*********************************************************\/ */ /* void RWRAPPER_Dmu_Given_Y(double *mu, double *y, double *dt, double *a, double *b, double *lexp, double *dens) */ /* { */ /* *dens = RATES_Dmu_Given_Y(*mu,*y,*dt,*a,*b,*lexp); */ /* } */ /* /\*********************************************************\/ */ /* void RWRAPPER_Dmu2_And_Mu1(double *mu1, double *mu2, double *dt1, double *dt2, double *a, double *b, double *lexp, double *dens) */ /* { */ /* *dens = RATES_Dmu2_And_Mu1(*mu1,*mu2,*dt1,*dt2,*a,*b,*lexp); */ /* } */ /* /\*********************************************************\/ */ /* void RWRAPPER_Dmu2_Given_Mu1(double *mu1, double *mu2, double *dt1, double *dt2, double *a, double *b, double *lexp, double *dens) */ /* { */ /* /\* *dens = RATES_Dmu2_Given_Mu1(*mu1,*mu2,*dt1,*dt2,*a,*b,*lexp); *\/ */ /* *dens = RATES_Dmu2_Given_Mu1_Bis(*mu1,*mu2,*dt1,*dt2,*a,*b,*lexp); */ /* } */ /* /\*********************************************************\/ */ stephaneguindon-phyml-76a39c8/src/rwrapper.h000066400000000000000000000054041501136442400212070ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef RWRAPPER_H #define RWRAPPER_H #include "utilities.h" #include "rates.h" #include "eigen.h" #include "io.h" #include "stats.h" #include "tiporder.h" /* void RWRAPPER_Dmu2_Given_Mu1_And_Min_N(phydbl *mu1, phydbl *mu2, phydbl *dt1, phydbl *dt2, int *n_min, phydbl *a, phydbl *b, phydbl *lexp, phydbl *dens); */ /* void RWRAPPER_Dnorm(phydbl *x, phydbl *mean, phydbl *var, double *dens); */ /* void RWRAPPER_Dmu(phydbl *mu, phydbl *dt, phydbl *a, phydbl *b, phydbl *lexp, double *dens); */ /* void RWRAPPER_Dr_X_Dx(double *r, double *mu, double *y, double *dt, double *a, double *b, double *lexp, double *dens); */ /* void RWRAPPER_Dmu_Given_Y(double *mu, double *y, double *dt, double *a, double *b, double *lexp, double *dens); */ /* void RWRAPPER_Dmu(phydbl *mu, phydbl *dt, phydbl *a, phydbl *b, phydbl *lexp, double *dens); */ /* void RWRAPPER_Dmu2_Given_Mu1(double *mu1, double *mu2, double *dt1, double *dt2, double *a, double *b, double *lexp, double *dens); */ /* void RWRAPPER_Dgamma(phydbl *x, phydbl *shape, phydbl *scale, phydbl *dens); */ /* void RWRAPPER_Bivariate_Normal_Density(phydbl *x, phydbl *y, phydbl *mux, phydbl *muy, phydbl *sdx, phydbl *sdy, phydbl *rho, phydbl *dens); */ /* void RWRAPPER_Dmu2_And_Mu1_Given_Min_N(phydbl *mu1, phydbl *mu2, phydbl *dt1, phydbl *dt2, int *n_min, phydbl *a, phydbl *b, phydbl *lexp, phydbl *dens); */ /* void RWRAPPER_RATES_Dmu1_And_Mu2_One_Jump_Two_Intervals(phydbl *dt1, phydbl *dt2, phydbl *mu1, phydbl *mu2, phydbl *alpha, phydbl *beta, phydbl *dens); */ /* void RWRAPPER_Dmu_One(phydbl *mu, phydbl *dt, phydbl *a, phydbl *b, phydbl *lexp, double *dens); */ /* void RWRAPPER_Lk_Rates_Core(phydbl *mu1, phydbl *mu2, phydbl *dt1, phydbl *dt2, phydbl *a, phydbl *b, phydbl *lexp, phydbl *eps, int *approx, phydbl *dens); */ /* void RWRAPPER_Dmu2_And_Mu1(double *mu1, double *mu2, double *dt1, double *dt2, double *a, double *b, double *lexp, double *dens); */ /* void RWRAPPER_Rnorm_Trunc(phydbl *mean, phydbl *sd, phydbl *min, phydbl *max, phydbl *res); */ /* void RWRAPPER_Cholesky_Decomp(double *A, int *dim); */ /* void RWRAPPER_Min_Number_Of_Tip_Permut(char **tree_file_name, char **coord_file_name, phydbl *res); */ void RWRAPPER_Log_Dnorm(phydbl *x, phydbl *mean, phydbl *sd, phydbl *res); void RWRAPPER_Integrated_Geometric_Brownian_Bridge_Mean(phydbl *T, phydbl *A, phydbl *B, phydbl *u, phydbl *mean); void RWRAPPER_Integrated_Geometric_Brownian_Bridge_Var(phydbl *T, phydbl *A, phydbl *B, phydbl *u, phydbl *var); #endif stephaneguindon-phyml-76a39c8/src/simu.c000066400000000000000000000647701501136442400203300ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "simu.h" #ifdef BEAGLE #include "beagle_utils.h" #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Simu_Loop(t_tree *tree) { return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Simu(t_tree *tree, int n_step_max, phydbl delta_lnL, phydbl init_T, phydbl delta_T, int min_n_edges_traversed) { phydbl old_loglk,delta; unsigned int n_round; time_t t_cur; tree->c_lnL = UNLIKELY; delta = UNLIKELY; old_loglk = UNLIKELY; n_round = 0; tree->annealing_temp = init_T; do { for(int i=0;i<2*tree->n_otu-3;++i) tree->a_edges[i]->l->v *= Rgamma((phydbl)(0.2*n_round+1),(phydbl)(1./(0.2*n_round+1))); old_loglk = tree->c_lnL; Set_Both_Sides(NO,tree); tree->tip_root = Rand_Int(0,tree->n_otu-1); Lk(NULL,tree); tree->n_edges_traversed = 0; tree->fully_nni_opt = YES; NNI_Traversal(tree->a_nodes[tree->tip_root], tree->a_nodes[tree->tip_root]->v[0], NULL, tree->a_nodes[tree->tip_root]->b[0], YES, tree); delta = tree->c_lnL - old_loglk; tree->annealing_temp -= delta_T; if(tree->annealing_temp < 0.0) tree->annealing_temp = 0.0; n_round++; time(&t_cur); PhyML_Printf("\n. %5ds lnL: %12G T: %12G %4d/%4d", (int)(t_cur-tree->t_beg), tree->c_lnL, tree->annealing_temp, tree->n_edges_traversed, tree->n_otu); if((n_round >= n_step_max || tree->fully_nni_opt == YES) && Are_Equal(tree->annealing_temp,0.0,1.E-3) && delta < delta_lnL) break; } while(1); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Simu_Pars(t_tree *tree, int n_step_max) { phydbl old_pars,lambda; int i,n_neg,n_tested,step; t_edge **sorted_b,**tested_b; sorted_b = (t_edge **)mCalloc(tree->n_otu-3,sizeof(t_edge *)); tested_b = (t_edge **)mCalloc(tree->n_otu-3,sizeof(t_edge *)); old_pars = 0; tree->c_pars = 0; n_tested = 0; step = 0; lambda = 0.5; Update_Dirs(tree); if((tree->verbose > VL0) && (tree->io->quiet == NO)) PhyML_Printf("\n\n. Starting simultaneous NNI moves (parsimony criterion)...\n"); do { ++step; if(step > n_step_max) break; Set_Both_Sides(YES,tree); Pars(NULL,tree); if((tree->verbose > VL0) && (tree->io->quiet == NO)) { Print_Pars(tree); if(step > 1) (n_tested > 1)?(printf("[%4d NNIs]",n_tested)):(printf("[%4d NNI ]",n_tested)); } if(FABS(old_pars - tree->c_pars) < SMALL) break; if((tree->c_pars > old_pars) && (step > 1)) { if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf("\n\n. Moving backward (topology) \n"); if(!Mov_Backward_Topo_Pars(tree,old_pars,tested_b,n_tested)) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); if(!tree->n_swap) n_neg = 0; Set_Both_Sides(YES,tree); Pars(NULL,tree); } else { old_pars = tree->c_pars; n_neg = 0; For(i,2*tree->n_otu-3) if((!tree->a_edges[i]->left->tax) && (!tree->a_edges[i]->rght->tax)) NNI_Pars(tree,tree->a_edges[i],NO); Select_Edges_To_Swap(tree,sorted_b,&n_neg); Sort_Edges_NNI_Score(tree,sorted_b,n_neg); n_tested = 0; For(i,(int)CEIL((phydbl)n_neg*(lambda))) tested_b[n_tested++] = sorted_b[i]; Make_N_Swap(tree,tested_b,0,n_tested); } } while(1); Free(sorted_b); Free(tested_b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Select_Edges_To_Swap(t_tree *tree, t_edge **sorted_b, int *n_neg) { int i; t_edge *b; /* phydbl best_score; */ *n_neg = 0; For(i,2*tree->n_otu-3) { b = tree->a_edges[i]; /* best_score = b->nni->score; */ if((!b->left->tax) && (!b->rght->tax) && (b->nni->score < -tree->mod->s_opt->min_diff_lk_move)) { /* // Evaluate NNIs on edges at distance 1 */ /* Check_NNI_Scores_Around(b->left,b->rght,b,&best_score,tree); */ /* Check_NNI_Scores_Around(b->rght,b->left,b,&best_score,tree); */ /* // Evaluate NNIs on edges at distance 2 */ /* Check_NNI_Scores_Around(b->left,b->left->v[b->l_v1],b,&best_score,tree); */ /* Check_NNI_Scores_Around(b->left,b->left->v[b->l_v2],b,&best_score,tree); */ /* // Evaluate NNIs on edges at distance 2 */ /* Check_NNI_Scores_Around(b->rght,b->rght->v[b->r_v1],b,&best_score,tree); */ /* Check_NNI_Scores_Around(b->rght,b->rght->v[b->r_v2],b,&best_score,tree); */ /* if(best_score < b->nni->score) continue; */ sorted_b[*n_neg] = b; (*n_neg)++; } /* if((!b->left->tax) && (!b->rght->tax) && (b->nni->score < -tree->mod->s_opt->min_diff_lk_move)) */ /* { */ /* sorted_b[*n_neg] = b; */ /* (*n_neg)++; */ /* } */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Bl(t_tree *tree, phydbl fact) { int i; scalar_dbl *l,*l_old,*l0; For(i,2*tree->n_otu-3) { l = tree->a_edges[i]->l; l_old = tree->a_edges[i]->l_old; l0 = tree->a_edges[i]->nni->l0; do { l->v = l_old->v + (l0->v - l_old->v)*fact; l = l->next; l_old = l_old->next; l0 = l0->next; } while(l); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_N_Swap(t_tree *tree,t_edge **b, int beg, int end) { int i; /* t_edge *orig; */ t_node *n1,*n2,*n3,*n4; n1 = n2 = n3 = n4 = NULL; tree->n_swap = 0; for(i=beg;inni->swap_node_v1; n2 = b[i]->nni->swap_node_v2; n3 = b[i]->nni->swap_node_v3; n4 = b[i]->nni->swap_node_v4; /* if(b[i]->nni->best_conf == 1) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v1]; */ /* } */ /* else if(b[i]->nni->best_conf == 2) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v2]; */ /* } */ if(b[i]->nni->best_conf == 1) { if(n1 != b[i]->left->v[b[i]->l_v2] || /* n2 != b[i]->left || */ /* n3 != b[i]->rght || */ n4 != b[i]->rght->v[b[i]->r_v1]) continue; } else if(b[i]->nni->best_conf == 2) { if(n1 != b[i]->left->v[b[i]->l_v2] || /* n2 != b[i]->left || */ /* n3 != b[i]->rght || */ n4 != b[i]->rght->v[b[i]->r_v2]) continue; } Swap(n1,n2,n3,n4,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) { /* Undo this swap as it violates one of the topological constraints defined in the input constraint tree */ Swap(n4,n2,n3,n1,tree); } if(tree->n_root) { tree->n_root->v[2] = tree->e_root->left; tree->n_root->v[1] = tree->e_root->rght; } Copy_Scalar_Dbl(b[i]->nni->best_l,b[i]->l); Copy_Scalar_Dbl(b[i]->nni->best_v,b[i]->l_var); /* orig = b[i]; */ /* do */ /* { */ /* b[i]->l->v = b[i]->nni->best_l; */ /* b[i] = b[i]->next; */ /* } */ /* while(b[i]); */ /* b[i] = orig; */ tree->n_swap++; } /* PhyML_Printf("\n. End Actually performing swaps\n"); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Make_Best_Swap(t_tree *tree) { int i,j,return_value; t_edge *b,**sorted_b; /* t_edge *orig; */ t_node *n1,*n2,*n3,*n4; sorted_b = (t_edge **)mCalloc(tree->n_otu-3,sizeof(t_edge *)); j=0; For(i,2*tree->n_otu-3) if((!tree->a_edges[i]->left->tax) && (!tree->a_edges[i]->rght->tax)) sorted_b[j++] = tree->a_edges[i]; Sort_Edges_NNI_Score(tree,sorted_b,tree->n_otu-3); if(sorted_b[0]->nni->score < -0.0) { b = sorted_b[0]; return_value = 1; n1 = n2 = n3 = n4 = NULL; /* n1 = b->nni->swap_node_v1; */ /* n2 = b->nni->swap_node_v2; */ /* n3 = b->nni->swap_node_v3; */ /* n4 = b->nni->swap_node_v4; */ if(b->nni->best_conf == 1) { n1 = b->left->v[b->l_v2]; n2 = b->left; n3 = b->rght; n4 = b->rght->v[b->r_v1]; } else if(b->nni->best_conf == 2) { n1 = b->left->v[b->l_v2]; n2 = b->left; n3 = b->rght; n4 = b->rght->v[b->r_v2]; } Swap(n1,n2,n3,n4,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) { /* Undo this swap as it violates one of the topological constraints defined in the input constraint tree */ Swap(n4,n2,n3,n1,tree); } /* b->l->v = b->nni->best_l; */ Copy_Scalar_Dbl(b->nni->best_l,b->l); Copy_Scalar_Dbl(b->nni->best_v,b->l_var); /* orig = b; */ /* do */ /* { */ /* b->l->v = b->nni->best_l; */ /* b = b->next; */ /* } */ /* while(b); */ /* b = orig; */ } else return_value = 0; Free(sorted_b); return return_value; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Mov_Backward_Topo_Bl(t_tree *tree, phydbl lk_old, t_edge **tested_b, int n_tested) { scalar_dbl **l_init,**v_init; int i,step,beg,end; t_edge *b,*orig; l_init = (scalar_dbl **)mCalloc(2*tree->n_otu-3,sizeof(scalar_dbl *)); v_init = (scalar_dbl **)mCalloc(2*tree->n_otu-3,sizeof(scalar_dbl *)); For(i,2*tree->n_otu-3) { l_init[i] = Duplicate_Scalar_Dbl(tree->a_edges[i]->l); v_init[i] = Duplicate_Scalar_Dbl(tree->a_edges[i]->l_var); } step = 2; do { For(i,2*tree->n_otu-3) { b = tree->a_edges[i]; orig = b; do { b->l->v = b->l_old->v + (1./step) * (l_init[i]->v - b->l_old->v); if(b->next == NULL) break; b = b->next; l_init[i] = l_init[i]->next; } while(b); b = orig; } beg = (int)FLOOR((phydbl)n_tested/(step-1)); end = 0; Unswap_N_Branch(tree,tested_b,beg,end); beg = 0; end = (int)FLOOR((phydbl)n_tested/step); Swap_N_Branch(tree,tested_b,beg,end); if(!end) tree->n_swap = 0; Set_Both_Sides(NO,tree); Lk(NULL,tree); step++; }while((tree->c_lnL < lk_old) && (step < 1000)); if(step == 1000) { if(tree->n_swap) Exit("\n== Err. in Mov_Backward_Topo_Bl (n_swap > 0)\n"); Restore_Br_Len(tree); Set_Both_Sides(NO,tree); Lk(NULL,tree); } For(i,2*tree->n_otu-3) { while(l_init[i]->prev) l_init[i] = l_init[i]->prev; Free_Scalar_Dbl(l_init[i]); } Free(l_init); For(i,2*tree->n_otu-3) { while(v_init[i]->prev) v_init[i] = v_init[i]->prev; Free_Scalar_Dbl(v_init[i]); } Free(v_init); tree->n_swap = 0; For(i,2*tree->n_otu-3) { if(tree->a_edges[i]->nni->score < 0.0) tree->n_swap++; tree->a_edges[i]->nni->score = +1.0; } if(tree->c_lnL > lk_old) return 1; else if((tree->c_lnL > lk_old-tree->mod->s_opt->min_diff_lk_local) && (tree->c_lnL < lk_old+tree->mod->s_opt->min_diff_lk_local)) return -1; else return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Mov_Backward_Topo_Pars(t_tree *tree, int pars_old, t_edge **tested_b, int n_tested) { int i,step,beg,end; step = 2; do { beg = (int)FLOOR((phydbl)n_tested/(step-1)); end = 0; Unswap_N_Branch(tree,tested_b,beg,end); beg = 0; end = (int)FLOOR((phydbl)n_tested/step); Swap_N_Branch(tree,tested_b,beg,end); if(!end) tree->n_swap = 0; Set_Both_Sides(NO,tree); Pars(NULL,tree); step++; } while((tree->c_pars > pars_old) && (step < 1000)); if(step == 1000) { if(tree->n_swap) Exit("\n. Err. in Mov_Backward_Topo_Bl (n_swap > 0)\n"); Set_Both_Sides(NO,tree); Pars(NULL,tree); } tree->n_swap = 0; For(i,2*tree->n_otu-3) { if(tree->a_edges[i]->nni->score < 0.0) tree->n_swap++; tree->a_edges[i]->nni->score = +1.0; } if(tree->c_pars < pars_old) return 1; else if(tree->c_pars == pars_old) return -1; else return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Unswap_N_Branch(t_tree *tree, t_edge **b, int beg, int end) { int i; /* t_edge *orig; */ t_node *n1,*n2,*n3,*n4; n1 = n2 = n3 = n4 = NULL; if(end>beg) { for(i=beg;inni->swap_node_v4; n2 = b[i]->nni->swap_node_v2; n3 = b[i]->nni->swap_node_v3; n4 = b[i]->nni->swap_node_v1; /* if(b[i]->nni->best_conf == 1) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v1]; */ /* } */ /* else if(b[i]->nni->best_conf == 2) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v2]; */ /* } */ Swap(n1,n2,n3,n4,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) { /* Undo this swap as it violates one of the topological constraints defined in the input constraint tree */ Swap(n4,n2,n3,n1,tree); } /* (b[i]->nni->best_conf == 1)? */ /* (Swap(b[i]->left->v[b[i]->l_v2],b[i]->left,b[i]->rght,b[i]->rght->v[b[i]->r_v1],tree)): */ /* (Swap(b[i]->left->v[b[i]->l_v2],b[i]->left,b[i]->rght,b[i]->rght->v[b[i]->r_v2],tree)); */ /* b[i]->l->v = b[i]->l_old->v; */ Copy_Scalar_Dbl(b[i]->l_old,b[i]->l); Copy_Scalar_Dbl(b[i]->l_var_old,b[i]->l_var); /* orig = b[i]; */ /* do */ /* { */ /* b[i]->l->v = b[i]->l_old->v; */ /* b[i] = b[i]->next; */ /* } */ /* while(b[i]); */ /* b[i] = orig; */ } } else { for(i=beg-1;i>=end;i--) { n1 = n2 = n3 = n4 = NULL; n1 = b[i]->nni->swap_node_v4; n2 = b[i]->nni->swap_node_v2; n3 = b[i]->nni->swap_node_v3; n4 = b[i]->nni->swap_node_v1; /* if(b[i]->nni->best_conf == 1) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v1]; */ /* } */ /* else if(b[i]->nni->best_conf == 2) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v2]; */ /* } */ Swap(n1,n2,n3,n4,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) { /* Undo this swap as it violates one of the topological constraints defined in the input constraint tree */ Swap(n4,n2,n3,n1,tree); } /* b[i]->l->v = b[i]->l_old->v; */ Copy_Scalar_Dbl(b[i]->l_old,b[i]->l); Copy_Scalar_Dbl(b[i]->l_var_old,b[i]->l_var); /* orig = b[i]; */ /* do */ /* { */ /* b[i]->l->v = b[i]->l_old->v; */ /* b[i] = b[i]->next; */ /* } */ /* while(b[i]); */ /* b[i] = orig; */ } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Swap_N_Branch(t_tree *tree,t_edge **b, int beg, int end) { int i; /* t_edge *orig; */ t_node *n1,*n2,*n3,*n4; n1 = n2 = n3 = n4 = NULL; if(end>beg) { for(i=beg;inni->swap_node_v1; n2 = b[i]->nni->swap_node_v2; n3 = b[i]->nni->swap_node_v3; n4 = b[i]->nni->swap_node_v4; /* if(b[i]->nni->best_conf == 1) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v1]; */ /* } */ /* else if(b[i]->nni->best_conf == 2) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v2]; */ /* } */ Swap(n1,n2,n3,n4,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) { /* Undo this swap as it violates one of the topological constraints defined in the input constraint tree */ Swap(n4,n2,n3,n1,tree); } /* b[i]->l->v = b[i]->nni->best_l; */ Copy_Scalar_Dbl(b[i]->nni->best_l,b[i]->l); Copy_Scalar_Dbl(b[i]->nni->best_v,b[i]->l_var); /* orig = b[i]; */ /* do */ /* { */ /* b[i]->l->v = b[i]->nni->best_l; */ /* b[i] = b[i]->next; */ /* } */ /* while(b[i]); */ /* b[i] = orig; */ } } else { for(i=beg-1;i>=end;i--) { n1 = n2 = n3 = n4 = NULL; n1 = b[i]->nni->swap_node_v1; n2 = b[i]->nni->swap_node_v2; n3 = b[i]->nni->swap_node_v3; n4 = b[i]->nni->swap_node_v4; /* if(b[i]->nni->best_conf == 1) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v1]; */ /* } */ /* else if(b[i]->nni->best_conf == 2) */ /* { */ /* n1 = b[i]->left->v[b[i]->l_v2]; */ /* n2 = b[i]->left; */ /* n3 = b[i]->rght; */ /* n4 = b[i]->rght->v[b[i]->r_v2]; */ /* } */ Swap(n1,n2,n3,n4,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) { /* Undo this swap as it violates one of the topological constraints defined in the input constraint tree */ Swap(n4,n2,n3,n1,tree); } /* b[i]->l->v = b[i]->nni->best_l; */ Copy_Scalar_Dbl(b[i]->nni->best_l,b[i]->l); Copy_Scalar_Dbl(b[i]->nni->best_v,b[i]->l_var); /* orig = b[i]; */ /* do */ /* { */ /* b[i]->l->v = b[i]->nni->best_l; */ /* b[i] = b[i]->next; */ /* } */ /* while(b[i]); */ /* b[i] = orig; */ } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Check_NNI_Scores_Around(t_node *a, t_node *d, t_edge *b, phydbl *best_score, t_tree *tree) { int i; if(d->tax) return; for(i=0;i<3;i++) { if((d->v[i] != a) && (!d->v[i]->tax)) { if((d->b[i]->nni->score > *best_score-1.E-10) && (d->b[i]->nni->score < *best_score+1.E-10)) /* ties */ { d->b[i]->nni->score = *best_score+1.; } if(d->b[i]->nni->score < *best_score) { *best_score = d->b[i]->nni->score; } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* v | | a / \ d u / \ v1 v2 */ void NNI_Traversal(t_node *a, t_node *d, t_node *v, t_edge *b, int opt_edges, t_tree *tree) { int i,dir1, dir2; /* printf("\n. a: %d d: %d b->is_alive ? %d -- [%d - %d]", a->num,d->num,b->is_alive,a->tax,d->tax); */ if(d->tax == YES) { if(opt_edges == YES) Br_Len_Opt(&(b->l->v),b,tree); return; } else if(a->tax == YES) { if(opt_edges == YES && a->tax == YES) Br_Len_Opt(&(b->l->v),b,tree); for(i=0;i<3;++i) if(d->v[i] != a) { Update_Partial_Lk(tree,d->b[i],d); NNI_Traversal(d,d->v[i],a,d->b[i],opt_edges,tree); } Update_Partial_Lk(tree,b,d); } else { tree->n_edges_traversed++; NNI_Core(a,d,v,b,opt_edges,tree); dir1 = dir2 = -1; for(i=0;i<3;++i) if(d->v[i] != a) { if(dir1 < 0) dir1 = i; else dir2 = i; } Update_Partial_Lk(tree,d->b[dir1],d); NNI_Traversal(d,d->v[dir1],a,d->b[dir1],opt_edges,tree); Update_Partial_Lk(tree,d->b[dir2],d); NNI_Traversal(d,d->v[dir2],a,d->b[dir2],opt_edges,tree); Update_Partial_Lk(tree,b,d); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void NNI_Core(t_node *a, t_node *d, t_node *v, t_edge *b, int opt_edges, t_tree *tree) { phydbl lk0,lk1,lk2; phydbl rnd; t_node *v1,*v2,*u,*dum; scalar_dbl *l0,*l1,*l2; phydbl p_accept; int i; l0 = l1 = l2 = NULL; lk0 = UNLIKELY; lk1 = UNLIKELY; lk2 = UNLIKELY; v1 = v2 = NULL; for(i=0;i<3;++i) if(d->v[i] != a) { if(v1 == NULL) v1 = d->v[i]; else v2 = d->v[i]; } assert(v1 != NULL); assert(v2 != NULL); dum = NULL; rnd = Uni(); if(rnd < .5) { dum = v1; v1 = v2; v2 = dum; } u = NULL; for(i=0;i<3;++i) if(a->v[i] != d && a->v[i] != v) { u = a->v[i]; break; } if(opt_edges == YES) Br_Len_Opt(&(b->l->v),b,tree); lk0 = Lk(b,tree); l0 = Duplicate_Scalar_Dbl(b->l); /* Swap_Partial_Lk_Extra(b,a,0,tree); */ /* Swap_Partial_Lk_Extra(b,d,1,tree); */ // First NNI Swap(v1,d,a,u,tree); // Update partial likelihood looking up Update_Partial_Lk(tree,b,a); // Update partial likelihood looking down Update_Partial_Lk(tree,b,d); // Evaluate likelihood if(opt_edges == YES) Br_Len_Opt(&(b->l->v),b,tree); lk1 = Lk(b,tree); /* if(lk1 > lk0 + tree->mod->s_opt->min_diff_lk_move) */ /* { */ /* tree->fully_nni_opt = NO; */ /* return; */ /* } */ l1 = Duplicate_Scalar_Dbl(b->l); // Unswap Swap(u,d,a,v1,tree); // Second NNI Swap(v2,d,a,u,tree); // Update partial likelihood looking up Update_Partial_Lk(tree,b,a); // Update partial likelihood looking down Update_Partial_Lk(tree,b,d); // Evaluate likelihood if(opt_edges == YES) Br_Len_Opt(&(b->l->v),b,tree); lk2 = Lk(b,tree); /* if(lk2 > lk0 + tree->mod->s_opt->min_diff_lk_move) */ /* { */ /* tree->fully_nni_opt = NO; */ /* Free_Scalar_Dbl(l1); */ /* return; */ /* } */ l2 = Duplicate_Scalar_Dbl(b->l); // Unswap Swap(u,d,a,v2,tree); /* Swap_Partial_Lk_Extra(b,a,0,tree); */ /* Swap_Partial_Lk_Extra(b,d,1,tree); */ /* if((u->tax == YES && !strcmp(u->name,"tax57")) || */ /* (v1->tax == YES && !strcmp(v1->name,"tax57")) || */ /* (v2->tax == YES && !strcmp(v2->name,"tax57"))) */ /* printf("\n. lk0: %G lk1: %G lk2: %G l0: %G l1: %G l2: %G",lk0,lk1,lk2,l0->v,l1->v,l2->v); */ /* printf("\n. a: %d d: %d -- lk0: %f lk1: %f lk2: %f p: %G %G %G %G",a->num,d->num,lk0,lk1,lk2,p_accept,l0->v,l1->v,l2->v); */ p_accept = exp((lk1-lk0)/(tree->annealing_temp+1.E-6)); if(Are_Equal(lk1,lk0,tree->mod->s_opt->min_diff_lk_local) && Are_Equal(tree->annealing_temp,0.0,1.E-3)) p_accept = .0; rnd = Uni(); if(rnd < p_accept && lk2 < lk1) { Swap(v1,d,a,u,tree); Copy_Scalar_Dbl(l1,b->l); tree->c_lnL = lk1; Update_Partial_Lk(tree,b,a); Update_Partial_Lk(tree,b,d); tree->fully_nni_opt = NO; } else { p_accept = exp((lk2-lk0)/(tree->annealing_temp+1.E-6)); if(Are_Equal(lk2,lk0,tree->mod->s_opt->min_diff_lk_local) && Are_Equal(tree->annealing_temp,0.0,1.E-3)) p_accept = .0; rnd = Uni(); if(rnd < p_accept) { Swap(v2,d,a,u,tree); Copy_Scalar_Dbl(l2,b->l); tree->c_lnL = lk2; Update_Partial_Lk(tree,b,a); Update_Partial_Lk(tree,b,d); tree->fully_nni_opt = NO; } else { Update_Partial_Lk(tree,b,a); Update_Partial_Lk(tree,b,d); Copy_Scalar_Dbl(l0,b->l); tree->c_lnL = lk0; } } Update_PMat_At_Given_Edge(b,tree); if(l0) Free_Scalar_Dbl(l0); if(l1) Free_Scalar_Dbl(l1); if(l2) Free_Scalar_Dbl(l2); } stephaneguindon-phyml-76a39c8/src/simu.h000066400000000000000000000025161501136442400203230ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef CURR_H #define CURR_H #include "utilities.h" int Simu(t_tree *tree, int n_step_max, phydbl delta_lnL, phydbl init_T, phydbl delta_T, int min_n_edges_traversed); void Simu_Loop(t_tree *tree); void Select_Edges_To_Swap(t_tree *tree,t_edge **sorted_b,int *n_neg); void Update_Bl(t_tree *tree,phydbl fact); void Make_N_Swap(t_tree *tree,t_edge **b,int beg,int end); int Make_Best_Swap(t_tree *tree); int Mov_Backward_Topo_Bl(t_tree *tree,phydbl lk_old,t_edge **tested_b,int n_tested); void Unswap_N_Branch(t_tree *tree,t_edge **b,int beg,int end); void Swap_N_Branch(t_tree *tree,t_edge **b,int beg,int end); void Check_NNI_Scores_Around(t_node *a, t_node *d, t_edge *b, phydbl *best_score, t_tree *tree); int Mov_Backward_Topo_Pars(t_tree *tree, int pars_old, t_edge **tested_b, int n_tested); void Simu_Pars(t_tree *tree, int n_step_max); void NNI_Traversal(t_node *a, t_node *d, t_node *v, t_edge *b, int opt_edges, t_tree *tree); void NNI_Core(t_node *a, t_node *d, t_node *v, t_edge *b, int opt_edges, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/slfv.c000066400000000000000000002450131501136442400203140ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "slfv.h" /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Prob_Two_Lineages_Coal(t_ldsk *l0, t_ldsk *l1, t_tree *tree) { phydbl eucl,prob,area,W,H; assert(tree->mmod->n_dim == 2); W = (tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0]); H = (tree->mmod->lim_up->lonlat[1]-tree->mmod->lim_do->lonlat[1]); area = W*H; eucl = Euclidean_Distance(l0->coord,l1->coord); prob = 0.0; prob += 2.*log(tree->mmod->mu); prob += 2.*log(tree->mmod->rad); prob += log(PI); prob -= log(4.*area); prob -= 0.25*eucl*eucl/(tree->mmod->rad*tree->mmod->rad); prob += log(erf((l0->coord->lonlat[0] + l1->coord->lonlat[0])/(2.*tree->mmod->rad)) + erf((2.*W - l0->coord->lonlat[0] - l1->coord->lonlat[0])/(2.*tree->mmod->rad))); prob += log(erf((l0->coord->lonlat[1] + l1->coord->lonlat[1])/(2.*tree->mmod->rad)) + erf((2.*H - l0->coord->lonlat[1] - l1->coord->lonlat[1])/(2.*tree->mmod->rad))); prob = exp(prob); return(prob); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Prob_Two_Random_Lineages_Coal_One_Event(phydbl w, phydbl h, phydbl mu, phydbl rad) { phydbl cx,cy; phydbl l1x,l1y; phydbl l2x,l2y; phydbl prob_hit; int n_hit,n_trials,trial; n_trials = 10000000; trial = 0; n_hit = 0; do { cx = Uni()*w; cy = Uni()*h; l1x = Uni()*w; l1y = Uni()*h; l2x = Uni()*w; l2y = Uni()*h; prob_hit = log(mu); prob_hit += -POW(l1x - cx,2)/(2.*pow(rad,2)); prob_hit += -POW(l1y - cy,2)/(2.*pow(rad,2)); prob_hit += log(mu); prob_hit += -POW(l2x - cx,2)/(2.*pow(rad,2)); prob_hit += -POW(l2y - cy,2)/(2.*pow(rad,2)); prob_hit = exp(prob_hit); if(!(Uni() > prob_hit)) n_hit++; trial++; } while(trial != n_trials); return((phydbl)n_hit/n_trials); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Coalescence rate with time expressed in calendar unit phydbl SLFV_Coalescence_Rate(t_tree *tree) { phydbl mu,theta,lbda,w,h; mu = tree->mmod->mu; theta = tree->mmod->rad; lbda = tree->mmod->lbda; w = (tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0]); h = (tree->mmod->lim_up->lonlat[1]-tree->mmod->lim_do->lonlat[1]); return(4.*POW(PI,2)*POW(theta,4)*POW(mu,2)*lbda / (POW(w,2)*POW(h,2))); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Log-density of path, conditionned on its length phydbl SLFV_Path_Logdensity(t_ldsk *young, t_ldsk *old, phydbl *sd, t_tree *tree) { int i,err; t_ldsk *ldsk; phydbl lnP,mode,var; phydbl X,Y,Xp,Yp; /* phydbl slope,inter,mode; */ int dir_to_young; phydbl dt_young,dt_old,sum; phydbl pos; lnP = 0.0; mode = 0.0; for(i=0;immod->n_dim;i++) { ldsk = young->prev; X = old->coord->lonlat[i]; Y = old->disk->time; // Density up to the last jump (to old ldsk) which should // not be accounted for (it is not part of the simulation // when randomly generating a path using SLFV_Generate_Path while(ldsk != old) { if(ldsk->n_next > 1) dir_to_young = PHYREX_Get_Next_Direction(young,ldsk); else dir_to_young = 0; Xp = ldsk->next[dir_to_young]->coord->lonlat[i]; Yp = ldsk->next[dir_to_young]->disk->time; /* slope = (Yp-Y)/(Xp-X); */ /* inter = Y - slope*X; */ /* mode = (ldsk->disk->time - inter)/slope; */ dt_young = fabs(Yp - ldsk->disk->time); dt_old = fabs(Y - ldsk->disk->time); sum = dt_young + dt_old; mode = (dt_young/sum)*X + (dt_old/sum)*Xp; var = dt_young*dt_old/sum * sd[i] * sd[i]; assert(ldsk != NULL); lnP += Log_Dnorm_Trunc(ldsk->coord->lonlat[i], mode, sqrt(var), tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); /* lnP += Log_Dnorm(ldsk->coord->lonlat[i], */ /* mode, */ /* sqrt(var), */ /* &err); */ pos = 0.0; if(ldsk->coord->lonlat[i] > tree->mmod->lim_up->lonlat[i]) pos = tree->mmod->lim_up->lonlat[i]; else if(ldsk->coord->lonlat[i] < tree->mmod->lim_do->lonlat[i]) pos = tree->mmod->lim_do->lonlat[i]; else pos = ldsk->coord->lonlat[i]; lnP += Log_Dnorm_Trunc(ldsk->disk->centr->lonlat[i], pos, sd[i], tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); ldsk = ldsk->prev; } } return(lnP); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void SLFV_Sample_Path(t_ldsk *young, t_ldsk *old, phydbl *sd, phydbl *global_hr, t_tree *tree) { phydbl new_ldsk_pos,cur_ldsk_pos; phydbl new_centr_pos,cur_centr_pos; phydbl new_glnL,cur_glnL; phydbl u,alpha,ratio,hr; int n_mcmc_iter; int i,err; t_ldsk *ldsk; int path_len; path_len = PHYREX_Path_Len(young,old)-2; if(path_len == 0) return; assert(young != old); new_glnL = cur_glnL = tree->mmod->c_lnL; n_mcmc_iter = 0; do { ldsk = young->prev; do { assert(ldsk->prev); PHYREX_Store_Geo_Coord(ldsk->coord); PHYREX_Store_Geo_Coord(ldsk->disk->centr); hr = 0.0; ratio = 0.0; cur_glnL = SLFV_Lk_Range(ldsk->disk,ldsk->prev->disk,tree); new_glnL = cur_glnL; for(i=0;immod->n_dim;i++) { cur_ldsk_pos = ldsk->coord->lonlat[i]; cur_centr_pos = ldsk->disk->centr->lonlat[i]; /* new_centr_pos = Rnorm_Trunc(cur_centr_pos, */ /* 0.5*sd, */ /* 0.0, */ /* tree->mmod->lim->lonlat[i],&err); */ new_centr_pos = Uni() * (tree->mmod->lim_up->lonlat[i]-tree->mmod->lim_do->lonlat[i])+tree->mmod->lim_do->lonlat[i]; new_ldsk_pos = Rnorm_Trunc(new_centr_pos, sd[i], tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); /* PhyML_Printf("\n. cur_centr: %12f new_centr: %12f",cur_centr_pos,new_centr_pos); */ /* PhyML_Printf(" d(new|cur)=%12f d(cur|new): %12f", */ /* Log_Dnorm_Trunc(new_centr_pos, */ /* cur_centr_pos, */ /* 0.5*sd, */ /* 0.0, */ /* tree->mmod->lim->lonlat[i],&err), */ /* Log_Dnorm_Trunc(cur_centr_pos, */ /* new_centr_pos, */ /* 0.5*sd, */ /* 0.0, */ /* tree->mmod->lim->lonlat[i],&err)); */ /* PhyML_Printf(" cur_ldsk: %12f new_ldsk: %12f",cur_ldsk_pos,new_ldsk_pos); */ /* PhyML_Printf(" d(new|cur)=%12f d(cur|new): %12f", */ /* Log_Dnorm_Trunc(new_ldsk_pos, */ /* new_centr_pos, */ /* 0.5*sd, */ /* 0.0, */ /* tree->mmod->lim->lonlat[i],&err), */ /* Log_Dnorm_Trunc(cur_ldsk_pos, */ /* cur_centr_pos, */ /* 0.5*sd, */ /* 0.0, */ /* tree->mmod->lim->lonlat[i],&err)); */ hr -= Log_Dnorm_Trunc(new_ldsk_pos, new_centr_pos, sd[i], tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); /* hr -= Log_Dnorm_Trunc(new_centr_pos, */ /* cur_centr_pos, */ /* 0.5*sd, */ /* 0.0, */ /* tree->mmod->lim->lonlat[i],&err); */ hr += Log_Dnorm_Trunc(cur_ldsk_pos, cur_centr_pos, sd[i], tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); /* hr += Log_Dnorm_Trunc(cur_centr_pos, */ /* new_centr_pos, */ /* 0.5*sd, */ /* 0.0, */ /* tree->mmod->lim->lonlat[i],&err); */ ldsk->coord->lonlat[i] = new_ldsk_pos; ldsk->disk->centr->lonlat[i] = new_centr_pos; } new_glnL = SLFV_Lk_Range(ldsk->disk,ldsk->prev->disk,tree); if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) new_glnL = UNLIKELY; /* PhyML_Printf("\n. k: %4d lnL: %f",k,cur_glnL); */ ratio += (new_glnL - cur_glnL); ratio += hr; /* (*global_hr) -= ratio; */ ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); if(u > alpha) /* Reject */ { PHYREX_Restore_Geo_Coord(ldsk->coord); PHYREX_Restore_Geo_Coord(ldsk->disk->centr); } else { cur_glnL = new_glnL; } ldsk = ldsk->prev; } while(ldsk != old); n_mcmc_iter++; } while(n_mcmc_iter < 100 * path_len); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_ldsk *SLFV_Generate_Path(t_ldsk *young, t_ldsk *old, int n_evt, phydbl *sd, t_tree *tree) { int i,j,swap,err; phydbl *time,dum,mode,var; t_ldsk *path,**ldsk_a; t_dsk *disk; phydbl X,Y,Xp,Yp; /* phydbl slope,inter; */ phydbl dt_young,dt_old,sum; phydbl pos; path = NULL; if(n_evt == 0) return(NULL); // path is set to NULL time = (phydbl *)mCalloc(n_evt,sizeof(phydbl)); ldsk_a = (t_ldsk **)mCalloc(n_evt,sizeof(t_ldsk *)); for(i=0;idisk->time - old->disk->time) + old->disk->time; /* Bubble sort time in decreasing order */ do { swap = NO; for(i=0;i time[i]) { swap = YES; dum = time[i+1]; time[i+1] = time[i]; time[i] = dum; } } } while(swap == YES); for(i=0;immod->n_dim); disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); PHYREX_Init_Lindisk_Node(ldsk_a[i],disk,tree->mmod->n_dim); PHYREX_Make_Lindisk_Next(ldsk_a[i]); PHYREX_Init_Disk_Event(disk,tree->mmod->n_dim,tree->mmod); disk->ldsk = ldsk_a[i]; disk->time = time[i]; } for(i=0;iprev = ldsk_a[i+1]; ldsk_a[i]->prev = NULL; for(i=1;inext[0] = ldsk_a[i-1]; ldsk_a[0]->next[0] = NULL; path = ldsk_a[0]; /* Instantiate path */ for(i=0;immod->n_dim;i++) { X = old->coord->lonlat[i]; Y = old->disk->time; for(j=0;jcoord->lonlat[i]; Yp = young->disk->time; } else { assert(ldsk_a[j]->n_next == 1); Xp = ldsk_a[j]->next[0]->coord->lonlat[i]; Yp = ldsk_a[j]->next[0]->disk->time; } /* slope = (Yp-Y)/(Xp-X); */ /* inter = Y - slope*X; */ /* if(j == 0) */ /* { */ /* mode = (young->disk->time - inter)/slope; */ /* } */ /* else */ /* { */ /* mode = (ldsk_a[j]->next[0]->disk->time - inter)/slope; */ /* } */ dt_young = fabs(Yp - ldsk_a[j]->disk->time); dt_old = fabs(Y - ldsk_a[j]->disk->time); sum = dt_young + dt_old; mode = (dt_young/sum)*X + (dt_old/sum)*Xp; var = dt_young*dt_old/sum * sd[i] * sd[i]; /* ldsk_a[j]->coord->lonlat[i] = Rnorm(mode,sqrt(var)); */ ldsk_a[j]->coord->lonlat[i] = Rnorm_Trunc(mode, sqrt(var), tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); pos = 0.0; if(ldsk_a[j]->coord->lonlat[i] > tree->mmod->lim_up->lonlat[i]) pos = tree->mmod->lim_up->lonlat[i]; else if(ldsk_a[j]->coord->lonlat[i] < tree->mmod->lim_do->lonlat[i]) pos = tree->mmod->lim_do->lonlat[i]; else pos = ldsk_a[j]->coord->lonlat[i]; ldsk_a[j]->disk->centr->lonlat[i] = Rnorm_Trunc(pos, sd[i], tree->mmod->lim_do->lonlat[i], tree->mmod->lim_up->lonlat[i],&err); } } Free(ldsk_a); Free(time); return(path); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Effective_Density(t_tree *tree) { return(SLFV_Neighborhood_Size(tree)/(4.*PI*SLFV_Update_Sigsq(tree))); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Rate_Per_Unit_Area(t_tree *tree) { int i; phydbl denom; denom = (tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0]); for(i=1;immod->n_dim;i++) denom *= (tree->mmod->lim_up->lonlat[i]-tree->mmod->lim_do->lonlat[i]); return(tree->mmod->lbda / denom); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Sample_Rad_From_Prior(t_tree *tree) { phydbl u,h,w,lbda,mu,b,a; h = (tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0]); w = (tree->mmod->lim_up->lonlat[1]-tree->mmod->lim_do->lonlat[1]); lbda = tree->mmod->lbda; mu = tree->mmod->mu; a = tree->mmod->min_sigsq; b = tree->mmod->max_sigsq; u = Uni(); return(POW(((b-a)*u+a)*h*w/(4.*PI*lbda*mu),0.25)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Update_Radius(t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_UNIFORM: { return(-1.0); break;} case SLFV_GAUSSIAN: { return(POW(tree->mmod->sigsq[0]/(SLFV_Rate_Per_Unit_Area(tree)*4.*PI*tree->mmod->mu),0.25)); break; } } return(-1.); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Generation_Length(t_tree *tree) { return(1./(2.*tree->mmod->mu*POW(tree->mmod->rad,2)*PI*SLFV_Rate_Per_Unit_Area(tree))); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Neighborhood_Size(t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_UNIFORM: { return(1./tree->mmod->mu); break; } case SLFV_GAUSSIAN: { return(2./tree->mmod->mu); break; } } return(-1.); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Update_Sigsq(t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_UNIFORM : { return(-1.0); break;} case SLFV_GAUSSIAN : { return(4.*PI* SLFV_Rate_Per_Unit_Area(tree) * pow(tree->mmod->rad,4)* tree->mmod->mu); break; } } return(-1.); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Uses the regression technique described in Barton et al. TPB (2013) to estimate the size of the neighborhood when the population evolve according to a spatial Lambda-Fleming-Viot process. */ phydbl SLFV_Neighborhood_Size_Regression(t_tree *tree) { int i,j,pair,ij_dist; t_node *anc; phydbl *dist,min_dist; phydbl QA,Qr,*fst,fst0,fst_min_dist; phydbl cov_fst_dist,var_dist,slope; phydbl eps; eps = 1.E-10; QA = Mean_Identity(tree->data); fst = (phydbl *)mCalloc(tree->n_otu*(tree->n_otu-1)/2,sizeof(phydbl)); dist = (phydbl *)mCalloc(tree->n_otu*(tree->n_otu-1)/2,sizeof(phydbl)); pair = 0; fst0 = 0.0; ij_dist = 0; for(i=0;in_otu-1;i++) { fst_min_dist = 0.0; min_dist = MDBL_MAX; for(j=i+1;jn_otu;j++) { anc = Find_Lca_Pair_Of_Nodes(tree->a_nodes[i],tree->a_nodes[j],&ij_dist,tree); if(anc == NULL) { PhyML_Fprintf(stderr,"\n. %s",Write_Tree(tree)); PhyML_Fprintf(stderr,"\n. %s %s",tree->a_nodes[i]->name,tree->a_nodes[j]->name); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } dist[pair] = Euclidean_Distance(tree->a_nodes[i]->ldsk->coord,tree->a_nodes[j]->ldsk->coord); dist[pair] = log(dist[pair]); Qr = Pairwise_Identity(i,j,tree->data); fst[pair] = (Qr-QA)/(1.-QA); if(dist[pair] < min_dist) { min_dist = dist[pair]; fst_min_dist = fst[pair]; } pair++; } fst0 += fst_min_dist; } fst0 /= (phydbl)(tree->n_otu); cov_fst_dist = Covariance(dist,fst,pair); var_dist = Variance(dist,pair); slope = cov_fst_dist / var_dist; Free(dist); Free(fst); return((fst0-1.+eps)/(slope+eps)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree) { phydbl lnP; lnP = UNLIKELY; switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { lnP = SLFV_Lk_Gaussian_Range(young,old,tree); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } default : break; } return(lnP); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Lk_Gaussian_Range(t_dsk *young, t_dsk *old, t_tree *tree) { t_dsk *disk; phydbl lnL,dt,disk_lnL; int n_evt; assert(young); lnL = 0.0; lnL += SLFV_Lk_Gaussian_Core(young,tree); disk_lnL = 0.0; dt = 0.0; n_evt = 0; disk = young->prev; do { if(disk->age_fixed == NO) { dt += fabs(disk->next->time - disk->time); n_evt++; } assert(disk); if(disk->time > disk->next->time) return UNLIKELY; disk_lnL = SLFV_Lk_Gaussian_Core(disk,tree); lnL += disk_lnL; if(disk->next != NULL) disk->cum_glnL = disk->next->cum_glnL + disk_lnL; if(disk == old) break; disk = disk->prev; } while(disk); lnL += n_evt * log(tree->mmod->lbda) - tree->mmod->lbda * dt; return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl SLFV_Lk_Gaussian_Core(t_dsk *disk, t_tree *tree) { phydbl lnL,log_prob_hit,log_mu; int was_hit,i,j,err; phydbl two_theta_two; two_theta_two = 2.*pow(tree->mmod->rad,2); lnL = 0.0; log_mu = log(tree->mmod->mu); was_hit = (disk->ldsk != NULL); if(disk == tree->young_disk) return 0.0; if(disk->age_fixed == YES) return 0.0; for(i=0;in_ldsk_a;++i) if(disk->ldsk_a[i]->prev->disk->time > disk->time) return UNLIKELY; if(disk->ldsk != NULL) { for(i=0;in_ldsk_a;++i) if(disk->ldsk_a[i]->prev == disk->ldsk) break; if(i == disk->n_ldsk_a) return UNLIKELY; /* assert(i != disk->n_ldsk_a); */ } for(i=0;in_ldsk_a;++i) { if(PHYREX_Is_In_Ldscape(disk->ldsk_a[i],tree->mmod) == NO) { for(j=0;jmmod->n_dim;j++) PhyML_Fprintf(stdout,"\n. Found a lineage outside habitat (%20f)",disk->ldsk_a[i]->coord->lonlat[j]); return(UNLIKELY); } log_prob_hit = log_mu; for(j=0;jmmod->n_dim;j++) log_prob_hit += -pow(disk->ldsk_a[i]->coord->lonlat[j] - disk->centr->lonlat[j],2)/two_theta_two; if(disk->ldsk_a[i]->prev == disk->ldsk) // disk->ldsk_a[i] was hit { lnL += log_prob_hit; } else // disk->ldsk_a[i] was not hit { lnL += log(1. - exp(log_prob_hit)); } } /* a hit occurred */ if(was_hit == TRUE) { err = NO; for(j=0;jmmod->n_dim;j++) lnL += Log_Dnorm_Trunc(disk->ldsk->coord->lonlat[j], disk->centr->lonlat[j], tree->mmod->rad, tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); } /* Likelihood for the disk center */ for(j=0;jmmod->n_dim;j++) lnL += log(1./(tree->mmod->lim_up->lonlat[j]-tree->mmod->lim_do->lonlat[j])); return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl SLFV_Lk_Gaussian(t_tree *tree) { t_dsk *disk; assert(!tree->young_disk->next); assert(tree->young_disk->prev); tree->mmod->c_lnL = 0.0; if(PHYREX_Total_Number_Of_Intervals(tree) > tree->mmod->max_num_of_intervals) { tree->mmod->c_lnL = UNLIKELY; return UNLIKELY; } if(isinf(tree->mmod->c_lnL) || isnan(tree->mmod->c_lnL)) { tree->mmod->c_lnL = UNLIKELY; return tree->mmod->c_lnL; } /* tree->mmod->c_lnL += PHYREX_LnPrior_Radius(tree); */ // !!!!!!! Really necessary? PHYREX_Update_Lindisk_List(tree); tree->mmod->c_lnL += SLFV_Lk_Gaussian_Core(tree->young_disk,tree); disk = tree->young_disk->prev; do { assert(disk); if(disk->time > disk->next->time) { PhyML_Printf("\n. Anomaly in ordering of disk times (disk->time: %f disk->next->time: %f)",disk->time,disk->next->time); PhyML_Printf("\n. Currently doing following move: %s",tree->mcmc->move_name[tree->mcmc->move_idx]); tree->mmod->c_lnL = UNLIKELY; return tree->mmod->c_lnL; } tree->mmod->c_lnL += SLFV_Lk_Gaussian_Core(disk,tree); if(disk->prev == NULL) break; disk = disk->prev; } while(1); if(isinf(tree->mmod->c_lnL) || isnan(tree->mmod->c_lnL)) tree->mmod->c_lnL = UNLIKELY; return(tree->mmod->c_lnL); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Simulate Etheridge-Barton model forwards in time, following n_otu lineages // on a rectangle of dimension width x h t_sarea *SLFV_Simulate_Forward_Core(int n_sites, t_tree *tree) { t_dsk *disk,*new_disk; t_ldsk *ldsk,**ldsk_a_pop,**ldsk_a_samp,**ldsk_a_tmp,**ldsk_a_tips,*new_ldsk; t_ll *ldsk_list,*dum_ll; int i,j,n_disk,n_dim,n_otu,init_pop_size,curr_pop_size,parent_id,n_lineages,sample_size,n_poly,*permut,n_sampled_demes; phydbl sum,*parent_prob,prob_death,tree_height,max_x,max_y,trans_x,trans_y,t_sim, one_gen; short int dies,n_remain; t_phyrex_mod *mmod; t_poly **poly; t_sarea *area; short int *is_sampled; phydbl w,h; phydbl cx,cy; phydbl lx,ly; int n_survive,n_offspring, n_gen; mmod = tree->mmod; n_dim = 2; n_otu = tree->n_otu; w = (mmod->lim_up->lonlat[0]-mmod->lim_do->lonlat[0]); h = (mmod->lim_up->lonlat[1]-mmod->lim_do->lonlat[1]); init_pop_size = mmod->rho*w*h; n_gen = 10; // number of generations to simulate one_gen = mmod->gen_cal_time; // time duration of one generation (calendar unit) t_sim = n_gen * one_gen; // total simulation duration (calendar unit) /* Allocate and initialise first disk event */ disk = PHYREX_Make_Disk_Event(n_dim,init_pop_size); PHYREX_Init_Disk_Event(disk,n_dim,NULL); disk->time = 0.0; disk->prev = NULL; disk->n_ldsk_a = init_pop_size; /* Allocate coordinates for all individuals in the starting population */ ldsk_list = NULL; i = 0; do { ldsk = PHYREX_Make_Lindisk_Node(n_dim); PHYREX_Init_Lindisk_Node(ldsk,disk,n_dim); Push_Bottom_Linked_List(ldsk,&ldsk_list,NO); i++; } while(i != init_pop_size); /* Fill in array of lineages on the first disk */ dum_ll = ldsk_list->head; i = 0; do { disk->ldsk_a[i] = (t_ldsk *)dum_ll->v; dum_ll = dum_ll->next; i++; } while(dum_ll != NULL); /* Generate coordinates for all individuals in starting population */ for(i=0;ildsk_a[i]->coord->lonlat[0] = Uni()*w; // longitude disk->ldsk_a[i]->coord->lonlat[1] = Uni()*h; // latitude } n_disk = 0; do { /* Create new disk */ new_disk = PHYREX_Make_Disk_Event(n_dim,1); Free(new_disk->ldsk_a); new_disk->ldsk_a = NULL; PHYREX_Init_Disk_Event(new_disk,n_dim,NULL); new_disk->prev = disk; disk->next = new_disk; n_disk++; /* Coordinates of event */ new_disk->centr->lonlat[0] = Uni()*(mmod->lim_up->lonlat[0]-mmod->lim_do->lonlat[0])+mmod->lim_do->lonlat[0]; new_disk->centr->lonlat[1] = Uni()*(mmod->lim_up->lonlat[1]-mmod->lim_do->lonlat[1])+mmod->lim_do->lonlat[1]; cx = new_disk->centr->lonlat[0]; cy = new_disk->centr->lonlat[1]; /* Time of new disk */ new_disk->time = disk->time + Rexp(mmod->lbda); /* PhyML_Printf("\n. new_disk->time: %f t_sim: %f",new_disk->time,t_sim); */ /* Size of current population */ curr_pop_size = disk->n_ldsk_a; if(curr_pop_size == 0) { PhyML_Fprintf(stderr,"\n== Population went extinct after %d events",n_disk); Exit("\n"); } if(new_disk->time < t_sim) { /* Select one parent */ parent_prob = (phydbl *)mCalloc(curr_pop_size,sizeof(phydbl)); for(i=0;ildsk_a[i]->coord->lonlat[0]; ly = disk->ldsk_a[i]->coord->lonlat[1]; switch(mmod->model_id) { case SLFV_UNIFORM: { if(PHYREX_Is_In_Disk(disk->ldsk_a[i]->coord,new_disk,mmod) == YES) parent_prob[i] = 1.0; else parent_prob[i] = 0.0; break; } case SLFV_GAUSSIAN: { parent_prob[i] = 0.0; parent_prob[i] += -pow(lx - cx,2)/(2.*pow(mmod->rad,2)); parent_prob[i] += -pow(ly - cy,2)/(2.*pow(mmod->rad,2)); parent_prob[i] = exp(parent_prob[i]); break; } } } sum = 0.0; for(i=0;ildsk = disk->ldsk_a[parent_id]; Free(parent_prob); /* Which lineages survive that event? */ n_survive = 0; for(i=0;ildsk_a[i]->coord->lonlat[0]; ly = disk->ldsk_a[i]->coord->lonlat[1]; prob_death = 0.0; switch(mmod->model_id) { case SLFV_UNIFORM: { if(PHYREX_Is_In_Disk(disk->ldsk_a[i]->coord,new_disk,mmod) == YES) prob_death = mmod->mu; break; } case SLFV_GAUSSIAN: { prob_death = log(mmod->mu); prob_death += -pow(lx - cx,2)/(2.*pow(mmod->rad,2)); prob_death += -pow(ly - cy,2)/(2.*pow(mmod->rad,2)); prob_death = exp(prob_death); break; } } dies = NO; if(Uni() < prob_death) dies = YES; if(dies == NO) { if(n_survive == 0) new_disk->ldsk_a = (t_ldsk **)mCalloc(1,sizeof(t_ldsk *)); else new_disk->ldsk_a = (t_ldsk **)mRealloc(new_disk->ldsk_a,n_survive+1,sizeof(t_ldsk *)); new_disk->ldsk_a[n_survive] = disk->ldsk_a[i]; n_survive++; } } /* PhyML_Printf("\n. n_survive: %d",n_survive); */ /* Offspring */ /* How many? */ phydbl r = mmod->rad; phydbl u = mmod->mu; phydbl rho = mmod->rho; phydbl mean = 0.5*PI*rho*u*r*r* (erf(0.5*sqrt(2.)/r*(cy-0.0))*erf(0.5*sqrt(2.)/r*(cx-0.0)) + erf(0.5*sqrt(2.)/r*(cy-h))*erf(0.5*sqrt(2.)/r*(cx-w)) - erf(0.5*sqrt(2.)/r*(cy-0.0))*erf(0.5*sqrt(2.)/r*(cx-w)) - erf(0.5*sqrt(2.)/r*(cy-h))*erf(0.5*sqrt(2.)/r*(cx-0.0))); n_offspring = Rpois(mean); new_disk->n_ldsk_a = n_survive + n_offspring; /* PhyML_Printf("\n. n_offspring: %d",n_offspring); */ /* Where */ for(i=0;ildsk_a == NULL) new_disk->ldsk_a = (t_ldsk **)mCalloc(n_survive+1,sizeof(t_ldsk *)); else new_disk->ldsk_a = (t_ldsk **)mRealloc(new_disk->ldsk_a,n_survive+i+1,sizeof(t_ldsk *)); new_disk->ldsk_a[n_survive+i] = new_ldsk; /* Generate new location */ switch(mmod->model_id) { case SLFV_UNIFORM: { PHYREX_Runif_Rectangle_Overlap(new_ldsk,new_disk,mmod); break; } case SLFV_GAUSSIAN: { PHYREX_Rnorm_Trunc(new_ldsk,new_disk,mmod); break; } } /* Connect to parent */ new_ldsk->prev = disk->ldsk_a[parent_id]; } } else { new_disk->time = t_sim; new_disk->n_ldsk_a = disk->n_ldsk_a; new_disk->ldsk_a = (t_ldsk **)mCalloc(curr_pop_size,sizeof(t_ldsk *)); for(i=0;ildsk_a[i] = disk->ldsk_a[i]; } disk = new_disk; /* printf("\n. pop size: %6d # of events: %6d",disk->n_ldsk_a,n_disk); */ } while(disk->time < t_sim); /* Dispersal stuff */ /* { */ /* phydbl T = disk->time; // total simulation time (in calendar unit) */ /* t_ldsk *dum_ldsk = disk->ldsk_a[Rand_Int(0,disk->n_ldsk_a-1)]; // random selection of a lineage among all the lineages available at present time */ /* t_dsk *dum_dsk = disk; */ /* phydbl s = w*h; // area */ /* printf("\n. s: %f",s); fflush(NULL); */ /* phydbl gentime = 1./(2.*PI*mmod->rad*mmod->rad*mmod->mu*mmod->lbda/s); */ /* phydbl ssq = 0.0; // sum of squared difference between current and previous position of lineage, when previous pos != current pos. */ /* phydbl curr_pos,prev_pos; */ /* int curr_gen,prev_gen,nhits=0; */ /* prev_pos = dum_ldsk->coord->lonlat[0]; */ /* curr_pos = prev_pos; */ /* curr_gen = prev_gen = 1; */ /* // Compute sum of squared difference of positions */ /* do */ /* { */ /* curr_gen = 1 + (int)(dum_dsk->time-T)/gentime; // increment the number of generations (generation time measured in calendar time units) */ /* curr_pos = dum_ldsk->coord->lonlat[0]; // current position of lineage */ /* if(dum_ldsk->disk == dum_dsk) // lineage was born at that time */ /* { */ /* dum_ldsk = dum_ldsk->prev; // jump to parent */ /* nhits++; */ /* } */ /* if(curr_gen != prev_gen) */ /* { */ /* ssq += pow(curr_pos-prev_pos,2); */ /* prev_pos = curr_pos; */ /* prev_gen = curr_gen; */ /* } */ /* dum_dsk = dum_dsk->prev; */ /* } */ /* while(dum_dsk); */ /* PhyML_Printf("\n # var T nhits T/nhits gentime sigsq theta u lambda"); */ /* PhyML_Printf("\n a@z %G %f %d %f %f %f %f %f %f", */ /* (1./(T/gentime))*ssq, */ /* T, */ /* nhits, */ /* T/nhits, */ /* gentime, */ /* 4*pow(mmod->rad,4)*mmod->lbda/s*PI*mmod->mu*gentime, */ /* mmod->rad, */ /* mmod->mu, */ /* mmod->lbda); */ /* Exit("\n"); */ /* } */ /* /\* Coalescence stuff *\/ */ /* { */ /* t_ldsk *lin1, *lin2; */ /* int n_evts,have_coal,coal_evt; */ /* phydbl T,t; */ /* /\* Selection of two lineages at random *\/ */ /* while(disk->next) disk = disk->next; */ /* permut = Permutate(disk->n_ldsk_a); */ /* lin1 = disk->ldsk_a[permut[0]]; */ /* lin2 = disk->ldsk_a[permut[1]]; */ /* Free(permut); */ /* printf("\n. disk->time-lin1->prev->time: %f",disk->time-lin1->prev->disk->time); */ /* printf("\n. disk->time-lin2->prev->time: %f",disk->time-lin2->prev->disk->time); */ /* /\* Go back in time *\/ */ /* curr_t = 0.0; */ /* n_evts = 0; */ /* coal_evt = 0; */ /* have_coal = 0; */ /* T = disk->time; */ /* do */ /* { */ /* if(disk->ldsk) n_evts++; */ /* if(disk->ldsk && disk->ldsk == lin1->prev) lin1 = lin1->prev; */ /* if(disk->ldsk && disk->ldsk == lin2->prev) lin2 = lin2->prev; */ /* if(lin1 == lin2) */ /* { */ /* have_coal = 1; */ /* coal_evt = n_evts; */ /* break; */ /* } */ /* disk = disk->prev; */ /* t=disk?disk->time:0.0; */ /* curr_t = (T-t); */ /* /\* printf("\n>>> coal %d n_evts: %d curr_t: %f disk->time: %f T: %f one_gen: %f", *\/ */ /* /\* have_coal, *\/ */ /* /\* n_evts, *\/ */ /* /\* curr_t, *\/ */ /* /\* t, *\/ */ /* /\* T, *\/ */ /* /\* one_gen); *\/ */ /* } */ /* /\* while(disk && n_evts < 2); *\/ */ /* while(disk && curr_t < one_gen); */ /* PhyML_Printf("\n. @ coal : %d %d %f",have_coal,coal_evt,curr_t); */ /* /\* Exit("\n"); *\/ */ /* } */ /* Allocate coordinates for all the tips first (will grow afterwards) */ ldsk_a_samp = (t_ldsk **)mCalloc(n_otu,sizeof(t_ldsk *)); ldsk_a_tips = (t_ldsk **)mCalloc(n_otu,sizeof(t_ldsk *)); ldsk_a_tmp = (t_ldsk **)mCalloc(n_otu,sizeof(t_ldsk *)); while(disk->next) disk = disk->next; ldsk_a_pop = disk->ldsk_a; /* /\* Sample n_otu individuals uniformly at random... *\/ */ /* while(disk->next) disk = disk->next; */ /* permut = Permutate(disk->n_ldsk_a); */ /* for(i=0;in_poly_vert;++j) { poly[i]->poly_vert[j]->lonlat[0] *= (mmod->lim_up->lonlat[0]-mmod->lim_do->lonlat[0])*0.5; poly[i]->poly_vert[j]->lonlat[1] *= (mmod->lim_up->lonlat[1]-mmod->lim_do->lonlat[1])*0.5; } max_x = 0.0; max_y = 0.0; for(j=0;jn_poly_vert;++j) { if(poly[i]->poly_vert[j]->lonlat[0] > max_x) max_x = poly[i]->poly_vert[j]->lonlat[0]; if(poly[i]->poly_vert[j]->lonlat[1] > max_y) max_y = poly[i]->poly_vert[j]->lonlat[1]; } trans_x = Uni()*(mmod->lim_up->lonlat[0] - max_x); trans_y = Uni()*(mmod->lim_up->lonlat[1] - max_y); for(j=0;jn_poly_vert;++j) { poly[i]->poly_vert[j]->lonlat[0] += trans_x; poly[i]->poly_vert[j]->lonlat[1] += trans_y; } } for(i=0;icoord,poly[permut[j]]) == YES) { char *s; int k; s = (char *)mCalloc((int)strlen(ldsk_a_pop[i]->coord->id)+1+50,sizeof(char)); For(k,(int)strlen(ldsk_a_pop[i]->coord->id)+1+20) s[k]='\0'; sprintf(s,"%d_",i); strcat(s,ldsk_a_pop[i]->coord->id); Free(ldsk_a_pop[i]->coord->id); strcat(s,"_deme"); sprintf(s+strlen(s),"%d",permut[j]); ldsk_a_pop[i]->coord->id = s; ldsk_a_samp[sample_size] = ldsk_a_pop[i]; sample_size++; PhyML_Printf("\n@ Coord: %f %f %s %p", ldsk_a_samp[sample_size-1]->coord->lonlat[0], ldsk_a_samp[sample_size-1]->coord->lonlat[1], ldsk_a_pop[i]->coord->id,ldsk_a_pop[i]); is_sampled[permut[j]] = YES; break; } } if(sample_size == n_otu) break; } Free(permut); if(i == curr_pop_size) { for(j=0;jn_poly = n_sampled_demes; n_sampled_demes = 0; for(i=0;ia_poly[n_sampled_demes++] = poly[i]; for(i=0;in_poly;++i) { /* PhyML_Printf("\n@ Poly %3d area = %f",i,Area_Of_Poly_Monte_Carlo(area->a_poly[i],mmod->lim)); */ for(j=0;ja_poly[i]->n_poly_vert;++j) { PhyML_Printf("\n@ Poly %3d point %d (x,y) = (%f,%f)", i, j, area->a_poly[i]->poly_vert[j]->lonlat[0], area->a_poly[i]->poly_vert[j]->lonlat[1]); } } tree->young_disk = disk; disk->ldsk_a = ldsk_a_tips; disk->mmod = tree->mmod; disk->centr->lonlat[0] = .5*(tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0]); disk->centr->lonlat[1] = .5*(tree->mmod->lim_up->lonlat[1]-tree->mmod->lim_do->lonlat[1]); disk->n_ldsk_a = n_otu; n_lineages = n_otu; do { n_remain = 0; for(i=0;iprev->ldsk != NULL) && (disk->prev->ldsk == ldsk_a_samp[i]->prev)) /* Coalescent event is sampled */ { PHYREX_Make_Lindisk_Next(disk->prev->ldsk); disk->prev->ldsk->next[disk->prev->ldsk->n_next-1] = ldsk_a_samp[i]; } else { ldsk_a_tmp[n_remain] = ldsk_a_samp[i]; n_remain++; } } for(i=0;iprev->ldsk != NULL) && (disk->prev->ldsk->n_next > 0)) ldsk_a_samp[i] = disk->prev->ldsk; if((disk->prev->ldsk != NULL) && (disk->prev->ldsk->n_next > 0)) { n_lineages -= (disk->prev->ldsk->n_next); n_lineages += 1; } if(n_lineages != n_remain+(disk->prev->ldsk && disk->prev->ldsk->n_next>0)?1:0) { PhyML_Fprintf(stderr,"\n. n_lineages: %d n_remain: %d n_next: %d", n_lineages, n_remain, disk->prev->ldsk->n_next); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } /* None of the sampled lineages was hit */ if((disk->prev->ldsk != NULL) && (disk->prev->ldsk->n_next == 0)) { /* printf("\n. free %s @ %f",disk->ldsk->coord->id,disk->time); */ PHYREX_Free_Ldisk(disk->prev->ldsk); disk->prev->ldsk = NULL; } disk = disk->prev; if(disk->prev == NULL) { PhyML_Fprintf(stderr,"\n. # lineages left: %d",n_remain); PhyML_Fprintf(stderr,"\n. Sample has not coalesced completely."); fflush(NULL); Exit("\n"); } } while(n_lineages > 1); /* for(i=0;i %s",tree->young_disk->ldsk_a[i]->coord->id); */ disk->prev = NULL; disk = tree->young_disk; tree_height = disk->time; while(disk) { disk->time -= tree_height; disk = disk->prev; } Free(ldsk_a_tmp); Free(ldsk_a_samp); Free(ldsk_a_pop); Free(is_sampled); /* PHYREX_Print_Struct('#',tree); */ /* Exit("\n"); */ return(area); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Simulate Etheridge-Barton model backwards in time, following n_otu lineages // on a rectangle. phydbl SLFV_Simulate_Backward_Core(t_dsk *init_disk, int avoid_multiple_mergers, t_tree *tree) { t_dsk *disk,*new_disk,*oldest_disk; int i,j,reached_oldest_disk,err; phydbl prob_hit,u,new_time,lnL; t_phyrex_mod *mmod; t_node *n; mmod = tree->mmod; Get_Node_Ranks_From_Tip_Times(tree); // Get to the youngest node n = tree->a_nodes[0]; while(n->rk_next) n = n->rk_next; disk = init_disk; // Make sure at least one of the youngest nodes is on init_disk for(i=0;in_ldsk_a;++i) if(init_disk->ldsk_a[i]->nd == n) break; assert(i != init_disk->n_ldsk_a); // Get to the oldest sampled disk disk = init_disk; while(disk->prev) disk = disk->prev; oldest_disk = disk; reached_oldest_disk = NO; if(init_disk->prev == NULL) reached_oldest_disk = YES; // Only one sampled disk lnL = 0.0; disk = init_disk; do { /* MRCA reached */ if(PHYREX_Number_Of_Outgoing_Ldsks(disk) == 1 && reached_oldest_disk == YES) break; /* Proposed new time */ new_time = disk->time - Rexp(mmod->lbda); lnL += log(mmod->lbda) - mmod->lbda * fabs(disk->time - new_time); /* New time is older than previous sampled disk (disk->prev) */ if(disk->prev && new_time < disk->prev->time) { new_disk = disk->prev; new_time = disk->prev->time; // Reached oldest disk -> set it to NULL // so as to indicate that it is ok to stop // the simulation, continue otherwise if(new_disk == oldest_disk) reached_oldest_disk = YES; /* Connect disk and new_disk */ disk->prev = new_disk; new_disk->next = disk; /* Time of next event */ new_disk->time = new_time; /* Populate new_disk->ldsk_a array */ PHYREX_Update_Lindisk_List_Core(new_disk,tree); } else { /* Create new disk */ new_disk = PHYREX_Make_Disk_Event(mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(new_disk,mmod->n_dim,NULL); /* new_disk->prev now points to previous sampled disk */ new_disk->prev = disk->prev; if(disk->prev) disk->prev->next = new_disk; /* Connect disk and new_disk */ disk->prev = new_disk; new_disk->next = disk; /* Time of next event */ new_disk->time = new_time; /* Coordinates of new event */ for(j=0;jn_dim;++j) { switch(mmod->model_id) { case SLFV_UNIFORM : case SLFV_GAUSSIAN : { new_disk->centr->lonlat[j] = Uni()*(mmod->lim_up->lonlat[j]-mmod->lim_do->lonlat[j])+mmod->lim_do->lonlat[j]; break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { new_disk->centr->lonlat[j] = disk->ldsk_a[Rand_Int(0,disk->n_ldsk_a-1)]->coord->lonlat[j]; break; } default : break; } } for(j=0;jn_dim;++j) lnL += log(1./(mmod->lim_up->lonlat[j]-mmod->lim_do->lonlat[j])); /* Populate new_disk->ldsk_a array */ PHYREX_Update_Lindisk_List_Core(new_disk,tree); new_disk->ldsk = NULL; /* Which lineages in new_disk->ldsk_a are hit? */ for(i=0;in_ldsk_a;++i) { prob_hit = -1.; switch(mmod->model_id) { case SLFV_UNIFORM : { prob_hit = mmod->mu; break; } case SLFV_GAUSSIAN : { prob_hit = log(mmod->mu); for(j=0;jn_dim;++j) { prob_hit += -pow(new_disk->ldsk_a[i]->coord->lonlat[j] - new_disk->centr->lonlat[j],2)/(2.*pow(mmod->rad,2)); } prob_hit = exp(prob_hit); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { prob_hit = 1./(new_disk->n_ldsk_a+1.); } } u = Uni(); if(!(u > prob_hit)) // disk->ldsk_a[i] is hit { lnL += log(prob_hit); // new_disk->ldsk_a[i] is hit -> coalesce (or just jump) to parent (i.e., new_disk->ldsk) if(new_disk->ldsk == NULL) { new_disk->ldsk = PHYREX_Make_Lindisk_Node(mmod->n_dim); PHYREX_Init_Lindisk_Node(new_disk->ldsk,new_disk,mmod->n_dim); // Generate coordinates for newly created ldsk switch(tree->mmod->model_id) { case SLFV_UNIFORM : { PHYREX_Runif_Rectangle_Overlap(new_disk->ldsk,new_disk,tree->mmod); break; } case SLFV_GAUSSIAN : case RW : case RRW_GAMMA : case RRW_LOGNORMAL : case IBM : case RIBM : case IWNc : case IWNu : case RIWNc : case RIWNu : case IOU : { PHYREX_Rnorm_Trunc(new_disk->ldsk,new_disk,tree->mmod); for(j=0;jmmod->n_dim;++j) lnL += Log_Dnorm_Trunc(new_disk->ldsk->coord->lonlat[j], new_disk->centr->lonlat[j], tree->mmod->rad, tree->mmod->lim_do->lonlat[j], tree->mmod->lim_up->lonlat[j],&err); break; } } } new_disk->ldsk_a[i]->prev = new_disk->ldsk; PHYREX_Make_Lindisk_Next(new_disk->ldsk); new_disk->ldsk->next[new_disk->ldsk->n_next-1] = new_disk->ldsk_a[i]; } else { lnL += log(1. - prob_hit); } if(new_disk->ldsk && new_disk->ldsk->n_next == 2 && avoid_multiple_mergers == YES) break; } } disk = new_disk; } while(1); disk->prev = NULL; return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Simulate Etheridge-Barton model backwards in time, following n_otu lineages, sampled in time interval deltat, // on a rectangle of dimension width w x h // See Kelleher, Barton & Etheridge, Bioinformatics, 2013. t_tree *SLFV_Simulate(int n_otu, int n_sites, phydbl w, phydbl h, phydbl lbda, phydbl rad, phydbl mu, int r_seed, char *datadir) { t_tree *tree; int n_dim,i; t_phyrex_mod *mmod; t_dsk *disk; option *io; t_mod *mod; t_opt *s_opt; calign *cdata; /* phydbl T; */ FILE *fp; char *dum; xml_node *root,*nd,*ndnd,*ndndnd; chdir(datadir); n_dim = 2; // 2-dimensional landscape io = (option *)Make_Input(); mod = (t_mod *)Make_Model_Basic(); s_opt = (t_opt *)Make_Optimiz(); Set_Defaults_Input(io); Set_Defaults_Model(mod); Set_Defaults_Optimiz(s_opt); io->mod = mod; mod->io = io; mod->s_opt = s_opt; io->r_seed = r_seed; io->n_otu = n_otu; io->init_len = 500; /* sequence length */ io->data = Make_Empty_Alignment(io); Make_Model_Complete(io->mod); Set_Model_Name(io->mod); io->colalias = NO; cdata = Compact_Data(io->data,io); Free_Seq(io->data,io->n_otu); tree = Make_Tree_From_Scratch(n_otu,cdata); Connect_CSeqs_To_Nodes(cdata,io,tree); tree->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->rates,io->rates,tree->n_otu); tree->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->times,io->times,tree->n_otu); tree->data = cdata; tree->mod = mod; tree->io = io; /* Allocate migrep model */ mmod = PHYREX_Make_Migrep_Model(tree->n_otu,n_dim); tree->mmod = mmod; tree->mmod->n_dim = 2; PHYREX_Set_Default_Migrep_Mod(tree->n_otu,tree->mmod); PHYREX_Init_Migrep_Mod(mmod,n_dim,0.0,0.0,w,h); mmod->lbda = lbda; mmod->rad = rad; mmod->mu = mu; if(mmod->lbda > mmod->max_lbda) mmod->lbda = mmod->max_lbda; if(mmod->rad > mmod->max_rad) mmod->rad = mmod->max_rad; if(mmod->mu > mmod->max_mu) mmod->mu = mmod->max_mu; if(mmod->lbda < mmod->min_lbda) mmod->lbda = mmod->min_lbda; if(mmod->rad < mmod->min_rad) mmod->rad = mmod->min_rad; if(mmod->mu < mmod->min_mu) mmod->mu = mmod->min_mu; mmod->sigsq[0] = SLFV_Update_Sigsq(tree); // Duration of a generation in number of events mmod->gen_cal_time = 1./(2.*mmod->mu*pow(mmod->rad,2)/pow(w*h,2)* (sqrt(2.)*mmod->rad*exp(-.5*pow(h/mmod->rad,2)) + h*sqrt(PI)*erf(sqrt(2.)*h/(2.*mmod->rad)) - sqrt(2.)*mmod->rad)* (sqrt(2.)*mmod->rad*exp(-.5*pow(w/mmod->rad,2)) + w*sqrt(PI)*erf(sqrt(2.)*w/(2.*mmod->rad)) - sqrt(2.)*mmod->rad)); // Divide by rate of events per calendar time unit to get duration of gen. in calendar time unit mmod->gen_cal_time *= 1./mmod->lbda; /* Prepare start disk */ tree->young_disk = PHYREX_Make_Disk_Event(tree->mmod->n_dim,tree->n_otu); tree->young_disk->time = 0.0; tree->young_disk->age_fixed = YES; tree->young_disk->centr->lonlat[0] = .5*(tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0]); tree->young_disk->centr->lonlat[1] = .5*(tree->mmod->lim_up->lonlat[1]-tree->mmod->lim_do->lonlat[1]); tree->young_disk->n_ldsk_a = tree->n_otu; for(i=0;in_otu;++i) { char *s; tree->young_disk->ldsk_a[i] = PHYREX_Make_Lindisk_Node(tree->mmod->n_dim); PHYREX_Init_Lindisk_Node(tree->young_disk->ldsk_a[i],tree->young_disk,tree->mmod->n_dim); s = (char *)mCalloc(strlen(tree->young_disk->ldsk_a[i]->coord->id)+1+20,sizeof(char)); strcpy(s,tree->young_disk->ldsk_a[i]->coord->id); strcat(s,"_deme0\0"); Free(tree->young_disk->ldsk_a[i]->coord->id); tree->young_disk->ldsk_a[i]->coord->id = s; } /* Generate coordinates for the tip nodes (uniform distribution on the rectangle) */ for(i=0;in_otu;i++) { tree->young_disk->ldsk_a[i]->coord->lonlat[0] = Uni()*(tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0])+tree->mmod->lim_do->lonlat[0]; // longitude tree->young_disk->ldsk_a[i]->coord->lonlat[1] = Uni()*(tree->mmod->lim_up->lonlat[1]-tree->mmod->lim_do->lonlat[1])+tree->mmod->lim_do->lonlat[1]; // latitude } /* for(i=0;in_otu;i++) */ /* { */ /* tree->young_disk->ldsk_a[i]->coord->lonlat[0] = Uni()*2.+4.; // longitude */ /* tree->young_disk->ldsk_a[i]->coord->lonlat[1] = Uni()*2.+4.; // latitude */ /* } */ for(i=0;in_otu;i++) { tree->young_disk->ldsk_a[i]->nd = tree->a_nodes[i]; tree->a_nodes[i]->ldsk = tree->young_disk->ldsk_a[i]; } SLFV_Simulate_Backward_Core(tree->young_disk,NO,tree); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_slfv_tree.txt"); fp = Openfile(dum,WRITE); PHYREX_Draw_Tree(fp,tree); fclose(fp); Free(dum); PHYREX_Ldsk_To_Tree(tree); Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); RATES_Fill_Lca_Table(tree); /* min_rate = 1.E-5; */ /* max_rate = 1.E-4; */ // phydbl T = PHYREX_Tree_Height(tree); phydbl L = PHYREX_Time_Tree_Length(tree); tree->rates->bl_from_rt = YES; // tree->rates->clock_r = 0.1/fabs(2.*T); tree->rates->clock_r = 0.1 / L * (2*tree->n_otu-2); tree->rates->model_id = STRICTCLOCK; RATES_Update_Edge_Lengths(tree); Init_Model(cdata,mod,io); Set_Model_Parameters(mod); tree->mod->ras->n_catg = 1; tree->mod->whichmodel = HKY85; tree->mod->kappa->v = 4.0; Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Make_Spr(tree); EVOLVE_Seq(tree->data,tree->mod,stdout,tree); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_slfv_data.txt"); fp = Openfile(dum,WRITE); Print_CSeq(fp,NO,tree->data,tree); fclose(fp); Free(dum); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_slfv_coord.txt"); fp = Openfile(dum,WRITE); PhyML_Fprintf(fp,"%s\t%s\t%s","Name","Lat","Lon"); for(int i=0;in_otu;++i) PhyML_Fprintf(fp,"\n%s\t%f\t%f", tree->a_nodes[i]->name, tree->a_nodes[i]->ldsk->coord->lonlat[1], tree->a_nodes[i]->ldsk->coord->lonlat[0]); fclose(fp); Free(dum); /* Init_Partial_Lk_Tips_Double(tree); */ /* Init_Partial_Lk_Loc(tree); */ disk = tree->young_disk->prev; while(disk->prev) disk = disk->prev; dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_slfv_params.txt"); fp = Openfile(dum,WRITE); PhyML_Fprintf(fp,"\n. Parameter boundaries: lambda:[%G,%G]; mu=[%G,%G]; rad=[%G,%G]", mmod->min_lbda,mmod->max_lbda, mmod->min_mu,mmod->max_mu, mmod->min_rad,mmod->max_rad); PhyML_Fprintf(fp,"\n. Useful parameters: lambda=%G; mu=%G; rad=%G; clockr=%G; sigsq=%G", mmod->lbda, mmod->mu, mmod->rad, tree->rates->clock_r, mmod->sigsq[0]); PhyML_Fprintf(fp,"\n. Useful statistics: t.root=%f n.int=%d n.coal=%d n.hit=%d root.x=%f root.y=%f nt.div=%f", disk->time, PHYREX_Total_Number_Of_Intervals(tree), PHYREX_Total_Number_Of_Coal_Disks(tree), PHYREX_Total_Number_Of_Hit_Disks(tree), disk->ldsk->coord->lonlat[0], disk->ldsk->coord->lonlat[1], Nucleotide_Diversity(tree->data)); phydbl tot_dist; tot_dist = 0.0; for(i=0;i<2*tree->n_otu-1;++i) { if(tree->a_nodes[i] != tree->n_root) { tot_dist += SLFV_Lineage_Dist(tree->a_nodes[i]->ldsk,tree); } } PhyML_Fprintf(fp,"\n. Average speed: %f",tot_dist / PHYREX_Time_Tree_Length(tree)); PhyML_Fprintf(fp,"\n"); fclose(fp); Free(dum); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_slfv_veloc.txt"); fp = Openfile(dum,WRITE); PhyML_Fprintf(fp,"\nName\tVeloLon\tVeloLat"); for(i=0;in_otu;++i) { PhyML_Fprintf(fp,"\n%s\t%f\t%f", tree->a_nodes[i]->name, SLFV_Lineage_Velocity(tree->a_nodes[i]->ldsk,0,tree), SLFV_Lineage_Velocity(tree->a_nodes[i]->ldsk,1,tree)); } fclose(fp); Free(dum); /* PhyML_Printf("\n. Tree: "); */ /* PhyML_Printf("\n. %s \n",Write_Tree(tree)); */ /* PhyML_Printf("\n. Spatial coordinates: "); */ /* for(i=0;in_otu;i++) */ /* { */ /* PhyML_Printf("\n%15s %12f %12f", */ /* tree->young_disk->ldsk_a[i]->nd->name, */ /* tree->young_disk->ldsk_a[i]->coord->lonlat[0], */ /* tree->young_disk->ldsk_a[i]->coord->lonlat[1]); */ /* } */ /* PhyML_Printf("\n"); */ /* for(int i=0;in_otu;i++) */ /* { */ /* PhyML_Printf("\n",i+1); */ /* PhyML_Printf("\n\t",tree->a_nodes[i]->name); */ /* PhyML_Printf("\n"); */ /* PhyML_Printf("\n",i+1); */ /* PhyML_Printf("\n\t0.0"); */ /* PhyML_Printf("\n\t0.0"); */ /* PhyML_Printf("\n\t",i+1); */ /* PhyML_Printf("\n"); */ /* } */ root = XML_Make_Node("phyrex"); XML_Init_Node(NULL,root,"phyrex"); root->attr = XML_Make_Attribute(NULL,"run.id","ibm"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%d",r_seed); XML_Add_Attribute(root,"output.file",dum); XML_Add_Attribute(root,"mcmc.chain.len","1E+8"); XML_Add_Attribute(root,"mcmc.sample.every","1E+4"); XML_Add_Attribute(root,"mcmc.print.every","1E+4"); XML_Add_Attribute(root,"mcmc.burnin","1E+5"); XML_Add_Attribute(root,"mutmap","no"); XML_Add_Attribute(root,"ignore.sequences","no"); XML_Add_Attribute(root,"mcmc.output.trees","no"); Free(dum); nd = XML_Add_Node(root,"spatialmodel"); nd->attr = XML_Make_Attribute(NULL,"name","ibm"); XML_Add_Attribute(nd,"rw.prior.distrib","exponential"); XML_Add_Attribute(nd,"rw.prior.mean","1.E-3"); XML_Add_Attribute(nd,"rw.root.mean.velocity","0.0"); XML_Add_Attribute(nd,"rw.root.var.velocity","1.E-0"); XML_Add_Attribute(nd,"sampling","detection"); XML_Add_Attribute(nd,"integrateAncestralLocations","true"); XML_Add_Attribute(nd,"distance.type","euclidean"); XML_Add_Attribute(nd,"observational.model","no"); nd = XML_Add_Node(root,"lineagerates"); nd->attr = XML_Make_Attribute(NULL,"model","lognormal"); XML_Add_Attribute(nd,"autocor.prior.rate","100"); nd = XML_Add_Node(root,"treegenerating"); nd->attr = XML_Make_Attribute(NULL,"model","coalescent"); XML_Add_Attribute(nd,"neff.prior.distrib","flat"); XML_Add_Attribute(nd,"fix.node.ages","no"); nd = XML_Add_Node(root,"clockrate"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%f",tree->rates->clock_r); nd->attr = XML_Make_Attribute(NULL,"init.value",dum); XML_Add_Attribute(nd,"opt.clock","no"); Free(dum); nd = XML_Add_Node(root,"topology"); ndnd = XML_Add_Node(nd,"instance"); ndnd->attr = XML_Make_Attribute(NULL,"id","T1"); XML_Add_Attribute(ndnd,"init.tree","BioNJ"); nd = XML_Add_Node(root,"ratematrices"); nd->attr = XML_Make_Attribute(NULL,"id","RM1"); ndnd = XML_Add_Node(nd,"instance"); ndnd->attr = XML_Make_Attribute(NULL,"id","M1"); XML_Add_Attribute(ndnd,"model","HKY85"); XML_Add_Attribute(ndnd,"optimise.tstv","yes"); nd = XML_Add_Node(root,"siterates"); nd->attr = XML_Make_Attribute(NULL,"id","SR1"); ndnd = XML_Add_Node(nd,"instance"); ndnd->attr = XML_Make_Attribute(NULL,"id","R1"); XML_Add_Attribute(ndnd,"init.value","1.0"); ndnd = XML_Add_Node(nd,"weights"); ndnd->attr = XML_Make_Attribute(NULL,"id","D1"); XML_Add_Attribute(ndnd,"family","freerates"); ndndnd = XML_Add_Node(ndnd,"instance"); ndndnd->attr = XML_Make_Attribute(NULL,"appliesto","R1"); XML_Add_Attribute(ndndnd,"value","0.25"); nd = XML_Add_Node(root,"equfreqs"); nd->attr = XML_Make_Attribute(NULL,"id","EF1"); ndnd = XML_Add_Node(nd,"instance"); ndnd->attr = XML_Make_Attribute(NULL,"id","F1"); XML_Add_Attribute(ndnd,"optimise.freqs","no"); nd = XML_Add_Node(root,"branchlengths"); nd->attr = XML_Make_Attribute(NULL,"id","BL1"); ndnd = XML_Add_Node(nd,"instance"); ndnd->attr = XML_Make_Attribute(NULL,"id","L1"); XML_Add_Attribute(ndnd,"optimise.lens","yes"); nd = XML_Add_Node(root,"partitionelem"); nd->attr = XML_Make_Attribute(NULL,"id","partition1"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_slfv_data.txt"); XML_Add_Attribute(nd,"file.name",dum); XML_Add_Attribute(nd,"data.type","nt"); XML_Add_Attribute(nd,"interleaved","no"); Free(dum); ndnd = XML_Add_Node(nd,"mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL,"list","T1"); ndnd = XML_Add_Node(nd,"mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL,"list","M1"); ndnd = XML_Add_Node(nd,"mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL,"list","F1"); ndnd = XML_Add_Node(nd,"mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL,"list","R1"); ndnd = XML_Add_Node(nd,"mixtureelem"); ndnd->attr = XML_Make_Attribute(NULL,"list","L1"); nd = XML_Add_Node(root,"coordinates"); nd->attr = XML_Make_Attribute(NULL,"id","coordinates"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_slfv_coord.txt"); XML_Add_Attribute(nd,"file.name",dum); for(i=0;in_otu;++i) { nd = XML_Add_Node(root,"clade"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d","clad",i+1); nd->attr = XML_Make_Attribute(NULL,"id",dum); Free(dum); ndnd = XML_Add_Node(nd,"taxon"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s",tree->a_nodes[i]->name); ndnd->attr = XML_Make_Attribute(NULL,"value",dum); Free(dum); nd = XML_Add_Node(root,"calibration"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d","cal",i+1); nd->attr = XML_Make_Attribute(NULL,"id",dum); Free(dum); ndnd = XML_Add_Node(nd,"lower"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%f",tree->times->nd_t[tree->a_nodes[i]->num]); XML_Set_Node_Value(ndnd,dum); Free(dum); ndnd = XML_Add_Node(nd,"upper"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%f",tree->times->nd_t[tree->a_nodes[i]->num]); XML_Set_Node_Value(ndnd,dum); Free(dum); ndnd = XML_Add_Node(nd,"appliesto"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d","clad",i+1); ndnd->attr = XML_Make_Attribute(NULL,"clade.id",dum); Free(dum); } dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_ibm_config.xml"); fp = Openfile(dum,WRITE); XML_Write_XML_Graph(fp,root); fclose(fp); Free(dum); XML_Set_Attribute_Value(root,"run.id","rrw"); nd = XML_Search_Node_Name("spatialmodel",NO,root); XML_Set_Attribute_Value(nd,"name","rrw+gamma"); XML_Set_Attribute_Value(nd,"rw.prior.mean","1.E-0"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_rrw_config.xml"); fp = Openfile(dum,WRITE); XML_Write_XML_Graph(fp,root); fclose(fp); Free(dum); XML_Set_Attribute_Value(root,"run.id","iou"); nd = XML_Search_Node_Name("spatialmodel",NO,root); XML_Set_Attribute_Value(nd,"name","iou"); XML_Set_Attribute_Value(nd,"rw.prior.mean","1.E-3"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_iou_config.xml"); fp = Openfile(dum,WRITE); XML_Write_XML_Graph(fp,root); fclose(fp); Free(dum); XML_Set_Attribute_Value(root,"run.id","iwn"); nd = XML_Search_Node_Name("spatialmodel",NO,root); XML_Set_Attribute_Value(nd,"name","iwn"); dum = (char *)mCalloc(100,sizeof(char)); sprintf(dum,"%s%d%s","./",r_seed,"_sim_iwn_config.xml"); fp = Openfile(dum,WRITE); XML_Write_XML_Graph(fp,root); fclose(fp); Free(dum); return(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *SLFV_Simulate_Independent_Loci(int n_otu, int n_loci, phydbl w, phydbl h, int r_seed) { t_tree *tree; int n_dim,i; t_phyrex_mod *mmod; option *io; t_mod *mod; t_opt *s_opt; calign *cdata; phydbl area; phydbl subst_rate; int locus_idx; n_dim = 2; // 2-dimensional landscape area = w * h; io = (option *)Make_Input(); mod = (t_mod *)Make_Model_Basic(); s_opt = (t_opt *)Make_Optimiz(); Set_Defaults_Input(io); Set_Defaults_Model(mod); Set_Defaults_Optimiz(s_opt); // io stuff io->mod = mod; mod->io = io; mod->s_opt = s_opt; io->r_seed = r_seed; io->n_otu = n_otu; io->init_len = n_loci; /* sequence length */ io->data = Make_Empty_Alignment(io); io->colalias = NO; Make_Model_Complete(io->mod); Set_Model_Name(io->mod); cdata = Compact_Data(io->data,io); Free_Seq(io->data,io->n_otu); Print_Settings(io); // tree stuff tree = Make_Tree_From_Scratch(n_otu,cdata); Random_Tree(tree); Connect_CSeqs_To_Nodes(cdata,io,tree); tree->rates = RATES_Make_Rate_Struct(tree->n_otu); io->rates->model_id = STRICTCLOCK; RATES_Init_Rate_Struct(tree->rates,io->rates,tree->n_otu); tree->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->times,io->times,tree->n_otu); tree->data = cdata; tree->mod = mod; tree->io = io; Init_Model(cdata,mod,io); tree->mod->ras->n_catg = 1; tree->mod->whichmodel = HKY85; tree->mod->kappa->v = 4.0; Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Make_Spr(tree); // migrep model stuff */ mmod = PHYREX_Make_Migrep_Model(tree->n_otu,n_dim); tree->mmod = mmod; PHYREX_Init_Migrep_Mod(mmod,n_dim,0.0,0.0,w,h); /* /\* Death proba param *\/ */ /* mmod->mu = Uni(); */ /* /\* Theta (radius) *\/ */ /* mmod->rad = Uni()*(1.0 - 0.2) + 0.2; */ /* /\* Rate of events *\/ */ /* mmod->lbda = 1.0; */ /* /\* Population density *\/ */ /* mmod->rho = Uni()*(3.0 - 0.1) + 0.1; */ /* Death proba param */ mmod->mu = 0.8; /* Theta (radius) */ mmod->rad = 0.3; /* Rate of events */ mmod->lbda = 10.*w*h; /* (Actual, not effective) population density */ mmod->rho = 1.; // Duration of a generation in number of events mmod->gen_cal_time = 1./(2.*mmod->mu*pow(mmod->rad,2)/pow(w*h,2)* (sqrt(2.)*mmod->rad*exp(-.5*pow(h/mmod->rad,2)) + h*sqrt(PI)*erf(sqrt(2.)*h/(2.*mmod->rad)) - sqrt(2.)*mmod->rad)* (sqrt(2.)*mmod->rad*exp(-.5*pow(w/mmod->rad,2)) + w*sqrt(PI)*erf(sqrt(2.)*w/(2.*mmod->rad)) - sqrt(2.)*mmod->rad)); // Divide by rate of events per calendar time unit to get duration of gen. in calendar time unit mmod->gen_cal_time *= 1./mmod->lbda; /* Dispersal parameter (per generation) */ mmod->sigsq[0] = 4.*pow(mmod->rad,4)*mmod->lbda*PI*mmod->mu/area * mmod->gen_cal_time; phydbl p = SLFV_Prob_Two_Random_Lineages_Coal_One_Event(w,h,mmod->mu,mmod->rad); printf("\n. p.sim: %G p.appx: %G",p,4.*pow(mmod->mu,2)*pow(PI,2)*pow(mmod->rad,4)/(pow(w*h,2))); phydbl rhoe = 1./(1.-exp(-mmod->lbda*p*mmod->gen_cal_time)); rhoe /= area; PhyML_Printf("\n. lambda=%G; mu=%G; rad=%G; clockr=%G; sigsq=%G; neigh=%G; rhoe(small rad)=%G rhoe(numerical)=%G rhoe(large rad)=%G one_gen=%G", mmod->lbda, mmod->mu, mmod->rad, tree->rates->clock_r, mmod->sigsq[0], 2./mmod->mu, (1./(1.-exp(-4.*pow(mmod->mu,2)*pow(PI,2)*pow(mmod->rad,4)/(pow(w*h,2))*mmod->lbda*mmod->gen_cal_time)))/area, rhoe, /* (1./(1.-exp(-mmod->lbda*mmod->mu/(w*h))))/area, */ (1./(1.-exp(-mmod->mu)))/area, mmod->gen_cal_time); fflush(NULL); /* Exit("\n"); */ // Initialize position of sampled individuals tree->young_disk = PHYREX_Make_Disk_Event(mmod->n_dim,tree->n_otu); PHYREX_Init_Disk_Event(tree->young_disk,mmod->n_dim,NULL); tree->young_disk->time = 0.0; tree->young_disk->mmod = mmod; tree->young_disk->centr->lonlat[0] = .5*(mmod->lim_up->lonlat[0]-mmod->lim_do->lonlat[0]); tree->young_disk->centr->lonlat[1] = .5*(mmod->lim_up->lonlat[1]-mmod->lim_do->lonlat[1]); tree->young_disk->n_ldsk_a = tree->n_otu; for(i=0;in_otu;++i) { char *s; tree->young_disk->ldsk_a[i] = PHYREX_Make_Lindisk_Node(mmod->n_dim); PHYREX_Init_Lindisk_Node(tree->young_disk->ldsk_a[i],tree->young_disk,mmod->n_dim); s = (char *)mCalloc(strlen(tree->young_disk->ldsk_a[i]->coord->id)+1+20,sizeof(char)); strcpy(s,tree->young_disk->ldsk_a[i]->coord->id); strcat(s,"_deme0\0"); Free(tree->young_disk->ldsk_a[i]->coord->id); tree->young_disk->ldsk_a[i]->coord->id = s; } for(i=0;in_otu;i++) { tree->young_disk->ldsk_a[i]->coord->lonlat[0] = Uni()*(tree->mmod->lim_up->lonlat[0]-tree->mmod->lim_do->lonlat[0]) + tree->mmod->lim_do->lonlat[0]; // longitude tree->young_disk->ldsk_a[i]->coord->lonlat[1] = Uni()*(tree->mmod->lim_up->lonlat[1]-tree->mmod->lim_do->lonlat[1]) + tree->mmod->lim_do->lonlat[1]; // latitude } // Generate sequences subst_rate = .0; locus_idx = 0; do { SLFV_Simulate_Backward_Core(tree->young_disk,NO,tree); // Random selection of a pair. Print out physical distances // between tips and time of coalescence for this pair, at this // particular locus { int *permut = Permutate(tree->n_otu); t_ldsk *lin1 = tree->young_disk->ldsk_a[permut[0]]; t_ldsk *lin2 = tree->young_disk->ldsk_a[permut[1]]; phydbl dist = sqrt(pow(lin1->coord->lonlat[0]-lin2->coord->lonlat[0],2) + pow(lin1->coord->lonlat[1]-lin2->coord->lonlat[1],2)); t_dsk *disk = tree->young_disk; do { if(disk->ldsk == lin1->prev) lin1 = lin1->prev; if(disk->ldsk == lin2->prev) lin2 = lin2->prev; if(lin1 == lin2) break; // found MRCA disk = disk->prev; } while(disk); assert(lin1 && lin2); PhyML_Printf("\n. #$# locus %4d ; physical distance: %G time to coalescence: %G",locus_idx,dist,lin1->disk->time); } PHYREX_Ldsk_To_Tree(tree); Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); RATES_Fill_Lca_Table(tree); tree->rates->bl_from_rt = YES; /* tree->rates->clock_r = 1.E-3/FABS(T); // slow */ /* tree->rates->clock_r = 1.E-0/FABS(T); // fast */ /* tree->rates->clock_r = 1.E-1/FABS(T); // medium */ /* tree->rates->clock_r = 1.E-7; // slow; */ tree->rates->clock_r = 1.E-3; // medium; /* tree->rates->clock_r = 1.E-2; // fast; */ PhyML_Printf("\n. #!# mutation rate at that locus: %G subst. per time unit",tree->rates->clock_r); subst_rate += tree->rates->clock_r; RATES_Update_Edge_Lengths(tree); char *s = Write_Tree(tree); PhyML_Printf("\n. #@# tree: %s",s); Free(s); EVOLVE_Seq(tree->data,tree->mod,stdout,tree); t_dsk *disk = tree->young_disk->prev; while(disk->prev) { disk = disk->prev; if(disk->next->ldsk != NULL) PHYREX_Free_Ldisk(disk->next->ldsk); PHYREX_Free_Disk(disk->next); } locus_idx++; } while(locus_idx < n_loci); PhyML_Printf("\n. #s# average rate of mutation : %G",subst_rate/(phydbl)n_loci); tree->data->format = IBDSIM; PhyML_Printf("\n\n"); Print_CSeq(stdout,NO,tree->data,tree); Exit("\n"); return tree; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void SLFV_Integrated_Coal_Rate(t_ldsk *l0, t_ldsk *l1, phydbl T, t_tree *tree) { t_ldsk *baseline; phydbl integrated_coal_rate,njumps,coaltime; int coal; PhyML_Printf("\n# "); coal = -1; baseline = l0; integrated_coal_rate = 0.0; njumps = 0.0; coaltime = 0.0; do { if(l0->prev->disk->time > l1->prev->disk->time) { assert(coal == -1); integrated_coal_rate += tree->mmod->lbda * SLFV_Prob_Two_Lineages_Coal(l0,l1,tree) * fabs(baseline->disk->time - MAX(l0->prev->disk->time,l1->prev->disk->time)); njumps+=1.0; baseline = l0->prev; l0 = l0->prev; } else if(l0->prev->disk->time < l1->prev->disk->time) { assert(coal == -1); integrated_coal_rate += tree->mmod->lbda * SLFV_Prob_Two_Lineages_Coal(l0,l1,tree) * fabs(baseline->disk->time - MAX(l0->prev->disk->time,l1->prev->disk->time)); njumps+=1.0; baseline = l1->prev; l1 = l1->prev; } else { assert(l0->prev); assert(l1->prev); assert(l0->prev == l1->prev); coaltime = l0->prev->disk->time; if(coaltime > T) { coal = 1; } else { coal = 0; integrated_coal_rate += tree->mmod->lbda * SLFV_Prob_Two_Lineages_Coal(l0,l1,tree) * fabs(baseline->disk->time - T); } l0->prev = NULL; l1->prev = NULL; } } while(l0->prev && l1->prev); PhyML_Printf("%d %f %g %f", coal, integrated_coal_rate, njumps, coaltime); PhyML_Printf("\n"); Exit("\n"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Calculation of Pr(T>n) where T is the proba of coalescence void SLFV_Sum_Coal_Rate(t_ldsk *l0, t_ldsk *l1, int n, t_tree *tree) { t_dsk *disk; phydbl prod_one_min_coal_prob; int coal,n_evts; PhyML_Printf("\n# "); prod_one_min_coal_prob = 0.0; n_evts = 1; coal = 0; disk = tree->young_disk->prev; do { if(n_evts <= n) prod_one_min_coal_prob += log(1. - SLFV_Prob_Two_Lineages_Coal(l0,l1,tree)); if(l0->prev == disk->ldsk) l0 = disk->ldsk; if(l1->prev == disk->ldsk) l1 = disk->ldsk; if(l0 == l1 && n_evts <= n) coal = 1; disk = disk->prev; n_evts++; } while(disk); prod_one_min_coal_prob = exp(prod_one_min_coal_prob); PhyML_Printf("%d %d %f",coal,n_evts,prod_one_min_coal_prob); PhyML_Printf("\n"); Exit("\n"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void SLFV_Generate_Ldsk_New_Location(t_ldsk *l, t_ldsk *prev_l, phydbl rad, phydbl *hr, int dim_idx, t_tree *tree) { int err; phydbl new_c,new_l,c; err = NO; /* Forward move */ new_c = Uni()*(tree->mmod->lim_up->lonlat[dim_idx]-tree->mmod->lim_do->lonlat[dim_idx])+tree->mmod->lim_do->lonlat[dim_idx]; (*hr) -= log(1./(tree->mmod->lim_up->lonlat[dim_idx]-tree->mmod->lim_do->lonlat[dim_idx])); c = new_c; new_l = Rnorm_Trunc(c,rad,tree->mmod->lim_do->lonlat[dim_idx],tree->mmod->lim_up->lonlat[dim_idx],&err); (*hr) -= Log_Dnorm_Trunc(new_l,c,rad,tree->mmod->lim_do->lonlat[dim_idx],tree->mmod->lim_up->lonlat[dim_idx],&err); /* Reverse move */ c = prev_l->disk->centr->lonlat[dim_idx]; (*hr) += Log_Dnorm_Trunc(prev_l->coord->lonlat[dim_idx],c,rad,tree->mmod->lim_do->lonlat[dim_idx],tree->mmod->lim_up->lonlat[dim_idx],&err); l->disk->centr->lonlat[dim_idx] = new_c; l->coord->lonlat[dim_idx] = new_l; assert(err == NO); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_LnPrior_Lbda(t_tree *tree) { if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod)) return(0.0); if(tree->mmod->lbda < tree->mmod->min_lbda) return UNLIKELY; if(tree->mmod->lbda > tree->mmod->max_lbda) return UNLIKELY; /* tree->mmod->c_ln_prior_lbda = */ /* log(tree->mmod->prior_param_lbda) - */ /* tree->mmod->prior_param_lbda*tree->mmod->lbda; */ /* tree->mmod->c_ln_prior_lbda -= log(exp(-tree->mmod->prior_param_lbda*tree->mmod->min_lbda)- */ /* exp(-tree->mmod->prior_param_lbda*tree->mmod->max_lbda)); */ tree->mmod->c_ln_prior_lbda = -log(tree->mmod->max_lbda - tree->mmod->min_lbda);; return(tree->mmod->c_ln_prior_lbda); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_LnPrior_Mu(t_tree *tree) { if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod) == YES) return(0.0); if(tree->mmod->mu < tree->mmod->min_mu) return UNLIKELY; if(tree->mmod->mu > tree->mmod->max_mu) return UNLIKELY; tree->mmod->c_ln_prior_mu = -log(tree->mmod->max_mu - tree->mmod->min_mu); /* tree->mmod->c_ln_prior_mu = -2.*log(tree->mmod->mu); */ return(tree->mmod->c_ln_prior_mu); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_LnPrior_Radius(t_tree *tree) { if(RRW_Is_Rw(tree->mmod) == YES || VELOC_Is_Integrated_Velocity(tree->mmod)) return(0.0); if(tree->mmod->rad < tree->mmod->min_rad) return UNLIKELY; if(tree->mmod->rad > tree->mmod->max_rad) return UNLIKELY; tree->mmod->c_ln_prior_rad = log(tree->mmod->prior_param_rad) - tree->mmod->prior_param_rad*tree->mmod->rad; tree->mmod->c_ln_prior_rad -= log(exp(-tree->mmod->prior_param_rad*tree->mmod->min_rad)- exp(-tree->mmod->prior_param_rad*tree->mmod->max_rad)); return(tree->mmod->c_ln_prior_rad); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Lineage_Velocity(t_ldsk *l, short int dim, t_tree *tree) { phydbl dist,dt; dist = 0.0; dt = 0.0; do { dist += l->coord->lonlat[dim] - l->prev->coord->lonlat[dim]; dt += l->disk->time - l->prev->disk->time; l = l->prev; assert(l); } while(l->nd == NULL); return(dist / dt); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Lineage_Speed(t_ldsk *l, t_tree *tree) { phydbl dist,dt; int i; dist = 0.0; dt = 0.0; do { for(i=0;immod->n_dim;++i) dist += fabs(l->coord->lonlat[i] - l->prev->coord->lonlat[i]); dt += l->disk->time - l->prev->disk->time; l = l->prev; assert(l); } while(l->nd == NULL); return(dist / dt); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl SLFV_Lineage_Dist(t_ldsk *l, t_tree *tree) { phydbl dist; dist = 0.0; do { dist += Euclidean_Distance(l->coord,l->prev->coord); l = l->prev; assert(l); } while(l->nd == NULL); return(dist); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ stephaneguindon-phyml-76a39c8/src/slfv.h000066400000000000000000000045511501136442400203210ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef SLFV_H #define SLFV_H #include "utilities.h" phydbl SLFV_Prob_Two_Lineages_Coal(t_ldsk *l0, t_ldsk *l1, t_tree *tree); phydbl SLFV_Prob_Two_Random_Lineages_Coal_One_Event(phydbl w, phydbl h, phydbl mu, phydbl rad); phydbl SLFV_Coalescence_Rate(t_tree *tree); phydbl SLFV_Path_Logdensity(t_ldsk *beg, t_ldsk *end, phydbl *sd, t_tree *tree); void SLFV_Sample_Path(t_ldsk *young, t_ldsk *old, phydbl *sd, phydbl *global_hr, t_tree *tree); t_ldsk *SLFV_Generate_Path(t_ldsk *beg, t_ldsk *end, int n_evt, phydbl *sd, t_tree *tree); phydbl SLFV_Effective_Density(t_tree *tree); phydbl SLFV_Rate_Per_Unit_Area(t_tree *tree); phydbl SLFV_Sample_Rad_From_Prior(t_tree *tree); phydbl SLFV_Update_Radius(t_tree *tree); phydbl SLFV_Generation_Length(t_tree *tree); phydbl SLFV_Neighborhood_Size(t_tree *tree); phydbl SLFV_Update_Sigsq(t_tree *tree); phydbl SLFV_Neighborhood_Size_Regression(t_tree *tree); phydbl SLFV_Lk_Gaussian_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl SLFV_Lk_Gaussian(t_tree *tree); phydbl SLFV_Lk_Gaussian_Core(t_dsk *disk, t_tree *tree); t_sarea *SLFV_Simulate_Forward_Core(int n_sites, t_tree *tree); phydbl SLFV_Simulate_Backward_Core(t_dsk *init_disk, int avoid_multiple_mergers, t_tree *tree); t_tree *SLFV_Simulate(int n_otu, int n_sites, phydbl w, phydbl h, phydbl lbda, phydbl rad, phydbl mu, int r_seed, char *datadir); t_tree *SLFV_Simulate_Independent_Loci(int n_otu, int n_loci, phydbl w, phydbl h, int r_seed); void SLFV_Integrated_Coal_Rate(t_ldsk *l0, t_ldsk *l1, phydbl T, t_tree *tree); void SLFV_Sum_Coal_Rate(t_ldsk *l0, t_ldsk *l1, int n, t_tree *tree); phydbl SLFV_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree); void SLFV_Generate_Ldsk_New_Location(t_ldsk *l, t_ldsk *prev_l, phydbl rad, phydbl *hr, int dim_idx, t_tree *tree); phydbl SLFV_LnPrior_Lbda(t_tree *tree); phydbl SLFV_LnPrior_Mu(t_tree *tree); phydbl SLFV_LnPrior_Radius(t_tree *tree); phydbl SLFV_Lineage_Velocity(t_ldsk *l, short int dim, t_tree *tree); phydbl SLFV_Lineage_Speed(t_ldsk *l, t_tree *tree); phydbl SLFV_Lineage_Dist(t_ldsk *l, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/spr.c000066400000000000000000002046461501136442400201550ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* ** spr.c: Routines for performing SPR moves on the tree. ** ** Wim Hordijk Last modified: 28 August 2006 ** Stephane Guindon 2007 */ #include "spr.h" #ifdef BEAGLE #include "beagle_utils.h" #endif /*********************************************************/ /* Sort list of SPR move by putting the shallowest moves first */ void Sort_Spr_List_Depth(t_tree *tree) { int i,j; t_spr *buff; short int swap; do { swap = NO; for(i=0;in_moves-1;i++) { for(j=i+1;jn_moves;j++) { if(tree->spr_list_one_edge[j]->depth_path < tree->spr_list_one_edge[i]->depth_path) { buff = tree->spr_list_one_edge[i]; tree->spr_list_one_edge[i] = tree->spr_list_one_edge[j]; tree->spr_list_one_edge[j] = buff; swap = YES; } } } } while(swap == YES); } /*********************************************************/ /*********************************************************/ /* Sort list of SPR move by putting the more likely moves first */ void Sort_Spr_List_LnL(t_spr **list, int list_size, t_tree *tree) { int i,j; t_spr *buff; short int swap; do { swap = NO; for(i=0;ilnL > list[i]->lnL) { buff = list[i]; list[i] = list[j]; list[j] = buff; swap = YES; } } } } while(swap == YES); } /*********************************************************/ /*********************************************************/ /* Sort list of SPR move by putting the more parsimonious moves first */ void Sort_Spr_List_Pars(t_tree *tree) { int i,j; t_spr *buff; short int swap; do { swap = NO; for(i=0;isize_spr_list_one_edge-1;i++) { for(j=i+1;jsize_spr_list_one_edge;j++) { if(tree->spr_list_one_edge[j]->pars < tree->spr_list_one_edge[i]->pars) { buff = tree->spr_list_one_edge[i]; tree->spr_list_one_edge[i] = tree->spr_list_one_edge[j]; tree->spr_list_one_edge[j] = buff; swap = YES; } } } } while(swap == YES); } /*********************************************************/ /*********************************************************/ /*********************************************************/ void Randomize_Spr_List(t_tree *tree) { int i,j; t_spr *buff; for(i=0;in_moves;i++) { j = Rand_Int(0,tree->n_moves-1); buff = tree->spr_list_one_edge[i]; tree->spr_list_one_edge[i] = tree->spr_list_one_edge[j]; tree->spr_list_one_edge[j] = buff; } } /*********************************************************/ int Spr(phydbl init_lnL, phydbl prop_spr, t_tree *tree) { int i,br; int *br_idx; t_edge *b; tree->mod->s_opt->n_improvements = 0; tree->mod->s_opt->max_spr_depth = 0; tree->mod->s_opt->max_rank_triple_move = 0; tree->mod->s_opt->max_delta_lnL_spr_current = 0.0; Reset_Spr_List(tree->spr_list_all_edge,tree->size_spr_list_all_edge); br_idx = Permutate(2*tree->n_otu-3); Set_Both_Sides(YES,tree); Lk(NULL,tree); tree->best_lnL = tree->c_lnL; for(i=0;in_otu-3)*prop_spr));++i) { br = br_idx[i]; if(!(br%10)) if(tree->io->print_json_trace == YES) JSON_Tree_Io(tree,tree->io->fp_out_json_trace); b = tree->a_edges[br]; if(b->l->v > tree->mod->s_opt->l_min_spr) { Spr_Subtree(b,b->left,tree); Spr_Subtree(b,b->rght,tree); } } Free(br_idx); if(tree->mod->s_opt->n_improvements == 0 && tree->mod->s_opt->spr_lnL == YES) { Optimize_Br_Len_Serie(2,tree); tree->best_lnL = tree->c_lnL; Sort_Spr_List_LnL(tree->spr_list_all_edge,tree->size_spr_list_all_edge,tree); for(i=0;in_otu-3);++i) { Try_One_Spr_Move_Full(tree->spr_list_all_edge[i],NO,tree); if(tree->spr_list_all_edge[i]->lnL > tree->best_lnL + tree->mod->s_opt->min_diff_lk_move) break; } Sort_Spr_List_LnL(tree->spr_list_all_edge,tree->size_spr_list_all_edge,tree); if(tree->spr_list_all_edge[0]->lnL > tree->best_lnL + tree->mod->s_opt->min_diff_lk_move) Try_One_Spr_Move_Full(tree->spr_list_all_edge[0],YES,tree); } return tree->mod->s_opt->n_improvements; } /*********************************************************/ void Spr_Pre_Order(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if(d->tax) return; else { unsigned int i; /* printf("\n. a: %d d: %d score: %d d1: %d d2: %d ",a->num,d->num,tree->c_pars); */ /* for(i=0;i<3;++i) */ /* { */ /* if(d->v[i] != a) */ /* { */ /* Spr_Subtree(d->b[i],d->v[i],tree); */ /* } */ /* } */ Spr_Subtree(b,a,tree); for(i=0;i<3;++i) { if(d->v[i] != a) { Spr_Pre_Order(d,d->v[i],d->b[i],tree); } } } } /*********************************************************/ void Spr_Subtree(t_edge *b, t_node *link, t_tree *tree) { int i; int n_moves_pars, n_moves, min_pars, best_move_idx; t_spr *best_pars_move; t_edge *init_target, *dummy, *residual; if(link->v[0] == NULL || link->v[1] == NULL || link->v[2] == NULL) return; Reset_Spr_List(tree->spr_list_one_edge,tree->size_spr_list_one_edge); best_move_idx = -1; tree->n_moves = 0; MIXT_Set_Pars_Thresh(tree); if((link != b->left) && (link != b->rght)) { PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } else { tree->mod->s_opt->worst_lnL_spr = BIG; if(!link->tax) Test_All_Spr_Targets(b,link,tree); if(tree->n_moves) { n_moves_pars = MIN(tree->mod->s_opt->min_n_triple_moves,tree->n_moves); n_moves = MIN(tree->mod->s_opt->min_n_triple_moves,tree->n_moves); if(tree->mod->s_opt->spr_lnL == NO) n_moves = n_moves_pars; n_moves = MAX(1,n_moves); if(tree->mod->s_opt->spr_pars == YES) { min_pars = 1E+8; best_pars_move = NULL; for(i=0;ispr_list_one_edge[i]->pars < min_pars) { best_pars_move = tree->spr_list_one_edge[i]; min_pars = tree->spr_list_one_edge[i]->pars; } } assert(best_pars_move); if(best_pars_move->pars < tree->best_pars) { Prune_Subtree(best_pars_move->n_link,best_pars_move->n_opp_to_link,&init_target,&residual,tree); Graft_Subtree(best_pars_move->b_target,best_pars_move->n_link,NULL,residual,NULL,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) { Prune_Subtree(best_pars_move->n_link,best_pars_move->n_opp_to_link,&dummy,&residual,tree); Graft_Subtree(init_target,best_pars_move->n_link,NULL,residual,NULL,tree); Set_Both_Sides(YES,tree); Pars(NULL,tree); } else { if(best_pars_move->depth_path > tree->mod->s_opt->max_spr_depth) tree->mod->s_opt->max_spr_depth = best_pars_move->depth_path; Set_Both_Sides(YES,tree); Pars(NULL,tree); tree->best_pars = tree->c_pars; if(tree->best_pars != best_pars_move->pars) { PhyML_Fprintf(stderr,"\n== best_pars = %d move_pars = %d",tree->best_pars,best_pars_move->pars); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } tree->mod->s_opt->n_improvements++; } Reset_Spr_List(tree->spr_list_one_edge,tree->size_spr_list_one_edge); } else { Set_Both_Sides(YES,tree); Pars(NULL,tree); } } else { int apply_move = NO; phydbl accept_prob,u; if(tree->mod->s_opt->spr_lnL == YES) { Sort_Spr_List_LnL(tree->spr_list_one_edge,tree->size_spr_list_one_edge,tree); if(tree->spr_list_one_edge[0]->lnL > tree->best_lnL) { best_move_idx = 0; } else if(tree->mod->s_opt->eval_list_regraft == YES) { best_move_idx = Evaluate_List_Of_Regraft_Pos_Triple(tree->spr_list_one_edge,n_moves,tree); } else { best_move_idx = -1; } } else { best_move_idx = Evaluate_List_Of_Regraft_Pos_Triple(tree->spr_list_one_edge,n_moves,tree); } if(best_move_idx > -1) { if(Are_Equal(tree->annealing_temp,0.0,1.E-3) == NO) { accept_prob = exp((tree->spr_list_one_edge[best_move_idx]->lnL - tree->best_lnL)/tree->annealing_temp); u = Uni(); if(!(u > accept_prob)) apply_move = YES; } else { if(tree->spr_list_one_edge[best_move_idx]->lnL > tree->best_lnL + tree->mod->s_opt->min_diff_lk_move) apply_move = YES; } } if((best_move_idx > -1) && (apply_move == YES)) { Try_One_Spr_Move_Triple(tree->spr_list_one_edge[best_move_idx],tree); } else { Pars(NULL,tree); } } } Reset_Spr_List(tree->spr_list_one_edge,tree->size_spr_list_one_edge); } } /*********************************************************/ int Test_All_Spr_Targets(t_edge *b_pulled, t_node *n_link, t_tree *tree) { t_node *n_opp_to_link,*n_v1,*n_v2; t_edge *b_target,*b_residual; int i,dir1,dir2; scalar_dbl *init_l_v1, *init_l_v2, *init_l_pulled; scalar_dbl *init_v_v1, *init_v_v2, *init_v_pulled; int best_found; phydbl init_lnL; if(tree->mixt_tree != NULL) { PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } init_lnL = tree->c_lnL; b_target = b_residual = NULL; n_opp_to_link = (n_link == b_pulled->rght)?(b_pulled->left):(b_pulled->rght); init_l_pulled = Duplicate_Scalar_Dbl(b_pulled->l); init_v_pulled = Duplicate_Scalar_Dbl(b_pulled->l_var); dir1 = dir2 = -1; for(i=0;i<3;i++) if(n_link->v[i] != n_opp_to_link) { if(dir1<0) dir1 = i; else dir2 = i; } assert(dir1 > -1); assert(dir2 > -1); if(n_link->v[dir1]->num < n_link->v[dir2]->num) { n_v1 = n_link->v[dir1]; n_v2 = n_link->v[dir2]; init_l_v1 = Duplicate_Scalar_Dbl(n_link->b[dir1]->l); init_l_v2 = Duplicate_Scalar_Dbl(n_link->b[dir2]->l); init_v_v1 = Duplicate_Scalar_Dbl(n_link->b[dir1]->l_var); init_v_v2 = Duplicate_Scalar_Dbl(n_link->b[dir2]->l_var); } else { n_v1 = n_link->v[dir2]; n_v2 = n_link->v[dir1]; init_l_v1 = Duplicate_Scalar_Dbl(n_link->b[dir2]->l); init_l_v2 = Duplicate_Scalar_Dbl(n_link->b[dir1]->l); init_v_v1 = Duplicate_Scalar_Dbl(n_link->b[dir2]->l_var); init_v_v2 = Duplicate_Scalar_Dbl(n_link->b[dir1]->l_var); } if(!(n_v1->tax && n_v2->tax)) /*! Pruning is meaningless otherwise */ { Prune_Subtree(n_link,n_opp_to_link,&b_target,&b_residual,tree); if(tree->mod->s_opt->spr_lnL == YES) Update_PMat_At_Given_Edge(b_target,tree); for(i=0;isize_spr_list_one_edge;++i) tree->spr_list_one_edge[i]->path_prev = NULL; tree->edge_list = NULL; tree->node_list = NULL; best_found = NO; tree->depth_curr_path = 0; tree->curr_path[0] = b_target->left; Test_One_Spr_Target_Recur(b_target->rght, b_target->left, b_pulled,n_link,b_residual,b_target,&best_found,NULL,tree); if(best_found == NO || tree->perform_spr_right_away == NO) { tree->depth_curr_path = 0; tree->curr_path[0] = b_target->rght; Test_One_Spr_Target_Recur(b_target->left, b_target->rght, b_pulled,n_link,b_residual,b_target,&best_found,NULL,tree); } Graft_Subtree(b_target,n_link,NULL,b_residual,NULL,tree); if((n_link->v[dir1] != n_v1) || (n_link->v[dir2] != n_v2)) PhyML_Printf("\n== Warning: -- SWITCH NEEDED -- ! \n"); Copy_Scalar_Dbl(init_l_v1,n_link->b[dir1]->l); Copy_Scalar_Dbl(init_v_v1,n_link->b[dir1]->l_var); Copy_Scalar_Dbl(init_l_v2,n_link->b[dir2]->l); Copy_Scalar_Dbl(init_v_v2,n_link->b[dir2]->l_var); Copy_Scalar_Dbl(init_l_pulled,b_pulled->l); Copy_Scalar_Dbl(init_v_pulled,b_pulled->l_var); if(tree->mod->s_opt->spr_pars == NO) { Update_PMat_At_Given_Edge(n_link->b[dir1],tree); Update_PMat_At_Given_Edge(n_link->b[dir2],tree); Update_PMat_At_Given_Edge(b_pulled,tree); } if(tree->mod->s_opt->spr_pars == NO) { Update_Partial_Lk(tree,b_pulled, n_link); Update_Partial_Lk(tree,b_target, n_link); Update_Partial_Lk(tree,b_residual,n_link); } else { Update_Partial_Pars(tree,b_pulled, n_link); Update_Partial_Pars(tree,b_target, n_link); Update_Partial_Pars(tree,b_residual,n_link); } t_ll *e_ll = tree->edge_list->head; t_ll *n_ll = tree->node_list->head; t_edge *e; t_node *n; do { assert(e_ll); assert(n_ll); e = (t_edge *)e_ll->v; n = (t_node *)n_ll->v; /* printf("\n. update on edge %d node %d",e->num,n->num); fflush(NULL); */ if(tree->mod->s_opt->spr_lnL) Update_Partial_Lk(tree,e,n); else Update_Partial_Pars(tree,e,n); e_ll = e_ll->next; n_ll = n_ll->next; } while(e_ll != NULL); Free_Linked_List(tree->edge_list); Free_Linked_List(tree->node_list); } tree->c_lnL = init_lnL; Free_Scalar_Dbl(init_l_v1); Free_Scalar_Dbl(init_l_v2); Free_Scalar_Dbl(init_l_pulled); Free_Scalar_Dbl(init_v_v1); Free_Scalar_Dbl(init_v_v2); Free_Scalar_Dbl(init_v_pulled); return 0; } /*********************************************************/ void Test_One_Spr_Target_Recur(t_node *a, t_node *d, t_edge *pulled, t_node *link, t_edge *residual, t_edge *init_target, int *best_found, t_spr *prev_move, t_tree *tree) { unsigned int i; t_spr *move,*next_move; move = next_move = NULL; if(*best_found == YES && tree->perform_spr_right_away == YES) return; if(d->tax) return; else { for(i=0;i<3;++i) { if(d->v[i] != a) { if(tree->mod->s_opt->spr_pars == NO) Update_Partial_Lk(tree,d->b[i],d); else Update_Partial_Pars(tree,d->b[i],d); /* PhyML_Printf("\n push edge %d node %d",d->b[i]->num,d->num); */ Push_Bottom_Linked_List(d->b[i],&tree->edge_list,NO); Push_Bottom_Linked_List(d,&tree->node_list,NO); tree->depth_curr_path++; tree->curr_path[tree->depth_curr_path] = d->v[i]; if((tree->depth_curr_path <= tree->mod->s_opt->max_depth_path) && (tree->depth_curr_path >= tree->mod->s_opt->min_depth_path)) { move = Test_One_Spr_Target(d->b[i],pulled,link,residual,init_target,d,tree); move->path_prev = prev_move; if((tree->mod->s_opt->spr_pars == NO && move->lnL > tree->best_lnL + tree->mod->s_opt->min_diff_lk_move) || (tree->mod->s_opt->spr_pars == YES && move->pars < tree->best_pars)) { *best_found = YES; } } bool go_to_next = (tree->depth_curr_path < tree->mod->s_opt->max_depth_path && ((tree->mod->s_opt->spr_pars == NO && move && move->lnL > tree->best_lnL - tree->mod->s_opt->max_delta_lnL_spr) || tree->mod->s_opt->spr_pars == YES)); /* bool go_to_next = tree->depth_curr_path < tree->mod->s_opt->max_depth_path; */ if(go_to_next == YES) Test_One_Spr_Target_Recur(d,d->v[i],pulled,link,residual,init_target,best_found,move,tree); tree->depth_curr_path--; } } } } /*********************************************************/ t_spr *Test_One_Spr_Target(t_edge *b_target, t_edge *b_arrow, t_node *n_link, t_edge *b_residual, t_edge *init_target, t_node *polarity, t_tree *tree) { scalar_dbl *init_target_l, *init_arrow_l, *init_residual_l; scalar_dbl *init_target_v, *init_arrow_v, *init_residual_v; int i,dir_v0,dir_v1,dir_v2; scalar_dbl *l0,*l1,*l2; scalar_dbl *v0,*v1,*v2; t_node *n1,*n2; phydbl init_lnL; int init_pars; t_spr *move; unsigned int rk; if(tree->mixt_tree != NULL) { PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } tree->n_moves++; init_lnL = tree->c_lnL; init_pars = tree->c_pars; move = tree->spr_list_one_edge[tree->size_spr_list_one_edge]; if(move->init_target_l == NULL) { move->init_target_l = Duplicate_Scalar_Dbl(init_target->l); move->init_target_v = Duplicate_Scalar_Dbl(init_target->l_var); } else { Copy_Scalar_Dbl(init_target->l, move->init_target_l); Copy_Scalar_Dbl(init_target->l_var,move->init_target_v); } /* PhyML_Printf("\n. TEST_ONE_SPR_TARGET"); */ // Save edge lengths so that they can be recovered in the end init_target_l = Duplicate_Scalar_Dbl(b_target->l); init_target_v = Duplicate_Scalar_Dbl(b_target->l_var); init_arrow_l = Duplicate_Scalar_Dbl(b_arrow->l); init_arrow_v = Duplicate_Scalar_Dbl(b_arrow->l_var); init_residual_l = Duplicate_Scalar_Dbl(b_residual->l); init_residual_v = Duplicate_Scalar_Dbl(b_residual->l_var); Graft_Subtree(b_target,n_link,NULL,b_residual,NULL,tree); if(tree->mod->s_opt->spr_lnL == YES) { Update_PMat_At_Given_Edge(b_target,tree); Update_PMat_At_Given_Edge(b_residual,tree); Update_Partial_Lk(tree,b_arrow,n_link); Lk(b_arrow,tree); } else { Update_Partial_Pars(tree,b_arrow,n_link); Pars(b_arrow,tree); } n1 = (b_residual->left == n_link)?(b_residual->rght):(b_residual->left); n2 = (b_target->left == n_link)?(b_target->rght):(b_target->left); dir_v1 = dir_v2 = dir_v0 = -1; for(i=0;i<3;++i) { if(n_link->v[i] == n1) dir_v1 = i; else if(n_link->v[i] == n2) dir_v2 = i; else dir_v0 = i; } l0 = Duplicate_Scalar_Dbl(n_link->b[dir_v0]->l); v0 = Duplicate_Scalar_Dbl(n_link->b[dir_v0]->l_var); if(n_link->v[dir_v1]->num > n_link->v[dir_v2]->num) { l1 = Duplicate_Scalar_Dbl(n_link->b[dir_v2]->l); v1 = Duplicate_Scalar_Dbl(n_link->b[dir_v2]->l_var); l2 = Duplicate_Scalar_Dbl(n_link->b[dir_v1]->l); v2 = Duplicate_Scalar_Dbl(n_link->b[dir_v1]->l_var); } else { l1 = Duplicate_Scalar_Dbl(n_link->b[dir_v1]->l); v1 = Duplicate_Scalar_Dbl(n_link->b[dir_v1]->l_var); l2 = Duplicate_Scalar_Dbl(n_link->b[dir_v2]->l); v2 = Duplicate_Scalar_Dbl(n_link->b[dir_v2]->l_var); } for(i=0;idepth_curr_path+1;++i) move->path[i] = tree->curr_path[i]; if(move->l0 != NULL) { Free_Scalar_Dbl(move->l0); Free_Scalar_Dbl(move->v0); } if(move->l1 != NULL) { Free_Scalar_Dbl(move->l1); Free_Scalar_Dbl(move->v1); } if(move->l2 != NULL) { Free_Scalar_Dbl(move->l2); Free_Scalar_Dbl(move->v2); } move->l0 = l0; move->v0 = v0; move->l1 = l1; move->v1 = v1; move->l2 = l2; move->v2 = v2; move->depth_path = tree->depth_curr_path; move->pars = tree->c_pars; move->lnL = tree->c_lnL; move->b_target = b_target; move->n_link = n_link; move->b_opp_to_link = b_arrow; move->b_init_target = init_target; move->dist = b_target->topo_dist_btw_edges; move->n_opp_to_link = (n_link==b_arrow->left)?(b_arrow->rght):(b_arrow->left); /* PhyML_Printf("\n. MOVE TEST_ONE_SPR_TARGET : %f",move->lnL); */ /* for(int i=0;isize_spr_list_one_edge;++i) */ /* { */ /* PhyML_Printf("\n. MOVE : %p LNL: %f",tree->spr_list_one_edge[i],tree->spr_list_one_edge[i]->lnL); */ /* } */ rk = Include_One_Spr_To_List_Of_Spr(tree->spr_list_one_edge,tree->size_spr_list_one_edge,move,tree); /* PhyML_Printf("\n. RK TEST_ONE_SPR_TARGET : %d",rk); */ Include_One_Spr_To_List_Of_Spr(tree->spr_list_all_edge,tree->size_spr_list_all_edge,move,tree); Prune_Subtree(n_link, (n_link==b_arrow->left)?(b_arrow->rght):(b_arrow->left), &b_target, &b_residual, tree); Copy_Scalar_Dbl(init_target_l,b_target->l); Copy_Scalar_Dbl(init_target_v,b_target->l_var); Copy_Scalar_Dbl(init_arrow_l,b_arrow->l); Copy_Scalar_Dbl(init_arrow_v,b_arrow->l_var); Copy_Scalar_Dbl(init_residual_l,b_residual->l); Copy_Scalar_Dbl(init_residual_v,b_residual->l_var); if(tree->mod->s_opt->spr_lnL == YES) Update_PMat_At_Given_Edge(b_target,tree); tree->c_lnL = init_lnL; tree->c_pars = init_pars; Free_Scalar_Dbl(init_target_l); Free_Scalar_Dbl(init_arrow_l); Free_Scalar_Dbl(init_residual_l); Free_Scalar_Dbl(init_target_v); Free_Scalar_Dbl(init_arrow_v); Free_Scalar_Dbl(init_residual_v); return tree->spr_list_one_edge[rk]; } /*********************************************************/ void Global_Spr_Search(t_tree *tree) { unsigned int i,iter; phydbl best_lnL; t_tree *best_tree; time_t t_cur; phydbl max_delta_lnL_spr,tune_l_mult; unsigned int no_improv = 0; unsigned int last_best_found = 0; unsigned int freq = 1; const unsigned int round_freq = 10; best_lnL = UNLIKELY; tree->verbose = (tree->verbose == VL0) ? VL0 : VL1; best_tree = Duplicate_Tree(tree); if(tree->io->print_json_trace == YES) JSON_Tree_Io(tree,tree->io->fp_out_json_trace); if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf("\n\n. Score of initial tree: %.2f",tree->c_lnL); tree->mod->s_opt->min_diff_lk_move = 1.E-1; tree->mod->s_opt->min_diff_lk_local = 1.E-1; Round_Optimize(tree,1000); best_lnL = tree->c_lnL; Copy_Tree(tree,best_tree); if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf("\n\n. Starting first round of SPRs...\n"); tree->mod->s_opt->max_depth_path = MAX(40,1+(int)(tree->n_otu/4)); tree->mod->s_opt->max_delta_lnL_spr = 1000; tree->mod->s_opt->l_min_spr = 0.0; tree->mod->s_opt->spr_lnL = YES; tree->mod->s_opt->spr_pars = NO; tree->mod->s_opt->min_diff_lk_move = 1.E-0; tree->mod->s_opt->min_diff_lk_local = 1.E-0; tree->perform_spr_right_away = YES; tree->mod->s_opt->eval_list_regraft = NO; tree->mod->s_opt->max_delta_lnL_spr_current = 0.0; tree->mod->s_opt->min_n_triple_moves = 1; max_delta_lnL_spr = 0.0; tune_l_mult = 0.01; best_lnL = tree->c_lnL; iter = 0; do { if(!(iter%freq)) { for(int i=0;i<2*tree->n_otu-3;++i) MIXT_Multiply_Scalar_Dbl(tree->a_edges[i]->l,Rgamma((phydbl)(tune_l_mult*iter+1),(phydbl)(1./(tune_l_mult*iter+1)))); for(int i=0;i<2*tree->n_otu-3;++i) Set_Scalar_Dbl_Min_Thresh(tree->mod->l_min,tree->a_edges[i]->l); for(int i=0;i<2*tree->n_otu-3;++i) Set_Scalar_Dbl_Max_Thresh(tree->mod->l_max,tree->a_edges[i]->l); freq--; if(freq < 1) freq=1; } if(iter> 10) tree->mod->s_opt->l_min_spr = 1.E-3; Spr(tree->c_lnL,1.0,tree); Optimize_Br_Len_Serie(2,tree); if(!(iter%round_freq) && iter > 0) Round_Optimize(tree,1000); if(tree->verbose > VL0 && tree->io->quiet == NO) { time(&t_cur); PhyML_Printf("\n\t%8ds | %3d | lnL=%12.1f | depth=%5d/%5d | improvements=%4d | delta_lnL=%7.1f/%7.1f %c", (int)(t_cur-tree->t_beg), iter+1, tree->c_lnL, tree->mod->s_opt->max_spr_depth, tree->mod->s_opt->max_depth_path, tree->mod->s_opt->n_improvements, tree->mod->s_opt->max_delta_lnL_spr_current, tree->mod->s_opt->max_delta_lnL_spr, (tree->numerical_warning == YES) ? '!' : ' '); } if(tree->mod->s_opt->n_improvements > (int)(tree->n_otu/5)) { tune_l_mult *= 1.2; } tree->mod->s_opt->max_depth_path = MAX(5,MAX(tree->mod->s_opt->max_spr_depth+6,(int)(0.6*tree->mod->s_opt->max_depth_path))); if((iter%4) > 0 || iter == 0) { if(tree->mod->s_opt->max_delta_lnL_spr_current > max_delta_lnL_spr) max_delta_lnL_spr = tree->mod->s_opt->max_delta_lnL_spr_current; } else if(iter > 0) { tree->mod->s_opt->max_delta_lnL_spr = MAX(50.,2.*max_delta_lnL_spr); max_delta_lnL_spr = 0.0; } if(tree->c_lnL > best_lnL) { no_improv = 0; best_lnL = tree->c_lnL; Copy_Tree(tree,best_tree); if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf(" +"); if(tree->io->print_json_trace == YES) JSON_Tree_Io(tree,tree->io->fp_out_json_trace); } no_improv++; iter++; } while(tree->mod->s_opt->n_improvements > 15 && no_improv < 10); if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf("\n\n. Second round of optimization...\n"); tree->mod->s_opt->max_depth_path = MAX(10,(int)(1.5*tree->mod->s_opt->max_depth_path)); tree->mod->s_opt->l_min_spr = 1.E-3; tree->mod->s_opt->spr_lnL = YES; tree->mod->s_opt->spr_pars = NO; tree->mod->s_opt->min_diff_lk_move = 1.E-2; tree->mod->s_opt->min_diff_lk_local = 1.E-2; tree->mod->s_opt->eval_list_regraft = NO; tree->mod->s_opt->max_delta_lnL_spr_current = 0.0; tree->mod->s_opt->min_n_triple_moves = 1; tree->mod->s_opt->deepest_path = 0; max_delta_lnL_spr = 0.0; no_improv = 0; do { if(!(iter%freq)) { for(int i=0;i<2*tree->n_otu-3;++i) MIXT_Multiply_Scalar_Dbl(tree->a_edges[i]->l,Rgamma((phydbl)(tune_l_mult*iter+1),(phydbl)(1./(tune_l_mult*iter+1)))); for(int i=0;i<2*tree->n_otu-3;++i) Set_Scalar_Dbl_Min_Thresh(tree->mod->l_min,tree->a_edges[i]->l); for(int i=0;i<2*tree->n_otu-3;++i) Set_Scalar_Dbl_Max_Thresh(tree->mod->l_max,tree->a_edges[i]->l); freq--; if(freq < 1) freq=1; } Spr(tree->c_lnL,1.0,tree); Optimize_Br_Len_Serie(2,tree); if(!(iter%round_freq) && iter > 0) Round_Optimize(tree,1000); if(tree->verbose > VL0 && tree->io->quiet == NO) { time(&t_cur); PhyML_Printf("\n\t%8ds | %3d | lnL=%12.1f | depth=%5d/%5d | improvements=%4d | delta_lnL=%7.1f/%7.1f %c", (int)(t_cur-tree->t_beg), iter+1, tree->c_lnL, tree->mod->s_opt->max_spr_depth, tree->mod->s_opt->max_depth_path, tree->mod->s_opt->n_improvements, tree->mod->s_opt->max_delta_lnL_spr_current, tree->mod->s_opt->max_delta_lnL_spr, (tree->numerical_warning == YES) ? '!' : ' '); } tree->mod->s_opt->max_depth_path = MAX(5,MAX(tree->mod->s_opt->max_spr_depth+4,(int)(0.8*tree->mod->s_opt->max_depth_path))); tree->mod->s_opt->max_depth_path = MIN(20,tree->mod->s_opt->max_depth_path); if((iter%4) > 0 || iter == 0) { if(tree->mod->s_opt->max_delta_lnL_spr_current > max_delta_lnL_spr) max_delta_lnL_spr = tree->mod->s_opt->max_delta_lnL_spr_current; } else if(iter > 0) { tree->mod->s_opt->max_delta_lnL_spr = MAX(20.,2.*max_delta_lnL_spr); max_delta_lnL_spr = 0.0; } if(tree->c_lnL > best_lnL) { no_improv = 0; best_lnL = tree->c_lnL; Copy_Tree(tree,best_tree); if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf(" +"); if(tree->io->print_json_trace == YES) JSON_Tree_Io(tree,tree->io->fp_out_json_trace); } no_improv++; iter++; } while(tree->mod->s_opt->n_improvements > 5 && no_improv < 10); if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf("\n\n. Third round of optimization...\n"); last_best_found = 0; tree->mod->s_opt->max_depth_path = MAX(10,tree->mod->s_opt->max_depth_path); tree->mod->s_opt->max_delta_lnL_spr = MAX(100.,tree->mod->s_opt->max_delta_lnL_spr); tree->mod->s_opt->spr_lnL = YES; tree->mod->s_opt->spr_pars = NO; tree->mod->s_opt->l_min_spr = 1.E-4; tree->mod->s_opt->min_diff_lk_move = 1.E-2; tree->mod->s_opt->min_diff_lk_local = 1.E-2; tree->mod->s_opt->eval_list_regraft = YES; tree->mod->s_opt->max_delta_lnL_spr_current = 0.0; tree->mod->s_opt->min_n_triple_moves = 5; tree->mod->s_opt->max_rank_triple_move = 0; tree->mod->s_opt->max_no_better_tree_found = 10; do { Spr(tree->c_lnL,1.0,tree); Optimize_Br_Len_Serie(2,tree); if(!(iter%round_freq)) Round_Optimize(tree,1000); if(tree->verbose > VL0 && tree->io->quiet == NO) { time(&t_cur); PhyML_Printf("\n\t%8ds | %3d | lnL=%12.1f | depth=%5d/%5d | improvements=%4d | delta_lnL=%7.1f/%7.1f | triple moves=%4d %c", (int)(t_cur-tree->t_beg), iter+1, tree->c_lnL, tree->mod->s_opt->max_spr_depth, tree->mod->s_opt->max_depth_path, tree->mod->s_opt->n_improvements, tree->mod->s_opt->max_delta_lnL_spr_current, tree->mod->s_opt->max_delta_lnL_spr, tree->mod->s_opt->min_n_triple_moves, (tree->numerical_warning == YES) ? '!' : ' '); } tree->mod->s_opt->max_depth_path = MIN(30,MAX(5,MAX(2*tree->mod->s_opt->max_spr_depth,(int)(0.8*tree->mod->s_opt->max_depth_path)))); tree->mod->s_opt->max_delta_lnL_spr = MAX(100.,0.8*tree->mod->s_opt->max_delta_lnL_spr_current); tree->mod->s_opt->min_n_triple_moves = MAX(5,2*tree->mod->s_opt->max_rank_triple_move); if(tree->c_lnL > best_lnL) { last_best_found = 0;; best_lnL = tree->c_lnL; Copy_Tree(tree,best_tree); if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf(" +"); if(tree->io->print_json_trace == YES) JSON_Tree_Io(tree,tree->io->fp_out_json_trace); } last_best_found++; iter++; } while(tree->mod->s_opt->n_improvements > 0 && last_best_found <= tree->mod->s_opt->max_no_better_tree_found); Copy_Tree(best_tree,tree); if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf("\n\n. Final optimisation steps...\n"); i = tree->verbose; tree->verbose = VL0; tree->mod->s_opt->min_diff_lk_move = 1.E-03; tree->mod->s_opt->min_diff_lk_local = 1.E-03; do { tree->mod->s_opt->fast_nni = NO; Round_Optimize(tree,10); if(!Check_NNI_Five_Branches(tree)) break; } while(1); tree->verbose = i; Free_Tree(best_tree); return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Speed_Spr(t_tree *tree, phydbl prop_spr, int max_cycles, phydbl delta_lnL) { int step,old_pars; phydbl old_lnL; if(tree->lock_topo == YES) { PhyML_Fprintf(stderr,"\n== The tree topology is locked."); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } Set_Both_Sides(NO,tree); Pars(NULL,tree); if(tree->mod->s_opt->spr_pars == NO) Lk(NULL,tree); Record_Br_Len(tree); tree->mod->s_opt->deepest_path = 0; tree->best_pars = tree->c_pars; tree->best_lnL = tree->c_lnL; old_lnL = tree->c_lnL; old_pars = tree->c_pars; step = 0; do { ++step; old_lnL = tree->c_lnL; old_pars = tree->c_pars; Set_Both_Sides(YES,tree); Pars(NULL,tree); if(tree->mod->s_opt->spr_pars == NO) Lk(NULL,tree); Spr(UNLIKELY,prop_spr,tree); // Set maximum depth for future spr rounds to deepest spr found so far tree->mod->s_opt->max_depth_path = tree->mod->s_opt->max_spr_depth; if(tree->mod->s_opt->spr_pars == NO) { if(tree->mod->s_opt->n_improvements > 0) { /* Optimise branch lengths */ Optimize_Br_Len_Serie(2,tree); /* Print log-likelihood and parsimony scores */ if(tree->verbose > VL2 && tree->io->quiet == NO) Print_Lk(tree,"[Branch lengths ]"); } } else { if(tree->verbose > VL2 && tree->io->quiet == NO) Print_Pars(tree); } Pars(NULL,tree); if(tree->io->print_trace) { char *s = Write_Tree(tree); PhyML_Fprintf(tree->io->fp_out_trace,"[%f]%s\n",tree->c_lnL,s); fflush(tree->io->fp_out_trace); if((tree->io->print_site_lnl) && (!tree->mod->s_opt->spr_pars)) { Print_Site_Lk(tree,tree->io->fp_out_lk); fflush(tree->io->fp_out_lk); } Free(s); } if(tree->io->print_json_trace == YES) JSON_Tree_Io(tree,tree->io->fp_out_json_trace); /* Record the current best log-likelihood and parsimony */ if(tree->c_lnL > tree->best_lnL) tree->best_lnL = tree->c_lnL; if(tree->c_pars < tree->best_pars) tree->best_pars = tree->c_pars; if(tree->mod->s_opt->spr_pars == NO) { if(tree->c_lnL < old_lnL-tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n== old_lnL = %f c_lnL = %f",old_lnL,tree->c_lnL); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit(""); } } else { if(tree->c_pars > old_pars) { PhyML_Fprintf(stderr,"\n== old_pars = %d c_pars = %d",old_pars,tree->c_pars); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit(""); } } /* Record the current best branch lengths */ Record_Br_Len(tree); /* Exit if no improvements after complete optimization */ if(step+1 > max_cycles) break; if((tree->mod->s_opt->spr_pars == NO) && (fabs(old_lnL-tree->c_lnL) < delta_lnL)) break; if((tree->mod->s_opt->spr_pars == YES) && (fabs((phydbl)(old_pars-tree->c_pars)) < 1)) break; if(!tree->mod->s_opt->n_improvements) break; } while(1); } /*********************************************************/ int Evaluate_List_Of_Regraft_Pos_Triple(t_spr **spr_list, int list_size, t_tree *tree) { t_spr *move; t_edge *init_target, *b_residual; int i,j,best_move,better_found; int dir_v0, dir_v1, dir_v2; scalar_dbl *recorded_l,*recorded_v; phydbl best_lnL,init_lnL; int recorded; if(tree->mixt_tree != NULL) { PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } best_lnL = UNLIKELY; init_target = b_residual = NULL; best_move = -1; init_lnL = tree->c_lnL; recorded_v = recorded_l = NULL; better_found = NO; if(list_size == 0) { PhyML_Fprintf(stderr,"\n== List size is 0 !"); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } recorded = NO; for(i=0;ib_target) { /* Record t_edge lengths */ Record_Br_Len(tree); /* Prune subtree */ Prune_Subtree(move->n_link, move->n_opp_to_link, &init_target, &b_residual, tree); if(recorded == NO) { /*! Rough optimisation of the branch length at prune site * We only need to perform this optimisation for the first * element of spr_list because the pruned subtree is the * same across all the elements of spr_list. It would not * be true in the general case */ recorded = YES; Br_Len_Opt(&(init_target->l->v),init_target,tree); /*! Record branch length at prune site */ if(recorded_l == NULL) { recorded_l = Duplicate_Scalar_Dbl(init_target->l); recorded_v = Duplicate_Scalar_Dbl(init_target->l_var); } else { Copy_Scalar_Dbl(init_target->l,recorded_l); Copy_Scalar_Dbl(init_target->l_var,recorded_v); } Copy_Scalar_Dbl(recorded_l,move->init_target_l); Copy_Scalar_Dbl(recorded_v,move->init_target_v); } else { Copy_Scalar_Dbl(recorded_l,move->b_init_target->l); Copy_Scalar_Dbl(recorded_v,move->b_init_target->l_var); Copy_Scalar_Dbl(recorded_l,move->init_target_l); Copy_Scalar_Dbl(recorded_v,move->init_target_v); } /* Update the change proba matrix at prune position */ Update_PMat_At_Given_Edge(init_target,tree); /* Update conditional likelihoods along the path from the prune to the regraft position */ MIXT_Set_Alias_Subpatt(YES,tree); Update_Partial_Lk_Along_A_Path(move->path,move->depth_path+1,tree); MIXT_Set_Alias_Subpatt(NO,tree); /* Regraft subtree */ Graft_Subtree(move->b_target,move->n_link,NULL,b_residual,NULL,tree); MIXT_Set_Alias_Subpatt(YES,tree); move->lnL = Triple_Dist(move->n_link,tree); MIXT_Set_Alias_Subpatt(NO,tree); /* PhyML_Printf("\n. %d/%d init_lnL: %12G move->lnL= %12G best_lnL=%12G absolute_best=%12G", */ /* i, */ /* list_size, */ /* init_lnL, */ /* move->lnL, */ /* best_lnL, */ /* tree->best_lnL); */ /* Record updated branch lengths for this move */ dir_v1 = dir_v2 = dir_v0 = -1; for(j=0;j<3;j++) { if(move->n_link->v[j] == move->n_opp_to_link) dir_v0 = j; else if(dir_v1 < 0) dir_v1 = j; else dir_v2 = j; } Copy_Scalar_Dbl(move->n_link->b[dir_v0]->l, move->l0); Copy_Scalar_Dbl(move->n_link->b[dir_v0]->l_var,move->v0); if(move->n_link->v[dir_v1]->num > move->n_link->v[dir_v2]->num) { Copy_Scalar_Dbl(move->n_link->b[dir_v2]->l, move->l1); Copy_Scalar_Dbl(move->n_link->b[dir_v2]->l_var,move->v1); Copy_Scalar_Dbl(move->n_link->b[dir_v1]->l, move->l2); Copy_Scalar_Dbl(move->n_link->b[dir_v1]->l_var,move->v2); } else { Copy_Scalar_Dbl(move->n_link->b[dir_v1]->l, move->l1); Copy_Scalar_Dbl(move->n_link->b[dir_v1]->l_var,move->v1); Copy_Scalar_Dbl(move->n_link->b[dir_v2]->l, move->l2); Copy_Scalar_Dbl(move->n_link->b[dir_v2]->l_var,move->v2); } if(move->lnL > best_lnL) { best_lnL = move->lnL; best_move = i; } /* Regraft the subtree at its original position */ Prune_Subtree(move->n_link, move->n_opp_to_link, &move->b_target, &b_residual, tree); Graft_Subtree(init_target, move->n_link, NULL, b_residual, NULL, tree); /* Restore branch lengths */ Restore_Br_Len(tree); /* Update relevant change proba matrices */ Update_PMat_At_Given_Edge(move->b_target,tree); tree->c_lnL = init_lnL; } /* PhyML_Printf("\n. [ %4d/%4d ] %f %f %s", */ /* i,list_size,tree->best_lnL,move->lnL, */ /* (move->lnL > tree->best_lnL + tree->mod->s_opt->min_diff_lk_move) ? "**" : ""); */ /* Bail out as soon as you've found a true improvement */ if(move->lnL > tree->best_lnL + tree->mod->s_opt->min_diff_lk_move) { better_found = YES; if(i > tree->mod->s_opt->max_rank_triple_move) tree->mod->s_opt->max_rank_triple_move = i; break; } } /* PhyML_Printf("\n. max_improv = %f",max_improv); */ if(better_found == NO) { MIXT_Set_Alias_Subpatt(YES,tree); for(i=0;ib_target) { for(j=0;j<3;++j) Update_PMat_At_Given_Edge(move->n_link->b[j],tree); for(j=0;j<3;++j) Update_Partial_Lk(tree,move->n_link->b[j],move->n_link); /* TO DO : we don't need to update all these partial likelihoods here. Would need to record only those that were along the paths examined above */ for(j=0;j<3;++j) if(move->n_link->v[j] != move->n_opp_to_link) Pre_Order_Lk(move->n_link,move->n_link->v[j],tree); break; } } MIXT_Set_Alias_Subpatt(NO,tree); } #ifdef DEBUG if(best_move < 0 && list_size > 0) { PhyML_Printf("\n\n== Best_move < 0 !"); PhyML_Printf("\n== List size = %d",list_size); PhyML_Printf("\n== Best lnL = %f",best_lnL); for(i=0;ib_target,move->lnL); } PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } #endif Free_Scalar_Dbl(recorded_l); Free_Scalar_Dbl(recorded_v); return best_move; } /*********************************************************/ int Try_One_Spr_Move_Triple(t_spr *move, t_tree *tree) { t_edge *init_target, *b_residual; int j; int dir_v0, dir_v1, dir_v2; int accept; assert(move); if(move->n_link == NULL) return -1; if(tree->mixt_tree != NULL) { PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } Record_Br_Len(tree); Prune_Subtree(move->n_link, move->n_opp_to_link, &init_target, &b_residual, tree); Copy_Scalar_Dbl(move->init_target_l,init_target->l); Copy_Scalar_Dbl(move->init_target_v,init_target->l_var); Graft_Subtree(move->b_target,move->n_link,NULL,b_residual,NULL,tree); dir_v1 = dir_v2 = dir_v0 = -1; for(j=0;j<3;j++) { if(move->n_link->v[j] == move->n_opp_to_link) dir_v0 = j; else if(dir_v1 < 0) dir_v1 = j; else dir_v2 = j; } Copy_Scalar_Dbl(move->l0,move->n_link->b[dir_v0]->l); Copy_Scalar_Dbl(move->v0,move->n_link->b[dir_v0]->l_var); if(move->n_link->v[dir_v1]->num > move->n_link->v[dir_v2]->num) { Copy_Scalar_Dbl(move->l1,move->n_link->b[dir_v2]->l); Copy_Scalar_Dbl(move->v1,move->n_link->b[dir_v2]->l_var); Copy_Scalar_Dbl(move->l2,move->n_link->b[dir_v1]->l); Copy_Scalar_Dbl(move->v2,move->n_link->b[dir_v1]->l_var); } else { Copy_Scalar_Dbl(move->l1,move->n_link->b[dir_v1]->l); Copy_Scalar_Dbl(move->v1,move->n_link->b[dir_v1]->l_var); Copy_Scalar_Dbl(move->l2,move->n_link->b[dir_v2]->l); Copy_Scalar_Dbl(move->v2,move->n_link->b[dir_v2]->l_var); } accept = YES; if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) accept = NO; if(accept == YES) /* Apply the move */ { time(&(tree->t_current)); Pars(NULL,tree); Update_PMat_At_Given_Edge(init_target,tree); for(int i=0;i<3;++i) Update_PMat_At_Given_Edge(move->n_link->b[i],tree); Post_Order_Lk(move->n_opp_to_link,move->n_link,tree); Pre_Order_Lk(move->n_opp_to_link,move->n_link,tree); Pre_Order_Lk(move->n_link,move->n_opp_to_link,tree); Lk(move->b_opp_to_link,tree); if(fabs(tree->c_lnL - move->lnL) > tree->mod->s_opt->min_diff_lk_move) { PhyML_Fprintf(stderr,"\n== c_lnL = %f move_lnL = %f", tree->c_lnL,move->lnL); PhyML_Fprintf(stderr,"\n== %d l0=%G l1=%G l2=%G v0=%G v1=%G v2=%G",move->n_link->num,move->l0->v,move->l1->v,move->l2->v,move->v0->v,move->v1->v,move->v2->v); PhyML_Fprintf(stderr,"\n== Gamma MGF? %d",tree->io->mod->gamma_mgf_bl); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d.\n",__FILE__,__LINE__); Check_Lk_At_Given_Edge(YES,tree); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } if(tree->verbose > VL2 && tree->io->quiet == NO) { Print_Lk_And_Pars(tree); PhyML_Printf(" [depth=%5d]",move->depth_path); fflush(NULL); } tree->mod->s_opt->n_improvements++; t_spr *dum_move = move; phydbl delta = 0.0; while(dum_move) { delta = move->lnL - dum_move->lnL; if(delta > tree->mod->s_opt->max_delta_lnL_spr_current) tree->mod->s_opt->max_delta_lnL_spr_current = delta; dum_move = dum_move->path_prev; } if(tree->c_lnL > tree->best_lnL) tree->best_lnL = tree->c_lnL; Record_Br_Len(tree); if(move->depth_path > tree->mod->s_opt->deepest_path) tree->mod->s_opt->deepest_path = move->depth_path; if(move->depth_path > tree->mod->s_opt->max_spr_depth) tree->mod->s_opt->max_spr_depth = move->depth_path; return 1; } else // Go back to original topology { Prune_Subtree(move->n_link, move->n_opp_to_link, &move->b_target, &b_residual, tree); Graft_Subtree(init_target, move->n_link, NULL, b_residual, NULL, tree); Restore_Br_Len(tree); return 0; } } /*********************************************************/ int Try_One_Spr_Move_Full(t_spr *move, short int apply_move, t_tree *tree) { t_edge *init_target, *b_residual; phydbl init_lnL; assert(move); if(move->n_link == NULL) return -1; init_lnL = tree->c_lnL; Record_Br_Len(tree); Prune_Subtree(move->n_link, move->n_opp_to_link, &init_target, &b_residual, tree); Graft_Subtree(move->b_target,move->n_link,NULL,b_residual,NULL,tree); Optimize_Br_Len_Serie(2,tree); move->lnL = tree->c_lnL; if(tree->c_lnL > tree->best_lnL + tree->mod->s_opt->min_diff_lk_move && apply_move == YES) { tree->best_lnL = tree->c_lnL; tree->mod->s_opt->n_improvements++; return 1; } else { Prune_Subtree(move->n_link, move->n_opp_to_link, &move->b_target, &b_residual, tree); Graft_Subtree(init_target, move->n_link, NULL, b_residual, NULL, tree); Restore_Br_Len(tree); tree->c_lnL = init_lnL; return 0; } return -1; } /*********************************************************/ unsigned int Include_One_Spr_To_List_Of_Spr(t_spr **list, int list_size, t_spr *move, t_tree *tree) { unsigned int i, rk; t_spr *buff_spr,*orig_move, *orig_move_list, *move_list; t_tree *orig_tree; if(tree->mixt_tree != NULL) { PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } rk = 0; /* printf("\n. INCLUDE: %d %G %G",list_size,move->lnL,list[list_size-1]->lnL); */ if(((tree->mod->s_opt->spr_lnL == YES) && (move->lnL > list[list_size-1]->lnL)) || ((tree->mod->s_opt->spr_lnL == NO) && (move->pars <= list[list_size-1]->pars))) { move_list = list[list_size-1]; /* printf("\n. Include move with lnL: %G to list %p",move->lnL,(void *)list); */ move_list->depth_path = move->depth_path; move_list->pars = move->pars; move_list->lnL = move->lnL; move_list->dist = move->dist; if(move_list->l0 == NULL) { move_list->l0 = Duplicate_Scalar_Dbl(move->l0); move_list->v0 = Duplicate_Scalar_Dbl(move->v0); } else { Copy_Scalar_Dbl(move->l0,move_list->l0); Copy_Scalar_Dbl(move->v0,move_list->v0); } if(move_list->l1 == NULL) { move_list->l1 = Duplicate_Scalar_Dbl(move->l1); move_list->v1 = Duplicate_Scalar_Dbl(move->v1); } else { Copy_Scalar_Dbl(move->l1,move_list->l1); Copy_Scalar_Dbl(move->v1,move_list->v1); } if(move_list->l2 == NULL) { move_list->l2 = Duplicate_Scalar_Dbl(move->l2); move_list->v2 = Duplicate_Scalar_Dbl(move->v2); } else { Copy_Scalar_Dbl(move->l2,move_list->l2); Copy_Scalar_Dbl(move->v2,move_list->v2); } if(move_list->init_target_l == NULL) { move_list->init_target_l = Duplicate_Scalar_Dbl(move->init_target_l); move_list->init_target_v = Duplicate_Scalar_Dbl(move->init_target_v); } else { Copy_Scalar_Dbl(move->init_target_l,move_list->init_target_l); Copy_Scalar_Dbl(move->init_target_v,move_list->init_target_v); } orig_move = move; orig_move_list = move_list; orig_tree = tree; do { move_list->b_target = move->b_target; move_list->n_link = move->n_link; move_list->n_opp_to_link = move->n_opp_to_link; move_list->b_opp_to_link = move->b_opp_to_link; move_list->b_init_target = move->b_init_target; move = move->next; move_list = move_list->next; tree = tree->next; } while(tree); move = orig_move; move_list = orig_move_list; tree = orig_tree; for(i=0;idepth_path+1;++i) move_list->path[i] = move->path[i]; /* PhyML_Printf("\n. LIST_SIZE: %d",list_size); */ for(i=list_size-1;i>0;i--) { if(((tree->mod->s_opt->spr_lnL == YES) && (list[i]->lnL > list[i-1]->lnL)) || ((tree->mod->s_opt->spr_lnL == NO) && (list[i]->pars <= list[i-1]->pars))) { buff_spr = list[i-1]; list[i-1] = list[i]; list[i] = buff_spr; } else { rk = i; break; } } } return rk; } /*********************************************************/ void Random_Spr(int n_moves, t_tree *tree) { int i; int br_pulled, br_target; t_spr *spr_struct; t_edge *target, *residual; spr_struct = Make_One_Spr(tree); Init_One_Spr(spr_struct); target = residual = NULL; for(i=0;in_otu-3-1)); */ br_pulled = Rand_Int(0,2*tree->n_otu-3-1); do { /* br_target = (int)((phydbl)rand()/RAND_MAX * (2*tree->n_otu-3-1)); */ br_target = Rand_Int(0,2*tree->n_otu-3-1); } while(br_target == br_pulled); spr_struct->n_link = tree->a_edges[br_pulled]->left; spr_struct->n_opp_to_link = tree->a_edges[br_pulled]->rght; spr_struct->b_opp_to_link = tree->a_edges[br_pulled]; spr_struct->b_target = tree->a_edges[br_target]; spr_struct->b_init_target = NULL; if(!Check_Spr_Move_Validity(spr_struct,tree)) { spr_struct->n_link = tree->a_edges[br_pulled]->rght; spr_struct->n_opp_to_link = tree->a_edges[br_pulled]->left; } #ifdef DEBUG if(!Check_Spr_Move_Validity(spr_struct,tree)) { Warn_And_Exit("\n== Could not find a valid move...\n"); } #endif if(spr_struct->n_link == spr_struct->b_target->left || spr_struct->n_link == spr_struct->b_target->rght) { n_moves++; continue; } Prune_Subtree(spr_struct->n_link, spr_struct->n_opp_to_link, &target, &residual, tree); Graft_Subtree(spr_struct->b_target, spr_struct->n_link, NULL, residual,NULL,tree); } Free(spr_struct); } /*********************************************************/ void Reset_Spr_List(t_spr **list, int size) { int i; for(i=0;idepth_path = 0; list[i]->pars = MAX_PARS; list[i]->lnL = UNLIKELY; list[i]->n_link = NULL; list[i]->n_opp_to_link = NULL; list[i]->b_target = NULL; } } /*********************************************************/ int Check_Spr_Move_Validity(t_spr *this_spr_move, t_tree *tree) { int match; match = 0; Found_In_Subtree(this_spr_move->n_link, this_spr_move->n_opp_to_link, this_spr_move->b_target->left, &match, tree); if(match) return 0; else return 1; } /*********************************************************/ void Spr_Pars(int threshold, int n_round_max, t_tree *tree) { int curr_pars,round; if(tree->verbose > VL2 && tree->io->quiet == NO) PhyML_Printf("\n. Minimizing parsimony...\n"); tree->best_pars = 1E+8; tree->best_lnL = UNLIKELY; tree->mod->s_opt->spr_lnL = NO; tree->mod->s_opt->spr_pars = YES; curr_pars = tree->c_pars; tree->mod->s_opt->max_depth_path = tree->n_otu; round = 0; do { curr_pars = tree->c_pars; Speed_Spr(tree,1.0,1,0.0); } while(tree->mod->s_opt->n_improvements && fabs((phydbl)(tree->c_pars - curr_pars)) > threshold && round++ < n_round_max); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Spr_Shuffle(t_tree *mixt_tree) { phydbl lk_old; int *orig_catg,n,n_iter; t_tree *tree,**tree_list; if(mixt_tree->verbose > VL0) PhyML_Printf("\n\n. Refining the tree...\n"); /*! Get the number of classes in each mixture */ orig_catg = MIXT_Get_Number_Of_Classes_In_All_Mixtures(mixt_tree); /*! Set the number of rate classes to (at most) 2. ! Propagate this to every mixture tree in the analysis */ tree = mixt_tree; n = 0; do { #ifdef BEAGLE tree->b_inst = create_beagle_instance(tree, tree->io->quiet, tree->io); //Instead of capping the rate categories at 2, just //give the other categories 0 weight if(orig_catg[n] > 2) //should we even bother? { double cat_wghts[orig_catg[n]]; //Give the first two categories equal weights cat_wghts[0] = 0.5; cat_wghts[1] = 0.5; int i; for(i=2;ib_inst,0,cat_wghts); if(ret<0) {fprintf(stderr, "beagleSetCategoryWeights() on instance %i failed:%i\n\n",tree->b_inst,ret);Exit(""); } tree->mod->optimizing_topology = true; } #endif tree->mod->ras->n_catg = MIN(2,orig_catg[n]); if(tree->mod->ras->invar == YES) tree->mod->ras->n_catg--; tree = tree->next_mixt; n++; } while(tree); /*! Make sure the number of trees in each mixture is at most 2 */ tree_list = MIXT_Record_All_Mixtures(mixt_tree); MIXT_Break_All_Mixtures(orig_catg,mixt_tree); Set_Both_Sides(YES,mixt_tree); Lk(NULL,mixt_tree); mixt_tree->best_pars = 1E+8; mixt_tree->mod->s_opt->spr_lnL = NO; mixt_tree->mod->s_opt->spr_pars = NO; mixt_tree->mod->s_opt->quickdirty = NO; mixt_tree->best_lnL = mixt_tree->c_lnL; mixt_tree->mod->s_opt->max_depth_path = mixt_tree->n_otu; mixt_tree->mod->s_opt->min_diff_lk_move = 0.1; mixt_tree->annealing_temp = 0.0; n_iter = 0; do { Set_Both_Sides(YES,mixt_tree); Lk(NULL,mixt_tree); Pars(NULL,mixt_tree); Record_Br_Len(mixt_tree); mixt_tree->best_pars = mixt_tree->c_pars; mixt_tree->best_lnL = mixt_tree->c_lnL; lk_old = mixt_tree->c_lnL; Spr(UNLIKELY,1.0,mixt_tree); mixt_tree->annealing_temp -= 2.; if(mixt_tree->annealing_temp < 0.0) mixt_tree->annealing_temp = 0.0; if(mixt_tree->mod->s_opt->n_improvements < 5 || mixt_tree->mod->s_opt->max_spr_depth < 2 || FABS(lk_old-mixt_tree->c_lnL) < 5. || ++n_iter > 10) break; } while(1); mixt_tree->annealing_temp = 0.0; if(mixt_tree->verbose > VL0 && mixt_tree->io->quiet == NO) { PhyML_Printf("\n\n. End of refining stage...\n"); } /*! Go back to the original data structure, with potentially more ! than 2 trees per mixture */ MIXT_Reconnect_All_Mixtures(tree_list,mixt_tree); Free(tree_list); /*! Set the number of rate classes to their original values */ tree = mixt_tree; n = 0; do { tree->mod->ras->n_catg = orig_catg[n]; #ifdef BEAGLE tree->mod->optimizing_topology = false; //Reset the rate categories to their original weights if(orig_catg[n] > 2){ update_beagle_ras(tree->mod); } #endif if(tree->mod->ras->invar == YES) tree->mod->ras->n_catg--; tree = tree->next_mixt; n++; } while(tree); Free(orig_catg); /*! Only the first two trees for each mixture have been modified so ! far -> need to update the other trees by copying the modified trees ! onto them. */ tree = mixt_tree; do { if(tree != mixt_tree) Copy_Tree(mixt_tree,tree); tree = tree->next; } while(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Spr_Random_Explore(t_tree *tree, phydbl anneal_temp, phydbl prop_spr, int do_rnd, int max_cycles) { int step,i,n_targets,n_rand; t_tree *best_tree; scalar_dbl **best_bl; t_node *rnd_node; t_edge *b_target,*b_residual,**target_list,*rnd_edge; phydbl true_best_lnL; if(tree->lock_topo == YES) { PhyML_Fprintf(stderr,"\n== The tree topology is locked."); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } Set_Both_Sides(NO,tree); Pars(NULL,tree); Lk(NULL,tree); tree->mod->s_opt->max_depth_path = (int)(tree->n_otu/3); tree->mod->s_opt->min_diff_lk_move = 0.1; tree->mod->s_opt->spr_lnL = NO; tree->mod->s_opt->spr_pars = NO; tree->mod->s_opt->deepest_path = 0; tree->best_pars = tree->c_pars; step = 0; true_best_lnL = tree->c_lnL; best_tree = Make_Tree_From_Scratch(tree->n_otu,tree->data); best_bl = Copy_Br_Len(tree); target_list = (t_edge **)mCalloc(2*tree->n_otu-3,sizeof(t_edge *)); n_targets = 0; tree->annealing_temp = anneal_temp; Copy_Tree(tree,best_tree); do { if(do_rnd == YES) { n_rand = 0; do { rnd_node = tree->a_nodes[Rand_Int(tree->n_otu,2*tree->n_otu-3)]; assert(rnd_node != tree->n_root && rnd_node->tax == NO); rnd_edge = rnd_node->b[Rand_Int(0,2)]; Prune_Subtree(rnd_node, rnd_node == rnd_edge->left ? rnd_edge->rght : rnd_edge->left, &b_target, &b_residual, tree); n_targets = 0; for(i=0;i<3;i++) if(b_target->left->v[i] != b_target->rght) Get_List_Of_Adjacent_Targets(b_target->left,b_target->left->v[i],NULL,&target_list,&n_targets,0,5); for(i=0;i<3;i++) if(b_target->rght->v[i] != b_target->left) Get_List_Of_Adjacent_Targets(b_target->rght,b_target->rght->v[i],NULL,&target_list,&n_targets,0,5); if(n_targets > 0) b_target = target_list[Rand_Int(0,n_targets-1)]; assert(b_target != NULL); Graft_Subtree(b_target,rnd_node,NULL,b_residual,NULL,tree); n_rand++; } while(n_rand != 1); } Set_Both_Sides(YES,tree); Lk(NULL,tree); Pars(NULL,tree); Print_Lk_And_Pars(tree); if(tree->annealing_temp < 0.0) tree->annealing_temp = 0.0; if(prop_spr > 1.0) prop_spr = 1.0; tree->best_lnL = tree->c_lnL; tree->best_pars = tree->c_pars; Spr(UNLIKELY,prop_spr,tree); tree->annealing_temp -= 0.5; prop_spr+=0.2; Optimiz_All_Free_Param(tree,(tree->io->quiet == YES)?(0):(tree->verbose > VL0)); Optimize_Br_Len_Serie(2,tree); if(tree->io->print_trace) { char *s = Write_Tree(tree); PhyML_Fprintf(tree->io->fp_out_trace,"[%f]%s\n",tree->c_lnL,s); fflush(tree->io->fp_out_trace); if((tree->io->print_site_lnl) && (!tree->mod->s_opt->spr_pars)) { Print_Site_Lk(tree,tree->io->fp_out_lk); fflush(tree->io->fp_out_lk); } Free(s); } if(tree->io->print_json_trace == YES) JSON_Tree_Io(tree,tree->io->fp_out_json_trace); /* Record the current best log-likelihood and parsimony */ if(tree->c_lnL > true_best_lnL) { true_best_lnL = tree->c_lnL; For(i,2*tree->n_otu-1) Free_Scalar_Dbl(best_bl[i]); Free(best_bl); best_bl = Copy_Br_Len(tree); Copy_Tree(tree,best_tree); /* Record tree topology, branch lengths and model parameters */ } Transfer_Br_Len_To_Tree(best_bl,tree); Copy_Tree(best_tree,tree); } while(++step <= max_cycles && tree->mod->s_opt->n_improvements > 0 && tree->mod->s_opt->max_spr_depth > 1); Free(target_list); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // ** EOF: spr.c stephaneguindon-phyml-76a39c8/src/spr.h000066400000000000000000000060171501136442400201520ustar00rootroot00000000000000/* ** spr.h: Header file for the SPR routines. ** ** Wim Hordijk Last modified: 28 August 2006 */ #include #ifndef _SPR_H_ #define _SPR_H_ #include "utilities.h" #define ALL 1 #define BEST 2 #define ONE 3 /* ** _move_: Structure for holding the relevant information for candidate SPR moves. */ typedef struct { t_node *v_prune, *u_prune, *v_n, *v_nx1, *u_n, **path; t_edge *e_prune, *e_regraft; phydbl l_connect, l_est[3], delta_lk, d_L, d_up_v, d_un_v; int dist, rgrft_rank, optim_rank, globl_rank; } _move_; void Init_SPR (t_tree *tree); void Clean_SPR (t_tree *tree); void Optim_SPR (t_tree *tree, int max_size, int method); int Perform_SPR_Moves (t_tree *tree, int max_size); int Perform_Best_SPR (t_tree *tree, int max_size); int Perform_One_SPR (t_tree *tree, int max_size); void Prune (t_edge *e, t_node *v, t_edge **e_connect, t_edge **e_avail, t_tree *tree); void Regraft (t_edge *e, t_node *v, t_edge *avail, t_tree *tree); void PostOrder_v (t_tree *tree, t_node *v, t_edge *e); void PostOrder_w (t_tree *tree, t_node *v, t_edge *v_e, t_node *w, t_edge *e); void Speed_Spr(t_tree *tree, phydbl prop_spr, int max_cycles, phydbl delta_lnL); void Global_Spr_Search(t_tree *tree); void Make_Spr_List(t_tree *tree); void Init_One_Spr(t_spr *a_spr); t_spr *Make_One_Spr(t_tree *tree); int Spr(phydbl init_lnL, phydbl prop_spr, t_tree *tree); int Spr_Recur(t_node *a, t_node *d, t_tree *tree); int Test_All_Spr_Targets(t_edge *pulled, t_node *link, t_tree *tree); void Randomize_Spr_List(t_tree *tree); void Test_One_Spr_Target_Recur(t_node *a, t_node *d, t_edge *pulled, t_node *link, t_edge *residual, t_edge *init_target, int *best_found, t_spr *prev_move, t_tree *tree); t_spr *Test_One_Spr_Target(t_edge *b_target, t_edge *b_arrow, t_node *n_link, t_edge *b_residual, t_edge *init_target, t_node *polarity, t_tree *tree); void Apply_Spr_Moves_One_By_One(t_tree *tree); int Try_One_Spr_Move_Triple(t_spr *move, t_tree *tree); int Try_One_Spr_Move_Full(t_spr *move, short int apply_move, t_tree *tree); void Make_Best_Spr(t_tree *tree); void Random_Spr(int n_moves, t_tree *tree); unsigned int Include_One_Spr_To_List_Of_Spr(t_spr **list, int list_size, t_spr *move, t_tree *tree); void Reset_Spr_List(t_spr **list, int size); int Evaluate_List_Of_Regraft_Pos_Triple(t_spr **spr_list, int list_size, t_tree *tree); void Best_Spr(t_tree *tree); int Check_Spr_Move_Validity(t_spr *this_spr_move, t_tree *tree); void Spr_Subtree(t_edge *b, t_node *link, t_tree *tree); void Spr_Pars(int threshold, int n_round_max, t_tree *tree); void Spr_Shuffle(t_tree *tree); void Sort_Spr_List_Depth(t_tree *tree); void Sort_Spr_List_LnL(t_spr **list, int list_size, t_tree *tree); void Spr_Random_Explore(t_tree *tree, phydbl anneal_temp, phydbl prop_spr, int do_rnd, int max_cycles); void Sort_Spr_List_Pars(t_tree *tree); void Spr_List_Of_Trees(t_tree *tree); void Spr_Pre_Order(t_node *a, t_node *d, t_edge *b, t_tree *tree); #endif /* _SPR_H_ */ /* ** EOF: spr.h */ stephaneguindon-phyml-76a39c8/src/sse.c000066400000000000000000000452601501136442400201360ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "assert.h" #include "sse.h" #ifdef __ARM_NEON #include "sse2neon.h" #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (((defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__) || defined(__ARM_NEON)) && !((defined __AVX__ || defined __AVX2__))) && !defined(DISABLE_NATIVE)) void SSE_Update_Eigen_Lr(t_edge *b, t_tree *tree) { unsigned int site,catg; unsigned int i,j; unsigned const int npattern = tree->data->n_pattern; unsigned const int ncatg = tree->mod->ras->n_catg; unsigned const int ns = tree->mod->ns; unsigned const int sz = (int)BYTE_ALIGN / 8; unsigned const int nblocks = ns / sz; unsigned const int ncatgns = ncatg*ns; const phydbl *p_lk_left,*p_lk_rght,*pi; phydbl *dot_prod,*p_lk_left_pi; phydbl *l_ev,*r_ev; __m128d *_l_ev,*_r_ev,*_prod_left,*_prod_rght; p_lk_left_pi = tree->p_lk_left_pi; l_ev = tree->l_ev; _l_ev = tree->_l_ev; _r_ev = tree->_r_ev; _prod_left = tree->_prod_left; _prod_rght = tree->_prod_rght; assert(sz == 2); assert(tree->update_eigen_lr == YES); r_ev = tree->mod->eigen->r_e_vect; /* Copy transpose of matrix of left eigen vectors */ for(i=0;imod->eigen->l_e_vect[j*ns+i]; /* Load into AVX registers */ for(i=0;ileft->tax ? b->p_lk_tip_l : b->p_lk_left; p_lk_rght = b->rght->tax ? b->p_lk_tip_r : b->p_lk_rght; pi = tree->mod->e_frq->pi->v; dot_prod = tree->dot_prod; for(site=0;sitedata->wght[site] > SMALL) { for(catg=0;catgleft->tax == NO) p_lk_left += ns; if(b->rght->tax == NO) p_lk_rght += ns; } if(b->left->tax == YES) p_lk_left += ns; if(b->rght->tax == YES) p_lk_rght += ns; } else { if(b->left->tax == YES) p_lk_left += ns; else p_lk_left += ncatgns; if(b->rght->tax == YES) p_lk_rght += ns; else p_lk_rght += ncatgns; dot_prod += ncatgns; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl SSE_Lk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, int ns) { phydbl lk; unsigned int l; const unsigned sz = (int)BYTE_ALIGN / 8; const unsigned int nblocks = ns/sz; __m128d _prod[nblocks],_x; for(l=0;ldata->n_pattern; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int ncatgns = ncatg * ns; const unsigned int nsns = ns * ns; const unsigned int sz = (int)BYTE_ALIGN / 8; const unsigned nblocks = ns/sz; __m128d *_tPij1,*_tPij2,*_pmat1plk1,*_pmat2plk2,*_plk0; _tPij1 = tree->_tPij1; _tPij2 = tree->_tPij2; _pmat1plk1 = tree->_pmat1plk1; _pmat2plk2 = tree->_pmat2plk2; _plk0 = tree->_plk0; sum_scale_v1_val = 0; sum_scale_v2_val = 0; n_v1 = n_v2 = NULL; plk0 = plk1 = plk2 = NULL; Pij1 = Pij2 = NULL; tPij1 = tPij2 = NULL; sum_scale_v1 = sum_scale_v2 = NULL; p_lk_loc = NULL; state_v1 = state_v2 = -1; Set_All_Partial_Lk(&n_v1,&n_v2, &plk0,&sum_scale,&p_lk_loc, &Pij1,&tPij1,&plk1,&sum_scale_v1, &Pij2,&tPij2,&plk2,&sum_scale_v2, d,b,tree); // Copy transpose of transition matrices into AVX registers for(i=0;imod->augmented == YES) { PhyML_Printf("\n== AVX version of the Update_Partial_Lk function does not"); PhyML_Printf("\n== allow augmented data."); assert(FALSE); } /* For every site in the alignment */ for(site=0;sitedata->wght[site] > SMALL) { state_v1 = state_v2 = -1; ambiguity_check_v1 = ambiguity_check_v2 = YES; if(n_v1 && n_v1->tax) { ambiguity_check_v1 = n_v1->c_seq->is_ambigu[site]; if(ambiguity_check_v1 == NO) state_v1 = n_v1->c_seq->d_state[site]; } if(n_v2 && n_v2->tax) { ambiguity_check_v2 = n_v2->c_seq->is_ambigu[site]; if(ambiguity_check_v2 == NO) state_v2 = n_v2->c_seq->d_state[site]; } for(catg=0;catgtax) ? 0 : ns; plk2 += (n_v2->tax) ? 0 : ns; } _tPij1 -= ncatg * nsns / sz; _tPij2 -= ncatg * nsns / sz; plk1 += (n_v1->tax) ? ns : 0; plk2 += (n_v2->tax) ? ns : 0; if(tree->scaling_method == SCALE_FAST) { sum_scale_v1_val = (sum_scale_v1)?(sum_scale_v1[site]):(0); sum_scale_v2_val = (sum_scale_v2)?(sum_scale_v2[site]):(0); sum_scale[site] = sum_scale_v1_val + sum_scale_v2_val; if(sum_scale[site] >= 1024) { /* plk0 -= ncatgns; */ /* plk1 -= (n_v1->tax) ? ns : ncatgns; */ /* plk2 -= (n_v2->tax) ? ns : ncatgns; */ /* PhyML_Fprintf(stderr,"\n. PARTIAL site: %d plk0: %p [%g %g %g %g] plk1: %p [%g %g %g %g] plk2: %p [%g %g %g %g]", */ /* site, */ /* plk0, */ /* plk0[0], */ /* plk0[1], */ /* plk0[2], */ /* plk0[3], */ /* plk1, */ /* plk1[0], */ /* plk1[1], */ /* plk1[2], */ /* plk1[3], */ /* plk2, */ /* plk2[0], */ /* plk2[1], */ /* plk2[2], */ /* plk2[3] */ /* ); */ /* PhyML_Fprintf(stderr,"\n. PARTIAL site: %d d: %d n_v1: %d n_v2: %d",site,d->num,n_v1->num,n_v2->num); */ /* PhyML_Fprintf(stderr,"\n. PARTIAL site: %d sum n: %d sum n_v1: %d sum n_v2: %d",site,sum_scale[site],sum_scale_v1_val,sum_scale_v2_val); */ /* plk0 += ncatgns; */ /* plk1 += (n_v1->tax) ? ns : ncatgns; */ /* plk2 += (n_v2->tax) ? ns : ncatgns; */ /* Exit("\n"); */ } plk0 -= ncatgns; largest_p_lk = -BIG; for(i=0;i largest_p_lk) largest_p_lk = plk0[i]; if(largest_p_lk < INV_TWO_TO_THE_LARGE && tree->mod->augmented == NO && tree->apply_lk_scaling == YES) { for(i=0;itax) ? ns : ncatgns; plk2 += (n_v2->tax) ? ns : ncatgns; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void SSE_Partial_Lk_Exex(const __m128d *_tPij1, const int state1, const __m128d *_tPij2, const int state2, const int ns, __m128d *plk0) { unsigned const int sz = (int)BYTE_ALIGN / 8; unsigned const int nblocks = ns / sz; unsigned int i; _tPij1 = _tPij1 + state1 * nblocks; _tPij2 = _tPij2 + state2 * nblocks; for(i=0;i 1.0 || plk1[i] < 1.0 || plk2[i] > 1.0 || plk2[i] < 1.0) break; if(i != ns) { SSE_Matrix_Vect_Prod(_tPij1,plk1,ns,_pmat1plk1); SSE_Matrix_Vect_Prod(_tPij2,plk2,ns,_pmat2plk2); for(i=0;i #ifndef SSE_H #define SSE_H #include "utilities.h" #include "optimiz.h" #include "models.h" #include "free.h" #include "times.h" #include "mixt.h" #ifdef __ARM_NEON #include "sse2neon.h" #endif #if (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__) || defined(__ARM_NEON)) void SSE_Update_Partial_Lk(t_tree *tree,t_edge *b_fcus,t_node *n); void SSE_Update_Eigen_Lr(t_edge *b, t_tree *tree); phydbl SSE_Lk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, int ns); phydbl SSE_Lk_Core_One_Class_No_Eigen_Lr(phydbl *p_lk_left, phydbl *p_lk_rght, phydbl *Pij, phydbl *tPij, phydbl *pi, int ns, int ambiguity_check, int state); phydbl SSE_Lk_Core(int state, int ambiguity_check, t_edge *b, t_tree *tree); phydbl SSE_Lk_Core_Nucl(int state, int ambiguity_check, t_edge *b, t_tree *tree); phydbl SSE_Lk_Core_AA(int state, int ambiguity_check, t_edge *b, t_tree *tree); void SSE_Lk_dLk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, unsigned int ns, phydbl *lk, phydbl *dlk); void SSE_Partial_Lk_Exex(const __m128d *_tPij1, const int state1, const __m128d *_tPij2, const int state2, const int ns, __m128d *plk0); void SSE_Partial_Lk_Exin(const __m128d *_tPij1, const int state1, const __m128d *_tPij2, const phydbl *_plk2, __m128d *_pmat2plk2, const int ns, __m128d *_plk0); void SSE_Partial_Lk_Inin(const __m128d *_tPij1, const phydbl *plk1, __m128d *_pmat1plk1, const __m128d *_tPij2, const phydbl *plk2, __m128d *_pmat2plk2, const int ns, __m128d *_plk0); void SSE_Matrix_Vect_Prod(const __m128d *_m_transpose, const phydbl *_v, const int ns, __m128d *_u); __m128 _mm_hadd4_ps(__m128 i); #endif #endif stephaneguindon-phyml-76a39c8/src/sse2neon.h000066400000000000000000014222541501136442400211100ustar00rootroot00000000000000#ifndef SSE2NEON_H #define SSE2NEON_H /* * sse2neon is freely redistributable under the MIT License. * * Copyright (c) 2015-2024 SSE2NEON Contributors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ // This header file provides a simple API translation layer // between SSE intrinsics to their corresponding Arm/Aarch64 NEON versions // // Contributors to this work are: // John W. Ratcliff // Brandon Rowlett // Ken Fast // Eric van Beurden // Alexander Potylitsin // Hasindu Gamaarachchi // Jim Huang // Mark Cheng // Malcolm James MacLeod // Devin Hussey (easyaspi314) // Sebastian Pop // Developer Ecosystem Engineering // Danila Kutenin // François Turban (JishinMaster) // Pei-Hsuan Hung // Yang-Hao Yuan // Syoyo Fujita // Brecht Van Lommel // Jonathan Hue // Cuda Chen // Aymen Qader // Anthony Roberts /* Tunable configurations */ /* Enable precise implementation of math operations * This would slow down the computation a bit, but gives consistent result with * x86 SSE. (e.g. would solve a hole or NaN pixel in the rendering result) */ /* _mm_min|max_ps|ss|pd|sd */ #ifndef SSE2NEON_PRECISE_MINMAX #define SSE2NEON_PRECISE_MINMAX (0) #endif /* _mm_rcp_ps */ #ifndef SSE2NEON_PRECISE_DIV #define SSE2NEON_PRECISE_DIV (0) #endif /* _mm_sqrt_ps and _mm_rsqrt_ps */ #ifndef SSE2NEON_PRECISE_SQRT #define SSE2NEON_PRECISE_SQRT (0) #endif /* _mm_dp_pd */ #ifndef SSE2NEON_PRECISE_DP #define SSE2NEON_PRECISE_DP (0) #endif /* Enable inclusion of windows.h on MSVC platforms * This makes _mm_clflush functional on windows, as there is no builtin. */ #ifndef SSE2NEON_INCLUDE_WINDOWS_H #define SSE2NEON_INCLUDE_WINDOWS_H (0) #endif /* compiler specific definitions */ #if defined(__GNUC__) || defined(__clang__) #pragma push_macro("FORCE_INLINE") #pragma push_macro("ALIGN_STRUCT") #define FORCE_INLINE static inline __attribute__((always_inline)) #define ALIGN_STRUCT(x) __attribute__((aligned(x))) #define _sse2neon_likely(x) __builtin_expect(!!(x), 1) #define _sse2neon_unlikely(x) __builtin_expect(!!(x), 0) #elif defined(_MSC_VER) #if _MSVC_TRADITIONAL #error Using the traditional MSVC preprocessor is not supported! Use /Zc:preprocessor instead. #endif #ifndef FORCE_INLINE #define FORCE_INLINE static inline #endif #ifndef ALIGN_STRUCT #define ALIGN_STRUCT(x) __declspec(align(x)) #endif #define _sse2neon_likely(x) (x) #define _sse2neon_unlikely(x) (x) #else #pragma message("Macro name collisions may happen with unsupported compilers.") #endif #if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 10 #warning "GCC versions earlier than 10 are not supported." #endif /* C language does not allow initializing a variable with a function call. */ #ifdef __cplusplus #define _sse2neon_const static const #else #define _sse2neon_const const #endif #include #include #if defined(_WIN32) /* Definitions for _mm_{malloc,free} are provided by * from both MinGW-w64 and MSVC. */ #define SSE2NEON_ALLOC_DEFINED #endif /* If using MSVC */ #ifdef _MSC_VER #include #if SSE2NEON_INCLUDE_WINDOWS_H #include #include #endif #if !defined(__cplusplus) #error SSE2NEON only supports C++ compilation with this compiler #endif #ifdef SSE2NEON_ALLOC_DEFINED #include #endif #if (defined(_M_AMD64) || defined(__x86_64__)) || \ (defined(_M_ARM64) || defined(__arm64__)) #define SSE2NEON_HAS_BITSCAN64 #endif #endif #if defined(__GNUC__) || defined(__clang__) #define _sse2neon_define0(type, s, body) \ __extension__({ \ type _a = (s); \ body \ }) #define _sse2neon_define1(type, s, body) \ __extension__({ \ type _a = (s); \ body \ }) #define _sse2neon_define2(type, a, b, body) \ __extension__({ \ type _a = (a), _b = (b); \ body \ }) #define _sse2neon_return(ret) (ret) #else #define _sse2neon_define0(type, a, body) [=](type _a) { body }(a) #define _sse2neon_define1(type, a, body) [](type _a) { body }(a) #define _sse2neon_define2(type, a, b, body) \ [](type _a, type _b) { body }((a), (b)) #define _sse2neon_return(ret) return ret #endif #define _sse2neon_init(...) \ { \ __VA_ARGS__ \ } /* Compiler barrier */ #if defined(_MSC_VER) #define SSE2NEON_BARRIER() _ReadWriteBarrier() #else #define SSE2NEON_BARRIER() \ do { \ __asm__ __volatile__("" ::: "memory"); \ (void) 0; \ } while (0) #endif /* Memory barriers * __atomic_thread_fence does not include a compiler barrier; instead, * the barrier is part of __atomic_load/__atomic_store's "volatile-like" * semantics. */ #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) #include #endif FORCE_INLINE void _sse2neon_smp_mb(void) { SSE2NEON_BARRIER(); #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ !defined(__STDC_NO_ATOMICS__) atomic_thread_fence(memory_order_seq_cst); #elif defined(__GNUC__) || defined(__clang__) __atomic_thread_fence(__ATOMIC_SEQ_CST); #else /* MSVC */ __dmb(_ARM64_BARRIER_ISH); #endif } /* Architecture-specific build options */ /* FIXME: #pragma GCC push_options is only available on GCC */ #if defined(__GNUC__) #if defined(__arm__) && __ARM_ARCH == 7 /* According to ARM C Language Extensions Architecture specification, * __ARM_NEON is defined to a value indicating the Advanced SIMD (NEON) * architecture supported. */ #if !defined(__ARM_NEON) || !defined(__ARM_NEON__) #error "You must enable NEON instructions (e.g. -mfpu=neon) to use SSE2NEON." #endif #if !defined(__clang__) #pragma GCC push_options #pragma GCC target("fpu=neon") #endif #elif defined(__aarch64__) || defined(_M_ARM64) #if !defined(__clang__) && !defined(_MSC_VER) #pragma GCC push_options #pragma GCC target("+simd") #endif #elif __ARM_ARCH == 8 #if !defined(__ARM_NEON) || !defined(__ARM_NEON__) #error \ "You must enable NEON instructions (e.g. -mfpu=neon-fp-armv8) to use SSE2NEON." #endif #if !defined(__clang__) && !defined(_MSC_VER) #pragma GCC push_options #endif #else #error \ "Unsupported target. Must be either ARMv7-A+NEON or ARMv8-A \ (you could try setting target explicitly with -march or -mcpu)" #endif #endif #include #if (!defined(__aarch64__) && !defined(_M_ARM64)) && (__ARM_ARCH == 8) #if defined __has_include && __has_include() #include #endif #endif /* Apple Silicon cache lines are double of what is commonly used by Intel, AMD * and other Arm microarchitectures use. * From sysctl -a on Apple M1: * hw.cachelinesize: 128 */ #if defined(__APPLE__) && (defined(__aarch64__) || defined(__arm64__)) #define SSE2NEON_CACHELINE_SIZE 128 #else #define SSE2NEON_CACHELINE_SIZE 64 #endif /* Rounding functions require either Aarch64 instructions or libm fallback */ #if !defined(__aarch64__) && !defined(_M_ARM64) #include #endif /* On ARMv7, some registers, such as PMUSERENR and PMCCNTR, are read-only * or even not accessible in user mode. * To write or access to these registers in user mode, * we have to perform syscall instead. */ #if (!defined(__aarch64__) && !defined(_M_ARM64)) #include #endif /* "__has_builtin" can be used to query support for built-in functions * provided by gcc/clang and other compilers that support it. */ #ifndef __has_builtin /* GCC prior to 10 or non-clang compilers */ /* Compatibility with gcc <= 9 */ #if defined(__GNUC__) && (__GNUC__ <= 9) #define __has_builtin(x) HAS##x #define HAS__builtin_popcount 1 #define HAS__builtin_popcountll 1 // __builtin_shuffle introduced in GCC 4.7.0 #if (__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) #define HAS__builtin_shuffle 1 #else #define HAS__builtin_shuffle 0 #endif #define HAS__builtin_shufflevector 0 #define HAS__builtin_nontemporal_store 0 #else #define __has_builtin(x) 0 #endif #endif /** * MACRO for shuffle parameter for _mm_shuffle_ps(). * Argument fp3 is a digit[0123] that represents the fp from argument "b" * of mm_shuffle_ps that will be placed in fp3 of result. fp2 is the same * for fp2 in result. fp1 is a digit[0123] that represents the fp from * argument "a" of mm_shuffle_ps that will be places in fp1 of result. * fp0 is the same for fp0 of result. */ #define _MM_SHUFFLE(fp3, fp2, fp1, fp0) \ (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0))) #if __has_builtin(__builtin_shufflevector) #define _sse2neon_shuffle(type, a, b, ...) \ __builtin_shufflevector(a, b, __VA_ARGS__) #elif __has_builtin(__builtin_shuffle) #define _sse2neon_shuffle(type, a, b, ...) \ __extension__({ \ type tmp = {__VA_ARGS__}; \ __builtin_shuffle(a, b, tmp); \ }) #endif #ifdef _sse2neon_shuffle #define vshuffle_s16(a, b, ...) _sse2neon_shuffle(int16x4_t, a, b, __VA_ARGS__) #define vshuffleq_s16(a, b, ...) _sse2neon_shuffle(int16x8_t, a, b, __VA_ARGS__) #define vshuffle_s32(a, b, ...) _sse2neon_shuffle(int32x2_t, a, b, __VA_ARGS__) #define vshuffleq_s32(a, b, ...) _sse2neon_shuffle(int32x4_t, a, b, __VA_ARGS__) #define vshuffle_s64(a, b, ...) _sse2neon_shuffle(int64x1_t, a, b, __VA_ARGS__) #define vshuffleq_s64(a, b, ...) _sse2neon_shuffle(int64x2_t, a, b, __VA_ARGS__) #endif /* Rounding mode macros. */ #define _MM_FROUND_TO_NEAREST_INT 0x00 #define _MM_FROUND_TO_NEG_INF 0x01 #define _MM_FROUND_TO_POS_INF 0x02 #define _MM_FROUND_TO_ZERO 0x03 #define _MM_FROUND_CUR_DIRECTION 0x04 #define _MM_FROUND_NO_EXC 0x08 #define _MM_FROUND_RAISE_EXC 0x00 #define _MM_FROUND_NINT (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_RAISE_EXC) #define _MM_FROUND_FLOOR (_MM_FROUND_TO_NEG_INF | _MM_FROUND_RAISE_EXC) #define _MM_FROUND_CEIL (_MM_FROUND_TO_POS_INF | _MM_FROUND_RAISE_EXC) #define _MM_FROUND_TRUNC (_MM_FROUND_TO_ZERO | _MM_FROUND_RAISE_EXC) #define _MM_FROUND_RINT (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_RAISE_EXC) #define _MM_FROUND_NEARBYINT (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_NO_EXC) #define _MM_ROUND_NEAREST 0x0000 #define _MM_ROUND_DOWN 0x2000 #define _MM_ROUND_UP 0x4000 #define _MM_ROUND_TOWARD_ZERO 0x6000 /* Flush zero mode macros. */ #define _MM_FLUSH_ZERO_MASK 0x8000 #define _MM_FLUSH_ZERO_ON 0x8000 #define _MM_FLUSH_ZERO_OFF 0x0000 /* Denormals are zeros mode macros. */ #define _MM_DENORMALS_ZERO_MASK 0x0040 #define _MM_DENORMALS_ZERO_ON 0x0040 #define _MM_DENORMALS_ZERO_OFF 0x0000 /* indicate immediate constant argument in a given range */ #define __constrange(a, b) const /* A few intrinsics accept traditional data types like ints or floats, but * most operate on data types that are specific to SSE. * If a vector type ends in d, it contains doubles, and if it does not have * a suffix, it contains floats. An integer vector type can contain any type * of integer, from chars to shorts to unsigned long longs. */ typedef int64x1_t __m64; typedef float32x4_t __m128; /* 128-bit vector containing 4 floats */ // On ARM 32-bit architecture, the float64x2_t is not supported. // The data type __m128d should be represented in a different way for related // intrinsic conversion. #if defined(__aarch64__) || defined(_M_ARM64) typedef float64x2_t __m128d; /* 128-bit vector containing 2 doubles */ #else typedef float32x4_t __m128d; #endif typedef int64x2_t __m128i; /* 128-bit vector containing integers */ // Some intrinsics operate on unaligned data types. typedef int16_t ALIGN_STRUCT(1) unaligned_int16_t; typedef int32_t ALIGN_STRUCT(1) unaligned_int32_t; typedef int64_t ALIGN_STRUCT(1) unaligned_int64_t; // __int64 is defined in the Intrinsics Guide which maps to different datatype // in different data model #if !(defined(_WIN32) || defined(_WIN64) || defined(__int64)) #if (defined(__x86_64__) || defined(__i386__)) #define __int64 long long #else #define __int64 int64_t #endif #endif /* type-safe casting between types */ #define vreinterpretq_m128_f16(x) vreinterpretq_f32_f16(x) #define vreinterpretq_m128_f32(x) (x) #define vreinterpretq_m128_f64(x) vreinterpretq_f32_f64(x) #define vreinterpretq_m128_u8(x) vreinterpretq_f32_u8(x) #define vreinterpretq_m128_u16(x) vreinterpretq_f32_u16(x) #define vreinterpretq_m128_u32(x) vreinterpretq_f32_u32(x) #define vreinterpretq_m128_u64(x) vreinterpretq_f32_u64(x) #define vreinterpretq_m128_s8(x) vreinterpretq_f32_s8(x) #define vreinterpretq_m128_s16(x) vreinterpretq_f32_s16(x) #define vreinterpretq_m128_s32(x) vreinterpretq_f32_s32(x) #define vreinterpretq_m128_s64(x) vreinterpretq_f32_s64(x) #define vreinterpretq_f16_m128(x) vreinterpretq_f16_f32(x) #define vreinterpretq_f32_m128(x) (x) #define vreinterpretq_f64_m128(x) vreinterpretq_f64_f32(x) #define vreinterpretq_u8_m128(x) vreinterpretq_u8_f32(x) #define vreinterpretq_u16_m128(x) vreinterpretq_u16_f32(x) #define vreinterpretq_u32_m128(x) vreinterpretq_u32_f32(x) #define vreinterpretq_u64_m128(x) vreinterpretq_u64_f32(x) #define vreinterpretq_s8_m128(x) vreinterpretq_s8_f32(x) #define vreinterpretq_s16_m128(x) vreinterpretq_s16_f32(x) #define vreinterpretq_s32_m128(x) vreinterpretq_s32_f32(x) #define vreinterpretq_s64_m128(x) vreinterpretq_s64_f32(x) #define vreinterpretq_m128i_s8(x) vreinterpretq_s64_s8(x) #define vreinterpretq_m128i_s16(x) vreinterpretq_s64_s16(x) #define vreinterpretq_m128i_s32(x) vreinterpretq_s64_s32(x) #define vreinterpretq_m128i_s64(x) (x) #define vreinterpretq_m128i_u8(x) vreinterpretq_s64_u8(x) #define vreinterpretq_m128i_u16(x) vreinterpretq_s64_u16(x) #define vreinterpretq_m128i_u32(x) vreinterpretq_s64_u32(x) #define vreinterpretq_m128i_u64(x) vreinterpretq_s64_u64(x) #define vreinterpretq_f32_m128i(x) vreinterpretq_f32_s64(x) #define vreinterpretq_f64_m128i(x) vreinterpretq_f64_s64(x) #define vreinterpretq_s8_m128i(x) vreinterpretq_s8_s64(x) #define vreinterpretq_s16_m128i(x) vreinterpretq_s16_s64(x) #define vreinterpretq_s32_m128i(x) vreinterpretq_s32_s64(x) #define vreinterpretq_s64_m128i(x) (x) #define vreinterpretq_u8_m128i(x) vreinterpretq_u8_s64(x) #define vreinterpretq_u16_m128i(x) vreinterpretq_u16_s64(x) #define vreinterpretq_u32_m128i(x) vreinterpretq_u32_s64(x) #define vreinterpretq_u64_m128i(x) vreinterpretq_u64_s64(x) #define vreinterpret_m64_s8(x) vreinterpret_s64_s8(x) #define vreinterpret_m64_s16(x) vreinterpret_s64_s16(x) #define vreinterpret_m64_s32(x) vreinterpret_s64_s32(x) #define vreinterpret_m64_s64(x) (x) #define vreinterpret_m64_u8(x) vreinterpret_s64_u8(x) #define vreinterpret_m64_u16(x) vreinterpret_s64_u16(x) #define vreinterpret_m64_u32(x) vreinterpret_s64_u32(x) #define vreinterpret_m64_u64(x) vreinterpret_s64_u64(x) #define vreinterpret_m64_f16(x) vreinterpret_s64_f16(x) #define vreinterpret_m64_f32(x) vreinterpret_s64_f32(x) #define vreinterpret_m64_f64(x) vreinterpret_s64_f64(x) #define vreinterpret_u8_m64(x) vreinterpret_u8_s64(x) #define vreinterpret_u16_m64(x) vreinterpret_u16_s64(x) #define vreinterpret_u32_m64(x) vreinterpret_u32_s64(x) #define vreinterpret_u64_m64(x) vreinterpret_u64_s64(x) #define vreinterpret_s8_m64(x) vreinterpret_s8_s64(x) #define vreinterpret_s16_m64(x) vreinterpret_s16_s64(x) #define vreinterpret_s32_m64(x) vreinterpret_s32_s64(x) #define vreinterpret_s64_m64(x) (x) #define vreinterpret_f32_m64(x) vreinterpret_f32_s64(x) #if defined(__aarch64__) || defined(_M_ARM64) #define vreinterpretq_m128d_s32(x) vreinterpretq_f64_s32(x) #define vreinterpretq_m128d_s64(x) vreinterpretq_f64_s64(x) #define vreinterpretq_m128d_u64(x) vreinterpretq_f64_u64(x) #define vreinterpretq_m128d_f32(x) vreinterpretq_f64_f32(x) #define vreinterpretq_m128d_f64(x) (x) #define vreinterpretq_s64_m128d(x) vreinterpretq_s64_f64(x) #define vreinterpretq_u32_m128d(x) vreinterpretq_u32_f64(x) #define vreinterpretq_u64_m128d(x) vreinterpretq_u64_f64(x) #define vreinterpretq_f64_m128d(x) (x) #define vreinterpretq_f32_m128d(x) vreinterpretq_f32_f64(x) #else #define vreinterpretq_m128d_s32(x) vreinterpretq_f32_s32(x) #define vreinterpretq_m128d_s64(x) vreinterpretq_f32_s64(x) #define vreinterpretq_m128d_u32(x) vreinterpretq_f32_u32(x) #define vreinterpretq_m128d_u64(x) vreinterpretq_f32_u64(x) #define vreinterpretq_m128d_f32(x) (x) #define vreinterpretq_s64_m128d(x) vreinterpretq_s64_f32(x) #define vreinterpretq_u32_m128d(x) vreinterpretq_u32_f32(x) #define vreinterpretq_u64_m128d(x) vreinterpretq_u64_f32(x) #define vreinterpretq_f32_m128d(x) (x) #endif // A struct is defined in this header file called 'SIMDVec' which can be used // by applications which attempt to access the contents of an __m128 struct // directly. It is important to note that accessing the __m128 struct directly // is bad coding practice by Microsoft: @see: // https://learn.microsoft.com/en-us/cpp/cpp/m128 // // However, some legacy source code may try to access the contents of an __m128 // struct directly so the developer can use the SIMDVec as an alias for it. Any // casting must be done manually by the developer, as you cannot cast or // otherwise alias the base NEON data type for intrinsic operations. // // union intended to allow direct access to an __m128 variable using the names // that the MSVC compiler provides. This union should really only be used when // trying to access the members of the vector as integer values. GCC/clang // allow native access to the float members through a simple array access // operator (in C since 4.6, in C++ since 4.8). // // Ideally direct accesses to SIMD vectors should not be used since it can cause // a performance hit. If it really is needed however, the original __m128 // variable can be aliased with a pointer to this union and used to access // individual components. The use of this union should be hidden behind a macro // that is used throughout the codebase to access the members instead of always // declaring this type of variable. typedef union ALIGN_STRUCT(16) SIMDVec { float m128_f32[4]; // as floats - DON'T USE. Added for convenience. int8_t m128_i8[16]; // as signed 8-bit integers. int16_t m128_i16[8]; // as signed 16-bit integers. int32_t m128_i32[4]; // as signed 32-bit integers. int64_t m128_i64[2]; // as signed 64-bit integers. uint8_t m128_u8[16]; // as unsigned 8-bit integers. uint16_t m128_u16[8]; // as unsigned 16-bit integers. uint32_t m128_u32[4]; // as unsigned 32-bit integers. uint64_t m128_u64[2]; // as unsigned 64-bit integers. } SIMDVec; // casting using SIMDVec #define vreinterpretq_nth_u64_m128i(x, n) (((SIMDVec *) &x)->m128_u64[n]) #define vreinterpretq_nth_u32_m128i(x, n) (((SIMDVec *) &x)->m128_u32[n]) #define vreinterpretq_nth_u8_m128i(x, n) (((SIMDVec *) &x)->m128_u8[n]) /* SSE macros */ #define _MM_GET_FLUSH_ZERO_MODE _sse2neon_mm_get_flush_zero_mode #define _MM_SET_FLUSH_ZERO_MODE _sse2neon_mm_set_flush_zero_mode #define _MM_GET_DENORMALS_ZERO_MODE _sse2neon_mm_get_denormals_zero_mode #define _MM_SET_DENORMALS_ZERO_MODE _sse2neon_mm_set_denormals_zero_mode // Function declaration // SSE FORCE_INLINE unsigned int _MM_GET_ROUNDING_MODE(void); FORCE_INLINE __m128 _mm_move_ss(__m128, __m128); FORCE_INLINE __m128 _mm_or_ps(__m128, __m128); FORCE_INLINE __m128 _mm_set_ps1(float); FORCE_INLINE __m128 _mm_setzero_ps(void); // SSE2 FORCE_INLINE __m128i _mm_and_si128(__m128i, __m128i); FORCE_INLINE __m128i _mm_castps_si128(__m128); FORCE_INLINE __m128i _mm_cmpeq_epi32(__m128i, __m128i); FORCE_INLINE __m128i _mm_cvtps_epi32(__m128); FORCE_INLINE __m128d _mm_move_sd(__m128d, __m128d); FORCE_INLINE __m128i _mm_or_si128(__m128i, __m128i); FORCE_INLINE __m128i _mm_set_epi32(int, int, int, int); FORCE_INLINE __m128i _mm_set_epi64x(int64_t, int64_t); FORCE_INLINE __m128d _mm_set_pd(double, double); FORCE_INLINE __m128i _mm_set1_epi32(int); FORCE_INLINE __m128i _mm_setzero_si128(void); // SSE4.1 FORCE_INLINE __m128d _mm_ceil_pd(__m128d); FORCE_INLINE __m128 _mm_ceil_ps(__m128); FORCE_INLINE __m128d _mm_floor_pd(__m128d); FORCE_INLINE __m128 _mm_floor_ps(__m128); FORCE_INLINE __m128d _mm_round_pd(__m128d, int); FORCE_INLINE __m128 _mm_round_ps(__m128, int); // SSE4.2 FORCE_INLINE uint32_t _mm_crc32_u8(uint32_t, uint8_t); /* Backwards compatibility for compilers with lack of specific type support */ // Older gcc does not define vld1q_u8_x4 type #if defined(__GNUC__) && !defined(__clang__) && \ ((__GNUC__ <= 13 && defined(__arm__)) || \ (__GNUC__ == 10 && __GNUC_MINOR__ < 3 && defined(__aarch64__)) || \ (__GNUC__ <= 9 && defined(__aarch64__))) FORCE_INLINE uint8x16x4_t _sse2neon_vld1q_u8_x4(const uint8_t *p) { uint8x16x4_t ret; ret.val[0] = vld1q_u8(p + 0); ret.val[1] = vld1q_u8(p + 16); ret.val[2] = vld1q_u8(p + 32); ret.val[3] = vld1q_u8(p + 48); return ret; } #else // Wraps vld1q_u8_x4 FORCE_INLINE uint8x16x4_t _sse2neon_vld1q_u8_x4(const uint8_t *p) { return vld1q_u8_x4(p); } #endif #if !defined(__aarch64__) && !defined(_M_ARM64) /* emulate vaddv u8 variant */ FORCE_INLINE uint8_t _sse2neon_vaddv_u8(uint8x8_t v8) { const uint64x1_t v1 = vpaddl_u32(vpaddl_u16(vpaddl_u8(v8))); return vget_lane_u8(vreinterpret_u8_u64(v1), 0); } #else // Wraps vaddv_u8 FORCE_INLINE uint8_t _sse2neon_vaddv_u8(uint8x8_t v8) { return vaddv_u8(v8); } #endif #if !defined(__aarch64__) && !defined(_M_ARM64) /* emulate vaddvq u8 variant */ FORCE_INLINE uint8_t _sse2neon_vaddvq_u8(uint8x16_t a) { uint8x8_t tmp = vpadd_u8(vget_low_u8(a), vget_high_u8(a)); uint8_t res = 0; for (int i = 0; i < 8; ++i) res += tmp[i]; return res; } #else // Wraps vaddvq_u8 FORCE_INLINE uint8_t _sse2neon_vaddvq_u8(uint8x16_t a) { return vaddvq_u8(a); } #endif #if !defined(__aarch64__) && !defined(_M_ARM64) /* emulate vaddvq u16 variant */ FORCE_INLINE uint16_t _sse2neon_vaddvq_u16(uint16x8_t a) { uint32x4_t m = vpaddlq_u16(a); uint64x2_t n = vpaddlq_u32(m); uint64x1_t o = vget_low_u64(n) + vget_high_u64(n); return vget_lane_u32((uint32x2_t) o, 0); } #else // Wraps vaddvq_u16 FORCE_INLINE uint16_t _sse2neon_vaddvq_u16(uint16x8_t a) { return vaddvq_u16(a); } #endif /* Function Naming Conventions * The naming convention of SSE intrinsics is straightforward. A generic SSE * intrinsic function is given as follows: * _mm__ * * The parts of this format are given as follows: * 1. describes the operation performed by the intrinsic * 2. identifies the data type of the function's primary arguments * * This last part, , is a little complicated. It identifies the * content of the input values, and can be set to any of the following values: * + ps - vectors contain floats (ps stands for packed single-precision) * + pd - vectors contain doubles (pd stands for packed double-precision) * + epi8/epi16/epi32/epi64 - vectors contain 8-bit/16-bit/32-bit/64-bit * signed integers * + epu8/epu16/epu32/epu64 - vectors contain 8-bit/16-bit/32-bit/64-bit * unsigned integers * + si128 - unspecified 128-bit vector or 256-bit vector * + m128/m128i/m128d - identifies input vector types when they are different * than the type of the returned vector * * For example, _mm_setzero_ps. The _mm implies that the function returns * a 128-bit vector. The _ps at the end implies that the argument vectors * contain floats. * * A complete example: Byte Shuffle - pshufb (_mm_shuffle_epi8) * // Set packed 16-bit integers. 128 bits, 8 short, per 16 bits * __m128i v_in = _mm_setr_epi16(1, 2, 3, 4, 5, 6, 7, 8); * // Set packed 8-bit integers * // 128 bits, 16 chars, per 8 bits * __m128i v_perm = _mm_setr_epi8(1, 0, 2, 3, 8, 9, 10, 11, * 4, 5, 12, 13, 6, 7, 14, 15); * // Shuffle packed 8-bit integers * __m128i v_out = _mm_shuffle_epi8(v_in, v_perm); // pshufb */ /* Constants for use with _mm_prefetch. */ enum _mm_hint { _MM_HINT_NTA = 0, /* load data to L1 and L2 cache, mark it as NTA */ _MM_HINT_T0 = 1, /* load data to L1 and L2 cache */ _MM_HINT_T1 = 2, /* load data to L2 cache only */ _MM_HINT_T2 = 3, /* load data to L2 cache only, mark it as NTA */ }; // The bit field mapping to the FPCR(floating-point control register) typedef struct { uint16_t res0; uint8_t res1 : 6; uint8_t bit22 : 1; uint8_t bit23 : 1; uint8_t bit24 : 1; uint8_t res2 : 7; #if defined(__aarch64__) || defined(_M_ARM64) uint32_t res3; #endif } fpcr_bitfield; // Takes the upper 64 bits of a and places it in the low end of the result // Takes the lower 64 bits of b and places it into the high end of the result. FORCE_INLINE __m128 _mm_shuffle_ps_1032(__m128 a, __m128 b) { float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); return vreinterpretq_m128_f32(vcombine_f32(a32, b10)); } // takes the lower two 32-bit values from a and swaps them and places in high // end of result takes the higher two 32 bit values from b and swaps them and // places in low end of result. FORCE_INLINE __m128 _mm_shuffle_ps_2301(__m128 a, __m128 b) { float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); float32x2_t b23 = vrev64_f32(vget_high_f32(vreinterpretq_f32_m128(b))); return vreinterpretq_m128_f32(vcombine_f32(a01, b23)); } FORCE_INLINE __m128 _mm_shuffle_ps_0321(__m128 a, __m128 b) { float32x2_t a21 = vget_high_f32( vextq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 3)); float32x2_t b03 = vget_low_f32( vextq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b), 3)); return vreinterpretq_m128_f32(vcombine_f32(a21, b03)); } FORCE_INLINE __m128 _mm_shuffle_ps_2103(__m128 a, __m128 b) { float32x2_t a03 = vget_low_f32( vextq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 3)); float32x2_t b21 = vget_high_f32( vextq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b), 3)); return vreinterpretq_m128_f32(vcombine_f32(a03, b21)); } FORCE_INLINE __m128 _mm_shuffle_ps_1010(__m128 a, __m128 b) { float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); return vreinterpretq_m128_f32(vcombine_f32(a10, b10)); } FORCE_INLINE __m128 _mm_shuffle_ps_1001(__m128 a, __m128 b) { float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); return vreinterpretq_m128_f32(vcombine_f32(a01, b10)); } FORCE_INLINE __m128 _mm_shuffle_ps_0101(__m128 a, __m128 b) { float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); float32x2_t b01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(b))); return vreinterpretq_m128_f32(vcombine_f32(a01, b01)); } // keeps the low 64 bits of b in the low and puts the high 64 bits of a in the // high FORCE_INLINE __m128 _mm_shuffle_ps_3210(__m128 a, __m128 b) { float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); return vreinterpretq_m128_f32(vcombine_f32(a10, b32)); } FORCE_INLINE __m128 _mm_shuffle_ps_0011(__m128 a, __m128 b) { float32x2_t a11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 1); float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); return vreinterpretq_m128_f32(vcombine_f32(a11, b00)); } FORCE_INLINE __m128 _mm_shuffle_ps_0022(__m128 a, __m128 b) { float32x2_t a22 = vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0); float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); return vreinterpretq_m128_f32(vcombine_f32(a22, b00)); } FORCE_INLINE __m128 _mm_shuffle_ps_2200(__m128 a, __m128 b) { float32x2_t a00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 0); float32x2_t b22 = vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(b)), 0); return vreinterpretq_m128_f32(vcombine_f32(a00, b22)); } FORCE_INLINE __m128 _mm_shuffle_ps_3202(__m128 a, __m128 b) { float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); float32x2_t a22 = vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0); float32x2_t a02 = vset_lane_f32(a0, a22, 1); /* TODO: use vzip ?*/ float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); return vreinterpretq_m128_f32(vcombine_f32(a02, b32)); } FORCE_INLINE __m128 _mm_shuffle_ps_1133(__m128 a, __m128 b) { float32x2_t a33 = vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 1); float32x2_t b11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 1); return vreinterpretq_m128_f32(vcombine_f32(a33, b11)); } FORCE_INLINE __m128 _mm_shuffle_ps_2010(__m128 a, __m128 b) { float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); float32_t b2 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 2); float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); float32x2_t b20 = vset_lane_f32(b2, b00, 1); return vreinterpretq_m128_f32(vcombine_f32(a10, b20)); } FORCE_INLINE __m128 _mm_shuffle_ps_2001(__m128 a, __m128 b) { float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); float32_t b2 = vgetq_lane_f32(b, 2); float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); float32x2_t b20 = vset_lane_f32(b2, b00, 1); return vreinterpretq_m128_f32(vcombine_f32(a01, b20)); } FORCE_INLINE __m128 _mm_shuffle_ps_2032(__m128 a, __m128 b) { float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); float32_t b2 = vgetq_lane_f32(b, 2); float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); float32x2_t b20 = vset_lane_f32(b2, b00, 1); return vreinterpretq_m128_f32(vcombine_f32(a32, b20)); } // For MSVC, we check only if it is ARM64, as every single ARM64 processor // supported by WoA has crypto extensions. If this changes in the future, // this can be verified via the runtime-only method of: // IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) #if (defined(_M_ARM64) && !defined(__clang__)) || \ (defined(__ARM_FEATURE_CRYPTO) && \ (defined(__aarch64__) || __has_builtin(__builtin_arm_crypto_vmullp64))) // Wraps vmull_p64 FORCE_INLINE uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b) { poly64_t a = vget_lane_p64(vreinterpret_p64_u64(_a), 0); poly64_t b = vget_lane_p64(vreinterpret_p64_u64(_b), 0); #if defined(_MSC_VER) __n64 a1 = {a}, b1 = {b}; return vreinterpretq_u64_p128(vmull_p64(a1, b1)); #else return vreinterpretq_u64_p128(vmull_p64(a, b)); #endif } #else // ARMv7 polyfill // ARMv7/some A64 lacks vmull_p64, but it has vmull_p8. // // vmull_p8 calculates 8 8-bit->16-bit polynomial multiplies, but we need a // 64-bit->128-bit polynomial multiply. // // It needs some work and is somewhat slow, but it is still faster than all // known scalar methods. // // Algorithm adapted to C from // https://www.workofard.com/2017/07/ghash-for-low-end-cores/, which is adapted // from "Fast Software Polynomial Multiplication on ARM Processors Using the // NEON Engine" by Danilo Camara, Conrado Gouvea, Julio Lopez and Ricardo Dahab // (https://hal.inria.fr/hal-01506572) static uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b) { poly8x8_t a = vreinterpret_p8_u64(_a); poly8x8_t b = vreinterpret_p8_u64(_b); // Masks uint8x16_t k48_32 = vcombine_u8(vcreate_u8(0x0000ffffffffffff), vcreate_u8(0x00000000ffffffff)); uint8x16_t k16_00 = vcombine_u8(vcreate_u8(0x000000000000ffff), vcreate_u8(0x0000000000000000)); // Do the multiplies, rotating with vext to get all combinations uint8x16_t d = vreinterpretq_u8_p16(vmull_p8(a, b)); // D = A0 * B0 uint8x16_t e = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 1))); // E = A0 * B1 uint8x16_t f = vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 1), b)); // F = A1 * B0 uint8x16_t g = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 2))); // G = A0 * B2 uint8x16_t h = vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 2), b)); // H = A2 * B0 uint8x16_t i = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 3))); // I = A0 * B3 uint8x16_t j = vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 3), b)); // J = A3 * B0 uint8x16_t k = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 4))); // L = A0 * B4 // Add cross products uint8x16_t l = veorq_u8(e, f); // L = E + F uint8x16_t m = veorq_u8(g, h); // M = G + H uint8x16_t n = veorq_u8(i, j); // N = I + J // Interleave. Using vzip1 and vzip2 prevents Clang from emitting TBL // instructions. #if defined(__aarch64__) uint8x16_t lm_p0 = vreinterpretq_u8_u64( vzip1q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m))); uint8x16_t lm_p1 = vreinterpretq_u8_u64( vzip2q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m))); uint8x16_t nk_p0 = vreinterpretq_u8_u64( vzip1q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k))); uint8x16_t nk_p1 = vreinterpretq_u8_u64( vzip2q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k))); #else uint8x16_t lm_p0 = vcombine_u8(vget_low_u8(l), vget_low_u8(m)); uint8x16_t lm_p1 = vcombine_u8(vget_high_u8(l), vget_high_u8(m)); uint8x16_t nk_p0 = vcombine_u8(vget_low_u8(n), vget_low_u8(k)); uint8x16_t nk_p1 = vcombine_u8(vget_high_u8(n), vget_high_u8(k)); #endif // t0 = (L) (P0 + P1) << 8 // t1 = (M) (P2 + P3) << 16 uint8x16_t t0t1_tmp = veorq_u8(lm_p0, lm_p1); uint8x16_t t0t1_h = vandq_u8(lm_p1, k48_32); uint8x16_t t0t1_l = veorq_u8(t0t1_tmp, t0t1_h); // t2 = (N) (P4 + P5) << 24 // t3 = (K) (P6 + P7) << 32 uint8x16_t t2t3_tmp = veorq_u8(nk_p0, nk_p1); uint8x16_t t2t3_h = vandq_u8(nk_p1, k16_00); uint8x16_t t2t3_l = veorq_u8(t2t3_tmp, t2t3_h); // De-interleave #if defined(__aarch64__) uint8x16_t t0 = vreinterpretq_u8_u64( vuzp1q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h))); uint8x16_t t1 = vreinterpretq_u8_u64( vuzp2q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h))); uint8x16_t t2 = vreinterpretq_u8_u64( vuzp1q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h))); uint8x16_t t3 = vreinterpretq_u8_u64( vuzp2q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h))); #else uint8x16_t t1 = vcombine_u8(vget_high_u8(t0t1_l), vget_high_u8(t0t1_h)); uint8x16_t t0 = vcombine_u8(vget_low_u8(t0t1_l), vget_low_u8(t0t1_h)); uint8x16_t t3 = vcombine_u8(vget_high_u8(t2t3_l), vget_high_u8(t2t3_h)); uint8x16_t t2 = vcombine_u8(vget_low_u8(t2t3_l), vget_low_u8(t2t3_h)); #endif // Shift the cross products uint8x16_t t0_shift = vextq_u8(t0, t0, 15); // t0 << 8 uint8x16_t t1_shift = vextq_u8(t1, t1, 14); // t1 << 16 uint8x16_t t2_shift = vextq_u8(t2, t2, 13); // t2 << 24 uint8x16_t t3_shift = vextq_u8(t3, t3, 12); // t3 << 32 // Accumulate the products uint8x16_t cross1 = veorq_u8(t0_shift, t1_shift); uint8x16_t cross2 = veorq_u8(t2_shift, t3_shift); uint8x16_t mix = veorq_u8(d, cross1); uint8x16_t r = veorq_u8(mix, cross2); return vreinterpretq_u64_u8(r); } #endif // ARMv7 polyfill // C equivalent: // __m128i _mm_shuffle_epi32_default(__m128i a, // __constrange(0, 255) int imm) { // __m128i ret; // ret[0] = a[imm & 0x3]; ret[1] = a[(imm >> 2) & 0x3]; // ret[2] = a[(imm >> 4) & 0x03]; ret[3] = a[(imm >> 6) & 0x03]; // return ret; // } #define _mm_shuffle_epi32_default(a, imm) \ vreinterpretq_m128i_s32(vsetq_lane_s32( \ vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 6) & 0x3), \ vsetq_lane_s32( \ vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 4) & 0x3), \ vsetq_lane_s32(vgetq_lane_s32(vreinterpretq_s32_m128i(a), \ ((imm) >> 2) & 0x3), \ vmovq_n_s32(vgetq_lane_s32( \ vreinterpretq_s32_m128i(a), (imm) & (0x3))), \ 1), \ 2), \ 3)) // Takes the upper 64 bits of a and places it in the low end of the result // Takes the lower 64 bits of a and places it into the high end of the result. FORCE_INLINE __m128i _mm_shuffle_epi_1032(__m128i a) { int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a)); int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a)); return vreinterpretq_m128i_s32(vcombine_s32(a32, a10)); } // takes the lower two 32-bit values from a and swaps them and places in low end // of result takes the higher two 32 bit values from a and swaps them and places // in high end of result. FORCE_INLINE __m128i _mm_shuffle_epi_2301(__m128i a) { int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); int32x2_t a23 = vrev64_s32(vget_high_s32(vreinterpretq_s32_m128i(a))); return vreinterpretq_m128i_s32(vcombine_s32(a01, a23)); } // rotates the least significant 32 bits into the most significant 32 bits, and // shifts the rest down FORCE_INLINE __m128i _mm_shuffle_epi_0321(__m128i a) { return vreinterpretq_m128i_s32( vextq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(a), 1)); } // rotates the most significant 32 bits into the least significant 32 bits, and // shifts the rest up FORCE_INLINE __m128i _mm_shuffle_epi_2103(__m128i a) { return vreinterpretq_m128i_s32( vextq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(a), 3)); } // gets the lower 64 bits of a, and places it in the upper 64 bits // gets the lower 64 bits of a and places it in the lower 64 bits FORCE_INLINE __m128i _mm_shuffle_epi_1010(__m128i a) { int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a)); return vreinterpretq_m128i_s32(vcombine_s32(a10, a10)); } // gets the lower 64 bits of a, swaps the 0 and 1 elements, and places it in the // lower 64 bits gets the lower 64 bits of a, and places it in the upper 64 bits FORCE_INLINE __m128i _mm_shuffle_epi_1001(__m128i a) { int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a)); return vreinterpretq_m128i_s32(vcombine_s32(a01, a10)); } // gets the lower 64 bits of a, swaps the 0 and 1 elements and places it in the // upper 64 bits gets the lower 64 bits of a, swaps the 0 and 1 elements, and // places it in the lower 64 bits FORCE_INLINE __m128i _mm_shuffle_epi_0101(__m128i a) { int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); return vreinterpretq_m128i_s32(vcombine_s32(a01, a01)); } FORCE_INLINE __m128i _mm_shuffle_epi_2211(__m128i a) { int32x2_t a11 = vdup_lane_s32(vget_low_s32(vreinterpretq_s32_m128i(a)), 1); int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0); return vreinterpretq_m128i_s32(vcombine_s32(a11, a22)); } FORCE_INLINE __m128i _mm_shuffle_epi_0122(__m128i a) { int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0); int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); return vreinterpretq_m128i_s32(vcombine_s32(a22, a01)); } FORCE_INLINE __m128i _mm_shuffle_epi_3332(__m128i a) { int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a)); int32x2_t a33 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 1); return vreinterpretq_m128i_s32(vcombine_s32(a32, a33)); } #if defined(__aarch64__) || defined(_M_ARM64) #define _mm_shuffle_epi32_splat(a, imm) \ vreinterpretq_m128i_s32(vdupq_laneq_s32(vreinterpretq_s32_m128i(a), (imm))) #else #define _mm_shuffle_epi32_splat(a, imm) \ vreinterpretq_m128i_s32( \ vdupq_n_s32(vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)))) #endif // NEON does not support a general purpose permute intrinsic. // Shuffle single-precision (32-bit) floating-point elements in a using the // control in imm8, and store the results in dst. // // C equivalent: // __m128 _mm_shuffle_ps_default(__m128 a, __m128 b, // __constrange(0, 255) int imm) { // __m128 ret; // ret[0] = a[imm & 0x3]; ret[1] = a[(imm >> 2) & 0x3]; // ret[2] = b[(imm >> 4) & 0x03]; ret[3] = b[(imm >> 6) & 0x03]; // return ret; // } // // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_ps #define _mm_shuffle_ps_default(a, b, imm) \ vreinterpretq_m128_f32(vsetq_lane_f32( \ vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 6) & 0x3), \ vsetq_lane_f32( \ vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 4) & 0x3), \ vsetq_lane_f32( \ vgetq_lane_f32(vreinterpretq_f32_m128(a), ((imm) >> 2) & 0x3), \ vmovq_n_f32( \ vgetq_lane_f32(vreinterpretq_f32_m128(a), (imm) & (0x3))), \ 1), \ 2), \ 3)) // Shuffle 16-bit integers in the low 64 bits of a using the control in imm8. // Store the results in the low 64 bits of dst, with the high 64 bits being // copied from a to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shufflelo_epi16 #define _mm_shufflelo_epi16_function(a, imm) \ _sse2neon_define1( \ __m128i, a, int16x8_t ret = vreinterpretq_s16_m128i(_a); \ int16x4_t lowBits = vget_low_s16(ret); \ ret = vsetq_lane_s16(vget_lane_s16(lowBits, (imm) & (0x3)), ret, 0); \ ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 2) & 0x3), ret, \ 1); \ ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 4) & 0x3), ret, \ 2); \ ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 6) & 0x3), ret, \ 3); \ _sse2neon_return(vreinterpretq_m128i_s16(ret));) // Shuffle 16-bit integers in the high 64 bits of a using the control in imm8. // Store the results in the high 64 bits of dst, with the low 64 bits being // copied from a to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shufflehi_epi16 #define _mm_shufflehi_epi16_function(a, imm) \ _sse2neon_define1( \ __m128i, a, int16x8_t ret = vreinterpretq_s16_m128i(_a); \ int16x4_t highBits = vget_high_s16(ret); \ ret = vsetq_lane_s16(vget_lane_s16(highBits, (imm) & (0x3)), ret, 4); \ ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 2) & 0x3), ret, \ 5); \ ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 4) & 0x3), ret, \ 6); \ ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 6) & 0x3), ret, \ 7); \ _sse2neon_return(vreinterpretq_m128i_s16(ret));) /* MMX */ //_mm_empty is a no-op on arm FORCE_INLINE void _mm_empty(void) {} /* SSE */ // Add packed single-precision (32-bit) floating-point elements in a and b, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_ps FORCE_INLINE __m128 _mm_add_ps(__m128 a, __m128 b) { return vreinterpretq_m128_f32( vaddq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); } // Add the lower single-precision (32-bit) floating-point element in a and b, // store the result in the lower element of dst, and copy the upper 3 packed // elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_ss FORCE_INLINE __m128 _mm_add_ss(__m128 a, __m128 b) { float32_t b0 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 0); float32x4_t value = vsetq_lane_f32(b0, vdupq_n_f32(0), 0); // the upper values in the result must be the remnants of . return vreinterpretq_m128_f32(vaddq_f32(a, value)); } // Compute the bitwise AND of packed single-precision (32-bit) floating-point // elements in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_and_ps FORCE_INLINE __m128 _mm_and_ps(__m128 a, __m128 b) { return vreinterpretq_m128_s32( vandq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); } // Compute the bitwise NOT of packed single-precision (32-bit) floating-point // elements in a and then AND with b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_andnot_ps FORCE_INLINE __m128 _mm_andnot_ps(__m128 a, __m128 b) { return vreinterpretq_m128_s32( vbicq_s32(vreinterpretq_s32_m128(b), vreinterpretq_s32_m128(a))); // *NOTE* argument swap } // Average packed unsigned 16-bit integers in a and b, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_avg_pu16 FORCE_INLINE __m64 _mm_avg_pu16(__m64 a, __m64 b) { return vreinterpret_m64_u16( vrhadd_u16(vreinterpret_u16_m64(a), vreinterpret_u16_m64(b))); } // Average packed unsigned 8-bit integers in a and b, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_avg_pu8 FORCE_INLINE __m64 _mm_avg_pu8(__m64 a, __m64 b) { return vreinterpret_m64_u8( vrhadd_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b))); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for equality, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_ps FORCE_INLINE __m128 _mm_cmpeq_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32( vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for equality, store the result in the lower element of dst, and copy the // upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_ss FORCE_INLINE __m128 _mm_cmpeq_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpeq_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for greater-than-or-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpge_ps FORCE_INLINE __m128 _mm_cmpge_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32( vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for greater-than-or-equal, store the result in the lower element of dst, // and copy the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpge_ss FORCE_INLINE __m128 _mm_cmpge_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpge_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for greater-than, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_ps FORCE_INLINE __m128 _mm_cmpgt_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32( vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for greater-than, store the result in the lower element of dst, and copy // the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_ss FORCE_INLINE __m128 _mm_cmpgt_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpgt_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for less-than-or-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmple_ps FORCE_INLINE __m128 _mm_cmple_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32( vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for less-than-or-equal, store the result in the lower element of dst, and // copy the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmple_ss FORCE_INLINE __m128 _mm_cmple_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmple_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for less-than, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_ps FORCE_INLINE __m128 _mm_cmplt_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32( vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for less-than, store the result in the lower element of dst, and copy the // upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_ss FORCE_INLINE __m128 _mm_cmplt_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmplt_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for not-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpneq_ps FORCE_INLINE __m128 _mm_cmpneq_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32(vmvnq_u32( vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for not-equal, store the result in the lower element of dst, and copy the // upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpneq_ss FORCE_INLINE __m128 _mm_cmpneq_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpneq_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for not-greater-than-or-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnge_ps FORCE_INLINE __m128 _mm_cmpnge_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32(vmvnq_u32( vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for not-greater-than-or-equal, store the result in the lower element of // dst, and copy the upper 3 packed elements from a to the upper elements of // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnge_ss FORCE_INLINE __m128 _mm_cmpnge_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpnge_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for not-greater-than, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpngt_ps FORCE_INLINE __m128 _mm_cmpngt_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32(vmvnq_u32( vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for not-greater-than, store the result in the lower element of dst, and // copy the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpngt_ss FORCE_INLINE __m128 _mm_cmpngt_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpngt_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for not-less-than-or-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnle_ps FORCE_INLINE __m128 _mm_cmpnle_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32(vmvnq_u32( vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for not-less-than-or-equal, store the result in the lower element of dst, // and copy the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnle_ss FORCE_INLINE __m128 _mm_cmpnle_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpnle_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // for not-less-than, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnlt_ps FORCE_INLINE __m128 _mm_cmpnlt_ps(__m128 a, __m128 b) { return vreinterpretq_m128_u32(vmvnq_u32( vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b for not-less-than, store the result in the lower element of dst, and copy // the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnlt_ss FORCE_INLINE __m128 _mm_cmpnlt_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpnlt_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // to see if neither is NaN, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpord_ps // // See also: // http://stackoverflow.com/questions/8627331/what-does-ordered-unordered-comparison-mean // http://stackoverflow.com/questions/29349621/neon-isnanval-intrinsics FORCE_INLINE __m128 _mm_cmpord_ps(__m128 a, __m128 b) { // Note: NEON does not have ordered compare builtin // Need to compare a eq a and b eq b to check for NaN // Do AND of results to get final uint32x4_t ceqaa = vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); uint32x4_t ceqbb = vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); return vreinterpretq_m128_u32(vandq_u32(ceqaa, ceqbb)); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b to see if neither is NaN, store the result in the lower element of dst, and // copy the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpord_ss FORCE_INLINE __m128 _mm_cmpord_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpord_ps(a, b)); } // Compare packed single-precision (32-bit) floating-point elements in a and b // to see if either is NaN, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpunord_ps FORCE_INLINE __m128 _mm_cmpunord_ps(__m128 a, __m128 b) { uint32x4_t f32a = vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); uint32x4_t f32b = vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); return vreinterpretq_m128_u32(vmvnq_u32(vandq_u32(f32a, f32b))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b to see if either is NaN, store the result in the lower element of dst, and // copy the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpunord_ss FORCE_INLINE __m128 _mm_cmpunord_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_cmpunord_ps(a, b)); } // Compare the lower single-precision (32-bit) floating-point element in a and b // for equality, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comieq_ss FORCE_INLINE int _mm_comieq_ss(__m128 a, __m128 b) { uint32x4_t a_eq_b = vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); return vgetq_lane_u32(a_eq_b, 0) & 0x1; } // Compare the lower single-precision (32-bit) floating-point element in a and b // for greater-than-or-equal, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comige_ss FORCE_INLINE int _mm_comige_ss(__m128 a, __m128 b) { uint32x4_t a_ge_b = vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); return vgetq_lane_u32(a_ge_b, 0) & 0x1; } // Compare the lower single-precision (32-bit) floating-point element in a and b // for greater-than, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comigt_ss FORCE_INLINE int _mm_comigt_ss(__m128 a, __m128 b) { uint32x4_t a_gt_b = vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); return vgetq_lane_u32(a_gt_b, 0) & 0x1; } // Compare the lower single-precision (32-bit) floating-point element in a and b // for less-than-or-equal, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comile_ss FORCE_INLINE int _mm_comile_ss(__m128 a, __m128 b) { uint32x4_t a_le_b = vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); return vgetq_lane_u32(a_le_b, 0) & 0x1; } // Compare the lower single-precision (32-bit) floating-point element in a and b // for less-than, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comilt_ss FORCE_INLINE int _mm_comilt_ss(__m128 a, __m128 b) { uint32x4_t a_lt_b = vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); return vgetq_lane_u32(a_lt_b, 0) & 0x1; } // Compare the lower single-precision (32-bit) floating-point element in a and b // for not-equal, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comineq_ss FORCE_INLINE int _mm_comineq_ss(__m128 a, __m128 b) { return !_mm_comieq_ss(a, b); } // Convert packed signed 32-bit integers in b to packed single-precision // (32-bit) floating-point elements, store the results in the lower 2 elements // of dst, and copy the upper 2 packed elements from a to the upper elements of // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvt_pi2ps FORCE_INLINE __m128 _mm_cvt_pi2ps(__m128 a, __m64 b) { return vreinterpretq_m128_f32( vcombine_f32(vcvt_f32_s32(vreinterpret_s32_m64(b)), vget_high_f32(vreinterpretq_f32_m128(a)))); } // Convert packed single-precision (32-bit) floating-point elements in a to // packed 32-bit integers, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvt_ps2pi FORCE_INLINE __m64 _mm_cvt_ps2pi(__m128 a) { #if (defined(__aarch64__) || defined(_M_ARM64)) || \ defined(__ARM_FEATURE_DIRECTED_ROUNDING) return vreinterpret_m64_s32( vget_low_s32(vcvtnq_s32_f32(vrndiq_f32(vreinterpretq_f32_m128(a))))); #else return vreinterpret_m64_s32(vcvt_s32_f32(vget_low_f32( vreinterpretq_f32_m128(_mm_round_ps(a, _MM_FROUND_CUR_DIRECTION))))); #endif } // Convert the signed 32-bit integer b to a single-precision (32-bit) // floating-point element, store the result in the lower element of dst, and // copy the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvt_si2ss FORCE_INLINE __m128 _mm_cvt_si2ss(__m128 a, int b) { return vreinterpretq_m128_f32( vsetq_lane_f32((float) b, vreinterpretq_f32_m128(a), 0)); } // Convert the lower single-precision (32-bit) floating-point element in a to a // 32-bit integer, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvt_ss2si FORCE_INLINE int _mm_cvt_ss2si(__m128 a) { #if (defined(__aarch64__) || defined(_M_ARM64)) || \ defined(__ARM_FEATURE_DIRECTED_ROUNDING) return vgetq_lane_s32(vcvtnq_s32_f32(vrndiq_f32(vreinterpretq_f32_m128(a))), 0); #else float32_t data = vgetq_lane_f32( vreinterpretq_f32_m128(_mm_round_ps(a, _MM_FROUND_CUR_DIRECTION)), 0); return (int32_t) data; #endif } // Convert packed 16-bit integers in a to packed single-precision (32-bit) // floating-point elements, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi16_ps FORCE_INLINE __m128 _mm_cvtpi16_ps(__m64 a) { return vreinterpretq_m128_f32( vcvtq_f32_s32(vmovl_s16(vreinterpret_s16_m64(a)))); } // Convert packed 32-bit integers in b to packed single-precision (32-bit) // floating-point elements, store the results in the lower 2 elements of dst, // and copy the upper 2 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi32_ps FORCE_INLINE __m128 _mm_cvtpi32_ps(__m128 a, __m64 b) { return vreinterpretq_m128_f32( vcombine_f32(vcvt_f32_s32(vreinterpret_s32_m64(b)), vget_high_f32(vreinterpretq_f32_m128(a)))); } // Convert packed signed 32-bit integers in a to packed single-precision // (32-bit) floating-point elements, store the results in the lower 2 elements // of dst, then convert the packed signed 32-bit integers in b to // single-precision (32-bit) floating-point element, and store the results in // the upper 2 elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi32x2_ps FORCE_INLINE __m128 _mm_cvtpi32x2_ps(__m64 a, __m64 b) { return vreinterpretq_m128_f32(vcvtq_f32_s32( vcombine_s32(vreinterpret_s32_m64(a), vreinterpret_s32_m64(b)))); } // Convert the lower packed 8-bit integers in a to packed single-precision // (32-bit) floating-point elements, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi8_ps FORCE_INLINE __m128 _mm_cvtpi8_ps(__m64 a) { return vreinterpretq_m128_f32(vcvtq_f32_s32( vmovl_s16(vget_low_s16(vmovl_s8(vreinterpret_s8_m64(a)))))); } // Convert packed single-precision (32-bit) floating-point elements in a to // packed 16-bit integers, and store the results in dst. Note: this intrinsic // will generate 0x7FFF, rather than 0x8000, for input values between 0x7FFF and // 0x7FFFFFFF. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_pi16 FORCE_INLINE __m64 _mm_cvtps_pi16(__m128 a) { return vreinterpret_m64_s16( vqmovn_s32(vreinterpretq_s32_m128i(_mm_cvtps_epi32(a)))); } // Convert packed single-precision (32-bit) floating-point elements in a to // packed 32-bit integers, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_pi32 #define _mm_cvtps_pi32(a) _mm_cvt_ps2pi(a) // Convert packed single-precision (32-bit) floating-point elements in a to // packed 8-bit integers, and store the results in lower 4 elements of dst. // Note: this intrinsic will generate 0x7F, rather than 0x80, for input values // between 0x7F and 0x7FFFFFFF. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_pi8 FORCE_INLINE __m64 _mm_cvtps_pi8(__m128 a) { return vreinterpret_m64_s8(vqmovn_s16( vcombine_s16(vreinterpret_s16_m64(_mm_cvtps_pi16(a)), vdup_n_s16(0)))); } // Convert packed unsigned 16-bit integers in a to packed single-precision // (32-bit) floating-point elements, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpu16_ps FORCE_INLINE __m128 _mm_cvtpu16_ps(__m64 a) { return vreinterpretq_m128_f32( vcvtq_f32_u32(vmovl_u16(vreinterpret_u16_m64(a)))); } // Convert the lower packed unsigned 8-bit integers in a to packed // single-precision (32-bit) floating-point elements, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpu8_ps FORCE_INLINE __m128 _mm_cvtpu8_ps(__m64 a) { return vreinterpretq_m128_f32(vcvtq_f32_u32( vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_m64(a)))))); } // Convert the signed 32-bit integer b to a single-precision (32-bit) // floating-point element, store the result in the lower element of dst, and // copy the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi32_ss #define _mm_cvtsi32_ss(a, b) _mm_cvt_si2ss(a, b) // Convert the signed 64-bit integer b to a single-precision (32-bit) // floating-point element, store the result in the lower element of dst, and // copy the upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64_ss FORCE_INLINE __m128 _mm_cvtsi64_ss(__m128 a, int64_t b) { return vreinterpretq_m128_f32( vsetq_lane_f32((float) b, vreinterpretq_f32_m128(a), 0)); } // Copy the lower single-precision (32-bit) floating-point element of a to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtss_f32 FORCE_INLINE float _mm_cvtss_f32(__m128 a) { return vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); } // Convert the lower single-precision (32-bit) floating-point element in a to a // 32-bit integer, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtss_si32 #define _mm_cvtss_si32(a) _mm_cvt_ss2si(a) // Convert the lower single-precision (32-bit) floating-point element in a to a // 64-bit integer, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtss_si64 FORCE_INLINE int64_t _mm_cvtss_si64(__m128 a) { #if (defined(__aarch64__) || defined(_M_ARM64)) || \ defined(__ARM_FEATURE_DIRECTED_ROUNDING) return (int64_t) vgetq_lane_f32(vrndiq_f32(vreinterpretq_f32_m128(a)), 0); #else float32_t data = vgetq_lane_f32( vreinterpretq_f32_m128(_mm_round_ps(a, _MM_FROUND_CUR_DIRECTION)), 0); return (int64_t) data; #endif } // Convert packed single-precision (32-bit) floating-point elements in a to // packed 32-bit integers with truncation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtt_ps2pi FORCE_INLINE __m64 _mm_cvtt_ps2pi(__m128 a) { return vreinterpret_m64_s32( vget_low_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a)))); } // Convert the lower single-precision (32-bit) floating-point element in a to a // 32-bit integer with truncation, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtt_ss2si FORCE_INLINE int _mm_cvtt_ss2si(__m128 a) { return vgetq_lane_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a)), 0); } // Convert packed single-precision (32-bit) floating-point elements in a to // packed 32-bit integers with truncation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttps_pi32 #define _mm_cvttps_pi32(a) _mm_cvtt_ps2pi(a) // Convert the lower single-precision (32-bit) floating-point element in a to a // 32-bit integer with truncation, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttss_si32 #define _mm_cvttss_si32(a) _mm_cvtt_ss2si(a) // Convert the lower single-precision (32-bit) floating-point element in a to a // 64-bit integer with truncation, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttss_si64 FORCE_INLINE int64_t _mm_cvttss_si64(__m128 a) { return (int64_t) vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); } // Divide packed single-precision (32-bit) floating-point elements in a by // packed elements in b, and store the results in dst. // Due to ARMv7-A NEON's lack of a precise division intrinsic, we implement // division by multiplying a by b's reciprocal before using the Newton-Raphson // method to approximate the results. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_div_ps FORCE_INLINE __m128 _mm_div_ps(__m128 a, __m128 b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128_f32( vdivq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); #else float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(b)); recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(b))); // Additional Netwon-Raphson iteration for accuracy recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(b))); return vreinterpretq_m128_f32(vmulq_f32(vreinterpretq_f32_m128(a), recip)); #endif } // Divide the lower single-precision (32-bit) floating-point element in a by the // lower single-precision (32-bit) floating-point element in b, store the result // in the lower element of dst, and copy the upper 3 packed elements from a to // the upper elements of dst. // Warning: ARMv7-A does not produce the same result compared to Intel and not // IEEE-compliant. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_div_ss FORCE_INLINE __m128 _mm_div_ss(__m128 a, __m128 b) { float32_t value = vgetq_lane_f32(vreinterpretq_f32_m128(_mm_div_ps(a, b)), 0); return vreinterpretq_m128_f32( vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0)); } // Extract a 16-bit integer from a, selected with imm8, and store the result in // the lower element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_pi16 #define _mm_extract_pi16(a, imm) \ (int32_t) vget_lane_u16(vreinterpret_u16_m64(a), (imm)) // Free aligned memory that was allocated with _mm_malloc. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_free #if !defined(SSE2NEON_ALLOC_DEFINED) FORCE_INLINE void _mm_free(void *addr) { free(addr); } #endif FORCE_INLINE uint64_t _sse2neon_get_fpcr(void) { uint64_t value; #if defined(_MSC_VER) value = _ReadStatusReg(ARM64_FPCR); #else __asm__ __volatile__("mrs %0, FPCR" : "=r"(value)); /* read */ #endif return value; } FORCE_INLINE void _sse2neon_set_fpcr(uint64_t value) { #if defined(_MSC_VER) _WriteStatusReg(ARM64_FPCR, value); #else __asm__ __volatile__("msr FPCR, %0" ::"r"(value)); /* write */ #endif } // Macro: Get the flush zero bits from the MXCSR control and status register. // The flush zero may contain any of the following flags: _MM_FLUSH_ZERO_ON or // _MM_FLUSH_ZERO_OFF // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_MM_GET_FLUSH_ZERO_MODE FORCE_INLINE unsigned int _sse2neon_mm_get_flush_zero_mode(void) { union { fpcr_bitfield field; #if defined(__aarch64__) || defined(_M_ARM64) uint64_t value; #else uint32_t value; #endif } r; #if defined(__aarch64__) || defined(_M_ARM64) r.value = _sse2neon_get_fpcr(); #else __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ #endif return r.field.bit24 ? _MM_FLUSH_ZERO_ON : _MM_FLUSH_ZERO_OFF; } // Macro: Get the rounding mode bits from the MXCSR control and status register. // The rounding mode may contain any of the following flags: _MM_ROUND_NEAREST, // _MM_ROUND_DOWN, _MM_ROUND_UP, _MM_ROUND_TOWARD_ZERO // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_MM_GET_ROUNDING_MODE FORCE_INLINE unsigned int _MM_GET_ROUNDING_MODE(void) { union { fpcr_bitfield field; #if defined(__aarch64__) || defined(_M_ARM64) uint64_t value; #else uint32_t value; #endif } r; #if defined(__aarch64__) || defined(_M_ARM64) r.value = _sse2neon_get_fpcr(); #else __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ #endif if (r.field.bit22) { return r.field.bit23 ? _MM_ROUND_TOWARD_ZERO : _MM_ROUND_UP; } else { return r.field.bit23 ? _MM_ROUND_DOWN : _MM_ROUND_NEAREST; } } // Copy a to dst, and insert the 16-bit integer i into dst at the location // specified by imm8. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_pi16 #define _mm_insert_pi16(a, b, imm) \ vreinterpret_m64_s16(vset_lane_s16((b), vreinterpret_s16_m64(a), (imm))) // Load 128-bits (composed of 4 packed single-precision (32-bit) floating-point // elements) from memory into dst. mem_addr must be aligned on a 16-byte // boundary or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_ps FORCE_INLINE __m128 _mm_load_ps(const float *p) { return vreinterpretq_m128_f32(vld1q_f32(p)); } // Load a single-precision (32-bit) floating-point element from memory into all // elements of dst. // // dst[31:0] := MEM[mem_addr+31:mem_addr] // dst[63:32] := MEM[mem_addr+31:mem_addr] // dst[95:64] := MEM[mem_addr+31:mem_addr] // dst[127:96] := MEM[mem_addr+31:mem_addr] // // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_ps1 #define _mm_load_ps1 _mm_load1_ps // Load a single-precision (32-bit) floating-point element from memory into the // lower of dst, and zero the upper 3 elements. mem_addr does not need to be // aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_ss FORCE_INLINE __m128 _mm_load_ss(const float *p) { return vreinterpretq_m128_f32(vsetq_lane_f32(*p, vdupq_n_f32(0), 0)); } // Load a single-precision (32-bit) floating-point element from memory into all // elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load1_ps FORCE_INLINE __m128 _mm_load1_ps(const float *p) { return vreinterpretq_m128_f32(vld1q_dup_f32(p)); } // Load 2 single-precision (32-bit) floating-point elements from memory into the // upper 2 elements of dst, and copy the lower 2 elements from a to dst. // mem_addr does not need to be aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadh_pi FORCE_INLINE __m128 _mm_loadh_pi(__m128 a, __m64 const *p) { return vreinterpretq_m128_f32( vcombine_f32(vget_low_f32(a), vld1_f32((const float32_t *) p))); } // Load 2 single-precision (32-bit) floating-point elements from memory into the // lower 2 elements of dst, and copy the upper 2 elements from a to dst. // mem_addr does not need to be aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadl_pi FORCE_INLINE __m128 _mm_loadl_pi(__m128 a, __m64 const *p) { return vreinterpretq_m128_f32( vcombine_f32(vld1_f32((const float32_t *) p), vget_high_f32(a))); } // Load 4 single-precision (32-bit) floating-point elements from memory into dst // in reverse order. mem_addr must be aligned on a 16-byte boundary or a // general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadr_ps FORCE_INLINE __m128 _mm_loadr_ps(const float *p) { float32x4_t v = vrev64q_f32(vld1q_f32(p)); return vreinterpretq_m128_f32(vextq_f32(v, v, 2)); } // Load 128-bits (composed of 4 packed single-precision (32-bit) floating-point // elements) from memory into dst. mem_addr does not need to be aligned on any // particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_ps FORCE_INLINE __m128 _mm_loadu_ps(const float *p) { // for neon, alignment doesn't matter, so _mm_load_ps and _mm_loadu_ps are // equivalent for neon return vreinterpretq_m128_f32(vld1q_f32(p)); } // Load unaligned 16-bit integer from memory into the first element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si16 FORCE_INLINE __m128i _mm_loadu_si16(const void *p) { return vreinterpretq_m128i_s16( vsetq_lane_s16(*(const unaligned_int16_t *) p, vdupq_n_s16(0), 0)); } // Load unaligned 64-bit integer from memory into the first element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si64 FORCE_INLINE __m128i _mm_loadu_si64(const void *p) { return vreinterpretq_m128i_s64( vsetq_lane_s64(*(const unaligned_int64_t *) p, vdupq_n_s64(0), 0)); } // Allocate size bytes of memory, aligned to the alignment specified in align, // and return a pointer to the allocated memory. _mm_free should be used to free // memory that is allocated with _mm_malloc. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_malloc #if !defined(SSE2NEON_ALLOC_DEFINED) FORCE_INLINE void *_mm_malloc(size_t size, size_t align) { void *ptr; if (align == 1) return malloc(size); if (align == 2 || (sizeof(void *) == 8 && align == 4)) align = sizeof(void *); if (!posix_memalign(&ptr, align, size)) return ptr; return NULL; } #endif // Conditionally store 8-bit integer elements from a into memory using mask // (elements are not stored when the highest bit is not set in the corresponding // element) and a non-temporal memory hint. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_maskmove_si64 FORCE_INLINE void _mm_maskmove_si64(__m64 a, __m64 mask, char *mem_addr) { int8x8_t shr_mask = vshr_n_s8(vreinterpret_s8_m64(mask), 7); __m128 b = _mm_load_ps((const float *) mem_addr); int8x8_t masked = vbsl_s8(vreinterpret_u8_s8(shr_mask), vreinterpret_s8_m64(a), vreinterpret_s8_u64(vget_low_u64(vreinterpretq_u64_m128(b)))); vst1_s8((int8_t *) mem_addr, masked); } // Conditionally store 8-bit integer elements from a into memory using mask // (elements are not stored when the highest bit is not set in the corresponding // element) and a non-temporal memory hint. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_maskmovq #define _m_maskmovq(a, mask, mem_addr) _mm_maskmove_si64(a, mask, mem_addr) // Compare packed signed 16-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_pi16 FORCE_INLINE __m64 _mm_max_pi16(__m64 a, __m64 b) { return vreinterpret_m64_s16( vmax_s16(vreinterpret_s16_m64(a), vreinterpret_s16_m64(b))); } // Compare packed single-precision (32-bit) floating-point elements in a and b, // and store packed maximum values in dst. dst does not follow the IEEE Standard // for Floating-Point Arithmetic (IEEE 754) maximum value when inputs are NaN or // signed-zero values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_ps FORCE_INLINE __m128 _mm_max_ps(__m128 a, __m128 b) { #if SSE2NEON_PRECISE_MINMAX float32x4_t _a = vreinterpretq_f32_m128(a); float32x4_t _b = vreinterpretq_f32_m128(b); return vreinterpretq_m128_f32(vbslq_f32(vcgtq_f32(_a, _b), _a, _b)); #else return vreinterpretq_m128_f32( vmaxq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); #endif } // Compare packed unsigned 8-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_pu8 FORCE_INLINE __m64 _mm_max_pu8(__m64 a, __m64 b) { return vreinterpret_m64_u8( vmax_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b, store the maximum value in the lower element of dst, and copy the upper 3 // packed elements from a to the upper element of dst. dst does not follow the // IEEE Standard for Floating-Point Arithmetic (IEEE 754) maximum value when // inputs are NaN or signed-zero values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_ss FORCE_INLINE __m128 _mm_max_ss(__m128 a, __m128 b) { float32_t value = vgetq_lane_f32(_mm_max_ps(a, b), 0); return vreinterpretq_m128_f32( vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0)); } // Compare packed signed 16-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_pi16 FORCE_INLINE __m64 _mm_min_pi16(__m64 a, __m64 b) { return vreinterpret_m64_s16( vmin_s16(vreinterpret_s16_m64(a), vreinterpret_s16_m64(b))); } // Compare packed single-precision (32-bit) floating-point elements in a and b, // and store packed minimum values in dst. dst does not follow the IEEE Standard // for Floating-Point Arithmetic (IEEE 754) minimum value when inputs are NaN or // signed-zero values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_ps FORCE_INLINE __m128 _mm_min_ps(__m128 a, __m128 b) { #if SSE2NEON_PRECISE_MINMAX float32x4_t _a = vreinterpretq_f32_m128(a); float32x4_t _b = vreinterpretq_f32_m128(b); return vreinterpretq_m128_f32(vbslq_f32(vcltq_f32(_a, _b), _a, _b)); #else return vreinterpretq_m128_f32( vminq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); #endif } // Compare packed unsigned 8-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_pu8 FORCE_INLINE __m64 _mm_min_pu8(__m64 a, __m64 b) { return vreinterpret_m64_u8( vmin_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b))); } // Compare the lower single-precision (32-bit) floating-point elements in a and // b, store the minimum value in the lower element of dst, and copy the upper 3 // packed elements from a to the upper element of dst. dst does not follow the // IEEE Standard for Floating-Point Arithmetic (IEEE 754) minimum value when // inputs are NaN or signed-zero values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_ss FORCE_INLINE __m128 _mm_min_ss(__m128 a, __m128 b) { float32_t value = vgetq_lane_f32(_mm_min_ps(a, b), 0); return vreinterpretq_m128_f32( vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0)); } // Move the lower single-precision (32-bit) floating-point element from b to the // lower element of dst, and copy the upper 3 packed elements from a to the // upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_move_ss FORCE_INLINE __m128 _mm_move_ss(__m128 a, __m128 b) { return vreinterpretq_m128_f32( vsetq_lane_f32(vgetq_lane_f32(vreinterpretq_f32_m128(b), 0), vreinterpretq_f32_m128(a), 0)); } // Move the upper 2 single-precision (32-bit) floating-point elements from b to // the lower 2 elements of dst, and copy the upper 2 elements from a to the // upper 2 elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movehl_ps FORCE_INLINE __m128 _mm_movehl_ps(__m128 a, __m128 b) { #if defined(aarch64__) return vreinterpretq_m128_u64( vzip2q_u64(vreinterpretq_u64_m128(b), vreinterpretq_u64_m128(a))); #else float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); return vreinterpretq_m128_f32(vcombine_f32(b32, a32)); #endif } // Move the lower 2 single-precision (32-bit) floating-point elements from b to // the upper 2 elements of dst, and copy the lower 2 elements from a to the // lower 2 elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movelh_ps FORCE_INLINE __m128 _mm_movelh_ps(__m128 __A, __m128 __B) { float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(__A)); float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(__B)); return vreinterpretq_m128_f32(vcombine_f32(a10, b10)); } // Create mask from the most significant bit of each 8-bit element in a, and // store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movemask_pi8 FORCE_INLINE int _mm_movemask_pi8(__m64 a) { uint8x8_t input = vreinterpret_u8_m64(a); #if defined(__aarch64__) || defined(_M_ARM64) static const int8_t shift[8] = {0, 1, 2, 3, 4, 5, 6, 7}; uint8x8_t tmp = vshr_n_u8(input, 7); return vaddv_u8(vshl_u8(tmp, vld1_s8(shift))); #else // Refer the implementation of `_mm_movemask_epi8` uint16x4_t high_bits = vreinterpret_u16_u8(vshr_n_u8(input, 7)); uint32x2_t paired16 = vreinterpret_u32_u16(vsra_n_u16(high_bits, high_bits, 7)); uint8x8_t paired32 = vreinterpret_u8_u32(vsra_n_u32(paired16, paired16, 14)); return vget_lane_u8(paired32, 0) | ((int) vget_lane_u8(paired32, 4) << 4); #endif } // Set each bit of mask dst based on the most significant bit of the // corresponding packed single-precision (32-bit) floating-point element in a. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movemask_ps FORCE_INLINE int _mm_movemask_ps(__m128 a) { uint32x4_t input = vreinterpretq_u32_m128(a); #if defined(__aarch64__) || defined(_M_ARM64) static const int32_t shift[4] = {0, 1, 2, 3}; uint32x4_t tmp = vshrq_n_u32(input, 31); return vaddvq_u32(vshlq_u32(tmp, vld1q_s32(shift))); #else // Uses the exact same method as _mm_movemask_epi8, see that for details. // Shift out everything but the sign bits with a 32-bit unsigned shift // right. uint64x2_t high_bits = vreinterpretq_u64_u32(vshrq_n_u32(input, 31)); // Merge the two pairs together with a 64-bit unsigned shift right + add. uint8x16_t paired = vreinterpretq_u8_u64(vsraq_n_u64(high_bits, high_bits, 31)); // Extract the result. return vgetq_lane_u8(paired, 0) | (vgetq_lane_u8(paired, 8) << 2); #endif } // Multiply packed single-precision (32-bit) floating-point elements in a and b, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_ps FORCE_INLINE __m128 _mm_mul_ps(__m128 a, __m128 b) { return vreinterpretq_m128_f32( vmulq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); } // Multiply the lower single-precision (32-bit) floating-point element in a and // b, store the result in the lower element of dst, and copy the upper 3 packed // elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_ss FORCE_INLINE __m128 _mm_mul_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_mul_ps(a, b)); } // Multiply the packed unsigned 16-bit integers in a and b, producing // intermediate 32-bit integers, and store the high 16 bits of the intermediate // integers in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhi_pu16 FORCE_INLINE __m64 _mm_mulhi_pu16(__m64 a, __m64 b) { return vreinterpret_m64_u16(vshrn_n_u32( vmull_u16(vreinterpret_u16_m64(a), vreinterpret_u16_m64(b)), 16)); } // Compute the bitwise OR of packed single-precision (32-bit) floating-point // elements in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_or_ps FORCE_INLINE __m128 _mm_or_ps(__m128 a, __m128 b) { return vreinterpretq_m128_s32( vorrq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); } // Average packed unsigned 8-bit integers in a and b, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pavgb #define _m_pavgb(a, b) _mm_avg_pu8(a, b) // Average packed unsigned 16-bit integers in a and b, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pavgw #define _m_pavgw(a, b) _mm_avg_pu16(a, b) // Extract a 16-bit integer from a, selected with imm8, and store the result in // the lower element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pextrw #define _m_pextrw(a, imm) _mm_extract_pi16(a, imm) // Copy a to dst, and insert the 16-bit integer i into dst at the location // specified by imm8. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=m_pinsrw #define _m_pinsrw(a, i, imm) _mm_insert_pi16(a, i, imm) // Compare packed signed 16-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pmaxsw #define _m_pmaxsw(a, b) _mm_max_pi16(a, b) // Compare packed unsigned 8-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pmaxub #define _m_pmaxub(a, b) _mm_max_pu8(a, b) // Compare packed signed 16-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pminsw #define _m_pminsw(a, b) _mm_min_pi16(a, b) // Compare packed unsigned 8-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pminub #define _m_pminub(a, b) _mm_min_pu8(a, b) // Create mask from the most significant bit of each 8-bit element in a, and // store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pmovmskb #define _m_pmovmskb(a) _mm_movemask_pi8(a) // Multiply the packed unsigned 16-bit integers in a and b, producing // intermediate 32-bit integers, and store the high 16 bits of the intermediate // integers in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pmulhuw #define _m_pmulhuw(a, b) _mm_mulhi_pu16(a, b) // Fetch the line of data from memory that contains address p to a location in // the cache hierarchy specified by the locality hint i. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_prefetch FORCE_INLINE void _mm_prefetch(char const *p, int i) { (void) i; #if defined(_MSC_VER) switch (i) { case _MM_HINT_NTA: __prefetch2(p, 1); break; case _MM_HINT_T0: __prefetch2(p, 0); break; case _MM_HINT_T1: __prefetch2(p, 2); break; case _MM_HINT_T2: __prefetch2(p, 4); break; } #else switch (i) { case _MM_HINT_NTA: __builtin_prefetch(p, 0, 0); break; case _MM_HINT_T0: __builtin_prefetch(p, 0, 3); break; case _MM_HINT_T1: __builtin_prefetch(p, 0, 2); break; case _MM_HINT_T2: __builtin_prefetch(p, 0, 1); break; } #endif } // Compute the absolute differences of packed unsigned 8-bit integers in a and // b, then horizontally sum each consecutive 8 differences to produce four // unsigned 16-bit integers, and pack these unsigned 16-bit integers in the low // 16 bits of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=m_psadbw #define _m_psadbw(a, b) _mm_sad_pu8(a, b) // Shuffle 16-bit integers in a using the control in imm8, and store the results // in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pshufw #define _m_pshufw(a, imm) _mm_shuffle_pi16(a, imm) // Compute the approximate reciprocal of packed single-precision (32-bit) // floating-point elements in a, and store the results in dst. The maximum // relative error for this approximation is less than 1.5*2^-12. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_rcp_ps FORCE_INLINE __m128 _mm_rcp_ps(__m128 in) { float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(in)); recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in))); #if SSE2NEON_PRECISE_DIV // Additional Netwon-Raphson iteration for accuracy recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in))); #endif return vreinterpretq_m128_f32(recip); } // Compute the approximate reciprocal of the lower single-precision (32-bit) // floating-point element in a, store the result in the lower element of dst, // and copy the upper 3 packed elements from a to the upper elements of dst. The // maximum relative error for this approximation is less than 1.5*2^-12. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_rcp_ss FORCE_INLINE __m128 _mm_rcp_ss(__m128 a) { return _mm_move_ss(a, _mm_rcp_ps(a)); } // Compute the approximate reciprocal square root of packed single-precision // (32-bit) floating-point elements in a, and store the results in dst. The // maximum relative error for this approximation is less than 1.5*2^-12. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_rsqrt_ps FORCE_INLINE __m128 _mm_rsqrt_ps(__m128 in) { float32x4_t out = vrsqrteq_f32(vreinterpretq_f32_m128(in)); // Generate masks for detecting whether input has any 0.0f/-0.0f // (which becomes positive/negative infinity by IEEE-754 arithmetic rules). const uint32x4_t pos_inf = vdupq_n_u32(0x7F800000); const uint32x4_t neg_inf = vdupq_n_u32(0xFF800000); const uint32x4_t has_pos_zero = vceqq_u32(pos_inf, vreinterpretq_u32_f32(out)); const uint32x4_t has_neg_zero = vceqq_u32(neg_inf, vreinterpretq_u32_f32(out)); out = vmulq_f32( out, vrsqrtsq_f32(vmulq_f32(vreinterpretq_f32_m128(in), out), out)); #if SSE2NEON_PRECISE_SQRT // Additional Netwon-Raphson iteration for accuracy out = vmulq_f32( out, vrsqrtsq_f32(vmulq_f32(vreinterpretq_f32_m128(in), out), out)); #endif // Set output vector element to infinity/negative-infinity if // the corresponding input vector element is 0.0f/-0.0f. out = vbslq_f32(has_pos_zero, (float32x4_t) pos_inf, out); out = vbslq_f32(has_neg_zero, (float32x4_t) neg_inf, out); return vreinterpretq_m128_f32(out); } // Compute the approximate reciprocal square root of the lower single-precision // (32-bit) floating-point element in a, store the result in the lower element // of dst, and copy the upper 3 packed elements from a to the upper elements of // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_rsqrt_ss FORCE_INLINE __m128 _mm_rsqrt_ss(__m128 in) { return vsetq_lane_f32(vgetq_lane_f32(_mm_rsqrt_ps(in), 0), in, 0); } // Compute the absolute differences of packed unsigned 8-bit integers in a and // b, then horizontally sum each consecutive 8 differences to produce four // unsigned 16-bit integers, and pack these unsigned 16-bit integers in the low // 16 bits of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sad_pu8 FORCE_INLINE __m64 _mm_sad_pu8(__m64 a, __m64 b) { uint64x1_t t = vpaddl_u32(vpaddl_u16( vpaddl_u8(vabd_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b))))); return vreinterpret_m64_u16( vset_lane_u16((int) vget_lane_u64(t, 0), vdup_n_u16(0), 0)); } // Macro: Set the flush zero bits of the MXCSR control and status register to // the value in unsigned 32-bit integer a. The flush zero may contain any of the // following flags: _MM_FLUSH_ZERO_ON or _MM_FLUSH_ZERO_OFF // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_MM_SET_FLUSH_ZERO_MODE FORCE_INLINE void _sse2neon_mm_set_flush_zero_mode(unsigned int flag) { // AArch32 Advanced SIMD arithmetic always uses the Flush-to-zero setting, // regardless of the value of the FZ bit. union { fpcr_bitfield field; #if defined(__aarch64__) || defined(_M_ARM64) uint64_t value; #else uint32_t value; #endif } r; #if defined(__aarch64__) || defined(_M_ARM64) r.value = _sse2neon_get_fpcr(); #else __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ #endif r.field.bit24 = (flag & _MM_FLUSH_ZERO_MASK) == _MM_FLUSH_ZERO_ON; #if defined(__aarch64__) || defined(_M_ARM64) _sse2neon_set_fpcr(r.value); #else __asm__ __volatile__("vmsr FPSCR, %0" ::"r"(r)); /* write */ #endif } // Set packed single-precision (32-bit) floating-point elements in dst with the // supplied values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_ps FORCE_INLINE __m128 _mm_set_ps(float w, float z, float y, float x) { float ALIGN_STRUCT(16) data[4] = {x, y, z, w}; return vreinterpretq_m128_f32(vld1q_f32(data)); } // Broadcast single-precision (32-bit) floating-point value a to all elements of // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_ps1 FORCE_INLINE __m128 _mm_set_ps1(float _w) { return vreinterpretq_m128_f32(vdupq_n_f32(_w)); } // Macro: Set the rounding mode bits of the MXCSR control and status register to // the value in unsigned 32-bit integer a. The rounding mode may contain any of // the following flags: _MM_ROUND_NEAREST, _MM_ROUND_DOWN, _MM_ROUND_UP, // _MM_ROUND_TOWARD_ZERO // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_MM_SET_ROUNDING_MODE FORCE_INLINE void _MM_SET_ROUNDING_MODE(int rounding) { union { fpcr_bitfield field; #if defined(__aarch64__) || defined(_M_ARM64) uint64_t value; #else uint32_t value; #endif } r; #if defined(__aarch64__) || defined(_M_ARM64) r.value = _sse2neon_get_fpcr(); #else __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ #endif switch (rounding) { case _MM_ROUND_TOWARD_ZERO: r.field.bit22 = 1; r.field.bit23 = 1; break; case _MM_ROUND_DOWN: r.field.bit22 = 0; r.field.bit23 = 1; break; case _MM_ROUND_UP: r.field.bit22 = 1; r.field.bit23 = 0; break; default: //_MM_ROUND_NEAREST r.field.bit22 = 0; r.field.bit23 = 0; } #if defined(__aarch64__) || defined(_M_ARM64) _sse2neon_set_fpcr(r.value); #else __asm__ __volatile__("vmsr FPSCR, %0" ::"r"(r)); /* write */ #endif } // Copy single-precision (32-bit) floating-point element a to the lower element // of dst, and zero the upper 3 elements. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_ss FORCE_INLINE __m128 _mm_set_ss(float a) { return vreinterpretq_m128_f32(vsetq_lane_f32(a, vdupq_n_f32(0), 0)); } // Broadcast single-precision (32-bit) floating-point value a to all elements of // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_ps FORCE_INLINE __m128 _mm_set1_ps(float _w) { return vreinterpretq_m128_f32(vdupq_n_f32(_w)); } // Set the MXCSR control and status register with the value in unsigned 32-bit // integer a. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setcsr // FIXME: _mm_setcsr() implementation supports changing the rounding mode only. FORCE_INLINE void _mm_setcsr(unsigned int a) { _MM_SET_ROUNDING_MODE(a); } // Get the unsigned 32-bit value of the MXCSR control and status register. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_getcsr // FIXME: _mm_getcsr() implementation supports reading the rounding mode only. FORCE_INLINE unsigned int _mm_getcsr(void) { return _MM_GET_ROUNDING_MODE(); } // Set packed single-precision (32-bit) floating-point elements in dst with the // supplied values in reverse order. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_ps FORCE_INLINE __m128 _mm_setr_ps(float w, float z, float y, float x) { float ALIGN_STRUCT(16) data[4] = {w, z, y, x}; return vreinterpretq_m128_f32(vld1q_f32(data)); } // Return vector of type __m128 with all elements set to zero. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setzero_ps FORCE_INLINE __m128 _mm_setzero_ps(void) { return vreinterpretq_m128_f32(vdupq_n_f32(0)); } // Shuffle 16-bit integers in a using the control in imm8, and store the results // in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_pi16 #ifdef _sse2neon_shuffle #define _mm_shuffle_pi16(a, imm) \ vreinterpret_m64_s16(vshuffle_s16( \ vreinterpret_s16_m64(a), vreinterpret_s16_m64(a), (imm & 0x3), \ ((imm >> 2) & 0x3), ((imm >> 4) & 0x3), ((imm >> 6) & 0x3))) #else #define _mm_shuffle_pi16(a, imm) \ _sse2neon_define1( \ __m64, a, int16x4_t ret; \ ret = vmov_n_s16( \ vget_lane_s16(vreinterpret_s16_m64(_a), (imm) & (0x3))); \ ret = vset_lane_s16( \ vget_lane_s16(vreinterpret_s16_m64(_a), ((imm) >> 2) & 0x3), ret, \ 1); \ ret = vset_lane_s16( \ vget_lane_s16(vreinterpret_s16_m64(_a), ((imm) >> 4) & 0x3), ret, \ 2); \ ret = vset_lane_s16( \ vget_lane_s16(vreinterpret_s16_m64(_a), ((imm) >> 6) & 0x3), ret, \ 3); \ _sse2neon_return(vreinterpret_m64_s16(ret));) #endif // Perform a serializing operation on all store-to-memory instructions that were // issued prior to this instruction. Guarantees that every store instruction // that precedes, in program order, is globally visible before any store // instruction which follows the fence in program order. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sfence FORCE_INLINE void _mm_sfence(void) { _sse2neon_smp_mb(); } // Perform a serializing operation on all load-from-memory and store-to-memory // instructions that were issued prior to this instruction. Guarantees that // every memory access that precedes, in program order, the memory fence // instruction is globally visible before any memory instruction which follows // the fence in program order. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mfence FORCE_INLINE void _mm_mfence(void) { _sse2neon_smp_mb(); } // Perform a serializing operation on all load-from-memory instructions that // were issued prior to this instruction. Guarantees that every load instruction // that precedes, in program order, is globally visible before any load // instruction which follows the fence in program order. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_lfence FORCE_INLINE void _mm_lfence(void) { _sse2neon_smp_mb(); } // FORCE_INLINE __m128 _mm_shuffle_ps(__m128 a, __m128 b, __constrange(0,255) // int imm) #ifdef _sse2neon_shuffle #define _mm_shuffle_ps(a, b, imm) \ __extension__({ \ float32x4_t _input1 = vreinterpretq_f32_m128(a); \ float32x4_t _input2 = vreinterpretq_f32_m128(b); \ float32x4_t _shuf = \ vshuffleq_s32(_input1, _input2, (imm) & (0x3), ((imm) >> 2) & 0x3, \ (((imm) >> 4) & 0x3) + 4, (((imm) >> 6) & 0x3) + 4); \ vreinterpretq_m128_f32(_shuf); \ }) #else // generic #define _mm_shuffle_ps(a, b, imm) \ _sse2neon_define2( \ __m128, a, b, __m128 ret; switch (imm) { \ case _MM_SHUFFLE(1, 0, 3, 2): \ ret = _mm_shuffle_ps_1032(_a, _b); \ break; \ case _MM_SHUFFLE(2, 3, 0, 1): \ ret = _mm_shuffle_ps_2301(_a, _b); \ break; \ case _MM_SHUFFLE(0, 3, 2, 1): \ ret = _mm_shuffle_ps_0321(_a, _b); \ break; \ case _MM_SHUFFLE(2, 1, 0, 3): \ ret = _mm_shuffle_ps_2103(_a, _b); \ break; \ case _MM_SHUFFLE(1, 0, 1, 0): \ ret = _mm_movelh_ps(_a, _b); \ break; \ case _MM_SHUFFLE(1, 0, 0, 1): \ ret = _mm_shuffle_ps_1001(_a, _b); \ break; \ case _MM_SHUFFLE(0, 1, 0, 1): \ ret = _mm_shuffle_ps_0101(_a, _b); \ break; \ case _MM_SHUFFLE(3, 2, 1, 0): \ ret = _mm_shuffle_ps_3210(_a, _b); \ break; \ case _MM_SHUFFLE(0, 0, 1, 1): \ ret = _mm_shuffle_ps_0011(_a, _b); \ break; \ case _MM_SHUFFLE(0, 0, 2, 2): \ ret = _mm_shuffle_ps_0022(_a, _b); \ break; \ case _MM_SHUFFLE(2, 2, 0, 0): \ ret = _mm_shuffle_ps_2200(_a, _b); \ break; \ case _MM_SHUFFLE(3, 2, 0, 2): \ ret = _mm_shuffle_ps_3202(_a, _b); \ break; \ case _MM_SHUFFLE(3, 2, 3, 2): \ ret = _mm_movehl_ps(_b, _a); \ break; \ case _MM_SHUFFLE(1, 1, 3, 3): \ ret = _mm_shuffle_ps_1133(_a, _b); \ break; \ case _MM_SHUFFLE(2, 0, 1, 0): \ ret = _mm_shuffle_ps_2010(_a, _b); \ break; \ case _MM_SHUFFLE(2, 0, 0, 1): \ ret = _mm_shuffle_ps_2001(_a, _b); \ break; \ case _MM_SHUFFLE(2, 0, 3, 2): \ ret = _mm_shuffle_ps_2032(_a, _b); \ break; \ default: \ ret = _mm_shuffle_ps_default(_a, _b, (imm)); \ break; \ } _sse2neon_return(ret);) #endif // Compute the square root of packed single-precision (32-bit) floating-point // elements in a, and store the results in dst. // Due to ARMv7-A NEON's lack of a precise square root intrinsic, we implement // square root by multiplying input in with its reciprocal square root before // using the Newton-Raphson method to approximate the results. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sqrt_ps FORCE_INLINE __m128 _mm_sqrt_ps(__m128 in) { #if (defined(__aarch64__) || defined(_M_ARM64)) && !SSE2NEON_PRECISE_SQRT return vreinterpretq_m128_f32(vsqrtq_f32(vreinterpretq_f32_m128(in))); #else float32x4_t recip = vrsqrteq_f32(vreinterpretq_f32_m128(in)); // Test for vrsqrteq_f32(0) -> positive infinity case. // Change to zero, so that s * 1/sqrt(s) result is zero too. const uint32x4_t pos_inf = vdupq_n_u32(0x7F800000); const uint32x4_t div_by_zero = vceqq_u32(pos_inf, vreinterpretq_u32_f32(recip)); recip = vreinterpretq_f32_u32( vandq_u32(vmvnq_u32(div_by_zero), vreinterpretq_u32_f32(recip))); recip = vmulq_f32( vrsqrtsq_f32(vmulq_f32(recip, recip), vreinterpretq_f32_m128(in)), recip); // Additional Netwon-Raphson iteration for accuracy recip = vmulq_f32( vrsqrtsq_f32(vmulq_f32(recip, recip), vreinterpretq_f32_m128(in)), recip); // sqrt(s) = s * 1/sqrt(s) return vreinterpretq_m128_f32(vmulq_f32(vreinterpretq_f32_m128(in), recip)); #endif } // Compute the square root of the lower single-precision (32-bit) floating-point // element in a, store the result in the lower element of dst, and copy the // upper 3 packed elements from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sqrt_ss FORCE_INLINE __m128 _mm_sqrt_ss(__m128 in) { float32_t value = vgetq_lane_f32(vreinterpretq_f32_m128(_mm_sqrt_ps(in)), 0); return vreinterpretq_m128_f32( vsetq_lane_f32(value, vreinterpretq_f32_m128(in), 0)); } // Store 128-bits (composed of 4 packed single-precision (32-bit) floating-point // elements) from a into memory. mem_addr must be aligned on a 16-byte boundary // or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_ps FORCE_INLINE void _mm_store_ps(float *p, __m128 a) { vst1q_f32(p, vreinterpretq_f32_m128(a)); } // Store the lower single-precision (32-bit) floating-point element from a into // 4 contiguous elements in memory. mem_addr must be aligned on a 16-byte // boundary or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_ps1 FORCE_INLINE void _mm_store_ps1(float *p, __m128 a) { float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); vst1q_f32(p, vdupq_n_f32(a0)); } // Store the lower single-precision (32-bit) floating-point element from a into // memory. mem_addr does not need to be aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_ss FORCE_INLINE void _mm_store_ss(float *p, __m128 a) { vst1q_lane_f32(p, vreinterpretq_f32_m128(a), 0); } // Store the lower single-precision (32-bit) floating-point element from a into // 4 contiguous elements in memory. mem_addr must be aligned on a 16-byte // boundary or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store1_ps #define _mm_store1_ps _mm_store_ps1 // Store the upper 2 single-precision (32-bit) floating-point elements from a // into memory. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeh_pi FORCE_INLINE void _mm_storeh_pi(__m64 *p, __m128 a) { *p = vreinterpret_m64_f32(vget_high_f32(a)); } // Store the lower 2 single-precision (32-bit) floating-point elements from a // into memory. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storel_pi FORCE_INLINE void _mm_storel_pi(__m64 *p, __m128 a) { *p = vreinterpret_m64_f32(vget_low_f32(a)); } // Store 4 single-precision (32-bit) floating-point elements from a into memory // in reverse order. mem_addr must be aligned on a 16-byte boundary or a // general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storer_ps FORCE_INLINE void _mm_storer_ps(float *p, __m128 a) { float32x4_t tmp = vrev64q_f32(vreinterpretq_f32_m128(a)); float32x4_t rev = vextq_f32(tmp, tmp, 2); vst1q_f32(p, rev); } // Store 128-bits (composed of 4 packed single-precision (32-bit) floating-point // elements) from a into memory. mem_addr does not need to be aligned on any // particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_ps FORCE_INLINE void _mm_storeu_ps(float *p, __m128 a) { vst1q_f32(p, vreinterpretq_f32_m128(a)); } // Stores 16-bits of integer data a at the address p. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si16 FORCE_INLINE void _mm_storeu_si16(void *p, __m128i a) { vst1q_lane_s16((int16_t *) p, vreinterpretq_s16_m128i(a), 0); } // Stores 64-bits of integer data a at the address p. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si64 FORCE_INLINE void _mm_storeu_si64(void *p, __m128i a) { vst1q_lane_s64((int64_t *) p, vreinterpretq_s64_m128i(a), 0); } // Store 64-bits of integer data from a into memory using a non-temporal memory // hint. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_pi FORCE_INLINE void _mm_stream_pi(__m64 *p, __m64 a) { vst1_s64((int64_t *) p, vreinterpret_s64_m64(a)); } // Store 128-bits (composed of 4 packed single-precision (32-bit) floating- // point elements) from a into memory using a non-temporal memory hint. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_ps FORCE_INLINE void _mm_stream_ps(float *p, __m128 a) { #if __has_builtin(__builtin_nontemporal_store) __builtin_nontemporal_store(a, (float32x4_t *) p); #else vst1q_f32(p, vreinterpretq_f32_m128(a)); #endif } // Subtract packed single-precision (32-bit) floating-point elements in b from // packed single-precision (32-bit) floating-point elements in a, and store the // results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_ps FORCE_INLINE __m128 _mm_sub_ps(__m128 a, __m128 b) { return vreinterpretq_m128_f32( vsubq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); } // Subtract the lower single-precision (32-bit) floating-point element in b from // the lower single-precision (32-bit) floating-point element in a, store the // result in the lower element of dst, and copy the upper 3 packed elements from // a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_ss FORCE_INLINE __m128 _mm_sub_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_sub_ps(a, b)); } // Macro: Transpose the 4x4 matrix formed by the 4 rows of single-precision // (32-bit) floating-point elements in row0, row1, row2, and row3, and store the // transposed matrix in these vectors (row0 now contains column 0, etc.). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=MM_TRANSPOSE4_PS #define _MM_TRANSPOSE4_PS(row0, row1, row2, row3) \ do { \ float32x4x2_t ROW01 = vtrnq_f32(row0, row1); \ float32x4x2_t ROW23 = vtrnq_f32(row2, row3); \ row0 = vcombine_f32(vget_low_f32(ROW01.val[0]), \ vget_low_f32(ROW23.val[0])); \ row1 = vcombine_f32(vget_low_f32(ROW01.val[1]), \ vget_low_f32(ROW23.val[1])); \ row2 = vcombine_f32(vget_high_f32(ROW01.val[0]), \ vget_high_f32(ROW23.val[0])); \ row3 = vcombine_f32(vget_high_f32(ROW01.val[1]), \ vget_high_f32(ROW23.val[1])); \ } while (0) // according to the documentation, these intrinsics behave the same as the // non-'u' versions. We'll just alias them here. #define _mm_ucomieq_ss _mm_comieq_ss #define _mm_ucomige_ss _mm_comige_ss #define _mm_ucomigt_ss _mm_comigt_ss #define _mm_ucomile_ss _mm_comile_ss #define _mm_ucomilt_ss _mm_comilt_ss #define _mm_ucomineq_ss _mm_comineq_ss // Return vector of type __m128i with undefined elements. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_undefined_si128 FORCE_INLINE __m128i _mm_undefined_si128(void) { #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wuninitialized" #endif __m128i a; #if defined(_MSC_VER) a = _mm_setzero_si128(); #endif return a; #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif } // Return vector of type __m128 with undefined elements. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_undefined_ps FORCE_INLINE __m128 _mm_undefined_ps(void) { #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wuninitialized" #endif __m128 a; #if defined(_MSC_VER) a = _mm_setzero_ps(); #endif return a; #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif } // Unpack and interleave single-precision (32-bit) floating-point elements from // the high half a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_ps FORCE_INLINE __m128 _mm_unpackhi_ps(__m128 a, __m128 b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128_f32( vzip2q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); #else float32x2_t a1 = vget_high_f32(vreinterpretq_f32_m128(a)); float32x2_t b1 = vget_high_f32(vreinterpretq_f32_m128(b)); float32x2x2_t result = vzip_f32(a1, b1); return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1])); #endif } // Unpack and interleave single-precision (32-bit) floating-point elements from // the low half of a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_ps FORCE_INLINE __m128 _mm_unpacklo_ps(__m128 a, __m128 b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128_f32( vzip1q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); #else float32x2_t a1 = vget_low_f32(vreinterpretq_f32_m128(a)); float32x2_t b1 = vget_low_f32(vreinterpretq_f32_m128(b)); float32x2x2_t result = vzip_f32(a1, b1); return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1])); #endif } // Compute the bitwise XOR of packed single-precision (32-bit) floating-point // elements in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_xor_ps FORCE_INLINE __m128 _mm_xor_ps(__m128 a, __m128 b) { return vreinterpretq_m128_s32( veorq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); } /* SSE2 */ // Add packed 16-bit integers in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_epi16 FORCE_INLINE __m128i _mm_add_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_s16( vaddq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Add packed 32-bit integers in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_epi32 FORCE_INLINE __m128i _mm_add_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_s32( vaddq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Add packed 64-bit integers in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_epi64 FORCE_INLINE __m128i _mm_add_epi64(__m128i a, __m128i b) { return vreinterpretq_m128i_s64( vaddq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); } // Add packed 8-bit integers in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_epi8 FORCE_INLINE __m128i _mm_add_epi8(__m128i a, __m128i b) { return vreinterpretq_m128i_s8( vaddq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); } // Add packed double-precision (64-bit) floating-point elements in a and b, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_pd FORCE_INLINE __m128d _mm_add_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vaddq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else double *da = (double *) &a; double *db = (double *) &b; double c[2]; c[0] = da[0] + db[0]; c[1] = da[1] + db[1]; return vld1q_f32((float32_t *) c); #endif } // Add the lower double-precision (64-bit) floating-point element in a and b, // store the result in the lower element of dst, and copy the upper element from // a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_sd FORCE_INLINE __m128d _mm_add_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_add_pd(a, b)); #else double *da = (double *) &a; double *db = (double *) &b; double c[2]; c[0] = da[0] + db[0]; c[1] = da[1]; return vld1q_f32((float32_t *) c); #endif } // Add 64-bit integers a and b, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_si64 FORCE_INLINE __m64 _mm_add_si64(__m64 a, __m64 b) { return vreinterpret_m64_s64( vadd_s64(vreinterpret_s64_m64(a), vreinterpret_s64_m64(b))); } // Add packed signed 16-bit integers in a and b using saturation, and store the // results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_adds_epi16 FORCE_INLINE __m128i _mm_adds_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_s16( vqaddq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Add packed signed 8-bit integers in a and b using saturation, and store the // results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_adds_epi8 FORCE_INLINE __m128i _mm_adds_epi8(__m128i a, __m128i b) { return vreinterpretq_m128i_s8( vqaddq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); } // Add packed unsigned 16-bit integers in a and b using saturation, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_adds_epu16 FORCE_INLINE __m128i _mm_adds_epu16(__m128i a, __m128i b) { return vreinterpretq_m128i_u16( vqaddq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); } // Add packed unsigned 8-bit integers in a and b using saturation, and store the // results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_adds_epu8 FORCE_INLINE __m128i _mm_adds_epu8(__m128i a, __m128i b) { return vreinterpretq_m128i_u8( vqaddq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); } // Compute the bitwise AND of packed double-precision (64-bit) floating-point // elements in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_and_pd FORCE_INLINE __m128d _mm_and_pd(__m128d a, __m128d b) { return vreinterpretq_m128d_s64( vandq_s64(vreinterpretq_s64_m128d(a), vreinterpretq_s64_m128d(b))); } // Compute the bitwise AND of 128 bits (representing integer data) in a and b, // and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_and_si128 FORCE_INLINE __m128i _mm_and_si128(__m128i a, __m128i b) { return vreinterpretq_m128i_s32( vandq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Compute the bitwise NOT of packed double-precision (64-bit) floating-point // elements in a and then AND with b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_andnot_pd FORCE_INLINE __m128d _mm_andnot_pd(__m128d a, __m128d b) { // *NOTE* argument swap return vreinterpretq_m128d_s64( vbicq_s64(vreinterpretq_s64_m128d(b), vreinterpretq_s64_m128d(a))); } // Compute the bitwise NOT of 128 bits (representing integer data) in a and then // AND with b, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_andnot_si128 FORCE_INLINE __m128i _mm_andnot_si128(__m128i a, __m128i b) { return vreinterpretq_m128i_s32( vbicq_s32(vreinterpretq_s32_m128i(b), vreinterpretq_s32_m128i(a))); // *NOTE* argument swap } // Average packed unsigned 16-bit integers in a and b, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_avg_epu16 FORCE_INLINE __m128i _mm_avg_epu16(__m128i a, __m128i b) { return (__m128i) vrhaddq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b)); } // Average packed unsigned 8-bit integers in a and b, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_avg_epu8 FORCE_INLINE __m128i _mm_avg_epu8(__m128i a, __m128i b) { return vreinterpretq_m128i_u8( vrhaddq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); } // Shift a left by imm8 bytes while shifting in zeros, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_bslli_si128 #define _mm_bslli_si128(a, imm) _mm_slli_si128(a, imm) // Shift a right by imm8 bytes while shifting in zeros, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_bsrli_si128 #define _mm_bsrli_si128(a, imm) _mm_srli_si128(a, imm) // Cast vector of type __m128d to type __m128. This intrinsic is only used for // compilation and does not generate any instructions, thus it has zero latency. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castpd_ps FORCE_INLINE __m128 _mm_castpd_ps(__m128d a) { return vreinterpretq_m128_s64(vreinterpretq_s64_m128d(a)); } // Cast vector of type __m128d to type __m128i. This intrinsic is only used for // compilation and does not generate any instructions, thus it has zero latency. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castpd_si128 FORCE_INLINE __m128i _mm_castpd_si128(__m128d a) { return vreinterpretq_m128i_s64(vreinterpretq_s64_m128d(a)); } // Cast vector of type __m128 to type __m128d. This intrinsic is only used for // compilation and does not generate any instructions, thus it has zero latency. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castps_pd FORCE_INLINE __m128d _mm_castps_pd(__m128 a) { return vreinterpretq_m128d_s32(vreinterpretq_s32_m128(a)); } // Cast vector of type __m128 to type __m128i. This intrinsic is only used for // compilation and does not generate any instructions, thus it has zero latency. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castps_si128 FORCE_INLINE __m128i _mm_castps_si128(__m128 a) { return vreinterpretq_m128i_s32(vreinterpretq_s32_m128(a)); } // Cast vector of type __m128i to type __m128d. This intrinsic is only used for // compilation and does not generate any instructions, thus it has zero latency. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castsi128_pd FORCE_INLINE __m128d _mm_castsi128_pd(__m128i a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vreinterpretq_f64_m128i(a)); #else return vreinterpretq_m128d_f32(vreinterpretq_f32_m128i(a)); #endif } // Cast vector of type __m128i to type __m128. This intrinsic is only used for // compilation and does not generate any instructions, thus it has zero latency. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castsi128_ps FORCE_INLINE __m128 _mm_castsi128_ps(__m128i a) { return vreinterpretq_m128_s32(vreinterpretq_s32_m128i(a)); } // Invalidate and flush the cache line that contains p from all levels of the // cache hierarchy. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_clflush #if defined(__APPLE__) #include #endif FORCE_INLINE void _mm_clflush(void const *p) { (void) p; /* sys_icache_invalidate is supported since macOS 10.5. * However, it does not work on non-jailbroken iOS devices, although the * compilation is successful. */ #if defined(__APPLE__) sys_icache_invalidate((void *) (uintptr_t) p, SSE2NEON_CACHELINE_SIZE); #elif defined(__GNUC__) || defined(__clang__) uintptr_t ptr = (uintptr_t) p; __builtin___clear_cache((char *) ptr, (char *) ptr + SSE2NEON_CACHELINE_SIZE); #elif (_MSC_VER) && SSE2NEON_INCLUDE_WINDOWS_H FlushInstructionCache(GetCurrentProcess(), p, SSE2NEON_CACHELINE_SIZE); #endif } // Compare packed 16-bit integers in a and b for equality, and store the results // in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_epi16 FORCE_INLINE __m128i _mm_cmpeq_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_u16( vceqq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Compare packed 32-bit integers in a and b for equality, and store the results // in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_epi32 FORCE_INLINE __m128i _mm_cmpeq_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_u32( vceqq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Compare packed 8-bit integers in a and b for equality, and store the results // in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_epi8 FORCE_INLINE __m128i _mm_cmpeq_epi8(__m128i a, __m128i b) { return vreinterpretq_m128i_u8( vceqq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); } // Compare packed double-precision (64-bit) floating-point elements in a and b // for equality, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_pd FORCE_INLINE __m128d _mm_cmpeq_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_u64( vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi) uint32x4_t cmp = vceqq_u32(vreinterpretq_u32_m128d(a), vreinterpretq_u32_m128d(b)); uint32x4_t swapped = vrev64q_u32(cmp); return vreinterpretq_m128d_u32(vandq_u32(cmp, swapped)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for equality, store the result in the lower element of dst, and copy the // upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_sd FORCE_INLINE __m128d _mm_cmpeq_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_cmpeq_pd(a, b)); } // Compare packed double-precision (64-bit) floating-point elements in a and b // for greater-than-or-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpge_pd FORCE_INLINE __m128d _mm_cmpge_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_u64( vcgeq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) >= (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0); d[1] = (*(double *) &a1) >= (*(double *) &b1) ? ~UINT64_C(0) : UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for greater-than-or-equal, store the result in the lower element of dst, // and copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpge_sd FORCE_INLINE __m128d _mm_cmpge_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_cmpge_pd(a, b)); #else // expand "_mm_cmpge_pd()" to reduce unnecessary operations uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) >= (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0); d[1] = a1; return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare packed signed 16-bit integers in a and b for greater-than, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_epi16 FORCE_INLINE __m128i _mm_cmpgt_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_u16( vcgtq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Compare packed signed 32-bit integers in a and b for greater-than, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_epi32 FORCE_INLINE __m128i _mm_cmpgt_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_u32( vcgtq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Compare packed signed 8-bit integers in a and b for greater-than, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_epi8 FORCE_INLINE __m128i _mm_cmpgt_epi8(__m128i a, __m128i b) { return vreinterpretq_m128i_u8( vcgtq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); } // Compare packed double-precision (64-bit) floating-point elements in a and b // for greater-than, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_pd FORCE_INLINE __m128d _mm_cmpgt_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_u64( vcgtq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) > (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0); d[1] = (*(double *) &a1) > (*(double *) &b1) ? ~UINT64_C(0) : UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for greater-than, store the result in the lower element of dst, and copy // the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_sd FORCE_INLINE __m128d _mm_cmpgt_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_cmpgt_pd(a, b)); #else // expand "_mm_cmpge_pd()" to reduce unnecessary operations uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) > (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0); d[1] = a1; return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare packed double-precision (64-bit) floating-point elements in a and b // for less-than-or-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmple_pd FORCE_INLINE __m128d _mm_cmple_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_u64( vcleq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) <= (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0); d[1] = (*(double *) &a1) <= (*(double *) &b1) ? ~UINT64_C(0) : UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for less-than-or-equal, store the result in the lower element of dst, and // copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmple_sd FORCE_INLINE __m128d _mm_cmple_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_cmple_pd(a, b)); #else // expand "_mm_cmpge_pd()" to reduce unnecessary operations uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) <= (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0); d[1] = a1; return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare packed signed 16-bit integers in a and b for less-than, and store the // results in dst. Note: This intrinsic emits the pcmpgtw instruction with the // order of the operands switched. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_epi16 FORCE_INLINE __m128i _mm_cmplt_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_u16( vcltq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Compare packed signed 32-bit integers in a and b for less-than, and store the // results in dst. Note: This intrinsic emits the pcmpgtd instruction with the // order of the operands switched. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_epi32 FORCE_INLINE __m128i _mm_cmplt_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_u32( vcltq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Compare packed signed 8-bit integers in a and b for less-than, and store the // results in dst. Note: This intrinsic emits the pcmpgtb instruction with the // order of the operands switched. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_epi8 FORCE_INLINE __m128i _mm_cmplt_epi8(__m128i a, __m128i b) { return vreinterpretq_m128i_u8( vcltq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); } // Compare packed double-precision (64-bit) floating-point elements in a and b // for less-than, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_pd FORCE_INLINE __m128d _mm_cmplt_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_u64( vcltq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) < (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0); d[1] = (*(double *) &a1) < (*(double *) &b1) ? ~UINT64_C(0) : UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for less-than, store the result in the lower element of dst, and copy the // upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_sd FORCE_INLINE __m128d _mm_cmplt_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_cmplt_pd(a, b)); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) < (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0); d[1] = a1; return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare packed double-precision (64-bit) floating-point elements in a and b // for not-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpneq_pd FORCE_INLINE __m128d _mm_cmpneq_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_s32(vmvnq_s32(vreinterpretq_s32_u64( vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))))); #else // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi) uint32x4_t cmp = vceqq_u32(vreinterpretq_u32_m128d(a), vreinterpretq_u32_m128d(b)); uint32x4_t swapped = vrev64q_u32(cmp); return vreinterpretq_m128d_u32(vmvnq_u32(vandq_u32(cmp, swapped))); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for not-equal, store the result in the lower element of dst, and copy the // upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpneq_sd FORCE_INLINE __m128d _mm_cmpneq_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_cmpneq_pd(a, b)); } // Compare packed double-precision (64-bit) floating-point elements in a and b // for not-greater-than-or-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnge_pd FORCE_INLINE __m128d _mm_cmpnge_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_u64(veorq_u64( vcgeq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)), vdupq_n_u64(UINT64_MAX))); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = !((*(double *) &a0) >= (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0); d[1] = !((*(double *) &a1) >= (*(double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for not-greater-than-or-equal, store the result in the lower element of // dst, and copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnge_sd FORCE_INLINE __m128d _mm_cmpnge_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_cmpnge_pd(a, b)); } // Compare packed double-precision (64-bit) floating-point elements in a and b // for not-greater-than, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_cmpngt_pd FORCE_INLINE __m128d _mm_cmpngt_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_u64(veorq_u64( vcgtq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)), vdupq_n_u64(UINT64_MAX))); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = !((*(double *) &a0) > (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0); d[1] = !((*(double *) &a1) > (*(double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for not-greater-than, store the result in the lower element of dst, and // copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpngt_sd FORCE_INLINE __m128d _mm_cmpngt_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_cmpngt_pd(a, b)); } // Compare packed double-precision (64-bit) floating-point elements in a and b // for not-less-than-or-equal, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnle_pd FORCE_INLINE __m128d _mm_cmpnle_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_u64(veorq_u64( vcleq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)), vdupq_n_u64(UINT64_MAX))); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = !((*(double *) &a0) <= (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0); d[1] = !((*(double *) &a1) <= (*(double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for not-less-than-or-equal, store the result in the lower element of dst, // and copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnle_sd FORCE_INLINE __m128d _mm_cmpnle_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_cmpnle_pd(a, b)); } // Compare packed double-precision (64-bit) floating-point elements in a and b // for not-less-than, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnlt_pd FORCE_INLINE __m128d _mm_cmpnlt_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_u64(veorq_u64( vcltq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)), vdupq_n_u64(UINT64_MAX))); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = !((*(double *) &a0) < (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0); d[1] = !((*(double *) &a1) < (*(double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b for not-less-than, store the result in the lower element of dst, and copy // the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnlt_sd FORCE_INLINE __m128d _mm_cmpnlt_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_cmpnlt_pd(a, b)); } // Compare packed double-precision (64-bit) floating-point elements in a and b // to see if neither is NaN, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpord_pd FORCE_INLINE __m128d _mm_cmpord_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) // Excluding NaNs, any two floating point numbers can be compared. uint64x2_t not_nan_a = vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(a)); uint64x2_t not_nan_b = vceqq_f64(vreinterpretq_f64_m128d(b), vreinterpretq_f64_m128d(b)); return vreinterpretq_m128d_u64(vandq_u64(not_nan_a, not_nan_b)); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = ((*(double *) &a0) == (*(double *) &a0) && (*(double *) &b0) == (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0); d[1] = ((*(double *) &a1) == (*(double *) &a1) && (*(double *) &b1) == (*(double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b to see if neither is NaN, store the result in the lower element of dst, and // copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpord_sd FORCE_INLINE __m128d _mm_cmpord_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_cmpord_pd(a, b)); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t d[2]; d[0] = ((*(double *) &a0) == (*(double *) &a0) && (*(double *) &b0) == (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0); d[1] = a1; return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare packed double-precision (64-bit) floating-point elements in a and b // to see if either is NaN, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpunord_pd FORCE_INLINE __m128d _mm_cmpunord_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) // Two NaNs are not equal in comparison operation. uint64x2_t not_nan_a = vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(a)); uint64x2_t not_nan_b = vceqq_f64(vreinterpretq_f64_m128d(b), vreinterpretq_f64_m128d(b)); return vreinterpretq_m128d_s32( vmvnq_s32(vreinterpretq_s32_u64(vandq_u64(not_nan_a, not_nan_b)))); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = ((*(double *) &a0) == (*(double *) &a0) && (*(double *) &b0) == (*(double *) &b0)) ? UINT64_C(0) : ~UINT64_C(0); d[1] = ((*(double *) &a1) == (*(double *) &a1) && (*(double *) &b1) == (*(double *) &b1)) ? UINT64_C(0) : ~UINT64_C(0); return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b to see if either is NaN, store the result in the lower element of dst, and // copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpunord_sd FORCE_INLINE __m128d _mm_cmpunord_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_cmpunord_pd(a, b)); #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t d[2]; d[0] = ((*(double *) &a0) == (*(double *) &a0) && (*(double *) &b0) == (*(double *) &b0)) ? UINT64_C(0) : ~UINT64_C(0); d[1] = a1; return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point element in a and b // for greater-than-or-equal, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comige_sd FORCE_INLINE int _mm_comige_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vgetq_lane_u64(vcgeq_f64(a, b), 0) & 0x1; #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); return (*(double *) &a0 >= *(double *) &b0); #endif } // Compare the lower double-precision (64-bit) floating-point element in a and b // for greater-than, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comigt_sd FORCE_INLINE int _mm_comigt_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vgetq_lane_u64(vcgtq_f64(a, b), 0) & 0x1; #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); return (*(double *) &a0 > *(double *) &b0); #endif } // Compare the lower double-precision (64-bit) floating-point element in a and b // for less-than-or-equal, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comile_sd FORCE_INLINE int _mm_comile_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vgetq_lane_u64(vcleq_f64(a, b), 0) & 0x1; #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); return (*(double *) &a0 <= *(double *) &b0); #endif } // Compare the lower double-precision (64-bit) floating-point element in a and b // for less-than, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comilt_sd FORCE_INLINE int _mm_comilt_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vgetq_lane_u64(vcltq_f64(a, b), 0) & 0x1; #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); return (*(double *) &a0 < *(double *) &b0); #endif } // Compare the lower double-precision (64-bit) floating-point element in a and b // for equality, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comieq_sd FORCE_INLINE int _mm_comieq_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vgetq_lane_u64(vceqq_f64(a, b), 0) & 0x1; #else uint32x4_t a_not_nan = vceqq_u32(vreinterpretq_u32_m128d(a), vreinterpretq_u32_m128d(a)); uint32x4_t b_not_nan = vceqq_u32(vreinterpretq_u32_m128d(b), vreinterpretq_u32_m128d(b)); uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); uint32x4_t a_eq_b = vceqq_u32(vreinterpretq_u32_m128d(a), vreinterpretq_u32_m128d(b)); uint64x2_t and_results = vandq_u64(vreinterpretq_u64_u32(a_and_b_not_nan), vreinterpretq_u64_u32(a_eq_b)); return vgetq_lane_u64(and_results, 0) & 0x1; #endif } // Compare the lower double-precision (64-bit) floating-point element in a and b // for not-equal, and return the boolean result (0 or 1). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comineq_sd FORCE_INLINE int _mm_comineq_sd(__m128d a, __m128d b) { return !_mm_comieq_sd(a, b); } // Convert packed signed 32-bit integers in a to packed double-precision // (64-bit) floating-point elements, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi32_pd FORCE_INLINE __m128d _mm_cvtepi32_pd(__m128i a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vcvtq_f64_s64(vmovl_s32(vget_low_s32(vreinterpretq_s32_m128i(a))))); #else double a0 = (double) vgetq_lane_s32(vreinterpretq_s32_m128i(a), 0); double a1 = (double) vgetq_lane_s32(vreinterpretq_s32_m128i(a), 1); return _mm_set_pd(a1, a0); #endif } // Convert packed signed 32-bit integers in a to packed single-precision // (32-bit) floating-point elements, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi32_ps FORCE_INLINE __m128 _mm_cvtepi32_ps(__m128i a) { return vreinterpretq_m128_f32(vcvtq_f32_s32(vreinterpretq_s32_m128i(a))); } // Convert packed double-precision (64-bit) floating-point elements in a to // packed 32-bit integers, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpd_epi32 FORCE_INLINE __m128i _mm_cvtpd_epi32(__m128d a) { // vrnd32xq_f64 not supported on clang #if defined(__ARM_FEATURE_FRINT) && !defined(__clang__) float64x2_t rounded = vrnd32xq_f64(vreinterpretq_f64_m128d(a)); int64x2_t integers = vcvtq_s64_f64(rounded); return vreinterpretq_m128i_s32( vcombine_s32(vmovn_s64(integers), vdup_n_s32(0))); #else __m128d rnd = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); double d0 = ((double *) &rnd)[0]; double d1 = ((double *) &rnd)[1]; return _mm_set_epi32(0, 0, (int32_t) d1, (int32_t) d0); #endif } // Convert packed double-precision (64-bit) floating-point elements in a to // packed 32-bit integers, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpd_pi32 FORCE_INLINE __m64 _mm_cvtpd_pi32(__m128d a) { __m128d rnd = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); double d0 = ((double *) &rnd)[0]; double d1 = ((double *) &rnd)[1]; int32_t ALIGN_STRUCT(16) data[2] = {(int32_t) d0, (int32_t) d1}; return vreinterpret_m64_s32(vld1_s32(data)); } // Convert packed double-precision (64-bit) floating-point elements in a to // packed single-precision (32-bit) floating-point elements, and store the // results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpd_ps FORCE_INLINE __m128 _mm_cvtpd_ps(__m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) float32x2_t tmp = vcvt_f32_f64(vreinterpretq_f64_m128d(a)); return vreinterpretq_m128_f32(vcombine_f32(tmp, vdup_n_f32(0))); #else float a0 = (float) ((double *) &a)[0]; float a1 = (float) ((double *) &a)[1]; return _mm_set_ps(0, 0, a1, a0); #endif } // Convert packed signed 32-bit integers in a to packed double-precision // (64-bit) floating-point elements, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi32_pd FORCE_INLINE __m128d _mm_cvtpi32_pd(__m64 a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vcvtq_f64_s64(vmovl_s32(vreinterpret_s32_m64(a)))); #else double a0 = (double) vget_lane_s32(vreinterpret_s32_m64(a), 0); double a1 = (double) vget_lane_s32(vreinterpret_s32_m64(a), 1); return _mm_set_pd(a1, a0); #endif } // Convert packed single-precision (32-bit) floating-point elements in a to // packed 32-bit integers, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_epi32 // *NOTE*. The default rounding mode on SSE is 'round to even', which ARMv7-A // does not support! It is supported on ARMv8-A however. FORCE_INLINE __m128i _mm_cvtps_epi32(__m128 a) { #if defined(__ARM_FEATURE_FRINT) return vreinterpretq_m128i_s32(vcvtq_s32_f32(vrnd32xq_f32(a))); #elif (defined(__aarch64__) || defined(_M_ARM64)) || \ defined(__ARM_FEATURE_DIRECTED_ROUNDING) switch (_MM_GET_ROUNDING_MODE()) { case _MM_ROUND_NEAREST: return vreinterpretq_m128i_s32(vcvtnq_s32_f32(a)); case _MM_ROUND_DOWN: return vreinterpretq_m128i_s32(vcvtmq_s32_f32(a)); case _MM_ROUND_UP: return vreinterpretq_m128i_s32(vcvtpq_s32_f32(a)); default: // _MM_ROUND_TOWARD_ZERO return vreinterpretq_m128i_s32(vcvtq_s32_f32(a)); } #else float *f = (float *) &a; switch (_MM_GET_ROUNDING_MODE()) { case _MM_ROUND_NEAREST: { uint32x4_t signmask = vdupq_n_u32(0x80000000); float32x4_t half = vbslq_f32(signmask, vreinterpretq_f32_m128(a), vdupq_n_f32(0.5f)); /* +/- 0.5 */ int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32( vreinterpretq_f32_m128(a), half)); /* round to integer: [a + 0.5]*/ int32x4_t r_trunc = vcvtq_s32_f32( vreinterpretq_f32_m128(a)); /* truncate to integer: [a] */ int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32( vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31)); /* 1 or 0 */ int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone), vdupq_n_s32(1)); /* ([a] + {0,1}) & ~1 */ float32x4_t delta = vsubq_f32( vreinterpretq_f32_m128(a), vcvtq_f32_s32(r_trunc)); /* compute delta: delta = (a - [a]) */ uint32x4_t is_delta_half = vceqq_f32(delta, half); /* delta == +/- 0.5 */ return vreinterpretq_m128i_s32( vbslq_s32(is_delta_half, r_even, r_normal)); } case _MM_ROUND_DOWN: return _mm_set_epi32(floorf(f[3]), floorf(f[2]), floorf(f[1]), floorf(f[0])); case _MM_ROUND_UP: return _mm_set_epi32(ceilf(f[3]), ceilf(f[2]), ceilf(f[1]), ceilf(f[0])); default: // _MM_ROUND_TOWARD_ZERO return _mm_set_epi32((int32_t) f[3], (int32_t) f[2], (int32_t) f[1], (int32_t) f[0]); } #endif } // Convert packed single-precision (32-bit) floating-point elements in a to // packed double-precision (64-bit) floating-point elements, and store the // results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_pd FORCE_INLINE __m128d _mm_cvtps_pd(__m128 a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vcvt_f64_f32(vget_low_f32(vreinterpretq_f32_m128(a)))); #else double a0 = (double) vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); double a1 = (double) vgetq_lane_f32(vreinterpretq_f32_m128(a), 1); return _mm_set_pd(a1, a0); #endif } // Copy the lower double-precision (64-bit) floating-point element of a to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_f64 FORCE_INLINE double _mm_cvtsd_f64(__m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) return (double) vgetq_lane_f64(vreinterpretq_f64_m128d(a), 0); #else return ((double *) &a)[0]; #endif } // Convert the lower double-precision (64-bit) floating-point element in a to a // 32-bit integer, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_si32 FORCE_INLINE int32_t _mm_cvtsd_si32(__m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) return (int32_t) vgetq_lane_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)), 0); #else __m128d rnd = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); double ret = ((double *) &rnd)[0]; return (int32_t) ret; #endif } // Convert the lower double-precision (64-bit) floating-point element in a to a // 64-bit integer, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_si64 FORCE_INLINE int64_t _mm_cvtsd_si64(__m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) return (int64_t) vgetq_lane_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)), 0); #else __m128d rnd = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); double ret = ((double *) &rnd)[0]; return (int64_t) ret; #endif } // Convert the lower double-precision (64-bit) floating-point element in a to a // 64-bit integer, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_si64x #define _mm_cvtsd_si64x _mm_cvtsd_si64 // Convert the lower double-precision (64-bit) floating-point element in b to a // single-precision (32-bit) floating-point element, store the result in the // lower element of dst, and copy the upper 3 packed elements from a to the // upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_ss FORCE_INLINE __m128 _mm_cvtsd_ss(__m128 a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128_f32(vsetq_lane_f32( vget_lane_f32(vcvt_f32_f64(vreinterpretq_f64_m128d(b)), 0), vreinterpretq_f32_m128(a), 0)); #else return vreinterpretq_m128_f32(vsetq_lane_f32((float) ((double *) &b)[0], vreinterpretq_f32_m128(a), 0)); #endif } // Copy the lower 32-bit integer in a to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi128_si32 FORCE_INLINE int _mm_cvtsi128_si32(__m128i a) { return vgetq_lane_s32(vreinterpretq_s32_m128i(a), 0); } // Copy the lower 64-bit integer in a to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi128_si64 FORCE_INLINE int64_t _mm_cvtsi128_si64(__m128i a) { return vgetq_lane_s64(vreinterpretq_s64_m128i(a), 0); } // Copy the lower 64-bit integer in a to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi128_si64x #define _mm_cvtsi128_si64x(a) _mm_cvtsi128_si64(a) // Convert the signed 32-bit integer b to a double-precision (64-bit) // floating-point element, store the result in the lower element of dst, and // copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi32_sd FORCE_INLINE __m128d _mm_cvtsi32_sd(__m128d a, int32_t b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vsetq_lane_f64((double) b, vreinterpretq_f64_m128d(a), 0)); #else double bf = (double) b; return vreinterpretq_m128d_s64( vsetq_lane_s64(*(int64_t *) &bf, vreinterpretq_s64_m128d(a), 0)); #endif } // Copy the lower 64-bit integer in a to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi128_si64x #define _mm_cvtsi128_si64x(a) _mm_cvtsi128_si64(a) // Copy 32-bit integer a to the lower elements of dst, and zero the upper // elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi32_si128 FORCE_INLINE __m128i _mm_cvtsi32_si128(int a) { return vreinterpretq_m128i_s32(vsetq_lane_s32(a, vdupq_n_s32(0), 0)); } // Convert the signed 64-bit integer b to a double-precision (64-bit) // floating-point element, store the result in the lower element of dst, and // copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64_sd FORCE_INLINE __m128d _mm_cvtsi64_sd(__m128d a, int64_t b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vsetq_lane_f64((double) b, vreinterpretq_f64_m128d(a), 0)); #else double bf = (double) b; return vreinterpretq_m128d_s64( vsetq_lane_s64(*(int64_t *) &bf, vreinterpretq_s64_m128d(a), 0)); #endif } // Copy 64-bit integer a to the lower element of dst, and zero the upper // element. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64_si128 FORCE_INLINE __m128i _mm_cvtsi64_si128(int64_t a) { return vreinterpretq_m128i_s64(vsetq_lane_s64(a, vdupq_n_s64(0), 0)); } // Copy 64-bit integer a to the lower element of dst, and zero the upper // element. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64x_si128 #define _mm_cvtsi64x_si128(a) _mm_cvtsi64_si128(a) // Convert the signed 64-bit integer b to a double-precision (64-bit) // floating-point element, store the result in the lower element of dst, and // copy the upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64x_sd #define _mm_cvtsi64x_sd(a, b) _mm_cvtsi64_sd(a, b) // Convert the lower single-precision (32-bit) floating-point element in b to a // double-precision (64-bit) floating-point element, store the result in the // lower element of dst, and copy the upper element from a to the upper element // of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtss_sd FORCE_INLINE __m128d _mm_cvtss_sd(__m128d a, __m128 b) { double d = (double) vgetq_lane_f32(vreinterpretq_f32_m128(b), 0); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vsetq_lane_f64(d, vreinterpretq_f64_m128d(a), 0)); #else return vreinterpretq_m128d_s64( vsetq_lane_s64(*(int64_t *) &d, vreinterpretq_s64_m128d(a), 0)); #endif } // Convert packed double-precision (64-bit) floating-point elements in a to // packed 32-bit integers with truncation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttpd_epi32 FORCE_INLINE __m128i _mm_cvttpd_epi32(__m128d a) { double a0 = ((double *) &a)[0]; double a1 = ((double *) &a)[1]; return _mm_set_epi32(0, 0, (int32_t) a1, (int32_t) a0); } // Convert packed double-precision (64-bit) floating-point elements in a to // packed 32-bit integers with truncation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttpd_pi32 FORCE_INLINE __m64 _mm_cvttpd_pi32(__m128d a) { double a0 = ((double *) &a)[0]; double a1 = ((double *) &a)[1]; int32_t ALIGN_STRUCT(16) data[2] = {(int32_t) a0, (int32_t) a1}; return vreinterpret_m64_s32(vld1_s32(data)); } // Convert packed single-precision (32-bit) floating-point elements in a to // packed 32-bit integers with truncation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttps_epi32 FORCE_INLINE __m128i _mm_cvttps_epi32(__m128 a) { return vreinterpretq_m128i_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a))); } // Convert the lower double-precision (64-bit) floating-point element in a to a // 32-bit integer with truncation, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttsd_si32 FORCE_INLINE int32_t _mm_cvttsd_si32(__m128d a) { double ret = *((double *) &a); return (int32_t) ret; } // Convert the lower double-precision (64-bit) floating-point element in a to a // 64-bit integer with truncation, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttsd_si64 FORCE_INLINE int64_t _mm_cvttsd_si64(__m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) return vgetq_lane_s64(vcvtq_s64_f64(vreinterpretq_f64_m128d(a)), 0); #else double ret = *((double *) &a); return (int64_t) ret; #endif } // Convert the lower double-precision (64-bit) floating-point element in a to a // 64-bit integer with truncation, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttsd_si64x #define _mm_cvttsd_si64x(a) _mm_cvttsd_si64(a) // Divide packed double-precision (64-bit) floating-point elements in a by // packed elements in b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_div_pd FORCE_INLINE __m128d _mm_div_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vdivq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else double *da = (double *) &a; double *db = (double *) &b; double c[2]; c[0] = da[0] / db[0]; c[1] = da[1] / db[1]; return vld1q_f32((float32_t *) c); #endif } // Divide the lower double-precision (64-bit) floating-point element in a by the // lower double-precision (64-bit) floating-point element in b, store the result // in the lower element of dst, and copy the upper element from a to the upper // element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_div_sd FORCE_INLINE __m128d _mm_div_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) float64x2_t tmp = vdivq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)); return vreinterpretq_m128d_f64( vsetq_lane_f64(vgetq_lane_f64(vreinterpretq_f64_m128d(a), 1), tmp, 1)); #else return _mm_move_sd(a, _mm_div_pd(a, b)); #endif } // Extract a 16-bit integer from a, selected with imm8, and store the result in // the lower element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_epi16 // FORCE_INLINE int _mm_extract_epi16(__m128i a, __constrange(0,8) int imm) #define _mm_extract_epi16(a, imm) \ vgetq_lane_u16(vreinterpretq_u16_m128i(a), (imm)) // Copy a to dst, and insert the 16-bit integer i into dst at the location // specified by imm8. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_epi16 // FORCE_INLINE __m128i _mm_insert_epi16(__m128i a, int b, // __constrange(0,8) int imm) #define _mm_insert_epi16(a, b, imm) \ vreinterpretq_m128i_s16( \ vsetq_lane_s16((b), vreinterpretq_s16_m128i(a), (imm))) // Load 128-bits (composed of 2 packed double-precision (64-bit) floating-point // elements) from memory into dst. mem_addr must be aligned on a 16-byte // boundary or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_pd FORCE_INLINE __m128d _mm_load_pd(const double *p) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vld1q_f64(p)); #else const float *fp = (const float *) p; float ALIGN_STRUCT(16) data[4] = {fp[0], fp[1], fp[2], fp[3]}; return vreinterpretq_m128d_f32(vld1q_f32(data)); #endif } // Load a double-precision (64-bit) floating-point element from memory into both // elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_pd1 #define _mm_load_pd1 _mm_load1_pd // Load a double-precision (64-bit) floating-point element from memory into the // lower of dst, and zero the upper element. mem_addr does not need to be // aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_sd FORCE_INLINE __m128d _mm_load_sd(const double *p) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vsetq_lane_f64(*p, vdupq_n_f64(0), 0)); #else const float *fp = (const float *) p; float ALIGN_STRUCT(16) data[4] = {fp[0], fp[1], 0, 0}; return vreinterpretq_m128d_f32(vld1q_f32(data)); #endif } // Load 128-bits of integer data from memory into dst. mem_addr must be aligned // on a 16-byte boundary or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_si128 FORCE_INLINE __m128i _mm_load_si128(const __m128i *p) { return vreinterpretq_m128i_s32(vld1q_s32((const int32_t *) p)); } // Load a double-precision (64-bit) floating-point element from memory into both // elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load1_pd FORCE_INLINE __m128d _mm_load1_pd(const double *p) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vld1q_dup_f64(p)); #else return vreinterpretq_m128d_s64(vdupq_n_s64(*(const int64_t *) p)); #endif } // Load a double-precision (64-bit) floating-point element from memory into the // upper element of dst, and copy the lower element from a to dst. mem_addr does // not need to be aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadh_pd FORCE_INLINE __m128d _mm_loadh_pd(__m128d a, const double *p) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vcombine_f64(vget_low_f64(vreinterpretq_f64_m128d(a)), vld1_f64(p))); #else return vreinterpretq_m128d_f32(vcombine_f32( vget_low_f32(vreinterpretq_f32_m128d(a)), vld1_f32((const float *) p))); #endif } // Load 64-bit integer from memory into the first element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadl_epi64 FORCE_INLINE __m128i _mm_loadl_epi64(__m128i const *p) { /* Load the lower 64 bits of the value pointed to by p into the * lower 64 bits of the result, zeroing the upper 64 bits of the result. */ return vreinterpretq_m128i_s32( vcombine_s32(vld1_s32((int32_t const *) p), vcreate_s32(0))); } // Load a double-precision (64-bit) floating-point element from memory into the // lower element of dst, and copy the upper element from a to dst. mem_addr does // not need to be aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadl_pd FORCE_INLINE __m128d _mm_loadl_pd(__m128d a, const double *p) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vcombine_f64(vld1_f64(p), vget_high_f64(vreinterpretq_f64_m128d(a)))); #else return vreinterpretq_m128d_f32( vcombine_f32(vld1_f32((const float *) p), vget_high_f32(vreinterpretq_f32_m128d(a)))); #endif } // Load 2 double-precision (64-bit) floating-point elements from memory into dst // in reverse order. mem_addr must be aligned on a 16-byte boundary or a // general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadr_pd FORCE_INLINE __m128d _mm_loadr_pd(const double *p) { #if defined(__aarch64__) || defined(_M_ARM64) float64x2_t v = vld1q_f64(p); return vreinterpretq_m128d_f64(vextq_f64(v, v, 1)); #else int64x2_t v = vld1q_s64((const int64_t *) p); return vreinterpretq_m128d_s64(vextq_s64(v, v, 1)); #endif } // Loads two double-precision from unaligned memory, floating-point values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_pd FORCE_INLINE __m128d _mm_loadu_pd(const double *p) { return _mm_load_pd(p); } // Load 128-bits of integer data from memory into dst. mem_addr does not need to // be aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si128 FORCE_INLINE __m128i _mm_loadu_si128(const __m128i *p) { return vreinterpretq_m128i_s32(vld1q_s32((const unaligned_int32_t *) p)); } // Load unaligned 32-bit integer from memory into the first element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si32 FORCE_INLINE __m128i _mm_loadu_si32(const void *p) { return vreinterpretq_m128i_s32( vsetq_lane_s32(*(const unaligned_int32_t *) p, vdupq_n_s32(0), 0)); } // Multiply packed signed 16-bit integers in a and b, producing intermediate // signed 32-bit integers. Horizontally add adjacent pairs of intermediate // 32-bit integers, and pack the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_madd_epi16 FORCE_INLINE __m128i _mm_madd_epi16(__m128i a, __m128i b) { int32x4_t low = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)), vget_low_s16(vreinterpretq_s16_m128i(b))); #if defined(__aarch64__) || defined(_M_ARM64) int32x4_t high = vmull_high_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)); return vreinterpretq_m128i_s32(vpaddq_s32(low, high)); #else int32x4_t high = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)), vget_high_s16(vreinterpretq_s16_m128i(b))); int32x2_t low_sum = vpadd_s32(vget_low_s32(low), vget_high_s32(low)); int32x2_t high_sum = vpadd_s32(vget_low_s32(high), vget_high_s32(high)); return vreinterpretq_m128i_s32(vcombine_s32(low_sum, high_sum)); #endif } // Conditionally store 8-bit integer elements from a into memory using mask // (elements are not stored when the highest bit is not set in the corresponding // element) and a non-temporal memory hint. mem_addr does not need to be aligned // on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_maskmoveu_si128 FORCE_INLINE void _mm_maskmoveu_si128(__m128i a, __m128i mask, char *mem_addr) { int8x16_t shr_mask = vshrq_n_s8(vreinterpretq_s8_m128i(mask), 7); __m128 b = _mm_load_ps((const float *) mem_addr); int8x16_t masked = vbslq_s8(vreinterpretq_u8_s8(shr_mask), vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128(b)); vst1q_s8((int8_t *) mem_addr, masked); } // Compare packed signed 16-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epi16 FORCE_INLINE __m128i _mm_max_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_s16( vmaxq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Compare packed unsigned 8-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epu8 FORCE_INLINE __m128i _mm_max_epu8(__m128i a, __m128i b) { return vreinterpretq_m128i_u8( vmaxq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); } // Compare packed double-precision (64-bit) floating-point elements in a and b, // and store packed maximum values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_pd FORCE_INLINE __m128d _mm_max_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) #if SSE2NEON_PRECISE_MINMAX float64x2_t _a = vreinterpretq_f64_m128d(a); float64x2_t _b = vreinterpretq_f64_m128d(b); return vreinterpretq_m128d_f64(vbslq_f64(vcgtq_f64(_a, _b), _a, _b)); #else return vreinterpretq_m128d_f64( vmaxq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #endif #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) > (*(double *) &b0) ? a0 : b0; d[1] = (*(double *) &a1) > (*(double *) &b1) ? a1 : b1; return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b, store the maximum value in the lower element of dst, and copy the upper // element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_sd FORCE_INLINE __m128d _mm_max_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_max_pd(a, b)); #else double *da = (double *) &a; double *db = (double *) &b; double c[2] = {da[0] > db[0] ? da[0] : db[0], da[1]}; return vreinterpretq_m128d_f32(vld1q_f32((float32_t *) c)); #endif } // Compare packed signed 16-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epi16 FORCE_INLINE __m128i _mm_min_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_s16( vminq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Compare packed unsigned 8-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epu8 FORCE_INLINE __m128i _mm_min_epu8(__m128i a, __m128i b) { return vreinterpretq_m128i_u8( vminq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); } // Compare packed double-precision (64-bit) floating-point elements in a and b, // and store packed minimum values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_pd FORCE_INLINE __m128d _mm_min_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) #if SSE2NEON_PRECISE_MINMAX float64x2_t _a = vreinterpretq_f64_m128d(a); float64x2_t _b = vreinterpretq_f64_m128d(b); return vreinterpretq_m128d_f64(vbslq_f64(vcltq_f64(_a, _b), _a, _b)); #else return vreinterpretq_m128d_f64( vminq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #endif #else uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a)); uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a)); uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b)); uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b)); uint64_t d[2]; d[0] = (*(double *) &a0) < (*(double *) &b0) ? a0 : b0; d[1] = (*(double *) &a1) < (*(double *) &b1) ? a1 : b1; return vreinterpretq_m128d_u64(vld1q_u64(d)); #endif } // Compare the lower double-precision (64-bit) floating-point elements in a and // b, store the minimum value in the lower element of dst, and copy the upper // element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_sd FORCE_INLINE __m128d _mm_min_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_min_pd(a, b)); #else double *da = (double *) &a; double *db = (double *) &b; double c[2] = {da[0] < db[0] ? da[0] : db[0], da[1]}; return vreinterpretq_m128d_f32(vld1q_f32((float32_t *) c)); #endif } // Copy the lower 64-bit integer in a to the lower element of dst, and zero the // upper element. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_move_epi64 FORCE_INLINE __m128i _mm_move_epi64(__m128i a) { return vreinterpretq_m128i_s64( vsetq_lane_s64(0, vreinterpretq_s64_m128i(a), 1)); } // Move the lower double-precision (64-bit) floating-point element from b to the // lower element of dst, and copy the upper element from a to the upper element // of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_move_sd FORCE_INLINE __m128d _mm_move_sd(__m128d a, __m128d b) { return vreinterpretq_m128d_f32( vcombine_f32(vget_low_f32(vreinterpretq_f32_m128d(b)), vget_high_f32(vreinterpretq_f32_m128d(a)))); } // Create mask from the most significant bit of each 8-bit element in a, and // store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movemask_epi8 FORCE_INLINE int _mm_movemask_epi8(__m128i a) { // Use increasingly wide shifts+adds to collect the sign bits // together. // Since the widening shifts would be rather confusing to follow in little // endian, everything will be illustrated in big endian order instead. This // has a different result - the bits would actually be reversed on a big // endian machine. // Starting input (only half the elements are shown): // 89 ff 1d c0 00 10 99 33 uint8x16_t input = vreinterpretq_u8_m128i(a); // Shift out everything but the sign bits with an unsigned shift right. // // Bytes of the vector:: // 89 ff 1d c0 00 10 99 33 // \ \ \ \ \ \ \ \ high_bits = (uint16x4_t)(input >> 7) // | | | | | | | | // 01 01 00 01 00 00 01 00 // // Bits of first important lane(s): // 10001001 (89) // \______ // | // 00000001 (01) uint16x8_t high_bits = vreinterpretq_u16_u8(vshrq_n_u8(input, 7)); // Merge the even lanes together with a 16-bit unsigned shift right + add. // 'xx' represents garbage data which will be ignored in the final result. // In the important bytes, the add functions like a binary OR. // // 01 01 00 01 00 00 01 00 // \_ | \_ | \_ | \_ | paired16 = (uint32x4_t)(input + (input >> 7)) // \| \| \| \| // xx 03 xx 01 xx 00 xx 02 // // 00000001 00000001 (01 01) // \_______ | // \| // xxxxxxxx xxxxxx11 (xx 03) uint32x4_t paired16 = vreinterpretq_u32_u16(vsraq_n_u16(high_bits, high_bits, 7)); // Repeat with a wider 32-bit shift + add. // xx 03 xx 01 xx 00 xx 02 // \____ | \____ | paired32 = (uint64x1_t)(paired16 + (paired16 >> // 14)) // \| \| // xx xx xx 0d xx xx xx 02 // // 00000011 00000001 (03 01) // \\_____ || // '----.\|| // xxxxxxxx xxxx1101 (xx 0d) uint64x2_t paired32 = vreinterpretq_u64_u32(vsraq_n_u32(paired16, paired16, 14)); // Last, an even wider 64-bit shift + add to get our result in the low 8 bit // lanes. xx xx xx 0d xx xx xx 02 // \_________ | paired64 = (uint8x8_t)(paired32 + (paired32 >> // 28)) // \| // xx xx xx xx xx xx xx d2 // // 00001101 00000010 (0d 02) // \ \___ | | // '---. \| | // xxxxxxxx 11010010 (xx d2) uint8x16_t paired64 = vreinterpretq_u8_u64(vsraq_n_u64(paired32, paired32, 28)); // Extract the low 8 bits from each 64-bit lane with 2 8-bit extracts. // xx xx xx xx xx xx xx d2 // || return paired64[0] // d2 // Note: Little endian would return the correct value 4b (01001011) instead. return vgetq_lane_u8(paired64, 0) | ((int) vgetq_lane_u8(paired64, 8) << 8); } // Set each bit of mask dst based on the most significant bit of the // corresponding packed double-precision (64-bit) floating-point element in a. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movemask_pd FORCE_INLINE int _mm_movemask_pd(__m128d a) { uint64x2_t input = vreinterpretq_u64_m128d(a); uint64x2_t high_bits = vshrq_n_u64(input, 63); return (int) (vgetq_lane_u64(high_bits, 0) | (vgetq_lane_u64(high_bits, 1) << 1)); } // Copy the lower 64-bit integer in a to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movepi64_pi64 FORCE_INLINE __m64 _mm_movepi64_pi64(__m128i a) { return vreinterpret_m64_s64(vget_low_s64(vreinterpretq_s64_m128i(a))); } // Copy the 64-bit integer a to the lower element of dst, and zero the upper // element. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movpi64_epi64 FORCE_INLINE __m128i _mm_movpi64_epi64(__m64 a) { return vreinterpretq_m128i_s64( vcombine_s64(vreinterpret_s64_m64(a), vdup_n_s64(0))); } // Multiply the low unsigned 32-bit integers from each packed 64-bit element in // a and b, and store the unsigned 64-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_epu32 FORCE_INLINE __m128i _mm_mul_epu32(__m128i a, __m128i b) { // vmull_u32 upcasts instead of masking, so we downcast. uint32x2_t a_lo = vmovn_u64(vreinterpretq_u64_m128i(a)); uint32x2_t b_lo = vmovn_u64(vreinterpretq_u64_m128i(b)); return vreinterpretq_m128i_u64(vmull_u32(a_lo, b_lo)); } // Multiply packed double-precision (64-bit) floating-point elements in a and b, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_pd FORCE_INLINE __m128d _mm_mul_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vmulq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else double *da = (double *) &a; double *db = (double *) &b; double c[2]; c[0] = da[0] * db[0]; c[1] = da[1] * db[1]; return vld1q_f32((float32_t *) c); #endif } // Multiply the lower double-precision (64-bit) floating-point element in a and // b, store the result in the lower element of dst, and copy the upper element // from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_mul_sd FORCE_INLINE __m128d _mm_mul_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_mul_pd(a, b)); } // Multiply the low unsigned 32-bit integers from a and b, and store the // unsigned 64-bit result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_su32 FORCE_INLINE __m64 _mm_mul_su32(__m64 a, __m64 b) { return vreinterpret_m64_u64(vget_low_u64( vmull_u32(vreinterpret_u32_m64(a), vreinterpret_u32_m64(b)))); } // Multiply the packed signed 16-bit integers in a and b, producing intermediate // 32-bit integers, and store the high 16 bits of the intermediate integers in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhi_epi16 FORCE_INLINE __m128i _mm_mulhi_epi16(__m128i a, __m128i b) { /* FIXME: issue with large values because of result saturation */ // int16x8_t ret = vqdmulhq_s16(vreinterpretq_s16_m128i(a), // vreinterpretq_s16_m128i(b)); /* =2*a*b */ return // vreinterpretq_m128i_s16(vshrq_n_s16(ret, 1)); int16x4_t a3210 = vget_low_s16(vreinterpretq_s16_m128i(a)); int16x4_t b3210 = vget_low_s16(vreinterpretq_s16_m128i(b)); int32x4_t ab3210 = vmull_s16(a3210, b3210); /* 3333222211110000 */ int16x4_t a7654 = vget_high_s16(vreinterpretq_s16_m128i(a)); int16x4_t b7654 = vget_high_s16(vreinterpretq_s16_m128i(b)); int32x4_t ab7654 = vmull_s16(a7654, b7654); /* 7777666655554444 */ uint16x8x2_t r = vuzpq_u16(vreinterpretq_u16_s32(ab3210), vreinterpretq_u16_s32(ab7654)); return vreinterpretq_m128i_u16(r.val[1]); } // Multiply the packed unsigned 16-bit integers in a and b, producing // intermediate 32-bit integers, and store the high 16 bits of the intermediate // integers in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhi_epu16 FORCE_INLINE __m128i _mm_mulhi_epu16(__m128i a, __m128i b) { uint16x4_t a3210 = vget_low_u16(vreinterpretq_u16_m128i(a)); uint16x4_t b3210 = vget_low_u16(vreinterpretq_u16_m128i(b)); uint32x4_t ab3210 = vmull_u16(a3210, b3210); #if defined(__aarch64__) || defined(_M_ARM64) uint32x4_t ab7654 = vmull_high_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b)); uint16x8_t r = vuzp2q_u16(vreinterpretq_u16_u32(ab3210), vreinterpretq_u16_u32(ab7654)); return vreinterpretq_m128i_u16(r); #else uint16x4_t a7654 = vget_high_u16(vreinterpretq_u16_m128i(a)); uint16x4_t b7654 = vget_high_u16(vreinterpretq_u16_m128i(b)); uint32x4_t ab7654 = vmull_u16(a7654, b7654); uint16x8x2_t r = vuzpq_u16(vreinterpretq_u16_u32(ab3210), vreinterpretq_u16_u32(ab7654)); return vreinterpretq_m128i_u16(r.val[1]); #endif } // Multiply the packed 16-bit integers in a and b, producing intermediate 32-bit // integers, and store the low 16 bits of the intermediate integers in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mullo_epi16 FORCE_INLINE __m128i _mm_mullo_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_s16( vmulq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Compute the bitwise OR of packed double-precision (64-bit) floating-point // elements in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_or_pd FORCE_INLINE __m128d _mm_or_pd(__m128d a, __m128d b) { return vreinterpretq_m128d_s64( vorrq_s64(vreinterpretq_s64_m128d(a), vreinterpretq_s64_m128d(b))); } // Compute the bitwise OR of 128 bits (representing integer data) in a and b, // and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_or_si128 FORCE_INLINE __m128i _mm_or_si128(__m128i a, __m128i b) { return vreinterpretq_m128i_s32( vorrq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Convert packed signed 16-bit integers from a and b to packed 8-bit integers // using signed saturation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_packs_epi16 FORCE_INLINE __m128i _mm_packs_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_s8( vcombine_s8(vqmovn_s16(vreinterpretq_s16_m128i(a)), vqmovn_s16(vreinterpretq_s16_m128i(b)))); } // Convert packed signed 32-bit integers from a and b to packed 16-bit integers // using signed saturation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_packs_epi32 FORCE_INLINE __m128i _mm_packs_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_s16( vcombine_s16(vqmovn_s32(vreinterpretq_s32_m128i(a)), vqmovn_s32(vreinterpretq_s32_m128i(b)))); } // Convert packed signed 16-bit integers from a and b to packed 8-bit integers // using unsigned saturation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_packus_epi16 FORCE_INLINE __m128i _mm_packus_epi16(const __m128i a, const __m128i b) { return vreinterpretq_m128i_u8( vcombine_u8(vqmovun_s16(vreinterpretq_s16_m128i(a)), vqmovun_s16(vreinterpretq_s16_m128i(b)))); } // Pause the processor. This is typically used in spin-wait loops and depending // on the x86 processor typical values are in the 40-100 cycle range. The // 'yield' instruction isn't a good fit because it's effectively a nop on most // Arm cores. Experience with several databases has shown has shown an 'isb' is // a reasonable approximation. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_pause FORCE_INLINE void _mm_pause(void) { #if defined(_MSC_VER) __isb(_ARM64_BARRIER_SY); #else __asm__ __volatile__("isb\n"); #endif } // Compute the absolute differences of packed unsigned 8-bit integers in a and // b, then horizontally sum each consecutive 8 differences to produce two // unsigned 16-bit integers, and pack these unsigned 16-bit integers in the low // 16 bits of 64-bit elements in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sad_epu8 FORCE_INLINE __m128i _mm_sad_epu8(__m128i a, __m128i b) { uint16x8_t t = vpaddlq_u8(vabdq_u8((uint8x16_t) a, (uint8x16_t) b)); return vreinterpretq_m128i_u64(vpaddlq_u32(vpaddlq_u16(t))); } // Set packed 16-bit integers in dst with the supplied values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi16 FORCE_INLINE __m128i _mm_set_epi16(short i7, short i6, short i5, short i4, short i3, short i2, short i1, short i0) { int16_t ALIGN_STRUCT(16) data[8] = {i0, i1, i2, i3, i4, i5, i6, i7}; return vreinterpretq_m128i_s16(vld1q_s16(data)); } // Set packed 32-bit integers in dst with the supplied values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi32 FORCE_INLINE __m128i _mm_set_epi32(int i3, int i2, int i1, int i0) { int32_t ALIGN_STRUCT(16) data[4] = {i0, i1, i2, i3}; return vreinterpretq_m128i_s32(vld1q_s32(data)); } // Set packed 64-bit integers in dst with the supplied values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi64 FORCE_INLINE __m128i _mm_set_epi64(__m64 i1, __m64 i2) { return _mm_set_epi64x(vget_lane_s64(i1, 0), vget_lane_s64(i2, 0)); } // Set packed 64-bit integers in dst with the supplied values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi64x FORCE_INLINE __m128i _mm_set_epi64x(int64_t i1, int64_t i2) { return vreinterpretq_m128i_s64( vcombine_s64(vcreate_s64(i2), vcreate_s64(i1))); } // Set packed 8-bit integers in dst with the supplied values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi8 FORCE_INLINE __m128i _mm_set_epi8(signed char b15, signed char b14, signed char b13, signed char b12, signed char b11, signed char b10, signed char b9, signed char b8, signed char b7, signed char b6, signed char b5, signed char b4, signed char b3, signed char b2, signed char b1, signed char b0) { int8_t ALIGN_STRUCT(16) data[16] = {(int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3, (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7, (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11, (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15}; return (__m128i) vld1q_s8(data); } // Set packed double-precision (64-bit) floating-point elements in dst with the // supplied values. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_pd FORCE_INLINE __m128d _mm_set_pd(double e1, double e0) { double ALIGN_STRUCT(16) data[2] = {e0, e1}; #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vld1q_f64((float64_t *) data)); #else return vreinterpretq_m128d_f32(vld1q_f32((float32_t *) data)); #endif } // Broadcast double-precision (64-bit) floating-point value a to all elements of // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_pd1 #define _mm_set_pd1 _mm_set1_pd // Copy double-precision (64-bit) floating-point element a to the lower element // of dst, and zero the upper element. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_sd FORCE_INLINE __m128d _mm_set_sd(double a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vsetq_lane_f64(a, vdupq_n_f64(0), 0)); #else return _mm_set_pd(0, a); #endif } // Broadcast 16-bit integer a to all elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi16 FORCE_INLINE __m128i _mm_set1_epi16(short w) { return vreinterpretq_m128i_s16(vdupq_n_s16(w)); } // Broadcast 32-bit integer a to all elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi32 FORCE_INLINE __m128i _mm_set1_epi32(int _i) { return vreinterpretq_m128i_s32(vdupq_n_s32(_i)); } // Broadcast 64-bit integer a to all elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi64 FORCE_INLINE __m128i _mm_set1_epi64(__m64 _i) { return vreinterpretq_m128i_s64(vdupq_lane_s64(_i, 0)); } // Broadcast 64-bit integer a to all elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi64x FORCE_INLINE __m128i _mm_set1_epi64x(int64_t _i) { return vreinterpretq_m128i_s64(vdupq_n_s64(_i)); } // Broadcast 8-bit integer a to all elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi8 FORCE_INLINE __m128i _mm_set1_epi8(signed char w) { return vreinterpretq_m128i_s8(vdupq_n_s8(w)); } // Broadcast double-precision (64-bit) floating-point value a to all elements of // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_pd FORCE_INLINE __m128d _mm_set1_pd(double d) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vdupq_n_f64(d)); #else return vreinterpretq_m128d_s64(vdupq_n_s64(*(int64_t *) &d)); #endif } // Set packed 16-bit integers in dst with the supplied values in reverse order. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_epi16 FORCE_INLINE __m128i _mm_setr_epi16(short w0, short w1, short w2, short w3, short w4, short w5, short w6, short w7) { int16_t ALIGN_STRUCT(16) data[8] = {w0, w1, w2, w3, w4, w5, w6, w7}; return vreinterpretq_m128i_s16(vld1q_s16((int16_t *) data)); } // Set packed 32-bit integers in dst with the supplied values in reverse order. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_epi32 FORCE_INLINE __m128i _mm_setr_epi32(int i3, int i2, int i1, int i0) { int32_t ALIGN_STRUCT(16) data[4] = {i3, i2, i1, i0}; return vreinterpretq_m128i_s32(vld1q_s32(data)); } // Set packed 64-bit integers in dst with the supplied values in reverse order. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_epi64 FORCE_INLINE __m128i _mm_setr_epi64(__m64 e1, __m64 e0) { return vreinterpretq_m128i_s64(vcombine_s64(e1, e0)); } // Set packed 8-bit integers in dst with the supplied values in reverse order. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_epi8 FORCE_INLINE __m128i _mm_setr_epi8(signed char b0, signed char b1, signed char b2, signed char b3, signed char b4, signed char b5, signed char b6, signed char b7, signed char b8, signed char b9, signed char b10, signed char b11, signed char b12, signed char b13, signed char b14, signed char b15) { int8_t ALIGN_STRUCT(16) data[16] = {(int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3, (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7, (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11, (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15}; return (__m128i) vld1q_s8(data); } // Set packed double-precision (64-bit) floating-point elements in dst with the // supplied values in reverse order. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_pd FORCE_INLINE __m128d _mm_setr_pd(double e1, double e0) { return _mm_set_pd(e0, e1); } // Return vector of type __m128d with all elements set to zero. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setzero_pd FORCE_INLINE __m128d _mm_setzero_pd(void) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vdupq_n_f64(0)); #else return vreinterpretq_m128d_f32(vdupq_n_f32(0)); #endif } // Return vector of type __m128i with all elements set to zero. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setzero_si128 FORCE_INLINE __m128i _mm_setzero_si128(void) { return vreinterpretq_m128i_s32(vdupq_n_s32(0)); } // Shuffle 32-bit integers in a using the control in imm8, and store the results // in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_epi32 // FORCE_INLINE __m128i _mm_shuffle_epi32(__m128i a, // __constrange(0,255) int imm) #if defined(_sse2neon_shuffle) #define _mm_shuffle_epi32(a, imm) \ __extension__({ \ int32x4_t _input = vreinterpretq_s32_m128i(a); \ int32x4_t _shuf = \ vshuffleq_s32(_input, _input, (imm) & (0x3), ((imm) >> 2) & 0x3, \ ((imm) >> 4) & 0x3, ((imm) >> 6) & 0x3); \ vreinterpretq_m128i_s32(_shuf); \ }) #else // generic #define _mm_shuffle_epi32(a, imm) \ _sse2neon_define1( \ __m128i, a, __m128i ret; switch (imm) { \ case _MM_SHUFFLE(1, 0, 3, 2): \ ret = _mm_shuffle_epi_1032(_a); \ break; \ case _MM_SHUFFLE(2, 3, 0, 1): \ ret = _mm_shuffle_epi_2301(_a); \ break; \ case _MM_SHUFFLE(0, 3, 2, 1): \ ret = _mm_shuffle_epi_0321(_a); \ break; \ case _MM_SHUFFLE(2, 1, 0, 3): \ ret = _mm_shuffle_epi_2103(_a); \ break; \ case _MM_SHUFFLE(1, 0, 1, 0): \ ret = _mm_shuffle_epi_1010(_a); \ break; \ case _MM_SHUFFLE(1, 0, 0, 1): \ ret = _mm_shuffle_epi_1001(_a); \ break; \ case _MM_SHUFFLE(0, 1, 0, 1): \ ret = _mm_shuffle_epi_0101(_a); \ break; \ case _MM_SHUFFLE(2, 2, 1, 1): \ ret = _mm_shuffle_epi_2211(_a); \ break; \ case _MM_SHUFFLE(0, 1, 2, 2): \ ret = _mm_shuffle_epi_0122(_a); \ break; \ case _MM_SHUFFLE(3, 3, 3, 2): \ ret = _mm_shuffle_epi_3332(_a); \ break; \ case _MM_SHUFFLE(0, 0, 0, 0): \ ret = _mm_shuffle_epi32_splat(_a, 0); \ break; \ case _MM_SHUFFLE(1, 1, 1, 1): \ ret = _mm_shuffle_epi32_splat(_a, 1); \ break; \ case _MM_SHUFFLE(2, 2, 2, 2): \ ret = _mm_shuffle_epi32_splat(_a, 2); \ break; \ case _MM_SHUFFLE(3, 3, 3, 3): \ ret = _mm_shuffle_epi32_splat(_a, 3); \ break; \ default: \ ret = _mm_shuffle_epi32_default(_a, (imm)); \ break; \ } _sse2neon_return(ret);) #endif // Shuffle double-precision (64-bit) floating-point elements using the control // in imm8, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_pd #ifdef _sse2neon_shuffle #define _mm_shuffle_pd(a, b, imm8) \ vreinterpretq_m128d_s64( \ vshuffleq_s64(vreinterpretq_s64_m128d(a), vreinterpretq_s64_m128d(b), \ imm8 & 0x1, ((imm8 & 0x2) >> 1) + 2)) #else #define _mm_shuffle_pd(a, b, imm8) \ _mm_castsi128_pd(_mm_set_epi64x( \ vgetq_lane_s64(vreinterpretq_s64_m128d(b), (imm8 & 0x2) >> 1), \ vgetq_lane_s64(vreinterpretq_s64_m128d(a), imm8 & 0x1))) #endif // FORCE_INLINE __m128i _mm_shufflehi_epi16(__m128i a, // __constrange(0,255) int imm) #if defined(_sse2neon_shuffle) #define _mm_shufflehi_epi16(a, imm) \ __extension__({ \ int16x8_t _input = vreinterpretq_s16_m128i(a); \ int16x8_t _shuf = \ vshuffleq_s16(_input, _input, 0, 1, 2, 3, ((imm) & (0x3)) + 4, \ (((imm) >> 2) & 0x3) + 4, (((imm) >> 4) & 0x3) + 4, \ (((imm) >> 6) & 0x3) + 4); \ vreinterpretq_m128i_s16(_shuf); \ }) #else // generic #define _mm_shufflehi_epi16(a, imm) _mm_shufflehi_epi16_function((a), (imm)) #endif // FORCE_INLINE __m128i _mm_shufflelo_epi16(__m128i a, // __constrange(0,255) int imm) #if defined(_sse2neon_shuffle) #define _mm_shufflelo_epi16(a, imm) \ __extension__({ \ int16x8_t _input = vreinterpretq_s16_m128i(a); \ int16x8_t _shuf = vshuffleq_s16( \ _input, _input, ((imm) & (0x3)), (((imm) >> 2) & 0x3), \ (((imm) >> 4) & 0x3), (((imm) >> 6) & 0x3), 4, 5, 6, 7); \ vreinterpretq_m128i_s16(_shuf); \ }) #else // generic #define _mm_shufflelo_epi16(a, imm) _mm_shufflelo_epi16_function((a), (imm)) #endif // Shift packed 16-bit integers in a left by count while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sll_epi16 FORCE_INLINE __m128i _mm_sll_epi16(__m128i a, __m128i count) { uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); if (_sse2neon_unlikely(c & ~15)) return _mm_setzero_si128(); int16x8_t vc = vdupq_n_s16((int16_t) c); return vreinterpretq_m128i_s16(vshlq_s16(vreinterpretq_s16_m128i(a), vc)); } // Shift packed 32-bit integers in a left by count while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sll_epi32 FORCE_INLINE __m128i _mm_sll_epi32(__m128i a, __m128i count) { uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); if (_sse2neon_unlikely(c & ~31)) return _mm_setzero_si128(); int32x4_t vc = vdupq_n_s32((int32_t) c); return vreinterpretq_m128i_s32(vshlq_s32(vreinterpretq_s32_m128i(a), vc)); } // Shift packed 64-bit integers in a left by count while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sll_epi64 FORCE_INLINE __m128i _mm_sll_epi64(__m128i a, __m128i count) { uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); if (_sse2neon_unlikely(c & ~63)) return _mm_setzero_si128(); int64x2_t vc = vdupq_n_s64((int64_t) c); return vreinterpretq_m128i_s64(vshlq_s64(vreinterpretq_s64_m128i(a), vc)); } // Shift packed 16-bit integers in a left by imm8 while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_slli_epi16 FORCE_INLINE __m128i _mm_slli_epi16(__m128i a, int imm) { if (_sse2neon_unlikely(imm & ~15)) return _mm_setzero_si128(); return vreinterpretq_m128i_s16( vshlq_s16(vreinterpretq_s16_m128i(a), vdupq_n_s16(imm))); } // Shift packed 32-bit integers in a left by imm8 while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_slli_epi32 FORCE_INLINE __m128i _mm_slli_epi32(__m128i a, int imm) { if (_sse2neon_unlikely(imm & ~31)) return _mm_setzero_si128(); return vreinterpretq_m128i_s32( vshlq_s32(vreinterpretq_s32_m128i(a), vdupq_n_s32(imm))); } // Shift packed 64-bit integers in a left by imm8 while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_slli_epi64 FORCE_INLINE __m128i _mm_slli_epi64(__m128i a, int imm) { if (_sse2neon_unlikely(imm & ~63)) return _mm_setzero_si128(); return vreinterpretq_m128i_s64( vshlq_s64(vreinterpretq_s64_m128i(a), vdupq_n_s64(imm))); } // Shift a left by imm8 bytes while shifting in zeros, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_slli_si128 #define _mm_slli_si128(a, imm) \ _sse2neon_define1( \ __m128i, a, int8x16_t ret; \ if (_sse2neon_unlikely(imm == 0)) ret = vreinterpretq_s8_m128i(_a); \ else if (_sse2neon_unlikely((imm) & ~15)) ret = vdupq_n_s8(0); \ else ret = vextq_s8(vdupq_n_s8(0), vreinterpretq_s8_m128i(_a), \ ((imm <= 0 || imm > 15) ? 0 : (16 - imm))); \ _sse2neon_return(vreinterpretq_m128i_s8(ret));) // Compute the square root of packed double-precision (64-bit) floating-point // elements in a, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sqrt_pd FORCE_INLINE __m128d _mm_sqrt_pd(__m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vsqrtq_f64(vreinterpretq_f64_m128d(a))); #else double a0 = sqrt(((double *) &a)[0]); double a1 = sqrt(((double *) &a)[1]); return _mm_set_pd(a1, a0); #endif } // Compute the square root of the lower double-precision (64-bit) floating-point // element in b, store the result in the lower element of dst, and copy the // upper element from a to the upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sqrt_sd FORCE_INLINE __m128d _mm_sqrt_sd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return _mm_move_sd(a, _mm_sqrt_pd(b)); #else return _mm_set_pd(((double *) &a)[1], sqrt(((double *) &b)[0])); #endif } // Shift packed 16-bit integers in a right by count while shifting in sign bits, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sra_epi16 FORCE_INLINE __m128i _mm_sra_epi16(__m128i a, __m128i count) { int64_t c = vgetq_lane_s64(count, 0); if (_sse2neon_unlikely(c & ~15)) return _mm_cmplt_epi16(a, _mm_setzero_si128()); return vreinterpretq_m128i_s16( vshlq_s16((int16x8_t) a, vdupq_n_s16((int) -c))); } // Shift packed 32-bit integers in a right by count while shifting in sign bits, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sra_epi32 FORCE_INLINE __m128i _mm_sra_epi32(__m128i a, __m128i count) { int64_t c = vgetq_lane_s64(count, 0); if (_sse2neon_unlikely(c & ~31)) return _mm_cmplt_epi32(a, _mm_setzero_si128()); return vreinterpretq_m128i_s32( vshlq_s32((int32x4_t) a, vdupq_n_s32((int) -c))); } // Shift packed 16-bit integers in a right by imm8 while shifting in sign // bits, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srai_epi16 FORCE_INLINE __m128i _mm_srai_epi16(__m128i a, int imm) { const int count = (imm & ~15) ? 15 : imm; return (__m128i) vshlq_s16((int16x8_t) a, vdupq_n_s16(-count)); } // Shift packed 32-bit integers in a right by imm8 while shifting in sign bits, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srai_epi32 // FORCE_INLINE __m128i _mm_srai_epi32(__m128i a, __constrange(0,255) int imm) #define _mm_srai_epi32(a, imm) \ _sse2neon_define0( \ __m128i, a, __m128i ret; if (_sse2neon_unlikely((imm) == 0)) { \ ret = _a; \ } else if (_sse2neon_likely(0 < (imm) && (imm) < 32)) { \ ret = vreinterpretq_m128i_s32( \ vshlq_s32(vreinterpretq_s32_m128i(_a), vdupq_n_s32(-(imm)))); \ } else { \ ret = vreinterpretq_m128i_s32( \ vshrq_n_s32(vreinterpretq_s32_m128i(_a), 31)); \ } _sse2neon_return(ret);) // Shift packed 16-bit integers in a right by count while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srl_epi16 FORCE_INLINE __m128i _mm_srl_epi16(__m128i a, __m128i count) { uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); if (_sse2neon_unlikely(c & ~15)) return _mm_setzero_si128(); int16x8_t vc = vdupq_n_s16(-(int16_t) c); return vreinterpretq_m128i_u16(vshlq_u16(vreinterpretq_u16_m128i(a), vc)); } // Shift packed 32-bit integers in a right by count while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srl_epi32 FORCE_INLINE __m128i _mm_srl_epi32(__m128i a, __m128i count) { uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); if (_sse2neon_unlikely(c & ~31)) return _mm_setzero_si128(); int32x4_t vc = vdupq_n_s32(-(int32_t) c); return vreinterpretq_m128i_u32(vshlq_u32(vreinterpretq_u32_m128i(a), vc)); } // Shift packed 64-bit integers in a right by count while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srl_epi64 FORCE_INLINE __m128i _mm_srl_epi64(__m128i a, __m128i count) { uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); if (_sse2neon_unlikely(c & ~63)) return _mm_setzero_si128(); int64x2_t vc = vdupq_n_s64(-(int64_t) c); return vreinterpretq_m128i_u64(vshlq_u64(vreinterpretq_u64_m128i(a), vc)); } // Shift packed 16-bit integers in a right by imm8 while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srli_epi16 #define _mm_srli_epi16(a, imm) \ _sse2neon_define0( \ __m128i, a, __m128i ret; if (_sse2neon_unlikely((imm) & ~15)) { \ ret = _mm_setzero_si128(); \ } else { \ ret = vreinterpretq_m128i_u16( \ vshlq_u16(vreinterpretq_u16_m128i(_a), vdupq_n_s16(-(imm)))); \ } _sse2neon_return(ret);) // Shift packed 32-bit integers in a right by imm8 while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srli_epi32 // FORCE_INLINE __m128i _mm_srli_epi32(__m128i a, __constrange(0,255) int imm) #define _mm_srli_epi32(a, imm) \ _sse2neon_define0( \ __m128i, a, __m128i ret; if (_sse2neon_unlikely((imm) & ~31)) { \ ret = _mm_setzero_si128(); \ } else { \ ret = vreinterpretq_m128i_u32( \ vshlq_u32(vreinterpretq_u32_m128i(_a), vdupq_n_s32(-(imm)))); \ } _sse2neon_return(ret);) // Shift packed 64-bit integers in a right by imm8 while shifting in zeros, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srli_epi64 #define _mm_srli_epi64(a, imm) \ _sse2neon_define0( \ __m128i, a, __m128i ret; if (_sse2neon_unlikely((imm) & ~63)) { \ ret = _mm_setzero_si128(); \ } else { \ ret = vreinterpretq_m128i_u64( \ vshlq_u64(vreinterpretq_u64_m128i(_a), vdupq_n_s64(-(imm)))); \ } _sse2neon_return(ret);) // Shift a right by imm8 bytes while shifting in zeros, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srli_si128 #define _mm_srli_si128(a, imm) \ _sse2neon_define1( \ __m128i, a, int8x16_t ret; \ if (_sse2neon_unlikely((imm) & ~15)) ret = vdupq_n_s8(0); \ else ret = vextq_s8(vreinterpretq_s8_m128i(_a), vdupq_n_s8(0), \ (imm > 15 ? 0 : imm)); \ _sse2neon_return(vreinterpretq_m128i_s8(ret));) // Store 128-bits (composed of 2 packed double-precision (64-bit) floating-point // elements) from a into memory. mem_addr must be aligned on a 16-byte boundary // or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_pd FORCE_INLINE void _mm_store_pd(double *mem_addr, __m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) vst1q_f64((float64_t *) mem_addr, vreinterpretq_f64_m128d(a)); #else vst1q_f32((float32_t *) mem_addr, vreinterpretq_f32_m128d(a)); #endif } // Store the lower double-precision (64-bit) floating-point element from a into // 2 contiguous elements in memory. mem_addr must be aligned on a 16-byte // boundary or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_pd1 FORCE_INLINE void _mm_store_pd1(double *mem_addr, __m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) float64x1_t a_low = vget_low_f64(vreinterpretq_f64_m128d(a)); vst1q_f64((float64_t *) mem_addr, vreinterpretq_f64_m128d(vcombine_f64(a_low, a_low))); #else float32x2_t a_low = vget_low_f32(vreinterpretq_f32_m128d(a)); vst1q_f32((float32_t *) mem_addr, vreinterpretq_f32_m128d(vcombine_f32(a_low, a_low))); #endif } // Store the lower double-precision (64-bit) floating-point element from a into // memory. mem_addr does not need to be aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_store_sd FORCE_INLINE void _mm_store_sd(double *mem_addr, __m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) vst1_f64((float64_t *) mem_addr, vget_low_f64(vreinterpretq_f64_m128d(a))); #else vst1_u64((uint64_t *) mem_addr, vget_low_u64(vreinterpretq_u64_m128d(a))); #endif } // Store 128-bits of integer data from a into memory. mem_addr must be aligned // on a 16-byte boundary or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_si128 FORCE_INLINE void _mm_store_si128(__m128i *p, __m128i a) { vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a)); } // Store the lower double-precision (64-bit) floating-point element from a into // 2 contiguous elements in memory. mem_addr must be aligned on a 16-byte // boundary or a general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#expand=9,526,5601&text=_mm_store1_pd #define _mm_store1_pd _mm_store_pd1 // Store the upper double-precision (64-bit) floating-point element from a into // memory. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeh_pd FORCE_INLINE void _mm_storeh_pd(double *mem_addr, __m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) vst1_f64((float64_t *) mem_addr, vget_high_f64(vreinterpretq_f64_m128d(a))); #else vst1_f32((float32_t *) mem_addr, vget_high_f32(vreinterpretq_f32_m128d(a))); #endif } // Store 64-bit integer from the first element of a into memory. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storel_epi64 FORCE_INLINE void _mm_storel_epi64(__m128i *a, __m128i b) { vst1_u64((uint64_t *) a, vget_low_u64(vreinterpretq_u64_m128i(b))); } // Store the lower double-precision (64-bit) floating-point element from a into // memory. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storel_pd FORCE_INLINE void _mm_storel_pd(double *mem_addr, __m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) vst1_f64((float64_t *) mem_addr, vget_low_f64(vreinterpretq_f64_m128d(a))); #else vst1_f32((float32_t *) mem_addr, vget_low_f32(vreinterpretq_f32_m128d(a))); #endif } // Store 2 double-precision (64-bit) floating-point elements from a into memory // in reverse order. mem_addr must be aligned on a 16-byte boundary or a // general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storer_pd FORCE_INLINE void _mm_storer_pd(double *mem_addr, __m128d a) { float32x4_t f = vreinterpretq_f32_m128d(a); _mm_store_pd(mem_addr, vreinterpretq_m128d_f32(vextq_f32(f, f, 2))); } // Store 128-bits (composed of 2 packed double-precision (64-bit) floating-point // elements) from a into memory. mem_addr does not need to be aligned on any // particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_pd FORCE_INLINE void _mm_storeu_pd(double *mem_addr, __m128d a) { _mm_store_pd(mem_addr, a); } // Store 128-bits of integer data from a into memory. mem_addr does not need to // be aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si128 FORCE_INLINE void _mm_storeu_si128(__m128i *p, __m128i a) { vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a)); } // Store 32-bit integer from the first element of a into memory. mem_addr does // not need to be aligned on any particular boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si32 FORCE_INLINE void _mm_storeu_si32(void *p, __m128i a) { vst1q_lane_s32((int32_t *) p, vreinterpretq_s32_m128i(a), 0); } // Store 128-bits (composed of 2 packed double-precision (64-bit) floating-point // elements) from a into memory using a non-temporal memory hint. mem_addr must // be aligned on a 16-byte boundary or a general-protection exception may be // generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_pd FORCE_INLINE void _mm_stream_pd(double *p, __m128d a) { #if __has_builtin(__builtin_nontemporal_store) __builtin_nontemporal_store(a, (__m128d *) p); #elif defined(__aarch64__) || defined(_M_ARM64) vst1q_f64(p, vreinterpretq_f64_m128d(a)); #else vst1q_s64((int64_t *) p, vreinterpretq_s64_m128d(a)); #endif } // Store 128-bits of integer data from a into memory using a non-temporal memory // hint. mem_addr must be aligned on a 16-byte boundary or a general-protection // exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_si128 FORCE_INLINE void _mm_stream_si128(__m128i *p, __m128i a) { #if __has_builtin(__builtin_nontemporal_store) __builtin_nontemporal_store(a, p); #else vst1q_s64((int64_t *) p, vreinterpretq_s64_m128i(a)); #endif } // Store 32-bit integer a into memory using a non-temporal hint to minimize // cache pollution. If the cache line containing address mem_addr is already in // the cache, the cache will be updated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_si32 FORCE_INLINE void _mm_stream_si32(int *p, int a) { vst1q_lane_s32((int32_t *) p, vdupq_n_s32(a), 0); } // Store 64-bit integer a into memory using a non-temporal hint to minimize // cache pollution. If the cache line containing address mem_addr is already in // the cache, the cache will be updated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_si64 FORCE_INLINE void _mm_stream_si64(__int64 *p, __int64 a) { vst1_s64((int64_t *) p, vdup_n_s64((int64_t) a)); } // Subtract packed 16-bit integers in b from packed 16-bit integers in a, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_epi16 FORCE_INLINE __m128i _mm_sub_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_s16( vsubq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Subtract packed 32-bit integers in b from packed 32-bit integers in a, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_epi32 FORCE_INLINE __m128i _mm_sub_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_s32( vsubq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Subtract packed 64-bit integers in b from packed 64-bit integers in a, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_epi64 FORCE_INLINE __m128i _mm_sub_epi64(__m128i a, __m128i b) { return vreinterpretq_m128i_s64( vsubq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); } // Subtract packed 8-bit integers in b from packed 8-bit integers in a, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_epi8 FORCE_INLINE __m128i _mm_sub_epi8(__m128i a, __m128i b) { return vreinterpretq_m128i_s8( vsubq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); } // Subtract packed double-precision (64-bit) floating-point elements in b from // packed double-precision (64-bit) floating-point elements in a, and store the // results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_sub_pd FORCE_INLINE __m128d _mm_sub_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vsubq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else double *da = (double *) &a; double *db = (double *) &b; double c[2]; c[0] = da[0] - db[0]; c[1] = da[1] - db[1]; return vld1q_f32((float32_t *) c); #endif } // Subtract the lower double-precision (64-bit) floating-point element in b from // the lower double-precision (64-bit) floating-point element in a, store the // result in the lower element of dst, and copy the upper element from a to the // upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_sd FORCE_INLINE __m128d _mm_sub_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_sub_pd(a, b)); } // Subtract 64-bit integer b from 64-bit integer a, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_si64 FORCE_INLINE __m64 _mm_sub_si64(__m64 a, __m64 b) { return vreinterpret_m64_s64( vsub_s64(vreinterpret_s64_m64(a), vreinterpret_s64_m64(b))); } // Subtract packed signed 16-bit integers in b from packed 16-bit integers in a // using saturation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_subs_epi16 FORCE_INLINE __m128i _mm_subs_epi16(__m128i a, __m128i b) { return vreinterpretq_m128i_s16( vqsubq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); } // Subtract packed signed 8-bit integers in b from packed 8-bit integers in a // using saturation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_subs_epi8 FORCE_INLINE __m128i _mm_subs_epi8(__m128i a, __m128i b) { return vreinterpretq_m128i_s8( vqsubq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); } // Subtract packed unsigned 16-bit integers in b from packed unsigned 16-bit // integers in a using saturation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_subs_epu16 FORCE_INLINE __m128i _mm_subs_epu16(__m128i a, __m128i b) { return vreinterpretq_m128i_u16( vqsubq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); } // Subtract packed unsigned 8-bit integers in b from packed unsigned 8-bit // integers in a using saturation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_subs_epu8 FORCE_INLINE __m128i _mm_subs_epu8(__m128i a, __m128i b) { return vreinterpretq_m128i_u8( vqsubq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); } #define _mm_ucomieq_sd _mm_comieq_sd #define _mm_ucomige_sd _mm_comige_sd #define _mm_ucomigt_sd _mm_comigt_sd #define _mm_ucomile_sd _mm_comile_sd #define _mm_ucomilt_sd _mm_comilt_sd #define _mm_ucomineq_sd _mm_comineq_sd // Return vector of type __m128d with undefined elements. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_undefined_pd FORCE_INLINE __m128d _mm_undefined_pd(void) { #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wuninitialized" #endif __m128d a; #if defined(_MSC_VER) a = _mm_setzero_pd(); #endif return a; #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif } // Unpack and interleave 16-bit integers from the high half of a and b, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_epi16 FORCE_INLINE __m128i _mm_unpackhi_epi16(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s16( vzip2q_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); #else int16x4_t a1 = vget_high_s16(vreinterpretq_s16_m128i(a)); int16x4_t b1 = vget_high_s16(vreinterpretq_s16_m128i(b)); int16x4x2_t result = vzip_s16(a1, b1); return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1])); #endif } // Unpack and interleave 32-bit integers from the high half of a and b, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_epi32 FORCE_INLINE __m128i _mm_unpackhi_epi32(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s32( vzip2q_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); #else int32x2_t a1 = vget_high_s32(vreinterpretq_s32_m128i(a)); int32x2_t b1 = vget_high_s32(vreinterpretq_s32_m128i(b)); int32x2x2_t result = vzip_s32(a1, b1); return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1])); #endif } // Unpack and interleave 64-bit integers from the high half of a and b, and // store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_epi64 FORCE_INLINE __m128i _mm_unpackhi_epi64(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s64( vzip2q_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); #else int64x1_t a_h = vget_high_s64(vreinterpretq_s64_m128i(a)); int64x1_t b_h = vget_high_s64(vreinterpretq_s64_m128i(b)); return vreinterpretq_m128i_s64(vcombine_s64(a_h, b_h)); #endif } // Unpack and interleave 8-bit integers from the high half of a and b, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_epi8 FORCE_INLINE __m128i _mm_unpackhi_epi8(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s8( vzip2q_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); #else int8x8_t a1 = vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(a))); int8x8_t b1 = vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(b))); int8x8x2_t result = vzip_s8(a1, b1); return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1])); #endif } // Unpack and interleave double-precision (64-bit) floating-point elements from // the high half of a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_pd FORCE_INLINE __m128d _mm_unpackhi_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vzip2q_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else return vreinterpretq_m128d_s64( vcombine_s64(vget_high_s64(vreinterpretq_s64_m128d(a)), vget_high_s64(vreinterpretq_s64_m128d(b)))); #endif } // Unpack and interleave 16-bit integers from the low half of a and b, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_epi16 FORCE_INLINE __m128i _mm_unpacklo_epi16(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s16( vzip1q_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); #else int16x4_t a1 = vget_low_s16(vreinterpretq_s16_m128i(a)); int16x4_t b1 = vget_low_s16(vreinterpretq_s16_m128i(b)); int16x4x2_t result = vzip_s16(a1, b1); return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1])); #endif } // Unpack and interleave 32-bit integers from the low half of a and b, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_epi32 FORCE_INLINE __m128i _mm_unpacklo_epi32(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s32( vzip1q_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); #else int32x2_t a1 = vget_low_s32(vreinterpretq_s32_m128i(a)); int32x2_t b1 = vget_low_s32(vreinterpretq_s32_m128i(b)); int32x2x2_t result = vzip_s32(a1, b1); return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1])); #endif } // Unpack and interleave 64-bit integers from the low half of a and b, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_epi64 FORCE_INLINE __m128i _mm_unpacklo_epi64(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s64( vzip1q_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); #else int64x1_t a_l = vget_low_s64(vreinterpretq_s64_m128i(a)); int64x1_t b_l = vget_low_s64(vreinterpretq_s64_m128i(b)); return vreinterpretq_m128i_s64(vcombine_s64(a_l, b_l)); #endif } // Unpack and interleave 8-bit integers from the low half of a and b, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_epi8 FORCE_INLINE __m128i _mm_unpacklo_epi8(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s8( vzip1q_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); #else int8x8_t a1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(a))); int8x8_t b1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(b))); int8x8x2_t result = vzip_s8(a1, b1); return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1])); #endif } // Unpack and interleave double-precision (64-bit) floating-point elements from // the low half of a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_pd FORCE_INLINE __m128d _mm_unpacklo_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vzip1q_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else return vreinterpretq_m128d_s64( vcombine_s64(vget_low_s64(vreinterpretq_s64_m128d(a)), vget_low_s64(vreinterpretq_s64_m128d(b)))); #endif } // Compute the bitwise XOR of packed double-precision (64-bit) floating-point // elements in a and b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_xor_pd FORCE_INLINE __m128d _mm_xor_pd(__m128d a, __m128d b) { return vreinterpretq_m128d_s64( veorq_s64(vreinterpretq_s64_m128d(a), vreinterpretq_s64_m128d(b))); } // Compute the bitwise XOR of 128 bits (representing integer data) in a and b, // and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_xor_si128 FORCE_INLINE __m128i _mm_xor_si128(__m128i a, __m128i b) { return vreinterpretq_m128i_s32( veorq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } /* SSE3 */ // Alternatively add and subtract packed double-precision (64-bit) // floating-point elements in a to/from packed elements in b, and store the // results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_addsub_pd FORCE_INLINE __m128d _mm_addsub_pd(__m128d a, __m128d b) { _sse2neon_const __m128d mask = _mm_set_pd(1.0f, -1.0f); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vfmaq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b), vreinterpretq_f64_m128d(mask))); #else return _mm_add_pd(_mm_mul_pd(b, mask), a); #endif } // Alternatively add and subtract packed single-precision (32-bit) // floating-point elements in a to/from packed elements in b, and store the // results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=addsub_ps FORCE_INLINE __m128 _mm_addsub_ps(__m128 a, __m128 b) { _sse2neon_const __m128 mask = _mm_setr_ps(-1.0f, 1.0f, -1.0f, 1.0f); #if (defined(__aarch64__) || defined(_M_ARM64)) || \ defined(__ARM_FEATURE_FMA) /* VFPv4+ */ return vreinterpretq_m128_f32(vfmaq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(mask), vreinterpretq_f32_m128(b))); #else return _mm_add_ps(_mm_mul_ps(b, mask), a); #endif } // Horizontally add adjacent pairs of double-precision (64-bit) floating-point // elements in a and b, and pack the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_pd FORCE_INLINE __m128d _mm_hadd_pd(__m128d a, __m128d b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vpaddq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); #else double *da = (double *) &a; double *db = (double *) &b; double c[] = {da[0] + da[1], db[0] + db[1]}; return vreinterpretq_m128d_u64(vld1q_u64((uint64_t *) c)); #endif } // Horizontally add adjacent pairs of single-precision (32-bit) floating-point // elements in a and b, and pack the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_ps FORCE_INLINE __m128 _mm_hadd_ps(__m128 a, __m128 b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128_f32( vpaddq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); #else float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); return vreinterpretq_m128_f32( vcombine_f32(vpadd_f32(a10, a32), vpadd_f32(b10, b32))); #endif } // Horizontally subtract adjacent pairs of double-precision (64-bit) // floating-point elements in a and b, and pack the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_pd FORCE_INLINE __m128d _mm_hsub_pd(__m128d _a, __m128d _b) { #if defined(__aarch64__) || defined(_M_ARM64) float64x2_t a = vreinterpretq_f64_m128d(_a); float64x2_t b = vreinterpretq_f64_m128d(_b); return vreinterpretq_m128d_f64( vsubq_f64(vuzp1q_f64(a, b), vuzp2q_f64(a, b))); #else double *da = (double *) &_a; double *db = (double *) &_b; double c[] = {da[0] - da[1], db[0] - db[1]}; return vreinterpretq_m128d_u64(vld1q_u64((uint64_t *) c)); #endif } // Horizontally subtract adjacent pairs of single-precision (32-bit) // floating-point elements in a and b, and pack the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_ps FORCE_INLINE __m128 _mm_hsub_ps(__m128 _a, __m128 _b) { float32x4_t a = vreinterpretq_f32_m128(_a); float32x4_t b = vreinterpretq_f32_m128(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128_f32( vsubq_f32(vuzp1q_f32(a, b), vuzp2q_f32(a, b))); #else float32x4x2_t c = vuzpq_f32(a, b); return vreinterpretq_m128_f32(vsubq_f32(c.val[0], c.val[1])); #endif } // Load 128-bits of integer data from unaligned memory into dst. This intrinsic // may perform better than _mm_loadu_si128 when the data crosses a cache line // boundary. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_lddqu_si128 #define _mm_lddqu_si128 _mm_loadu_si128 // Load a double-precision (64-bit) floating-point element from memory into both // elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loaddup_pd #define _mm_loaddup_pd _mm_load1_pd // Duplicate the low double-precision (64-bit) floating-point element from a, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movedup_pd FORCE_INLINE __m128d _mm_movedup_pd(__m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64( vdupq_laneq_f64(vreinterpretq_f64_m128d(a), 0)); #else return vreinterpretq_m128d_u64( vdupq_n_u64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0))); #endif } // Duplicate odd-indexed single-precision (32-bit) floating-point elements // from a, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movehdup_ps FORCE_INLINE __m128 _mm_movehdup_ps(__m128 a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128_f32( vtrn2q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a))); #elif defined(_sse2neon_shuffle) return vreinterpretq_m128_f32(vshuffleq_s32( vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 1, 1, 3, 3)); #else float32_t a1 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 1); float32_t a3 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 3); float ALIGN_STRUCT(16) data[4] = {a1, a1, a3, a3}; return vreinterpretq_m128_f32(vld1q_f32(data)); #endif } // Duplicate even-indexed single-precision (32-bit) floating-point elements // from a, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_moveldup_ps FORCE_INLINE __m128 _mm_moveldup_ps(__m128 a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128_f32( vtrn1q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a))); #elif defined(_sse2neon_shuffle) return vreinterpretq_m128_f32(vshuffleq_s32( vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 0, 0, 2, 2)); #else float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); float32_t a2 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 2); float ALIGN_STRUCT(16) data[4] = {a0, a0, a2, a2}; return vreinterpretq_m128_f32(vld1q_f32(data)); #endif } /* SSSE3 */ // Compute the absolute value of packed signed 16-bit integers in a, and store // the unsigned results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_epi16 FORCE_INLINE __m128i _mm_abs_epi16(__m128i a) { return vreinterpretq_m128i_s16(vabsq_s16(vreinterpretq_s16_m128i(a))); } // Compute the absolute value of packed signed 32-bit integers in a, and store // the unsigned results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_epi32 FORCE_INLINE __m128i _mm_abs_epi32(__m128i a) { return vreinterpretq_m128i_s32(vabsq_s32(vreinterpretq_s32_m128i(a))); } // Compute the absolute value of packed signed 8-bit integers in a, and store // the unsigned results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_epi8 FORCE_INLINE __m128i _mm_abs_epi8(__m128i a) { return vreinterpretq_m128i_s8(vabsq_s8(vreinterpretq_s8_m128i(a))); } // Compute the absolute value of packed signed 16-bit integers in a, and store // the unsigned results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_pi16 FORCE_INLINE __m64 _mm_abs_pi16(__m64 a) { return vreinterpret_m64_s16(vabs_s16(vreinterpret_s16_m64(a))); } // Compute the absolute value of packed signed 32-bit integers in a, and store // the unsigned results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_pi32 FORCE_INLINE __m64 _mm_abs_pi32(__m64 a) { return vreinterpret_m64_s32(vabs_s32(vreinterpret_s32_m64(a))); } // Compute the absolute value of packed signed 8-bit integers in a, and store // the unsigned results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_pi8 FORCE_INLINE __m64 _mm_abs_pi8(__m64 a) { return vreinterpret_m64_s8(vabs_s8(vreinterpret_s8_m64(a))); } // Concatenate 16-byte blocks in a and b into a 32-byte temporary result, shift // the result right by imm8 bytes, and store the low 16 bytes in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_alignr_epi8 #if defined(__GNUC__) && !defined(__clang__) #define _mm_alignr_epi8(a, b, imm) \ __extension__({ \ uint8x16_t _a = vreinterpretq_u8_m128i(a); \ uint8x16_t _b = vreinterpretq_u8_m128i(b); \ __m128i ret; \ if (_sse2neon_unlikely((imm) & ~31)) \ ret = vreinterpretq_m128i_u8(vdupq_n_u8(0)); \ else if (imm >= 16) \ ret = _mm_srli_si128(a, imm >= 16 ? imm - 16 : 0); \ else \ ret = \ vreinterpretq_m128i_u8(vextq_u8(_b, _a, imm < 16 ? imm : 0)); \ ret; \ }) #else #define _mm_alignr_epi8(a, b, imm) \ _sse2neon_define2( \ __m128i, a, b, uint8x16_t __a = vreinterpretq_u8_m128i(_a); \ uint8x16_t __b = vreinterpretq_u8_m128i(_b); __m128i ret; \ if (_sse2neon_unlikely((imm) & ~31)) ret = \ vreinterpretq_m128i_u8(vdupq_n_u8(0)); \ else if (imm >= 16) ret = \ _mm_srli_si128(_a, imm >= 16 ? imm - 16 : 0); \ else ret = \ vreinterpretq_m128i_u8(vextq_u8(__b, __a, imm < 16 ? imm : 0)); \ _sse2neon_return(ret);) #endif // Concatenate 8-byte blocks in a and b into a 16-byte temporary result, shift // the result right by imm8 bytes, and store the low 8 bytes in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_alignr_pi8 #define _mm_alignr_pi8(a, b, imm) \ _sse2neon_define2( \ __m64, a, b, __m64 ret; if (_sse2neon_unlikely((imm) >= 16)) { \ ret = vreinterpret_m64_s8(vdup_n_s8(0)); \ } else { \ uint8x8_t tmp_low; \ uint8x8_t tmp_high; \ if ((imm) >= 8) { \ const int idx = (imm) -8; \ tmp_low = vreinterpret_u8_m64(_a); \ tmp_high = vdup_n_u8(0); \ ret = vreinterpret_m64_u8(vext_u8(tmp_low, tmp_high, idx)); \ } else { \ const int idx = (imm); \ tmp_low = vreinterpret_u8_m64(_b); \ tmp_high = vreinterpret_u8_m64(_a); \ ret = vreinterpret_m64_u8(vext_u8(tmp_low, tmp_high, idx)); \ } \ } _sse2neon_return(ret);) // Horizontally add adjacent pairs of 16-bit integers in a and b, and pack the // signed 16-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_epi16 FORCE_INLINE __m128i _mm_hadd_epi16(__m128i _a, __m128i _b) { int16x8_t a = vreinterpretq_s16_m128i(_a); int16x8_t b = vreinterpretq_s16_m128i(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s16(vpaddq_s16(a, b)); #else return vreinterpretq_m128i_s16( vcombine_s16(vpadd_s16(vget_low_s16(a), vget_high_s16(a)), vpadd_s16(vget_low_s16(b), vget_high_s16(b)))); #endif } // Horizontally add adjacent pairs of 32-bit integers in a and b, and pack the // signed 32-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_epi32 FORCE_INLINE __m128i _mm_hadd_epi32(__m128i _a, __m128i _b) { int32x4_t a = vreinterpretq_s32_m128i(_a); int32x4_t b = vreinterpretq_s32_m128i(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s32(vpaddq_s32(a, b)); #else return vreinterpretq_m128i_s32( vcombine_s32(vpadd_s32(vget_low_s32(a), vget_high_s32(a)), vpadd_s32(vget_low_s32(b), vget_high_s32(b)))); #endif } // Horizontally add adjacent pairs of 16-bit integers in a and b, and pack the // signed 16-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_pi16 FORCE_INLINE __m64 _mm_hadd_pi16(__m64 a, __m64 b) { return vreinterpret_m64_s16( vpadd_s16(vreinterpret_s16_m64(a), vreinterpret_s16_m64(b))); } // Horizontally add adjacent pairs of 32-bit integers in a and b, and pack the // signed 32-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_pi32 FORCE_INLINE __m64 _mm_hadd_pi32(__m64 a, __m64 b) { return vreinterpret_m64_s32( vpadd_s32(vreinterpret_s32_m64(a), vreinterpret_s32_m64(b))); } // Horizontally add adjacent pairs of signed 16-bit integers in a and b using // saturation, and pack the signed 16-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadds_epi16 FORCE_INLINE __m128i _mm_hadds_epi16(__m128i _a, __m128i _b) { #if defined(__aarch64__) || defined(_M_ARM64) int16x8_t a = vreinterpretq_s16_m128i(_a); int16x8_t b = vreinterpretq_s16_m128i(_b); return vreinterpretq_s64_s16( vqaddq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b))); #else int32x4_t a = vreinterpretq_s32_m128i(_a); int32x4_t b = vreinterpretq_s32_m128i(_b); // Interleave using vshrn/vmovn // [a0|a2|a4|a6|b0|b2|b4|b6] // [a1|a3|a5|a7|b1|b3|b5|b7] int16x8_t ab0246 = vcombine_s16(vmovn_s32(a), vmovn_s32(b)); int16x8_t ab1357 = vcombine_s16(vshrn_n_s32(a, 16), vshrn_n_s32(b, 16)); // Saturated add return vreinterpretq_m128i_s16(vqaddq_s16(ab0246, ab1357)); #endif } // Horizontally add adjacent pairs of signed 16-bit integers in a and b using // saturation, and pack the signed 16-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadds_pi16 FORCE_INLINE __m64 _mm_hadds_pi16(__m64 _a, __m64 _b) { int16x4_t a = vreinterpret_s16_m64(_a); int16x4_t b = vreinterpret_s16_m64(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpret_s64_s16(vqadd_s16(vuzp1_s16(a, b), vuzp2_s16(a, b))); #else int16x4x2_t res = vuzp_s16(a, b); return vreinterpret_s64_s16(vqadd_s16(res.val[0], res.val[1])); #endif } // Horizontally subtract adjacent pairs of 16-bit integers in a and b, and pack // the signed 16-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_epi16 FORCE_INLINE __m128i _mm_hsub_epi16(__m128i _a, __m128i _b) { int16x8_t a = vreinterpretq_s16_m128i(_a); int16x8_t b = vreinterpretq_s16_m128i(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s16( vsubq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b))); #else int16x8x2_t c = vuzpq_s16(a, b); return vreinterpretq_m128i_s16(vsubq_s16(c.val[0], c.val[1])); #endif } // Horizontally subtract adjacent pairs of 32-bit integers in a and b, and pack // the signed 32-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_epi32 FORCE_INLINE __m128i _mm_hsub_epi32(__m128i _a, __m128i _b) { int32x4_t a = vreinterpretq_s32_m128i(_a); int32x4_t b = vreinterpretq_s32_m128i(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s32( vsubq_s32(vuzp1q_s32(a, b), vuzp2q_s32(a, b))); #else int32x4x2_t c = vuzpq_s32(a, b); return vreinterpretq_m128i_s32(vsubq_s32(c.val[0], c.val[1])); #endif } // Horizontally subtract adjacent pairs of 16-bit integers in a and b, and pack // the signed 16-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_pi16 FORCE_INLINE __m64 _mm_hsub_pi16(__m64 _a, __m64 _b) { int16x4_t a = vreinterpret_s16_m64(_a); int16x4_t b = vreinterpret_s16_m64(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpret_m64_s16(vsub_s16(vuzp1_s16(a, b), vuzp2_s16(a, b))); #else int16x4x2_t c = vuzp_s16(a, b); return vreinterpret_m64_s16(vsub_s16(c.val[0], c.val[1])); #endif } // Horizontally subtract adjacent pairs of 32-bit integers in a and b, and pack // the signed 32-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_hsub_pi32 FORCE_INLINE __m64 _mm_hsub_pi32(__m64 _a, __m64 _b) { int32x2_t a = vreinterpret_s32_m64(_a); int32x2_t b = vreinterpret_s32_m64(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpret_m64_s32(vsub_s32(vuzp1_s32(a, b), vuzp2_s32(a, b))); #else int32x2x2_t c = vuzp_s32(a, b); return vreinterpret_m64_s32(vsub_s32(c.val[0], c.val[1])); #endif } // Horizontally subtract adjacent pairs of signed 16-bit integers in a and b // using saturation, and pack the signed 16-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsubs_epi16 FORCE_INLINE __m128i _mm_hsubs_epi16(__m128i _a, __m128i _b) { int16x8_t a = vreinterpretq_s16_m128i(_a); int16x8_t b = vreinterpretq_s16_m128i(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s16( vqsubq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b))); #else int16x8x2_t c = vuzpq_s16(a, b); return vreinterpretq_m128i_s16(vqsubq_s16(c.val[0], c.val[1])); #endif } // Horizontally subtract adjacent pairs of signed 16-bit integers in a and b // using saturation, and pack the signed 16-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsubs_pi16 FORCE_INLINE __m64 _mm_hsubs_pi16(__m64 _a, __m64 _b) { int16x4_t a = vreinterpret_s16_m64(_a); int16x4_t b = vreinterpret_s16_m64(_b); #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpret_m64_s16(vqsub_s16(vuzp1_s16(a, b), vuzp2_s16(a, b))); #else int16x4x2_t c = vuzp_s16(a, b); return vreinterpret_m64_s16(vqsub_s16(c.val[0], c.val[1])); #endif } // Vertically multiply each unsigned 8-bit integer from a with the corresponding // signed 8-bit integer from b, producing intermediate signed 16-bit integers. // Horizontally add adjacent pairs of intermediate signed 16-bit integers, // and pack the saturated results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_maddubs_epi16 FORCE_INLINE __m128i _mm_maddubs_epi16(__m128i _a, __m128i _b) { #if defined(__aarch64__) || defined(_M_ARM64) uint8x16_t a = vreinterpretq_u8_m128i(_a); int8x16_t b = vreinterpretq_s8_m128i(_b); int16x8_t tl = vmulq_s16(vreinterpretq_s16_u16(vmovl_u8(vget_low_u8(a))), vmovl_s8(vget_low_s8(b))); int16x8_t th = vmulq_s16(vreinterpretq_s16_u16(vmovl_u8(vget_high_u8(a))), vmovl_s8(vget_high_s8(b))); return vreinterpretq_m128i_s16( vqaddq_s16(vuzp1q_s16(tl, th), vuzp2q_s16(tl, th))); #else // This would be much simpler if x86 would choose to zero extend OR sign // extend, not both. This could probably be optimized better. uint16x8_t a = vreinterpretq_u16_m128i(_a); int16x8_t b = vreinterpretq_s16_m128i(_b); // Zero extend a int16x8_t a_odd = vreinterpretq_s16_u16(vshrq_n_u16(a, 8)); int16x8_t a_even = vreinterpretq_s16_u16(vbicq_u16(a, vdupq_n_u16(0xff00))); // Sign extend by shifting left then shifting right. int16x8_t b_even = vshrq_n_s16(vshlq_n_s16(b, 8), 8); int16x8_t b_odd = vshrq_n_s16(b, 8); // multiply int16x8_t prod1 = vmulq_s16(a_even, b_even); int16x8_t prod2 = vmulq_s16(a_odd, b_odd); // saturated add return vreinterpretq_m128i_s16(vqaddq_s16(prod1, prod2)); #endif } // Vertically multiply each unsigned 8-bit integer from a with the corresponding // signed 8-bit integer from b, producing intermediate signed 16-bit integers. // Horizontally add adjacent pairs of intermediate signed 16-bit integers, and // pack the saturated results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_maddubs_pi16 FORCE_INLINE __m64 _mm_maddubs_pi16(__m64 _a, __m64 _b) { uint16x4_t a = vreinterpret_u16_m64(_a); int16x4_t b = vreinterpret_s16_m64(_b); // Zero extend a int16x4_t a_odd = vreinterpret_s16_u16(vshr_n_u16(a, 8)); int16x4_t a_even = vreinterpret_s16_u16(vand_u16(a, vdup_n_u16(0xff))); // Sign extend by shifting left then shifting right. int16x4_t b_even = vshr_n_s16(vshl_n_s16(b, 8), 8); int16x4_t b_odd = vshr_n_s16(b, 8); // multiply int16x4_t prod1 = vmul_s16(a_even, b_even); int16x4_t prod2 = vmul_s16(a_odd, b_odd); // saturated add return vreinterpret_m64_s16(vqadd_s16(prod1, prod2)); } // Multiply packed signed 16-bit integers in a and b, producing intermediate // signed 32-bit integers. Shift right by 15 bits while rounding up, and store // the packed 16-bit integers in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhrs_epi16 FORCE_INLINE __m128i _mm_mulhrs_epi16(__m128i a, __m128i b) { // Has issues due to saturation // return vreinterpretq_m128i_s16(vqrdmulhq_s16(a, b)); // Multiply int32x4_t mul_lo = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)), vget_low_s16(vreinterpretq_s16_m128i(b))); int32x4_t mul_hi = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)), vget_high_s16(vreinterpretq_s16_m128i(b))); // Rounding narrowing shift right // narrow = (int16_t)((mul + 16384) >> 15); int16x4_t narrow_lo = vrshrn_n_s32(mul_lo, 15); int16x4_t narrow_hi = vrshrn_n_s32(mul_hi, 15); // Join together return vreinterpretq_m128i_s16(vcombine_s16(narrow_lo, narrow_hi)); } // Multiply packed signed 16-bit integers in a and b, producing intermediate // signed 32-bit integers. Truncate each intermediate integer to the 18 most // significant bits, round by adding 1, and store bits [16:1] to dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhrs_pi16 FORCE_INLINE __m64 _mm_mulhrs_pi16(__m64 a, __m64 b) { int32x4_t mul_extend = vmull_s16((vreinterpret_s16_m64(a)), (vreinterpret_s16_m64(b))); // Rounding narrowing shift right return vreinterpret_m64_s16(vrshrn_n_s32(mul_extend, 15)); } // Shuffle packed 8-bit integers in a according to shuffle control mask in the // corresponding 8-bit element of b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_epi8 FORCE_INLINE __m128i _mm_shuffle_epi8(__m128i a, __m128i b) { int8x16_t tbl = vreinterpretq_s8_m128i(a); // input a uint8x16_t idx = vreinterpretq_u8_m128i(b); // input b uint8x16_t idx_masked = vandq_u8(idx, vdupq_n_u8(0x8F)); // avoid using meaningless bits #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_s8(vqtbl1q_s8(tbl, idx_masked)); #elif defined(__GNUC__) int8x16_t ret; // %e and %f represent the even and odd D registers // respectively. __asm__ __volatile__( "vtbl.8 %e[ret], {%e[tbl], %f[tbl]}, %e[idx]\n" "vtbl.8 %f[ret], {%e[tbl], %f[tbl]}, %f[idx]\n" : [ret] "=&w"(ret) : [tbl] "w"(tbl), [idx] "w"(idx_masked)); return vreinterpretq_m128i_s8(ret); #else // use this line if testing on aarch64 int8x8x2_t a_split = {vget_low_s8(tbl), vget_high_s8(tbl)}; return vreinterpretq_m128i_s8( vcombine_s8(vtbl2_s8(a_split, vget_low_u8(idx_masked)), vtbl2_s8(a_split, vget_high_u8(idx_masked)))); #endif } // Shuffle packed 8-bit integers in a according to shuffle control mask in the // corresponding 8-bit element of b, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_pi8 FORCE_INLINE __m64 _mm_shuffle_pi8(__m64 a, __m64 b) { const int8x8_t controlMask = vand_s8(vreinterpret_s8_m64(b), vdup_n_s8((int8_t) (0x1 << 7 | 0x07))); int8x8_t res = vtbl1_s8(vreinterpret_s8_m64(a), controlMask); return vreinterpret_m64_s8(res); } // Negate packed 16-bit integers in a when the corresponding signed // 16-bit integer in b is negative, and store the results in dst. // Element in dst are zeroed out when the corresponding element // in b is zero. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_epi16 FORCE_INLINE __m128i _mm_sign_epi16(__m128i _a, __m128i _b) { int16x8_t a = vreinterpretq_s16_m128i(_a); int16x8_t b = vreinterpretq_s16_m128i(_b); // signed shift right: faster than vclt // (b < 0) ? 0xFFFF : 0 uint16x8_t ltMask = vreinterpretq_u16_s16(vshrq_n_s16(b, 15)); // (b == 0) ? 0xFFFF : 0 #if defined(__aarch64__) || defined(_M_ARM64) int16x8_t zeroMask = vreinterpretq_s16_u16(vceqzq_s16(b)); #else int16x8_t zeroMask = vreinterpretq_s16_u16(vceqq_s16(b, vdupq_n_s16(0))); #endif // bitwise select either a or negative 'a' (vnegq_s16(a) equals to negative // 'a') based on ltMask int16x8_t masked = vbslq_s16(ltMask, vnegq_s16(a), a); // res = masked & (~zeroMask) int16x8_t res = vbicq_s16(masked, zeroMask); return vreinterpretq_m128i_s16(res); } // Negate packed 32-bit integers in a when the corresponding signed // 32-bit integer in b is negative, and store the results in dst. // Element in dst are zeroed out when the corresponding element // in b is zero. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_epi32 FORCE_INLINE __m128i _mm_sign_epi32(__m128i _a, __m128i _b) { int32x4_t a = vreinterpretq_s32_m128i(_a); int32x4_t b = vreinterpretq_s32_m128i(_b); // signed shift right: faster than vclt // (b < 0) ? 0xFFFFFFFF : 0 uint32x4_t ltMask = vreinterpretq_u32_s32(vshrq_n_s32(b, 31)); // (b == 0) ? 0xFFFFFFFF : 0 #if defined(__aarch64__) || defined(_M_ARM64) int32x4_t zeroMask = vreinterpretq_s32_u32(vceqzq_s32(b)); #else int32x4_t zeroMask = vreinterpretq_s32_u32(vceqq_s32(b, vdupq_n_s32(0))); #endif // bitwise select either a or negative 'a' (vnegq_s32(a) equals to negative // 'a') based on ltMask int32x4_t masked = vbslq_s32(ltMask, vnegq_s32(a), a); // res = masked & (~zeroMask) int32x4_t res = vbicq_s32(masked, zeroMask); return vreinterpretq_m128i_s32(res); } // Negate packed 8-bit integers in a when the corresponding signed // 8-bit integer in b is negative, and store the results in dst. // Element in dst are zeroed out when the corresponding element // in b is zero. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_epi8 FORCE_INLINE __m128i _mm_sign_epi8(__m128i _a, __m128i _b) { int8x16_t a = vreinterpretq_s8_m128i(_a); int8x16_t b = vreinterpretq_s8_m128i(_b); // signed shift right: faster than vclt // (b < 0) ? 0xFF : 0 uint8x16_t ltMask = vreinterpretq_u8_s8(vshrq_n_s8(b, 7)); // (b == 0) ? 0xFF : 0 #if defined(__aarch64__) || defined(_M_ARM64) int8x16_t zeroMask = vreinterpretq_s8_u8(vceqzq_s8(b)); #else int8x16_t zeroMask = vreinterpretq_s8_u8(vceqq_s8(b, vdupq_n_s8(0))); #endif // bitwise select either a or negative 'a' (vnegq_s8(a) return negative 'a') // based on ltMask int8x16_t masked = vbslq_s8(ltMask, vnegq_s8(a), a); // res = masked & (~zeroMask) int8x16_t res = vbicq_s8(masked, zeroMask); return vreinterpretq_m128i_s8(res); } // Negate packed 16-bit integers in a when the corresponding signed 16-bit // integer in b is negative, and store the results in dst. Element in dst are // zeroed out when the corresponding element in b is zero. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_pi16 FORCE_INLINE __m64 _mm_sign_pi16(__m64 _a, __m64 _b) { int16x4_t a = vreinterpret_s16_m64(_a); int16x4_t b = vreinterpret_s16_m64(_b); // signed shift right: faster than vclt // (b < 0) ? 0xFFFF : 0 uint16x4_t ltMask = vreinterpret_u16_s16(vshr_n_s16(b, 15)); // (b == 0) ? 0xFFFF : 0 #if defined(__aarch64__) || defined(_M_ARM64) int16x4_t zeroMask = vreinterpret_s16_u16(vceqz_s16(b)); #else int16x4_t zeroMask = vreinterpret_s16_u16(vceq_s16(b, vdup_n_s16(0))); #endif // bitwise select either a or negative 'a' (vneg_s16(a) return negative 'a') // based on ltMask int16x4_t masked = vbsl_s16(ltMask, vneg_s16(a), a); // res = masked & (~zeroMask) int16x4_t res = vbic_s16(masked, zeroMask); return vreinterpret_m64_s16(res); } // Negate packed 32-bit integers in a when the corresponding signed 32-bit // integer in b is negative, and store the results in dst. Element in dst are // zeroed out when the corresponding element in b is zero. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_pi32 FORCE_INLINE __m64 _mm_sign_pi32(__m64 _a, __m64 _b) { int32x2_t a = vreinterpret_s32_m64(_a); int32x2_t b = vreinterpret_s32_m64(_b); // signed shift right: faster than vclt // (b < 0) ? 0xFFFFFFFF : 0 uint32x2_t ltMask = vreinterpret_u32_s32(vshr_n_s32(b, 31)); // (b == 0) ? 0xFFFFFFFF : 0 #if defined(__aarch64__) || defined(_M_ARM64) int32x2_t zeroMask = vreinterpret_s32_u32(vceqz_s32(b)); #else int32x2_t zeroMask = vreinterpret_s32_u32(vceq_s32(b, vdup_n_s32(0))); #endif // bitwise select either a or negative 'a' (vneg_s32(a) return negative 'a') // based on ltMask int32x2_t masked = vbsl_s32(ltMask, vneg_s32(a), a); // res = masked & (~zeroMask) int32x2_t res = vbic_s32(masked, zeroMask); return vreinterpret_m64_s32(res); } // Negate packed 8-bit integers in a when the corresponding signed 8-bit integer // in b is negative, and store the results in dst. Element in dst are zeroed out // when the corresponding element in b is zero. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_pi8 FORCE_INLINE __m64 _mm_sign_pi8(__m64 _a, __m64 _b) { int8x8_t a = vreinterpret_s8_m64(_a); int8x8_t b = vreinterpret_s8_m64(_b); // signed shift right: faster than vclt // (b < 0) ? 0xFF : 0 uint8x8_t ltMask = vreinterpret_u8_s8(vshr_n_s8(b, 7)); // (b == 0) ? 0xFF : 0 #if defined(__aarch64__) || defined(_M_ARM64) int8x8_t zeroMask = vreinterpret_s8_u8(vceqz_s8(b)); #else int8x8_t zeroMask = vreinterpret_s8_u8(vceq_s8(b, vdup_n_s8(0))); #endif // bitwise select either a or negative 'a' (vneg_s8(a) return negative 'a') // based on ltMask int8x8_t masked = vbsl_s8(ltMask, vneg_s8(a), a); // res = masked & (~zeroMask) int8x8_t res = vbic_s8(masked, zeroMask); return vreinterpret_m64_s8(res); } /* SSE4.1 */ // Blend packed 16-bit integers from a and b using control mask imm8, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blend_epi16 // FORCE_INLINE __m128i _mm_blend_epi16(__m128i a, __m128i b, // __constrange(0,255) int imm) #define _mm_blend_epi16(a, b, imm) \ _sse2neon_define2( \ __m128i, a, b, \ const uint16_t _mask[8] = \ _sse2neon_init(((imm) & (1 << 0)) ? (uint16_t) -1 : 0x0, \ ((imm) & (1 << 1)) ? (uint16_t) -1 : 0x0, \ ((imm) & (1 << 2)) ? (uint16_t) -1 : 0x0, \ ((imm) & (1 << 3)) ? (uint16_t) -1 : 0x0, \ ((imm) & (1 << 4)) ? (uint16_t) -1 : 0x0, \ ((imm) & (1 << 5)) ? (uint16_t) -1 : 0x0, \ ((imm) & (1 << 6)) ? (uint16_t) -1 : 0x0, \ ((imm) & (1 << 7)) ? (uint16_t) -1 : 0x0); \ uint16x8_t _mask_vec = vld1q_u16(_mask); \ uint16x8_t __a = vreinterpretq_u16_m128i(_a); \ uint16x8_t __b = vreinterpretq_u16_m128i(_b); _sse2neon_return( \ vreinterpretq_m128i_u16(vbslq_u16(_mask_vec, __b, __a)));) // Blend packed double-precision (64-bit) floating-point elements from a and b // using control mask imm8, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blend_pd #define _mm_blend_pd(a, b, imm) \ _sse2neon_define2( \ __m128d, a, b, \ const uint64_t _mask[2] = \ _sse2neon_init(((imm) & (1 << 0)) ? ~UINT64_C(0) : UINT64_C(0), \ ((imm) & (1 << 1)) ? ~UINT64_C(0) : UINT64_C(0)); \ uint64x2_t _mask_vec = vld1q_u64(_mask); \ uint64x2_t __a = vreinterpretq_u64_m128d(_a); \ uint64x2_t __b = vreinterpretq_u64_m128d(_b); _sse2neon_return( \ vreinterpretq_m128d_u64(vbslq_u64(_mask_vec, __b, __a)));) // Blend packed single-precision (32-bit) floating-point elements from a and b // using mask, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blend_ps FORCE_INLINE __m128 _mm_blend_ps(__m128 _a, __m128 _b, const char imm8) { const uint32_t ALIGN_STRUCT(16) data[4] = {((imm8) & (1 << 0)) ? UINT32_MAX : 0, ((imm8) & (1 << 1)) ? UINT32_MAX : 0, ((imm8) & (1 << 2)) ? UINT32_MAX : 0, ((imm8) & (1 << 3)) ? UINT32_MAX : 0}; uint32x4_t mask = vld1q_u32(data); float32x4_t a = vreinterpretq_f32_m128(_a); float32x4_t b = vreinterpretq_f32_m128(_b); return vreinterpretq_m128_f32(vbslq_f32(mask, b, a)); } // Blend packed 8-bit integers from a and b using mask, and store the results in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blendv_epi8 FORCE_INLINE __m128i _mm_blendv_epi8(__m128i _a, __m128i _b, __m128i _mask) { // Use a signed shift right to create a mask with the sign bit uint8x16_t mask = vreinterpretq_u8_s8(vshrq_n_s8(vreinterpretq_s8_m128i(_mask), 7)); uint8x16_t a = vreinterpretq_u8_m128i(_a); uint8x16_t b = vreinterpretq_u8_m128i(_b); return vreinterpretq_m128i_u8(vbslq_u8(mask, b, a)); } // Blend packed double-precision (64-bit) floating-point elements from a and b // using mask, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blendv_pd FORCE_INLINE __m128d _mm_blendv_pd(__m128d _a, __m128d _b, __m128d _mask) { uint64x2_t mask = vreinterpretq_u64_s64(vshrq_n_s64(vreinterpretq_s64_m128d(_mask), 63)); #if defined(__aarch64__) || defined(_M_ARM64) float64x2_t a = vreinterpretq_f64_m128d(_a); float64x2_t b = vreinterpretq_f64_m128d(_b); return vreinterpretq_m128d_f64(vbslq_f64(mask, b, a)); #else uint64x2_t a = vreinterpretq_u64_m128d(_a); uint64x2_t b = vreinterpretq_u64_m128d(_b); return vreinterpretq_m128d_u64(vbslq_u64(mask, b, a)); #endif } // Blend packed single-precision (32-bit) floating-point elements from a and b // using mask, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blendv_ps FORCE_INLINE __m128 _mm_blendv_ps(__m128 _a, __m128 _b, __m128 _mask) { // Use a signed shift right to create a mask with the sign bit uint32x4_t mask = vreinterpretq_u32_s32(vshrq_n_s32(vreinterpretq_s32_m128(_mask), 31)); float32x4_t a = vreinterpretq_f32_m128(_a); float32x4_t b = vreinterpretq_f32_m128(_b); return vreinterpretq_m128_f32(vbslq_f32(mask, b, a)); } // Round the packed double-precision (64-bit) floating-point elements in a up // to an integer value, and store the results as packed double-precision // floating-point elements in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_ceil_pd FORCE_INLINE __m128d _mm_ceil_pd(__m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vrndpq_f64(vreinterpretq_f64_m128d(a))); #else double *f = (double *) &a; return _mm_set_pd(ceil(f[1]), ceil(f[0])); #endif } // Round the packed single-precision (32-bit) floating-point elements in a up to // an integer value, and store the results as packed single-precision // floating-point elements in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_ceil_ps FORCE_INLINE __m128 _mm_ceil_ps(__m128 a) { #if (defined(__aarch64__) || defined(_M_ARM64)) || \ defined(__ARM_FEATURE_DIRECTED_ROUNDING) return vreinterpretq_m128_f32(vrndpq_f32(vreinterpretq_f32_m128(a))); #else float *f = (float *) &a; return _mm_set_ps(ceilf(f[3]), ceilf(f[2]), ceilf(f[1]), ceilf(f[0])); #endif } // Round the lower double-precision (64-bit) floating-point element in b up to // an integer value, store the result as a double-precision floating-point // element in the lower element of dst, and copy the upper element from a to the // upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_ceil_sd FORCE_INLINE __m128d _mm_ceil_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_ceil_pd(b)); } // Round the lower single-precision (32-bit) floating-point element in b up to // an integer value, store the result as a single-precision floating-point // element in the lower element of dst, and copy the upper 3 packed elements // from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_ceil_ss FORCE_INLINE __m128 _mm_ceil_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_ceil_ps(b)); } // Compare packed 64-bit integers in a and b for equality, and store the results // in dst FORCE_INLINE __m128i _mm_cmpeq_epi64(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_u64( vceqq_u64(vreinterpretq_u64_m128i(a), vreinterpretq_u64_m128i(b))); #else // ARMv7 lacks vceqq_u64 // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi) uint32x4_t cmp = vceqq_u32(vreinterpretq_u32_m128i(a), vreinterpretq_u32_m128i(b)); uint32x4_t swapped = vrev64q_u32(cmp); return vreinterpretq_m128i_u32(vandq_u32(cmp, swapped)); #endif } // Sign extend packed 16-bit integers in a to packed 32-bit integers, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi16_epi32 FORCE_INLINE __m128i _mm_cvtepi16_epi32(__m128i a) { return vreinterpretq_m128i_s32( vmovl_s16(vget_low_s16(vreinterpretq_s16_m128i(a)))); } // Sign extend packed 16-bit integers in a to packed 64-bit integers, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi16_epi64 FORCE_INLINE __m128i _mm_cvtepi16_epi64(__m128i a) { int16x8_t s16x8 = vreinterpretq_s16_m128i(a); /* xxxx xxxx xxxx 0B0A */ int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */ int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */ return vreinterpretq_m128i_s64(s64x2); } // Sign extend packed 32-bit integers in a to packed 64-bit integers, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi32_epi64 FORCE_INLINE __m128i _mm_cvtepi32_epi64(__m128i a) { return vreinterpretq_m128i_s64( vmovl_s32(vget_low_s32(vreinterpretq_s32_m128i(a)))); } // Sign extend packed 8-bit integers in a to packed 16-bit integers, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi8_epi16 FORCE_INLINE __m128i _mm_cvtepi8_epi16(__m128i a) { int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */ int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */ return vreinterpretq_m128i_s16(s16x8); } // Sign extend packed 8-bit integers in a to packed 32-bit integers, and store // the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi8_epi32 FORCE_INLINE __m128i _mm_cvtepi8_epi32(__m128i a) { int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */ int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */ int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000D 000C 000B 000A */ return vreinterpretq_m128i_s32(s32x4); } // Sign extend packed 8-bit integers in the low 8 bytes of a to packed 64-bit // integers, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi8_epi64 FORCE_INLINE __m128i _mm_cvtepi8_epi64(__m128i a) { int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx xxBA */ int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0x0x 0B0A */ int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */ int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */ return vreinterpretq_m128i_s64(s64x2); } // Zero extend packed unsigned 16-bit integers in a to packed 32-bit integers, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu16_epi32 FORCE_INLINE __m128i _mm_cvtepu16_epi32(__m128i a) { return vreinterpretq_m128i_u32( vmovl_u16(vget_low_u16(vreinterpretq_u16_m128i(a)))); } // Zero extend packed unsigned 16-bit integers in a to packed 64-bit integers, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu16_epi64 FORCE_INLINE __m128i _mm_cvtepu16_epi64(__m128i a) { uint16x8_t u16x8 = vreinterpretq_u16_m128i(a); /* xxxx xxxx xxxx 0B0A */ uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */ uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */ return vreinterpretq_m128i_u64(u64x2); } // Zero extend packed unsigned 32-bit integers in a to packed 64-bit integers, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu32_epi64 FORCE_INLINE __m128i _mm_cvtepu32_epi64(__m128i a) { return vreinterpretq_m128i_u64( vmovl_u32(vget_low_u32(vreinterpretq_u32_m128i(a)))); } // Zero extend packed unsigned 8-bit integers in a to packed 16-bit integers, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu8_epi16 FORCE_INLINE __m128i _mm_cvtepu8_epi16(__m128i a) { uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx HGFE DCBA */ uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0H0G 0F0E 0D0C 0B0A */ return vreinterpretq_m128i_u16(u16x8); } // Zero extend packed unsigned 8-bit integers in a to packed 32-bit integers, // and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu8_epi32 FORCE_INLINE __m128i _mm_cvtepu8_epi32(__m128i a) { uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx DCBA */ uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0D0C 0B0A */ uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000D 000C 000B 000A */ return vreinterpretq_m128i_u32(u32x4); } // Zero extend packed unsigned 8-bit integers in the low 8 bytes of a to packed // 64-bit integers, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu8_epi64 FORCE_INLINE __m128i _mm_cvtepu8_epi64(__m128i a) { uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx xxBA */ uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0x0x 0B0A */ uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */ uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */ return vreinterpretq_m128i_u64(u64x2); } // Conditionally multiply the packed double-precision (64-bit) floating-point // elements in a and b using the high 4 bits in imm8, sum the four products, and // conditionally store the sum in dst using the low 4 bits of imm8. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_dp_pd FORCE_INLINE __m128d _mm_dp_pd(__m128d a, __m128d b, const int imm) { // Generate mask value from constant immediate bit value const int64_t bit0Mask = imm & 0x01 ? UINT64_MAX : 0; const int64_t bit1Mask = imm & 0x02 ? UINT64_MAX : 0; #if !SSE2NEON_PRECISE_DP const int64_t bit4Mask = imm & 0x10 ? UINT64_MAX : 0; const int64_t bit5Mask = imm & 0x20 ? UINT64_MAX : 0; #endif // Conditional multiplication #if !SSE2NEON_PRECISE_DP __m128d mul = _mm_mul_pd(a, b); const __m128d mulMask = _mm_castsi128_pd(_mm_set_epi64x(bit5Mask, bit4Mask)); __m128d tmp = _mm_and_pd(mul, mulMask); #else #if defined(__aarch64__) || defined(_M_ARM64) double d0 = (imm & 0x10) ? vgetq_lane_f64(vreinterpretq_f64_m128d(a), 0) * vgetq_lane_f64(vreinterpretq_f64_m128d(b), 0) : 0; double d1 = (imm & 0x20) ? vgetq_lane_f64(vreinterpretq_f64_m128d(a), 1) * vgetq_lane_f64(vreinterpretq_f64_m128d(b), 1) : 0; #else double d0 = (imm & 0x10) ? ((double *) &a)[0] * ((double *) &b)[0] : 0; double d1 = (imm & 0x20) ? ((double *) &a)[1] * ((double *) &b)[1] : 0; #endif __m128d tmp = _mm_set_pd(d1, d0); #endif // Sum the products #if defined(__aarch64__) || defined(_M_ARM64) double sum = vpaddd_f64(vreinterpretq_f64_m128d(tmp)); #else double sum = *((double *) &tmp) + *(((double *) &tmp) + 1); #endif // Conditionally store the sum const __m128d sumMask = _mm_castsi128_pd(_mm_set_epi64x(bit1Mask, bit0Mask)); __m128d res = _mm_and_pd(_mm_set_pd1(sum), sumMask); return res; } // Conditionally multiply the packed single-precision (32-bit) floating-point // elements in a and b using the high 4 bits in imm8, sum the four products, // and conditionally store the sum in dst using the low 4 bits of imm. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_dp_ps FORCE_INLINE __m128 _mm_dp_ps(__m128 a, __m128 b, const int imm) { float32x4_t elementwise_prod = _mm_mul_ps(a, b); #if defined(__aarch64__) || defined(_M_ARM64) /* shortcuts */ if (imm == 0xFF) { return _mm_set1_ps(vaddvq_f32(elementwise_prod)); } if ((imm & 0x0F) == 0x0F) { if (!(imm & (1 << 4))) elementwise_prod = vsetq_lane_f32(0.0f, elementwise_prod, 0); if (!(imm & (1 << 5))) elementwise_prod = vsetq_lane_f32(0.0f, elementwise_prod, 1); if (!(imm & (1 << 6))) elementwise_prod = vsetq_lane_f32(0.0f, elementwise_prod, 2); if (!(imm & (1 << 7))) elementwise_prod = vsetq_lane_f32(0.0f, elementwise_prod, 3); return _mm_set1_ps(vaddvq_f32(elementwise_prod)); } #endif float s = 0.0f; if (imm & (1 << 4)) s += vgetq_lane_f32(elementwise_prod, 0); if (imm & (1 << 5)) s += vgetq_lane_f32(elementwise_prod, 1); if (imm & (1 << 6)) s += vgetq_lane_f32(elementwise_prod, 2); if (imm & (1 << 7)) s += vgetq_lane_f32(elementwise_prod, 3); const float32_t res[4] = { (imm & 0x1) ? s : 0.0f, (imm & 0x2) ? s : 0.0f, (imm & 0x4) ? s : 0.0f, (imm & 0x8) ? s : 0.0f, }; return vreinterpretq_m128_f32(vld1q_f32(res)); } // Extract a 32-bit integer from a, selected with imm8, and store the result in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_epi32 // FORCE_INLINE int _mm_extract_epi32(__m128i a, __constrange(0,4) int imm) #define _mm_extract_epi32(a, imm) \ vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)) // Extract a 64-bit integer from a, selected with imm8, and store the result in // dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_epi64 // FORCE_INLINE __int64 _mm_extract_epi64(__m128i a, __constrange(0,2) int imm) #define _mm_extract_epi64(a, imm) \ vgetq_lane_s64(vreinterpretq_s64_m128i(a), (imm)) // Extract an 8-bit integer from a, selected with imm8, and store the result in // the lower element of dst. FORCE_INLINE int _mm_extract_epi8(__m128i a, // __constrange(0,16) int imm) // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_epi8 #define _mm_extract_epi8(a, imm) vgetq_lane_u8(vreinterpretq_u8_m128i(a), (imm)) // Extracts the selected single-precision (32-bit) floating-point from a. // FORCE_INLINE int _mm_extract_ps(__m128 a, __constrange(0,4) int imm) #define _mm_extract_ps(a, imm) vgetq_lane_s32(vreinterpretq_s32_m128(a), (imm)) // Round the packed double-precision (64-bit) floating-point elements in a down // to an integer value, and store the results as packed double-precision // floating-point elements in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_floor_pd FORCE_INLINE __m128d _mm_floor_pd(__m128d a) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128d_f64(vrndmq_f64(vreinterpretq_f64_m128d(a))); #else double *f = (double *) &a; return _mm_set_pd(floor(f[1]), floor(f[0])); #endif } // Round the packed single-precision (32-bit) floating-point elements in a down // to an integer value, and store the results as packed single-precision // floating-point elements in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_floor_ps FORCE_INLINE __m128 _mm_floor_ps(__m128 a) { #if (defined(__aarch64__) || defined(_M_ARM64)) || \ defined(__ARM_FEATURE_DIRECTED_ROUNDING) return vreinterpretq_m128_f32(vrndmq_f32(vreinterpretq_f32_m128(a))); #else float *f = (float *) &a; return _mm_set_ps(floorf(f[3]), floorf(f[2]), floorf(f[1]), floorf(f[0])); #endif } // Round the lower double-precision (64-bit) floating-point element in b down to // an integer value, store the result as a double-precision floating-point // element in the lower element of dst, and copy the upper element from a to the // upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_floor_sd FORCE_INLINE __m128d _mm_floor_sd(__m128d a, __m128d b) { return _mm_move_sd(a, _mm_floor_pd(b)); } // Round the lower single-precision (32-bit) floating-point element in b down to // an integer value, store the result as a single-precision floating-point // element in the lower element of dst, and copy the upper 3 packed elements // from a to the upper elements of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_floor_ss FORCE_INLINE __m128 _mm_floor_ss(__m128 a, __m128 b) { return _mm_move_ss(a, _mm_floor_ps(b)); } // Copy a to dst, and insert the 32-bit integer i into dst at the location // specified by imm8. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_epi32 // FORCE_INLINE __m128i _mm_insert_epi32(__m128i a, int b, // __constrange(0,4) int imm) #define _mm_insert_epi32(a, b, imm) \ vreinterpretq_m128i_s32( \ vsetq_lane_s32((b), vreinterpretq_s32_m128i(a), (imm))) // Copy a to dst, and insert the 64-bit integer i into dst at the location // specified by imm8. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_epi64 // FORCE_INLINE __m128i _mm_insert_epi64(__m128i a, __int64 b, // __constrange(0,2) int imm) #define _mm_insert_epi64(a, b, imm) \ vreinterpretq_m128i_s64( \ vsetq_lane_s64((b), vreinterpretq_s64_m128i(a), (imm))) // Copy a to dst, and insert the lower 8-bit integer from i into dst at the // location specified by imm8. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_epi8 // FORCE_INLINE __m128i _mm_insert_epi8(__m128i a, int b, // __constrange(0,16) int imm) #define _mm_insert_epi8(a, b, imm) \ vreinterpretq_m128i_s8(vsetq_lane_s8((b), vreinterpretq_s8_m128i(a), (imm))) // Copy a to tmp, then insert a single-precision (32-bit) floating-point // element from b into tmp using the control in imm8. Store tmp to dst using // the mask in imm8 (elements are zeroed out when the corresponding bit is set). // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=insert_ps #define _mm_insert_ps(a, b, imm8) \ _sse2neon_define2( \ __m128, a, b, \ float32x4_t tmp1 = \ vsetq_lane_f32(vgetq_lane_f32(_b, (imm8 >> 6) & 0x3), \ vreinterpretq_f32_m128(_a), 0); \ float32x4_t tmp2 = \ vsetq_lane_f32(vgetq_lane_f32(tmp1, 0), \ vreinterpretq_f32_m128(_a), ((imm8 >> 4) & 0x3)); \ const uint32_t data[4] = \ _sse2neon_init(((imm8) & (1 << 0)) ? UINT32_MAX : 0, \ ((imm8) & (1 << 1)) ? UINT32_MAX : 0, \ ((imm8) & (1 << 2)) ? UINT32_MAX : 0, \ ((imm8) & (1 << 3)) ? UINT32_MAX : 0); \ uint32x4_t mask = vld1q_u32(data); \ float32x4_t all_zeros = vdupq_n_f32(0); \ \ _sse2neon_return(vreinterpretq_m128_f32( \ vbslq_f32(mask, all_zeros, vreinterpretq_f32_m128(tmp2))));) // Compare packed signed 32-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epi32 FORCE_INLINE __m128i _mm_max_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_s32( vmaxq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Compare packed signed 8-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epi8 FORCE_INLINE __m128i _mm_max_epi8(__m128i a, __m128i b) { return vreinterpretq_m128i_s8( vmaxq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); } // Compare packed unsigned 16-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epu16 FORCE_INLINE __m128i _mm_max_epu16(__m128i a, __m128i b) { return vreinterpretq_m128i_u16( vmaxq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); } // Compare packed unsigned 32-bit integers in a and b, and store packed maximum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epu32 FORCE_INLINE __m128i _mm_max_epu32(__m128i a, __m128i b) { return vreinterpretq_m128i_u32( vmaxq_u32(vreinterpretq_u32_m128i(a), vreinterpretq_u32_m128i(b))); } // Compare packed signed 32-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epi32 FORCE_INLINE __m128i _mm_min_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_s32( vminq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Compare packed signed 8-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epi8 FORCE_INLINE __m128i _mm_min_epi8(__m128i a, __m128i b) { return vreinterpretq_m128i_s8( vminq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); } // Compare packed unsigned 16-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epu16 FORCE_INLINE __m128i _mm_min_epu16(__m128i a, __m128i b) { return vreinterpretq_m128i_u16( vminq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); } // Compare packed unsigned 32-bit integers in a and b, and store packed minimum // values in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epu32 FORCE_INLINE __m128i _mm_min_epu32(__m128i a, __m128i b) { return vreinterpretq_m128i_u32( vminq_u32(vreinterpretq_u32_m128i(a), vreinterpretq_u32_m128i(b))); } // Horizontally compute the minimum amongst the packed unsigned 16-bit integers // in a, store the minimum and index in dst, and zero the remaining bits in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_minpos_epu16 FORCE_INLINE __m128i _mm_minpos_epu16(__m128i a) { __m128i dst; uint16_t min, idx = 0; #if defined(__aarch64__) || defined(_M_ARM64) // Find the minimum value min = vminvq_u16(vreinterpretq_u16_m128i(a)); // Get the index of the minimum value static const uint16_t idxv[] = {0, 1, 2, 3, 4, 5, 6, 7}; uint16x8_t minv = vdupq_n_u16(min); uint16x8_t cmeq = vceqq_u16(minv, vreinterpretq_u16_m128i(a)); idx = vminvq_u16(vornq_u16(vld1q_u16(idxv), cmeq)); #else // Find the minimum value __m64 tmp; tmp = vreinterpret_m64_u16( vmin_u16(vget_low_u16(vreinterpretq_u16_m128i(a)), vget_high_u16(vreinterpretq_u16_m128i(a)))); tmp = vreinterpret_m64_u16( vpmin_u16(vreinterpret_u16_m64(tmp), vreinterpret_u16_m64(tmp))); tmp = vreinterpret_m64_u16( vpmin_u16(vreinterpret_u16_m64(tmp), vreinterpret_u16_m64(tmp))); min = vget_lane_u16(vreinterpret_u16_m64(tmp), 0); // Get the index of the minimum value int i; for (i = 0; i < 8; i++) { if (min == vgetq_lane_u16(vreinterpretq_u16_m128i(a), 0)) { idx = (uint16_t) i; break; } a = _mm_srli_si128(a, 2); } #endif // Generate result dst = _mm_setzero_si128(); dst = vreinterpretq_m128i_u16( vsetq_lane_u16(min, vreinterpretq_u16_m128i(dst), 0)); dst = vreinterpretq_m128i_u16( vsetq_lane_u16(idx, vreinterpretq_u16_m128i(dst), 1)); return dst; } // Compute the sum of absolute differences (SADs) of quadruplets of unsigned // 8-bit integers in a compared to those in b, and store the 16-bit results in // dst. Eight SADs are performed using one quadruplet from b and eight // quadruplets from a. One quadruplet is selected from b starting at on the // offset specified in imm8. Eight quadruplets are formed from sequential 8-bit // integers selected from a starting at the offset specified in imm8. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mpsadbw_epu8 FORCE_INLINE __m128i _mm_mpsadbw_epu8(__m128i a, __m128i b, const int imm) { uint8x16_t _a, _b; switch (imm & 0x4) { case 0: // do nothing _a = vreinterpretq_u8_m128i(a); break; case 4: _a = vreinterpretq_u8_u32(vextq_u32(vreinterpretq_u32_m128i(a), vreinterpretq_u32_m128i(a), 1)); break; default: #if defined(__GNUC__) || defined(__clang__) __builtin_unreachable(); #elif defined(_MSC_VER) __assume(0); #endif break; } switch (imm & 0x3) { case 0: _b = vreinterpretq_u8_u32( vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 0))); break; case 1: _b = vreinterpretq_u8_u32( vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 1))); break; case 2: _b = vreinterpretq_u8_u32( vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 2))); break; case 3: _b = vreinterpretq_u8_u32( vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 3))); break; default: #if defined(__GNUC__) || defined(__clang__) __builtin_unreachable(); #elif defined(_MSC_VER) __assume(0); #endif break; } int16x8_t c04, c15, c26, c37; uint8x8_t low_b = vget_low_u8(_b); c04 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a), low_b)); uint8x16_t _a_1 = vextq_u8(_a, _a, 1); c15 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a_1), low_b)); uint8x16_t _a_2 = vextq_u8(_a, _a, 2); c26 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a_2), low_b)); uint8x16_t _a_3 = vextq_u8(_a, _a, 3); c37 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a_3), low_b)); #if defined(__aarch64__) || defined(_M_ARM64) // |0|4|2|6| c04 = vpaddq_s16(c04, c26); // |1|5|3|7| c15 = vpaddq_s16(c15, c37); int32x4_t trn1_c = vtrn1q_s32(vreinterpretq_s32_s16(c04), vreinterpretq_s32_s16(c15)); int32x4_t trn2_c = vtrn2q_s32(vreinterpretq_s32_s16(c04), vreinterpretq_s32_s16(c15)); return vreinterpretq_m128i_s16(vpaddq_s16(vreinterpretq_s16_s32(trn1_c), vreinterpretq_s16_s32(trn2_c))); #else int16x4_t c01, c23, c45, c67; c01 = vpadd_s16(vget_low_s16(c04), vget_low_s16(c15)); c23 = vpadd_s16(vget_low_s16(c26), vget_low_s16(c37)); c45 = vpadd_s16(vget_high_s16(c04), vget_high_s16(c15)); c67 = vpadd_s16(vget_high_s16(c26), vget_high_s16(c37)); return vreinterpretq_m128i_s16( vcombine_s16(vpadd_s16(c01, c23), vpadd_s16(c45, c67))); #endif } // Multiply the low signed 32-bit integers from each packed 64-bit element in // a and b, and store the signed 64-bit results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_epi32 FORCE_INLINE __m128i _mm_mul_epi32(__m128i a, __m128i b) { // vmull_s32 upcasts instead of masking, so we downcast. int32x2_t a_lo = vmovn_s64(vreinterpretq_s64_m128i(a)); int32x2_t b_lo = vmovn_s64(vreinterpretq_s64_m128i(b)); return vreinterpretq_m128i_s64(vmull_s32(a_lo, b_lo)); } // Multiply the packed 32-bit integers in a and b, producing intermediate 64-bit // integers, and store the low 32 bits of the intermediate integers in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mullo_epi32 FORCE_INLINE __m128i _mm_mullo_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_s32( vmulq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); } // Convert packed signed 32-bit integers from a and b to packed 16-bit integers // using unsigned saturation, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_packus_epi32 FORCE_INLINE __m128i _mm_packus_epi32(__m128i a, __m128i b) { return vreinterpretq_m128i_u16( vcombine_u16(vqmovun_s32(vreinterpretq_s32_m128i(a)), vqmovun_s32(vreinterpretq_s32_m128i(b)))); } // Round the packed double-precision (64-bit) floating-point elements in a using // the rounding parameter, and store the results as packed double-precision // floating-point elements in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_round_pd FORCE_INLINE __m128d _mm_round_pd(__m128d a, int rounding) { #if defined(__aarch64__) || defined(_M_ARM64) switch (rounding) { case (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC): return vreinterpretq_m128d_f64(vrndnq_f64(vreinterpretq_f64_m128d(a))); case (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC): return _mm_floor_pd(a); case (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC): return _mm_ceil_pd(a); case (_MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC): return vreinterpretq_m128d_f64(vrndq_f64(vreinterpretq_f64_m128d(a))); default: //_MM_FROUND_CUR_DIRECTION return vreinterpretq_m128d_f64(vrndiq_f64(vreinterpretq_f64_m128d(a))); } #else double *v_double = (double *) &a; if (rounding == (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC) || (rounding == _MM_FROUND_CUR_DIRECTION && _MM_GET_ROUNDING_MODE() == _MM_ROUND_NEAREST)) { double res[2], tmp; for (int i = 0; i < 2; i++) { tmp = (v_double[i] < 0) ? -v_double[i] : v_double[i]; double roundDown = floor(tmp); // Round down value double roundUp = ceil(tmp); // Round up value double diffDown = tmp - roundDown; double diffUp = roundUp - tmp; if (diffDown < diffUp) { /* If it's closer to the round down value, then use it */ res[i] = roundDown; } else if (diffDown > diffUp) { /* If it's closer to the round up value, then use it */ res[i] = roundUp; } else { /* If it's equidistant between round up and round down value, * pick the one which is an even number */ double half = roundDown / 2; if (half != floor(half)) { /* If the round down value is odd, return the round up value */ res[i] = roundUp; } else { /* If the round up value is odd, return the round down value */ res[i] = roundDown; } } res[i] = (v_double[i] < 0) ? -res[i] : res[i]; } return _mm_set_pd(res[1], res[0]); } else if (rounding == (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC) || (rounding == _MM_FROUND_CUR_DIRECTION && _MM_GET_ROUNDING_MODE() == _MM_ROUND_DOWN)) { return _mm_floor_pd(a); } else if (rounding == (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC) || (rounding == _MM_FROUND_CUR_DIRECTION && _MM_GET_ROUNDING_MODE() == _MM_ROUND_UP)) { return _mm_ceil_pd(a); } return _mm_set_pd(v_double[1] > 0 ? floor(v_double[1]) : ceil(v_double[1]), v_double[0] > 0 ? floor(v_double[0]) : ceil(v_double[0])); #endif } // Round the packed single-precision (32-bit) floating-point elements in a using // the rounding parameter, and store the results as packed single-precision // floating-point elements in dst. // software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_round_ps FORCE_INLINE __m128 _mm_round_ps(__m128 a, int rounding) { #if (defined(__aarch64__) || defined(_M_ARM64)) || \ defined(__ARM_FEATURE_DIRECTED_ROUNDING) switch (rounding) { case (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC): return vreinterpretq_m128_f32(vrndnq_f32(vreinterpretq_f32_m128(a))); case (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC): return _mm_floor_ps(a); case (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC): return _mm_ceil_ps(a); case (_MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC): return vreinterpretq_m128_f32(vrndq_f32(vreinterpretq_f32_m128(a))); default: //_MM_FROUND_CUR_DIRECTION return vreinterpretq_m128_f32(vrndiq_f32(vreinterpretq_f32_m128(a))); } #else float *v_float = (float *) &a; if (rounding == (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC) || (rounding == _MM_FROUND_CUR_DIRECTION && _MM_GET_ROUNDING_MODE() == _MM_ROUND_NEAREST)) { uint32x4_t signmask = vdupq_n_u32(0x80000000); float32x4_t half = vbslq_f32(signmask, vreinterpretq_f32_m128(a), vdupq_n_f32(0.5f)); /* +/- 0.5 */ int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32( vreinterpretq_f32_m128(a), half)); /* round to integer: [a + 0.5]*/ int32x4_t r_trunc = vcvtq_s32_f32( vreinterpretq_f32_m128(a)); /* truncate to integer: [a] */ int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32( vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31)); /* 1 or 0 */ int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone), vdupq_n_s32(1)); /* ([a] + {0,1}) & ~1 */ float32x4_t delta = vsubq_f32( vreinterpretq_f32_m128(a), vcvtq_f32_s32(r_trunc)); /* compute delta: delta = (a - [a]) */ uint32x4_t is_delta_half = vceqq_f32(delta, half); /* delta == +/- 0.5 */ return vreinterpretq_m128_f32( vcvtq_f32_s32(vbslq_s32(is_delta_half, r_even, r_normal))); } else if (rounding == (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC) || (rounding == _MM_FROUND_CUR_DIRECTION && _MM_GET_ROUNDING_MODE() == _MM_ROUND_DOWN)) { return _mm_floor_ps(a); } else if (rounding == (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC) || (rounding == _MM_FROUND_CUR_DIRECTION && _MM_GET_ROUNDING_MODE() == _MM_ROUND_UP)) { return _mm_ceil_ps(a); } return _mm_set_ps(v_float[3] > 0 ? floorf(v_float[3]) : ceilf(v_float[3]), v_float[2] > 0 ? floorf(v_float[2]) : ceilf(v_float[2]), v_float[1] > 0 ? floorf(v_float[1]) : ceilf(v_float[1]), v_float[0] > 0 ? floorf(v_float[0]) : ceilf(v_float[0])); #endif } // Round the lower double-precision (64-bit) floating-point element in b using // the rounding parameter, store the result as a double-precision floating-point // element in the lower element of dst, and copy the upper element from a to the // upper element of dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_round_sd FORCE_INLINE __m128d _mm_round_sd(__m128d a, __m128d b, int rounding) { return _mm_move_sd(a, _mm_round_pd(b, rounding)); } // Round the lower single-precision (32-bit) floating-point element in b using // the rounding parameter, store the result as a single-precision floating-point // element in the lower element of dst, and copy the upper 3 packed elements // from a to the upper elements of dst. Rounding is done according to the // rounding[3:0] parameter, which can be one of: // (_MM_FROUND_TO_NEAREST_INT |_MM_FROUND_NO_EXC) // round to nearest, and // suppress exceptions // (_MM_FROUND_TO_NEG_INF |_MM_FROUND_NO_EXC) // round down, and // suppress exceptions // (_MM_FROUND_TO_POS_INF |_MM_FROUND_NO_EXC) // round up, and suppress // exceptions // (_MM_FROUND_TO_ZERO |_MM_FROUND_NO_EXC) // truncate, and suppress // exceptions _MM_FROUND_CUR_DIRECTION // use MXCSR.RC; see // _MM_SET_ROUNDING_MODE // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_round_ss FORCE_INLINE __m128 _mm_round_ss(__m128 a, __m128 b, int rounding) { return _mm_move_ss(a, _mm_round_ps(b, rounding)); } // Load 128-bits of integer data from memory into dst using a non-temporal // memory hint. mem_addr must be aligned on a 16-byte boundary or a // general-protection exception may be generated. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_load_si128 FORCE_INLINE __m128i _mm_stream_load_si128(__m128i *p) { #if __has_builtin(__builtin_nontemporal_store) return __builtin_nontemporal_load(p); #else return vreinterpretq_m128i_s64(vld1q_s64((int64_t *) p)); #endif } // Compute the bitwise NOT of a and then AND with a 128-bit vector containing // all 1's, and return 1 if the result is zero, otherwise return 0. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_test_all_ones FORCE_INLINE int _mm_test_all_ones(__m128i a) { return (uint64_t) (vgetq_lane_s64(a, 0) & vgetq_lane_s64(a, 1)) == ~(uint64_t) 0; } // Compute the bitwise AND of 128 bits (representing integer data) in a and // mask, and return 1 if the result is zero, otherwise return 0. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_test_all_zeros FORCE_INLINE int _mm_test_all_zeros(__m128i a, __m128i mask) { int64x2_t a_and_mask = vandq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(mask)); return !(vgetq_lane_s64(a_and_mask, 0) | vgetq_lane_s64(a_and_mask, 1)); } // Compute the bitwise AND of 128 bits (representing integer data) in a and // mask, and set ZF to 1 if the result is zero, otherwise set ZF to 0. Compute // the bitwise NOT of a and then AND with mask, and set CF to 1 if the result is // zero, otherwise set CF to 0. Return 1 if both the ZF and CF values are zero, // otherwise return 0. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_test_mix_ones_zero // Note: Argument names may be wrong in the Intel intrinsics guide. FORCE_INLINE int _mm_test_mix_ones_zeros(__m128i a, __m128i mask) { uint64x2_t v = vreinterpretq_u64_m128i(a); uint64x2_t m = vreinterpretq_u64_m128i(mask); // find ones (set-bits) and zeros (clear-bits) under clip mask uint64x2_t ones = vandq_u64(m, v); uint64x2_t zeros = vbicq_u64(m, v); // If both 128-bit variables are populated (non-zero) then return 1. // For comparision purposes, first compact each var down to 32-bits. uint32x2_t reduced = vpmax_u32(vqmovn_u64(ones), vqmovn_u64(zeros)); // if folding minimum is non-zero then both vars must be non-zero return (vget_lane_u32(vpmin_u32(reduced, reduced), 0) != 0); } // Compute the bitwise AND of 128 bits (representing integer data) in a and b, // and set ZF to 1 if the result is zero, otherwise set ZF to 0. Compute the // bitwise NOT of a and then AND with b, and set CF to 1 if the result is zero, // otherwise set CF to 0. Return the CF value. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_testc_si128 FORCE_INLINE int _mm_testc_si128(__m128i a, __m128i b) { int64x2_t s64 = vbicq_s64(vreinterpretq_s64_m128i(b), vreinterpretq_s64_m128i(a)); return !(vgetq_lane_s64(s64, 0) | vgetq_lane_s64(s64, 1)); } // Compute the bitwise AND of 128 bits (representing integer data) in a and b, // and set ZF to 1 if the result is zero, otherwise set ZF to 0. Compute the // bitwise NOT of a and then AND with b, and set CF to 1 if the result is zero, // otherwise set CF to 0. Return 1 if both the ZF and CF values are zero, // otherwise return 0. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_testnzc_si128 #define _mm_testnzc_si128(a, b) _mm_test_mix_ones_zeros(a, b) // Compute the bitwise AND of 128 bits (representing integer data) in a and b, // and set ZF to 1 if the result is zero, otherwise set ZF to 0. Compute the // bitwise NOT of a and then AND with b, and set CF to 1 if the result is zero, // otherwise set CF to 0. Return the ZF value. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_testz_si128 FORCE_INLINE int _mm_testz_si128(__m128i a, __m128i b) { int64x2_t s64 = vandq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b)); return !(vgetq_lane_s64(s64, 0) | vgetq_lane_s64(s64, 1)); } /* SSE4.2 */ static const uint16_t ALIGN_STRUCT(16) _sse2neon_cmpestr_mask16b[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, }; static const uint8_t ALIGN_STRUCT(16) _sse2neon_cmpestr_mask8b[16] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, }; /* specify the source data format */ #define _SIDD_UBYTE_OPS 0x00 /* unsigned 8-bit characters */ #define _SIDD_UWORD_OPS 0x01 /* unsigned 16-bit characters */ #define _SIDD_SBYTE_OPS 0x02 /* signed 8-bit characters */ #define _SIDD_SWORD_OPS 0x03 /* signed 16-bit characters */ /* specify the comparison operation */ #define _SIDD_CMP_EQUAL_ANY 0x00 /* compare equal any: strchr */ #define _SIDD_CMP_RANGES 0x04 /* compare ranges */ #define _SIDD_CMP_EQUAL_EACH 0x08 /* compare equal each: strcmp */ #define _SIDD_CMP_EQUAL_ORDERED 0x0C /* compare equal ordered */ /* specify the polarity */ #define _SIDD_POSITIVE_POLARITY 0x00 #define _SIDD_MASKED_POSITIVE_POLARITY 0x20 #define _SIDD_NEGATIVE_POLARITY 0x10 /* negate results */ #define _SIDD_MASKED_NEGATIVE_POLARITY \ 0x30 /* negate results only before end of string */ /* specify the output selection in _mm_cmpXstri */ #define _SIDD_LEAST_SIGNIFICANT 0x00 #define _SIDD_MOST_SIGNIFICANT 0x40 /* specify the output selection in _mm_cmpXstrm */ #define _SIDD_BIT_MASK 0x00 #define _SIDD_UNIT_MASK 0x40 /* Pattern Matching for C macros. * https://github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms */ /* catenate */ #define SSE2NEON_PRIMITIVE_CAT(a, ...) a##__VA_ARGS__ #define SSE2NEON_CAT(a, b) SSE2NEON_PRIMITIVE_CAT(a, b) #define SSE2NEON_IIF(c) SSE2NEON_PRIMITIVE_CAT(SSE2NEON_IIF_, c) /* run the 2nd parameter */ #define SSE2NEON_IIF_0(t, ...) __VA_ARGS__ /* run the 1st parameter */ #define SSE2NEON_IIF_1(t, ...) t #define SSE2NEON_COMPL(b) SSE2NEON_PRIMITIVE_CAT(SSE2NEON_COMPL_, b) #define SSE2NEON_COMPL_0 1 #define SSE2NEON_COMPL_1 0 #define SSE2NEON_DEC(x) SSE2NEON_PRIMITIVE_CAT(SSE2NEON_DEC_, x) #define SSE2NEON_DEC_1 0 #define SSE2NEON_DEC_2 1 #define SSE2NEON_DEC_3 2 #define SSE2NEON_DEC_4 3 #define SSE2NEON_DEC_5 4 #define SSE2NEON_DEC_6 5 #define SSE2NEON_DEC_7 6 #define SSE2NEON_DEC_8 7 #define SSE2NEON_DEC_9 8 #define SSE2NEON_DEC_10 9 #define SSE2NEON_DEC_11 10 #define SSE2NEON_DEC_12 11 #define SSE2NEON_DEC_13 12 #define SSE2NEON_DEC_14 13 #define SSE2NEON_DEC_15 14 #define SSE2NEON_DEC_16 15 /* detection */ #define SSE2NEON_CHECK_N(x, n, ...) n #define SSE2NEON_CHECK(...) SSE2NEON_CHECK_N(__VA_ARGS__, 0, ) #define SSE2NEON_PROBE(x) x, 1, #define SSE2NEON_NOT(x) SSE2NEON_CHECK(SSE2NEON_PRIMITIVE_CAT(SSE2NEON_NOT_, x)) #define SSE2NEON_NOT_0 SSE2NEON_PROBE(~) #define SSE2NEON_BOOL(x) SSE2NEON_COMPL(SSE2NEON_NOT(x)) #define SSE2NEON_IF(c) SSE2NEON_IIF(SSE2NEON_BOOL(c)) #define SSE2NEON_EAT(...) #define SSE2NEON_EXPAND(...) __VA_ARGS__ #define SSE2NEON_WHEN(c) SSE2NEON_IF(c)(SSE2NEON_EXPAND, SSE2NEON_EAT) /* recursion */ /* deferred expression */ #define SSE2NEON_EMPTY() #define SSE2NEON_DEFER(id) id SSE2NEON_EMPTY() #define SSE2NEON_OBSTRUCT(...) __VA_ARGS__ SSE2NEON_DEFER(SSE2NEON_EMPTY)() #define SSE2NEON_EXPAND(...) __VA_ARGS__ #define SSE2NEON_EVAL(...) \ SSE2NEON_EVAL1(SSE2NEON_EVAL1(SSE2NEON_EVAL1(__VA_ARGS__))) #define SSE2NEON_EVAL1(...) \ SSE2NEON_EVAL2(SSE2NEON_EVAL2(SSE2NEON_EVAL2(__VA_ARGS__))) #define SSE2NEON_EVAL2(...) \ SSE2NEON_EVAL3(SSE2NEON_EVAL3(SSE2NEON_EVAL3(__VA_ARGS__))) #define SSE2NEON_EVAL3(...) __VA_ARGS__ #define SSE2NEON_REPEAT(count, macro, ...) \ SSE2NEON_WHEN(count) \ (SSE2NEON_OBSTRUCT(SSE2NEON_REPEAT_INDIRECT)()( \ SSE2NEON_DEC(count), macro, \ __VA_ARGS__) SSE2NEON_OBSTRUCT(macro)(SSE2NEON_DEC(count), \ __VA_ARGS__)) #define SSE2NEON_REPEAT_INDIRECT() SSE2NEON_REPEAT #define SSE2NEON_SIZE_OF_byte 8 #define SSE2NEON_NUMBER_OF_LANES_byte 16 #define SSE2NEON_SIZE_OF_word 16 #define SSE2NEON_NUMBER_OF_LANES_word 8 #define SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE(i, type) \ mtx[i] = vreinterpretq_m128i_##type(vceqq_##type( \ vdupq_n_##type(vgetq_lane_##type(vreinterpretq_##type##_m128i(b), i)), \ vreinterpretq_##type##_m128i(a))); #define SSE2NEON_FILL_LANE(i, type) \ vec_b[i] = \ vdupq_n_##type(vgetq_lane_##type(vreinterpretq_##type##_m128i(b), i)); #define PCMPSTR_RANGES(a, b, mtx, data_type_prefix, type_prefix, size, \ number_of_lanes, byte_or_word) \ do { \ SSE2NEON_CAT( \ data_type_prefix, \ SSE2NEON_CAT(size, \ SSE2NEON_CAT(x, SSE2NEON_CAT(number_of_lanes, _t)))) \ vec_b[number_of_lanes]; \ __m128i mask = SSE2NEON_IIF(byte_or_word)( \ vreinterpretq_m128i_u16(vdupq_n_u16(0xff)), \ vreinterpretq_m128i_u32(vdupq_n_u32(0xffff))); \ SSE2NEON_EVAL(SSE2NEON_REPEAT(number_of_lanes, SSE2NEON_FILL_LANE, \ SSE2NEON_CAT(type_prefix, size))) \ for (int i = 0; i < number_of_lanes; i++) { \ mtx[i] = SSE2NEON_CAT(vreinterpretq_m128i_u, \ size)(SSE2NEON_CAT(vbslq_u, size)( \ SSE2NEON_CAT(vreinterpretq_u, \ SSE2NEON_CAT(size, _m128i))(mask), \ SSE2NEON_CAT(vcgeq_, SSE2NEON_CAT(type_prefix, size))( \ vec_b[i], \ SSE2NEON_CAT( \ vreinterpretq_, \ SSE2NEON_CAT(type_prefix, \ SSE2NEON_CAT(size, _m128i(a))))), \ SSE2NEON_CAT(vcleq_, SSE2NEON_CAT(type_prefix, size))( \ vec_b[i], \ SSE2NEON_CAT( \ vreinterpretq_, \ SSE2NEON_CAT(type_prefix, \ SSE2NEON_CAT(size, _m128i(a))))))); \ } \ } while (0) #define PCMPSTR_EQ(a, b, mtx, size, number_of_lanes) \ do { \ SSE2NEON_EVAL(SSE2NEON_REPEAT(number_of_lanes, \ SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE, \ SSE2NEON_CAT(u, size))) \ } while (0) #define SSE2NEON_CMP_EQUAL_ANY_IMPL(type) \ static int _sse2neon_cmp_##type##_equal_any(__m128i a, int la, __m128i b, \ int lb) \ { \ __m128i mtx[16]; \ PCMPSTR_EQ(a, b, mtx, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type)); \ return SSE2NEON_CAT( \ _sse2neon_aggregate_equal_any_, \ SSE2NEON_CAT( \ SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \ type))))(la, lb, mtx); \ } #define SSE2NEON_CMP_RANGES_IMPL(type, data_type, us, byte_or_word) \ static int _sse2neon_cmp_##us##type##_ranges(__m128i a, int la, __m128i b, \ int lb) \ { \ __m128i mtx[16]; \ PCMPSTR_RANGES( \ a, b, mtx, data_type, us, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type), byte_or_word); \ return SSE2NEON_CAT( \ _sse2neon_aggregate_ranges_, \ SSE2NEON_CAT( \ SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \ type))))(la, lb, mtx); \ } #define SSE2NEON_CMP_EQUAL_ORDERED_IMPL(type) \ static int _sse2neon_cmp_##type##_equal_ordered(__m128i a, int la, \ __m128i b, int lb) \ { \ __m128i mtx[16]; \ PCMPSTR_EQ(a, b, mtx, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type)); \ return SSE2NEON_CAT( \ _sse2neon_aggregate_equal_ordered_, \ SSE2NEON_CAT( \ SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ SSE2NEON_CAT(x, \ SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type))))( \ SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type), la, lb, mtx); \ } static int _sse2neon_aggregate_equal_any_8x16(int la, int lb, __m128i mtx[16]) { int res = 0; int m = (1 << la) - 1; uint8x8_t vec_mask = vld1_u8(_sse2neon_cmpestr_mask8b); uint8x8_t t_lo = vtst_u8(vdup_n_u8(m & 0xff), vec_mask); uint8x8_t t_hi = vtst_u8(vdup_n_u8(m >> 8), vec_mask); uint8x16_t vec = vcombine_u8(t_lo, t_hi); for (int j = 0; j < lb; j++) { mtx[j] = vreinterpretq_m128i_u8( vandq_u8(vec, vreinterpretq_u8_m128i(mtx[j]))); mtx[j] = vreinterpretq_m128i_u8( vshrq_n_u8(vreinterpretq_u8_m128i(mtx[j]), 7)); int tmp = _sse2neon_vaddvq_u8(vreinterpretq_u8_m128i(mtx[j])) ? 1 : 0; res |= (tmp << j); } return res; } static int _sse2neon_aggregate_equal_any_16x8(int la, int lb, __m128i mtx[16]) { int res = 0; int m = (1 << la) - 1; uint16x8_t vec = vtstq_u16(vdupq_n_u16(m), vld1q_u16(_sse2neon_cmpestr_mask16b)); for (int j = 0; j < lb; j++) { mtx[j] = vreinterpretq_m128i_u16( vandq_u16(vec, vreinterpretq_u16_m128i(mtx[j]))); mtx[j] = vreinterpretq_m128i_u16( vshrq_n_u16(vreinterpretq_u16_m128i(mtx[j]), 15)); int tmp = _sse2neon_vaddvq_u16(vreinterpretq_u16_m128i(mtx[j])) ? 1 : 0; res |= (tmp << j); } return res; } /* clang-format off */ #define SSE2NEON_GENERATE_CMP_EQUAL_ANY(prefix) \ prefix##IMPL(byte) \ prefix##IMPL(word) /* clang-format on */ SSE2NEON_GENERATE_CMP_EQUAL_ANY(SSE2NEON_CMP_EQUAL_ANY_) static int _sse2neon_aggregate_ranges_16x8(int la, int lb, __m128i mtx[16]) { int res = 0; int m = (1 << la) - 1; uint16x8_t vec = vtstq_u16(vdupq_n_u16(m), vld1q_u16(_sse2neon_cmpestr_mask16b)); for (int j = 0; j < lb; j++) { mtx[j] = vreinterpretq_m128i_u16( vandq_u16(vec, vreinterpretq_u16_m128i(mtx[j]))); mtx[j] = vreinterpretq_m128i_u16( vshrq_n_u16(vreinterpretq_u16_m128i(mtx[j]), 15)); __m128i tmp = vreinterpretq_m128i_u32( vshrq_n_u32(vreinterpretq_u32_m128i(mtx[j]), 16)); uint32x4_t vec_res = vandq_u32(vreinterpretq_u32_m128i(mtx[j]), vreinterpretq_u32_m128i(tmp)); #if defined(__aarch64__) || defined(_M_ARM64) int t = vaddvq_u32(vec_res) ? 1 : 0; #else uint64x2_t sumh = vpaddlq_u32(vec_res); int t = vgetq_lane_u64(sumh, 0) + vgetq_lane_u64(sumh, 1); #endif res |= (t << j); } return res; } static int _sse2neon_aggregate_ranges_8x16(int la, int lb, __m128i mtx[16]) { int res = 0; int m = (1 << la) - 1; uint8x8_t vec_mask = vld1_u8(_sse2neon_cmpestr_mask8b); uint8x8_t t_lo = vtst_u8(vdup_n_u8(m & 0xff), vec_mask); uint8x8_t t_hi = vtst_u8(vdup_n_u8(m >> 8), vec_mask); uint8x16_t vec = vcombine_u8(t_lo, t_hi); for (int j = 0; j < lb; j++) { mtx[j] = vreinterpretq_m128i_u8( vandq_u8(vec, vreinterpretq_u8_m128i(mtx[j]))); mtx[j] = vreinterpretq_m128i_u8( vshrq_n_u8(vreinterpretq_u8_m128i(mtx[j]), 7)); __m128i tmp = vreinterpretq_m128i_u16( vshrq_n_u16(vreinterpretq_u16_m128i(mtx[j]), 8)); uint16x8_t vec_res = vandq_u16(vreinterpretq_u16_m128i(mtx[j]), vreinterpretq_u16_m128i(tmp)); int t = _sse2neon_vaddvq_u16(vec_res) ? 1 : 0; res |= (t << j); } return res; } #define SSE2NEON_CMP_RANGES_IS_BYTE 1 #define SSE2NEON_CMP_RANGES_IS_WORD 0 /* clang-format off */ #define SSE2NEON_GENERATE_CMP_RANGES(prefix) \ prefix##IMPL(byte, uint, u, prefix##IS_BYTE) \ prefix##IMPL(byte, int, s, prefix##IS_BYTE) \ prefix##IMPL(word, uint, u, prefix##IS_WORD) \ prefix##IMPL(word, int, s, prefix##IS_WORD) /* clang-format on */ SSE2NEON_GENERATE_CMP_RANGES(SSE2NEON_CMP_RANGES_) #undef SSE2NEON_CMP_RANGES_IS_BYTE #undef SSE2NEON_CMP_RANGES_IS_WORD static int _sse2neon_cmp_byte_equal_each(__m128i a, int la, __m128i b, int lb) { uint8x16_t mtx = vceqq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b)); int m0 = (la < lb) ? 0 : ((1 << la) - (1 << lb)); int m1 = 0x10000 - (1 << la); int tb = 0x10000 - (1 << lb); uint8x8_t vec_mask, vec0_lo, vec0_hi, vec1_lo, vec1_hi; uint8x8_t tmp_lo, tmp_hi, res_lo, res_hi; vec_mask = vld1_u8(_sse2neon_cmpestr_mask8b); vec0_lo = vtst_u8(vdup_n_u8(m0), vec_mask); vec0_hi = vtst_u8(vdup_n_u8(m0 >> 8), vec_mask); vec1_lo = vtst_u8(vdup_n_u8(m1), vec_mask); vec1_hi = vtst_u8(vdup_n_u8(m1 >> 8), vec_mask); tmp_lo = vtst_u8(vdup_n_u8(tb), vec_mask); tmp_hi = vtst_u8(vdup_n_u8(tb >> 8), vec_mask); res_lo = vbsl_u8(vec0_lo, vdup_n_u8(0), vget_low_u8(mtx)); res_hi = vbsl_u8(vec0_hi, vdup_n_u8(0), vget_high_u8(mtx)); res_lo = vbsl_u8(vec1_lo, tmp_lo, res_lo); res_hi = vbsl_u8(vec1_hi, tmp_hi, res_hi); res_lo = vand_u8(res_lo, vec_mask); res_hi = vand_u8(res_hi, vec_mask); int res = _sse2neon_vaddv_u8(res_lo) + (_sse2neon_vaddv_u8(res_hi) << 8); return res; } static int _sse2neon_cmp_word_equal_each(__m128i a, int la, __m128i b, int lb) { uint16x8_t mtx = vceqq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b)); int m0 = (la < lb) ? 0 : ((1 << la) - (1 << lb)); int m1 = 0x100 - (1 << la); int tb = 0x100 - (1 << lb); uint16x8_t vec_mask = vld1q_u16(_sse2neon_cmpestr_mask16b); uint16x8_t vec0 = vtstq_u16(vdupq_n_u16(m0), vec_mask); uint16x8_t vec1 = vtstq_u16(vdupq_n_u16(m1), vec_mask); uint16x8_t tmp = vtstq_u16(vdupq_n_u16(tb), vec_mask); mtx = vbslq_u16(vec0, vdupq_n_u16(0), mtx); mtx = vbslq_u16(vec1, tmp, mtx); mtx = vandq_u16(mtx, vec_mask); return _sse2neon_vaddvq_u16(mtx); } #define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UBYTE 1 #define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UWORD 0 #define SSE2NEON_AGGREGATE_EQUAL_ORDER_IMPL(size, number_of_lanes, data_type) \ static int _sse2neon_aggregate_equal_ordered_##size##x##number_of_lanes( \ int bound, int la, int lb, __m128i mtx[16]) \ { \ int res = 0; \ int m1 = SSE2NEON_IIF(data_type)(0x10000, 0x100) - (1 << la); \ uint##size##x8_t vec_mask = SSE2NEON_IIF(data_type)( \ vld1_u##size(_sse2neon_cmpestr_mask##size##b), \ vld1q_u##size(_sse2neon_cmpestr_mask##size##b)); \ uint##size##x##number_of_lanes##_t vec1 = SSE2NEON_IIF(data_type)( \ vcombine_u##size(vtst_u##size(vdup_n_u##size(m1), vec_mask), \ vtst_u##size(vdup_n_u##size(m1 >> 8), vec_mask)), \ vtstq_u##size(vdupq_n_u##size(m1), vec_mask)); \ uint##size##x##number_of_lanes##_t vec_minusone = vdupq_n_u##size(-1); \ uint##size##x##number_of_lanes##_t vec_zero = vdupq_n_u##size(0); \ for (int j = 0; j < lb; j++) { \ mtx[j] = vreinterpretq_m128i_u##size(vbslq_u##size( \ vec1, vec_minusone, vreinterpretq_u##size##_m128i(mtx[j]))); \ } \ for (int j = lb; j < bound; j++) { \ mtx[j] = vreinterpretq_m128i_u##size( \ vbslq_u##size(vec1, vec_minusone, vec_zero)); \ } \ unsigned SSE2NEON_IIF(data_type)(char, short) *ptr = \ (unsigned SSE2NEON_IIF(data_type)(char, short) *) mtx; \ for (int i = 0; i < bound; i++) { \ int val = 1; \ for (int j = 0, k = i; j < bound - i && k < bound; j++, k++) \ val &= ptr[k * bound + j]; \ res += val << i; \ } \ return res; \ } /* clang-format off */ #define SSE2NEON_GENERATE_AGGREGATE_EQUAL_ORDER(prefix) \ prefix##IMPL(8, 16, prefix##IS_UBYTE) \ prefix##IMPL(16, 8, prefix##IS_UWORD) /* clang-format on */ SSE2NEON_GENERATE_AGGREGATE_EQUAL_ORDER(SSE2NEON_AGGREGATE_EQUAL_ORDER_) #undef SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UBYTE #undef SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UWORD /* clang-format off */ #define SSE2NEON_GENERATE_CMP_EQUAL_ORDERED(prefix) \ prefix##IMPL(byte) \ prefix##IMPL(word) /* clang-format on */ SSE2NEON_GENERATE_CMP_EQUAL_ORDERED(SSE2NEON_CMP_EQUAL_ORDERED_) #define SSE2NEON_CMPESTR_LIST \ _(CMP_UBYTE_EQUAL_ANY, cmp_byte_equal_any) \ _(CMP_UWORD_EQUAL_ANY, cmp_word_equal_any) \ _(CMP_SBYTE_EQUAL_ANY, cmp_byte_equal_any) \ _(CMP_SWORD_EQUAL_ANY, cmp_word_equal_any) \ _(CMP_UBYTE_RANGES, cmp_ubyte_ranges) \ _(CMP_UWORD_RANGES, cmp_uword_ranges) \ _(CMP_SBYTE_RANGES, cmp_sbyte_ranges) \ _(CMP_SWORD_RANGES, cmp_sword_ranges) \ _(CMP_UBYTE_EQUAL_EACH, cmp_byte_equal_each) \ _(CMP_UWORD_EQUAL_EACH, cmp_word_equal_each) \ _(CMP_SBYTE_EQUAL_EACH, cmp_byte_equal_each) \ _(CMP_SWORD_EQUAL_EACH, cmp_word_equal_each) \ _(CMP_UBYTE_EQUAL_ORDERED, cmp_byte_equal_ordered) \ _(CMP_UWORD_EQUAL_ORDERED, cmp_word_equal_ordered) \ _(CMP_SBYTE_EQUAL_ORDERED, cmp_byte_equal_ordered) \ _(CMP_SWORD_EQUAL_ORDERED, cmp_word_equal_ordered) enum { #define _(name, func_suffix) name, SSE2NEON_CMPESTR_LIST #undef _ }; typedef int (*cmpestr_func_t)(__m128i a, int la, __m128i b, int lb); static cmpestr_func_t _sse2neon_cmpfunc_table[] = { #define _(name, func_suffix) _sse2neon_##func_suffix, SSE2NEON_CMPESTR_LIST #undef _ }; FORCE_INLINE int _sse2neon_sido_negative(int res, int lb, int imm8, int bound) { switch (imm8 & 0x30) { case _SIDD_NEGATIVE_POLARITY: res ^= 0xffffffff; break; case _SIDD_MASKED_NEGATIVE_POLARITY: res ^= (1 << lb) - 1; break; default: break; } return res & ((bound == 8) ? 0xFF : 0xFFFF); } FORCE_INLINE int _sse2neon_clz(unsigned int x) { #ifdef _MSC_VER unsigned long cnt = 0; if (_BitScanReverse(&cnt, x)) return 31 - cnt; return 32; #else return x != 0 ? __builtin_clz(x) : 32; #endif } FORCE_INLINE int _sse2neon_ctz(unsigned int x) { #ifdef _MSC_VER unsigned long cnt = 0; if (_BitScanForward(&cnt, x)) return cnt; return 32; #else return x != 0 ? __builtin_ctz(x) : 32; #endif } FORCE_INLINE int _sse2neon_ctzll(unsigned long long x) { #ifdef _MSC_VER unsigned long cnt; #if defined(SSE2NEON_HAS_BITSCAN64) if (_BitScanForward64(&cnt, x)) return (int) (cnt); #else if (_BitScanForward(&cnt, (unsigned long) (x))) return (int) cnt; if (_BitScanForward(&cnt, (unsigned long) (x >> 32))) return (int) (cnt + 32); #endif /* SSE2NEON_HAS_BITSCAN64 */ return 64; #else /* assume GNU compatible compilers */ return x != 0 ? __builtin_ctzll(x) : 64; #endif } #define SSE2NEON_MIN(x, y) (x) < (y) ? (x) : (y) #define SSE2NEON_CMPSTR_SET_UPPER(var, imm) \ const int var = (imm & 0x01) ? 8 : 16 #define SSE2NEON_CMPESTRX_LEN_PAIR(a, b, la, lb) \ int tmp1 = la ^ (la >> 31); \ la = tmp1 - (la >> 31); \ int tmp2 = lb ^ (lb >> 31); \ lb = tmp2 - (lb >> 31); \ la = SSE2NEON_MIN(la, bound); \ lb = SSE2NEON_MIN(lb, bound) // Compare all pairs of character in string a and b, // then aggregate the result. // As the only difference of PCMPESTR* and PCMPISTR* is the way to calculate the // length of string, we use SSE2NEON_CMP{I,E}STRX_GET_LEN to get the length of // string a and b. #define SSE2NEON_COMP_AGG(a, b, la, lb, imm8, IE) \ SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); \ SSE2NEON_##IE##_LEN_PAIR(a, b, la, lb); \ int r2 = (_sse2neon_cmpfunc_table[imm8 & 0x0f])(a, la, b, lb); \ r2 = _sse2neon_sido_negative(r2, lb, imm8, bound) #define SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8) \ return (r2 == 0) ? bound \ : ((imm8 & 0x40) ? (31 - _sse2neon_clz(r2)) \ : _sse2neon_ctz(r2)) #define SSE2NEON_CMPSTR_GENERATE_MASK(dst) \ __m128i dst = vreinterpretq_m128i_u8(vdupq_n_u8(0)); \ if (imm8 & 0x40) { \ if (bound == 8) { \ uint16x8_t tmp = vtstq_u16(vdupq_n_u16(r2), \ vld1q_u16(_sse2neon_cmpestr_mask16b)); \ dst = vreinterpretq_m128i_u16(vbslq_u16( \ tmp, vdupq_n_u16(-1), vreinterpretq_u16_m128i(dst))); \ } else { \ uint8x16_t vec_r2 = \ vcombine_u8(vdup_n_u8(r2), vdup_n_u8(r2 >> 8)); \ uint8x16_t tmp = \ vtstq_u8(vec_r2, vld1q_u8(_sse2neon_cmpestr_mask8b)); \ dst = vreinterpretq_m128i_u8( \ vbslq_u8(tmp, vdupq_n_u8(-1), vreinterpretq_u8_m128i(dst))); \ } \ } else { \ if (bound == 16) { \ dst = vreinterpretq_m128i_u16( \ vsetq_lane_u16(r2 & 0xffff, vreinterpretq_u16_m128i(dst), 0)); \ } else { \ dst = vreinterpretq_m128i_u8( \ vsetq_lane_u8(r2 & 0xff, vreinterpretq_u8_m128i(dst), 0)); \ } \ } \ return dst // Compare packed strings in a and b with lengths la and lb using the control // in imm8, and returns 1 if b did not contain a null character and the // resulting mask was zero, and 0 otherwise. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestra FORCE_INLINE int _mm_cmpestra(__m128i a, int la, __m128i b, int lb, const int imm8) { int lb_cpy = lb; SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); return !r2 & (lb_cpy > bound); } // Compare packed strings in a and b with lengths la and lb using the control in // imm8, and returns 1 if the resulting mask was non-zero, and 0 otherwise. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestrc FORCE_INLINE int _mm_cmpestrc(__m128i a, int la, __m128i b, int lb, const int imm8) { SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); return r2 != 0; } // Compare packed strings in a and b with lengths la and lb using the control // in imm8, and store the generated index in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestri FORCE_INLINE int _mm_cmpestri(__m128i a, int la, __m128i b, int lb, const int imm8) { SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8); } // Compare packed strings in a and b with lengths la and lb using the control // in imm8, and store the generated mask in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestrm FORCE_INLINE __m128i _mm_cmpestrm(__m128i a, int la, __m128i b, int lb, const int imm8) { SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); SSE2NEON_CMPSTR_GENERATE_MASK(dst); } // Compare packed strings in a and b with lengths la and lb using the control in // imm8, and returns bit 0 of the resulting bit mask. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestro FORCE_INLINE int _mm_cmpestro(__m128i a, int la, __m128i b, int lb, const int imm8) { SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); return r2 & 1; } // Compare packed strings in a and b with lengths la and lb using the control in // imm8, and returns 1 if any character in a was null, and 0 otherwise. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestrs FORCE_INLINE int _mm_cmpestrs(__m128i a, int la, __m128i b, int lb, const int imm8) { (void) a; (void) b; (void) lb; SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); return la <= (bound - 1); } // Compare packed strings in a and b with lengths la and lb using the control in // imm8, and returns 1 if any character in b was null, and 0 otherwise. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestrz FORCE_INLINE int _mm_cmpestrz(__m128i a, int la, __m128i b, int lb, const int imm8) { (void) a; (void) b; (void) la; SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); return lb <= (bound - 1); } #define SSE2NEON_CMPISTRX_LENGTH(str, len, imm8) \ do { \ if (imm8 & 0x01) { \ uint16x8_t equal_mask_##str = \ vceqq_u16(vreinterpretq_u16_m128i(str), vdupq_n_u16(0)); \ uint8x8_t res_##str = vshrn_n_u16(equal_mask_##str, 4); \ uint64_t matches_##str = \ vget_lane_u64(vreinterpret_u64_u8(res_##str), 0); \ len = _sse2neon_ctzll(matches_##str) >> 3; \ } else { \ uint16x8_t equal_mask_##str = vreinterpretq_u16_u8( \ vceqq_u8(vreinterpretq_u8_m128i(str), vdupq_n_u8(0))); \ uint8x8_t res_##str = vshrn_n_u16(equal_mask_##str, 4); \ uint64_t matches_##str = \ vget_lane_u64(vreinterpret_u64_u8(res_##str), 0); \ len = _sse2neon_ctzll(matches_##str) >> 2; \ } \ } while (0) #define SSE2NEON_CMPISTRX_LEN_PAIR(a, b, la, lb) \ int la, lb; \ do { \ SSE2NEON_CMPISTRX_LENGTH(a, la, imm8); \ SSE2NEON_CMPISTRX_LENGTH(b, lb, imm8); \ } while (0) // Compare packed strings with implicit lengths in a and b using the control in // imm8, and returns 1 if b did not contain a null character and the resulting // mask was zero, and 0 otherwise. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistra FORCE_INLINE int _mm_cmpistra(__m128i a, __m128i b, const int imm8) { SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); return !r2 & (lb >= bound); } // Compare packed strings with implicit lengths in a and b using the control in // imm8, and returns 1 if the resulting mask was non-zero, and 0 otherwise. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistrc FORCE_INLINE int _mm_cmpistrc(__m128i a, __m128i b, const int imm8) { SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); return r2 != 0; } // Compare packed strings with implicit lengths in a and b using the control in // imm8, and store the generated index in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistri FORCE_INLINE int _mm_cmpistri(__m128i a, __m128i b, const int imm8) { SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8); } // Compare packed strings with implicit lengths in a and b using the control in // imm8, and store the generated mask in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistrm FORCE_INLINE __m128i _mm_cmpistrm(__m128i a, __m128i b, const int imm8) { SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); SSE2NEON_CMPSTR_GENERATE_MASK(dst); } // Compare packed strings with implicit lengths in a and b using the control in // imm8, and returns bit 0 of the resulting bit mask. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistro FORCE_INLINE int _mm_cmpistro(__m128i a, __m128i b, const int imm8) { SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); return r2 & 1; } // Compare packed strings with implicit lengths in a and b using the control in // imm8, and returns 1 if any character in a was null, and 0 otherwise. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistrs FORCE_INLINE int _mm_cmpistrs(__m128i a, __m128i b, const int imm8) { (void) b; SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); int la; SSE2NEON_CMPISTRX_LENGTH(a, la, imm8); return la <= (bound - 1); } // Compare packed strings with implicit lengths in a and b using the control in // imm8, and returns 1 if any character in b was null, and 0 otherwise. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistrz FORCE_INLINE int _mm_cmpistrz(__m128i a, __m128i b, const int imm8) { (void) a; SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); int lb; SSE2NEON_CMPISTRX_LENGTH(b, lb, imm8); return lb <= (bound - 1); } // Compares the 2 signed 64-bit integers in a and the 2 signed 64-bit integers // in b for greater than. FORCE_INLINE __m128i _mm_cmpgt_epi64(__m128i a, __m128i b) { #if defined(__aarch64__) || defined(_M_ARM64) return vreinterpretq_m128i_u64( vcgtq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); #else return vreinterpretq_m128i_s64(vshrq_n_s64( vqsubq_s64(vreinterpretq_s64_m128i(b), vreinterpretq_s64_m128i(a)), 63)); #endif } // Starting with the initial value in crc, accumulates a CRC32 value for // unsigned 16-bit integer v, and stores the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_crc32_u16 FORCE_INLINE uint32_t _mm_crc32_u16(uint32_t crc, uint16_t v) { #if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) __asm__ __volatile__("crc32ch %w[c], %w[c], %w[v]\n\t" : [c] "+r"(crc) : [v] "r"(v)); #elif ((__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)) || \ (defined(_M_ARM64) && !defined(__clang__)) crc = __crc32ch(crc, v); #else crc = _mm_crc32_u8(crc, v & 0xff); crc = _mm_crc32_u8(crc, (v >> 8) & 0xff); #endif return crc; } // Starting with the initial value in crc, accumulates a CRC32 value for // unsigned 32-bit integer v, and stores the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_crc32_u32 FORCE_INLINE uint32_t _mm_crc32_u32(uint32_t crc, uint32_t v) { #if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) __asm__ __volatile__("crc32cw %w[c], %w[c], %w[v]\n\t" : [c] "+r"(crc) : [v] "r"(v)); #elif ((__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)) || \ (defined(_M_ARM64) && !defined(__clang__)) crc = __crc32cw(crc, v); #else crc = _mm_crc32_u16(crc, v & 0xffff); crc = _mm_crc32_u16(crc, (v >> 16) & 0xffff); #endif return crc; } // Starting with the initial value in crc, accumulates a CRC32 value for // unsigned 64-bit integer v, and stores the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_crc32_u64 FORCE_INLINE uint64_t _mm_crc32_u64(uint64_t crc, uint64_t v) { #if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) __asm__ __volatile__("crc32cx %w[c], %w[c], %x[v]\n\t" : [c] "+r"(crc) : [v] "r"(v)); #elif (defined(_M_ARM64) && !defined(__clang__)) crc = __crc32cd((uint32_t) crc, v); #else crc = _mm_crc32_u32((uint32_t) (crc), v & 0xffffffff); crc = _mm_crc32_u32((uint32_t) (crc), (v >> 32) & 0xffffffff); #endif return crc; } // Starting with the initial value in crc, accumulates a CRC32 value for // unsigned 8-bit integer v, and stores the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_crc32_u8 FORCE_INLINE uint32_t _mm_crc32_u8(uint32_t crc, uint8_t v) { #if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) __asm__ __volatile__("crc32cb %w[c], %w[c], %w[v]\n\t" : [c] "+r"(crc) : [v] "r"(v)); #elif ((__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)) || \ (defined(_M_ARM64) && !defined(__clang__)) crc = __crc32cb(crc, v); #else crc ^= v; #if defined(__ARM_FEATURE_CRYPTO) // Adapted from: https://mary.rs/lab/crc32/ // Barrent reduction uint64x2_t orig = vcombine_u64(vcreate_u64((uint64_t) (crc) << 24), vcreate_u64(0x0)); uint64x2_t tmp = orig; // Polynomial P(x) of CRC32C uint64_t p = 0x105EC76F1; // Barrett Reduction (in bit-reflected form) constant mu_{64} = \lfloor // 2^{64} / P(x) \rfloor = 0x11f91caf6 uint64_t mu = 0x1dea713f1; // Multiply by mu_{64} tmp = _sse2neon_vmull_p64(vget_low_u64(tmp), vcreate_u64(mu)); // Divide by 2^{64} (mask away the unnecessary bits) tmp = vandq_u64(tmp, vcombine_u64(vcreate_u64(0xFFFFFFFF), vcreate_u64(0x0))); // Multiply by P(x) (shifted left by 1 for alignment reasons) tmp = _sse2neon_vmull_p64(vget_low_u64(tmp), vcreate_u64(p)); // Subtract original from result tmp = veorq_u64(tmp, orig); // Extract the 'lower' (in bit-reflected sense) 32 bits crc = vgetq_lane_u32(vreinterpretq_u32_u64(tmp), 1); #else // Fall back to the generic table lookup approach // Adapted from: https://create.stephan-brumme.com/crc32/ // Apply half-byte comparision algorithm for the best ratio between // performance and lookup table. // The lookup table just needs to store every 16th entry // of the standard look-up table. static const uint32_t crc32_half_byte_tbl[] = { 0x00000000, 0x105ec76f, 0x20bd8ede, 0x30e349b1, 0x417b1dbc, 0x5125dad3, 0x61c69362, 0x7198540d, 0x82f63b78, 0x92a8fc17, 0xa24bb5a6, 0xb21572c9, 0xc38d26c4, 0xd3d3e1ab, 0xe330a81a, 0xf36e6f75, }; crc = (crc >> 4) ^ crc32_half_byte_tbl[crc & 0x0F]; crc = (crc >> 4) ^ crc32_half_byte_tbl[crc & 0x0F]; #endif #endif return crc; } /* AES */ #if !defined(__ARM_FEATURE_CRYPTO) && (!defined(_M_ARM64) || defined(__clang__)) /* clang-format off */ #define SSE2NEON_AES_SBOX(w) \ { \ w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), \ w(0xc5), w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), \ w(0xab), w(0x76), w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), \ w(0x59), w(0x47), w(0xf0), w(0xad), w(0xd4), w(0xa2), w(0xaf), \ w(0x9c), w(0xa4), w(0x72), w(0xc0), w(0xb7), w(0xfd), w(0x93), \ w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc), w(0x34), w(0xa5), \ w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15), w(0x04), \ w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a), \ w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), \ w(0x75), w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), \ w(0x5a), w(0xa0), w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), \ w(0xe3), w(0x2f), w(0x84), w(0x53), w(0xd1), w(0x00), w(0xed), \ w(0x20), w(0xfc), w(0xb1), w(0x5b), w(0x6a), w(0xcb), w(0xbe), \ w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf), w(0xd0), w(0xef), \ w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85), w(0x45), \ w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8), \ w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), \ w(0xf5), w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), \ w(0xf3), w(0xd2), w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), \ w(0x97), w(0x44), w(0x17), w(0xc4), w(0xa7), w(0x7e), w(0x3d), \ w(0x64), w(0x5d), w(0x19), w(0x73), w(0x60), w(0x81), w(0x4f), \ w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88), w(0x46), w(0xee), \ w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb), w(0xe0), \ w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c), \ w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), \ w(0x79), w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), \ w(0x4e), w(0xa9), w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), \ w(0x7a), w(0xae), w(0x08), w(0xba), w(0x78), w(0x25), w(0x2e), \ w(0x1c), w(0xa6), w(0xb4), w(0xc6), w(0xe8), w(0xdd), w(0x74), \ w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a), w(0x70), w(0x3e), \ w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e), w(0x61), \ w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e), \ w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), \ w(0x94), w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), \ w(0x28), w(0xdf), w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), \ w(0xe6), w(0x42), w(0x68), w(0x41), w(0x99), w(0x2d), w(0x0f), \ w(0xb0), w(0x54), w(0xbb), w(0x16) \ } #define SSE2NEON_AES_RSBOX(w) \ { \ w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), \ w(0x38), w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), \ w(0xd7), w(0xfb), w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), \ w(0x2f), w(0xff), w(0x87), w(0x34), w(0x8e), w(0x43), w(0x44), \ w(0xc4), w(0xde), w(0xe9), w(0xcb), w(0x54), w(0x7b), w(0x94), \ w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d), w(0xee), w(0x4c), \ w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e), w(0x08), \ w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2), \ w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), \ w(0x25), w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), \ w(0x98), w(0x16), w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), \ w(0x65), w(0xb6), w(0x92), w(0x6c), w(0x70), w(0x48), w(0x50), \ w(0xfd), w(0xed), w(0xb9), w(0xda), w(0x5e), w(0x15), w(0x46), \ w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84), w(0x90), w(0xd8), \ w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a), w(0xf7), \ w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06), \ w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), \ w(0x02), w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), \ w(0x8a), w(0x6b), w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), \ w(0x67), w(0xdc), w(0xea), w(0x97), w(0xf2), w(0xcf), w(0xce), \ w(0xf0), w(0xb4), w(0xe6), w(0x73), w(0x96), w(0xac), w(0x74), \ w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85), w(0xe2), w(0xf9), \ w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e), w(0x47), \ w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89), \ w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), \ w(0x1b), w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), \ w(0x79), w(0x20), w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), \ w(0xcd), w(0x5a), w(0xf4), w(0x1f), w(0xdd), w(0xa8), w(0x33), \ w(0x88), w(0x07), w(0xc7), w(0x31), w(0xb1), w(0x12), w(0x10), \ w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f), w(0x60), w(0x51), \ w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d), w(0x2d), \ w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef), \ w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), \ w(0xb0), w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), \ w(0x99), w(0x61), w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), \ w(0x77), w(0xd6), w(0x26), w(0xe1), w(0x69), w(0x14), w(0x63), \ w(0x55), w(0x21), w(0x0c), w(0x7d) \ } /* clang-format on */ /* X Macro trick. See https://en.wikipedia.org/wiki/X_Macro */ #define SSE2NEON_AES_H0(x) (x) static const uint8_t _sse2neon_sbox[256] = SSE2NEON_AES_SBOX(SSE2NEON_AES_H0); static const uint8_t _sse2neon_rsbox[256] = SSE2NEON_AES_RSBOX(SSE2NEON_AES_H0); #undef SSE2NEON_AES_H0 /* x_time function and matrix multiply function */ #if !defined(__aarch64__) && !defined(_M_ARM64) #define SSE2NEON_XT(x) (((x) << 1) ^ ((((x) >> 7) & 1) * 0x1b)) #define SSE2NEON_MULTIPLY(x, y) \ (((y & 1) * x) ^ ((y >> 1 & 1) * SSE2NEON_XT(x)) ^ \ ((y >> 2 & 1) * SSE2NEON_XT(SSE2NEON_XT(x))) ^ \ ((y >> 3 & 1) * SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(x)))) ^ \ ((y >> 4 & 1) * SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(x)))))) #endif // In the absence of crypto extensions, implement aesenc using regular NEON // intrinsics instead. See: // https://www.workofard.com/2017/01/accelerated-aes-for-the-arm64-linux-kernel/ // https://www.workofard.com/2017/07/ghash-for-low-end-cores/ and // for more information. FORCE_INLINE __m128i _mm_aesenc_si128(__m128i a, __m128i RoundKey) { #if defined(__aarch64__) || defined(_M_ARM64) static const uint8_t shift_rows[] = { 0x0, 0x5, 0xa, 0xf, 0x4, 0x9, 0xe, 0x3, 0x8, 0xd, 0x2, 0x7, 0xc, 0x1, 0x6, 0xb, }; static const uint8_t ror32by8[] = { 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4, 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc, }; uint8x16_t v; uint8x16_t w = vreinterpretq_u8_m128i(a); /* shift rows */ w = vqtbl1q_u8(w, vld1q_u8(shift_rows)); /* sub bytes */ // Here, we separate the whole 256-bytes table into 4 64-bytes tables, and // look up each of the table. After each lookup, we load the next table // which locates at the next 64-bytes. In the meantime, the index in the // table would be smaller than it was, so the index parameters of // `vqtbx4q_u8()` need to be added the same constant as the loaded tables. v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_sbox), w); // 'w-0x40' equals to 'vsubq_u8(w, vdupq_n_u8(0x40))' v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x40), w - 0x40); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x80), w - 0x80); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0xc0), w - 0xc0); /* mix columns */ w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b); w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v); w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8)); /* add round key */ return vreinterpretq_m128i_u8(w) ^ RoundKey; #else /* ARMv7-A implementation for a table-based AES */ #define SSE2NEON_AES_B2W(b0, b1, b2, b3) \ (((uint32_t) (b3) << 24) | ((uint32_t) (b2) << 16) | \ ((uint32_t) (b1) << 8) | (uint32_t) (b0)) // muliplying 'x' by 2 in GF(2^8) #define SSE2NEON_AES_F2(x) ((x << 1) ^ (((x >> 7) & 1) * 0x011b /* WPOLY */)) // muliplying 'x' by 3 in GF(2^8) #define SSE2NEON_AES_F3(x) (SSE2NEON_AES_F2(x) ^ x) #define SSE2NEON_AES_U0(p) \ SSE2NEON_AES_B2W(SSE2NEON_AES_F2(p), p, p, SSE2NEON_AES_F3(p)) #define SSE2NEON_AES_U1(p) \ SSE2NEON_AES_B2W(SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p, p) #define SSE2NEON_AES_U2(p) \ SSE2NEON_AES_B2W(p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p) #define SSE2NEON_AES_U3(p) \ SSE2NEON_AES_B2W(p, p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p)) // this generates a table containing every possible permutation of // shift_rows() and sub_bytes() with mix_columns(). static const uint32_t ALIGN_STRUCT(16) aes_table[4][256] = { SSE2NEON_AES_SBOX(SSE2NEON_AES_U0), SSE2NEON_AES_SBOX(SSE2NEON_AES_U1), SSE2NEON_AES_SBOX(SSE2NEON_AES_U2), SSE2NEON_AES_SBOX(SSE2NEON_AES_U3), }; #undef SSE2NEON_AES_B2W #undef SSE2NEON_AES_F2 #undef SSE2NEON_AES_F3 #undef SSE2NEON_AES_U0 #undef SSE2NEON_AES_U1 #undef SSE2NEON_AES_U2 #undef SSE2NEON_AES_U3 uint32_t x0 = _mm_cvtsi128_si32(a); // get a[31:0] uint32_t x1 = _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0x55)); // get a[63:32] uint32_t x2 = _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0xAA)); // get a[95:64] uint32_t x3 = _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0xFF)); // get a[127:96] // finish the modulo addition step in mix_columns() __m128i out = _mm_set_epi32( (aes_table[0][x3 & 0xff] ^ aes_table[1][(x0 >> 8) & 0xff] ^ aes_table[2][(x1 >> 16) & 0xff] ^ aes_table[3][x2 >> 24]), (aes_table[0][x2 & 0xff] ^ aes_table[1][(x3 >> 8) & 0xff] ^ aes_table[2][(x0 >> 16) & 0xff] ^ aes_table[3][x1 >> 24]), (aes_table[0][x1 & 0xff] ^ aes_table[1][(x2 >> 8) & 0xff] ^ aes_table[2][(x3 >> 16) & 0xff] ^ aes_table[3][x0 >> 24]), (aes_table[0][x0 & 0xff] ^ aes_table[1][(x1 >> 8) & 0xff] ^ aes_table[2][(x2 >> 16) & 0xff] ^ aes_table[3][x3 >> 24])); return _mm_xor_si128(out, RoundKey); #endif } // Perform one round of an AES decryption flow on data (state) in a using the // round key in RoundKey, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesdec_si128 FORCE_INLINE __m128i _mm_aesdec_si128(__m128i a, __m128i RoundKey) { #if defined(__aarch64__) static const uint8_t inv_shift_rows[] = { 0x0, 0xd, 0xa, 0x7, 0x4, 0x1, 0xe, 0xb, 0x8, 0x5, 0x2, 0xf, 0xc, 0x9, 0x6, 0x3, }; static const uint8_t ror32by8[] = { 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4, 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc, }; uint8x16_t v; uint8x16_t w = vreinterpretq_u8_m128i(a); // inverse shift rows w = vqtbl1q_u8(w, vld1q_u8(inv_shift_rows)); // inverse sub bytes v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_rsbox), w); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x40), w - 0x40); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x80), w - 0x80); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0xc0), w - 0xc0); // inverse mix columns // multiplying 'v' by 4 in GF(2^8) w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b); w = (w << 1) ^ (uint8x16_t) (((int8x16_t) w >> 7) & 0x1b); v ^= w; v ^= (uint8x16_t) vrev32q_u16((uint16x8_t) w); w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b); // muliplying 'v' by 2 in GF(2^8) w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v); w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8)); // add round key return vreinterpretq_m128i_u8(w) ^ RoundKey; #else /* ARMv7-A NEON implementation */ /* FIXME: optimized for NEON */ uint8_t i, e, f, g, h, v[4][4]; uint8_t *_a = (uint8_t *) &a; for (i = 0; i < 16; ++i) { v[((i / 4) + (i % 4)) % 4][i % 4] = _sse2neon_rsbox[_a[i]]; } // inverse mix columns for (i = 0; i < 4; ++i) { e = v[i][0]; f = v[i][1]; g = v[i][2]; h = v[i][3]; v[i][0] = SSE2NEON_MULTIPLY(e, 0x0e) ^ SSE2NEON_MULTIPLY(f, 0x0b) ^ SSE2NEON_MULTIPLY(g, 0x0d) ^ SSE2NEON_MULTIPLY(h, 0x09); v[i][1] = SSE2NEON_MULTIPLY(e, 0x09) ^ SSE2NEON_MULTIPLY(f, 0x0e) ^ SSE2NEON_MULTIPLY(g, 0x0b) ^ SSE2NEON_MULTIPLY(h, 0x0d); v[i][2] = SSE2NEON_MULTIPLY(e, 0x0d) ^ SSE2NEON_MULTIPLY(f, 0x09) ^ SSE2NEON_MULTIPLY(g, 0x0e) ^ SSE2NEON_MULTIPLY(h, 0x0b); v[i][3] = SSE2NEON_MULTIPLY(e, 0x0b) ^ SSE2NEON_MULTIPLY(f, 0x0d) ^ SSE2NEON_MULTIPLY(g, 0x09) ^ SSE2NEON_MULTIPLY(h, 0x0e); } return vreinterpretq_m128i_u8(vld1q_u8((uint8_t *) v)) ^ RoundKey; #endif } // Perform the last round of an AES encryption flow on data (state) in a using // the round key in RoundKey, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesenclast_si128 FORCE_INLINE __m128i _mm_aesenclast_si128(__m128i a, __m128i RoundKey) { #if defined(__aarch64__) static const uint8_t shift_rows[] = { 0x0, 0x5, 0xa, 0xf, 0x4, 0x9, 0xe, 0x3, 0x8, 0xd, 0x2, 0x7, 0xc, 0x1, 0x6, 0xb, }; uint8x16_t v; uint8x16_t w = vreinterpretq_u8_m128i(a); // shift rows w = vqtbl1q_u8(w, vld1q_u8(shift_rows)); // sub bytes v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_sbox), w); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x40), w - 0x40); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x80), w - 0x80); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0xc0), w - 0xc0); // add round key return vreinterpretq_m128i_u8(v) ^ RoundKey; #else /* ARMv7-A implementation */ uint8_t v[16] = { _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 0)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 5)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 10)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 15)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 4)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 9)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 14)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 3)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 8)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 13)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 2)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 7)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 12)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 1)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 6)], _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 11)], }; return vreinterpretq_m128i_u8(vld1q_u8(v)) ^ RoundKey; #endif } // Perform the last round of an AES decryption flow on data (state) in a using // the round key in RoundKey, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesdeclast_si128 FORCE_INLINE __m128i _mm_aesdeclast_si128(__m128i a, __m128i RoundKey) { #if defined(__aarch64__) static const uint8_t inv_shift_rows[] = { 0x0, 0xd, 0xa, 0x7, 0x4, 0x1, 0xe, 0xb, 0x8, 0x5, 0x2, 0xf, 0xc, 0x9, 0x6, 0x3, }; uint8x16_t v; uint8x16_t w = vreinterpretq_u8_m128i(a); // inverse shift rows w = vqtbl1q_u8(w, vld1q_u8(inv_shift_rows)); // inverse sub bytes v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_rsbox), w); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x40), w - 0x40); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x80), w - 0x80); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0xc0), w - 0xc0); // add round key return vreinterpretq_m128i_u8(v) ^ RoundKey; #else /* ARMv7-A NEON implementation */ /* FIXME: optimized for NEON */ uint8_t v[4][4]; uint8_t *_a = (uint8_t *) &a; for (int i = 0; i < 16; ++i) { v[((i / 4) + (i % 4)) % 4][i % 4] = _sse2neon_rsbox[_a[i]]; } return vreinterpretq_m128i_u8(vld1q_u8((uint8_t *) v)) ^ RoundKey; #endif } // Perform the InvMixColumns transformation on a and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesimc_si128 FORCE_INLINE __m128i _mm_aesimc_si128(__m128i a) { #if defined(__aarch64__) static const uint8_t ror32by8[] = { 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4, 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc, }; uint8x16_t v = vreinterpretq_u8_m128i(a); uint8x16_t w; // multiplying 'v' by 4 in GF(2^8) w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b); w = (w << 1) ^ (uint8x16_t) (((int8x16_t) w >> 7) & 0x1b); v ^= w; v ^= (uint8x16_t) vrev32q_u16((uint16x8_t) w); // multiplying 'v' by 2 in GF(2^8) w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b); w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v); w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8)); return vreinterpretq_m128i_u8(w); #else /* ARMv7-A NEON implementation */ uint8_t i, e, f, g, h, v[4][4]; vst1q_u8((uint8_t *) v, vreinterpretq_u8_m128i(a)); for (i = 0; i < 4; ++i) { e = v[i][0]; f = v[i][1]; g = v[i][2]; h = v[i][3]; v[i][0] = SSE2NEON_MULTIPLY(e, 0x0e) ^ SSE2NEON_MULTIPLY(f, 0x0b) ^ SSE2NEON_MULTIPLY(g, 0x0d) ^ SSE2NEON_MULTIPLY(h, 0x09); v[i][1] = SSE2NEON_MULTIPLY(e, 0x09) ^ SSE2NEON_MULTIPLY(f, 0x0e) ^ SSE2NEON_MULTIPLY(g, 0x0b) ^ SSE2NEON_MULTIPLY(h, 0x0d); v[i][2] = SSE2NEON_MULTIPLY(e, 0x0d) ^ SSE2NEON_MULTIPLY(f, 0x09) ^ SSE2NEON_MULTIPLY(g, 0x0e) ^ SSE2NEON_MULTIPLY(h, 0x0b); v[i][3] = SSE2NEON_MULTIPLY(e, 0x0b) ^ SSE2NEON_MULTIPLY(f, 0x0d) ^ SSE2NEON_MULTIPLY(g, 0x09) ^ SSE2NEON_MULTIPLY(h, 0x0e); } return vreinterpretq_m128i_u8(vld1q_u8((uint8_t *) v)); #endif } // Assist in expanding the AES cipher key by computing steps towards generating // a round key for encryption cipher using data from a and an 8-bit round // constant specified in imm8, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aeskeygenassist_si128 // // Emits the Advanced Encryption Standard (AES) instruction aeskeygenassist. // This instruction generates a round key for AES encryption. See // https://kazakov.life/2017/11/01/cryptocurrency-mining-on-ios-devices/ // for details. FORCE_INLINE __m128i _mm_aeskeygenassist_si128(__m128i a, const int rcon) { #if defined(__aarch64__) uint8x16_t _a = vreinterpretq_u8_m128i(a); uint8x16_t v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_sbox), _a); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x40), _a - 0x40); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x80), _a - 0x80); v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0xc0), _a - 0xc0); uint32x4_t v_u32 = vreinterpretq_u32_u8(v); uint32x4_t ror_v = vorrq_u32(vshrq_n_u32(v_u32, 8), vshlq_n_u32(v_u32, 24)); uint32x4_t ror_xor_v = veorq_u32(ror_v, vdupq_n_u32(rcon)); return vreinterpretq_m128i_u32(vtrn2q_u32(v_u32, ror_xor_v)); #else /* ARMv7-A NEON implementation */ uint32_t X1 = _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0x55)); uint32_t X3 = _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0xFF)); for (int i = 0; i < 4; ++i) { ((uint8_t *) &X1)[i] = _sse2neon_sbox[((uint8_t *) &X1)[i]]; ((uint8_t *) &X3)[i] = _sse2neon_sbox[((uint8_t *) &X3)[i]]; } return _mm_set_epi32(((X3 >> 8) | (X3 << 24)) ^ rcon, X3, ((X1 >> 8) | (X1 << 24)) ^ rcon, X1); #endif } #undef SSE2NEON_AES_SBOX #undef SSE2NEON_AES_RSBOX #if defined(__aarch64__) #undef SSE2NEON_XT #undef SSE2NEON_MULTIPLY #endif #else /* __ARM_FEATURE_CRYPTO */ // Implements equivalent of 'aesenc' by combining AESE (with an empty key) and // AESMC and then manually applying the real key as an xor operation. This // unfortunately means an additional xor op; the compiler should be able to // optimize this away for repeated calls however. See // https://blog.michaelbrase.com/2018/05/08/emulating-x86-aes-intrinsics-on-armv8-a // for more details. FORCE_INLINE __m128i _mm_aesenc_si128(__m128i a, __m128i b) { return vreinterpretq_m128i_u8(veorq_u8( vaesmcq_u8(vaeseq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0))), vreinterpretq_u8_m128i(b))); } // Perform one round of an AES decryption flow on data (state) in a using the // round key in RoundKey, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesdec_si128 FORCE_INLINE __m128i _mm_aesdec_si128(__m128i a, __m128i RoundKey) { return vreinterpretq_m128i_u8(veorq_u8( vaesimcq_u8(vaesdq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0))), vreinterpretq_u8_m128i(RoundKey))); } // Perform the last round of an AES encryption flow on data (state) in a using // the round key in RoundKey, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesenclast_si128 FORCE_INLINE __m128i _mm_aesenclast_si128(__m128i a, __m128i RoundKey) { return _mm_xor_si128(vreinterpretq_m128i_u8(vaeseq_u8( vreinterpretq_u8_m128i(a), vdupq_n_u8(0))), RoundKey); } // Perform the last round of an AES decryption flow on data (state) in a using // the round key in RoundKey, and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesdeclast_si128 FORCE_INLINE __m128i _mm_aesdeclast_si128(__m128i a, __m128i RoundKey) { return vreinterpretq_m128i_u8( veorq_u8(vaesdq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0)), vreinterpretq_u8_m128i(RoundKey))); } // Perform the InvMixColumns transformation on a and store the result in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesimc_si128 FORCE_INLINE __m128i _mm_aesimc_si128(__m128i a) { return vreinterpretq_m128i_u8(vaesimcq_u8(vreinterpretq_u8_m128i(a))); } // Assist in expanding the AES cipher key by computing steps towards generating // a round key for encryption cipher using data from a and an 8-bit round // constant specified in imm8, and store the result in dst." // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aeskeygenassist_si128 FORCE_INLINE __m128i _mm_aeskeygenassist_si128(__m128i a, const int rcon) { // AESE does ShiftRows and SubBytes on A uint8x16_t u8 = vaeseq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0)); #ifndef _MSC_VER uint8x16_t dest = { // Undo ShiftRows step from AESE and extract X1 and X3 u8[0x4], u8[0x1], u8[0xE], u8[0xB], // SubBytes(X1) u8[0x1], u8[0xE], u8[0xB], u8[0x4], // ROT(SubBytes(X1)) u8[0xC], u8[0x9], u8[0x6], u8[0x3], // SubBytes(X3) u8[0x9], u8[0x6], u8[0x3], u8[0xC], // ROT(SubBytes(X3)) }; uint32x4_t r = {0, (unsigned) rcon, 0, (unsigned) rcon}; return vreinterpretq_m128i_u8(dest) ^ vreinterpretq_m128i_u32(r); #else // We have to do this hack because MSVC is strictly adhering to the CPP // standard, in particular C++03 8.5.1 sub-section 15, which states that // unions must be initialized by their first member type. // As per the Windows ARM64 ABI, it is always little endian, so this works __n128 dest{ ((uint64_t) u8.n128_u8[0x4] << 0) | ((uint64_t) u8.n128_u8[0x1] << 8) | ((uint64_t) u8.n128_u8[0xE] << 16) | ((uint64_t) u8.n128_u8[0xB] << 24) | ((uint64_t) u8.n128_u8[0x1] << 32) | ((uint64_t) u8.n128_u8[0xE] << 40) | ((uint64_t) u8.n128_u8[0xB] << 48) | ((uint64_t) u8.n128_u8[0x4] << 56), ((uint64_t) u8.n128_u8[0xC] << 0) | ((uint64_t) u8.n128_u8[0x9] << 8) | ((uint64_t) u8.n128_u8[0x6] << 16) | ((uint64_t) u8.n128_u8[0x3] << 24) | ((uint64_t) u8.n128_u8[0x9] << 32) | ((uint64_t) u8.n128_u8[0x6] << 40) | ((uint64_t) u8.n128_u8[0x3] << 48) | ((uint64_t) u8.n128_u8[0xC] << 56)}; dest.n128_u32[1] = dest.n128_u32[1] ^ rcon; dest.n128_u32[3] = dest.n128_u32[3] ^ rcon; return dest; #endif } #endif /* Others */ // Perform a carry-less multiplication of two 64-bit integers, selected from a // and b according to imm8, and store the results in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_clmulepi64_si128 FORCE_INLINE __m128i _mm_clmulepi64_si128(__m128i _a, __m128i _b, const int imm) { uint64x2_t a = vreinterpretq_u64_m128i(_a); uint64x2_t b = vreinterpretq_u64_m128i(_b); switch (imm & 0x11) { case 0x00: return vreinterpretq_m128i_u64( _sse2neon_vmull_p64(vget_low_u64(a), vget_low_u64(b))); case 0x01: return vreinterpretq_m128i_u64( _sse2neon_vmull_p64(vget_high_u64(a), vget_low_u64(b))); case 0x10: return vreinterpretq_m128i_u64( _sse2neon_vmull_p64(vget_low_u64(a), vget_high_u64(b))); case 0x11: return vreinterpretq_m128i_u64( _sse2neon_vmull_p64(vget_high_u64(a), vget_high_u64(b))); default: abort(); } } FORCE_INLINE unsigned int _sse2neon_mm_get_denormals_zero_mode(void) { union { fpcr_bitfield field; #if defined(__aarch64__) || defined(_M_ARM64) uint64_t value; #else uint32_t value; #endif } r; #if defined(__aarch64__) || defined(_M_ARM64) r.value = _sse2neon_get_fpcr(); #else __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ #endif return r.field.bit24 ? _MM_DENORMALS_ZERO_ON : _MM_DENORMALS_ZERO_OFF; } // Count the number of bits set to 1 in unsigned 32-bit integer a, and // return that count in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_popcnt_u32 FORCE_INLINE int _mm_popcnt_u32(unsigned int a) { #if defined(__aarch64__) || defined(_M_ARM64) #if __has_builtin(__builtin_popcount) return __builtin_popcount(a); #elif defined(_MSC_VER) return _CountOneBits(a); #else return (int) vaddlv_u8(vcnt_u8(vcreate_u8((uint64_t) a))); #endif #else uint32_t count = 0; uint8x8_t input_val, count8x8_val; uint16x4_t count16x4_val; uint32x2_t count32x2_val; input_val = vld1_u8((uint8_t *) &a); count8x8_val = vcnt_u8(input_val); count16x4_val = vpaddl_u8(count8x8_val); count32x2_val = vpaddl_u16(count16x4_val); vst1_u32(&count, count32x2_val); return count; #endif } // Count the number of bits set to 1 in unsigned 64-bit integer a, and // return that count in dst. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_popcnt_u64 FORCE_INLINE int64_t _mm_popcnt_u64(uint64_t a) { #if defined(__aarch64__) || defined(_M_ARM64) #if __has_builtin(__builtin_popcountll) return __builtin_popcountll(a); #elif defined(_MSC_VER) return _CountOneBits64(a); #else return (int64_t) vaddlv_u8(vcnt_u8(vcreate_u8(a))); #endif #else uint64_t count = 0; uint8x8_t input_val, count8x8_val; uint16x4_t count16x4_val; uint32x2_t count32x2_val; uint64x1_t count64x1_val; input_val = vld1_u8((uint8_t *) &a); count8x8_val = vcnt_u8(input_val); count16x4_val = vpaddl_u8(count8x8_val); count32x2_val = vpaddl_u16(count16x4_val); count64x1_val = vpaddl_u32(count32x2_val); vst1_u64(&count, count64x1_val); return count; #endif } FORCE_INLINE void _sse2neon_mm_set_denormals_zero_mode(unsigned int flag) { // AArch32 Advanced SIMD arithmetic always uses the Flush-to-zero setting, // regardless of the value of the FZ bit. union { fpcr_bitfield field; #if defined(__aarch64__) || defined(_M_ARM64) uint64_t value; #else uint32_t value; #endif } r; #if defined(__aarch64__) || defined(_M_ARM64) r.value = _sse2neon_get_fpcr(); #else __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ #endif r.field.bit24 = (flag & _MM_DENORMALS_ZERO_MASK) == _MM_DENORMALS_ZERO_ON; #if defined(__aarch64__) || defined(_M_ARM64) _sse2neon_set_fpcr(r.value); #else __asm__ __volatile__("vmsr FPSCR, %0" ::"r"(r)); /* write */ #endif } // Return the current 64-bit value of the processor's time-stamp counter. // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=rdtsc FORCE_INLINE uint64_t _rdtsc(void) { #if defined(__aarch64__) || defined(_M_ARM64) uint64_t val; /* According to ARM DDI 0487F.c, from Armv8.0 to Armv8.5 inclusive, the * system counter is at least 56 bits wide; from Armv8.6, the counter * must be 64 bits wide. So the system counter could be less than 64 * bits wide and it is attributed with the flag 'cap_user_time_short' * is true. */ #if defined(_MSC_VER) val = _ReadStatusReg(ARM64_SYSREG(3, 3, 14, 0, 2)); #else __asm__ __volatile__("mrs %0, cntvct_el0" : "=r"(val)); #endif return val; #else uint32_t pmccntr, pmuseren, pmcntenset; // Read the user mode Performance Monitoring Unit (PMU) // User Enable Register (PMUSERENR) access permissions. __asm__ __volatile__("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren)); if (pmuseren & 1) { // Allows reading PMUSERENR for user mode code. __asm__ __volatile__("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset)); if (pmcntenset & 0x80000000UL) { // Is it counting? __asm__ __volatile__("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); // The counter is set up to count every 64th cycle return (uint64_t) (pmccntr) << 6; } } // Fallback to syscall as we can't enable PMUSERENR in user mode. struct timeval tv; gettimeofday(&tv, NULL); return (uint64_t) (tv.tv_sec) * 1000000 + tv.tv_usec; #endif } #if defined(__GNUC__) || defined(__clang__) #pragma pop_macro("ALIGN_STRUCT") #pragma pop_macro("FORCE_INLINE") #endif #if defined(__GNUC__) && !defined(__clang__) #pragma GCC pop_options #endif #endif stephaneguindon-phyml-76a39c8/src/stats.c000066400000000000000000004027171501136442400205060ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "stats.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* RANDOM VARIATES GENERATORS */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*********************************************************************/ /* A C-function for TT800 : July 8th 1996 Version */ /* by M. Matsumoto, email: matumoto@math.keio.ac.jp */ /* tt800() generate one pseudorandom number with double precision */ /* which is uniformly distributed on [0,1]-interval */ /* for each call. One may choose any initial 25 seeds */ /* except all zeros. */ /* See: ACM Transactions on Modelling and Computer Simulation, */ /* Vol. 4, No. 3, 1994, pages 254-266. */ phydbl tt800(void) { int M=7; unsigned long y; static int k = 0; static unsigned long x[25]={ /* initial 25 seeds, change as you wish */ 0x95f24dab, 0x0b685215, 0xe76ccae7, 0xaf3ec239, 0x715fad23, 0x24a590ad, 0x69e4b5ef, 0xbf456141, 0x96bc1b7b, 0xa7bdf825, 0xc1de75b7, 0x8858a9c9, 0x2da87693, 0xb657f9dd, 0xffdc8a9f, 0x8121da71, 0x8b823ecb, 0x885d05f5, 0x4e20cd47, 0x5a9ad5d9, 0x512c0c03, 0xea857ccd, 0x4cc1d30f, 0x8891a8a1, 0xa6b7aadb }; static unsigned long mag01[2]={ 0x0, 0x8ebfd028 /* this is magic vector `a', don't change */ }; if (k==25) { /* generate 25 words at one time */ int kk; for (kk=0;kk<25-M;kk++) { x[kk] = x[kk+M] ^ (x[kk] >> 1) ^ mag01[x[kk] % 2]; } for (; kk<25;kk++) { x[kk] = x[kk+(M-25)] ^ (x[kk] >> 1) ^ mag01[x[kk] % 2]; } k=0; } y = x[k]; y ^= (y << 7) & 0x2b5b2500; /* s and b, magic vectors */ y ^= (y << 15) & 0xdb8b0000; /* t and c, magic vectors */ y &= 0xffffffff; /* you may delete this line if word size = 32 */ /* the following line was added by Makoto Matsumoto in the 1996 version to improve lower bit's corellation. Delete this line to o use the code published in 1994. */ y ^= (y >> 16); /* added to the 1994 version */ k++; return((phydbl)y / (unsigned long) 0xffffffff); } /*********************************************************************/ phydbl Uni(void) { phydbl r,mx; mx = (phydbl)RAND_MAX; r = (phydbl)rand(); r /= mx; /* r = tt800(); */ return r; } /*********************************************************************/ // Return a uniform draw u s.t., min <= u <= max int Rand_Int(int min, int max) { /* phydbl u; */ /* u = (phydbl)rand(); */ /* u /= (RAND_MAX); */ /* u *= (max - min + 1); */ /* u += min; */ /* return (int)FLOOR(u); */ int u; /* if(max < min) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ u = rand(); return (u%(max+1-min)+min); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /********************* random Gamma generator ************************ * Properties: * (1) X = Gamma(alpha,lambda) = Gamma(alpha,1)/lambda * (2) X1 = Gamma(alpha1,1), X2 = Gamma(alpha2,1) independent * then X = X1+X2 = Gamma(alpha1+alpha2,1) * (3) alpha = k = integer then * X = Gamma(k,1) = Erlang(k,1) = -sum(log(Ui)) = -log(prod(Ui)) * where U1,...Uk iid uniform(0,1) * * Decompose alpha = k+delta with k = [alpha], and 00.) { phydbl y = 0.; phydbl b = (alpha+exp(1.))/exp(1.); phydbl p = 1./alpha; int go = 0; while (go==0) { phydbl u = Uni(); phydbl w = Uni(); phydbl v = b*u; if (v<=1.) { x = POW(v,p); y = exp(-x); } else { x = -log(p*(b-v)); y = POW(x,alpha-1.); } go = (w= 1. Algorithm GD in: Ahrens, J.H. and Dieter, U. (1982). Generating gamma variates by a modified rejection technique. Comm. ACM, 25, 47-54. [2] Shape parameter 0 < a < 1. Algorithm GS in: Ahrens, J.H. and Dieter, U. (1974). Computer methods for sampling from gamma, beta, poisson and binomial distributions. Computing, 12, 223-246. */ double a = (double)shape; /* Constants : */ const static double sqrt32 = 5.656854; const static double exp_m1 = 0.36787944117144232159;/* exp(-1) = 1/e */ /* Coefficients q[k] - for q0 = sum(q[k]*a^(-k)) * Coefficients a[k] - for q = q0+(t*t/2)*sum(a[k]*v^k) * Coefficients e[k] - for exp(q)-1 = sum(e[k]*q^k) */ const static double q1 = 0.04166669; const static double q2 = 0.02083148; const static double q3 = 0.00801191; const static double q4 = 0.00144121; const static double q5 = -7.388e-5; const static double q6 = 2.4511e-4; const static double q7 = 2.424e-4; const static double a1 = 0.3333333; const static double a2 = -0.250003; const static double a3 = 0.2000062; const static double a4 = -0.1662921; const static double a5 = 0.1423657; const static double a6 = -0.1367177; const static double a7 = 0.1233795; /* State variables [FIXME for threading!] :*/ static double aa = 0.; static double aaa = 0.; static double s, s2, d; /* no. 1 (step 1) */ static double q0, b, si, c;/* no. 2 (step 4) */ double e, p, q, r, t, u, v, w, x, ret_val; if(a < 0.0 || scale <= 0.0) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); if (a < 1.) { /* GS algorithm for parameters a < 1 */ if(a == 0) return 0.; e = 1.0 + exp_m1 * a; for(;;) { p = e * Uni(); if (p >= 1.0) { x = -log((e - p) / a); if (Rexp(1.) >= (1.0 - a) * log(x)) break; } else { x = exp(log(p) / a); if (Rexp(1.) >= x) break; } } return scale * x; } /* --- a >= 1 : GD algorithm --- */ /* Step 1: Recalculations of s2, s, d if a has changed */ if (a != aa) { aa = a; s2 = a - 0.5; s = SQRT(s2); d = sqrt32 - s * 12.0; } /* Step 2: t = standard normal deviate, x = (s,1/2) -normal deviate. */ /* immediate acceptance (i) */ t = Rnorm(0.0,1.0); x = s + 0.5 * t; ret_val = x * x; if (t >= 0.0) return scale * ret_val; /* Step 3: u = 0,1 - uniform sample. squeeze acceptance (s) */ u = Uni(); if (d * u <= t * t * t) return scale * ret_val; /* Step 4: recalculations of q0, b, si, c if necessary */ if (a != aaa) { aaa = a; r = 1.0 / a; q0 = ((((((q7 * r + q6) * r + q5) * r + q4) * r + q3) * r + q2) * r + q1) * r; /* Approximation depending on size of parameter a */ /* The constants in the expressions for b, si and c */ /* were established by numerical experiments */ if (a <= 3.686) { b = 0.463 + s + 0.178 * s2; si = 1.235; c = 0.195 / s - 0.079 + 0.16 * s; } else if (a <= 13.022) { b = 1.654 + 0.0076 * s2; si = 1.68 / s + 0.275; c = 0.062 / s + 0.024; } else { b = 1.77; si = 0.75; c = 0.1515 / s; } } /* Step 5: no quotient test if x not positive */ if (x > 0.0) { /* Step 6: calculation of v and quotient q */ v = t / (s + s); if (fabs(v) <= 0.25) q = q0 + 0.5 * t * t * ((((((a7 * v + a6) * v + a5) * v + a4) * v + a3) * v + a2) * v + a1) * v; else q = q0 - s * t + 0.25 * t * t + (s2 + s2) * log(1.0 + v); /* Step 7: quotient acceptance (q) */ if (log(1.0 - u) <= q) return scale * ret_val; } for(;;) { /* Step 8: e = standard exponential deviate * u = 0,1 -uniform deviate * t = (b,si)-double exponential (laplace) sample */ e = Rexp(1.0); u = Uni(); u = u + u - 1.0; if (u < 0.0) t = b - si * e; else t = b + si * e; /* Step 9: rejection if t < tau(1) = -0.71874483771719 */ if (t >= -0.71874483771719) { /* Step 10: calculation of v and quotient q */ v = t / (s + s); if (fabs(v) <= 0.25) q = q0 + 0.5 * t * t * ((((((a7 * v + a6) * v + a5) * v + a4) * v + a3) * v + a2) * v + a1) * v; else q = q0 - s * t + 0.25 * t * t + (s2 + s2) * log(1.0 + v); /* Step 11: hat acceptance (h) */ /* (if q not positive go to step 8) */ if (q > 0.0) { w = exp(q)-1.0; /* if t is rejected sample again at step 8 */ if (c * fabs(u) <= w * exp(e - 0.5 * t * t)) break; } } } /* repeat .. until `t' is accepted */ x = s + 0.5 * t; return scale * x * x; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Rexp(phydbl lambda) { return -log(Uni()+SMALL)/lambda; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Returns a random deviates from an exponential distribution */ /* left-truncated at 'left' and right-truncated at 'rght' */ phydbl Rexp_Trunc(phydbl lambda, phydbl left, phydbl rght) { phydbl u; u = Uni(); return (left-log(1. - u*(1.-exp(-lambda*(rght-left))))/lambda); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Rnorm(phydbl mean, phydbl sd) { /* Box-Muller transformation */ phydbl u1, u2, res; if(isinf(mean) || isinf(sd)) { Print_Trace(); assert(false); } else if(isnan(mean) || isnan(sd)) { Print_Trace(); assert(false); } /* u1=Uni(); */ /* u2=Uni(); */ /* u1 = SQRT(-2.*log(u1))*COS(6.28318530717959f*u2); */ /* Polar */ phydbl d,x,y; do { u1=Uni(); u2=Uni(); x = 2.*u1-1.; y = 2.*u2-1.; d = x*x + y*y; if(d>.0 && d<1.) break; } while(1); u1 = x*SQRT((-2.*log(d))/d); res = u1*sd+mean; if(isnan(res) || isinf(res)) PhyML_Printf("\n. res=%f sd=%f mean=%f u1=%f u2=%f",res,sd,mean,u1,u2); return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl *Rnorm_Multid(phydbl *mu, phydbl *cov, int dim) { phydbl *L,*x,*y; int i,j; x = (phydbl *)mCalloc(dim,sizeof(phydbl)); y = (phydbl *)mCalloc(dim,sizeof(phydbl)); L = (phydbl *)Cholesky_Decomp(cov,dim); for(i=0;i z_max+eps)) { *error = 1; PhyML_Printf("\n. Numerical precision issue detected in Rnorm_Trunc."); PhyML_Printf("\n. z = %f",z); PhyML_Printf("\n. mean=%f sd=%f z_min=%f z_max=%f min=%f max=%f",mean,sd,z_min,z_max,min,max); ret_val = (max - min)/2.; Exit("\n"); } ret_val = z*sd+mean; return ret_val; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Borrowed from https://github.com/olafmersmann/truncnorm/blob/afc91b696db8a3feda25d39435fd979bacd962c6/src/rtruncnorm.c */ phydbl Rnorm_Trunc_Algo1(phydbl alpha, phydbl beta, int *err) { phydbl z = -DBL_MAX; int iter = 0; while(z < alpha || z > beta) { z = Rnorm(0.0,1.0); ++iter; if(iter > 1E+5) { *err = YES; break; } } return(z); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Rnorm_Trunc_Algo2(phydbl alpha, phydbl beta, int *err) { phydbl z = 0.0; phydbl d_alpha = Dnorm(alpha,0.0,1.0); const double ub = alpha < 0.0 && beta > 0.0 ? M_1_SQRT_2PI : d_alpha; int iter = 0; do { z = Uni()*(beta-alpha) + alpha; ++iter; if(iter > 1E+5) { *err = YES; break; } } while(Uni() * ub > Dnorm(z,0.0,1.0)); return(z); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Rnorm_Trunc_Algo3(phydbl alpha, phydbl beta, int *err) { phydbl z = alpha - 1.0; int iter = 0; *err = NO; while(z < alpha || z > beta) { z = Rnorm(0,1); z = fabs(z); ++iter; if(iter > 1E+5) { *err = YES; break; } } return(z); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Rnorm_Trunc_Algo4(phydbl alpha, phydbl beta, int *err) { phydbl z = 0.0; const phydbl ainv = 1.0/alpha; phydbl rho; int iter = 0; *err = NO; do { z = Rexp(ainv) + alpha; rho = exp(-0.5 * pow((z-alpha),2)); ++iter; if(iter > 1E+5) { *err = YES; break; } } while(Uni() > rho || z > beta); return(z); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Rnorm_Trunc(phydbl mean, phydbl sd, phydbl min, phydbl max, int *error) { phydbl alpha,beta; phydbl d_alpha,d_beta; phydbl z; alpha = (min - mean)/sd; beta = (max - mean)/sd; d_alpha = Dnorm(alpha,0.0,1.0); d_beta = Dnorm(beta,0.0,1.0); if(beta < alpha) return NAN; else { if(!(alpha > 0.0) && !(beta < 0.0)) { if(!(d_alpha > 0.15) || !(d_beta > 0.15)) { z = Rnorm_Trunc_Algo1(alpha,beta,error); return(mean + sd * z); } else { z = Rnorm_Trunc_Algo2(alpha,beta,error); return(mean + sd * z); } } else if(alpha > 0.0) { if(!(d_alpha / d_beta > 2.18)) { z = Rnorm_Trunc_Algo2(alpha,beta,error); return(mean + sd * z); } else { if(!(alpha > 0.725)) { z = Rnorm_Trunc_Algo3(alpha,beta,error); return(mean + sd * z); } else { z = Rnorm_Trunc_Algo4(alpha,beta,error); return(mean + sd * z); } } } else { if(!(d_beta / d_alpha > 2.18)) { z = Rnorm_Trunc_Algo2(alpha,beta,error); return(mean - sd * z); } else if(beta > -0.725) { z = Rnorm_Trunc_Algo3(alpha,beta,error); return(mean - sd * z); } else { z = Rnorm_Trunc_Algo4(alpha,beta,error); return(mean - sd * z); } } } return -1.; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl *Rnorm_Multid_Trunc(phydbl *mean, phydbl *cov, phydbl *min, phydbl *max, int dim) { int i,j; phydbl *L,*x, *u; phydbl up, low, rec; int err; u = (phydbl *)mCalloc(dim,sizeof(phydbl)); x = (phydbl *)mCalloc(dim,sizeof(phydbl)); L = Cholesky_Decomp(cov,dim); low = (min[0]-mean[0])/L[0*dim+0]; up = (max[0]-mean[0])/L[0*dim+0]; u[0] = Rnorm_Trunc(0.0,1.0,low,up,&err); for(i=1;i>>\n"); */ /* for(i=0;i 1.-SMALL) { if(logit == YES) return(-INFINITY); else return(0.0); } if(logit == YES) prob = (k - 1.)*log(1. - p) + log(p); else prob = POW(1.-p,k-1.)*p; return(prob); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Pgeom(phydbl k, phydbl p) { if(k < 1.) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); if(p > 1.-SMALL) return(0.0); return(1. - POW((1. - p),k)); } /* * Random variates from the Poisson distribution. Completely stolen from R code. * * REFERENCE * * Ahrens, J.H. and Dieter, U. (1982). * Computer generation of Poisson deviates * from modified normal distributions. * ACM Trans. Math. Software 8, 163-179. */ phydbl Rpois(phydbl mmu) { double mu = (double)mmu; double a0 = -0.5; double a1 = 0.3333333; double a2 = -0.2500068; double a3 = 0.2000118; double a4 = -0.1661269; double a5 = 0.1421878; double a6 = -0.1384794; double a7 = 0.1250060; double one_7 = 0.1428571428571428571; double one_12 = 0.0833333333333333333; double one_24 = 0.0416666666666666667; /* Factorial Table (0:9)! */ const static double fact[10] = { 1., 1., 2., 6., 24., 120., 720., 5040., 40320., 362880. }; /* These are static --- persistent between calls for same mu : */ static int l, m; static double b1, b2, c, c0, c1, c2, c3; static double pp[36], p0, p, q, s, d, omega; static double big_l;/* integer "w/o overflow" */ static double muprev = 0., muprev2 = 0.;/*, muold = 0.*/ /* Local Vars [initialize some for -Wall]: */ double del, difmuk= 0., E= 0., fk= 0., fx, fy, g, px, py, t, u= 0., v, x; double pois = -1.; int k, kflag, big_mu, new_big_mu = FALSE; if (isnan(mu) || mu < 0.0) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); if (mu <= 0.) return 0.; big_mu = mu >= 10.; if(big_mu) new_big_mu = FALSE; if (!(big_mu && mu == muprev)) {/* maybe compute new persistent par.s */ if (big_mu) { new_big_mu = TRUE; /* Case A. (recalculation of s,d,l because mu has changed): * The poisson probabilities pk exceed the discrete normal * probabilities fk whenever k >= m(mu). */ muprev = mu; s = sqrt(mu); d = 6. * mu * mu; big_l = floor(mu - 1.1484); /* = an upper bound to m(mu) for all mu >= 10.*/ } else { /* Small mu ( < 10) -- not using normal approx. */ /* Case B. (start new table and calculate p0 if necessary) */ /*muprev = 0.;-* such that next time, mu != muprev ..*/ if (mu != muprev) { muprev = mu; m = MAX(1, (int) mu); l = 0; /* pp[] is already ok up to pp[l] */ q = p0 = p = exp(-mu); } for(;;) { /* Step U. uniform sample for inversion method */ u = Uni(); if (u <= p0) return 0.; /* Step T. table comparison until the end pp[l] of the pp-table of cumulative poisson probabilities (0.458 > ~= pp[9](= 0.45792971447) for mu=10 ) */ if (l != 0) { for (k = (u <= 0.458) ? 1 : MIN(l, m); k <= l; k++) if (u <= pp[k]) return((phydbl)k); if (l == 35) /* u > pp[35] */ continue; } /* Step C. creation of new poisson probabilities p[l..] and their cumulatives q =: pp[k] */ l++; for (k = l; k <= 35; k++) { p *= mu / k; q += p; pp[k] = q; if (u <= q) { l = k; return((phydbl)k); } } l = 35; } /* end(repeat) */ }/* mu < 10 */ } /* end {initialize persistent vars} */ /* Only if mu >= 10 : ----------------------- */ /* Step N. normal sample */ g = mu + s * Rnorm(0.0,1.0);/* norm_rand() ~ N(0,1), standard normal */ if (g >= 0.) { pois = floor(g); /* Step I. immediate acceptance if pois is large enough */ if (pois >= big_l) return((phydbl)pois); /* Step S. squeeze acceptance */ fk = pois; difmuk = mu - fk; u = Uni(); /* ~ U(0,1) - sample */ if (d * u >= difmuk * difmuk * difmuk) return((phydbl)pois); } /* Step P. preparations for steps Q and H. (recalculations of parameters if necessary) */ if (new_big_mu || mu != muprev2) { /* Careful! muprev2 is not always == muprev because one might have exited in step I or S */ muprev2 = mu; omega = M_1_SQRT_2PI / s; /* The quantities b1, b2, c3, c2, c1, c0 are for the Hermite * approximations to the discrete normal probabilities fk. */ b1 = one_24 / mu; b2 = 0.3 * b1 * b1; c3 = one_7 * b1 * b2; c2 = b2 - 15. * c3; c1 = b1 - 6. * b2 + 45. * c3; c0 = 1. - b1 + 3. * b2 - 15. * c3; c = 0.1069 / mu; /* guarantees majorization by the 'hat'-function. */ } if (g >= 0.) { /* 'Subroutine' F is called (kflag=0 for correct return) */ kflag = 0; goto Step_F; } for(;;) { /* Step E. Exponential Sample */ E = Rexp(1.0); /* ~ Exp(1) (standard exponential) */ /* sample t from the laplace 'hat' (if t <= -0.6744 then pk < fk for all mu >= 10.) */ u = 2. * Uni() - 1.; /* t = 1.8 + fsign(E, u); */ t = 1.8 + ((u >= 0.0) ? fabs(E) : -fabs(E)); if (t > -0.6744) { pois = floor(mu + s * t); fk = pois; difmuk = mu - fk; /* 'subroutine' F is called (kflag=1 for correct return) */ kflag = 1; Step_F: /* 'subroutine' F : calculation of px,py,fx,fy. */ if (pois < 10) { /* use factorials from table fact[] */ px = -mu; py = pow(mu, pois) / fact[(int)pois]; } else { /* Case pois >= 10 uses polynomial approximation a0-a7 for accuracy when advisable */ del = one_12 / fk; del = del * (1. - 4.8 * del * del); v = difmuk / fk; if (fabs(v) <= 0.25) px = fk * v * v * (((((((a7 * v + a6) * v + a5) * v + a4) * v + a3) * v + a2) * v + a1) * v + a0) - del; else /* |v| > 1/4 */ px = fk * log(1. + v) - difmuk - del; py = M_1_SQRT_2PI / sqrt(fk); } x = (0.5 - difmuk) / s; x *= x;/* x^2 */ fx = -0.5 * x; fy = omega * (((c3 * x + c2) * x + c1) * x + c0); if (kflag > 0) { /* Step H. Hat acceptance (E is repeated on rejection) */ if (c * fabs(u) <= py * exp(px + E) - fy * exp(fx + E)) break; } else /* Step Q. Quotient acceptance (rare case) */ if (fy - u * fy <= py * exp(px - fx)) break; }/* t > -.67.. */ } return((phydbl)pois); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* DENSITIES / PROBA */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Dnorm_Moments(phydbl x, phydbl mean, phydbl var) { phydbl dens,sd,pi; pi = 3.141593; sd = SQRT(var); dens = 1./(SQRT(2*pi)*sd)*exp(-((x-mean)*(x-mean)/(2.*sd*sd))); return dens; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Dnorm(phydbl x, phydbl mean, phydbl sd) { phydbl dens; /* dens = -(.5*LOG2PI+log(sd)) - .5*POW(x-mean,2)/POW(sd,2); */ /* return exp(dens); */ if(sd < SMALL && fabs(x-mean) < SMALL) return(1.0); x = (x-mean)/sd; dens = M_1_SQRT_2_PI * exp(-0.5*x*x); return dens / sd; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Log_Dnorm(phydbl x, phydbl mean, phydbl sd, int *err) { phydbl dens; *err = NO; if(sd < SMALL) { if(fabs(x-mean) < SMALL) return(0.0); else return(-INFINITY); } x = (x-mean)/sd; dens = -LOG_SQRT_2PI; dens -= pow(x,2)*.5; dens -= log(sd); if(dens < -BIG) { PhyML_Printf("\n. dens=%f -- x=%f mean=%f sd=%f\n",dens,x,mean,sd); Print_Trace(); *err = 1; } return dens; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Log_Dnorm_Trunc(phydbl x, phydbl mean, phydbl sd, phydbl lo, phydbl up, int *err) { phydbl log_dens; phydbl cdf_up, cdf_lo; if(x < lo || x > up) return -230.; if(sd < SMALL && fabs(x-mean) < SMALL) return(0.0); *err = NO; cdf_lo = cdf_up = 0.0; log_dens = Log_Dnorm(x,mean,sd,err); if(*err == YES) { PhyML_Printf("\n== mean=%f sd=%f lo=%f up=%f cdf_lo=%G CDF_up=%G log_dens=%G",mean,sd,lo,up,cdf_lo,cdf_up,log_dens); PhyML_Printf("\n== Warning in file %s at line %d\n",__FILE__,__LINE__); *err = YES; } cdf_up = Pnorm(up,mean,sd); cdf_lo = Pnorm(lo,mean,sd); if(cdf_up - cdf_lo < 1.E-20) { log_dens = -230.; /* ~log(1.E-100) */ } else { log_dens -= log(cdf_up - cdf_lo); } if(isnan(log_dens) || isinf(fabs(log_dens))) { PhyML_Printf("\n. x=%f mean=%f sd=%f lo=%f up=%f cdf_lo=%G CDF_up=%G log_dens=%G",x,mean,sd,lo,up,cdf_lo,cdf_up,log_dens); PhyML_Printf("\n. Warning in file %s at line %d\n",__FILE__,__LINE__); *err = YES; } return log_dens; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Dnorm_Trunc(phydbl x, phydbl mean, phydbl sd, phydbl lo, phydbl up) { phydbl dens; phydbl cdf_up, cdf_lo; if(sd < SMALL && fabs(x-mean) < SMALL) return(1.0); dens = Dnorm(x,mean,sd); cdf_up = Pnorm(up,mean,sd); cdf_lo = Pnorm(lo,mean,sd); dens /= (cdf_up - cdf_lo); if(isnan(dens) || isinf(fabs(dens))) { PhyML_Printf("\n== mean=%f sd=%f lo=%f up=%f cdf_lo=%G CDF_up=%G",mean,sd,lo,up,cdf_lo,cdf_up); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } return dens; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Dnorm_Multi(phydbl *x, phydbl *mu, phydbl *cov, int size, int _log) { phydbl *xmmu,*invcov; phydbl *buff1,*buff2; int i; phydbl det,density; xmmu = (phydbl *)mCalloc(size,sizeof(phydbl)); invcov = (phydbl *)mCalloc(size*size,sizeof(phydbl)); for(i=0;i INFINITY) { PhyML_Printf("\n. WARNING: huge value of x -> x = %G",x); x = 1.E+10; } if(x < 1.E-200) { if(x < 0.0) return 0.0; else { PhyML_Printf("\n. WARNING: Dgamma -> small value of x = %G (shape: %G scale: %G : %G)",x,shape,scale,shape*scale); x = 1.E-200; } } if(scale < 0.0 || shape < 0.0) { PhyML_Printf("\n. scale=%f shape=%f",scale,shape); Exit("\n"); } v = (shape-1.) * log(x) - shape * log(scale) - x / scale - LnGamma(shape); if(v < 500.) { v = exp(v); } else { PhyML_Printf("\n. WARNING v=%f x=%f shape=%f scale=%f",v,x,shape,scale); PhyML_Printf("\n. log(x) = %G LnGamma(shape)=%G",log(x),LnGamma(shape)); v = exp(v); /* PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); */ /* Exit("\n"); */ } return v; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Dexp(phydbl x, phydbl param) { return param * exp(-param * x); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Log_Dexp(phydbl x, phydbl param) { return log(param) - param * x; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Returns the density of an exponential distribution left-truncated */ /* at 'left' and right-truncated at 'rght' */ phydbl Dexp_Trunc(phydbl x, phydbl lambda, phydbl left, phydbl rght) { return (lambda * exp(-lambda * x))/(exp(-lambda * left) - exp(-lambda * rght)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Poisson probability */ phydbl Dpois(phydbl x, phydbl param, int logit) { phydbl v; if(param < SMALL) { if(x < SMALL) { if(logit) return 0.0; else return 1.0; } else { if(logit) return -INFINITY; else return 0.0; } } if(x < .0) { if(logit == YES) return(-INFINITY); else return 0.0; } v = x * log(param) - param - Factln(x); if(logit == YES) return v; else { if(v < 500.) { v = exp(v); } else { PhyML_Printf("\n. WARNING v=%f x=%f param=%f",v,x,param); v = exp(500); } return v; } return(-1.0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* CDFs */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Error function phydbl Erf(phydbl x) { return(2.*Pnorm(x*sqrt(2.),0.0,1.0)-1.); } phydbl Pnorm(phydbl x, phydbl mean, phydbl sd) { /* const phydbl b1 = 0.319381530; */ /* const phydbl b2 = -0.356563782; */ /* const phydbl b3 = 1.781477937; */ /* const phydbl b4 = -1.821255978; */ /* const phydbl b5 = 1.330274429; */ /* const phydbl p = 0.2316419; */ /* const phydbl c = 0.39894228; */ x = (x-mean)/sd; /* if(x >= 0.0) */ /* { */ /* phydbl t = 1.0 / ( 1.0 + p * x ); */ /* return (1.0 - c * exp( -x * x / 2.0 ) * t * */ /* ( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 )); */ /* } */ /* else */ /* { */ /* phydbl t = 1.0 / ( 1.0 - p * x ); */ /* return ( c * exp( -x * x / 2.0 ) * t * */ /* ( t *( t * ( t * ( t * b5 + b4 ) + b3 ) + b2 ) + b1 )); */ /* } */ /* i_tail in {0,1,2} means: "lower", "upper", or "both" : if(lower) return *cum := P[X <= x] if(upper) return *ccum := P[X > x] = 1 - P[X <= x] */ /* return Pnorm_Marsaglia(x); */ return Pnorm_Ihaka_Derived_From_Cody(x); } /* G. Marsaglia. "Evaluating the Normal distribution". Journal of Statistical Software. 2004. Vol. 11. Issue 4. */ phydbl Pnorm_Marsaglia(phydbl x) { long double s=x,t=0,b=x,q=x*x,i=1; while(s!=t) s=(t=s)+(b*=q/(i+=2)); return .5+s*exp(-.5*q-.91893853320467274178L); } /* Stolen from R source code */ #define SIXTEN 16 phydbl Pnorm_Ihaka_Derived_From_Cody(phydbl x) { const static double a[5] = { 2.2352520354606839287, 161.02823106855587881, 1067.6894854603709582, 18154.981253343561249, 0.065682337918207449113 }; const static double b[4] = { 47.20258190468824187, 976.09855173777669322, 10260.932208618978205, 45507.789335026729956 }; const static double c[9] = { 0.39894151208813466764, 8.8831497943883759412, 93.506656132177855979, 597.27027639480026226, 2494.5375852903726711, 6848.1904505362823326, 11602.651437647350124, 9842.7148383839780218, 1.0765576773720192317e-8 }; const static double d[8] = { 22.266688044328115691, 235.38790178262499861, 1519.377599407554805, 6485.558298266760755, 18615.571640885098091, 34900.952721145977266, 38912.003286093271411, 19685.429676859990727 }; const static double p[6] = { 0.21589853405795699, 0.1274011611602473639, 0.022235277870649807, 0.001421619193227893466, 2.9112874951168792e-5, 0.02307344176494017303 }; const static double q[5] = { 1.28426009614491121, 0.468238212480865118, 0.0659881378689285515, 0.00378239633202758244, 7.29751555083966205e-5 }; double xden, xnum, temp, del, eps, xsq, y; int i, lower, upper; double cum,ccum; int i_tail; i_tail = 0; cum = ccum = 0.0; if(isnan(x)) { cum = ccum = x; return (phydbl)cum; } /* Consider changing these : */ eps = DBL_EPSILON * 0.5; /* i_tail in {0,1,2} =^= {lower, upper, both} */ lower = i_tail != 1; upper = i_tail != 0; y = fabs(x); if (y <= 0.67448975) { /* qnorm(3/4) = .6744.... -- earlier had 0.66291 */ if (y > eps) { xsq = x * x; xnum = a[4] * xsq; xden = xsq; for (i = 0; i < 3; ++i) { xnum = (xnum + a[i]) * xsq; xden = (xden + b[i]) * xsq; } } else xnum = xden = 0.0; temp = x * (xnum + a[3]) / (xden + b[3]); if(lower) cum = 0.5 + temp; if(upper) ccum = 0.5 - temp; } else if (y <= M_SQRT_32) { /* Evaluate pnorm for 0.674.. = qnorm(3/4) < |x| <= SQRT(32) ~= 5.657 */ xnum = c[8] * y; xden = y; for (i = 0; i < 7; ++i) { xnum = (xnum + c[i]) * y; xden = (xden + d[i]) * y; } temp = (xnum + c[7]) / (xden + d[7]); #define do_del(X) \ xsq = floor(X * SIXTEN) / SIXTEN; \ del = (X - xsq) * (X + xsq); \ cum = exp(-xsq * xsq * 0.5) * exp(-del * 0.5) * temp; \ ccum = 1.0 - cum; \ #define swap_tail \ if (x > 0.) {/* swap ccum <--> cum */ \ temp = cum; if(lower) cum = ccum; ccum = temp; \ } do_del(y); swap_tail; } /* else |x| > SQRT(32) = 5.657 : * the next two case differentiations were really for lower=T, log=F * Particularly *not* for log_p ! * Cody had (-37.5193 < x && x < 8.2924) ; R originally had y < 50 * * Note that we do want symmetry(0), lower/upper -> hence use y */ else if((lower && -37.5193 < x && x < 8.2924) || (upper && -8.2924 < x && x < 37.5193)) { /* Evaluate pnorm for x in (-37.5, -5.657) union (5.657, 37.5) */ xsq = 1.0 / (x * x); xnum = p[5] * xsq; xden = xsq; for (i = 0; i < 4; ++i) { xnum = (xnum + p[i]) * xsq; xden = (xden + q[i]) * xsq; } temp = xsq * (xnum + p[4]) / (xden + q[4]); temp = (M_1_SQRT_2_PI - temp) / y; do_del(x); swap_tail; } else { /* no log_p , large x such that probs are 0 or 1 */ if(x > 0) { cum = 1.; ccum = 0.; } else { cum = 0.; ccum = 1.; } } return (phydbl)cum; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Pgamma(phydbl x, phydbl shape, phydbl scale) { return IncompleteGamma(x/scale,shape,LnGamma(shape)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Ppois(phydbl x, phydbl param) { /* Press et al. (1990) approximation of the CDF for the Poisson distribution */ if(param < SMALL || x < 0.0) { PhyML_Printf("\n== param = %G x=%G",param,x); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } return IncompleteGamma(x,param,LnGamma(param)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Inverse CDFs */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl PointChi2 (phydbl prob, phydbl v) { /* returns z so that Prob{x.999998 || v<=0) return ((phydbl)-1); g = (double)LnGamma(v/2); xx=v/2; c=xx-1; if (v >= -1.24*log(p)) goto l1; ch=pow((p*xx*exp(g+xx*aa)), 1/xx); if (ch-e<0) return (ch); goto l4; l1: if (v>.32) goto l3; ch=0.4; a=log(1-p); l2: q=ch; p1=1+ch*(4.67+ch); p2=ch*(6.73+ch*(6.66+ch)); t=-0.5+(4.67+2*ch)/p1 - (6.73+ch*(13.32+3*ch))/p2; ch-=(1-exp(a+g+.5*ch+c*aa)*p2/p1)/t; if (fabs(q/ch-1)-.01 <= 0) goto l4; else goto l2; l3: x=(double)PointNormal (p); p1=0.222222/v; ch=v*pow((x*sqrt(p1)+1-p1), 3.0); if (ch>2.2*v+6) ch=-2*(log(1-p)-c*log(.5*ch)+g); l4: q=ch; p1=.5*ch; if ((t=(double)IncompleteGamma (p1, xx, g))<0) { PhyML_Printf ("\nerr IncompleteGamma"); return ((phydbl)-1.); } p2=p-t; t=p2*exp(xx*aa+g+p1-c*log(ch)); b=t/ch; a=0.5*t-b*c; s1=(210+a*(140+a*(105+a*(84+a*(70+60*a))))) / 420; s2=(420+a*(735+a*(966+a*(1141+1278*a))))/2520; s3=(210+a*(462+a*(707+932*a)))/2520; s4=(252+a*(672+1182*a)+c*(294+a*(889+1740*a)))/5040; s5=(84+264*a+c*(175+606*a))/2520; s6=(120+c*(346+127*c))/5040; ch+=t*(1+0.5*t*s1-b*c*(s1-b*(s2-b*(s3-b*(s4-b*(s5-b*s6)))))); if (fabs(q/ch-1) > e) goto l4; return (phydbl)(ch); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* The following function was extracted from the source code of R. It implements the methods referenced below. * REFERENCE * * Beasley, J. D. and S. G. Springer (1977). * Algorithm AS 111: The percentage points of the normal distribution, * Applied Statistics, 26, 118-121. * * Wichura, M.J. (1988). * Algorithm AS 241: The Percentage Points of the Normal Distribution. * Applied Statistics, 37, 477-484. */ phydbl PointNormal (phydbl prob) { /* returns z so that Prob{x 0) */ /* r = 1-p;/\* 1-p *\/ */ /* else */ /* r = p_;/\* = R_DT_Iv(p) ^= p *\/ */ /* r = sqrt(-log(r)); */ /* /\* r = sqrt(-log(r)) <==> min(p, 1-p) = exp( - r^2 ) *\/ */ /* if (r <= 5.) { /\* <==> min(p,1-p) >= exp(-25) ~= 1.3888e-11 *\/ */ /* r += -1.6; */ /* val = (((((((r * 7.7454501427834140764e-4 + */ /* .0227238449892691845833) * r + .24178072517745061177) * */ /* r + 1.27045825245236838258) * r + */ /* 3.64784832476320460504) * r + 5.7694972214606914055) * */ /* r + 4.6303378461565452959) * r + */ /* 1.42343711074968357734) */ /* / (((((((r * */ /* 1.05075007164441684324e-9 + 5.475938084995344946e-4) * */ /* r + .0151986665636164571966) * r + */ /* .14810397642748007459) * r + .68976733498510000455) * */ /* r + 1.6763848301838038494) * r + */ /* 2.05319162663775882187) * r + 1.); */ /* } */ /* else */ /* { /\* very close to 0 or 1 *\/ */ /* r += -5.; */ /* val = (((((((r * 2.01033439929228813265e-7 + */ /* 2.71155556874348757815e-5) * r + */ /* .0012426609473880784386) * r + .026532189526576123093) * */ /* r + .29656057182850489123) * r + */ /* 1.7848265399172913358) * r + 5.4637849111641143699) * */ /* r + 6.6579046435011037772) */ /* / (((((((r * */ /* 2.04426310338993978564e-15 + 1.4215117583164458887e-7)* */ /* r + 1.8463183175100546818e-5) * r + */ /* 7.868691311456132591e-4) * r + .0148753612908506148525) */ /* * r + .13692988092273580531) * r + */ /* .59983220655588793769) * r + 1.); */ /* } */ /* if(q < 0.0) */ /* val = -val; */ /* /\* return (q >= 0.)? r : -r ;*\/ */ /* } */ /* return (phydbl)val; */ /* } */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* MISCs */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Bico(int n, int k) { return FLOOR(0.5+exp(Factln(n)-Factln(k)-Factln(n-k))); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Factln(int n) { /* static phydbl a[101]; */ /* if (n < 0) { Warn_And_Exit("\n== Err: negative factorial in routine FACTLN"); } */ /* if (n <= 1) return 0.0; */ /* if (n <= 100) return (a[n]>SMALL) ? a[n] : (a[n]=Gammln(n+1.0)); */ /* else return Gammln(n+1.0); */ return Gammln(n+1.0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Gammln(phydbl xx) { double x,tmp,ser; static double cof[6]={76.18009173,-86.50532033,24.01409822, -1.231739516,0.120858003e-2,-0.536382e-5}; int j; x=xx-1.0; tmp=x+5.5; tmp -= (x+0.5)*log(tmp); ser=1.0; for (j=0;j<=5;j++) { x += 1.0; ser += cof[j]/x; } return (phydbl)(-tmp+log(2.50662827465*ser)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* void Plim_Binom(phydbl pH0, int N, phydbl *pinf, phydbl *psup) */ /* { */ /* *pinf = pH0 - 1.64*SQRT(pH0*(1-pH0)/(phydbl)N); */ /* if(*pinf < 0) *pinf = .0; */ /* *psup = pH0 + 1.64*SQRT(pH0*(1-pH0)/(phydbl)N); */ /* } */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LnGamma (phydbl alpha) { /* returns ln(gamma(alpha)) for alpha>0, accurate to 10 decimal places. Stirling's formula is used for the central polynomial part of the procedure. Pike MC & Hill ID (1966) Algorithm 291: Logarithm of the gamma function. Communications of the Association for Computing Machinery, 9:684 */ double x=alpha, f=0, z; if (x<7) { f=1; z=x-1; while (++z<7) f*=z; x=z; f=-log(f); } z = 1/(x*x); return (phydbl)(f + (x-0.5)*log(x) - x + .918938533204673 + (((-.000595238095238*z+.000793650793651)*z-.002777777777778)*z +.083333333333333)/x); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl IncompleteGamma(phydbl x, phydbl alpha, phydbl ln_gamma_alpha) { /* returns the incomplete gamma ratio I(x,alpha) where x is the upper limit of the integration and alpha is the shape parameter. returns (-1) if in error ln_gamma_alpha = ln(Gamma(alpha)), is almost redundant. (1) series expansion if (alpha>x || x<=1) (2) continued fraction otherwise RATNEST FORTRAN by Bhattacharjee GP (1970) The incomplete gamma integral. Applied Statistics, 19: 285-287 (AS32) */ int i; double p=alpha, g=ln_gamma_alpha; double accurate=1e-8, overflow=1e30; double factor, gin=0, rn=0, a=0,b=0,an=0,dif=0, term=0, pn[6]; if (fabs(x) < SMALL) return ((phydbl).0); if (x<0 || p<=0) return ((phydbl)-1); factor=exp(p*log(x)-x-g); if (x>1 && x>=p) goto l30; /* (1) series expansion */ gin=1; term=1; rn=p; l20: rn++; term*=x/rn; gin+=term; if (term > accurate) goto l20; gin*=factor/p; goto l50; l30: /* (2) continued fraction */ a=1-p; b=a+x+1; term=0; pn[0]=1; pn[1]=x; pn[2]=x+1; pn[3]=x*b; gin=pn[2]/pn[3]; l32: a++; b+=2; term++; an=a*term; for (i=0; i<2; i++) pn[i+4]=b*pn[i+2]-an*pn[i]; if (fabs(pn[5]) < .0) goto l35; rn=pn[4]/pn[5]; dif=fabs(gin-rn); if (dif>accurate) goto l34; if (dif<=accurate*rn) goto l42; l34: gin=rn; l35: for (i=0; i<4; i++) pn[i]=pn[i+2]; if (fabs(pn[4]) < overflow) goto l32; for (i=0; i<4; i++) pn[i]/=overflow; goto l32; l42: gin=1-factor*gin; l50: return (phydbl)(gin); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int DiscreteGamma (phydbl freqK[], phydbl rK[], phydbl alfa, phydbl beta, int K, int median) { /* discretization of gamma distribution with equal proportions in each category */ int i; phydbl gap05=1.0/(2.0*K), t, factor=alfa/beta*K, lnga1; if(K==1) { freqK[0] = 1.0; rK[0] = 1.0; return 0; } if (median) { for (i=0; i n) return(0); if (k > n/2) k = n-k; if(!k) return(1); accum = 1.; for(i=1;in_otu-3; cov = (phydbl *)mCalloc(dim*dim,sizeof(phydbl)); mean = (phydbl *)mCalloc( dim,sizeof(phydbl)); ori_wght = (int *)mCalloc(tree->data->n_pattern,sizeof(int)); site_num = (int *)mCalloc(tree->data->init_len,sizeof(int)); for(i=0;idata->n_pattern;i++) ori_wght[i] = tree->data->wght[i]; n_site = 0; for(i=0;idata->n_pattern;i++) For(j,tree->data->wght[i]) { site_num[n_site] = i; n_site++; } tree->verbose = VL0; for(replicate=0;replicaten_otu-3) tree->a_edges[i]->l->v = .1; for(i=0;idata->n_pattern;i++) tree->data->wght[i] = 0; for(i=0;idata->init_len;i++) { position = Rand_Int(0,(int)(tree->data->init_len-1.0)); tree->data->wght[site_num[position]] += 1; } Round_Optimize(tree,ROUND_MAX); For(i,2*tree->n_otu-3) For(j,2*tree->n_otu-3) cov[i*dim+j] += log(tree->a_edges[i]->l->v) * log(tree->a_edges[j]->l->v); For(i,2*tree->n_otu-3) mean[i] += log(tree->a_edges[i]->l->v); PhyML_Printf("[%3d/%3d]",replicate,sample_size); fflush(NULL); /* PhyML_Printf("\n. %3d %12f %12f %12f ", */ /* replicate, */ /* cov[1*dim+1]/(replicate+1)-mean[1]*mean[1]/POW(replicate+1,2), */ /* tree->a_edges[1]->l->v, */ /* mean[1]/(replicate+1)); */ } For(i,2*tree->n_otu-3) mean[i] /= (phydbl)sample_size; For(i,2*tree->n_otu-3) For(j,2*tree->n_otu-3) cov[i*dim+j] /= (phydbl)sample_size; For(i,2*tree->n_otu-3) For(j,2*tree->n_otu-3) cov[i*dim+j] -= mean[i]*mean[j]; /* For(i,2*tree->n_otu-3) if(cov[i*dim+i] < var_min) cov[i*dim+i] = var_min; */ /* PhyML_Printf("\n"); */ /* For(i,2*tree->n_otu-3) PhyML_Printf("%f %f\n",mean[i],tree->a_edges[i]->l->v); */ /* PhyML_Printf("\n"); */ /* PhyML_Printf("\n"); */ /* For(i,2*tree->n_otu-3) */ /* { */ /* For(j,2*tree->n_otu-3) */ /* { */ /* PhyML_Printf("%G\n",cov[i*dim+j]); */ /* } */ /* PhyML_Printf("\n"); */ /* } */ for(i=0;idata->n_pattern;i++) tree->data->wght[i] = ori_wght[i]; Free(mean); Free(ori_wght); Free(site_num); return cov; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Work out the Hessian for the likelihood function. Only branch lengths are considered as variable. This function is very much inspired from Jeff Thorne's 'hessian' function in his program 'estbranches'. */ phydbl *Hessian(t_tree *tree) { phydbl *hessian; phydbl *plus_plus, *minus_minus, *plus_zero, *minus_zero, *plus_minus, zero_zero; phydbl *ori_bl,*inc,*buff; int *ok_edges,*is_ok; int dim; int n_ok_edges; int i,j; phydbl eps; phydbl lk; phydbl lnL,lnL1,lnL2,ori_lnL; phydbl l_inf; dim = 2*tree->n_otu-3; eps = (tree->mod->log_l == YES)?(0.2):(1E-4); hessian = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); ori_bl = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); plus_plus = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); minus_minus = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); plus_minus = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); plus_zero = (phydbl *)mCalloc((int)dim ,sizeof(phydbl)); minus_zero = (phydbl *)mCalloc((int)dim ,sizeof(phydbl)); inc = (phydbl *)mCalloc((int)dim ,sizeof(phydbl)); buff = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); ok_edges = (int *)mCalloc((int)dim,sizeof(int)); is_ok = (int *)mCalloc((int)dim,sizeof(int)); lnL = lnL1 = lnL2 = UNLIKELY; Set_Both_Sides(YES,tree); Lk(NULL,tree); ori_lnL = tree->c_lnL; for(i=0;ia_edges[i]->l->v; if(tree->mod->log_l == NO) l_inf = MAX(tree->mod->l_min,1./(phydbl)tree->data->init_len); else l_inf = MAX(tree->mod->l_min,-log((phydbl)tree->data->init_len)); n_ok_edges = 0; for(i=0;ia_edges[i]->l->v*(1.-eps) > l_inf) { inc[i] = eps * tree->a_edges[i]->l->v; ok_edges[n_ok_edges] = i; n_ok_edges++; is_ok[i] = 1; } else { inc[i] = -1.0; is_ok[i] = 0; } } /* Fine tune the increments */ for(i=0;ia_edges[i]->l->v += inc[i]; lnL1 = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v = ori_bl[i]; inc[i] *= 1.1; }while((fabs(lnL1 - ori_lnL) < 1.E-1) && (tree->a_edges[i]->l->v+inc[i] < tree->mod->l_max)); inc[i] /= 1.1; } /* zero zero */ zero_zero = tree->c_lnL; /* plus zero */ for(i=0;ia_edges[i]->l->v += inc[i]; lk = Lk(tree->a_edges[i],tree); plus_zero[i] = lk; tree->a_edges[i]->l->v = ori_bl[i]; } } /* minus zero */ for(i=0;ia_edges[i]->l->v -= inc[i]; lk = Lk(tree->a_edges[i],tree); minus_zero[i] = lk; tree->a_edges[i]->l->v = ori_bl[i]; } } for(i=0;ia_edges[i],tree); /* plus plus */ for(i=0;ia_edges[i]->l->v += inc[i]; Update_PMat_At_Given_Edge(tree->a_edges[i],tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->left->tax) && (tree->a_edges[i]->left->v[j] != tree->a_edges[i]->rght)) Recurr_Hessian(tree->a_edges[i]->left,tree->a_edges[i]->left->v[j],1,inc,plus_plus+i*dim,is_ok,tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->rght->tax) && (tree->a_edges[i]->rght->v[j] != tree->a_edges[i]->left)) Recurr_Hessian(tree->a_edges[i]->rght,tree->a_edges[i]->rght->v[j],1,inc,plus_plus+i*dim,is_ok,tree); tree->a_edges[i]->l->v = ori_bl[i]; Lk(NULL,tree); } } /* plus minus */ for(i=0;ia_edges[i]->l->v += inc[i]; Update_PMat_At_Given_Edge(tree->a_edges[i],tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->left->tax) && (tree->a_edges[i]->left->v[j] != tree->a_edges[i]->rght)) Recurr_Hessian(tree->a_edges[i]->left,tree->a_edges[i]->left->v[j],-1,inc,plus_minus+i*dim,is_ok,tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->rght->tax) && (tree->a_edges[i]->rght->v[j] != tree->a_edges[i]->left)) Recurr_Hessian(tree->a_edges[i]->rght,tree->a_edges[i]->rght->v[j],-1,inc,plus_minus+i*dim,is_ok,tree); tree->a_edges[i]->l->v = ori_bl[i]; Lk(NULL,tree); } } /* minus minus */ for(i=0;ia_edges[i]->l->v -= inc[i]; Update_PMat_At_Given_Edge(tree->a_edges[i],tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->left->tax) && (tree->a_edges[i]->left->v[j] != tree->a_edges[i]->rght)) Recurr_Hessian(tree->a_edges[i]->left,tree->a_edges[i]->left->v[j],-1,inc,minus_minus+i*dim,is_ok,tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->rght->tax) && (tree->a_edges[i]->rght->v[j] != tree->a_edges[i]->left)) Recurr_Hessian(tree->a_edges[i]->rght,tree->a_edges[i]->rght->v[j],-1,inc,minus_minus+i*dim,is_ok,tree); tree->a_edges[i]->l->v = ori_bl[i]; Lk(NULL,tree); } } for(i=0;idata->init_len; */ /* Approximate variance for very short branches */ for(i=0;ia_edges[i]->l->v; do { lnL = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v += eps; lnL1 = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v += eps; lnL2 = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v -= 2.*eps; hessian[i*dim+i] = (lnL2 - 2.*lnL1 + lnL) / POW(eps,2); /* printf("\n* l=%G eps=%f lnL=%f lnL1=%f lnL2=%f var=%f",tree->a_edges[i]->l->v,eps,lnL,lnL1,lnL2,hessian[i*dim+i]); */ eps *= 5.; }while(fabs(lnL2 - lnL) < 1.E-3); hessian[i*dim+i] = -1.0 / hessian[i*dim+i]; } /* Fit a straight line to the log-likelihood (i.e., an exponential to the likelihood) */ /* It is only a straight line when considering branch length (rather than log(branch lengths)) */ for(i=0;ia_edges[i]->l->v / tree->mod->l_min < 1.1) && (tree->a_edges[i]->l->v / tree->mod->l_min > 0.9)) { phydbl *x,*y,l; phydbl cov,var; x=plus_plus; y=minus_minus; l=(tree->mod->log_l == YES)?(exp(tree->a_edges[i]->l->v)):(tree->a_edges[i]->l->v); /* Get actual branch length */ for(j=0;ja_edges[i]->l->v = (tree->mod->log_l)?(log(x[j])):(x[j]); /* Transform to log if necessary */ y[j] = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v = (tree->mod->log_l)?(log(l)):(l); /* Go back to initial edge length */ } cov = Covariance(x,y,dim); var = Covariance(x,x,dim); /* cov/var is minus the parameter of the exponential distribution. The variance is therefore : */ hessian[i*dim+i] = 1.0 / pow(cov/var,2); /* printf("\n. Hessian = %G cov=%G var=%G",hessian[i*dim+i],cov,var); */ } /* } */ for(i=0;ia_edges[i]->l->v,hessian[i*dim+i]); /* PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); */ /* Exit("\n"); */ hessian[i*dim+i] = MIN_VAR_BL; } for(i=0;ia_edges[i]->l->v,hessian[i*dim+i]); hessian[i*dim+i] = MIN_VAR_BL; } if(hessian[i*dim+i] > MAX_VAR_BL) { PhyML_Printf("\n. l=%10G var(l)=%12G. WARNING: numerical precision issues may affect this analysis.", tree->a_edges[i]->l->v,hessian[i*dim+i]); hessian[i*dim+i] = MAX_VAR_BL; } } Iter_Matinv(hessian,dim,dim,NO); For(i,dim*dim) hessian[i] = -1.0*hessian[i]; for(i=0;i 1.E-3) { PhyML_Printf("\n. Hessian not symmetrical."); PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } hessian[i*dim+j] = (hessian[i*dim+j] + hessian[j*dim+i]) / 2.; hessian[j*dim+i] = hessian[i*dim+j]; } } /* printf("\n"); */ /* printf("HESSIAN\n"); */ /* for(i=0;ia_edges[i]->l->v); */ /* for(j=0;ja_edges[i]->l->v); */ /* for(j=0;jn_otu-3; eps = (tree->mod->log_l == YES)?(0.2):(1.E-6); gradient = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); ori_bl = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); plus = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); minus = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); inc = (phydbl *)mCalloc((int)dim ,sizeof(phydbl)); is_ok = (int *)mCalloc((int)dim,sizeof(int)); lnL = lnL1 = lnL2 = UNLIKELY; Set_Both_Sides(YES,tree); Lk(NULL,tree); for(i=0;ia_edges[i]->l->v; if(tree->mod->log_l == NO) l_inf = MAX(tree->mod->l_min,1./(phydbl)tree->data->init_len); else l_inf = MAX(tree->mod->l_min,-log((phydbl)tree->data->init_len)); for(i=0;ia_edges[i]->l->v*(1.-eps) > l_inf) { inc[i] = eps * tree->a_edges[i]->l->v; is_ok[i] = YES; } else { inc[i] = -1.0; is_ok[i] = NO; } } /* plus */ for(i=0;ia_edges[i]->l->v += inc[i]; lk = Lk(tree->a_edges[i],tree); plus[i] = lk; tree->a_edges[i]->l->v = ori_bl[i]; } } /* minus */ for(i=0;ia_edges[i]->l->v -= inc[i]; lk = Lk(tree->a_edges[i],tree); minus[i] = lk; tree->a_edges[i]->l->v = ori_bl[i]; } } for(i=0;ia_edges[i]->l->v); lnL = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v += eps; lnL1 = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v += eps; lnL2 = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v -= eps; tree->a_edges[i]->l->v -= eps; gradient[i] = (4.*lnL1 - lnL2 - 3.*lnL) / (2.*eps); } } /* Make sure to update likelihood before bailing out */ Set_Both_Sides(YES,tree); Lk(NULL,tree); Free(ori_bl); Free(plus); Free(minus); Free(inc); Free(is_ok); /* printf("\n"); */ /* printf("GRADIENT\n"); */ /* for(i=0;ia_edges[i]->l->v); */ /* for(j=0;ja_edges[i]->l->v,gradient[i]); */ /* } */ /* Exit("\n"); */ return gradient; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Work out the Hessian for the likelihood function using the method described by Seo et al., 2004, MBE. Corresponds to the outer product of the scores approach described in Porter, 2002. (matrix J1) */ phydbl *Hessian_Seo(t_tree *tree) { phydbl *hessian,*site_hessian; phydbl *gradient; phydbl *plus, *minus, *plusplus, *zero; phydbl *ori_bl,*inc_plus,*inc_minus,*inc; int *is_ok; int dim; int i,j,k; phydbl eps; phydbl ori_lnL,lnL1,lnL2; phydbl l_inf; int l,n; phydbl small_var; dim = 2*tree->n_otu-3; eps = (tree->mod->log_l == YES)?(0.2):(1.E-4); hessian = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); site_hessian = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); gradient = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); ori_bl = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); plus = (phydbl *)mCalloc((int)dim*tree->data->n_pattern,sizeof(phydbl)); plusplus = (phydbl *)mCalloc((int)dim*tree->data->n_pattern,sizeof(phydbl)); minus = (phydbl *)mCalloc((int)dim*tree->data->n_pattern,sizeof(phydbl)); zero = (phydbl *)mCalloc((int)dim*tree->data->n_pattern,sizeof(phydbl)); inc_plus = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); inc_minus = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); inc = (phydbl *)mCalloc((int)dim,sizeof(phydbl)); is_ok = (int *)mCalloc((int)dim,sizeof(int)); lnL1 = lnL2 = UNLIKELY; for(i=0;ia_edges[i]->l->v; Set_Both_Sides(YES,tree); Lk(NULL,tree); ori_lnL = tree->c_lnL; if(tree->mod->log_l == NO) l_inf = MAX(tree->mod->l_min,1./(phydbl)tree->data->init_len); else l_inf = MAX(tree->mod->l_min,-log((phydbl)tree->data->init_len)); for(i=0;ia_edges[i]->l->v*(1.-eps) > l_inf) { inc_plus[i] = fabs(eps * MAX(tree->mod->l_min,tree->a_edges[i]->l->v)); inc_minus[i] = fabs(eps * MAX(tree->mod->l_min,tree->a_edges[i]->l->v)); is_ok[i] = YES; } else { inc_plus[i] = fabs(0.2 * MAX(tree->mod->l_min,tree->a_edges[i]->l->v)); inc_minus[i] = fabs(0.2 * MAX(tree->mod->l_min,tree->a_edges[i]->l->v)); is_ok[i] = NO; } } /* Fine tune the increments */ for(i=0;ia_edges[i]->l->v += inc_plus[i]; lnL1 = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v = ori_bl[i]; inc_plus[i] *= 1.1; }while((fabs(lnL1 - ori_lnL) < 1.E-1) && (tree->a_edges[i]->l->v+inc_plus[i] < tree->mod->l_max)); inc_plus[i] /= 1.1; } for(i=0;ia_edges[i]->l->v -= inc_minus[i]; lnL1 = Lk(tree->a_edges[i],tree); tree->a_edges[i]->l->v = ori_bl[i]; inc_minus[i] *= 1.1; }while((fabs(lnL1 - ori_lnL) < 1.E-1) && (tree->a_edges[i]->l->v -inc_minus[i] > tree->mod->l_min)); inc_minus[i] /= 1.1; } for(i=0;ia_edges[i]->l->v += inc[i]; Lk(tree->a_edges[i],tree); for(j=0;jdata->n_pattern;j++) plus[i*tree->data->n_pattern+j] = log(tree->cur_site_lk[j]); tree->a_edges[i]->l->v = ori_bl[i]; } } /* minus */ for(i=0;ia_edges[i]->l->v -= inc[i]; Lk(tree->a_edges[i],tree); for(j=0;jdata->n_pattern;j++) minus[i*tree->data->n_pattern+j] = log(tree->cur_site_lk[j]); tree->a_edges[i]->l->v = ori_bl[i]; } } for(i=0;ia_edges[i],tree); for(j=0;jdata->n_pattern;j++) zero[i*tree->data->n_pattern+j] = log(tree->cur_site_lk[j]); tree->a_edges[i]->l->v += inc[i]; lnL1 = Lk(tree->a_edges[i],tree); for(j=0;jdata->n_pattern;j++) plus[i*tree->data->n_pattern+j] = log(tree->cur_site_lk[j]); tree->a_edges[i]->l->v += inc[i]; lnL2 = Lk(tree->a_edges[i],tree); for(j=0;jdata->n_pattern;j++) plusplus[i*tree->data->n_pattern+j] = log(tree->cur_site_lk[j]); tree->a_edges[i]->l->v = ori_bl[i]; } } For(i,dim*dim) hessian[i] = 0.0; for(k=0;kdata->n_pattern;k++) { for(i=0;idata->n_pattern+k] - minus[i*tree->data->n_pattern+k])/(inc[i] + inc[i]); else gradient[i] = (4.*plus[i*tree->data->n_pattern+k] - plusplus[i*tree->data->n_pattern+k] - 3.*zero[i*tree->data->n_pattern+k])/(inc[i] + inc[i]); /* if(is_ok[i] == NO) */ /* printf("\n. i=%d site=%d l=%G plus=%G plusplus=%G zero=%G num=%f grad=%G", */ /* i,k,tree->a_edges[i]->l->v, */ /* plus[i*tree->data->n_pattern+k],plusplus[i*tree->data->n_pattern+k],zero[i*tree->data->n_pattern+k], */ /* (4.*plus[i*tree->data->n_pattern+k] - plusplus[i*tree->data->n_pattern+k] - 3.*zero[i*tree->data->n_pattern+k]), */ /* gradient[i]); */ } for(i=0;idata->wght[k]; } /* Make sure to update likelihood before bailing out */ Set_Both_Sides(YES,tree); Lk(NULL,tree); l = tree->data->init_len; n = tree->mod->ns; /* Delta method for variance. Assumes Jukes and Cantor with p=1/n */ small_var = (1./(l*l))*(1.-1./l)*(n-1.)*(n-1.)/(n-1.-n/l); for(i=0;imod->log_l == YES) { hessian[i*dim+i] = small_var * POW(exp(tree->a_edges[i]->l->v),-2); hessian[i*dim+i] = -1./hessian[i*dim+i]; } } for(i=0;imod->log_l == YES) { hessian[i*dim+i] = small_var * POW(exp(tree->a_edges[i]->l->v),-2); hessian[i*dim+i] = -1./hessian[i*dim+i]; } } for(i=0;i 1.E-3) { PhyML_Printf("\n== Hessian not symmetrical."); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } hessian[i*dim+j] = (hessian[i*dim+j] + hessian[j*dim+i]) / 2.; hessian[j*dim+i] = hessian[i*dim+j]; } } /* printf("\n"); */ /* printf("HESSIAN SEO\n"); */ /* for(i=0;ia_edges[i]->l->v); */ /* for(j=0;jv[i] == d) { Update_Partial_Lk(tree,a->b[i],a); ori_l = a->b[i]->l->v; if(is_ok[a->b[i]->num]) { if(plus_minus > 0) a->b[i]->l->v += inc[a->b[i]->num]; else a->b[i]->l->v -= inc[a->b[i]->num]; res[a->b[i]->num] = Lk(a->b[i],tree); a->b[i]->l->v = ori_l; Update_PMat_At_Given_Edge(a->b[i],tree); } break; } if(d->tax) return; else for(i=0;i<3;i++) if(d->v[i] != a) Recurr_Hessian(d,d->v[i],plus_minus,inc,res,is_ok,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Work out the Hessian for the likelihood function. Only logARITHM of branch lengths are considered as variable. This function is very much inspired from Jeff Thorne's 'hessian' function in his program 'estbranches'. */ phydbl *Hessian_Log(t_tree *tree) { phydbl *hessian; phydbl *plus_plus, *minus_minus, *plus_zero, *minus_zero, *plus_minus, *zero_zero; phydbl *ori_bl,*inc,*buff; int *ok_edges,*is_ok; int dim; int n_ok_edges; int i,j; phydbl eps; phydbl lk; dim = 2*tree->n_otu-3; eps = 1.E-4; hessian = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); ori_bl = (phydbl *)mCalloc((int)dim, sizeof(phydbl)); plus_plus = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); minus_minus = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); plus_minus = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); plus_zero = (phydbl *)mCalloc((int)dim ,sizeof(phydbl)); minus_zero = (phydbl *)mCalloc((int)dim ,sizeof(phydbl)); zero_zero = (phydbl *)mCalloc((int)dim ,sizeof(phydbl)); inc = (phydbl *)mCalloc((int)dim ,sizeof(phydbl)); buff = (phydbl *)mCalloc((int)dim*dim,sizeof(phydbl)); ok_edges = (int *)mCalloc((int)dim, sizeof(int)); is_ok = (int *)mCalloc((int)dim, sizeof(int)); Set_Both_Sides(YES,tree); Lk(NULL,tree); for(i=0;ia_edges[i]->l->v; n_ok_edges = 0; for(i=0;ia_edges[i]->l->v > 3.0/(phydbl)tree->data->init_len) { inc[i] = fabs(eps * tree->a_edges[i]->l->v); ok_edges[n_ok_edges] = i; n_ok_edges++; is_ok[i] = 1; } else is_ok[i] = 0; } /* zero zero */ lk = Log_Det(is_ok,tree); for(i=0;ic_lnL+lk; /* plus zero */ for(i=0;ia_edges[i]->l->v += inc[i]; lk = Lk(tree->a_edges[i],tree); plus_zero[i] = lk+Log_Det(is_ok,tree); tree->a_edges[i]->l->v = ori_bl[i]; } } /* minus zero */ for(i=0;ia_edges[i]->l->v -= inc[i]; lk = Lk(tree->a_edges[i],tree); minus_zero[i] = lk+Log_Det(is_ok,tree); tree->a_edges[i]->l->v = ori_bl[i]; } } for(i=0;ia_edges[i],tree); /* plus plus */ for(i=0;ia_edges[i]->l->v += inc[i]; Update_PMat_At_Given_Edge(tree->a_edges[i],tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->left->tax) && (tree->a_edges[i]->left->v[j] != tree->a_edges[i]->rght)) Recurr_Hessian_Log(tree->a_edges[i]->left,tree->a_edges[i]->left->v[j],1,inc,plus_plus+i*dim,is_ok,tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->rght->tax) && (tree->a_edges[i]->rght->v[j] != tree->a_edges[i]->left)) Recurr_Hessian_Log(tree->a_edges[i]->rght,tree->a_edges[i]->rght->v[j],1,inc,plus_plus+i*dim,is_ok,tree); /* for(j=0;j 0.0) */ /* { */ /* tree->a_edges[j]->l->v += inc[j]; */ /* Lk(tree); */ /* plus_plus[i*dim+j]=tree->c_lnL; */ /* tree->a_edges[j]->l->v = ori_bl[j]; */ /* } */ /* } */ tree->a_edges[i]->l->v = ori_bl[i]; Lk(NULL,tree); } } /* plus minus */ for(i=0;ia_edges[i]->l->v += inc[i]; Update_PMat_At_Given_Edge(tree->a_edges[i],tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->left->tax) && (tree->a_edges[i]->left->v[j] != tree->a_edges[i]->rght)) Recurr_Hessian_Log(tree->a_edges[i]->left,tree->a_edges[i]->left->v[j],-1,inc,plus_minus+i*dim,is_ok,tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->rght->tax) && (tree->a_edges[i]->rght->v[j] != tree->a_edges[i]->left)) Recurr_Hessian_Log(tree->a_edges[i]->rght,tree->a_edges[i]->rght->v[j],-1,inc,plus_minus+i*dim,is_ok,tree); /* for(j=0;j 0.0) */ /* { */ /* tree->a_edges[j]->l->v -= inc[j]; */ /* Lk(tree); */ /* plus_minus[i*dim+j] = tree->c_lnL; */ /* tree->a_edges[j]->l->v = ori_bl[j]; */ /* } */ /* } */ tree->a_edges[i]->l->v = ori_bl[i]; Lk(NULL,tree); } } /* minus minus */ for(i=0;ia_edges[i]->l->v -= inc[i]; Update_PMat_At_Given_Edge(tree->a_edges[i],tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->left->tax) && (tree->a_edges[i]->left->v[j] != tree->a_edges[i]->rght)) Recurr_Hessian_Log(tree->a_edges[i]->left,tree->a_edges[i]->left->v[j],-1,inc,minus_minus+i*dim,is_ok,tree); for(j=0;j<3;j++) if((!tree->a_edges[i]->rght->tax) && (tree->a_edges[i]->rght->v[j] != tree->a_edges[i]->left)) Recurr_Hessian_Log(tree->a_edges[i]->rght,tree->a_edges[i]->rght->v[j],-1,inc,minus_minus+i*dim,is_ok,tree); /* for(j=0;j 0.0) */ /* { */ /* tree->a_edges[j]->l->v -= inc[j]; */ /* Lk(tree); */ /* minus_minus[i*dim+j] = tree->c_lnL; */ /* tree->a_edges[j]->l->v = ori_bl[j]; */ /* } */ /* } */ tree->a_edges[i]->l->v = ori_bl[i]; Lk(NULL,tree); } } /* for(i=0;ia_edges[i]->l->v+inc[i],2)-POW(tree->a_edges[i]->l->v,2); */ for(i=0;ia_edges[i]->l->v+inc[i])-log(tree->a_edges[i]->l->v); /* for(i=0;ia_edges[i]->l->v+inc[i])-SQRT(tree->a_edges[i]->l->v); */ for(i=0;idata->init_len,2); } if(!Matinv(hessian,dim,dim,NO)) { PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } For(i,dim*dim) hessian[i] = -1.0*hessian[i]; /* for(i=0;ia_edges[i]->l->v); */ /* For(j,i+1) */ /* { */ /* PhyML_Printf("%12lf ",hessian[i*dim+j]); */ /* } */ /* PhyML_Printf("\n"); */ /* } */ /* Matinv(hessian,dim,dim); */ /* PhyML_Printf("\n"); */ for(i=0;ia_edges[i]->l->v); For(j,i+1) { PhyML_Printf("%12lf ",hessian[i*dim+j]); } PhyML_Printf("\n"); } /* Exit("\n"); */ Free(ori_bl); Free(plus_plus); Free(minus_minus); Free(plus_zero); Free(minus_zero); Free(plus_minus); Free(zero_zero); Free(inc); Free(buff); Free(ok_edges); Free(is_ok); return hessian; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Recurr_Hessian_Log(t_node *a, t_node *d, int plus_minus, phydbl *inc, phydbl *res, int *is_ok, t_tree *tree) { int i; phydbl ori_l; for(i=0;i<3;i++) if(a->v[i] == d) { Update_Partial_Lk(tree,a->b[i],a); ori_l = a->b[i]->l->v; if(is_ok[a->b[i]->num]) { if(plus_minus > 0) a->b[i]->l->v += inc[a->b[i]->num]; else a->b[i]->l->v -= inc[a->b[i]->num]; res[a->b[i]->num] = Lk(a->b[i],tree); res[a->b[i]->num] += Log_Det(is_ok,tree); a->b[i]->l->v = ori_l; Update_PMat_At_Given_Edge(a->b[i],tree); } break; } if(d->tax) return; else for(i=0;i<3;i++) if(d->v[i] != a) Recurr_Hessian_Log(d,d->v[i],plus_minus,inc,res,is_ok,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Log_Det(int *is_ok, t_tree *tree) { int i; phydbl ldet; ldet = 0.0; /* For(i,2*tree->n_otu-3) if(is_ok[i]) ldet += log(2.*SQRT(tree->a_edges[i]->l->v)); */ For(i,2*tree->n_otu-3) if(is_ok[i]) ldet += log(tree->a_edges[i]->l->v); /* For(i,2*tree->n_otu-3) if(is_ok[i]) ldet -= log(2*tree->a_edges[i]->l->v); */ return ldet; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Normal_Trunc_Mean(phydbl mu, phydbl sd, phydbl min, phydbl max) { phydbl mean; mean = mu + sd * (Dnorm((min-mu)/sd,0.,1.)-Dnorm((max-mu)/sd,0.,1.))/ (Pnorm((max-mu)/sd,0.,1.)-Pnorm((min-mu)/sd,0.,1.)); return mean; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Constraint_Normal_Trunc_Mean(phydbl wanted_mu, phydbl sd, phydbl min, phydbl max) { int j; phydbl dx,f,fmid,xmid,rtb; phydbl x1, x2; x1 = min; x2 = max; f = Normal_Trunc_Mean(x1,sd,min,max) - wanted_mu; fmid = Normal_Trunc_Mean(x2,sd,min,max) - wanted_mu; if(f*fmid >= 0.0) { PhyML_Printf("\n. Root must be bracketed for bisection!"); PhyML_Printf("\n. f=%f fmid=%f",f,fmid); PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } rtb = f < 0.0 ? (dx=x2-x1,x1) : (dx=x1-x2,x2); for(j=0;j<100;j++) { xmid=rtb+(dx *= 0.5); fmid=Normal_Trunc_Mean(xmid,sd,min,max)-wanted_mu; if(fmid <= 0.0) rtb=xmid; if(fmid > -1.E-10 && fmid < 1.E-10) return rtb; } Exit("Too many bisections in RTBIS"); return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Matinv(phydbl *x, const int n, const int m, const int verbose) { /* x[n*m] ... m>=n */ int i,j,k; int *irow; phydbl ee, t,t1,xmax; ee = 1.0E-10; irow = (int *)mCalloc(n,sizeof(int)); for(i=0;i=0; i--) { if (irow[i] == i) continue; for(j=0;j 100) { PhyML_Printf("\n== Err in file %s at line %d.",__FILE__,__LINE__); return 0; } } if(pb) PhyML_Printf("\n== Managed to fix the problem by rescaling the matrix."); For(i,n*m) x[i] = buff[i]*scaler; Free(buff); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl *Matrix_Mult(phydbl *A, phydbl *B, int nra, int nca, int nrb, int ncb) { int i,j,k; phydbl *C; C = (phydbl *)mCalloc(nra*ncb,sizeof(phydbl)); if(nca != nrb) { PhyML_Printf("\n. Matrices dimensions don't match."); PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } for(i=0;i 1.E-3) */ /* { */ /* PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ /* } */ for(i=0;i 1.E-3) { PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } } Free(mu1); Free(mu2); Free(sig11); Free(sig12); Free(sig21); Free(sig22); Free(ctrd_a); Free(cond_cov_norder); Free(cond_mu_norder); Free(sig12_invsig22); Free(buff_mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* http://en.wikipedia.org/wiki/Multivariate_normal_distribution (Conditional distributions) */ void Normal_Conditional_Unsorted(phydbl *mu, phydbl *cov, phydbl *a, int n, short int *is_1, int n1, phydbl *cond_mu, phydbl *cond_cov) { phydbl *mu1,*mu2; phydbl *sig11,*sig12,*sig21,*sig22,*sig12_invsig22,*buff; phydbl *ctrd_a; int n2; int i,j,nr,nc; n2 = n-n1; mu1 = (phydbl *)mCalloc(n1, sizeof(phydbl)); mu2 = (phydbl *)mCalloc(n2, sizeof(phydbl)); sig11 = (phydbl *)mCalloc(n1*n1,sizeof(phydbl)); sig12 = (phydbl *)mCalloc(n1*n2,sizeof(phydbl)); sig21 = (phydbl *)mCalloc(n2*n1,sizeof(phydbl)); sig22 = (phydbl *)mCalloc(n2*n2,sizeof(phydbl)); ctrd_a = (phydbl *)mCalloc(n2, sizeof(phydbl)); nr=0; for(i=0;i max || min > max) { PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } cons = LnGamma(n+1) - LnGamma(r) - LnGamma(n-r+1); cons = exp(cons); cons = ROUND(cons); Fx = (x-min)/(max-min); dens = cons * pow(Fx,r-1) * pow(1.-Fx,n-r) * (1./(max-min)); /* printf("\n. x=%f r=%d n=%d min=%f max=%f dens=%f",x,r,n,min,max,dens); */ /* Exit("\n"); */ return(dens); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Covariance(phydbl *x, phydbl *y, int n) { int i; phydbl mean_x,mean_y,mean_xy; mean_x = .0; for(i=0;i alpha - lambda[cond]*min[i]) { PhyML_Printf("\n. Cannot satisfy the constraint.\n"); PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } err = NO; zi = Rnorm_Trunc(cond_mean,SQRT(cond_var), MAX(lambda[i]*min[i],alpha-lambda[cond]*max[cond]), MIN(lambda[i]*max[i],alpha-lambda[cond]*min[cond]),&err); if(err == YES) { PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } sum += zi; x[i] = zi / lambda[i]; } } x[cond] = (k - sum)/lambda[cond]; }while(iter++ < 10); return(loc_res); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Integrated_Brownian_Bridge_Moments(phydbl x_beg, phydbl x_end, phydbl y_beg, phydbl y_end, phydbl brownian_var, phydbl *mean, phydbl *var) { /* phydbl *y; */ /* phydbl *y_mean; */ /* int n_rep; */ int n_breaks; int i; /* int j; */ /* phydbl traj_mean, traj_sd; */ /* phydbl x_prev, x_curr; */ phydbl x; phydbl x_step; phydbl sum; /* phydbl sumsum; */ phydbl scaled_var; scaled_var = brownian_var/fabs(x_end - x_beg); n_breaks = 100; /* n_rep = 500; */ /* x_step = (x_end - x_beg)/(n_breaks+1); */ /* y = (phydbl *)mCalloc(n_breaks+2,sizeof(phydbl)); */ /* y_mean = (phydbl *)mCalloc(n_rep,sizeof(phydbl)); */ /* y[0] = y_beg; */ /* y[n_breaks+1] = y_end; */ /* for(i=0;i 2.0 && pnormarg2 > 2.0) || (pnormarg1 < -2.0 && pnormarg2 < -2.0)) { // Proposition 5.1 in Privaut & Guindon, 2015, Journal of mathematical biology 71 (6-7), 1387-1409 *mean = T*(B-A)/log(B/A)+u*u*T*T*((A+B)/(2.*pow(log(B/A),2)) - (B-A)/pow(log(B/A),3)); } else { // Proposition 3.3 in Privaut & Guindon, 2015, Journal of mathematical biology 71 (6-7), 1387-1409 *mean = (A/(u*u))*sqrt(2.*PI*u*u*T)*exp(pow(u*u*T/2.+log(B/A),2)/(2.*u*u*T))* (Pnorm(pnormarg1,0.,1.) - Pnorm(pnormarg2,0.,1.)); } *mean = *mean/T; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Integrated_Geometric_Brownian_Bridge_Var(phydbl T, phydbl A, phydbl B, phydbl u, phydbl *var) { double U = T*u*u; double logz = log(B/A); double z = B/A; double m; phydbl pnormarg1 = log(B/A)/sqrt(u*u*T) + .5*sqrt(u*u*T); phydbl pnormarg2 = pnormarg1 - sqrt(u*u*T); if((pnormarg1 > 2.0 && pnormarg2 > 2.0) || (pnormarg1 < -2.0 && pnormarg2 < -2.0)) { // Proposition 5.1 in Privaut & Guindon, 2015, Journal of mathematical biology 71 (6-7), 1387-1409 *var = 0.0; } else { // Proposition 3.3 in Privaut & Guindon, 2015, Journal of mathematical biology 71 (6-7), 1387-1409 *var = 2.*sqrt(2.*PI*U)*exp(pow(U +logz,2)/(2.*U))*(Pnorm(logz/sqrt(U) + sqrt(U),0.0,1.0)-Pnorm(logz/sqrt(U) - sqrt(U),0.0,1.0)) - (1.+z)*2.*sqrt(2.*PI*U)*exp(pow(U/2.+logz,2)/(2.*U))*(Pnorm(logz/sqrt(U) + .5*sqrt(U),0.0,1.0)-Pnorm(logz/sqrt(U) - .5*sqrt(U),0.0,1.0)); *var = *var * pow(A,2) / pow(u,4); Integrated_Geometric_Brownian_Bridge_Mean(T,A,B,u,&m); *var = *var / pow(T,2); *var = *var - m*m; } if(*var < 0.0) *var = 0.0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Inverse method to sample from X where P(X=xi)=pi[i] int Sample_i_With_Proba_pi(phydbl *pi, int len) { phydbl *cum_pi; int i; phydbl u; cum_pi = (phydbl *)mCalloc(len,sizeof(phydbl)); u = .0; for(i=0;i 1. + 1.E-10) || (cum_pi[i-1] < 1. - 1.E-10)) { PhyML_Printf("\n== Sum of probabilities is different from 1.0 (%f).",cum_pi[i-1]); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } u = Uni(); for(i=0;i u) break; if(i == len) { for(i=0;i=0; --i ) { if ( p[i]<1 ) small[num_small++] = i; else large[num_large++] = i; } while ( num_small && num_large ) { a = small[--num_small]; g = large[--num_large]; prob[a] = p[a]; alias[a] = g; p[g] = p[g] + p[a] - 1; if ( p[g] < 1 ) small[num_small++] = g; else large[num_large++] = g; } while ( num_large ) prob[ large[--num_large] ] = 1; while ( num_small ) prob[ small[--num_small] ] = 1; Free( p ); Free( small ); Free( large ); for(n=0; n obs_stat) p_val += 1.; } return(p_val / (phydbl)npermut); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Weighted_Mean(phydbl *x, phydbl *w, int l) { int i; phydbl wm; wm = .0; if(w) for(i=0;i 8*(int)sizeof(int)) { PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } sum = 0; for(i=0;i> i) & 1; } return(sum); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Modulo (int a, int b) { if(b < 0) return Modulo(-a, -b); int ret = a % b; if(ret < 0) ret+=b; return ret; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Runif_Disk(phydbl *sampled_x, phydbl *sampled_y, phydbl centrx, phydbl centry, phydbl radius) { phydbl r,theta; r = Uni(); theta = Uni()*2.*PI; (*sampled_x) = SQRT(r)*COS(theta); (*sampled_y) = SQRT(r)*SIN(theta); (*sampled_x) *= radius; (*sampled_y) *= radius; (*sampled_x) += centrx; (*sampled_y) += centry; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Random_String(char *s, int len) { int i; for(i=0;in_poly_vert = n; for(i=0;ipoly_vert[i]->lonlat[0] = Uni(); p->poly_vert[i]->lonlat[1] = Uni(); } return(p); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Area_Of_Poly_Monte_Carlo(t_poly *poly, t_geo_coord *lim) { int n_hit,n_trials,trial; t_geo_coord *point; point = (t_geo_coord *)GEO_Make_Geo_Coord(2); n_trials = 1E+7; trial = 0; n_hit = 0; do { point->lonlat[0] = Uni()*lim->lonlat[0]; point->lonlat[1] = Uni()*lim->lonlat[1]; if(Is_In_Polygon(point,poly) == YES) n_hit++; trial++; } while(trial < n_trials); Free_Geo_Coord(point); return((phydbl)(n_hit)/n_trials*lim->lonlat[0]*lim->lonlat[1]); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int Is_In_Polygon(t_geo_coord *point, t_poly *poly) { int i,j; phydbl x,y,x1,y1,x2,y2; phydbl x_intersect; short int is_in; assert(point); assert(poly); /* Coordinates of the point to test */ x = point->lonlat[0]; y = point->lonlat[1]; j = poly->n_poly_vert-1; is_in = NO; for(i=0;in_poly_vert;i++) { /* Edge of polygon goes from (x1,y1) to (x2,y2) */ x1 = poly->poly_vert[i]->lonlat[0]; y1 = poly->poly_vert[i]->lonlat[1]; x2 = poly->poly_vert[j]->lonlat[0]; y2 = poly->poly_vert[j]->lonlat[1]; j = i; /* Shoot an horizontal ray to the right. Find out if this ray hits the polygon edge */ if((y1 < y && y2 > y) || (y2 < y && y1 > y)) { /* Coordinates along X-axis of the intersection between ray and edge */ x_intersect = (y-y1)/(y1-y2)*(x1-x2)+x1; if(x_intersect > x) /* Intersection is on the righthand side */ is_in = (is_in == YES)?NO:YES; } } return is_in; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Modified Bessel function of the first kind. Stolen from Numerical Recipes in C. */ phydbl Bessi0(phydbl x) { phydbl ax,ans; phydbl y; if ((ax=fabs(x)) < 3.75) { y=x/3.75; y*=y; ans=1.0+y*(3.5156229+y*(3.0899424+y*(1.2067492+y*(0.2659732+y*(0.360768e-1+y*0.45813e-2))))); } else { y=3.75/ax; ans=(exp(ax)/sqrt(ax))*(0.39894228+y*(0.1328592e-1+y*(0.225319e-2+y*(-0.157565e-2+y*(0.916281e-2+y*(-0.2057706e-1+y*(0.2635537e-1+y*(-0.1647633e-1+y*0.392377e-2)))))))); } return ans; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Modified Bessel function of the second kind (degree 0). Stolen from Numerical Recipes in C. */ phydbl Bessk0(phydbl x) { phydbl y,ans; if (x <= 2.0) { y=x*x/4.0; ans=(-log(x/2.0)*Bessi0(x))+(-0.57721566+y*(0.42278420+y*(0.23069756+y*(0.3488590e-1+y*(0.262698e-2+y*(0.10750e-3+y*0.74e-5)))))); } else { y=2.0/x; ans=(exp(-x)/sqrt(x))*(1.25331414+y*(-0.7832358e-1+y*(0.2189568e-1+y*(-0.1062446e-1+y*(0.587872e-2+y*(-0.251540e-2+y*0.53208e-3)))))); } return ans; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Euclidean_Distance(t_geo_coord *x, t_geo_coord *y) { int i; phydbl dist; if(x->dim != y->dim) { PhyML_Printf("\n. x->dim: %d y->dim: %d",x->dim,y->dim); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } dist = 0.0; for(i=0;idim;i++) dist += pow(x->lonlat[i]-y->lonlat[i],2); return(sqrt(dist)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Manhattan_Distance(t_geo_coord *x, t_geo_coord *y) { int i; phydbl dist; if(x->dim != y->dim) { PhyML_Printf("\n. x->dim: %d y->dim: %d",x->dim,y->dim); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } dist = 0.0; for(i=0;idim;i++) dist += fabs(x->lonlat[i]-y->lonlat[i]); return(dist); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // Haversine distance between (lon1,lat1) and (lon2,lat2) where // coordinates are expressed using decimals phydbl Haversine_Distance(t_geo_coord *x, t_geo_coord *y) { phydbl R = 6371.; // Earth radius, in km phydbl a; phydbl lon1,lat1,lon2,lat2; lon1 = x->lonlat[0] * PI / 180.; lat1 = x->lonlat[1] * PI / 180.; lon2 = y->lonlat[0] * PI / 180.; lat2 = y->lonlat[1] * PI / 180.; a = pow(sin(.5*(lat2-lat1)),2); a += cos(lat1)*cos(lat2)*pow(sin(.5*(lon2-lon1)),2); return(2.* R * asin(sqrt(a))); /* return(sqrt(pow(lon1-lon2,2)+pow(lat1-lat2,2))); */ } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Return a vector rk such that rk[i] gives the index of the i-th largest element in x */ int *Ranks(phydbl *x, int len) { int *rk,tmp; int i,swap; rk = (int *)mCalloc(len,sizeof(int)); for(i=0;i end_time) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); for(i=0;i time[i])) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); state = Brownian_Generate(var,n_steps,beg_time,time); end_brown = Rnorm(state[n_steps-1],SQRT((time[n_steps-1] - end_time)*var)); for(i=0;i up) ref = up - (ref - up); if(ref < down) ref = down + (down - ref); }while(!(ref < up && ref > down)); return(ref); } stephaneguindon-phyml-76a39c8/src/stats.h000066400000000000000000000162431501136442400205060ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef STATS_H #define STATS_H #include "utilities.h" #include "free.h" #include "lk.h" #include "optimiz.h" #include "models.h" #include "eigen.h" phydbl *Covariance_Matrix(t_tree *tree); phydbl *Hessian(t_tree *tree); void Recurr_Hessian(t_node *a, t_node *b, int plus_minus, phydbl *inc, phydbl *res, int *is_ok, t_tree *tree); phydbl stdnormal_inv(phydbl p); phydbl Uni(void); int Rand_Int(int min, int max); phydbl Ahrensdietergamma(phydbl alpha); phydbl Rgamma(phydbl shape, phydbl scale); phydbl Rexp(phydbl lambda); phydbl Bico(int n, int k); phydbl Factln(int n); phydbl Gammln(phydbl xx); phydbl Pbinom(int N, int ni, phydbl p); phydbl LnGamma (phydbl alpha); phydbl IncompleteGamma(phydbl x, phydbl alpha, phydbl ln_gamma_alpha); phydbl PointChi2 (phydbl prob, phydbl v); phydbl Bivariate_Normal_Density(phydbl x, phydbl y, phydbl mux, phydbl muy, phydbl sdx, phydbl sdy, phydbl rho); phydbl PointNormal (phydbl prob); int DiscreteGamma (phydbl freqK[], phydbl rK[],phydbl alfa, phydbl beta, int K, int median); phydbl Pnorm(phydbl x, phydbl mean, phydbl var); phydbl Dnorm_Moments(phydbl x, phydbl mean, phydbl var); phydbl Dnorm(phydbl x, phydbl mean, phydbl sd); phydbl Pgamma(phydbl x, phydbl shape, phydbl scale); phydbl Dgamma_Moments(phydbl x, phydbl mean, phydbl var); phydbl Dgamma(phydbl x, phydbl shape, phydbl scale); phydbl LnFact(int n); int Choose(int n, int k); phydbl LnChoose(int n, int k); phydbl Ppois(phydbl x, phydbl param); phydbl Dexp(phydbl x, phydbl param); phydbl Log_Dexp(phydbl x, phydbl param); phydbl Dpois(phydbl x, phydbl param, int logit); phydbl Rand_Normal_Deviate(phydbl mean, phydbl sd); phydbl Rnorm(phydbl mean, phydbl sd); phydbl *Rnorm_Multid(phydbl *mu, phydbl *cov, int dim); phydbl Rnorm_Trunc(phydbl mean, phydbl sd, phydbl min, phydbl max, int *err); phydbl *Rnorm_Multid_Trunc(phydbl *mean, phydbl *cov, phydbl *min, phydbl *max, int dim); phydbl *Hessian_Log(t_tree *tree); void Recurr_Hessian_Log(t_node *a, t_node *d, int plus_minus, phydbl *inc, phydbl *res, int *is_ok, t_tree *tree); phydbl Log_Det(int *is_ok, t_tree *tree); phydbl Dnorm_Trunc(phydbl x, phydbl mean, phydbl sd, phydbl lo, phydbl up); phydbl Normal_Trunc_Mean(phydbl mu, phydbl sd, phydbl min, phydbl max); phydbl Constraint_Normal_Trunc_Mean(phydbl wanted_mu, phydbl sd, phydbl min, phydbl max); phydbl Dnorm_Multi(phydbl *x, phydbl *mu, phydbl *cov, int size, int _log); phydbl Dnorm_Multi_Given_InvCov_Det(phydbl *x, phydbl *mu, phydbl *invcov, phydbl det, int size, int _log); phydbl Prop_Log_Dnorm_Multi_Given_InvCov_Det(phydbl *x, phydbl *mu, phydbl *invcov, phydbl det, int size); phydbl Log_Dnorm(phydbl x, phydbl mean, phydbl sd, int *err); phydbl tt800(void); phydbl Pnorm_Ihaka_Derived_From_Cody(phydbl x); int Matinv(phydbl *x, const int n, const int m, const int verbose); phydbl *Matrix_Mult(phydbl *A, phydbl *B, int nra, int nca, int nrb, int ncb); phydbl *Matrix_Transpose(phydbl *A, int dim); void Normal_Conditional(phydbl *mu, phydbl *cov, phydbl *a, int n, short int *is_1, int n1, phydbl *cond_mu, phydbl *cond_var); void Normal_Conditional_Unsorted(phydbl *mu, phydbl *cov, phydbl *a, int n, short int *is_1, int n1, phydbl *cond_mu, phydbl *cond_cov); phydbl Matrix_Det(phydbl *A, int size, int _log); void Get_Reg_Coeff(phydbl *mu, phydbl *cov, phydbl *a, int n, short int *is_1, int n1, phydbl *reg_coeff); phydbl Rnorm_Trunc_Inverse(phydbl mean, phydbl sd, phydbl min, phydbl max, int *error); phydbl Norm_Trunc_Sd(phydbl mu, phydbl sd, phydbl a, phydbl b); phydbl Norm_Trunc_Mean(phydbl mu, phydbl sd, phydbl a, phydbl b); int Norm_Trunc_Mean_Sd(phydbl mu, phydbl sd, phydbl a, phydbl b, phydbl *trunc_mu, phydbl *trunc_sd); phydbl Log_Dnorm_Trunc(phydbl x, phydbl mean, phydbl sd, phydbl lo, phydbl up, int *err); phydbl Pnorm_Marsaglia(phydbl x); int Iter_Matinv(phydbl *x, int n, int m, int verbose); phydbl Dorder_Unif(phydbl x, int r, int n, phydbl min, phydbl max); phydbl Covariance(phydbl *x, phydbl *y, int n); phydbl *Rnorm_Multid_Trunc_Constraint(phydbl *mu, phydbl *cov, phydbl *min, phydbl *max, phydbl *lambda, phydbl k, phydbl *res, int len); phydbl *Gradient(t_tree *tree); phydbl *Hessian_Seo(t_tree *tree); void Integrated_Brownian_Bridge_Moments(phydbl x_beg, phydbl x_end, phydbl y_beg, phydbl y_end, phydbl sd, phydbl *mean, phydbl *var); void Integrated_Geometric_Brownian_Bridge_Moments(phydbl T, phydbl A, phydbl B, phydbl u, phydbl *mean, phydbl *var); void Integrated_Geometric_Brownian_Bridge_Mean(phydbl T, phydbl A, phydbl B, phydbl u, phydbl *mean); void Integrated_Geometric_Brownian_Bridge_Var(phydbl T, phydbl A, phydbl B, phydbl u, phydbl *mean); int Sample_i_With_Proba_pi(phydbl *pi, int len); int* Sample_n_i_With_Proba_pi(phydbl *pi, int len,int n_elts); phydbl Quantile(phydbl *x, int len, phydbl p); phydbl Prob(phydbl *x, int len, phydbl z); phydbl Inverse_Truncated_Normal(phydbl y, phydbl mu, phydbl sigma, phydbl lim_inf, phydbl lim_sup); phydbl Progressive_EXP(phydbl x); int *Permutate(int len); phydbl Mantel(phydbl *x, phydbl *y, int nrow, int ncol); phydbl Weighted_Mean(phydbl *x, phydbl *w, int l); int Sum_Bits(int value, int range); int Modulo (int a, int b); void Runif_Disk(phydbl *sampled_x, phydbl *sampled_y, phydbl centrx, phydbl centry, phydbl radius); void Random_String(char *s, int len); int *Random_Permut(int n); phydbl Dexp_Trunc(phydbl x, phydbl lambda, phydbl left, phydbl rght); phydbl Rexp_Trunc(phydbl lambda, phydbl left, phydbl rght); t_poly *Rpoly(int n); phydbl Area_Of_Poly_Monte_Carlo(t_poly *poly, t_geo_coord *lim); int Is_In_Polygon(t_geo_coord *point, t_poly *poly); phydbl Variance(phydbl *x, int l); phydbl Bessi0(phydbl x); phydbl Bessk0(phydbl x); phydbl Euclidean_Distance(t_geo_coord *x, t_geo_coord *y); int *Ranks(phydbl *x, int len); phydbl Rpois(phydbl mmu); phydbl Rgeom(phydbl p); phydbl Dgeom(phydbl k, phydbl p, int logit); phydbl Pgeom(phydbl k, phydbl p); phydbl *Brownian_Bridge_Generate(phydbl start, phydbl end, phydbl var, phydbl beg_time, phydbl end_time, int n_steps, phydbl *time); phydbl *Brownian_Generate(phydbl var, int n_steps, phydbl beg_time, phydbl *time); phydbl Brownian_Bridge_Logdensity(phydbl start, phydbl end, phydbl *state, phydbl var, phydbl end_time, int n_steps, phydbl *time); phydbl Reflected(phydbl x, phydbl down, phydbl up); phydbl *Random_Walk_Generate(phydbl var, int n_steps); phydbl *Random_Walk_Bridged_Generate(phydbl start, phydbl end, phydbl var, int n_steps); phydbl Dnbinom(phydbl x, phydbl n, phydbl p, int logit); phydbl Rnbinom(phydbl n, phydbl p); phydbl Erf(phydbl x); phydbl Rnorm_Trunc_Algo1(phydbl alpha, phydbl beta, int *err); phydbl Rnorm_Trunc_Algo2(phydbl alpha, phydbl beta, int *err); phydbl Rnorm_Trunc_Algo3(phydbl alpha, phydbl beta, int *err); phydbl Rnorm_Trunc_Algo4(phydbl alpha, phydbl beta, int *err); phydbl Manhattan_Distance(t_geo_coord *x, t_geo_coord *y); phydbl Haversine_Distance(t_geo_coord *x, t_geo_coord *y); int *Reverse(int *v, int len); #endif stephaneguindon-phyml-76a39c8/src/tbe.c000066400000000000000000000232551501136442400201160ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "tbe.h" #include "utilities.h" /* UNION AND INTERSECT CALCULATIONS (FOR THE TRANSFER METHOD) */ void Update_IC_Ref_Tree(t_tree *ref_tree, t_node * orig, t_node* target, t_edge *my_br, t_tree *boot_tree, short unsigned** i_matrix, short unsigned** c_matrix, int* cluster_sizes){ /* this function does the post-order traversal (recursive from the pseudoroot to the leaves, updating knowledge for the subtrees) of the reference tree, examining only leaves (terminal edges) of the bootstrap tree. It sends a probe from the orig node to the target node (nodes in ref_tree), calculating I_ij and C_ij (see Brehelin, Gascuel, Martin 2008). */ int j, k; int edge_id; /* its id */ int next_edge_id; t_node *tip; int boot_edge_id; edge_id = my_br->num; /* all this is in ref_tree */ assert(target==my_br->rght); /* the descendant should always be the right side of the edge ? */ if(target->tax) { cluster_sizes[edge_id] = 1; for (j=0; j < 2*boot_tree->n_otu-3; j++) { /* for all the terminal edges of boot_tree */ boot_edge_id = boot_tree->a_edges[j]->num; // If not tip, continue tip = NULL; if(boot_tree->a_edges[j]->rght->tax) tip = boot_tree->a_edges[j]->rght; if(boot_tree->a_edges[j]->left->tax) tip = boot_tree->a_edges[j]->left; if(tip == NULL) continue; /* we only want to scan terminal edges of boot_tree, where the right son is a leaf */ /* else we update all the I_ij and C_ij with i = edge_id */ if (strcmp(target->name,tip->name)) { /* here the taxa are different */ i_matrix[edge_id][boot_edge_id] = 0; c_matrix[edge_id][boot_edge_id] = 1; } else { /* same taxa here in T_ref and T_boot */ i_matrix[edge_id][boot_edge_id] = 1; c_matrix[edge_id][boot_edge_id] = 0; } } /* end for on all edges of T_boot, for my_br being terminal */ } else { cluster_sizes[edge_id] = 0; /* now the case where my_br is not a terminal edge */ /* first initialise (zero) the cells we are going to update */ for (j=0; j < 2*boot_tree->n_otu-3; j++){ /* We initialize the i and c matrices for the edge edge_id with : * 0 for i : because afterwards we do i[edge_id] = i[edge_id] || i[next_edge_id] * 1 for c : because afterwards we do c[edge_id] = c[edge_id] && c[next_edge_id] */ if(boot_tree->a_edges[j]->rght->tax || boot_tree->a_edges[j]->left->tax){ boot_edge_id = boot_tree->a_edges[j]->num; i_matrix[edge_id][boot_edge_id] = 0; c_matrix[edge_id][boot_edge_id] = 1; } } for (k = 0; k < 3; k++) { if(target->v[k]!=orig){ Update_IC_Ref_Tree(ref_tree, target, target->v[k], target->b[k], boot_tree, i_matrix, c_matrix, cluster_sizes); next_edge_id = target->b[k]->num; cluster_sizes[edge_id] += cluster_sizes[next_edge_id]; for (j=0; j < 2*boot_tree->n_otu-3; j++) { /* for all the terminal edges of boot_tree */ boot_edge_id = boot_tree->a_edges[j]->num; // If not a tip, continue if(!(boot_tree->a_edges[j]->rght->tax) && !(boot_tree->a_edges[j]->left->tax)) continue; i_matrix[edge_id][boot_edge_id] = i_matrix[edge_id][boot_edge_id] || i_matrix[next_edge_id][boot_edge_id]; /* above is an OR between two integers, result is 0 or 1 */ c_matrix[edge_id][boot_edge_id] = c_matrix[edge_id][boot_edge_id] && c_matrix[next_edge_id][boot_edge_id]; /* above is an AND between two integers, result is 0 or 1 */ } /* end for j */ } } /* end for on all edges of T_boot, for my_br being internal */ } /* ending the case where my_br is an internal edge */ } /* end update_i_c_post_order_ref_tree */ void Update_All_IC_Ref_Tree(t_tree* ref_tree, t_tree* boot_tree, short unsigned** i_matrix, short unsigned** c_matrix, int* cluster_sizes) { /* this function is the first step of the union and intersection calculations */ int i; t_node *root; if(!ref_tree->n_root){ i = 0; while((!ref_tree->a_nodes[ref_tree->n_otu+i]->v[0]) || (!ref_tree->a_nodes[ref_tree->n_otu+i]->v[1]) || (!ref_tree->a_nodes[ref_tree->n_otu+i]->v[2])) i++; root=ref_tree->a_nodes[ref_tree->n_otu+i]; Update_IC_Ref_Tree(ref_tree, root, root->v[0], root->b[0], boot_tree, i_matrix, c_matrix, cluster_sizes); Update_IC_Ref_Tree(ref_tree, root, root->v[1], root->b[1], boot_tree, i_matrix, c_matrix, cluster_sizes); Update_IC_Ref_Tree(ref_tree, root, root->v[2], root->b[2], boot_tree, i_matrix, c_matrix, cluster_sizes); } else { root=ref_tree->n_root; Update_IC_Ref_Tree(ref_tree, root, root->v[0], root->b[0], boot_tree, i_matrix, c_matrix, cluster_sizes); Update_IC_Ref_Tree(ref_tree, root, root->v[1], root->b[1], boot_tree, i_matrix, c_matrix, cluster_sizes); } } /* end update_all_i_c_post_order_ref_tree */ void Update_IC_Boot_Tree(t_tree* ref_tree, t_tree* boot_tree, t_node* orig, t_node* target, t_edge *my_br, short unsigned** i_matrix, short unsigned** c_matrix, short unsigned** hamming, short unsigned* min_dist, short unsigned* min_dist_edge, int* cluster_sizes) { /* here we implement the second part of the Brehelin/Gascuel/Martin algorithm: post-order traversal of the bootstrap tree, and numerical recurrence. in this function, orig and target are nodes of boot_tree (aka T_boot). min_dist is an array whose size is equal to the number of edges in T_ref. It gives for each edge of T_ref its min distance to a split in T_boot. */ int i, k; int boot_edge_id /* its id */, next_boot_edge_id /* id of descending branches. */; int N = ref_tree->n_otu; /* we first have to determine which is the direction of the edge (orig -> target and target -> orig) */ boot_edge_id = my_br->num; /* here this is an edge_id corresponding to T_boot */ if(!target->tax){ /* because nothing to do in the case where target is a leaf: intersection and union already ok. */ /* otherwise, keep on posttraversing in all other directions */ /* first initialise (zero) the cells we are going to update */ for (i=0; i < 2*ref_tree->n_otu-3; i++) i_matrix[i][boot_edge_id] = c_matrix[i][boot_edge_id] = 0; for(k=0;k<3;k++) { if(target->v[k] != orig){ next_boot_edge_id = target->b[k]->num; Update_IC_Boot_Tree(ref_tree, boot_tree, target, target->v[k], target->b[k], i_matrix, c_matrix, hamming, min_dist, min_dist_edge, cluster_sizes); for (i=0; i < 2*ref_tree->n_otu-3; i++) { /* for all the edges of ref_tree */ i_matrix[i][boot_edge_id] += i_matrix[i][next_boot_edge_id]; c_matrix[i][boot_edge_id] += c_matrix[i][next_boot_edge_id]; } /* end for i */ } } } /* end if target is not a leaf: the following loop is performed in all cases */ for (i=0; i< 2*ref_tree->n_otu-3; i++) { /* for all the edges of ref_tree */ /* at this point we can calculate in all cases (internal branch or not) the Hamming distance at [i][boot_edge_id], */ /* card of union minus card of intersection */ hamming[i][boot_edge_id] = cluster_sizes[i] /* #taxa in the cluster i of T_ref */ + c_matrix[i][boot_edge_id] /* #taxa in cluster edge_id of T_boot BUT NOT in cluster i of T_ref */ - i_matrix[i][boot_edge_id]; /* #taxa in the intersection of the two clusters */ /* Let's immediately calculate the right ditance, taking into account the fact that the true disance is min (dist, N-dist) */ if (hamming[i][boot_edge_id] > N/2 /* floor value */) hamming[i][boot_edge_id] = N - hamming[i][boot_edge_id]; /* and update the min of all Hamming (TRANSFER) distances hamming[i][j] over all j */ if (hamming[i][boot_edge_id] < min_dist[i]){ min_dist[i] = hamming[i][boot_edge_id]; min_dist_edge[i] = boot_edge_id; } } /* end for on all edges of T_ref */ } /* end update_i_c_post_order_boot_tree */ void Update_All_IC_Boot_Tree(t_tree* ref_tree, t_tree* boot_tree, short unsigned** i_matrix, short unsigned** c_matrix, short unsigned** hamming, short unsigned* min_dist, short unsigned* min_dist_edge, int* cluster_sizes) { /* this function is the second step of the union and intersection calculations */ int i; t_node *root; if(!boot_tree->n_root){ i = 0; while((!boot_tree->a_nodes[boot_tree->n_otu+i]->v[0]) || (!boot_tree->a_nodes[boot_tree->n_otu+i]->v[1]) || (!boot_tree->a_nodes[boot_tree->n_otu+i]->v[2])) i++; root=boot_tree->a_nodes[boot_tree->n_otu+i]; Update_IC_Boot_Tree(ref_tree, boot_tree, root, root->v[0], root->b[0], i_matrix, c_matrix, hamming, min_dist, min_dist_edge, cluster_sizes); Update_IC_Boot_Tree(ref_tree, boot_tree, root, root->v[1], root->b[1], i_matrix, c_matrix, hamming, min_dist, min_dist_edge, cluster_sizes); Update_IC_Boot_Tree(ref_tree, boot_tree, root, root->v[2], root->b[2], i_matrix, c_matrix, hamming, min_dist, min_dist_edge, cluster_sizes); } else { root=boot_tree->n_root; Update_IC_Boot_Tree(ref_tree, boot_tree, root, root->v[0], root->b[0], i_matrix, c_matrix, hamming, min_dist, min_dist_edge, cluster_sizes); Update_IC_Boot_Tree(ref_tree, boot_tree, root, root->v[1], root->b[2], i_matrix, c_matrix, hamming, min_dist, min_dist_edge, cluster_sizes); } /* and then some checks to make sure everything went ok */ for(i=0; i<2*ref_tree->n_otu-3; i++) { assert(min_dist[ref_tree->a_edges[i]->num] >= 0); if(ref_tree->a_edges[i]->rght->tax || ref_tree->a_edges[i]->left->tax){ assert(min_dist[ref_tree->a_edges[i]->num] == 0); /* any terminal edge should have an exact match in any bootstrap tree */ } } } /* end update_all_i_c_post_order_boot_tree */ stephaneguindon-phyml-76a39c8/src/tbe.h000066400000000000000000000024111501136442400201120ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #ifndef TBE_H #define TBE_H #include "utilities.h" /* Functions to compute Transfer distances, used in transfert bootstrap */ void Update_All_IC_Ref_Tree(t_tree* ref_tree, t_tree* boot_tree, short unsigned** i_matrix, short unsigned** c_matrix, int* cluster_sizes); void Update_IC_Ref_Tree(t_tree *ref_tree, t_node * orig, t_node* target, t_edge *my_br, t_tree *boot_tree, short unsigned** i_matrix, short unsigned** c_matrix, int* cluster_sizes); void Update_IC_Boot_Tree(t_tree* ref_tree, t_tree* boot_tree, t_node* orig, t_node* target, t_edge *my_br, short unsigned** i_matrix, short unsigned** c_matrix, short unsigned** hamming, short unsigned* min_dist, short unsigned* min_dist_edge, int* cluster_sizes); void Update_All_IC_Boot_Tree(t_tree* ref_tree, t_tree* boot_tree, short unsigned** i_matrix, short unsigned** c_matrix, short unsigned** hamming, short unsigned* min_dist, short unsigned* min_dist_edge, int* cluster_sizes); #endif stephaneguindon-phyml-76a39c8/src/times.c000066400000000000000000002540561501136442400204720ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines for molecular clock trees and molecular dating */ #include "times.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Least_Square_Node_Times(t_edge *e_root, t_tree *tree) { /* Solve A.x = b, where x is the vector of times estimated under the least square criterion and b is the vector of edge lengths A is a n x n matrix, with n being the number of nodes in a rooted tree (i.e. 2*n_otu-1). */ phydbl *A, *b, *x; int n; int i,j; t_node *root; n = 2*tree->n_otu-1; A = (phydbl *)mCalloc(n*n,sizeof(phydbl)); b = (phydbl *)mCalloc(n, sizeof(phydbl)); x = (phydbl *)mCalloc(n, sizeof(phydbl)); if(!tree->n_root && e_root) Add_Root(e_root,tree); else if(!e_root) Add_Root(tree->a_edges[0],tree); root = tree->n_root; TIMES_Least_Square_Node_Times_Pre(root,root->v[1],A,b,n,tree); TIMES_Least_Square_Node_Times_Pre(root,root->v[2],A,b,n,tree); b[root->num] = tree->e_root->l->v/2.; A[root->num * n + root->num] = 1.0; A[root->num * n + root->v[2]->num] = -.5; A[root->num * n + root->v[1]->num] = -.5; if(!Matinv(A, n, n,YES)) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s').\n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } for(i=0;itimes->nd_t[tree->a_nodes[i]->num] = -x[i]; tree->times->nd_t[root->num] = -x[n-1]; tree->n_root->b[2]->l->v = tree->times->nd_t[root->v[2]->num] - tree->times->nd_t[root->num]; tree->n_root->b[1]->l->v = tree->times->nd_t[root->v[1]->num] - tree->times->nd_t[root->num]; Free(A); Free(b); Free(x); return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Least_Square_Node_Times_Pre(t_node *a, t_node *d, phydbl *A, phydbl *b, int n, t_tree *tree) { if(d->tax) { A[d->num * n + d->num] = 1.; /* Set the time stamp at tip nodes to 0.0 */ /* PhyML_Printf("\n. Tip t_node date set to 0"); */ b[d->num] = 0.0; return; } else { int i; for(i=0;i<3;++i) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) TIMES_Least_Square_Node_Times_Pre(d,d->v[i],A,b,n,tree); A[d->num * n + d->num] = 1.; b[d->num] = .0; for(i=0;i<3;++i) { A[d->num * n + d->v[i]->num] = -1./3.; if(d->v[i] != a) b[d->num] += d->b[i]->l->v; else b[d->num] -= d->b[i]->l->v; } b[d->num] /= 3.; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Adjust t_node times in order to have correct time stamp ranking with respect to the tree topology */ void TIMES_Adjust_Node_Times(t_tree *tree) { TIMES_Adjust_Node_Times_Pre(tree->n_root->v[2],tree->n_root->v[1],tree); TIMES_Adjust_Node_Times_Pre(tree->n_root->v[1],tree->n_root->v[2],tree); if(tree->times->nd_t[tree->n_root->num] > MIN(tree->times->nd_t[tree->n_root->v[2]->num], tree->times->nd_t[tree->n_root->v[1]->num])) { tree->times->nd_t[tree->n_root->num] = MIN(tree->times->nd_t[tree->n_root->v[2]->num], tree->times->nd_t[tree->n_root->v[1]->num]); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Adjust_Node_Times_Pre(t_node *a, t_node *d, t_tree *tree) { if(d->tax) return; else { int i; phydbl min_height; for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { TIMES_Adjust_Node_Times_Pre(d,d->v[i],tree); } min_height = 0.0; for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(tree->times->nd_t[d->v[i]->num] < min_height) { min_height = tree->times->nd_t[d->v[i]->num]; } } } if(tree->times->nd_t[d->num] > min_height) tree->times->nd_t[d->num] = min_height; if(tree->times->nd_t[d->num] < -100.) tree->times->nd_t[d->num] = -100.; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Multiply each time stamp at each internal t_node by 'tree->time_stamp_mult'. */ void TIMES_Mult_Time_Stamps(t_tree *tree) { int i; For(i,2*tree->n_otu-2) tree->times->nd_t[tree->a_nodes[i]->num] *= FABS(tree->mod->s_opt->tree_size_mult); tree->times->nd_t[tree->n_root->num] *= FABS(tree->mod->s_opt->tree_size_mult); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Print_Node_Times(t_node *a, t_node *d, t_tree *tree) { t_edge *b; int i; b = NULL; for(i=0;i<3;i++) if((d->v[i]) && (d->v[i] == a)) {b = d->b[i]; break;} PhyML_Printf("\n. (%3d %3d) a->t = %12f d->t = %12f (#=%12f) b->l->v = %12f [%12f;%12f]", a->num,d->num, tree->times->nd_t[a->num], tree->times->nd_t[d->num], tree->times->nd_t[a->num]-tree->times->nd_t[d->num], (b)?(b->l->v):(-1.0), tree->times->t_prior_min[d->num], tree->times->t_prior_max[d->num]); if(d->tax) return; else { int i; for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) TIMES_Print_Node_Times(d,d->v[i],tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_All_Node_Priors(t_tree *tree) { int i; phydbl min_prior; /* Set all t_prior_max values */ TIMES_Set_All_Node_Priors_Bottom_Up(tree->n_root,tree->n_root->v[2],tree); TIMES_Set_All_Node_Priors_Bottom_Up(tree->n_root,tree->n_root->v[1],tree); tree->times->t_prior_max[tree->n_root->num] = MIN(tree->times->t_prior_max[tree->n_root->num], MIN(tree->times->t_prior_max[tree->n_root->v[2]->num], tree->times->t_prior_max[tree->n_root->v[1]->num])); /* Set all t_prior_min values */ if(!tree->times->t_has_prior[tree->n_root->num]) { min_prior = 1.E+10; for(i=0;i<2*tree->n_otu-2;++i) { if(tree->times->t_has_prior[i]) { if(tree->times->t_prior_min[i] < min_prior) min_prior = tree->times->t_prior_min[i]; } } tree->times->t_prior_min[tree->n_root->num] = 2.0 * min_prior; /* tree->times->t_prior_min[tree->n_root->num] = 10. * min_prior; */ } if(tree->times->t_prior_min[tree->n_root->num] > 0.0) { PhyML_Fprintf(stderr,"\n. Failed to set the lower bound for the root node."); PhyML_Fprintf(stderr,"\n. Make sure at least one of the calibration interval"); PhyML_Fprintf(stderr,"\n. provides a lower bound."); Exit("\n"); } TIMES_Set_All_Node_Priors_Top_Down(tree->n_root,tree->n_root->v[2],tree); TIMES_Set_All_Node_Priors_Top_Down(tree->n_root,tree->n_root->v[1],tree); Get_Node_Ranks(tree); TIMES_Set_Floor(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_All_Node_Priors_Bottom_Up(t_node *a, t_node *d, t_tree *tree) { int i; phydbl t_sup; if(d->tax) return; else { t_node *v1, *v2; /* the two sons of d */ for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { TIMES_Set_All_Node_Priors_Bottom_Up(d,d->v[i],tree); } } v1 = v2 = NULL; for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(!v1) v1 = d->v[i]; else v2 = d->v[i]; } if(tree->times->t_has_prior[d->num] == YES) { t_sup = MIN(tree->times->t_prior_max[d->num], MIN(tree->times->t_prior_max[v1->num], tree->times->t_prior_max[v2->num])); tree->times->t_prior_max[d->num] = t_sup; if(tree->times->t_prior_max[d->num] < tree->times->t_prior_min[d->num]) { PhyML_Fprintf(stderr,"\n. prior_min=%f prior_max=%f",tree->times->t_prior_min[d->num],tree->times->t_prior_max[d->num]); PhyML_Fprintf(stderr,"\n. Inconsistency in the prior settings detected at node %d",d->num); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function %s)\n\n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit("\n"); } } else { tree->times->t_prior_max[d->num] = MIN(tree->times->t_prior_max[v1->num], tree->times->t_prior_max[v2->num]); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_All_Node_Priors_Top_Down(t_node *a, t_node *d, t_tree *tree) { if(d->tax) return; else { int i; if(tree->times->t_has_prior[d->num] == YES) { tree->times->t_prior_min[d->num] = MAX(tree->times->t_prior_min[d->num],tree->times->t_prior_min[a->num]); if(tree->times->t_prior_max[d->num] < tree->times->t_prior_min[d->num]) { PhyML_Fprintf(stderr,"\n. prior_min=%f prior_max=%f",tree->times->t_prior_min[d->num],tree->times->t_prior_max[d->num]); PhyML_Fprintf(stderr,"\n. Inconsistency in the prior settings detected at t_node %d",d->num); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function %s)\n\n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit("\n"); } } else { tree->times->t_prior_min[d->num] = tree->times->t_prior_min[a->num]; } for(i=0;i<3;i++) { if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { TIMES_Set_All_Node_Priors_Top_Down(d,d->v[i],tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_Floor(t_tree *tree) { TIMES_Set_Floor_Post(tree->n_root,tree->n_root->v[2],tree); TIMES_Set_Floor_Post(tree->n_root,tree->n_root->v[1],tree); tree->times->t_floor[tree->n_root->num] = MIN(tree->times->t_floor[tree->n_root->v[2]->num], tree->times->t_floor[tree->n_root->v[1]->num]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_Floor_Post(t_node *a, t_node *d, t_tree *tree) { if(d->tax) { tree->times->t_floor[d->num] = tree->times->nd_t[d->num]; d->rank_max = d->rank; return; } else { int i; t_node *v1,*v2; v1 = v2 = NULL; for(i=0;i<3;i++) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { TIMES_Set_Floor_Post(d,d->v[i],tree); if(!v1) v1 = d->v[i]; else v2 = d->v[i]; } } tree->times->t_floor[d->num] = MIN(tree->times->t_floor[v1->num], tree->times->t_floor[v2->num]); if(tree->times->t_floor[v1->num] < tree->times->t_floor[v2->num]) { d->rank_max = v1->rank_max; } else if(tree->times->t_floor[v2->num] < tree->times->t_floor[v1->num]) { d->rank_max = v2->rank_max; } else { d->rank_max = MAX(v1->rank_max,v2->rank_max); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Does it work for serial samples? */ phydbl TIMES_Log_Conditional_Uniform_Density(t_tree *tree) { phydbl min,max; phydbl dens; int i; min = tree->times->nd_t[tree->n_root->num]; dens = 0.0; For(i,2*tree->n_otu-1) { if((tree->a_nodes[i]->tax == NO) && (tree->a_nodes[i] != tree->n_root)) { max = tree->times->t_floor[i]; dens += log(Dorder_Unif(tree->times->nd_t[i], tree->a_nodes[i]->rank-1, tree->a_nodes[i]->rank_max-2, min,max)); } } return dens; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Returns the marginal density of tree height assuming the // Yule model of speciation. phydbl TIMES_Lk_Yule_Root_Marginal(t_tree *tree) { int n; int j; t_node *nd; phydbl *t,*ts; phydbl lbda; phydbl T; lbda = tree->times->birth_rate; t = tree->times->nd_t; ts = tree->times->time_slice_lims; T = ts[0] - t[tree->n_root->num]; n = 0; nd = NULL; For(j,2*tree->n_otu-2) { nd = tree->a_nodes[j]; if((t[nd->num] > ts[0] && t[nd->anc->num] < ts[0]) || // lineage that is crossing ts[0] (nd->tax == YES && Are_Equal(t[nd->num],ts[0],1.E-6) == YES)) // tip that is lying on ts[0] n++; } return LnGamma(n+1) + log(lbda) - 2.*lbda*T + (n-2.)*log(1. - exp(-lbda*T)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Returns the joint density of internal node heights assuming // the Yule model of speciation. phydbl TIMES_Lk_Yule_Joint(t_tree *tree) { int i,j; phydbl loglk; phydbl *t; phydbl dt; int n; // number of lineages at a given time point phydbl lbda; t_node *nd; phydbl *ts; int *tr; phydbl top_t; short int *interrupted; interrupted = (short int *)mCalloc(tree->n_otu,sizeof(short int)); t = tree->times->nd_t; ts = tree->times->time_slice_lims; tr = tree->times->t_rank; lbda = tree->times->birth_rate; TIMES_Update_Node_Ordering(tree); for(j=0;jn_otu;j++) interrupted[j] = NO; loglk = .0; n = 1; For(i,2*tree->n_otu-2) // t[tr[0]] is the time of the oldest node, t[tr[1]], the second oldest and so on... { for(j=0;jn_otu;j++) if((t[j] < t[tr[i]]) && (interrupted[j] == NO)) { interrupted[j] = YES; n--; // How many lineages have stopped above t[tr[i]]? } top_t = t[tr[i+1]]; dt = top_t - t[tr[i]]; /* printf("\n. %d node up=%d [%f] node do=%d [%f] dt=%f",i,tr[i],t[tr[i]],tr[i+1],t[tr[i+1]],dt); */ if(n<1) { PhyML_Fprintf(stderr,"\n. i=%d tr[i]=%f",i,t[tr[i]]); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } if(dt > 1.E-10) loglk += log((n+1)*lbda) - (n+1)*lbda*dt; n++; } /* printf("\n0 loglk = %f",loglk); */ for(i=0;itimes->n_time_slices-1;i++) { n = 0; dt = 0.; For(j,2*tree->n_otu-2) { nd = tree->a_nodes[j]; if(t[nd->num] > ts[i] && t[nd->anc->num] < ts[i]) // How many lineages are crossing this time slice limit? { n++; if(t[nd->num] < dt) dt = t[nd->num]; // take the oldest node younger than the time slice } } dt -= ts[i]; loglk += log(n*lbda) - n*lbda*dt; } /* printf("\n1 loglk = %f",loglk); */ Free(interrupted); return loglk; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Returns the conditional density of internal node heights // given the tree height under the Yule model. Uses the order // statistics 'simplification' as described in Yang and Rannala, 2005. phydbl TIMES_Lk_Yule_Order(t_tree *tree) { int j; phydbl *t,*tf; t_node *n; phydbl loglk; phydbl loglbda; phydbl lbda; phydbl *tp_min,*tp_max; phydbl lower_bound,upper_bound; /* phydbl root_height; */ tp_min = tree->times->t_prior_min; tp_max = tree->times->t_prior_max; tf = tree->times->t_floor; t = tree->times->nd_t; n = NULL; loglbda = log(tree->times->birth_rate); lbda = tree->times->birth_rate; lower_bound = -1.; upper_bound = -1.; /* root_height = FABS(tree->times->nd_t[tree->n_root->num]); */ /*! Adapted from Equation (6) in T. Stadler's Systematic Biology, 2012 paper with sampling fraction set to 1 and death rate set to 0. Dropped the 1/(n-1) scaling factor. */ /* loglk = 0.0; */ /* For(j,2*tree->n_otu-2) */ /* { */ /* n = tree->a_nodes[j]; */ /* lower_bound = MAX(FABS(tf[j]),FABS(tp_max[j])); */ /* upper_bound = MIN(FABS(t[tree->n_root->num]),FABS(tp_min[j])); */ /* if(n->tax == NO) */ /* { */ /* loglk += (loglbda - lbda * FABS(t[j])); */ /* /\* loglk -= log(exp(-lbda*lower_bound) - exp(-lbda*upper_bound)); // incorporate calibration boundaries here. *\/ */ /* } */ /* } */ /*! Adapted from Equation (7) in T. Stadler's Systematic Biology, 2012 paper with sampling fraction set to 1 and death rate set to 0. */ // Check that each node is within its calibration-derived interval For(j,2*tree->n_otu-1) if(t[j] < tp_min[j] || t[j] > tp_max[j]) return(-INFINITY); loglk = 0.0; For(j,2*tree->n_otu-2) { n = tree->a_nodes[j]; lower_bound = MAX(FABS(tf[j]),FABS(tp_max[j])); upper_bound = FABS(tp_min[j]); if(n->tax == NO) { loglk += (loglbda - lbda * FABS(t[j])); loglk -= log(exp(-lbda*lower_bound) - exp(-lbda*upper_bound)); // incorporate calibration boundaries here. } if(isinf(loglk) || isnan(loglk)) { /* PhyML_Printf("\n. Lower bound: %f",lower_bound); */ /* PhyML_Printf("\n. Upper bound: %f",upper_bound); */ /* PhyML_Printf("\n. tf: %f tp_max: %f tp_min: %f ",tf[j],tp_max[j],tp_min[j]); */ /* PhyML_Printf("\n. exp1: %f",exp(-lbda*lower_bound)); */ /* PhyML_Printf("\n. exp2: %f",exp(-lbda*upper_bound)); */ /* PhyML_Printf("\n. diff: %f",exp(-lbda*lower_bound) - exp(-lbda*upper_bound)); */ /* Exit("\n"); */ return(-INFINITY); } } lower_bound = MAX(FABS(tf[tree->n_root->num]),FABS(tp_max[tree->n_root->num])); upper_bound = FABS(tp_min[tree->n_root->num]); loglk += log(2) + loglbda - 2.*lbda * FABS(t[tree->n_root->num]); loglk -= log(exp(-2.*lbda*lower_bound) - exp(-2.*lbda*upper_bound)); if(isinf(loglk) || isnan(loglk)) { /* PhyML_Printf("\n. * Lower bound: %f",lower_bound); */ /* PhyML_Printf("\n. * Upper bound: %f",upper_bound); */ /* PhyML_Printf("\n. * tf: %f tp_max: %f tp_min: %f",tf[tree->n_root->num],tp_max[tree->n_root->num],tp_min[tree->n_root->num]); */ /* PhyML_Printf("\n. * exp1: %f",exp(-2.*lbda*lower_bound)); */ /* PhyML_Printf("\n. * exp2: %f",exp(-2.*lbda*upper_bound)); */ /* PhyML_Printf("\n. * diff: %f",exp(-2.*lbda*lower_bound) - exp(-2.*lbda*upper_bound)); */ /* Exit("\n"); */ return(-INFINITY); } return(loglk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Lk_Times_Trav(t_node *a, t_node *d, phydbl lim_inf, phydbl lim_sup, phydbl *logdens, t_tree *tree) { int i; if(!d->tax) { /* if(tree->times->nd_t[d->num] > lim_sup) */ /* { */ /* lim_inf = lim_sup; */ /* lim_sup = 0.0; */ /* For(i,2*tree->n_otu-2) */ /* if((tree->times->t_floor[i] < lim_sup) && (tree->times->t_floor[i] > tree->times->nd_t[d->num])) */ /* lim_sup = tree->times->t_floor[i]; */ /* } */ /* if(tree->times->nd_t[d->num] < lim_inf || tree->times->nd_t[d->num] > lim_sup) */ /* { */ /* PhyML_Printf("\n. nd_t = %f lim_inf = %f lim_sup = %f",tree->times->nd_t[d->num],lim_inf,lim_sup); */ /* PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); */ /* Exit("\n"); */ /* } */ lim_inf = tree->times->nd_t[tree->n_root->num]; lim_sup = tree->times->t_floor[d->num]; *logdens = *logdens + log(lim_sup - lim_inf); } if(d->tax == YES) return; else { for(i=0;i<3;i++) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { TIMES_Lk_Times_Trav(d,d->v[i],lim_inf,lim_sup,logdens,tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Log_Number_Of_Ranked_Labelled_Histories(t_node *root, int per_slice, t_tree *tree) { int i; phydbl logn; t_node *v1,*v2; int n1,n2; TIMES_Update_Curr_Slice(tree); logn = .0; v1 = v2 = NULL; if(root == tree->n_root) { TIMES_Log_Number_Of_Ranked_Labelled_Histories_Post(root,root->v[2],per_slice,&logn,tree); TIMES_Log_Number_Of_Ranked_Labelled_Histories_Post(root,root->v[1],per_slice,&logn,tree); v1 = root->v[2]; v2 = root->v[1]; } else { for(i=0;i<3;i++) { if(root->v[i] != root->anc && root->b[i] != tree->e_root) { TIMES_Log_Number_Of_Ranked_Labelled_Histories_Post(root,root->v[i],per_slice,&logn,tree); if(!v1) v1 = root->v[i]; else v2 = root->v[i]; } } } if(per_slice == NO) { n1 = tree->rates->n_tips_below[v1->num]; n2 = tree->rates->n_tips_below[v2->num]; } else { if(tree->times->curr_slice[v1->num] == tree->times->curr_slice[root->num]) n1 = tree->rates->n_tips_below[v1->num]; else n1 = 1; if(tree->times->curr_slice[v2->num] == tree->times->curr_slice[root->num]) n2 = tree->rates->n_tips_below[v2->num]; else n2 = 1; } tree->rates->n_tips_below[root->num] = n1+n2; logn += Factln(n1+n2-2) - Factln(n1-1) - Factln(n2-1); return(logn); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Log_Number_Of_Ranked_Labelled_Histories_Post(t_node *a, t_node *d, int per_slice, phydbl *logn, t_tree *tree) { if(d->tax == YES) { tree->rates->n_tips_below[d->num] = 1; return; } else { int i,n1,n2; t_node *v1, *v2; for(i=0;i<3;i++) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { TIMES_Log_Number_Of_Ranked_Labelled_Histories_Post(d,d->v[i],per_slice,logn,tree); } } v1 = v2 = NULL; for(i=0;i<3;i++) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(v1 == NULL) {v1 = d->v[i];} else {v2 = d->v[i];} } } if(per_slice == NO) { n1 = tree->rates->n_tips_below[v1->num]; n2 = tree->rates->n_tips_below[v2->num]; } else { if(tree->times->curr_slice[v1->num] == tree->times->curr_slice[d->num]) n1 = tree->rates->n_tips_below[v1->num]; else n1 = 1; if(tree->times->curr_slice[v2->num] == tree->times->curr_slice[d->num]) n2 = tree->rates->n_tips_below[v2->num]; else n2 = 1; } tree->rates->n_tips_below[d->num] = n1+n2; (*logn) += Factln(n1+n2-2) - Factln(n1-1) - Factln(n2-1); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Update_Curr_Slice(t_tree *tree) { int i,j; for(i=0;i<2*tree->n_otu-1;++i) { for(j=0;jtimes->n_time_slices;j++) { if(!(tree->times->nd_t[i] > tree->times->time_slice_lims[j])) break; } tree->times->curr_slice[i] = j; /* PhyML_Printf("\n. Node %3d [%12f] is in slice %3d.",i,tree->times->nd_t[i],j); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Wrap_Lk_Coalescent(t_edge *b, t_tree *tree, supert_tree *stree) { return TIMES_Lk_Coalescent(tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl TIMES_Lk_Coalescent(t_tree *tree) { t_node *n; int n_lineages; phydbl lnP,Ne,dt,exp_g; phydbl T; Ne = tree->times->scaled_pop_size; exp_g = tree->times->neff_growth; if(Ne > tree->times->scaled_pop_size_max || Ne < tree->times->scaled_pop_size_min) { tree->times->c_lnL = UNLIKELY; return(tree->times->c_lnL); } Get_Node_Ranks_From_Times(tree); n = tree->n_root; while(n->rk_next) n = n->rk_next; T = tree->times->nd_t[n->num]; lnP = 0.0; n_lineages = 1; n = tree->n_root; while(n->rk_next) { dt = fabs(tree->times->nd_t[n->num] - tree->times->nd_t[n->rk_next->num]); assert(!(tree->times->nd_t[n->num] > tree->times->nd_t[n->rk_next->num])); if(n->tax == YES) n_lineages--; else n_lineages++; if(tree->times->coalescent_model_id == EXPCOALESCENT) { dt = 1./exp_g * (exp(exp_g * fabs(tree->times->nd_t[n->num]-T)) - exp(exp_g * fabs(tree->times->nd_t[n->rk_next->num]-T))); } else if(tree->times->coalescent_model_id == POWLAW) { dt = 1./(1.+exp_g) * (pow(fabs(tree->times->nd_t[n->num]-T)+1,exp_g+1.) - pow(fabs(tree->times->nd_t[n->rk_next->num]-T)+1,exp_g+1.)); } lnP += -n_lineages * (n_lineages-1.) / (2.*Ne) * dt; if(tree->times->coalescent_model_id == EXPCOALESCENT && n->tax == NO) lnP += exp_g * fabs(tree->times->nd_t[n->num]-T); else if(tree->times->coalescent_model_id == POWLAW && n->tax == NO) lnP += exp_g * log(fabs(tree->times->nd_t[n->num]-T) + 1.); if(n->tax == NO) lnP -= log(Ne); /* // Multifurcations not allowed under standard Kingman coalescent */ /* if(fabs(tree->times->nd_t[n->num] - tree->times->nd_t[n->rk_next->num]) < SMALL && */ /* n->tax == NO && n->rk_next->tax == NO) /\* This condition does not really test for multifurcation... *\/ */ /* { */ /* /\* tree->times->c_lnL = UNLIKELY; *\/ */ /* /\* return(UNLIKELY); *\/ */ /* } */ if((isnan(lnP) || isinf(lnP)) == TRUE) { tree->times->c_lnL = UNLIKELY; return(UNLIKELY); } n = n->rk_next; } tree->times->c_lnL = lnP; return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Lk_Coalescent_Range(t_dsk *young, t_dsk *old, t_tree *tree) { int n_lineages; phydbl disk_lnP,lnP,Ne,dt,exp_g,T; t_dsk *disk; Ne = tree->times->scaled_pop_size; exp_g = tree->times->neff_growth; T = tree->young_disk->time; if(Ne > tree->times->scaled_pop_size_max || Ne < tree->times->scaled_pop_size_min) return(UNLIKELY); lnP = 0.0; disk_lnP = 0.0; disk = young->prev; do { n_lineages = disk->next->n_ldsk_a; n_lineages -= (disk->next->ldsk ? (disk->next->ldsk->n_next -1) : 0); dt = 0.0; if(tree->times->coalescent_model_id == STRICTCOALESCENT) dt = fabs(disk->time - disk->next->time); else if(tree->times->coalescent_model_id == EXPCOALESCENT) dt = 1./exp_g * (exp(exp_g * fabs(disk->time-T)) - exp(exp_g * fabs(disk->next->time-T))); disk_lnP = -n_lineages * (n_lineages-1.) / (2.*Ne) * dt; if(tree->times->coalescent_model_id == EXPCOALESCENT) disk_lnP += exp_g * fabs(disk->time-T); lnP += disk_lnP; /* // Multifurcations not allowed under standard Kingman coalescent */ /* if(fabs(disk->time - disk->next->time) < SMALL && */ /* disk->ldsk && disk->ldsk->n_next > 1 && */ /* disk->next->ldsk && disk->next->ldsk->n_next > 1) */ /* { */ /* tree->times->c_lnL = UNLIKELY; */ /* return(UNLIKELY); */ /* } */ assert((isnan(lnP) || isinf(lnP)) == FALSE); disk = disk->prev; } while(disk != NULL && disk != old->prev); lnP -= (tree->n_otu-1) * log(Ne); return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Prior_Neff(t_tree *tree) { phydbl lnP; int err; lnP = 0.0; if(tree->times->neff_prior_distrib == EXPONENTIAL_PRIOR) { lnP += Log_Dexp(tree->times->scaled_pop_size, 1./tree->times->neff_prior_mean); } else if(tree->times->neff_prior_distrib == NORMAL_PRIOR) { lnP += Log_Dnorm(tree->times->scaled_pop_size, tree->times->neff_prior_mean, sqrt(tree->times->neff_prior_var), &err); } else if(tree->times->neff_prior_distrib == FLAT_PRIOR) { lnP += 0.0; } else assert(false); return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Prior(t_tree *tree) { tree->times->c_lnP = UNLIKELY; switch(tree->times->model_id) { case COALESCENT : { tree->times->c_lnP = TIMES_Prior_Neff(tree); break; } case SLFV_GAUSSIAN : case SLFV_UNIFORM : { tree->times->c_lnP = TIMES_Prior_SLFV(tree); break; } case BIRTHDEATH : { tree->times->c_lnP = UNLIKELY; break; } default : break; } return(tree->times->c_lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Simulate_Coalescent(t_tree *tree) { t_node *n; phydbl t,dt,Ne,*times,u,coal_rate,prob_coal; int n_lineages,*permut,available_idx,i; t_ll *lineages; t_node *v1, *v2, *a; Ne = tree->times->scaled_pop_size; times = tree->times->nd_t; lineages = NULL; Get_Node_Ranks_From_Tip_Times(tree); // Start from the most recent tip (or set of tips) n = tree->a_nodes[tree->n_otu-1]; while(n->rk_next) n = n->rk_next; n_lineages = 0; available_idx = tree->n_otu; dt = 0.0; t = tree->times->nd_t[n->num]; do { if(n->tax == YES) { Push_Bottom_Linked_List(n,&lineages,NO); n_lineages++; } coal_rate = n_lineages * (n_lineages - 1.) / (2.*Ne); // Proba next coalescent event is in [T[n->num],T[n->rk_prev->num] prob_coal = 1. - exp(-coal_rate * fabs(times[n->num] - (n->rk_prev ? times[n->rk_prev->num] : -INFINITY))); u = Uni(); if(!(u > prob_coal)) { dt = Rexp_Trunc(coal_rate, 0.0, times[n->num] - (n->rk_prev ? times[n->rk_prev->num] : -INFINITY)); t = t - dt; permut = Permutate(n_lineages); a = tree->a_nodes[available_idx]; v1 = Linked_List_Elem(permut[0],lineages); v2 = Linked_List_Elem(permut[1],lineages); available_idx++; a->v[0] = NULL; a->v[1] = v1; a->v[2] = v2; v1->v[0] = a; v2->v[0] = a; times[a->num] = t; Remove_From_Linked_List(NULL,v1,&lineages); Remove_From_Linked_List(NULL,v2,&lineages); Push_Bottom_Linked_List(a,&lineages,NO); a->rk_prev = n->rk_prev; n->rk_prev = a; a->rk_next = n; n_lineages--; } n = n->rk_prev; t = tree->times->nd_t[n->num]; } while(!(n_lineages == 1 && n->rk_prev == NULL)); for(i=0;i<3;++i) if(tree->n_root->v[1]->v[i] == tree->n_root) { tree->n_root->v[1]->v[i] = tree->n_root->v[2]; break; } for(i=0;i<3;++i) if(tree->n_root->v[2]->v[i] == tree->n_root) { tree->n_root->v[2]->v[i] = tree->n_root->v[1]; break; } Connect_Edges_To_Nodes_Serial(tree); tree->e_root = NULL; for(i=0;i<2*tree->n_otu-3;++i) { if((tree->a_edges[i]->left == tree->n_root->v[1] && tree->a_edges[i]->rght == tree->n_root->v[2]) || (tree->a_edges[i]->left == tree->n_root->v[2] && tree->a_edges[i]->rght == tree->n_root->v[1])) { tree->e_root = tree->a_edges[i]; break; } } assert(!(tree->e_root == NULL)); tree->n_root->b[1] = tree->a_edges[2*tree->n_otu-3]; tree->n_root->b[2] = tree->a_edges[2*tree->n_otu-2]; tree->n_root->b[1]->left = tree->n_root; tree->n_root->b[1]->rght = tree->n_root->v[1]; tree->n_root->b[2]->left = tree->n_root; tree->n_root->b[2]->rght = tree->n_root->v[2]; Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); MIXT_Propagate_Tree_Update(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Lk_Uniform_Core(t_tree *tree) { phydbl logn; logn = TIMES_Log_Number_Of_Ranked_Labelled_Histories(tree->n_root,YES,tree); tree->times->c_lnL = 0.0; TIMES_Lk_Uniform_Post(tree->n_root,tree->n_root->v[2],tree); TIMES_Lk_Uniform_Post(tree->n_root,tree->n_root->v[1],tree); /* printf("\n. ^ %f %f %f", */ /* (phydbl)(tree->rates->n_tips_below[tree->n_root->num]-2.), */ /* log(tree->times->time_slice_lims[tree->times->curr_slice[tree->n_root->num]] - */ /* tree->times->nd_t[tree->n_root->num]), */ /* (phydbl)(tree->rates->n_tips_below[tree->n_root->num]-2.) * */ /* log(tree->times->time_slice_lims[tree->times->curr_slice[tree->n_root->num]] - */ /* tree->times->nd_t[tree->n_root->num])); */ tree->times->c_lnL += Factln(tree->rates->n_tips_below[tree->n_root->num]-2.) - (phydbl)(tree->rates->n_tips_below[tree->n_root->num]-2.) * log(tree->times->time_slice_lims[tree->times->curr_slice[tree->n_root->num]] - tree->times->nd_t[tree->n_root->num]); tree->times->c_lnL -= logn; return(tree->times->c_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Get_Number_Of_Time_Slices(t_tree *tree) { int i; tree->times->n_time_slices=0; TIMES_Get_Number_Of_Time_Slices_Post(tree->n_root,tree->n_root->v[2],tree); TIMES_Get_Number_Of_Time_Slices_Post(tree->n_root,tree->n_root->v[1],tree); Qksort(tree->times->time_slice_lims,NULL,0,tree->times->n_time_slices-1); if(tree->times->n_time_slices > 1) { PhyML_Printf("\n"); PhyML_Printf("\n. Sequences were collected at %d different time points.",tree->times->n_time_slices); for(i=0;itimes->n_time_slices;i++) printf("\n+ [%3d] time point @ %12f ",i+1,tree->times->time_slice_lims[i]); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Get_Number_Of_Time_Slices_Post(t_node *a, t_node *d, t_tree *tree) { int i; if(d->tax == YES) { for(i=0;itimes->n_time_slices;i++) if(Are_Equal(tree->times->t_floor[d->num],tree->times->time_slice_lims[i],1.E-6)) break; if(i == tree->times->n_time_slices) { tree->times->time_slice_lims[i] = tree->times->t_floor[d->num]; tree->times->n_time_slices++; } return; } else { for(i=0;i<3;i++) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) TIMES_Get_Number_Of_Time_Slices_Post(d,d->v[i],tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Get_N_Slice_Spans(t_tree *tree) { int i,j; For(i,2*tree->n_otu-2) { if(tree->a_nodes[i]->tax == NO) { for(j=0;jtimes->n_time_slices;j++) { if(Are_Equal(tree->times->t_floor[i],tree->times->time_slice_lims[j],1.E-6)) { tree->times->n_time_slice_spans[i] = j+1; /* PhyML_Printf("\n. Node %3d spans %3d slices [%12f].", */ /* i+1, */ /* tree->rates->n_slice_spans[i], */ /* tree->times->t_floor[i]); */ break; } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Lk_Uniform_Post(t_node *a, t_node *d, t_tree *tree) { if(d->tax == YES) return; else { int i; for(i=0;i<3;i++) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { TIMES_Lk_Uniform_Post(d,d->v[i],tree); } } if(tree->times->curr_slice[a->num] != tree->times->curr_slice[d->num]) { tree->times->c_lnL += Factln(tree->rates->n_tips_below[d->num]-1.) - (phydbl)(tree->rates->n_tips_below[d->num]-1.) * log(tree->times->time_slice_lims[tree->times->curr_slice[d->num]] - tree->times->nd_t[d->num]); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Set the root position so that most of the taxa in the outgroup correspond to the most ancient time point. */ void TIMES_Set_Root_Given_Tip_Dates(t_tree *tree) { int i,j; t_node *left,*rght; int n_left_in, n_left_out; int n_rght_in, n_rght_out; t_edge *b,*best; phydbl eps,score,max_score; Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); left = rght = NULL; b = best = NULL; n_left_in = n_left_out = -1; n_rght_in = n_rght_out = -1; eps = 1.E-6; score = max_score = -1.; For(i,2*tree->n_otu-3) { left = tree->a_edges[i]->left; rght = tree->a_edges[i]->rght; b = tree->a_edges[i]; n_left_in = 0; For(j,left->bip_size[b->l_r]) if(FABS(tree->times->nd_t[left->bip_node[b->l_r][j]->num] - tree->times->time_slice_lims[0]) < eps) n_left_in++; n_left_out = left->bip_size[b->l_r]-n_left_in; n_rght_in = 0; For(j,rght->bip_size[b->r_l]) if(FABS(tree->times->nd_t[rght->bip_node[b->r_l][j]->num] - tree->times->time_slice_lims[0]) < eps) n_rght_in++; n_rght_out = rght->bip_size[b->r_l]-n_rght_in; /* score = POW((phydbl)(n_left_in)/(phydbl)(n_left_in+n_left_out)- */ /* (phydbl)(n_rght_in)/(phydbl)(n_rght_in+n_rght_out),2); */ /* score = (phydbl)(n_left_in * n_rght_out + eps)/(n_left_out * n_rght_in + eps); */ /* score = (phydbl)(n_left_in * n_rght_out + eps); */ score = FABS((phydbl)((n_left_in+1.) * (n_rght_out+1.)) - (phydbl)((n_left_out+1.) * (n_rght_in+1.))); if(score > max_score) { max_score = score; best = b; } } Add_Root(best,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Update the ranking of node heights. Use bubble sort algorithm */ /* t_rank[i] is the node number that has rank i */ void TIMES_Update_Node_Ordering(t_tree *tree) { int buff; int i; phydbl *t; int swap = NO; for(i=0;i<2*tree->n_otu-1;++i) tree->times->t_rank[i] = i; t = tree->times->nd_t; do { swap = NO; for(i=0;i<2*tree->n_otu-2;++i) { if(t[tree->times->t_rank[i]] > t[tree->times->t_rank[i+1]]) // Sort in ascending order { swap = YES; buff = tree->times->t_rank[i]; tree->times->t_rank[i] = tree->times->t_rank[i+1]; tree->times->t_rank[i+1] = buff; } } } while(swap == YES); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_Calibration(t_tree *tree) { t_cal *cal; int i; For(i,2*tree->n_otu-1) { tree->times->t_has_prior[i] = NO; tree->times->t_prior_min[i] = BIG; tree->times->t_prior_max[i] = BIG; } cal = tree->times->a_cal[0]; while(cal) { /* if(cal->is_active == YES) */ /* { */ /* tree->times->t_has_prior[cal->node_num] = YES; */ /* tree->times->t_prior_min[cal->node_num] = cal->lower; */ /* tree->times->t_prior_max[cal->node_num] = cal->upper; */ /* } */ cal = cal->next; } TIMES_Set_All_Node_Priors(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Record_Times(t_tree *mixt_tree) { int i; t_tree *tree; tree = mixt_tree; do { if(tree->times->nd_t_recorded == YES) { PhyML_Fprintf(stderr,"\n. Overwriting recorded times is forbidden.\n"); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } For(i,2*tree->n_otu-1) tree->times->buff_t[i] = tree->times->nd_t[i]; tree = tree->next; } while(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Reset_Times(t_tree *mixt_tree) { int i; t_tree *tree; tree = mixt_tree; do { tree->times->nd_t_recorded = NO; for(i=0;i<2*tree->n_otu-1;++i) tree->times->nd_t[i] = tree->times->buff_t[i]; tree = tree->next; } while(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Record_Prior_Times(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-1;++i) { tree->times->t_prior_min_ori[i] = tree->times->t_prior_min[i]; tree->times->t_prior_max_ori[i] = tree->times->t_prior_max[i]; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Reset_Prior_Times(t_tree *tree) { int i; For(i,2*tree->n_otu-1) { tree->times->t_prior_min[i] = tree->times->t_prior_min_ori[i]; tree->times->t_prior_max[i] = tree->times->t_prior_max_ori[i]; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Returns the conditional density of internal node heights // given the tree height under the Yule model. Uses the order // statistics 'simplification' as described in Yang and Rannala, 2005. phydbl TIMES_Lk_Yule_Order_Root_Cond(t_tree *tree) { int j; phydbl *t,*tf; t_node *n; phydbl loglk; phydbl loglbda; phydbl lbda; phydbl *tp_min,*tp_max; phydbl lower_bound,upper_bound; phydbl root_height; tp_min = tree->times->t_prior_min; tp_max = tree->times->t_prior_max; tf = tree->times->t_floor; t = tree->times->nd_t; n = NULL; loglbda = log(tree->times->birth_rate); lbda = tree->times->birth_rate; lower_bound = -1.; upper_bound = -1.; root_height = FABS(tree->times->nd_t[tree->n_root->num]); /*! Adapted from Equation (6) in T. Stadler's Systematic Biology, 2012 paper with sampling fraction set to 1 and death rate set to 0. Dropped the 1/(n-1) scaling factor. */ /* loglk = 0.0; */ /* For(j,2*tree->n_otu-2) */ /* { */ /* n = tree->a_nodes[j]; */ /* lower_bound = MAX(FABS(tf[j]),FABS(tp_max[j])); */ /* upper_bound = MIN(FABS(t[tree->n_root->num]),FABS(tp_min[j])); */ /* if(n->tax == NO) */ /* { */ /* loglk += (loglbda - lbda * FABS(t[j])); */ /* /\* loglk -= log(exp(-lbda*lower_bound) - exp(-lbda*upper_bound)); // incorporate calibration boundaries here. *\/ */ /* } */ /* } */ /*! Adapted from Equation (7) in T. Stadler's Systematic Biology, 2012 paper with sampling fraction set to 1 and death rate set to 0. */ // Check that each node is within its calibration-derived interval For(j,2*tree->n_otu-1) if(t[j] < tp_min[j] || t[j] > tp_max[j]) return(-INFINITY); loglk = 0.0; For(j,2*tree->n_otu-2) { n = tree->a_nodes[j]; lower_bound = MAX(FABS(tf[j]),FABS(tp_max[j])); upper_bound = MIN(FABS(tp_min[j]),root_height); if(n->tax == NO) { loglk += (loglbda - lbda * FABS(t[j])); loglk -= log(exp(-lbda*lower_bound) - exp(-lbda*upper_bound)); // incorporate calibration boundaries here. } if(isinf(loglk) || isnan(loglk)) { PhyML_Fprintf(stderr,"\n. Lower bound: %f",lower_bound); PhyML_Fprintf(stderr,"\n. Upper bound: %f",upper_bound); PhyML_Fprintf(stderr,"\n. tf: %f tp_max: %f tp_min: %f root: %f",tf[j],tp_max[j],tp_min[j],root_height); Exit("\n"); } } /* lower_bound = MAX(FABS(tf[tree->n_root->num]),FABS(tp_max[tree->n_root->num])); */ /* upper_bound = FABS(tp_min[tree->n_root->num]); */ /* loglk += log(2) + loglbda - 2.*lbda * FABS(t[tree->n_root->num]); */ /* loglk -= log(exp(-2.*lbda*lower_bound) - exp(-2.*lbda*upper_bound)); */ return(loglk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Log of prob density of internal node ages conditional on tree height, under // the birth death process with incomplete sampling. phydbl TIMES_Lk_Birth_Death(int verbose, t_tree *tree) { int i,n; phydbl lnL; phydbl t,b,d,bmd,logbmd,expmbmd,logb; phydbl bmin,bmax; phydbl dmin,dmax; phydbl lognut1,logp_1t,troot,pt,nut1; lnL = 0.0; b = tree->times->birth_rate; d = tree->times->death_rate; bmin = tree->times->birth_rate_min; bmax = tree->times->birth_rate_max; dmin = tree->times->death_rate_min; dmax = tree->times->death_rate_min; bmd = b-d; logbmd = -1.; expmbmd = -1.; logb = -1.; t = 0.0; n = tree->n_otu; troot = fabs(tree->times->nd_t[tree->n_root->num]); logb = log(b); if(b < d) { tree->times->c_lnL = UNLIKELY; if(verbose) PhyML_Printf("\n. b < d"); return UNLIKELY; } // Verify that calibration constraints are satisfied for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO) { if(tree->times->nd_t[i] < tree->times->t_prior_min[i] || tree->times->nd_t[i] > tree->times->t_prior_max[i]) { tree->times->c_lnL = UNLIKELY; if(verbose) { PhyML_Printf("\n. Time outside calibration range : %G [%G,%G]",tree->times->nd_t[i],tree->times->t_prior_min[i],tree->times->t_prior_max[i]); PhyML_Printf("\n. Clade incriminated: "); if(tree->a_nodes[i] == tree->n_root) { List_Taxa_In_Clade(tree->n_root,tree->n_root->v[1],tree); List_Taxa_In_Clade(tree->n_root,tree->n_root->v[2],tree); } else { assert(tree->a_nodes[i]->anc); List_Taxa_In_Clade(tree->a_nodes[i]->anc,tree->a_nodes[i],tree); } PhyML_Printf("\n"); } return UNLIKELY; } } if(b > bmin && d > dmin && Are_Equal(bmd,0.0,bmin/10.) == NO) { logbmd = log(bmd); expmbmd = exp(d-b); pt = bmd/(b-d*pow(expmbmd,troot)); nut1 = 1. - pt*pow(expmbmd,troot); lognut1 = log(nut1); /* printf("\n. lognut1: %G pt: %G b: %G d: %G exp: %G",nut1,pt,b,d,expmbmd); fflush(NULL); */ for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO && tree->a_nodes[i] != tree->n_root) { t = fabs(tree->times->nd_t[i]); /* // Equation 3.19 in Tanja Stadler's PhD thesis */ /* lnL += 2*logbmd - bmd*t - 2.*log(b-d*pow(expmbmd,t)); */ // Equation 6 in Yang and Rannala, 1997 with rho=1 logp_1t = 2.*logbmd - 2.*log(b-d*exp((d-b)*t)) + (d-b)*t; lnL += logb + logp_1t - lognut1; if(!(lnL > UNLIKELY)) { PhyML_Printf("\n. logb: %G pt: %G nut1: %G lognut1: %G t: %G logp_1t: %G\n",logb,pt,nut1,lognut1,t,logp_1t); tree->times->c_lnL = UNLIKELY; return UNLIKELY; } } lnL += LnGamma(n-1); /* t = FABS(tree->times->nd_t[tree->n_root->num]); */ /* lnL += -bmd*t - log(b-d*pow(expmbmd,t)); */ /* lnL += log(bmd) + (tree->n_otu-1)*log(b) + LnGamma(tree->n_otu+1); */ // Divide joint density p(x(1),...,x(n-1)) by p(x(1)) in order to get // the conditional density p(x(2),...,x(n-1)|x(1)). The log of the marginal p(x(1)) // (Theorem 3.4.11 in Tanja's PhD thesis) is given below and subtracted to lnL. /* k = 1; */ /* s = FABS(tree->times->nd_t[tree->n_root->num]); */ /* phydbl p_x1 = (k+1)*Choose(n,k+1)*pow(b,n-k)*pow(bmd,k+2)*exp(-bmd*(k+1)*s)*pow(1.-exp(-bmd*s),n-k-1)/pow(b-d*exp(-bmd*s),n+1); */ /* lnL -= log(p_x1); */ } else if(b > bmin && d < dmin) // Yule process { lognut1 = log(1.-exp(-b*troot)); for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO && tree->a_nodes[i] != tree->n_root) { t = fabs(tree->times->nd_t[i]); /* // Equation 3.19 in Tanja Stadler's PhD thesis (Yule case) */ /* lnL -= b*t; */ // Equation 6 in Yang and Rannala, 1997 with rho=1 logp_1t = - b*t; lnL += logb + logp_1t - lognut1; if(!(lnL > UNLIKELY)) { PhyML_Printf("\n. lognut1: %G t: %G logp_1t: %G",lognut1,t,logp_1t); tree->times->c_lnL = UNLIKELY; return UNLIKELY; } } lnL += LnGamma(n-1); /* t = fabs(tree->times->nd_t[tree->n_root->num]); */ /* lnL -= b*t; */ /* lnL += (tree->n_otu-1)*log(b) + LnGamma(tree->n_otu+1); */ // Divide joint density p(x(1),...,x(n-1)) by p(x(1)) in order to get // the conditional density p(x(2),...,x(n-1)|x(1)). The log of the marginal p(x(1)) // (Theorem 3.4.11, remark 3.4.12 in Tanja's PhD thesis) is given below and subtracted to lnL. /* k = 1; */ /* s = FABS(tree->times->nd_t[tree->n_root->num]); */ /* phydbl p_x1 = (k+1)*Choose(n,k+1)*b*pow(exp(b*s)-1.,n-k-1)/exp(b*s*n); */ /* lnL -= log(p_x1); */ } else if(b < bmin && d > dmin) { PhyML_Printf("\n. b: %G bmin: %G d: %G dmin: %G",b,bmin,d,dmin); tree->times->c_lnL = UNLIKELY; return UNLIKELY; } else if(Are_Equal(bmd,0.0,bmin/10.) == YES) // Critical birth-death process { logb = log(b); for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO && tree->a_nodes[i] != tree->n_root) { t = fabs(tree->times->nd_t[i]); /* // Equation 3.19 in Tanja Stadler's PhD thesis (Critical case) */ /* lnL += logb - 2.*log(1.+b*t); */ // Equation 7 in Yang and Rannala, 1997 with rho=1 lnL += log((1.+d)/pow(1.+d*t,2)); if(!(lnL > UNLIKELY)) { PhyML_Printf("\n. logb: %G t: %G",logb,t); tree->times->c_lnL = UNLIKELY; return UNLIKELY; } } lnL += LnGamma(n-1); /* t = fabs(tree->times->nd_t[tree->n_root->num]); */ /* lnL -= log(b*t); */ /* lnL += LnGamma(tree->n_otu+1); */ // Divide joint density p(x(1),...,x(n-1)) by p(x(1)) in order to get // the conditional density p(x(2),...,x(n-1)|x(1)). The log of the marginal p(x(1)) // (Theorem 3.4.11, remark 3.4.12 in Tanja's PhD thesis) is given below and subtracted to lnL. /* k = 1; */ /* s = fabs(tree->times->nd_t[tree->n_root->num]); */ /* phydbl p_x1 = (k+1)*Choose(n,k+1)*pow(b,n-k)*pow(s,n-k-1)/pow(1.+b*s,n+1); */ /* lnL -= log(p_x1); */ } else if(b < bmin && d < dmin) // Birth and death rates are below their limits { PhyML_Fprintf(stderr,"\n. b: %G bmin: %G d: %G dmin: %G",b,bmin,d,dmin); tree->times->c_lnL = UNLIKELY; return -INFINITY; } else if(b > bmax && d > dmax) { PhyML_Fprintf(stderr,"\n. b: %G bmax: %G d: %G dmax: %G",b,bmax,d,dmax); tree->times->c_lnL = UNLIKELY; return -INFINITY; } else { assert(FALSE); } if(isnan(lnL) || isinf(fabs(lnL)) || !(lnL > UNLIKELY)) { PhyML_Fprintf(stderr,"\n. lnL times: %f",lnL); tree->times->c_lnL = UNLIKELY; return UNLIKELY; } tree->times->c_lnL = lnL; return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Generate a subtree including all taxa in tax_list. The age of the root of that // subtree is t_mrca. All nodes in the subtree are thus younger than that. void TIMES_Connect_List_Of_Taxa(t_node **tax_list, int list_size, phydbl t_mrca, phydbl *times, int *nd_num, t_tree *mixt_tree) { phydbl t_upper_bound, t_lower_bound,up,lo; int i,j,n_anc,*permut,rand_idx; t_node *n,**anc,*new_mrca; // Calibration of a tip node if(list_size == 1) { times[tax_list[0]->num] = t_mrca; return; } else { t_lower_bound = t_mrca; t_upper_bound = +INFINITY; n = NULL; anc = NULL; new_mrca = NULL; permut = NULL; // Find the upper bound for all the new node ages that // will be created in this function for(i=0;iv[0] != NULL) n = n->v[0]; if(times[n->num] < t_upper_bound) t_upper_bound = times[n->num]; } if(t_upper_bound < t_lower_bound) { PhyML_Printf("\n. upper: %f lower: %f t_mrca: %f\n",t_upper_bound,t_lower_bound,t_mrca); assert(FALSE); } // Get the list of current mrcas to all taxa in tax_list. There should be // at least one of these n_anc = 0; for(i=0;iv[0] != NULL) n = n->v[0]; for(j=0;jnum); */ if(n_anc == 1) // All the nodes in tax_list are already connected. Bail out. { Free(anc); return; } // Connect randomly and set ages permut = Permutate(n_anc); /* permut = (int *)mCalloc(n_anc,sizeof(int)); */ /* for(i=0;ia_nodes[*nd_num]; anc[permut[i]]->v[0] = new_mrca; anc[permut[i+1]]->v[0] = new_mrca; new_mrca->v[1] = anc[permut[i]]; new_mrca->v[2] = anc[permut[i+1]]; new_mrca->v[0] = NULL; up = MIN(times[new_mrca->v[1]->num],times[new_mrca->v[2]->num]); lo = up - (up - t_mrca)/5.; times[new_mrca->num] = Uni()*(up - lo) + lo; /* times[new_mrca->num] = t_upper_bound - ((phydbl)(i+1.)/n_anc)*(t_upper_bound - t_lower_bound); */ /* printf("\n. new_mrca->num: %d time: %f [%f %f] t_mrca: %f %d connect to %d %d %d [%f %f]", */ /* new_mrca->num, */ /* times[new_mrca->num], */ /* t_lower_bound, */ /* t_upper_bound, */ /* t_mrca, */ /* new_mrca->num, */ /* new_mrca->v[0] ? new_mrca->v[0]->num : -1, */ /* new_mrca->v[1] ? new_mrca->v[1]->num : -1, */ /* new_mrca->v[2] ? new_mrca->v[2]->num : -1, */ /* times[new_mrca->v[1]->num], */ /* times[new_mrca->v[2]->num] */ /* ); */ /* fflush(NULL); */ anc[permut[i+1]] = new_mrca; rand_idx = Rand_Int(i+1,n_anc-1); n = anc[permut[i+1]]; anc[permut[i+1]] = anc[permut[rand_idx]]; anc[permut[rand_idx]] = n; i++; (*nd_num) += 1; if(n_anc == i+1) { times[new_mrca->num] = t_mrca; break; } } while(1); Free(permut); Free(anc); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Generate a random rooted tree with node ages fullfiling the // time constraints defined in the list of calibration cal_list void TIMES_Randomize_Tree_With_Time_Constraints(t_cal *cal_list, t_tree *mixt_tree) { t_node **tips,**nd_list; phydbl *times,*cal_times,time_oldest_cal; int i,j,nd_num,*cal_ordering,n_cal,swap,list_size,tmp,orig_is_mixt_tree,repeat,n_max_repeats,tip_num,*no_cal_tip_num,n_no_cal_tip_num,*permut,*tip_is_in_cal_clad; t_cal *cal; t_clad *clade; assert(mixt_tree->rates); if(mixt_tree->mod->s_opt->opt_topo == NO) { PhyML_Fprintf(stderr,"\n. Fixing the tree topology is only allowed when calibrating tip nodes only."); PhyML_Fprintf(stderr,"\n. You are most likely calibrating here the MRCA of at least one clade with more than two tips."); PhyML_Fprintf(stderr,"\n. It is difficult to set the age of that clade within the limit of the calibration constraints,"); PhyML_Fprintf(stderr,"\n. and fix the tree topology at the same time. Please contact me (guindon@lirmm.fr) for a more"); PhyML_Fprintf(stderr,"\n. detailed diagnostic."); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } tips = (t_node **)mCalloc(mixt_tree->n_otu,sizeof(t_node *)); nd_list = (t_node **)mCalloc(2*mixt_tree->n_otu-1,sizeof(t_node *)); tip_is_in_cal_clad = (int *)mCalloc(mixt_tree->n_otu,sizeof(t_node *)); times = mixt_tree->times->nd_t; orig_is_mixt_tree = mixt_tree->is_mixt_tree; mixt_tree->is_mixt_tree = NO; n_max_repeats = 1000; cal = NULL; clade = NULL; // Is tip in calibrated clade or not? for(i=0;in_otu;++i) { cal = cal_list; clade = NULL; while(cal != NULL) { while(cal && cal->clade_list == NULL) cal = cal->next; if(cal == NULL) break; clade = cal->clade_list[cal->current_clade_idx]; for(j=0;jn_tax;++j) if(clade->tip_list[j] == mixt_tree->a_nodes[i]) break; if(j != clade->n_tax) break; cal = cal->next; } if(cal != NULL) tip_is_in_cal_clad[i] = YES; else tip_is_in_cal_clad[i] = NO; } // List node indices that are not in any calibration set no_cal_tip_num = NULL; n_no_cal_tip_num = 0; for(i=0;in_otu;++i) { cal = cal_list; while(cal != NULL) { while(cal && cal->clade_list == NULL) cal = cal->next; if(cal == NULL) break; clade = cal->clade_list[cal->current_clade_idx]; for(j=0;jn_tax;++j) if(clade->tip_list[j] == mixt_tree->a_nodes[i]) break; if(j != clade->n_tax) break; cal = cal->next; } if(cal == NULL) { if(n_no_cal_tip_num == 0) no_cal_tip_num = (int *)mCalloc(1,sizeof(int)); else no_cal_tip_num = (int *)mRealloc(no_cal_tip_num,n_no_cal_tip_num+1,sizeof(int)); no_cal_tip_num[n_no_cal_tip_num] = i; n_no_cal_tip_num++; } } for(repeat=0;repeatn_otu; /* PhyML_Printf("\n\n. Repeat %d",repeat); */ for(i=0;in_otu;++i) tips[i] = mixt_tree->a_nodes[i]; for(i=0;in_otu;++i) mixt_tree->a_nodes[i]->v[0] = NULL; // Set a time for each calibration cal_times = (phydbl *)mCalloc(1,sizeof(phydbl)); time_oldest_cal = 0.0; n_cal = 0; cal = cal_list; while(cal != NULL) { if(cal->is_primary == YES) { if(n_cal > 0) cal_times = (phydbl *)mRealloc(cal_times,n_cal+1,sizeof(phydbl)); cal_times[n_cal] = Uni()*(cal->upper - cal->lower) + cal->lower; if(cal_times[n_cal] < time_oldest_cal) time_oldest_cal = cal_times[n_cal]; n_cal++; } cal = cal->next; } cal_ordering = (int *)mCalloc(n_cal,sizeof(int)); for(i=0;iis_primary == YES) j++; cal = cal->next; assert(cal); } list_size = 0; /* printf("\n. n_cal: %d n_no_cal_tip_num: %d [%d %d] n_otu: %d", */ /* n_cal, */ /* n_no_cal_tip_num, */ /* n_no_cal_tip_num-1, */ /* (int)(2*n_no_cal_tip_num/(n_cal)), */ /* mixt_tree->n_otu); fflush(NULL); */ // Add some taxa that are not in any calibration set if(n_no_cal_tip_num > 0) { permut = Permutate(n_no_cal_tip_num); j = 0; do { tip_num = no_cal_tip_num[permut[j]]; if(tips[tip_num]->v[0] == NULL) { nd_list[list_size] = tips[tip_num]; /* PhyML_Printf("\n# %s",tips[tip_num]->name); */ list_size++; assert(list_size <= mixt_tree->n_otu); } } while(j++ < MIN(n_no_cal_tip_num-1,(int)(2*n_no_cal_tip_num/(n_cal)))); Free(permut); } // Add all the taxa that are in the calibration set of cal // This should be done here so that the last node in nd_list // belongs to the taxa in the calibration if(cal->clade_list != NULL) { clade = cal->clade_list[cal->current_clade_idx]; for(j=0;jn_tax;j++) { nd_list[list_size] = tips[clade->tip_list[j]->num]; list_size++; assert(list_size <= mixt_tree->n_otu); } TIMES_Connect_List_Of_Taxa(nd_list, list_size, cal_times[cal_ordering[i]], times, &nd_num, mixt_tree); } } Free(cal_times); Free(cal_ordering); // Connect all remaining taxa for(i=0;in_otu;i++) nd_list[i] = NULL; list_size = 0; for(i=0;in_otu;++i) { if(tip_is_in_cal_clad[tips[i]->num] == NO) // Tip is not in a calibrated clade { nd_list[list_size] = tips[i]; list_size++; assert(list_size <= mixt_tree->n_otu); } } cal = cal_list; do { while(cal && cal->clade_list == NULL) cal = cal->next; if(cal == NULL) break; clade = cal->clade_list[cal->current_clade_idx]; nd_list[list_size] = clade->tip_list[0]; list_size++; assert(list_size <= 2*mixt_tree->n_otu-1); cal = cal->next; } while(cal); /* for(i=0;inum,time_oldest_cal); */ TIMES_Connect_List_Of_Taxa(nd_list, list_size, 10.*time_oldest_cal-1.E-3, // 1.E-3 required in case time_oldest_cal = 0. times, &nd_num, mixt_tree); // Adding root node mixt_tree->n_root = mixt_tree->a_nodes[2*mixt_tree->n_otu-2]; mixt_tree->n_root->v[1]->v[0] = mixt_tree->n_root->v[2]; mixt_tree->n_root->v[2]->v[0] = mixt_tree->n_root->v[1]; mixt_tree->n_root->anc = NULL; Connect_Edges_To_Nodes_Serial(mixt_tree); // Adding root edge for(i=0;i<2*mixt_tree->n_otu-3;++i) { if(((mixt_tree->a_edges[i]->left == mixt_tree->n_root->v[1]) || (mixt_tree->a_edges[i]->rght == mixt_tree->n_root->v[1])) && ((mixt_tree->a_edges[i]->left == mixt_tree->n_root->v[2]) || (mixt_tree->a_edges[i]->rght == mixt_tree->n_root->v[2]))) { mixt_tree->e_root = mixt_tree->a_edges[i]; break; } } Update_Ancestors(mixt_tree->n_root,mixt_tree->n_root->v[2],mixt_tree->n_root->b[2],mixt_tree); Update_Ancestors(mixt_tree->n_root,mixt_tree->n_root->v[1],mixt_tree->n_root->b[1],mixt_tree); DATE_Assign_Primary_Calibration(mixt_tree); DATE_Update_T_Prior_MinMax(mixt_tree); /* for(int i=0;itimes->n_cal;i++) */ /* { */ /* int idx; */ /* cal = mixt_tree->times->a_cal[i]; */ /* if(cal->clade_list != NULL) */ /* { */ /* clade = cal->clade_list[cal->current_clade_idx]; */ /* idx = Find_Clade(clade->tax_list,clade->n_tax,mixt_tree); */ /* PhyML_Printf("\n. Calibration %3d | Node number to which calibration applies is [%d]",i,idx); */ /* PhyML_Printf("\n. Calibration %3d | Lower bound set to: %15f time units.",i,mixt_tree->times->a_cal[i]->lower); */ /* PhyML_Printf("\n. Calibration %3d | Upper bound set to: %15f time units.",i,mixt_tree->times->a_cal[i]->upper); */ /* PhyML_Printf("\n. Calibration %3d | t_prior_min: %G t_prior_max: %G",i,mixt_tree->times->t_prior_min[idx],mixt_tree->times->t_prior_max[idx]); */ /* PhyML_Printf("\n. Calibration %3d | Time set to %G",i,mixt_tree->times->nd_t[idx]); */ /* } */ /* } */ if(!DATE_Check_Calibration_Constraints(mixt_tree)) { /* PhyML_Printf("\n. Could not generate tree (DATE_Check_Calibration_Constraints)\n\n"); */ } else if(!DATE_Check_Time_Constraints(mixt_tree)) { /* PhyML_Printf("\n. Could not generate tree (DATE_Check_Time_Constraints)\n\n"); */ } else break; // Tree successfully generated } if(repeat == n_max_repeats) { PhyML_Fprintf(stderr,"\n\n"); PhyML_Fprintf(stderr,"\n. A random tree satisfying the calibration constraints provided"); PhyML_Fprintf(stderr,"\n. could not be generated. It probably means that there are some"); PhyML_Fprintf(stderr,"\n. inconsistencies in the calibration data. For instance, the calibration"); PhyML_Fprintf(stderr,"\n. time interval for the MRCA of a clade with taxa {X,Y} (noted as [a,b])"); PhyML_Fprintf(stderr,"\n. cannot be strictly older than the interval corresponding to taxa "); PhyML_Fprintf(stderr,"\n. {X,Z,Y} (noted as [c,d]), i.e., b cannot be smaller (older) than c. "); PhyML_Fprintf(stderr,"\n. Also, please remember that the present time corresponds to a time"); PhyML_Fprintf(stderr,"\n. value equal to zero and past events have negative time values."); PhyML_Fprintf(stderr,"\n\n"); if(!DATE_Check_Calibration_Constraints(mixt_tree)) { PhyML_Fprintf(stderr,"\n. Could not generate tree (DATE_Check_Calibration_Constraints)\n\n"); } else if(!DATE_Check_Time_Constraints(mixt_tree)) { PhyML_Fprintf(stderr,"\n. Could not generate tree (DATE_Check_Time_Constraints)\n\n"); } Exit("\n"); } /* assert(i != 2*mixt_tree->n_otu-3); */ mixt_tree->is_mixt_tree = orig_is_mixt_tree; Free(tips); Free(nd_list); Free(no_cal_tip_num); Free(tip_is_in_cal_clad); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int TIMES_Check_Node_Height_Ordering(t_tree *tree) { if(!TIMES_Check_Node_Height_Ordering_Post(tree->n_root,tree->n_root->v[1],tree)) return NO; if(!TIMES_Check_Node_Height_Ordering_Post(tree->n_root,tree->n_root->v[2],tree)) return NO; return YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int TIMES_Check_Node_Height_Ordering_Post(t_node *a, t_node *d, t_tree *tree) { if(d->anc != a) { PhyML_Printf("\n. d=%d d->anc=%d a=%d root=%d",d->num,d->anc->num,a->num,tree->n_root->num); return NO; } if(tree->times->nd_t[d->num] < tree->times->nd_t[a->num]) { PhyML_Printf("\n. a->t = %f [num:%d] d->t %f [num:%d]", tree->times->nd_t[a->num], a->num, tree->times->nd_t[d->num], d->num); return NO; } if(d->tax == YES) return YES; else { int i; for(i=0;i<3;i++) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) if(!TIMES_Check_Node_Height_Ordering_Post(d,d->v[i],tree)) return NO; } } return YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* 2n-2 edge lengths (in a rooted tree), n-1 internal node ages. Return \sum_i (l_i - delta t_i)^2 where delta t_i is the calendar time elapsed along the edge of length l_i */ phydbl TIMES_Least_Square_Criterion(t_tree *tree) { phydbl score; score = 0.0; assert(tree->n_root); assert(tree->rates); TIMES_Pre_Least_Square_Criterion(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],&score,tree); TIMES_Pre_Least_Square_Criterion(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],&score,tree); return(score); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Pre_Least_Square_Criterion(t_node *a, t_node *d, t_edge *b, phydbl *score, t_tree *tree) { int i; (*score) += pow(b->l->v - fabs(tree->times->nd_t[a->num] + tree->times->nd_t[d->num])*tree->rates->clock_r,2); if(d->tax) return; for(i=0;i<3;++i) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) TIMES_Pre_Least_Square_Criterion(d,d->v[i],d->b[i],score,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Randomize_Node_Ages(t_tree *tree) { assert(tree->n_root); assert(tree->rates); TIMES_Post_Randomize_Node_Ages(tree->n_root,tree->n_root->v[1],tree); TIMES_Post_Randomize_Node_Ages(tree->n_root,tree->n_root->v[2],tree); tree->times->nd_t[tree->n_root->num] = MIN(tree->times->nd_t[tree->n_root->v[1]->num], tree->times->nd_t[tree->n_root->v[2]->num]) - Rexp(1.); /* PhyML_Printf("\n. RAND TIMES node %3d %15f",tree->n_root->num,tree->times->nd_t[tree->n_root->num]); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Post_Randomize_Node_Ages(t_node *a, t_node *d, t_tree *tree) { if(d->tax == YES) return; else { int i,dir1,dir2; for(i=0;i<3;++i) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) TIMES_Post_Randomize_Node_Ages(d,d->v[i],tree); dir1 = dir2 = -1; for(i=0;i<3;++i) if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(dir1 < 0) dir1 = i; else dir2 = i; } tree->times->nd_t[d->num] = MIN(tree->times->nd_t[d->v[dir1]->num], tree->times->nd_t[d->v[dir2]->num]) - Rexp(1.); /* PhyML_Printf("\n. RAND TIMES node %3d %15f",d->num,tree->times->nd_t[d->num]); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int TIMES_Calibrations_Apply_To_Tips_Only(t_tree *tree) { t_cal *cal; t_clad *clade; cal = tree->times->a_cal[0]; assert(cal); clade = NULL; do { while(cal && cal->clade_list == NULL) cal = cal->next; if(cal == NULL) break; clade = cal->clade_list[cal->current_clade_idx]; if(clade && clade->n_tax > 1) break; cal = cal->next; } while(cal); if(cal == NULL) return YES; return NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Randomize_Tip_Times_Given_Calibrations(t_tree *tree) { t_cal *cal; t_clad *clade; cal = tree->times->a_cal[0]; assert(cal); do { clade = cal->clade_list[cal->current_clade_idx]; if(clade->n_tax == 1) { assert(clade); assert(clade->target_nd); assert(clade->target_nd->tax == YES); tree->times->nd_t[clade->target_nd->num] = Uni()*(cal->upper - cal->lower) + cal->lower; } cal = cal->next; } while(cal); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Time_To_Bl(t_tree *tree) { TIMES_Time_To_Bl_Pre(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); TIMES_Time_To_Bl_Pre(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); tree->n_root->b[1]->l->v = tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]; tree->n_root->b[2]->l->v = tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]; tree->e_root->l->v = tree->n_root->b[1]->l->v + tree->n_root->b[2]->l->v; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Time_To_Bl_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { int i; b->l->v = tree->times->nd_t[d->num] - tree->times->nd_t[a->num]; if(d->tax) return; else { for(i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) TIMES_Time_To_Bl_Pre(d,d->v[i],d->b[i],tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Tree_Length(t_tree *tree) { phydbl sum; assert(tree->rates); assert(tree->e_root); sum = 0.0; for(int i=0;i<2*tree->n_otu-1;++i) if(tree->a_edges[i] != tree->e_root) sum += fabs(tree->times->nd_t[tree->a_edges[i]->left->num]- tree->times->nd_t[tree->a_edges[i]->rght->num]); return(sum); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Work out node ages with edge lengths. If prepost = 1, post-traversal: internal node ages derive from tip ages and edge lengths. If prepos = 0, pre-traversal: internal node ages derive from the root age (arbitrarily set to 0) and the edge lengths */ void TIMES_Bl_To_Times(short int prepost, t_tree *tree) { if(prepost == 1) { t_node *v1,*v2; int dir1,dir2; phydbl t1,t2; TIMES_Bl_To_Times_Post(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); TIMES_Bl_To_Times_Post(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); dir1 = 1; dir2 = 2; v1 = tree->n_root->v[dir1]; v2 = tree->n_root->v[dir2]; t1 = tree->times->nd_t[v1->num] - MIXT_Get_Mean_Edge_Len(tree->n_root->b[1],tree) / (tree->rates->clock_r * tree->rates->br_r[v1->num]); t2 = tree->times->nd_t[v2->num] - MIXT_Get_Mean_Edge_Len(tree->n_root->b[2],tree) / (tree->rates->clock_r * tree->rates->br_r[v2->num]); if(Are_Equal(t1,t2,1.E-2) == NO) { PhyML_Fprintf(stderr,"\n. It looks as if the edge lengths suplied do not define valid tree distances."); PhyML_Fprintf(stderr,"\n. Please amend these lengths so as it becomes straightforward to transform your tree"); PhyML_Fprintf(stderr,"\n. into a time-tree. Please contact me (guindon@lirmm.fr) for more information."); PhyML_Fprintf(stderr,"\n. l1: %f l2: %f",MIXT_Get_Mean_Edge_Len(tree->n_root->b[1],tree),MIXT_Get_Mean_Edge_Len(tree->n_root->b[2],tree)); PhyML_Fprintf(stderr,"\n. t1: %f t2: %f",tree->times->nd_t[v1->num],tree->times->nd_t[v2->num]); PhyML_Fprintf(stderr,"\n. rr1: %f rr2: %f",tree->rates->br_r[v1->num],tree->rates->br_r[v2->num]); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } tree->times->nd_t[tree->n_root->num] = t1; } else if(prepost == 0) { tree->times->nd_t[tree->n_root->num] = 0.0; TIMES_Bl_To_Times_Pre(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); TIMES_Bl_To_Times_Pre(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Bl_To_Times_Post(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if(d->tax == YES) return; else { t_node *v1,*v2; int dir1,dir2; phydbl t1,t2; dir1 = dir2 = -1; for(int i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { TIMES_Bl_To_Times_Post(d,d->v[i],d->b[i],tree); if(dir1 < 0) dir1 = i; else dir2 = i; } v1 = d->v[dir1]; v2 = d->v[dir2]; t1 = tree->times->nd_t[v1->num] - MIXT_Get_Mean_Edge_Len(d->b[dir1],tree) / (tree->rates->clock_r * tree->rates->br_r[v1->num]); t2 = tree->times->nd_t[v2->num] - MIXT_Get_Mean_Edge_Len(d->b[dir2],tree) / (tree->rates->clock_r * tree->rates->br_r[v2->num]); if(Are_Equal(t1,t2,1.E-2) == NO) { PhyML_Fprintf(stderr,"\n. It looks as if the edge lengths suplied do not define valid tree distances."); PhyML_Fprintf(stderr,"\n. Please amend these lengths so as it becomes straightforward to transform your tree"); PhyML_Fprintf(stderr,"\n. into a time-tree."); PhyML_Fprintf(stderr,"\n. v1->tax: %d v2->tax: %d",v1->tax,v2->tax); PhyML_Fprintf(stderr,"\n. v1->name: %s v2->name: %s",v1->tax?v1->name:"",v2->tax?v2->name:""); PhyML_Fprintf(stderr,"\n. v1->num: %d v2->num: %d",v1->num,v2->num); PhyML_Fprintf(stderr,"\n. l1: %f l2: %f",MIXT_Get_Mean_Edge_Len(d->b[dir1],tree),MIXT_Get_Mean_Edge_Len(d->b[dir2],tree)); PhyML_Fprintf(stderr,"\n. l1: %f l2: %f",d->b[dir1]->l->v,d->b[dir2]->l->v); PhyML_Fprintf(stderr,"\n. t1: %f t2: %f",tree->times->nd_t[v1->num],tree->times->nd_t[v2->num]); PhyML_Fprintf(stderr,"\n. rr1: %f rr2: %f",tree->rates->br_r[v1->num],tree->rates->br_r[v2->num]); PhyML_Fprintf(stderr,"\n. est: %f %f diff: %G",t1,t2,t1-t2); PhyML_Fprintf(stderr,"\n. clock_r %f",tree->rates->clock_r); PhyML_Fprintf(stderr,"\n. root->num: %d root->v1->num: %d root->v2->num: %d", tree->n_root->num, tree->n_root->v[1]->num, tree->n_root->v[2]->num); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } tree->times->nd_t[d->num] = t1; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Bl_To_Times_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { tree->times->nd_t[d->num] = tree->times->nd_t[a->num] + MIXT_Get_Mean_Edge_Len(b,tree) / (tree->rates->clock_r * tree->rates->br_r[d->num]);; if(d->tax == YES) return; for(int i=0;i<3;i++) if((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root)) { TIMES_Bl_To_Times_Pre(d,d->v[i],d->b[i],tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Copy_Time_Struct(t_time *from, t_time *to, int n_otu) { int i; to->birth_rate = from->birth_rate; to->birth_rate_min = from->birth_rate_min; to->birth_rate_max = from->birth_rate_max; to->birth_rate_pivot = from->birth_rate_pivot; to->death_rate = from->death_rate; to->death_rate_min = from->death_rate_min; to->death_rate_max = from->death_rate_max; to->death_rate_pivot = from->death_rate_pivot; to->c_lnL = from->c_lnL; to->c_lnL_jps = from->c_lnL_jps; to->nd_t_recorded = from->nd_t_recorded; to->update_time_norm_const = from->update_time_norm_const; to->scaled_pop_size = from->scaled_pop_size; to->scaled_pop_size_min = from->scaled_pop_size_min; to->scaled_pop_size_max = from->scaled_pop_size_max; to->neff_growth = from->neff_growth; to->neff_growth_min = from->neff_growth_min; to->neff_growth_max = from->neff_growth_max; to->model_id = from->model_id; to->coalescent_model_id = from->coalescent_model_id; to->update_time_norm_const = from->update_time_norm_const; to->augmented_coalescent = from->augmented_coalescent; to->neff_prior_mean = from->neff_prior_mean; to->neff_prior_var = from->neff_prior_var; to->neff_prior_distrib = from->neff_prior_distrib; for(i=0;i<2*n_otu-1;++i) to->nd_t[i] = from->nd_t[i]; for(i=0;i<2*n_otu-1;++i) to->buff_t[i] = from->buff_t[i]; for(i=0;i<2*n_otu-1;++i) to->true_t[i] = from->true_t[i]; for(i=0;i<2*n_otu-1;++i) to->t_mean[i] = from->t_mean[i]; for(i=0;i<2*n_otu-1;++i) to->t_prior[i] = from->t_prior[i]; for(i=0;i<2*n_otu-1;++i) to->t_prior_min[i] = from->t_prior_min[i]; for(i=0;i<2*n_otu-1;++i) to->t_prior_max[i] = from->t_prior_max[i]; for(i=0;i<2*n_otu-1;++i) to->t_floor[i] = from->t_floor[i]; for(i=0;i<2*n_otu-1;++i) to->t_rank[i] = from->t_rank[i]; for(i=0;i<2*n_otu-1;++i) to->t_has_prior[i] = from->t_has_prior[i]; for(i=0;i<2*n_otu-1;++i) to->n_jps[i] = from->n_jps[i]; for(i=0;i<2*n_otu-2;++i) to->t_jps[i] = from->t_jps[i]; for(i=0;i<2*n_otu-1;++i) to->mean_t[i] = from->mean_t[i]; for(i=0;i<2*n_otu-1;++i) to->time_slice_lims[i] = from->time_slice_lims[i]; for(i=0;i<2*n_otu-1;++i) to->n_time_slice_spans[i] = from->n_time_slice_spans[i]; for(i=0;i<2*n_otu-1;++i) to->curr_slice[i] = from->curr_slice[i]; for(i=0;i<2*n_otu-1;++i) to->has_survived[i] = from->has_survived[i]; for(i=0;i<2*n_otu-1;++i) to->calib_prob[i] = from->calib_prob[i]; for(i=0;i<2*n_otu-1;++i) to->t_prior_min_ori[i] = from->t_prior_max_ori[i]; for(i=0;itimes_partial_proba[i] = from->times_partial_proba[i]; for(i=0;inumb_calib_chosen[i] = from->numb_calib_chosen[i]; for(i=0;i<2*n_otu-1;++i) to->mean_t[i] = from->mean_t[i]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Lk(t_tree *tree) { switch(tree->times->model_id) { case COALESCENT : { tree->times->c_lnL = TIMES_Lk_Coalescent(tree); break; } case SLFV_GAUSSIAN : case SLFV_UNIFORM : { tree->times->c_lnL = TIMES_Lk_SLFV(tree); break; } case BIRTHDEATH : { DATE_Assign_Primary_Calibration(tree); DATE_Update_T_Prior_MinMax(tree); tree->times->c_lnL = TIMES_Lk_Birth_Death(NO,tree); break; } default : break; } return(tree->times->c_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree) { switch(tree->times->model_id) { case COALESCENT : { return(TIMES_Lk_Coalescent_Range(young,old,tree)); break; } case SLFV_GAUSSIAN : case SLFV_UNIFORM : { return(TIMES_Lk_SLFV_Range(young,old,tree)); break; } default : break; } return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Prior_SLFV(t_tree *tree) { return(UNLIKELY); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Lk_SLFV(t_tree *tree) { phydbl lnL; t_dsk *disk; phydbl dt; int n_evt; n_evt = 0; dt = 0.0; lnL = 0.0; disk = tree->young_disk->prev; do { if(disk->age_fixed == NO) { dt += fabs(disk->next->time - disk->time); n_evt++; } disk = disk->prev; } while(disk); lnL += n_evt * log(tree->mmod->lbda) - tree->mmod->lbda * dt; tree->times->c_lnL = lnL; return(tree->times->c_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIMES_Lk_SLFV_Range(t_dsk *young, t_dsk *old, t_tree *tree) { t_dsk *disk; int n_evt; phydbl lnP,dt; assert(young); lnP = 0.0; dt = 0.0; n_evt = 0; disk = young->prev; do { if(disk->age_fixed == NO) { dt += fabs(disk->next->time - disk->time); n_evt++; } assert(disk); if(disk->time > disk->next->time) return UNLIKELY; if(disk == old) break; disk = disk->prev; } while(disk); lnP = n_evt * log(tree->mmod->lbda) - tree->mmod->lbda * dt; return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/times.h000066400000000000000000000123441501136442400204670ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef TIMES_H #define TIMES_H #include "utilities.h" int TIMES_Main(int argc, char **argv); void TIMES_Bl_From_T_Post(t_node *a, t_node *d, t_edge *b, t_tree *tree); void TIMES_Bl_From_T(t_tree *tree); void TIMES_Optimize_Node_Times_Serie(t_node *a, t_node *d, t_tree *tree); void TIMES_Round_Optimize(t_tree *tree); void TIMES_Print_Node_Times(t_node *a, t_node *d, t_tree *tree); t_edge *TIMES_Find_Best_Root_Position(t_tree *tree); void TIMES_Least_Square_Node_Times(t_edge *e_root, t_tree *tree); void TIMES_Least_Square_Node_Times_Pre(t_node *a, t_node *d, phydbl *A, phydbl *b, int n, t_tree *tree); void TIMES_Mult_Time_Stamps(t_tree *tree); void TIMES_Div_Time_Stamps(t_tree *tree); void TIMES_Optimize_Tree_Height(t_tree *tree); void TIMES_Adjust_Node_Times(t_tree *tree); void TIMES_Adjust_Node_Times_Pre(t_node *a, t_node *d, t_tree *tree); void TIMES_Optimize_Root_Height(t_tree *tree); void TIMES_Estimate_Branch_Rates(t_tree *tree); t_edge *TIMES_Find_Best_Root_Position_Approx(t_tree *tree); void TIMES_Estimate_Branch_Rate_Parameter(t_tree *tree); phydbl TIMES_Classify_Branch_In_Rate_Class(t_tree *tree); void TIMES_Compute_Rates_And_Times_Least_Square_Adjustments(t_tree *tree); void TIMES_Compute_Rates_And_Times_Least_Square_Adjustments_Post(t_node *a, t_node *d, t_edge *b, t_tree *tree); void TIMES_Classify_Branch_Rates(t_tree *tree); int TIMES_Check_MC(t_tree *tree); void TIMES_Set_All_Node_Priors(t_tree *tree); void TIMES_Set_All_Node_Priors_Bottom_Up(t_node *a, t_node *d, t_tree *tree); void TIMES_Set_All_Node_Priors_Top_Down(t_node *a, t_node *d, t_tree *tree); void TIMES_Set_Floor(t_tree *tree); void TIMES_Set_Floor_Post(t_node *a, t_node *d, t_tree *tree); phydbl TIMES_Log_Conditional_Uniform_Density(t_tree *tree); phydbl TIMES_Log_Yule(t_tree *tree); void TIMES_Lk_Times_Trav(t_node *a, t_node *d, phydbl lim_inf, phydbl lim_sup, phydbl *logdens, t_tree *tree); phydbl TIMES_Log_Number_Of_Ranked_Labelled_Histories(t_node *root, int per_slice, t_tree *tree); void TIMES_Log_Number_Of_Ranked_Labelled_Histories_Post(t_node *a, t_node *d, int per_slice, phydbl *logn, t_tree *tree); phydbl TIMES_Lk_Uniform_Core(t_tree *tree); void TIMES_Get_Number_Of_Time_Slices(t_tree *tree); void TIMES_Get_Number_Of_Time_Slices_Post(t_node *a, t_node *d, t_tree *tree); void TIMES_Get_N_Slice_Spans(t_tree *tree); void TIMES_Allocate_Vectors_Time_Slice_Combin(t_tree *tree); void TIMES_Allocate_Vectors_Time_Slice_Combin_Post(t_node *a, t_node *d, t_tree *tree); void TIMES_Update_Curr_Slice(t_tree *tree); void TIMES_Lk_Uniform_Post(t_node *a, t_node *d, t_tree *tree); void TIMES_Set_Root_Given_Tip_Dates(t_tree *tree); void Get_Survival_Duration(t_tree *tree); void Get_Survival_Duration_Post(t_node *a, t_node *d, t_tree *tree); phydbl TIMES_Lk_Yule_Root_Marginal(t_tree *tree); phydbl TIMES_Lk_Yule_Joint(t_tree *tree); void TIMES_Update_Node_Ordering(t_tree *tree); phydbl TIMES_Lk_Yule_Order(t_tree *tree); void TIMES_Record_Prior_Times(t_tree *tree); void TIMES_Reset_Prior_Times(t_tree *tree); phydbl TIMES_Lk_Yule_Order_Root_Cond(t_tree *tree); void TIMES_Connect_List_Of_Taxa(t_node **tax_list, int list_size, phydbl t_mrca, phydbl *times, int *nd_num, t_tree *mixt_tree); void TIMES_Randomize_Tree_With_Time_Constraints(t_cal *cal_list, t_tree *tree); phydbl TIMES_Lk_Birth_Death(int verbose, t_tree *tree); int TIMES_Check_Node_Height_Ordering(t_tree *tree); int TIMES_Check_Node_Height_Ordering_Post(t_node *a, t_node *d, t_tree *tree); phydbl TIMES_Lk_Birth_Death_One_Node(phydbl t, phydbl min, phydbl max, t_tree *tree); phydbl TIMES_Least_Square_Criterion(t_tree *tree); void TIMES_Pre_Least_Square_Criterion(t_node *a, t_node *d, t_edge *b, phydbl *score, t_tree *tree); void TIMES_Post_Randomize_Node_Ages(t_node *a, t_node *d, t_tree *tree); void TIMES_Randomize_Node_Ages(t_tree *tree); int TIMES_Calibrations_Apply_To_Tips_Only(t_tree *tree); void TIMES_Randomize_Tip_Times_Given_Calibrations(t_tree *tree); void TIMES_Time_To_Bl(t_tree *tree); void TIMES_Time_To_Bl_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void TIMES_Bl_To_Times_Post(t_node *a, t_node *d, t_edge *b, t_tree *tree); void TIMES_Bl_To_Times(short int prepost, t_tree *tree); phydbl TIMES_Tree_Length(t_tree *tree); void TIMES_Copy_Time_Struct(t_time *from, t_time *to, int n_otu); phydbl TIMES_Lk_Coalescent(t_tree *tree); phydbl TIMES_Wrap_Lk_Coalescent(t_edge *b, t_tree *tree, supert_tree *stree); void TIMES_Simulate_Coalescent(t_tree *tree); phydbl TIMES_Lk_Coalescent_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl TIMES_Lk_SLFV(t_tree *tree); phydbl TIMES_Lk_SLFV_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl TIMES_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl TIMES_Lk(t_tree *tree); phydbl TIMES_Prior_Neff(t_tree *tree); phydbl TIMES_Prior(t_tree *tree); phydbl TIMES_Prior_SLFV(t_tree *tree); void TIMES_Record_Times(t_tree *mixt_tree); void TIMES_Reset_Times(t_tree *mixt_tree); void TIMES_Bl_To_Times_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/tiporder.c000066400000000000000000001123761501136442400211770ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines for molecular clock trees and molecular dating */ #include "tiporder.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* int TIPO_main(int argc, char **argv) */ /* { */ /* t_tree **list_tree,*ref_tree,*tree; */ /* FILE *fp_ref_tree,*fp_list_tree,*fp_coord,*ps_tree; */ /* int i,j,k; */ /* int n_trees; */ /* option *ref_io,*list_io; */ /* char **name_table; */ /* int r_seed; */ /* r_seed = time(NULL); */ /* srand(r_seed); */ /* ref_io = (option *)Make_Input(); */ /* list_io = (option *)Make_Input(); */ /* fp_ref_tree = (FILE *)fopen(argv[1],"r"); */ /* fp_list_tree = (FILE *)fopen(argv[2],"r"); */ /* fp_coord = (FILE *)fopen(argv[3],"r"); */ /* if(!fp_ref_tree) */ /* { */ /* PhyML_Printf("\n. Can't find %s",argv[1]); */ /* PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ /* if(!fp_list_tree) */ /* { */ /* PhyML_Printf("\n. Can't find %s",argv[2]); */ /* PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ /* ref_io->fp_in_tree = fp_ref_tree; */ /* Read_Tree_File(ref_io); */ /* fclose(ref_io->fp_in_tree); */ /* ref_tree = ref_io->treelist->tree[0]; */ /* ref_tree->io = ref_io; */ /* list_io->fp_in_tree = fp_list_tree; */ /* Read_Tree_File(list_io); */ /* fclose(list_io->fp_in_tree); */ /* list_tree = list_io->treelist->tree; */ /* n_trees = list_io->treelist->list_size; */ /* PhyML_Printf("\n. Read %d trees\n",n_trees); */ /* for(i=0;iio = list_io; */ /* name_table = (char **)mCalloc(ref_tree->n_otu,sizeof(char **)); */ /* for(i=0;in_otu;i++) name_table[i] = (char *)mCalloc(T_MAX_NAME,sizeof(char)); */ /* /\* Sort translation table such that tree->a_nodes[i]->name == tree->io->short_tax_name[i] for all i *\/ */ /* TIPO_Sort_Translation_Table(ref_tree); */ /* ref_tree->io->z_scores = (phydbl *)mCalloc(ref_tree->n_otu,sizeof(phydbl)); */ /* /\* TIPO_Read_Taxa_Zscores(fp_coord,ref_tree); *\/ */ /* for(i=0;in_otu;i++) ref_tree->io->z_scores[i] = TIPO_Read_One_Taxon_Zscore(fp_coord,ref_tree->a_nodes[i]->name,ref_tree); */ /* TIPO_Normalize_Zscores(ref_tree); */ /* /\* Find matching tips *\/ */ /* for(i=0;in_otu;j++) */ /* { */ /* for(k=0;kn_otu;k++) */ /* { */ /* if(!strcmp(ref_io->long_tax_names[j],list_io->long_tax_names[k])) */ /* { */ /* list_tree[i]->a_nodes[k]->ext_node = ref_tree->a_nodes[j]; */ /* break; */ /* } */ /* } */ /* if(k == ref_tree->n_otu) */ /* { */ /* PhyML_Printf("\n. Could not find matching tips for \"%s\" (tree %d)",ref_tree->a_nodes[j]->name,i); */ /* PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ /* } */ /* } */ /* PhyML_Printf("\n. Getting ancestors"); fflush(NULL); */ /* Update_Ancestors(ref_tree->n_root,ref_tree->n_root->v[2],ref_tree); */ /* Update_Ancestors(ref_tree->n_root,ref_tree->n_root->v[1],ref_tree); */ /* for(i=0;in_root,list_tree[i]->n_root->v[2],list_tree[i]); */ /* Update_Ancestors(list_tree[i]->n_root,list_tree[i]->n_root->v[1],list_tree[i]); */ /* list_tree[i]->n_root->anc = NULL; */ /* } */ /* PhyML_Printf("\n. Getting bipartitions"); fflush(NULL); */ /* Free_Bip(ref_tree); */ /* Alloc_Bip(ref_tree); */ /* Get_Bip(ref_tree->a_nodes[0], */ /* ref_tree->a_nodes[0]->v[0], */ /* ref_tree); */ /* for(i=0;ia_nodes[0], */ /* list_tree[i]->a_nodes[0]->v[0], */ /* list_tree[i]); */ /* } */ /* PhyML_Printf("\n. Getting tip ranks"); fflush(NULL); */ /* /\* TIPO_Get_Tips_Y_Rank(ref_tree); *\/ */ /* TIPO_Get_Tips_Y_Rank_From_Zscores(ref_tree); */ /* /\* PhyML_Printf("\n. Minimizing"); fflush(NULL); *\/ */ /* /\* TIPO_Minimize_Tip_Order_Score(n_trees,list_tree,ref_tree); *\/ */ /* PhyML_Printf("\n. N_OTU = %d",ref_tree->n_otu); */ /* TIPO_Untangle_Tree(ref_tree); */ /* PhyML_Printf("\n ** ORIGINAL %f",ref_tree->tip_order_score); */ /* /\* i = 0; *\/ */ /* /\* do *\/ */ /* /\* { *\/ */ /* /\* /\\* TIPO_Get_Tips_Y_Rank_From_Zscores(ref_tree); *\\/ *\/ */ /* /\* TIPO_Randomize_Tip_Y_Ranks(ref_tree); *\/ */ /* /\* TIPO_Untangle_Tree(ref_tree); *\/ */ /* /\* PhyML_Printf("\n ** %f",ref_tree->tip_order_score); *\/ */ /* /\* i++; *\/ */ /* /\* }while(i < 5000); *\/ */ /* Test_Node_Table_Consistency(ref_tree); */ /* ref_tree->ps_tree = DR_Make_Tdraw_Struct(ref_tree); */ /* DR_Get_Tree_Coord(ref_tree); */ /* for(j=0;jn_otu;j++) */ /* { */ /* ref_tree->ps_tree->ycoord[j] = */ /* (ref_tree->a_nodes[j]->y_rank/ref_tree->n_otu)* */ /* ref_tree->ps_tree->page_height; */ /* } */ /* ps_tree = (FILE *)fopen("order_tree.ps","w"); */ /* list_io->z_scores = (phydbl *)mCalloc(ref_tree->n_otu,sizeof(phydbl)); */ /* DR_Print_Postscript_Header(1,ps_tree); */ /* for(i=0;irates = RATES_Make_Rate_Struct(tree->n_otu); */ /* RATES_Init_Rate_Struct(tree->rates,tree->n_otu); */ /* TIMES_Least_Square_Node_Times(tree->e_root,tree); */ /* TIMES_Adjust_Node_Times(tree); */ /* RATES_Update_Edge_Lengths(tree); */ /* tree->ps_tree = DR_Make_Tdraw_Struct(tree); */ /* DR_Init_Tdraw_Struct(tree->ps_tree); */ /* DR_Get_Tree_Box_Width(tree->ps_tree,tree); */ /* Dist_To_Root(tree); */ /* tree->ps_tree->max_dist_to_root = DR_Get_Max_Dist_To_Root(tree); */ /* for(j=0;jn_otu;j++) tree->io->z_scores[j] = ref_tree->io->z_scores[tree->a_nodes[j]->ext_node->num]; */ /* TIPO_Get_Tips_Y_Rank_From_Zscores(tree); */ /* TIPO_Untangle_Tree(tree); */ /* for(j=0;jn_otu;j++) tree->ps_tree->ycoord[j] = (tree->a_nodes[j]->y_rank/tree->n_otu)*tree->ps_tree->page_height; */ /* /\* for(j=0;jn_otu;j++) tree->ps_tree->ycoord[j] = ref_tree->ps_tree->ycoord[tree->a_nodes[j]->ext_node->num]; *\/ */ /* for(j=0;jn_otu;j++) list_io->z_scores[j] = ref_io->z_scores[tree->a_nodes[j]->ext_node->num]; */ /* DR_Get_Y_Coord(YES,tree->ps_tree,tree); */ /* DR_Get_X_Coord( NO,tree->ps_tree,tree); */ /* if(!i) DR_Print_Tree_Postscript(1,YES,ps_tree,tree); */ /* else DR_Print_Tree_Postscript(1, NO,ps_tree,tree); */ /* } */ /* DR_Print_Postscript_EOF(ps_tree); */ /* fclose(ps_tree); */ /* ps_tree = (FILE *)fopen("ref_tree.ps","w"); */ /* DR_Print_Postscript_Header(1,ps_tree); */ /* tree = ref_tree; */ /* tree->rates = RATES_Make_Rate_Struct(tree->n_otu); */ /* RATES_Init_Rate_Struct(tree->rates,tree->n_otu); */ /* TIMES_Least_Square_Node_Times(tree->e_root,tree); */ /* TIMES_Adjust_Node_Times(tree); */ /* RATES_Update_Edge_Lengths(tree); */ /* DR_Init_Tdraw_Struct(tree->ps_tree); */ /* DR_Get_Tree_Box_Width(tree->ps_tree,tree); */ /* Dist_To_Root(tree->n_root,tree); */ /* tree->ps_tree->max_dist_to_root = DR_Get_Max_Dist_To_Root(tree); */ /* TIPO_Get_Tips_Y_Rank_From_Zscores(tree); */ /* /\* TIPO_Untangle_Tree(tree); *\/ */ /* for(j=0;jn_otu;j++) tree->ps_tree->ycoord[j] = (tree->a_nodes[j]->y_rank/tree->n_otu)*tree->ps_tree->page_height; */ /* DR_Get_Y_Coord(YES,tree->ps_tree,tree); */ /* DR_Get_X_Coord( NO,tree->ps_tree,tree); */ /* DR_Print_Tree_Postscript(1,YES,ps_tree,tree); */ /* DR_Print_Postscript_EOF(ps_tree); */ /* fclose(ps_tree); */ /* PhyML_Printf("\n"); */ /* fclose(fp_ref_tree); */ /* fclose(fp_list_tree); */ /* fclose(fp_coord); */ /* } */ int TIPO_main(int argc, char **argv) { t_tree *tree; option *io; FILE *fp_tree_file, *fp_coord_file; int i; /* Rprintf("%s\n",tree_file_name[0]); */ /* Rprintf("%s\n",coord_file_name[0]); */ srand(time(NULL)); rand(); fp_tree_file = (FILE *)fopen(argv[1],"r"); fp_coord_file = (FILE *)fopen(argv[2],"r"); io = (option *)Make_Input(); io->fp_in_tree = fp_tree_file; /* Read_Tree_File(io); */ tree = io->treelist->tree[0]; tree->io = io; tree->io->z_scores = (phydbl *)mCalloc(tree->n_otu,sizeof(phydbl)); for(i=0;in_otu;i++) tree->io->z_scores[i] = TIPO_Read_One_Taxon_Zscore(fp_coord_file,tree->a_nodes[i]->name,1,tree); /* TIPO_Normalize_Zscores(tree); */ Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); TIPO_Get_Tips_Y_Rank_From_Zscores(tree); /* TIPO_Get_Tips_Y_Rank(tree); */ tree->geo_mig_sd = 0.1; Generic_Brent_Lk(&(tree->geo_mig_sd), 1.E-3,1.E+2,1.E-6, 100,NO, &Wrap_Geo_Lk, NULL,tree,NULL,NO); PhyML_Printf("\n. sd=%f",tree->geo_mig_sd); fclose(fp_tree_file); fclose(fp_coord_file); return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Z_scores have already been recorder here */ void TIPO_Get_Min_Number_Of_Tip_Permut(t_tree *tree) { Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); TIPO_Get_Tips_Y_Rank_From_Zscores(tree); TIPO_Untangle_Tree(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Get_Tips_Y_Rank(t_tree *tree) { phydbl curr_rank; curr_rank = .0; TIPO_Get_Tips_Y_Rank_Pre(tree->n_root,tree->n_root->v[2],&curr_rank,tree); TIPO_Get_Tips_Y_Rank_Pre(tree->n_root,tree->n_root->v[1],&curr_rank,tree); if(curr_rank != tree->n_otu) { PhyML_Printf("\n. tree->n_otu = %d curr_rank = %d",tree->n_otu,curr_rank); PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Get_Tips_Y_Rank_Pre(t_node *a, t_node *d, phydbl *curr_rank, t_tree *tree) { if(d->tax) { d->y_rank = *curr_rank; *curr_rank += 1.; return; } else { int i; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { TIPO_Get_Tips_Y_Rank_Pre(d,d->v[i],curr_rank,tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Get_All_Y_Rank(t_tree *tree) { tree->sum_y_dist_sq = .0; tree->sum_y_dist = .0; TIPO_Get_All_Y_Rank_Pre(tree->n_root,tree->n_root->v[2],tree); TIPO_Get_All_Y_Rank_Pre(tree->n_root,tree->n_root->v[1],tree); tree->n_root->y_rank = (tree->n_root->v[2]->y_rank+tree->n_root->v[1]->y_rank)/2.; tree->n_root->y_rank_min = MIN(tree->n_root->v[2]->y_rank_min,tree->n_root->v[1]->y_rank_min); tree->n_root->y_rank_max = MAX(tree->n_root->v[2]->y_rank_max,tree->n_root->v[1]->y_rank_max); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Get_All_Y_Rank_Pre(t_node *a, t_node *d, t_tree *tree) { if(d->tax) { d->y_rank_min = d->y_rank; d->y_rank_max = d->y_rank; return; } else { int i; int dir1,dir2; phydbl v1,v2; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { TIPO_Get_All_Y_Rank_Pre(d,d->v[i],tree); } } dir1 = dir2 = -1; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { if(dir1 < 0) dir1 = i; else dir2 = i; } } v1 = d->v[dir1]->y_rank; v2 = d->v[dir2]->y_rank; d->y_rank = (v1+v2)/2.; tree->sum_y_dist_sq += POW(v1-v2,2); tree->sum_y_dist += FABS(v1-v2); d->y_rank_min = MIN(d->v[dir1]->y_rank_min,d->v[dir2]->y_rank_min); d->y_rank_max = MAX(d->v[dir1]->y_rank_max,d->v[dir2]->y_rank_max); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Swap_One_Node(t_node *d, t_tree *tree) { if(d->tax) return; else { int i; int dir1, dir2; t_node *tmp_n; t_edge *tmp_e; if(d != tree->n_root) { dir1 = dir2 = -1; for(i=0;i<3;i++) { if((d->v[i] != d->anc) && (d->b[i] != tree->e_root)) { if(dir1 < 0) dir1 = i; else dir2 = i; } } } else { dir1 = 0; dir2 = 1; } tmp_n = d->v[dir2]; d->v[dir2] = d->v[dir1]; d->v[dir1] = tmp_n; tmp_e = d->b[dir2]; d->b[dir2] = d->b[dir1]; d->b[dir1] = tmp_e; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Minimize_Tip_Order_Score(int n_trees, t_tree **list_tree, t_tree *ref_tree) { int i,j; phydbl score,min_score,old_min_score; phydbl diff,eps; t_node **node_table; int swapped; t_node *tmp; eps = 1.E-3; old_min_score = min_score = score = INT_MAX; /* TIPO_Print_Tip_Ordered(ref_tree); */ do { for(i=ref_tree->n_otu;i<2*ref_tree->n_otu-1;i++) { TIPO_Swap_One_Node(ref_tree->a_nodes[i],ref_tree); TIPO_Get_Tips_Y_Rank(ref_tree); score = (phydbl)TIPO_Untangle_Tree_List(n_trees,list_tree,ref_tree); if(score == -1) { return; } if(score < min_score) { min_score = score; PhyML_Printf("\n- Score = %f",score); } else { TIPO_Swap_One_Node(ref_tree->a_nodes[i],ref_tree); TIPO_Get_Tips_Y_Rank(ref_tree); /* PhyML_Printf("\n+ Score = %f",score); */ } } diff = fabs(old_min_score - min_score); old_min_score = min_score; }while(diff > eps); PhyML_Printf("\n"); node_table = (t_node **)mCalloc(ref_tree->n_otu,sizeof(t_node *)); for(i=0;in_otu;i++) { for(j=0;jn_otu;j++) { if(!strcmp(ref_tree->io->short_tax_names[i],ref_tree->a_nodes[j]->name)) { Free(ref_tree->a_nodes[j]->name); ref_tree->a_nodes[j]->name = (char *)mCalloc((int)strlen(ref_tree->io->long_tax_names[i])+1,sizeof(char)); strcpy(ref_tree->a_nodes[j]->name,ref_tree->io->long_tax_names[i]); break; } } } for(i=0;in_otu;i++) node_table[i] = ref_tree->a_nodes[i]; /* bubble sort of conflict nodes according to their y_rank */ do { swapped = NO; for(i=0;in_otu-1;i++) { if(node_table[i]->y_rank > node_table[i+1]->y_rank) { swapped = YES; tmp = node_table[i]; node_table[i] = node_table[i+1]; node_table[i+1] = tmp; } } }while(swapped == YES); for(i=0;in_otu;i++) { PhyML_Printf("\n%s",node_table[i]->name,node_table[i]->y_rank); } Free(node_table); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Print_Tip_Ordered(t_tree *tree) { TIPO_Print_Tip_Ordered_Pre(tree->n_root,tree->n_root->v[2],tree); TIPO_Print_Tip_Ordered_Pre(tree->n_root,tree->n_root->v[1],tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Print_Tip_Ordered_Pre(t_node *a, t_node *d, t_tree *tree) { if(d->tax) { PhyML_Printf("\n. %f \"%s\"",d->y_rank,d->name); } else { int i,dir1,dir2; dir1 = dir2 = -1; for(i=0;i<3;i++) { if((d->v[i] != a) && (d->b[i] != tree->e_root)) { if(dir1 < 0) dir1 = i; else dir2 = i; } } if(d->v[dir1]->y_rank < d->v[dir2]->y_rank) { TIPO_Print_Tip_Ordered_Pre(d,d->v[dir1],tree); TIPO_Print_Tip_Ordered_Pre(d,d->v[dir2],tree); } else { TIPO_Print_Tip_Ordered_Pre(d,d->v[dir2],tree); TIPO_Print_Tip_Ordered_Pre(d,d->v[dir1],tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int TIPO_Untangle_Tree_List(int n_trees, t_tree **list_tree, t_tree *ref_tree) { int i,j; int tree_score,score; score = 0; for(i=0;in_otu;j++) list_tree[i]->a_nodes[j]->y_rank = list_tree[i]->a_nodes[j]->ext_node->y_rank; tree_score = TIPO_Untangle_Tree(list_tree[i]); /* PhyML_Printf(" score = %3d",tree_score); */ score += tree_score; if(tree_score < 0) { return -1; } } return score; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIPO_Untangle_Tree(t_tree *tree) { int conflict; int n_trials; t_node **node_table; int i,swapped; t_node *tmp; node_table = (t_node **)mCalloc(tree->n_otu,sizeof(t_node *)); for(i=0;in_otu;i++) node_table[i] = tree->a_nodes[i]; for(i=0;in_otu;i++) tree->a_nodes[i]->y_rank_ori = tree->a_nodes[i]->y_rank; /* bubble sort of nodes according to their y_rank */ do { swapped = NO; for(i=0;in_otu-1;i++) { if(node_table[i]->y_rank > node_table[i+1]->y_rank) { swapped = YES; tmp = node_table[i]; node_table[i] = node_table[i+1]; node_table[i+1] = tmp; } } } while(swapped == YES); /* Work out the y_rank values for every internal node given the external node ranks */ TIPO_Get_All_Y_Rank(tree); tree->tip_order_score = .0; n_trials = 0; do { conflict= NO; /* Recusrssive untangling of the tree */ TIPO_Untangle_Node(tree->n_root,tree->n_root->v[2],node_table,&conflict,tree); TIPO_Untangle_Node(tree->n_root,tree->n_root->v[1],node_table,&conflict,tree); n_trials++; if(n_trials > 2) /* We should have been able to untangle the tree after just one tree traversal */ { int i; FILE *ps_tree; PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); ps_tree = (FILE *)fopen("failed_tree.ps","w"); Test_Node_Table_Consistency(tree); tree->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->rates,tree->io->rates,tree->n_otu); tree->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->times,tree->io->times,tree->n_otu); TIMES_Least_Square_Node_Times(tree->e_root,tree); TIMES_Adjust_Node_Times(tree); RATES_Update_Edge_Lengths(tree); DR_Print_Postscript_Header(1,ps_tree); tree->ps_tree = DR_Make_Tdraw_Struct(tree); DR_Init_Tdraw_Struct(tree->ps_tree); DR_Get_Tree_Box_Width(tree->ps_tree,tree); Dist_To_Root(tree); tree->ps_tree->max_dist_to_root = DR_Get_Max_Dist_To_Root(tree); for(i=0;in_otu;i++) tree->ps_tree->ycoord[i] = tree->a_nodes[i]->y_rank * (int)(tree->ps_tree->page_height / (tree->n_otu)); DR_Get_X_Coord(NO,tree->ps_tree,tree); DR_Get_Y_Coord(YES,tree->ps_tree,tree); DR_Print_Tree_Postscript(1,NO,ps_tree,tree); DR_Print_Postscript_EOF(ps_tree); fclose(ps_tree); Warn_And_Exit(""); } }while(conflict == YES); Free(node_table); return tree->tip_order_score; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Untangle_Node(t_node *a, t_node *d, t_node **node_table, int *conflict, t_tree *tree) { if(d->tax) return; else { int i,j; int d_a; int beg,end; phydbl min,max; t_node *lca; t_node **conflict_tips, **anc_conflict; int n_conflicts; phydbl eps,tmp_rank; t_node *tmp_node; int n_moved; int n_anc_conflicts; anc_conflict = NULL; d_a = -1; /* It is a post order traversal */ for(i=0;i<3;i++) { if((d->v[i] != d->anc) && (d->b[i] != tree->e_root)) { TIPO_Untangle_Node(d,d->v[i],node_table,conflict,tree); } } lca = NULL; eps = 1.E-10; /* Find direction fron node d ((d)escendant) to a ((a)ncestor) */ for(i=0;i<3;i++) { if((d->v[i] == d->anc) || (d->b[i] == tree->e_root)) { d_a = i; break; } } /* y_rank_min is the minimum rank among all the ranks of the tips that can be reached when going from a to d */ min = d->y_rank_min; max = d->y_rank_max; /* Get the list of tip nodes which ranks are between d->y_rank_min and d->y_rank_max */ n_conflicts = 0; for(i=0;in_otu;i++) { if((node_table[i]->y_rank > min - eps) && (node_table[i]->y_rank < max + eps)) { n_conflicts++; } } conflict_tips = NULL; for(i=0;in_otu;i++) { if(node_table[i]->y_rank > min - eps) { conflict_tips = node_table+i; break; } } beg = 0; end = n_conflicts; n_moved = 0; n_anc_conflicts = 0; do { for(i=beg;ibip_size[d_a]) if(conflict_tips[i] == d->bip_node[d_a][j]) break; if(j == d->bip_size[d_a]) /* conflict_tips[i] does not belong to the list of descendant of node d. It is therefore responsible for a conflict */ { *conflict = YES; /* printf("\n. Moving %d with rank %f",conflict_tips[i]->num,conflict_tips[i]->y_rank); */ n_moved++; /* Move from conflict_tips[i] towards the root as long as the rank of the node lca is between min and max */ lca = conflict_tips[i]; while(lca->y_rank_min > min && lca->y_rank_max < max) lca = lca->anc; if(lca->y_rank_min > max && lca->y_rank_max > max) { PhyML_Printf("\n. lca = %d (%d)",lca->num,lca==tree->n_root); PhyML_Printf("\n. Err in file %s at line %d",__FILE__,__LINE__); Warn_And_Exit(""); } if(lca->y_rank_min < min && lca->y_rank_max < min) { PhyML_Printf("\n. lca = %d (root ? %d) (tip ? %d)",lca->num,lca==tree->n_root,lca->tax); PhyML_Printf("\n. lca->y_rank_min = %f lca->y_rank_max = %f",lca->y_rank_min,lca->y_rank_max); PhyML_Printf("\n. min=%f max=%f",min,max); PhyML_Printf("\n. Err in file %s at line %d",__FILE__,__LINE__); Warn_And_Exit(""); } if(lca->tax) { PhyML_Printf("\n. lca (%d) cannot be a tip.",lca->num); PhyML_Printf("\n. lca->anc->y_rank=%f",lca->anc->y_rank); PhyML_Printf("\n. lca->y_rank=%f",lca->y_rank); PhyML_Printf("\n. lca->y_rank_min=%f lca=>y_rank_max=%f",lca->y_rank_min,lca->y_rank_max); PhyML_Printf("\n. min=%f max=%f",min,max); PhyML_Printf("\n. %p %p",lca,conflict_tips[i]); PhyML_Printf("\n. Err in file %s at line %d",__FILE__,__LINE__); Warn_And_Exit(""); } /* Have you found lca previously ? */ for(j=0;jtip_order_score+=1.; */ /* tree->tip_order_score+=(lca->y_rank_max-lca->y_rank_min); */ n_anc_conflicts++; anc_conflict = (t_node **)realloc(anc_conflict,n_anc_conflicts*sizeof(t_node *)); anc_conflict[n_anc_conflicts-1] = lca; } /* PhyML_Printf("\n. Detected conflict for ``%s'' (rank:%f min=%f max=%f lca=%f)", */ /* conflict_tips[i]->name, */ /* conflict_tips[i]->y_rank, */ /* min,max,lca->y_rank); */ /* Solve the conflict by shifting tip nodes to the left or to the right */ if(lca->y_rank > d->y_rank) { end--; /* max-=1.; */ max = conflict_tips[end-1]->y_rank; /* printf("\n. max=%f %f",max,conflict_tips[end-1]->y_rank); */ for(j=i;jnum,conflict_tips[j+1]->num, */ /* conflict_tips[j]->y_rank,conflict_tips[j+1]->y_rank); */ tmp_rank = conflict_tips[j]->y_rank; conflict_tips[j]->y_rank = conflict_tips[j+1]->y_rank; conflict_tips[j+1]->y_rank = tmp_rank; tmp_node = conflict_tips[j]; conflict_tips[j] = conflict_tips[j+1]; conflict_tips[j+1] = tmp_node; tree->tip_order_score += fabs(conflict_tips[j]->y_rank - conflict_tips[j+1]->y_rank)/n_conflicts; /* PhyML_Printf(" to (%d,%d) (%f,%f)", */ /* conflict_tips[j]->num,conflict_tips[j+1]->num, */ /* conflict_tips[j]->y_rank,conflict_tips[j+1]->y_rank); */ } } else { beg++; /* min+=1.; */ min = conflict_tips[beg]->y_rank; /* printf("\n. min=%f %f",min,conflict_tips[beg]->y_rank); */ for(j=i;j>0;j--) { /* PhyML_Printf("\n- Moved (%d,%d) from (%f,%f)", */ /* conflict_tips[j]->num,conflict_tips[j-1]->num, */ /* conflict_tips[j]->y_rank,conflict_tips[j-1]->y_rank); */ tmp_rank = conflict_tips[j]->y_rank; conflict_tips[j]->y_rank = conflict_tips[j-1]->y_rank; conflict_tips[j-1]->y_rank = tmp_rank; tmp_node = conflict_tips[j]; conflict_tips[j] = conflict_tips[j-1]; conflict_tips[j-1] = tmp_node; tree->tip_order_score += fabs(conflict_tips[j]->y_rank - conflict_tips[j+1]->y_rank)/n_conflicts; /* PhyML_Printf(" to (%d,%d) (%f,%f)", */ /* conflict_tips[j]->num,conflict_tips[j-1]->num, */ /* conflict_tips[j]->y_rank,conflict_tips[j-1]->y_rank); */ } } /* printf("\n"); */ /* for(j=0;jy_rank); */ /* printf("\n. min=%f max=%f",min,max); */ /* printf("\n. Node %d has now rank %f",c_node->num,c_node->y_rank); */ /* Update internal nodes y ranks */ TIPO_Get_All_Y_Rank(tree); break; } } }while(n_moved + d->bip_size[d_a] != n_conflicts); for(i=0;in_otu;i++) { if((tree->a_nodes[i]->y_rank > min - eps) && (tree->a_nodes[i]->y_rank < max + eps)) { For(j,d->bip_size[d_a]) { if(tree->a_nodes[i] == d->bip_node[d_a][j]) break; } if(j == d->bip_size[d_a]) { printf("\n. Conflict remaining for node %d (%d)",d->num,a->num); PhyML_Printf("\n. Err in file %s at line %d",__FILE__,__LINE__); Warn_And_Exit(""); } } } if(anc_conflict) Free(anc_conflict); return; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int TIPO_Check_Tip_Ranks(t_tree *tree) { int i,j; phydbl eps; eps = 1.E-6; for(i=0;in_otu-1;i++) { for(j=i+1;jn_otu;j++) { if(fabs(tree->a_nodes[i]->y_rank - tree->a_nodes[j]->y_rank) < eps) { return 0; } } } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Read_Taxa_Zscores(FILE *fp_coord, t_tree *tree) { char *name,*line; phydbl z; int i; name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); line = (char *)mCalloc(T_MAX_LINE,sizeof(char)); if(!fgets(line,T_MAX_LINE,fp_coord)) { PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } Free(line); do { if(fscanf(fp_coord,"%s\t%lf\n",name,&z) == EOF) break; PhyML_Printf("\n. Read %s. Z-score: %f",name,z); for(i=0;in_otu;i++) if(!strcmp(tree->io->long_tax_names[i],name)) break; if(i == tree->n_otu) { PhyML_Printf("\n. Could not find taxon '%s' in coordinate file.",name); PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } tree->io->z_scores[i] = z; }while(1); Free(name); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Read_Taxa_Coordinates(FILE *fp_coord, t_tree *tree) { char *name,*line; phydbl lon, lat; int i; name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); line = (char *)mCalloc(T_MAX_LINE,sizeof(char)); if(!fgets(line,T_MAX_LINE,fp_coord)) { PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } Free(line); tree->io->lat = (phydbl *)mCalloc(tree->n_otu,sizeof(phydbl)); tree->io->lon = (phydbl *)mCalloc(tree->n_otu,sizeof(phydbl)); do { if(fscanf(fp_coord,"%s\t%lf\t%lf\n",name,&lat,&lon) == EOF) break; PhyML_Printf("\n. Read %s %f %f",name,lat,lon); for(i=0;in_otu;i++) if(!strcmp(tree->io->long_tax_names[i],name)) break; if(i == tree->n_otu) { PhyML_Printf("\n. Could not find taxon '%s' in coordinate file.",name); PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } tree->io->lat[i] = lat; tree->io->lon[i] = lon; }while(1); Free(name); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Get_Tips_Y_Rank_From_Zscores(t_tree *tree) { int i; for(i=0;in_otu;i++) tree->a_nodes[i]->y_rank = .0; /* Randomization in order to avoid ties */ for(i=0;in_otu;i++) tree->io->z_scores[i] += Rnorm(0.0,0.001); for(i=0;in_otu;i++) tree->a_nodes[i]->y_rank = tree->io->z_scores[i]; /* for(i=0;in_otu;i++) tree->a_nodes[i]->y_rank = .0; */ /* for(i=0;in_otu-1;i++) */ /* { */ /* for(j=i+1;jn_otu;j++) */ /* { */ /* if(tree->io->z_scores[i] > tree->io->z_scores[j]) */ /* { */ /* tree->a_nodes[i]->y_rank += 1.0; */ /* } */ /* else */ /* if(tree->io->z_scores[i] < tree->io->z_scores[j]) */ /* { */ /* tree->a_nodes[j]->y_rank += 1.0; */ /* } */ /* else */ /* { */ /* PhyML_Printf("\n. Ties not allowed.\n"); */ /* PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ /* } */ /* } */ /* for(i=0;in_otu;i++) printf("- %f\n",tree->a_nodes[i]->y_rank); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Sort translation table such that tree->a_nodes[i]->name == tree->io->short_tax_name[i] for all i */ void TIPO_Sort_Translation_Table(t_tree *tree) { int i,j; char *s; Test_Node_Table_Consistency(tree); for(i=0;in_otu-1;i++) { for(j=i+1;jn_otu;j++) { if(!strcmp(tree->a_nodes[i]->name,tree->io->short_tax_names[j])) { s = tree->io->short_tax_names[i]; tree->io->short_tax_names[i] = tree->io->short_tax_names[j]; tree->io->short_tax_names[j] = s; s = tree->io->long_tax_names[i]; tree->io->long_tax_names[i] = tree->io->long_tax_names[j]; tree->io->long_tax_names[j] = s; break; } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Randomize_Tip_Y_Ranks(t_tree *tree) { int i; phydbl rk_tmp; int rnd_node_num; for(i=0;in_otu;i++) tree->a_nodes[i]->y_rank_ori = tree->a_nodes[i]->y_rank; for(i=0;in_otu;i++) { rnd_node_num = Rand_Int(0,tree->n_otu-1); rk_tmp = tree->a_nodes[rnd_node_num]->y_rank; tree->a_nodes[rnd_node_num]->y_rank = tree->a_nodes[i]->y_rank; tree->a_nodes[i]->y_rank = rk_tmp; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIPO_Read_One_Taxon_Zscore(FILE *fp_coord, char *seqname_qry, int col, t_tree *tree) { char *seqname, *place; phydbl lat; seqname = (char *)mCalloc(T_MAX_NAME,sizeof(char)); place = (char *)mCalloc(T_MAX_NAME,sizeof(char)); rewind(fp_coord); /* skip first line */ /* if(!fgets(line,T_MAX_LINE,fp_coord)) */ /* { */ /* PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ /* Free(line); */ do { /* if(fscanf(fp_coord,"%s\t%s\t%lf\t%lf\t%d\n",seqname,place,&lat,&lon,&year) == EOF) */ /* if(fscanf(fp_coord,"%s\t%s\t%lf\t%lf\n",seqname,place,&lat,&lon) == EOF) */ /* if(fscanf(fp_coord,"%s\t%lf\t%lf\n",seqname,&lat,&lon) == EOF) */ if(fscanf(fp_coord,"%s %lf\n",seqname,&lat) == EOF) { PhyML_Printf("\n. Could not find sequence '%s' in coordinate file",seqname_qry); PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } if(!strcmp(seqname,seqname_qry)) break; }while(1); /* PhyML_Printf("\n. Found %20s %s @ %10.2f %10.2f. Recording %10.2f",seqname,place,lat,lon,(col==1)?lat:lon); */ Free(seqname); Free(place); /* if(col == 1) return lat; */ /* else if(col == 2) return lon; */ /* else return -1.; */ return lat; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIPO_Normalize_Zscores(t_tree *tree) { int i; phydbl min_z,max_z; phydbl eps; eps = 1.E-10; min_z = FLT_MAX; for(i=0;in_otu;i++) { if(tree->io->z_scores[i] < min_z) { min_z = tree->io->z_scores[i]; } } max_z = -FLT_MAX; for(i=0;in_otu;i++) { if(tree->io->z_scores[i] > max_z) { max_z = tree->io->z_scores[i]; } } for(i=0;in_otu;i++) tree->io->z_scores[i] = (tree->io->z_scores[i] - min_z)/(max_z-min_z+eps); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIPO_Lk(t_tree *tree) { tree->geo_lnL = 0.0; TIPO_Lk_Post(tree->n_root,tree->n_root->v[2],tree); TIPO_Lk_Post(tree->n_root,tree->n_root->v[1],tree); TIPO_Lk_Core(NULL,tree->n_root,tree); return(tree->geo_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIPO_Lk_Post(t_node *a, t_node *d, t_tree *tree) { if(!d->tax) { int i; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { TIPO_Lk_Post(d,d->v[i],tree); } } TIPO_Lk_Core(a,d,tree); } return .0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl TIPO_Lk_Core(t_node *a, t_node *d, t_tree *tree) { int i,j; int d_v1,d_v2,v1_d,v2_d; t_node *v1, *v2; phydbl dist,dens,min_dist; if(d->tax) { PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } if(d == tree->n_root) { d_v1 = 0; d_v2 = 1; } else { d_v1 = d_v2 = -1; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { if(d_v1 < 0) d_v1 = i; else d_v2 = i; } } } v1 = d->v[d_v1]; v2 = d->v[d_v2]; v1_d = v2_d = -1; if(d == tree->n_root) { for(i=0;i<3;i++) { if(v1->b[i] == tree->e_root) v1_d = i; if(v2->b[i] == tree->e_root) v2_d = i; } } else { for(i=0;i<3;i++) { if(v1->v[i] == d) v1_d = i; if(v2->v[i] == d) v2_d = i; } } dens = 0.0; min_dist = FLT_MAX; For(i,v1->bip_size[v1_d]) { For(j,v2->bip_size[v2_d]) { dist = fabs(v1->bip_node[v1_d][i]->y_rank - v2->bip_node[v2_d][j]->y_rank); if(dist < min_dist) min_dist = dist; dens += Dnorm(dist,0.0,tree->geo_mig_sd); /* printf("\n. dist=%f dens=%f %f %f", */ /* dist,Dnorm(dist,0.0,tree->geo_mig_sd), */ /* v1->bip_node[v1_d][i]->y_rank, */ /* v2->bip_node[v2_d][j]->y_rank); */ } } /* printf("\n. min_dist=%f dens=%f", */ /* min_dist,Dnorm(dist,0.0,tree->geo_mig_sd)); */ /* dens = Dnorm(min_dist,0.0,tree->geo_mig_sd); */ tree->geo_lnL += log(dens); return tree->geo_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/tiporder.h000066400000000000000000000040671501136442400212010ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef TIPORDER_H #define TIPORDER_H #include "times.h" #include "spr.h" #include "utilities.h" #include "lk.h" #include "optimiz.h" #include "bionj.h" #include "models.h" #include "free.h" #include "help.h" #include "simu.h" #include "eigen.h" #include "pars.h" #include "alrt.h" #include "m4.h" #include "draw.h" #include "rates.h" #include "mcmc.h" #include "io.h" #include "stats.h" void TIPO_Get_Tips_Y_Rank(t_tree *tree); void TIPO_Get_Tips_Y_Rank_Pre(t_node *a, t_node *d, phydbl *curr_rank, t_tree *tree); void TIPO_Get_All_Y_Rank(t_tree *tree); void TIPO_Get_All_Y_Rank_Pre(t_node *a, t_node *d, t_tree *tree); void TIPO_Swap_One_Node(t_node *d, t_tree *tree); void TIPO_Minimize_Tip_Order_Score(int n_trees, t_tree **list_tree, t_tree *ref_tree); void TIPO_Print_Tip_Ordered(t_tree *ref_tree); void TIPO_Print_Tip_Ordered_Pre(t_node *a, t_node *d, t_tree *ref_tree); phydbl TIPO_Untangle_Tree(t_tree *tree); void TIPO_Untangle_Node(t_node *a, t_node *d, t_node **node_table, int *conflict, t_tree *tree); int TIPO_Untangle_Tree_List(int n_trees, t_tree **list_tree, t_tree *ref_tree); int TIPO_Check_Tip_Ranks(t_tree *tree); void TIPO_Read_Taxa_Coordinates(FILE *fp_coord, t_tree *tree); void TIPO_Get_Tips_Y_Rank_From_Zscores(t_tree *tree); void TIPO_Init_Tip_Num(t_tree *tree); void TIPO_Read_Taxa_Zscores(FILE *fp_coord, t_tree *tree); void TIPO_Sort_Translation_Table(t_tree *tree); void TIPO_Randomize_Tip_Y_Ranks(t_tree *tree); phydbl TIPO_Read_One_Taxon_Zscore(FILE *fp, char *seqname_qry, int col, t_tree *tree); void TIPO_Normalize_Zscores(t_tree *tree); void TIPO_Get_Min_Number_Of_Tip_Permut(t_tree *tree); phydbl TIPO_Lk(t_tree *tree); phydbl TIPO_Lk_Post(t_node *a, t_node *d, t_tree *tree); phydbl TIPO_Lk_Core(t_node *a, t_node *d, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/utilities.c000066400000000000000000013403001501136442400213510ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "utilities.h" #include "assert.h" #include "tbe.h" #ifdef BEAGLE #include "beagle_utils.h" #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl String_To_Dbl(char *string) { phydbl buff; char *endptr; if (!string) { PhyML_Fprintf(stderr, "\n. String object empty."); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } errno = !ERANGE; buff = strtod(string, &endptr); if (string == endptr || errno == ERANGE) { PhyML_Fprintf(stderr, "\n. Error in translating string '%s' to double.", string); PhyML_Fprintf(stderr, "\n. %d", errno == ERANGE); PhyML_Fprintf(stderr, "\n. buff = %f", buff); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } return buff; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int String_To_Int(char *string) { int buff; char *endptr; if (!string) { PhyML_Fprintf(stderr, "\n. String object empty."); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } errno = !ERANGE; buff = (int)strtol(string, &endptr, 10); if (string == endptr || errno == ERANGE) { PhyML_Fprintf(stderr, "\n. Error in translating string '%s' to integer.", string); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } return buff; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Unroot_Tree(char **subtrees) { char **tmp_sub; int degree, i, j; PhyML_Printf("\n. Removing the root...\n"); tmp_sub = Sub_Trees(subtrees[0], °ree); if (degree >= 2) { strcpy(subtrees[2], subtrees[1]); Clean_Multifurcation(tmp_sub, degree, 2); for (j = 0; j < 2; j++) strcpy(subtrees[j], tmp_sub[j]); } else { tmp_sub = Sub_Trees(subtrees[1], °ree); strcpy(subtrees[2], subtrees[0]); Clean_Multifurcation(tmp_sub, degree, 2); for (j = 0; j < 2; j++) strcpy(subtrees[j], tmp_sub[j]); } for (i = 0; i < degree; i++) Free(tmp_sub[i]); Free(tmp_sub); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Edge_Dirs(t_edge *b, t_node *a, t_node *d, t_tree *tree) { int i; if (a == b->rght) { PhyML_Fprintf(stderr, "\n. a->num = %d ; d->num = %d", a->num, d->num); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } if (d == b->left) { PhyML_Fprintf(stderr, "\n. a->num = %d ; d->num = %d", a->num, d->num); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } b->l_r = b->r_l = -1; for (i = 0; i < 3; i++) { /* if((a->v[i]) && ((a->v[i] == d) || (e_root && a->b[i] == e_root))) */ if ((a->v[i]) && ((a->v[i] == d))) { b->l_r = i; /* we consider here that 'a' is on the left handside of 'b'*/ a->b[i] = b; } /* if((d->v[i]) && ((d->v[i] == a) || (e_root && d->b[i] == e_root))) */ if ((d->v[i]) && ((d->v[i] == a))) { b->r_l = i; /* we consider here that 'd' is on the right handside of 'b'*/ d->b[i] = b; } } if (a->tax) { b->r_l = 0; for (i = 0; i < 3; i++) if (d->v[i] == a) { b->l_r = i; break; } } b->l_v1 = b->l_v2 = b->r_v1 = b->r_v2 = -1; for (i = 0; i < 3; i++) { if (b->left->v[i] != b->rght) { if (b->l_v1 < 0) b->l_v1 = i; else b->l_v2 = i; } if (b->rght->v[i] != b->left) { if (b->r_v1 < 0) b->r_v1 = i; else b->r_v2 = i; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Restrict_To_Coding_Position(align **data, option *io) { int i, j, curr_pos; if (io->codpos != -1) { for (i = 0; i < io->n_otu; i++) { curr_pos = 0; for (j = io->codpos - 1; j < data[i]->len; j += 3) { data[i]->state[curr_pos] = data[i]->state[j]; curr_pos++; } data[i]->len /= 3; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Uppercase(char *ch) { /* convert ch to upper case -- either ASCII or EBCDIC */ *ch = isupper((int)*ch) ? *ch : toupper((int)*ch); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Lowercase(char *ch) { /* convert ch to upper case -- either ASCII or EBCDIC */ *ch = isupper((int)*ch) ? tolower((int)*ch) : *ch; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// calign *Compact_Data(align **data, option *io) { calign *cdata_tmp, *cdata; int i, j, k, site; int n_patt, which_patt; char **sp_names; int n_otu; pnode *proot; int compress; int n_ambigu, is_ambigu; scalar_dbl *io_wght; phydbl len, inc, n_invar; n_otu = io->n_otu; n_patt = 0; which_patt = 0; sp_names = (char **)mCalloc(n_otu, sizeof(char *)); for (i = 0; i < n_otu; i++) { sp_names[i] = (char *)mCalloc(T_MAX_NAME, sizeof(char)); strcpy(sp_names[i], data[i]->name); } cdata_tmp = Make_Calign(n_otu, data[0]->len, io->state_len, data[0]->len, sp_names, 0, NULL); Init_Calign(n_otu, data[0]->len, data[0]->len, cdata_tmp); proot = (pnode *)Create_Pnode(T_MAX_ALPHABET); for (i = 0; i < n_otu; i++) Free(sp_names[i]); Free(sp_names); if (data[0]->len % io->state_len) { PhyML_Fprintf(stderr, "\n. Sequence length is not a multiple of %d\n", io->state_len); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } // Read in weights given in input file io_wght = NULL; if (io->has_io_weights == YES) { io_wght = Read_Io_Weights(io); if (Scalar_Len(io_wght) - data[0]->len > 0) { PhyML_Fprintf( stderr, "\n. Sequence length (%d) differs from number of weights (%d).\n", data[0]->len, Scalar_Len(io_wght)); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } compress = io->colalias; n_ambigu = 0; is_ambigu = NO; if (!io->quiet && !compress) PhyML_Printf("\n. WARNING: sequences are not compressed !\n"); inc = -1.0; len = 0.0; Fors(site, data[0]->len, io->state_len) { if (io->has_io_weights == YES) inc = Scalar_Elem(site, io_wght); else inc = 1.; // Sequence length taking into account input weights, if any len += inc; if (io->rm_ambigu == YES) { is_ambigu = NO; for (j = 0; j < n_otu; j++) if (Is_Ambigu(data[j]->state + site, io->datatype, io->state_len)) break; if (j != n_otu) { is_ambigu = YES; n_ambigu++; } } if (!is_ambigu) { if (compress) { which_patt = -1; Traverse_Prefix_Tree(site, -1, &which_patt, &n_patt, data, io, proot); if (which_patt == n_patt - 1) /* New pattern found */ { n_patt--; k = n_patt; } else { k = n_patt - 10; } } else { k = n_patt; } if (k == n_patt) /* add a new site pattern */ { for (j = 0; j < n_otu; j++) Copy_One_State(data[j]->state + site, cdata_tmp->c_seq[j]->state + n_patt * io->state_len, io->state_len); for (j = 0; j < n_otu; j++) cdata_tmp->c_seq[j]->state[n_patt * io->state_len + 1] = '\0'; for (i = 0; i < n_otu; i++) { for (j = 0; j < n_otu; j++) { if (!(Are_Compatible( cdata_tmp->c_seq[i]->state + n_patt * io->state_len, cdata_tmp->c_seq[j]->state + n_patt * io->state_len, io->state_len, io->datatype))) break; } if (j != n_otu) break; } if ((j == n_otu) && (i == n_otu)) /* all characters at that site are compatible with one another: the site may be invariant */ { for (j = 0; j < n_otu; j++) { cdata_tmp->invar[n_patt] = Assign_State( cdata_tmp->c_seq[j]->state + n_patt * io->state_len, io->datatype, io->state_len); if (cdata_tmp->invar[n_patt] > -1.) break; } } else cdata_tmp->invar[n_patt] = -1; cdata_tmp->sitepatt[site] = n_patt; cdata_tmp->wght[n_patt] += inc; n_patt += 1; } else { cdata_tmp->sitepatt[site] = which_patt; cdata_tmp->wght[which_patt] += inc; } } } data[0]->len -= n_ambigu; cdata_tmp->init_len = data[0]->len; cdata_tmp->n_pattern = n_patt; for (i = 0; i < n_otu; i++) cdata_tmp->c_seq[i]->len = n_patt; for (i = 0; i < n_otu; i++) cdata_tmp->c_seq[i]->num = i; if (!io->quiet) PhyML_Printf("\n. %d patterns found (out of a total of %d sites). \n", n_patt, data[0]->len); if ((io->rm_ambigu == YES) && (n_ambigu > 0)) PhyML_Printf("\n. Removed %d columns of the alignment as they contain " "ambiguous characters (e.g., gaps) \n", n_ambigu); n_invar = 0.0; for (i = 0; i < cdata_tmp->n_pattern; i++) if (cdata_tmp->invar[i] > -1.) n_invar += cdata_tmp->wght[i]; if (io->quiet == NO) { if ((n_invar - ceil(n_invar)) < 1.E-10) PhyML_Printf("\n. %d sites without polymorphism (%.2f%c).\n", (int)n_invar, 100. * (phydbl)n_invar / len, '%'); else PhyML_Printf("\n. %f sites without polymorphism (%.2f%c).\n", n_invar, 100. * (phydbl)n_invar / len, '%'); } cdata_tmp->obs_pinvar = (phydbl)n_invar / len; cdata_tmp->io = io; if (io->datatype == NT) Get_Base_Freqs(cdata_tmp); else if (io->datatype == AA) Get_AA_Freqs(cdata_tmp); else { /* Uniform state frequency distribution.*/ } cdata = Copy_Cseq(cdata_tmp, io, NULL); Free_Calign(cdata_tmp); Free_Prefix_Tree(proot, T_MAX_ALPHABET); if (io_wght != NULL) Free_Scalar_Dbl(io_wght); return cdata; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// calign *Compact_Cdata(calign *data, option *io) { calign *cdata; int i, j, k, site; int n_patt, which_patt; int n_otu; n_otu = data->n_otu; cdata = (calign *)mCalloc(1, sizeof(calign)); cdata->n_otu = n_otu; cdata->c_seq = (align **)mCalloc(n_otu, sizeof(align *)); cdata->wght = (phydbl *)mCalloc(data->n_pattern, sizeof(phydbl)); cdata->obs_state_frq = (phydbl *)mCalloc(io->mod->ns, sizeof(phydbl)); cdata->ambigu = (short int *)mCalloc(data->n_pattern, sizeof(short int)); cdata->invar = (short int *)mCalloc(data->n_pattern, sizeof(short int)); cdata->n_pattern = cdata->init_len = -1; for (j = 0; j < n_otu; j++) { cdata->c_seq[j] = (align *)mCalloc(1, sizeof(align)); cdata->c_seq[j]->name = (char *)mCalloc(T_MAX_NAME, sizeof(char)); strcpy(cdata->c_seq[j]->name, data->c_seq[j]->name); cdata->c_seq[j]->state = (char *)mCalloc(data->n_pattern, sizeof(char)); cdata->c_seq[j]->is_ambigu = (short int *)mCalloc(data->n_pattern, sizeof(short int)); cdata->c_seq[j]->state[0] = data->c_seq[j]->state[0]; } n_patt = which_patt = 0; for (site = 0; site < data->n_pattern; site++) { if (data->wght[site] > 0.0) { for (k = 0; k < n_patt; k++) { for (j = 0; j < n_otu; j++) { if (strncmp(cdata->c_seq[j]->state + k * io->state_len, data->c_seq[j]->state + site * io->state_len, io->state_len)) break; } if (j == n_otu) { which_patt = k; break; } } if (k == n_patt) { for (j = 0; j < n_otu; j++) Copy_One_State(data->c_seq[j]->state + site * io->state_len, cdata->c_seq[j]->state + n_patt * io->state_len, io->state_len); for (i = 0; i < n_otu; i++) { for (j = 0; j < n_otu; j++) { if (!(Are_Compatible( cdata->c_seq[i]->state + n_patt * io->state_len, cdata->c_seq[j]->state + n_patt * io->state_len, io->state_len, io->datatype))) break; } if (j != n_otu) break; } if ((j == n_otu) && (i == n_otu)) { for (j = 0; j < n_otu; j++) { cdata->invar[n_patt] = Assign_State(cdata->c_seq[j]->state + n_patt * io->state_len, io->datatype, io->state_len); if (cdata->invar[n_patt] > -1.) break; } } else cdata->invar[n_patt] = -1; cdata->wght[n_patt] += data->wght[site]; n_patt += 1; } else cdata->wght[which_patt] += data->wght[site]; /* Print_Site(cdata,k,n_otu,"\n",io->stepsize); */ } } cdata->init_len = data->n_pattern; cdata->n_pattern = n_patt; for (i = 0; i < n_otu; i++) cdata->c_seq[i]->len = n_patt; if (io->datatype == NT) Get_Base_Freqs(cdata); else if (io->datatype == AA) Get_AA_Freqs(cdata); else { /* Not implemented yet */ } return cdata; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Traverse_Prefix_Tree(int site, int seqnum, int *patt_num, int *n_patt, align **data, option *io, pnode *n) { if (seqnum == io->n_otu - 1) { n->weight++; if (n->weight == 1) { n->num = *n_patt; (*n_patt) += 1; } (*patt_num) = n->num; return; } else { int next_state; next_state = -1; next_state = Assign_State_With_Ambiguity(data[seqnum + 1]->state + site, io->datatype, io->state_len); if (!n->next[next_state]) n->next[next_state] = Create_Pnode(T_MAX_ALPHABET); Traverse_Prefix_Tree(site, seqnum + 1, patt_num, n_patt, data, io, n->next[next_state]); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// pnode *Create_Pnode(int size) { pnode *n; int i; n = (pnode *)mCalloc(1, sizeof(pnode)); n->next = (pnode **)mCalloc(size, sizeof(pnode *)); for (i = 0; i < size; i++) n->next[i] = NULL; n->weight = 0; n->num = -1; return n; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Base_Freqs(calign *data) { int i, j, k; phydbl A, C, G, T; phydbl fA, fC, fG, fT; phydbl w; fA = fC = fG = fT = .25; for (k = 0; k < 8; k++) { A = C = G = T = .0; for (i = 0; i < data->n_otu; i++) { for (j = 0; j < data->n_pattern; j++) { w = data->wght[j]; if (w) { switch (data->c_seq[i]->state[j]) { case 'A': A += w; break; case 'C': C += w; break; case 'G': G += w; break; case 'T': T += w; break; case 'U': T += w; break; case 'M': C += w * fC / (fC + fA); A += w * fA / (fA + fC); break; case 'R': G += w * fG / (fA + fG); A += w * fA / (fA + fG); break; case 'W': T += w * fT / (fA + fT); A += w * fA / (fA + fT); break; case 'S': C += w * fC / (fC + fG); G += w * fG / (fC + fG); break; case 'Y': C += w * fC / (fC + fT); T += w * fT / (fT + fC); break; case 'K': G += w * fG / (fG + fT); T += w * fT / (fT + fG); break; case 'B': C += w * fC / (fC + fG + fT); G += w * fG / (fC + fG + fT); T += w * fT / (fC + fG + fT); break; case 'D': A += w * fA / (fA + fG + fT); G += w * fG / (fA + fG + fT); T += w * fT / (fA + fG + fT); break; case 'H': A += w * fA / (fA + fC + fT); C += w * fC / (fA + fC + fT); T += w * fT / (fA + fC + fT); break; case 'V': A += w * fA / (fA + fC + fG); C += w * fC / (fA + fC + fG); G += w * fG / (fA + fC + fG); break; case 'N': case 'X': case '?': case 'O': case '-': A += w * fA; C += w * fC; G += w * fG; T += w * fT; break; default: break; } } } } fA = A / (A + C + G + T); fC = C / (A + C + G + T); fG = G / (A + C + G + T); fT = T / (A + C + G + T); } data->obs_state_frq[0] = fA; data->obs_state_frq[1] = fC; data->obs_state_frq[2] = fG; data->obs_state_frq[3] = fT; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_AA_Freqs(calign *data) { int i, j, k; phydbl A, C, D, E, F, G, H, I, K, L, M, N, P, Q, R, S, T, V, W, Y; phydbl fA, fC, fD, fE, fF, fG, fH, fI, fK, fL, fM, fN, fP, fQ, fR, fS, fT, fV, fW, fY; int w; phydbl sum; fA = fC = fD = fE = fF = fG = fH = fI = fK = fL = fM = fN = fP = fQ = fR = fS = fT = fV = fW = fY = 1. / 20.; for (k = 0; k < 8; k++) { A = C = D = E = F = G = H = I = K = L = M = N = P = Q = R = S = T = V = W = Y = .0; for (i = 0; i < data->n_otu; i++) { for (j = 0; j < data->n_pattern; j++) { w = data->wght[j]; if (w) { switch (data->c_seq[i]->state[j]) { case 'A': A += w; break; case 'C': C += w; break; case 'D': D += w; break; case 'E': E += w; break; case 'F': F += w; break; case 'G': G += w; break; case 'H': H += w; break; case 'I': I += w; break; case 'K': K += w; break; case 'L': L += w; break; case 'M': M += w; break; case 'N': N += w; break; case 'P': P += w; break; case 'Q': Q += w; break; case 'R': R += w; break; case 'S': S += w; break; case 'T': T += w; break; case 'V': V += w; break; case 'W': W += w; break; case 'Y': Y += w; break; case 'Z': Q += w; break; case 'X': case '?': case 'O': case '-': A += w * fA; C += w * fC; D += w * fD; E += w * fE; F += w * fF; G += w * fG; H += w * fH; I += w * fI; K += w * fK; L += w * fL; M += w * fM; N += w * fN; P += w * fP; Q += w * fQ; R += w * fR; S += w * fS; T += w * fT; V += w * fV; W += w * fW; Y += w * fY; break; default: break; } } } } sum = (A + C + D + E + F + G + H + I + K + L + M + N + P + Q + R + S + T + V + W + Y); fA = A / sum; fC = C / sum; fD = D / sum; fE = E / sum; fF = F / sum; fG = G / sum; fH = H / sum; fI = I / sum; fK = K / sum; fL = L / sum; fM = M / sum; fN = N / sum; fP = P / sum; fQ = Q / sum; fR = R / sum; fS = S / sum; fT = T / sum; fV = V / sum; fW = W / sum; fY = Y / sum; } data->obs_state_frq[0] = fA; data->obs_state_frq[1] = fR; data->obs_state_frq[2] = fN; data->obs_state_frq[3] = fD; data->obs_state_frq[4] = fC; data->obs_state_frq[5] = fQ; data->obs_state_frq[6] = fE; data->obs_state_frq[7] = fG; data->obs_state_frq[8] = fH; data->obs_state_frq[9] = fI; data->obs_state_frq[10] = fL; data->obs_state_frq[11] = fK; data->obs_state_frq[12] = fM; data->obs_state_frq[13] = fF; data->obs_state_frq[14] = fP; data->obs_state_frq[15] = fS; data->obs_state_frq[16] = fT; data->obs_state_frq[17] = fW; data->obs_state_frq[18] = fY; data->obs_state_frq[19] = fV; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Swap the nodes on the left and right of e1 with the nodes // on the left and right of e2 respectively, or on the // right and left of e2 if swap == YES void Swap_Nodes_On_Edges(t_edge *e1, t_edge *e2, int swap, t_tree *tree) { t_node *buff; if (swap == NO) { buff = e1->left; e1->left = e2->left; e2->left = buff; buff = e1->rght; e1->rght = e2->rght; e2->rght = buff; } else { buff = e1->left; e1->left = e2->rght; e2->rght = buff; buff = e1->rght; e1->rght = e2->left; e2->left = buff; } Connect_One_Edge_To_Two_Nodes(e1->left, e1->rght, e1, tree); Connect_One_Edge_To_Two_Nodes(e2->left, e2->rght, e2, tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* As opposed to Connect_Edges_To_Nodes_Recur, the ordering of edges connected to tips does not depend on the topology. Use this function when you just have a table of edges not not connected to any node and the reciprocal is true. */ void Connect_Edges_To_Nodes_Serial(t_tree *tree) { int i, j; /* Reset */ for (i = 0; i < 2 * tree->n_otu - 1; ++i) for (j = 0; j < 3; j++) if (tree->a_nodes[i] != NULL) tree->a_nodes[i]->b[j] = NULL; for (i = 0; i < tree->n_otu; i++) { assert(tree->a_nodes[i]->tax); assert(tree->a_nodes[i] != tree->a_nodes[i]->v[0]); // Required so that p_lk_tip_r corresponds to the sequence at // tree->a_nodes[i] if (tree->a_edges[i]->p_lk_tip_r != NULL) assert(tree->a_edges[i]->rght == tree->a_nodes[i]); Connect_One_Edge_To_Two_Nodes(tree->a_nodes[i], tree->a_nodes[i]->v[0], tree->a_edges[i], tree); } tree->num_curr_branch_available = tree->n_otu; for (i = tree->n_otu; i < 2 * tree->n_otu - 3; i++) { assert(!tree->a_nodes[i]->tax); for (j = 0; j < 3; j++) if (!tree->a_nodes[i]->b[j]) { assert(tree->a_nodes[i] != tree->a_nodes[i]->v[j]); Connect_One_Edge_To_Two_Nodes( tree->a_nodes[i], tree->a_nodes[i]->v[j], tree->a_edges[tree->num_curr_branch_available], tree); } } if (tree->n_root != NULL) { tree->a_edges[tree->num_curr_branch_available]->left = tree->n_root; tree->a_edges[tree->num_curr_branch_available]->rght = tree->n_root->v[1]; tree->n_root->b[1] = tree->a_edges[tree->num_curr_branch_available]; tree->a_edges[tree->num_curr_branch_available]->num = tree->num_curr_branch_available; tree->num_curr_branch_available++; tree->a_edges[tree->num_curr_branch_available]->left = tree->n_root; tree->a_edges[tree->num_curr_branch_available]->rght = tree->n_root->v[2]; tree->n_root->b[2] = tree->a_edges[tree->num_curr_branch_available]; tree->a_edges[tree->num_curr_branch_available]->num = tree->num_curr_branch_available; tree->num_curr_branch_available++; } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Connect_Edges_To_Nodes_Recur(t_node *a, t_node *d, t_tree *tree) { int i; assert(a != d); Connect_One_Edge_To_Two_Nodes( a, d, tree->a_edges[tree->num_curr_branch_available], tree); if (d->tax) return; else for (i = 0; i < 3; i++) if (d->v[i] != a) /* Don't add d->b[i] != tree->e_root condition here since tree is not wired yet... */ Connect_Edges_To_Nodes_Recur(d, d->v[i], tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Connect_One_Edge_To_Two_Nodes(t_node *a, t_node *d, t_edge *b, t_tree *tree) { int i, dir_a_d, dir_d_a; assert(a != tree->n_root); assert(b); if (a == NULL || d == NULL || a->num == d->num) { PhyML_Fprintf(stderr, "\n. a: %d d: %d b: %d root: %d", a ? a->num : -1, d ? d->num : -1, b ? b->num : -1, tree->n_root ? tree->n_root->num : -1); assert(FALSE); } dir_a_d = -1; for (i = 0; i < 3; i++) if (a->v[i] == d) { dir_a_d = i; break; } dir_d_a = -1; for (i = 0; i < 3; i++) if (d->v[i] == a) { dir_d_a = i; break; } if (dir_a_d == -1 || dir_d_a == -1) { PhyML_Printf("\n. a:%d a->v[0]:%d a->v[1]:%d a->v[2]:%d d:%d d->v[0]:%d " "d->v[1]:%d d->v[2]:%d root:%d", a->num, a->v[0] ? a->v[0]->num : -1, a->v[1] ? a->v[1]->num : -1, a->v[2] ? a->v[2]->num : -1, d->num, d->v[0] ? d->v[0]->num : -1, d->v[1] ? d->v[1]->num : -1, d->v[2] ? d->v[2]->num : -1, tree->n_root ? tree->n_root->num : -1); assert(FALSE); } a->b[dir_a_d] = b; d->b[dir_d_a] = b; b->left = a; b->rght = d; if (a->tax) { b->rght = a; b->left = d; } /* root */ /* a tip is necessarily on the righthand side of the t_edge */ if (a->tax == NO && d->tax == NO) { b->num = tree->num_curr_branch_available; tree->num_curr_branch_available++; } else if (d->tax) b->num = d->num; else if (a->tax) b->num = a->num; else assert(FALSE); assert(a != d); (b->left == a) ? (Set_Edge_Dirs(b, a, d, tree)) : (Set_Edge_Dirs(b, d, a, tree)); b->l_old->v = b->l->v; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Dirs(t_tree *tree) { int i; int buff; t_edge *b; b = NULL; buff = -1; for (i = 0; i < 2 * tree->n_otu - 3; ++i) { b = tree->a_edges[i]; if ((!b->left->tax) && (b->left->v[b->l_v1]->num < b->left->v[b->l_v2]->num)) { buff = b->l_v1; b->l_v1 = b->l_v2; b->l_v2 = buff; } if ((!b->rght->tax) && (b->rght->v[b->r_v1]->num < b->rght->v[b->r_v2]->num)) { buff = b->r_v1; b->r_v1 = b->r_v2; b->r_v2 = buff; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Exit(char *message) { fflush(NULL); PhyML_Fprintf(stderr, "%s", message); exit(1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void *mCalloc(int nb, size_t size) { void *allocated; if ((allocated = calloc((size_t)nb, size)) != NULL) return allocated; else { PhyML_Fprintf(stderr, "\n. Problem encountered in allocating block of size %d", nb); assert(false); /* Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ } return NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void *mRealloc(void *p, int nb, size_t size) { if ((p = realloc(p, (size_t)nb * size)) != NULL) return p; else Exit("\n. Err.: low memory\n"); return NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* t_tree *Make_Light_Tree_Struct(int n_otu) */ /* { */ /* t_tree *tree; */ /* int i; */ /* tree = (t_tree *)mCalloc(1,sizeof(t_tree )); */ /* tree->a_edges = (t_edge **)mCalloc(2*n_otu-3,sizeof(t_edge *)); */ /* tree->a_nodes = (t_node **)mCalloc(2*n_otu-2,sizeof(t_node *)); */ /* tree->n_otu = n_otu; */ /* For(i,2*n_otu-3) */ /* tree->a_edges[i] = Make_Edge_Light(NULL,NULL,i); */ /* For(i,2*n_otu-2) */ /* tree->a_nodes[i] = Make_Node_Light(i); */ /* return tree; */ /* } */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Sort_Phydbl_Decrease(const void *a, const void *b) { if ((*(phydbl *)(a)) >= (*(phydbl *)(b))) return -1; else return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Qksort_Int(int *A, int *B, int ilo, int ihi) { phydbl pivot; // pivot value for partitioning array int ulo, uhi; // indices at ends of unpartitioned region int ieq; // least index of array entry with value equal to pivot int tempEntry; // temporary entry used for swapping if (ilo >= ihi) { return; } // Select a pivot value. pivot = A[(ilo + ihi) / 2]; // Initialize ends of unpartitioned region and least index of entry // with value equal to pivot. ieq = ulo = ilo; uhi = ihi; // While the unpartitioned region is not empty, try to reduce its size. while (ulo <= uhi) { if (A[uhi] > pivot) { // Here, we can reduce the size of the unpartitioned region and // try again. uhi--; } else { // Here, A[uhi] <= pivot, so swap entries at indices ulo and // uhi. tempEntry = A[ulo]; A[ulo] = A[uhi]; A[uhi] = tempEntry; if (B) { tempEntry = B[ulo]; B[ulo] = B[uhi]; B[uhi] = tempEntry; } // After the swap, A[ulo] <= pivot. if (A[ulo] < pivot) { // Swap entries at indices ieq and ulo. tempEntry = A[ieq]; A[ieq] = A[ulo]; A[ulo] = tempEntry; if (B) { tempEntry = B[ieq]; B[ieq] = B[ulo]; B[ulo] = tempEntry; } // After the swap, A[ieq] < pivot, so we need to change // ieq. ieq++; // We also need to change ulo, but we also need to do // that when A[ulo] = pivot, so we do it after this if // statement. } // Once again, we can reduce the size of the unpartitioned // region and try again. ulo++; } } // Now, all entries from index ilo to ieq - 1 are less than the pivot // and all entries from index uhi to ihi + 1 are greater than the // pivot. So we have two regions of the array that can be sorted // recursively to put all of the entries in order. Qksort_Int(A, B, ilo, ieq - 1); Qksort_Int(A, B, uhi + 1, ihi); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Sort in ascending order. Elements in B (if provided) are also re-ordered * according to the ordering of A */ void Qksort(phydbl *A, phydbl *B, int ilo, int ihi) { phydbl pivot; // pivot value for partitioning array int ulo, uhi; // indices at ends of unpartitioned region int ieq; // least index of array entry with value equal to pivot phydbl tempEntry; // temporary entry used for swapping if (ilo >= ihi) { return; } // Select a pivot value. pivot = A[(ilo + ihi) / 2]; // Initialize ends of unpartitioned region and least index of entry // with value equal to pivot. ieq = ulo = ilo; uhi = ihi; // While the unpartitioned region is not empty, try to reduce its size. while (ulo <= uhi) { if (A[uhi] > pivot) { // Here, we can reduce the size of the unpartitioned region and // try again. uhi--; } else { // Here, A[uhi] <= pivot, so swap entries at indices ulo and // uhi. tempEntry = A[ulo]; A[ulo] = A[uhi]; A[uhi] = tempEntry; if (B) { tempEntry = B[ulo]; B[ulo] = B[uhi]; B[uhi] = tempEntry; } // After the swap, A[ulo] <= pivot. if (A[ulo] < pivot) { // Swap entries at indices ieq and ulo. tempEntry = A[ieq]; A[ieq] = A[ulo]; A[ulo] = tempEntry; if (B) { tempEntry = B[ieq]; B[ieq] = B[ulo]; B[ulo] = tempEntry; } // After the swap, A[ieq] < pivot, so we need to change // ieq. ieq++; // We also need to change ulo, but we also need to do // that when A[ulo] = pivot, so we do it after this if // statement. } // Once again, we can reduce the size of the unpartitioned // region and try again. ulo++; } } // Now, all entries from index ilo to ieq - 1 are less than the pivot // and all entries from index uhi to ihi + 1 are greater than the // pivot. So we have two regions of the array that can be sorted // recursively to put all of the entries in order. Qksort(A, B, ilo, ieq - 1); Qksort(A, B, uhi + 1, ihi); } /********************************************************/ void Qksort_Matrix(phydbl **A, int col, int ilo, int ihi) { phydbl pivot; // pivot value for partitioning array int ulo, uhi; // indices at ends of unpartitioned region int ieq; // least index of array entry with value equal to pivot phydbl *tempEntry; // temporary entry used for swapping tempEntry = NULL; if (ilo >= ihi) { return; } // Select a pivot value. pivot = A[(ilo + ihi) / 2][col]; // Initialize ends of unpartitioned region and least index of entry // with value equal to pivot. ieq = ulo = ilo; uhi = ihi; // While the unpartitioned region is not empty, try to reduce its size. while (ulo <= uhi) { if (A[uhi][col] > pivot) { // Here, we can reduce the size of the unpartitioned region and // try again. uhi--; } else { // Here, A[uhi] <= pivot, so swap entries at indices ulo and // uhi. tempEntry = A[ulo]; A[ulo] = A[uhi]; A[uhi] = tempEntry; // After the swap, A[ulo] <= pivot. if (A[ulo][col] < pivot) { // Swap entries at indices ieq and ulo. tempEntry = A[ieq]; A[ieq] = A[ulo]; A[ulo] = tempEntry; // After the swap, A[ieq] < pivot, so we need to change // ieq. ieq++; // We also need to change ulo, but we also need to do // that when A[ulo] = pivot, so we do it after this if // statement. } // Once again, we can reduce the size of the unpartitioned // region and try again. ulo++; } } // Now, all entries from index ilo to ieq - 1 are less than the pivot // and all entries from index uhi to ihi + 1 are greater than the // pivot. So we have two regions of the array that can be sorted // recursively to put all of the entries in order. Qksort_Matrix(A, col, ilo, ieq - 1); Qksort_Matrix(A, col, uhi + 1, ihi); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *Add_Taxa_To_Constraint_Tree(FILE *fp, calign *cdata) { char *line, *long_line; t_tree *tree; int i, j, open; rewind(fp); line = Return_Tree_String_Phylip(fp); tree = Read_Tree(&line); long_line = (char *)mCalloc(T_MAX_LINE, sizeof(char)); strcpy(long_line, line); i = 1; open = 1; while (open) { if (line[i] == '(') open++; if (line[i] == ')') open--; if (i > T_MAX_LINE) assert(FALSE); i++; } long_line[i - 1] = '\0'; for (i = 0; i < cdata->n_otu; i++) { for (j = 0; j < tree->n_otu; j++) { if (!strcmp(tree->a_nodes[j]->name, cdata->c_seq[i]->name)) break; } if (j == tree->n_otu) { strcat(long_line, ","); strcat(long_line, cdata->c_seq[i]->name); } } strcat(long_line, ");"); Free_Tree(tree); Free(line); return long_line; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Check_Constraint_Tree_Taxa_Names(t_tree *tree, calign *cdata) { int i, j, n_otu_tree, n_otu_cdata; n_otu_tree = tree->n_otu; n_otu_cdata = cdata->n_otu; for (i = 0; i < n_otu_tree; i++) { for (j = 0; j < n_otu_cdata; j++) { if (!strcmp(tree->a_nodes[i]->name, cdata->c_seq[j]->name)) break; } if (j == n_otu_cdata) { PhyML_Fprintf(stderr, "\n. '%s' was not found in sequence data set\n", tree->a_nodes[i]->name); Warn_And_Exit("\n. PhyML finished prematurely."); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Copy_Tax_Names_To_Tip_Labels(t_tree *tree, calign *data) { int i; for (i = 0; i < tree->n_otu; i++) { tree->a_nodes[i]->name = (char *)mCalloc((int)strlen(data->c_seq[i]->name) + 1, sizeof(char)); tree->a_nodes[i]->ori_name = tree->a_nodes[i]->name; strcpy(tree->a_nodes[i]->name, data->c_seq[i]->name); tree->a_nodes[i]->tax = 1; tree->a_nodes[i]->num = i; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Share_Lk_Struct(t_tree *t_full, t_tree *t_empt) { int i, j, n_otu; t_edge *b_e, *b_f; t_node *n_e, *n_f; n_otu = t_full->n_otu; t_empt->c_lnL_sorted = t_full->c_lnL_sorted; t_empt->unscaled_site_lk_cat = t_full->unscaled_site_lk_cat; t_empt->cur_site_lk = t_full->cur_site_lk; t_empt->old_site_lk = t_full->old_site_lk; t_empt->log_lks_aLRT = t_full->log_lks_aLRT; t_empt->site_lk_cat = t_full->site_lk_cat; t_empt->fact_sum_scale = t_full->fact_sum_scale; t_empt->dot_prod = t_full->dot_prod; t_empt->expl = t_full->expl; for (i = 0; i < 2 * n_otu - 1; ++i) { b_f = t_full->a_edges[i]; b_e = t_empt->a_edges[i]; b_e->Pij_rr = b_f->Pij_rr; b_e->tPij_rr = b_f->tPij_rr; b_e->nni = b_f->nni; } for (i = n_otu; i < 2 * n_otu - 2; i++) { n_f = t_full->a_nodes[i]; n_e = t_empt->a_nodes[i]; for (j = 0; j < 3; j++) { if (n_f->b[j]->left == n_f) { if (n_e->b[j]->left == n_e) { n_e->b[j]->p_lk_left = n_f->b[j]->p_lk_left; n_e->b[j]->p_lk_loc_left = n_f->b[j]->p_lk_loc_left; n_e->b[j]->patt_id_left = n_f->b[j]->patt_id_left; n_e->b[j]->sum_scale_left = n_f->b[j]->sum_scale_left; n_e->b[j]->sum_scale_left_cat = n_f->b[j]->sum_scale_left_cat; n_e->b[j]->p_lk_tip_l = n_f->b[j]->p_lk_tip_l; } else { n_e->b[j]->p_lk_rght = n_f->b[j]->p_lk_left; n_e->b[j]->p_lk_loc_rght = n_f->b[j]->p_lk_loc_left; n_e->b[j]->patt_id_rght = n_f->b[j]->patt_id_left; n_e->b[j]->sum_scale_rght = n_f->b[j]->sum_scale_left; n_e->b[j]->sum_scale_rght_cat = n_f->b[j]->sum_scale_left_cat; n_e->b[j]->p_lk_tip_r = n_f->b[j]->p_lk_tip_l; } } else { if (n_e->b[j]->rght == n_e) { n_e->b[j]->p_lk_rght = n_f->b[j]->p_lk_rght; n_e->b[j]->p_lk_loc_rght = n_f->b[j]->p_lk_loc_rght; n_e->b[j]->patt_id_rght = n_f->b[j]->patt_id_rght; n_e->b[j]->sum_scale_rght = n_f->b[j]->sum_scale_rght; n_e->b[j]->sum_scale_rght_cat = n_f->b[j]->sum_scale_rght_cat; n_e->b[j]->p_lk_tip_r = n_f->b[j]->p_lk_tip_r; } else { n_e->b[j]->p_lk_left = n_f->b[j]->p_lk_rght; n_e->b[j]->p_lk_loc_left = n_f->b[j]->p_lk_loc_rght; n_e->b[j]->patt_id_left = n_f->b[j]->patt_id_rght; n_e->b[j]->sum_scale_left = n_f->b[j]->sum_scale_rght; n_e->b[j]->sum_scale_left_cat = n_f->b[j]->sum_scale_rght_cat; n_e->b[j]->p_lk_tip_l = n_f->b[j]->p_lk_tip_r; } } } } for (i = 0; i < n_otu; i++) { n_f = t_full->a_nodes[i]; n_e = t_empt->a_nodes[i]; if (n_f->b[0]->rght == n_f) { n_e->b[0]->p_lk_rght = n_f->b[0]->p_lk_rght; n_e->b[0]->p_lk_loc_rght = n_f->b[0]->p_lk_loc_rght; n_e->b[0]->patt_id_rght = n_f->b[0]->patt_id_rght; n_e->b[0]->sum_scale_rght = n_f->b[0]->sum_scale_rght; n_e->b[0]->sum_scale_rght_cat = n_f->b[0]->sum_scale_rght_cat; n_e->b[0]->p_lk_tip_r = n_f->b[0]->p_lk_tip_r; } else { Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Share_Spr_Struct(t_tree *t_full, t_tree *t_empt) { t_empt->size_spr_list_one_edge = t_full->size_spr_list_one_edge; t_empt->spr_list_one_edge = t_full->spr_list_one_edge; t_empt->best_spr = t_full->best_spr; t_empt->spr_list_all_edge = t_full->spr_list_all_edge; t_empt->size_spr_list_all_edge = t_full->size_spr_list_all_edge; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Share_Pars_Struct(t_tree *t_full, t_tree *t_empt) { int i; t_empt->site_pars = t_full->site_pars; t_empt->step_mat = t_full->step_mat; for (i = 0; i < 2 * t_full->n_otu - 3; ++i) { t_empt->a_edges[i]->ui_l = t_full->a_edges[i]->ui_l; t_empt->a_edges[i]->ui_r = t_full->a_edges[i]->ui_r; t_empt->a_edges[i]->pars_l = t_full->a_edges[i]->pars_l; t_empt->a_edges[i]->pars_r = t_full->a_edges[i]->pars_r; t_empt->a_edges[i]->p_pars_l = t_full->a_edges[i]->p_pars_l; t_empt->a_edges[i]->p_pars_r = t_full->a_edges[i]->p_pars_r; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Sort_Edges_NNI_Score(t_tree *tree, t_edge **sorted_edges, int n_elem) { int i, j, done; t_edge *buff; do { done = YES; for (i = 0; i < n_elem - 1; i++) { for (j = i + 1; j < n_elem; j++) { if (sorted_edges[j]->nni->score < sorted_edges[i]->nni->score) { done = NO; buff = sorted_edges[j]; sorted_edges[j] = sorted_edges[i]; sorted_edges[i] = buff; } } } } while (done == NO); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Sort_Edges_Depth(t_tree *tree, t_edge **sorted_edges, int n_elem) { int i, j; t_edge *buff; phydbl *depth, buff_depth; depth = (phydbl *)mCalloc(n_elem, sizeof(phydbl)); for (i = 0; i < n_elem; i++) depth[i] = sorted_edges[i]->left->bip_size[sorted_edges[i]->l_r] * sorted_edges[i]->rght->bip_size[sorted_edges[i]->r_l]; for (i = 0; i < n_elem - 1; i++) { for (j = i + 1; j < n_elem; j++) { if (depth[i] > depth[j]) { buff = sorted_edges[i]; sorted_edges[i] = sorted_edges[j]; sorted_edges[j] = buff; buff_depth = depth[i]; depth[i] = depth[j]; depth[j] = buff_depth; } } } Free(depth); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void NNI(t_tree *tree, t_edge *b_fcus, int do_swap) { t_node *v1, *v2, *v3, *v4; phydbl lk0, lk1, lk2; phydbl lk0_init, lk1_init, lk2_init; scalar_dbl *len0, *len1, *len2; scalar_dbl *var0, *var1, *var2; phydbl l_infa, l_infb; phydbl lk_init; if (tree->prev) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); lk_init = tree->c_lnL; b_fcus->nni->init_lk = tree->c_lnL; ; b_fcus->nni->best_conf = 0; b_fcus->nni->score = +1.0; lk0 = lk1 = lk2 = UNLIKELY; v1 = v2 = v3 = v4 = NULL; if (b_fcus->nni->init_l != NULL) Copy_Scalar_Dbl(b_fcus->l, b_fcus->nni->init_l); else b_fcus->nni->init_l = Duplicate_Scalar_Dbl(b_fcus->l); v1 = b_fcus->left->v[b_fcus->l_v1]; v2 = b_fcus->left->v[b_fcus->l_v2]; v3 = b_fcus->rght->v[b_fcus->r_v1]; v4 = b_fcus->rght->v[b_fcus->r_v2]; Record_Br_Len(tree); if (v1->num < v2->num) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (v3->num < v4->num) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); /************************************************************/ Swap(v2, b_fcus->left, b_fcus->rght, v3, tree); Set_Both_Sides(YES, tree); MIXT_Set_Alias_Subpatt(YES, tree); lk1_init = Update_Lk_At_Given_Edge(b_fcus, tree); MIXT_Set_Alias_Subpatt(NO, tree); l_infa = 1.; l_infb = 1.E-4; lk1 = lk1_init; if (tree->mod->s_opt->nni_br_len_opt == YES) { if (tree->mod->s_opt->fast_nni) { lk1 = Fast_Br_Len(b_fcus, tree, YES); } else { lk1 = Br_Len_Opt(&(b_fcus->l->v), b_fcus, tree); } } if (lk1 < lk1_init - tree->mod->s_opt->min_diff_lk_local) { PhyML_Printf("\n. %f %f %G", l_infa, l_infb, b_fcus->l->v); PhyML_Printf("\n. %f -- %f", lk1_init, lk1); PhyML_Printf("\n. Err. in NNI (1)"); } len1 = Duplicate_Scalar_Dbl(b_fcus->l); var1 = Duplicate_Scalar_Dbl(b_fcus->l_var); Swap(v3, b_fcus->left, b_fcus->rght, v2, tree); /************************************************************/ /************************************************************/ Swap(v2, b_fcus->left, b_fcus->rght, v4, tree); Restore_Br_Len(tree); Set_Both_Sides(YES, tree); MIXT_Set_Alias_Subpatt(YES, tree); lk2_init = Update_Lk_At_Given_Edge(b_fcus, tree); MIXT_Set_Alias_Subpatt(NO, tree); l_infa = 1.; l_infb = 1.E-4; lk2 = lk2_init; if (tree->mod->s_opt->nni_br_len_opt == YES) { if (tree->mod->s_opt->fast_nni) { lk2 = Fast_Br_Len(b_fcus, tree, YES); } else { lk2 = Br_Len_Opt(&(b_fcus->l->v), b_fcus, tree); } } if (lk2 < lk2_init - tree->mod->s_opt->min_diff_lk_local) { PhyML_Printf("\n. %f %f %G", l_infa, l_infb, b_fcus->l->v); PhyML_Printf("\n. %f -- %f", lk2_init, lk2); PhyML_Printf("\n. Err. in NNI (2)"); } len2 = Duplicate_Scalar_Dbl(b_fcus->l); var2 = Duplicate_Scalar_Dbl(b_fcus->l_var); Swap(v4, b_fcus->left, b_fcus->rght, v2, tree); /************************************************************/ /************************************************************/ Restore_Br_Len(tree); Set_Both_Sides(YES, tree); MIXT_Set_Alias_Subpatt(YES, tree); lk0_init = Update_Lk_At_Given_Edge(b_fcus, tree); MIXT_Set_Alias_Subpatt(NO, tree); if (FABS(lk0_init - lk_init) > tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr, "\n. lk_init = %f; lk = %f diff = %f l = %G", lk_init, lk0_init, lk_init - lk0_init, b_fcus->l->v); PhyML_Fprintf(stderr, "\n. Curr_lnL = %f", Lk(NULL, tree)); Exit("\n. Err. in NNI (3)"); } l_infa = 1.; l_infb = 1.E-4; lk0 = lk0_init; if (tree->mod->s_opt->nni_br_len_opt == YES) { if (tree->mod->s_opt->fast_nni) { lk0 = Fast_Br_Len(b_fcus, tree, YES); } else { lk0 = Br_Len_Opt(&(b_fcus->l->v), b_fcus, tree); } } if (lk0 < lk_init - tree->mod->s_opt->min_diff_lk_local) { PhyML_Printf("\n. %f %f %f", l_infa, l_infb, b_fcus->l->v); PhyML_Printf("\n. %f -- %f", lk0_init, lk0); PhyML_Printf("\n. Err. in NNI (3)\n"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } len0 = Duplicate_Scalar_Dbl(b_fcus->l); var0 = Duplicate_Scalar_Dbl(b_fcus->l_var); /************************************************************/ b_fcus->nni->lk0 = lk0; b_fcus->nni->lk1 = lk1; b_fcus->nni->lk2 = lk2; if (b_fcus->nni->l0 == NULL) b_fcus->nni->l0 = Duplicate_Scalar_Dbl(len0); else Copy_Scalar_Dbl(len0, b_fcus->nni->l0); if (b_fcus->nni->l1 == NULL) b_fcus->nni->l1 = Duplicate_Scalar_Dbl(len1); else Copy_Scalar_Dbl(len1, b_fcus->nni->l1); if (b_fcus->nni->l2 == NULL) b_fcus->nni->l2 = Duplicate_Scalar_Dbl(len2); else Copy_Scalar_Dbl(len2, b_fcus->nni->l2); if (b_fcus->nni->v0 == NULL) b_fcus->nni->v0 = Duplicate_Scalar_Dbl(var0); else Copy_Scalar_Dbl(var0, b_fcus->nni->v0); if (b_fcus->nni->v1 == NULL) b_fcus->nni->v1 = Duplicate_Scalar_Dbl(var1); else Copy_Scalar_Dbl(var1, b_fcus->nni->v1); if (b_fcus->nni->v2 == NULL) b_fcus->nni->v2 = Duplicate_Scalar_Dbl(var2); else Copy_Scalar_Dbl(var2, b_fcus->nni->v2); b_fcus->nni->score = lk0 - MAX(lk1, lk2); if ((b_fcus->nni->score < tree->mod->s_opt->min_diff_lk_local) && (b_fcus->nni->score > -tree->mod->s_opt->min_diff_lk_local)) { b_fcus->nni->score = .0; b_fcus->nni->lk1 = b_fcus->nni->lk0; b_fcus->nni->lk2 = b_fcus->nni->lk0; } if (lk0 > MAX(lk1, lk2)) { b_fcus->nni->best_conf = 0; b_fcus->nni->swap_node_v1 = NULL; b_fcus->nni->swap_node_v2 = NULL; b_fcus->nni->swap_node_v3 = NULL; b_fcus->nni->swap_node_v4 = NULL; if (b_fcus->nni->best_l == NULL) b_fcus->nni->best_l = Duplicate_Scalar_Dbl(len0); else Copy_Scalar_Dbl(len0, b_fcus->nni->best_l); if (b_fcus->nni->best_v == NULL) b_fcus->nni->best_v = Duplicate_Scalar_Dbl(var0); else Copy_Scalar_Dbl(var0, b_fcus->nni->best_v); } else if (lk1 > MAX(lk0, lk2)) { b_fcus->nni->best_conf = 1; b_fcus->nni->swap_node_v1 = v2; b_fcus->nni->swap_node_v2 = b_fcus->left; b_fcus->nni->swap_node_v3 = b_fcus->rght; b_fcus->nni->swap_node_v4 = v3; if (b_fcus->nni->best_l == NULL) b_fcus->nni->best_l = Duplicate_Scalar_Dbl(len1); else Copy_Scalar_Dbl(len1, b_fcus->nni->best_l); if (b_fcus->nni->best_v == NULL) b_fcus->nni->best_v = Duplicate_Scalar_Dbl(var1); else Copy_Scalar_Dbl(var1, b_fcus->nni->best_v); } else if (lk2 > MAX(lk0, lk1)) { b_fcus->nni->best_conf = 2; b_fcus->nni->swap_node_v1 = v2; b_fcus->nni->swap_node_v2 = b_fcus->left; b_fcus->nni->swap_node_v3 = b_fcus->rght; b_fcus->nni->swap_node_v4 = v4; if (b_fcus->nni->best_l == NULL) b_fcus->nni->best_l = Duplicate_Scalar_Dbl(len2); else Copy_Scalar_Dbl(len2, b_fcus->nni->best_l); if (b_fcus->nni->best_v == NULL) b_fcus->nni->best_v = Duplicate_Scalar_Dbl(var2); else Copy_Scalar_Dbl(var2, b_fcus->nni->best_v); } else { b_fcus->nni->score = +1.0; b_fcus->nni->best_conf = 0; b_fcus->nni->swap_node_v1 = NULL; b_fcus->nni->swap_node_v2 = NULL; b_fcus->nni->swap_node_v3 = NULL; b_fcus->nni->swap_node_v4 = NULL; if (b_fcus->nni->best_l == NULL) b_fcus->nni->best_l = Duplicate_Scalar_Dbl(len0); else Copy_Scalar_Dbl(len0, b_fcus->nni->best_l); if (b_fcus->nni->best_v == NULL) b_fcus->nni->best_v = Duplicate_Scalar_Dbl(var0); else Copy_Scalar_Dbl(var0, b_fcus->nni->best_v); } if (do_swap == YES) { if ((lk1 > lk0) || (lk2 > lk0)) { tree->n_swap++; if (lk1 > lk2) { Swap(v2, b_fcus->left, b_fcus->rght, v3, tree); if (b_fcus->nni->best_l == NULL) b_fcus->nni->best_l = Duplicate_Scalar_Dbl(len1); else Copy_Scalar_Dbl(len1, b_fcus->nni->best_l); if (b_fcus->nni->best_v == NULL) b_fcus->nni->best_v = Duplicate_Scalar_Dbl(var1); else Copy_Scalar_Dbl(var1, b_fcus->nni->best_v); } else { Swap(v2, b_fcus->left, b_fcus->rght, v4, tree); if (b_fcus->nni->best_l == NULL) b_fcus->nni->best_l = Duplicate_Scalar_Dbl(len2); else Copy_Scalar_Dbl(len2, b_fcus->nni->best_l); if (b_fcus->nni->best_v == NULL) b_fcus->nni->best_v = Duplicate_Scalar_Dbl(var2); else Copy_Scalar_Dbl(var2, b_fcus->nni->best_v); } } } else { Restore_Br_Len(tree); Update_PMat_At_Given_Edge(b_fcus, tree); tree->c_lnL = lk_init; } Free_Scalar_Dbl(len0); Free_Scalar_Dbl(len1); Free_Scalar_Dbl(len2); Free_Scalar_Dbl(var0); Free_Scalar_Dbl(var1); Free_Scalar_Dbl(var2); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void NNI_Pars(t_tree *tree, t_edge *b_fcus, int do_swap) { t_node *v1, *v2, *v3, *v4; int pars0, pars1, pars2; int pars_init; pars_init = tree->c_pars; b_fcus->nni->best_conf = 0; b_fcus->nni->score = +1.0; pars0 = pars1 = pars2 = 0; v1 = v2 = v3 = v4 = NULL; v1 = b_fcus->left->v[b_fcus->l_v1]; v2 = b_fcus->left->v[b_fcus->l_v2]; v3 = b_fcus->rght->v[b_fcus->r_v1]; v4 = b_fcus->rght->v[b_fcus->r_v2]; if (v1->num < v2->num) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); if (v3->num < v4->num) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); /***********/ Swap(v2, b_fcus->left, b_fcus->rght, v3, tree); Set_Both_Sides(YES, tree); pars1 = Update_Pars_At_Given_Edge(b_fcus, tree); Swap(v3, b_fcus->left, b_fcus->rght, v2, tree); /***********/ /***********/ Swap(v2, b_fcus->left, b_fcus->rght, v4, tree); Set_Both_Sides(YES, tree); pars2 = Update_Pars_At_Given_Edge(b_fcus, tree); Swap(v4, b_fcus->left, b_fcus->rght, v2, tree); /***********/ /***********/ Set_Both_Sides(YES, tree); pars0 = Update_Pars_At_Given_Edge(b_fcus, tree); if (pars0 != pars_init) { PhyML_Fprintf(stderr, "\n. pars_init = %d; pars0 = %d\n", pars_init, pars0); Warn_And_Exit("\n. Err. in NNI (3)\n"); } /***********/ tree->c_pars = pars0; b_fcus->nni->score = MIN(pars1, pars2) - pars0; if (pars0 < MIN(pars1, pars2)) { b_fcus->nni->best_conf = 0; b_fcus->nni->swap_node_v1 = NULL; b_fcus->nni->swap_node_v2 = NULL; b_fcus->nni->swap_node_v3 = NULL; b_fcus->nni->swap_node_v4 = NULL; } else if (pars1 < MIN(pars0, pars2)) { b_fcus->nni->best_conf = 1; b_fcus->nni->swap_node_v1 = v2; b_fcus->nni->swap_node_v2 = b_fcus->left; b_fcus->nni->swap_node_v3 = b_fcus->rght; b_fcus->nni->swap_node_v4 = v3; } else if (pars2 > MIN(pars0, pars1)) { b_fcus->nni->best_conf = 2; b_fcus->nni->swap_node_v1 = v2; b_fcus->nni->swap_node_v2 = b_fcus->left; b_fcus->nni->swap_node_v3 = b_fcus->rght; b_fcus->nni->swap_node_v4 = v4; } else { b_fcus->nni->score = +1.0; b_fcus->nni->swap_node_v1 = NULL; b_fcus->nni->swap_node_v2 = NULL; b_fcus->nni->swap_node_v3 = NULL; b_fcus->nni->swap_node_v4 = NULL; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Swap(t_node *a, t_node *b, t_node *c, t_node *d, t_tree *tree) { int ab, ba, cd, dc, bc; int i; /* \ /d \ /a * \ / \ / * \b__...__c/ -> \b__...__c/ * / \ / \ * / \ / \ * /a \ /d \ * * nodes b and c are not necessarily on the same branch */ if (!tree) return; if (!a || !b || !c || !d) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); ab = ba = cd = dc = bc = -1; for (i = 0; i < 3; i++) if (a->v[i] == b) { ab = i; break; } for (i = 0; i < 3; i++) if (b->v[i] == a) { ba = i; break; } for (i = 0; i < 3; i++) if (c->v[i] == d) { cd = i; break; } for (i = 0; i < 3; i++) if (d->v[i] == c) { dc = i; break; } for (i = 0; i < 3; i++) if (b->v[i] == c) { bc = i; break; } if (ab < 0 || ba < 0 || cd < 0 || dc < 0) { PhyML_Fprintf(stderr, "\n. ab=%d ba=%d cd=%d dc=%d bc=%d", ab, ba, cd, dc, bc); PhyML_Fprintf(stderr, "\n. Nodes %d %d %d %d.", a->num, b->num, c->num, d->num); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } a->v[ab] = c; d->v[dc] = b; b->v[ba] = d; c->v[cd] = a; b->b[ba] = d->b[dc]; c->b[cd] = a->b[ab]; (a->b[ab]->left == b) ? (a->b[ab]->left = c) : (a->b[ab]->rght = c); (d->b[dc]->left == c) ? (d->b[dc]->left = b) : (d->b[dc]->rght = b); for (i = 0; i < 3; i++) { if (a->b[ab]->left->v[i] == a->b[ab]->rght) a->b[ab]->l_r = i; if (a->b[ab]->rght->v[i] == a->b[ab]->left) a->b[ab]->r_l = i; if (d->b[dc]->left->v[i] == d->b[dc]->rght) d->b[dc]->l_r = i; if (d->b[dc]->rght->v[i] == d->b[dc]->left) d->b[dc]->r_l = i; } a->b[ab]->l_v1 = a->b[ab]->l_v2 = a->b[ab]->r_v1 = a->b[ab]->r_v2 = d->b[dc]->l_v1 = d->b[dc]->l_v2 = d->b[dc]->r_v1 = d->b[dc]->r_v2 = -1; for (i = 0; i < 3; i++) { if (i != a->b[ab]->l_r) { if (a->b[ab]->l_v1 < 0) a->b[ab]->l_v1 = i; else a->b[ab]->l_v2 = i; } if (i != a->b[ab]->r_l) { if (a->b[ab]->r_v1 < 0) a->b[ab]->r_v1 = i; else a->b[ab]->r_v2 = i; } if (i != d->b[dc]->l_r) { if (d->b[dc]->l_v1 < 0) d->b[dc]->l_v1 = i; else d->b[dc]->l_v2 = i; } if (i != d->b[dc]->r_l) { if (d->b[dc]->r_v1 < 0) d->b[dc]->r_v1 = i; else d->b[dc]->r_v2 = i; } } Update_Dirs(tree); if (tree->n_root != NULL) { tree->n_root->v[1] = tree->e_root->left; tree->n_root->v[2] = tree->e_root->rght; tree->n_root->b[1]->rght = tree->e_root->left; tree->n_root->b[2]->rght = tree->e_root->rght; } if (tree->next) Swap(a->next, b->next, c->next, d->next, tree->next); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_SubTree_Partial_Lk(t_edge *b_fcus, t_node *a, t_node *d, t_tree *tree) { int i; Update_Partial_Lk(tree, b_fcus, a); if (d->tax) return; else for (i = 0; i < 3; ++i) if (d->v[i] != a) Update_SubTree_Partial_Lk(d->b[i], d, d->v[i], tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Copy_Seq_Names_To_Tip_Labels(t_tree *tree, calign *data) { int i; for (i = 0; i < tree->n_otu; ++i) strcpy(tree->a_nodes[i]->name, data->c_seq[i]->name); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// calign *Copy_Cseq(calign *ori, option *io, t_tree *tree) { calign *new; int i, j, k, n_otu, n_rm, c_len; char **sp_names_in, **sp_names_out; if(tree != NULL && tree->is_mixt_tree == YES) return(MIXT_Copy_Cseq(ori,io,tree)); n_otu = ori->n_otu; c_len = ori->n_pattern; n_rm = ori->n_rm; sp_names_in = (char **)mCalloc(n_otu + n_rm, sizeof(char *)); for (i = 0; i < n_otu + n_rm; i++) { sp_names_in[i] = (char *)mCalloc(strlen(ori->c_seq[i]->name) + 1, sizeof(char)); strcpy(sp_names_in[i], ori->c_seq[i]->name); } sp_names_out = (char **)mCalloc(n_rm, sizeof(char *)); for (i = 0; i < ori->n_rm; i++) { sp_names_out[i] = (char *)mCalloc(strlen(ori->c_seq_rm[i]->name) + 1, sizeof(char)); strcpy(sp_names_out[i], ori->c_seq_rm[i]->name); } new = Make_Calign(n_otu + n_rm, c_len, io->state_len, ori->init_len, sp_names_in, ori->n_rm, sp_names_out); Init_Calign(n_otu, c_len, ori->init_len, new); new->n_rm = ori->n_rm; if (ori->n_masked > 0) { new->masked_pos = (int *)mCalloc(ori->n_masked, sizeof(int)); new->n_masked = ori->n_masked; for (i = 0; i < ori->n_masked; ++i) new->masked_pos[i] = ori->masked_pos[i]; } for (i = 0; i < ori->n_rm; ++i) { strcpy(new->c_seq_rm[i]->name, ori->c_seq_rm[i]->name); for (j = 0; j < ori->n_pattern; j++) { for (k = 0; k < io->state_len; ++k) new->c_seq_rm[i]->state[j * io->state_len + k] = ori->c_seq_rm[i]->state[j * io->state_len + k]; new->c_seq_rm[i]->is_ambigu[j] = ori->c_seq_rm[i]->is_ambigu[j]; } new->c_seq_rm[i]->len = ori->c_seq_rm[i]->len; new->c_seq_rm[i]->state[c_len * io->state_len] = '\0'; new->c_seq_rm[i]->is_duplicate = YES; } new->obs_pinvar = ori->obs_pinvar; for (i = 0; i < ori->n_otu; i++) new->c_seq[i]->num = ori->c_seq[i]->num; for (i = 0; i < ori->n_rm; i++) new->c_seq_rm[i]->num = ori->c_seq_rm[i]->num; for (i = 0; i < ori->init_len; i++) new->sitepatt[i] = ori->sitepatt[i]; for (j = 0; j < ori->n_pattern; j++) { for (i = 0; i < ori->n_otu; i++) { for (k = 0; k < io->state_len; k++) { new->c_seq[i]->state[j * io->state_len + k] = ori->c_seq[i]->state[j * io->state_len + k]; } new->c_seq[i]->is_ambigu[j] = ori->c_seq[i]->is_ambigu[j]; } new->wght[j] = ori->wght[j]; new->ambigu[j] = ori->ambigu[j]; new->invar[j] = ori->invar[j]; } for (i = 0; i < ori->n_otu; i++) { new->c_seq[i]->len = ori->c_seq[i]->len; strcpy(new->c_seq[i]->name, ori->c_seq[i]->name); new->c_seq[i]->is_duplicate = NO; } for (i = 0; i < ori->n_otu; i++) new->c_seq[i]->state[c_len * io->state_len] = '\0'; for (i = 0; i < T_MAX_ALPHABET; i++) new->obs_state_frq[i] = ori->obs_state_frq[i]; new->init_len = ori->init_len; new->clean_len = ori->clean_len; new->n_pattern = ori->n_pattern; new->n_otu = ori->n_otu; new->io = ori->io; for (i = n_otu; i < n_otu + n_rm; ++i) new->c_seq[i] = new->c_seq_rm[i - n_otu]; for (i = 0; i < ori->n_otu; i++) Free(sp_names_in[i]); Free(sp_names_in); for (i = 0; i < ori->n_rm; i++) Free(sp_names_out[i]); Free(sp_names_out); Check_Ambiguities(new, io->datatype, io->state_len); Set_D_States(new, io->datatype, io->state_len); return new; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Filexists(char *filename) { FILE *fp; fp = fopen(filename, "r"); if (fp) { fclose(fp); return 1; } else return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// matrix *K80_dist(calign *data, phydbl g_shape) { int i, j, k; matrix *mat; phydbl **len; len = (phydbl **)mCalloc(data->n_otu, sizeof(phydbl *)); for (i = 0; i < data->n_otu; i++) len[i] = (phydbl *)mCalloc(data->n_otu, sizeof(phydbl)); mat = Make_Mat(data->n_otu); Init_Mat(mat, data); for (i = 0; i < data->c_seq[0]->len; ++i) { for (j = 0; j < data->n_otu - 1; j++) { for (k = j + 1; k < data->n_otu; k++) { if (((data->c_seq[j]->state[i] == 'A' || data->c_seq[j]->state[i] == 'G') && (data->c_seq[k]->state[i] == 'C' || data->c_seq[k]->state[i] == 'T')) || ((data->c_seq[j]->state[i] == 'C' || data->c_seq[j]->state[i] == 'T') && (data->c_seq[k]->state[i] == 'A' || data->c_seq[k]->state[i] == 'G'))) { mat->Q[j][k] += data->wght[i]; len[j][k] += data->wght[i]; len[k][j] = len[j][k]; } else if (((data->c_seq[j]->state[i] == 'A' && data->c_seq[k]->state[i] == 'G') || (data->c_seq[j]->state[i] == 'G' && data->c_seq[k]->state[i] == 'A')) || ((data->c_seq[j]->state[i] == 'C' && data->c_seq[k]->state[i] == 'T') || (data->c_seq[j]->state[i] == 'T' && data->c_seq[k]->state[i] == 'C'))) { mat->P[j][k] += data->wght[i]; len[j][k] += data->wght[i]; len[k][j] = len[j][k]; } else if ((data->c_seq[j]->state[i] == 'A' || data->c_seq[j]->state[i] == 'C' || data->c_seq[j]->state[i] == 'G' || data->c_seq[j]->state[i] == 'T') && (data->c_seq[k]->state[i] == 'A' || data->c_seq[k]->state[i] == 'C' || data->c_seq[k]->state[i] == 'G' || data->c_seq[k]->state[i] == 'T')) { len[j][k] += data->wght[i]; len[k][j] = len[j][k]; } } } } for (i = 0; i < data->n_otu - 1; i++) for (j = i + 1; j < data->n_otu; j++) { if (len[i][j] > .0) { mat->P[i][j] /= len[i][j]; mat->Q[i][j] /= len[i][j]; } else { mat->P[i][j] = .5; mat->Q[i][j] = .5; } mat->P[j][i] = mat->P[i][j]; mat->Q[j][i] = mat->Q[i][j]; if ((1 - 2 * mat->P[i][j] - mat->Q[i][j] <= .0) || (1 - 2 * mat->Q[i][j] <= .0)) { mat->dist[i][j] = -1.; mat->dist[j][i] = -1.; continue; } mat->dist[i][j] = (g_shape / 2) * (POW(1 - 2 * mat->P[i][j] - mat->Q[i][j], -1. / g_shape) + 0.5 * POW(1 - 2 * mat->Q[i][j], -1. / g_shape) - 1.5); if (mat->dist[i][j] > DIST_MAX) mat->dist[i][j] = DIST_MAX; mat->dist[j][i] = mat->dist[i][j]; } for (i = 0; i < data->n_otu; i++) free(len[i]); free(len); return mat; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// matrix *JC69_Dist(calign *data, t_mod *mod) { int site, i, j, k; matrix *mat; phydbl **len; int datatype; len = (phydbl **)mCalloc(data->n_otu, sizeof(phydbl *)); for (i = 0; i < data->n_otu; i++) len[i] = (phydbl *)mCalloc(data->n_otu, sizeof(phydbl)); mat = Make_Mat(data->n_otu); Init_Mat(mat, data); datatype = mod->io->datatype; For(site, data->c_seq[0]->len) { for (j = 0; j < data->n_otu - 1; j++) { for (k = j + 1; k < data->n_otu; k++) { if ((!Is_Ambigu(data->c_seq[j]->state + site * mod->io->state_len, datatype, mod->io->state_len)) && (!Is_Ambigu(data->c_seq[k]->state + site * mod->io->state_len, datatype, mod->io->state_len))) { len[j][k] += data->wght[site]; len[k][j] = len[j][k]; if (strncmp(data->c_seq[j]->state + site * mod->io->state_len, data->c_seq[k]->state + site * mod->io->state_len, mod->io->state_len)) /* if(!Are_Compatible(data->c_seq[j]->state+site*mod->io->state_len, */ /* data->c_seq[k]->state+site*mod->io->state_len, */ /* mod->io->state_len, */ /* mod->io->datatype)) */ mat->P[j][k] += data->wght[site]; } } } } for (i = 0; i < data->n_otu - 1; i++) for (j = i + 1; j < data->n_otu; j++) { if (len[i][j] > .0) mat->P[i][j] /= len[i][j]; else mat->P[i][j] = 1.; mat->P[j][i] = mat->P[i][j]; if ((1. - (mod->ns) / (mod->ns - 1.) * mat->P[i][j]) < .0) mat->dist[i][j] = -1.; else mat->dist[i][j] = -(mod->ns - 1.) / (mod->ns) * (phydbl)log(1. - (mod->ns) / (mod->ns - 1.) * mat->P[i][j]); /* PhyML_Printf("\n. Incorrect JC distances"); */ /* mat->dist[i][j] = len[i][j]; */ if (mat->dist[i][j] > DIST_MAX) mat->dist[i][j] = DIST_MAX; mat->dist[j][i] = mat->dist[i][j]; } for (i = 0; i < data->n_otu; i++) free(len[i]); free(len); return mat; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// matrix *Hamming_Dist(calign *data, t_mod *mod) { int i, j, k; matrix *mat; phydbl **len; int datatype; len = (phydbl **)mCalloc(data->n_otu, sizeof(phydbl *)); for (i = 0; i < data->n_otu; i++) len[i] = (phydbl *)mCalloc(data->n_otu, sizeof(phydbl)); mat = Make_Mat(data->n_otu); Init_Mat(mat, data); datatype = mod->io->datatype; for (i = 0; i < data->n_pattern; i++) { for (j = 0; j < data->n_otu - 1; j++) { for (k = j + 1; k < data->n_otu; k++) { if ((!Is_Ambigu(data->c_seq[j]->state + i * mod->io->state_len, datatype, mod->io->state_len)) && (!Is_Ambigu(data->c_seq[k]->state + i * mod->io->state_len, datatype, mod->io->state_len))) { len[j][k] += data->wght[i]; len[k][j] = len[j][k]; /* if(data->c_seq[j]->state[i] != * data->c_seq[k]->state[i]) */ if (!Are_Compatible(data->c_seq[j]->state + i * mod->io->state_len, data->c_seq[k]->state + i * mod->io->state_len, mod->io->state_len, mod->io->datatype)) { mat->P[j][k] += data->wght[i]; } } } } } for (i = 0; i < data->n_otu - 1; i++) for (j = i + 1; j < data->n_otu; j++) { if (len[i][j] > .0) { mat->P[i][j] /= len[i][j]; } else { mat->P[i][j] = 1.; } mat->P[j][i] = mat->P[i][j]; mat->dist[i][j] = mat->P[i][j]; if (mat->dist[i][j] > DIST_MAX) { mat->dist[i][j] = DIST_MAX; } mat->dist[j][i] = mat->dist[i][j]; } for (i = 0; i < data->n_otu; i++) free(len[i]); free(len); return mat; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// short int Are_Sequences_Identical(align *seq1, align *seq2) { for (int i = 0; i < seq1->len; ++i) if (seq1->state[i] != seq2->state[i]) return NO; return YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Remove_Duplicates(calign *data, option *io, t_tree *tree) { int n_duplicates, n_removed, n_otu_orig, i, j, k; align *tmp; if (data->n_rm > 0) return; // Already removed duplicates if (io->leave_duplicates == YES) return; n_otu_orig = data->n_otu; if (n_otu_orig < 4) return; n_duplicates = 0; for (i = 0; i < data->n_otu - 1; ++i) { if (data->c_seq[i]->is_duplicate == YES) continue; else { for (j = i + 1; j < data->n_otu; ++j) { if (Are_Sequences_Identical(data->c_seq[i], data->c_seq[j]) == YES) { for (k = 0; k < n_otu_orig; ++k) if (!strcmp(tree->a_nodes[k]->name, data->c_seq[j]->name)) break; assert(k < n_otu_orig); if (tree->a_nodes[k]->b[0] != tree->e_root) data->c_seq[j]->is_duplicate = YES; else data->c_seq[i]->is_duplicate = YES; if (n_duplicates == 0) PhyML_Printf("\n"); PhyML_Printf("\n. Note: taxon '%s' is a duplicate of taxon '%s'.", data->c_seq[j]->name, data->c_seq[i]->name); n_duplicates++; } } } } n_removed = 0; for (i = 0; i < n_otu_orig; ++i) { if (data->c_seq[i]->is_duplicate == YES) { if (!n_removed) data->c_seq_rm = (align **)mCalloc(1, sizeof(align *)); else data->c_seq_rm = (align **)mRealloc(data->c_seq_rm, n_removed + 1, sizeof(align *)); data->c_seq_rm[n_removed] = data->c_seq[i]; n_removed++; if (n_otu_orig - n_removed == 3) { for (j = i + 1; j < n_otu_orig; ++j) data->c_seq[j]->is_duplicate = NO; i = n_otu_orig + 1; } } } data->n_rm = n_removed; if (!n_removed) return; for (i = 0; i < n_otu_orig; ++i) { if (data->c_seq[i]->is_duplicate == YES) { for (int j = i + 1; j < n_otu_orig; j++) { if (data->c_seq[j]->is_duplicate == NO) { tmp = data->c_seq[i]; data->c_seq[i] = data->c_seq[j]; data->c_seq[j] = tmp; break; } } } } Remove_Duplicates_From_Tree(data, tree); data->n_otu = tree->n_otu; io->n_otu = tree->n_otu; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Remove_Duplicates_From_Tree(calign *data, t_tree *tree) { int i, j; int n_otu_orig, idx; t_edge *res_edge; n_otu_orig = tree->n_otu; idx = -1; for (i = 0; i < n_otu_orig; ++i) { for (j = 0; j < n_otu_orig; ++j) { if (data->c_seq[j]->is_duplicate == YES && !strcmp(tree->a_nodes[i]->name, data->c_seq[j]->name) && tree->a_nodes[i]->b[0] != tree->e_root) { Prune_Subtree(tree->a_nodes[i]->v[0], tree->a_nodes[i], NULL, &res_edge, tree); assert(tree->a_edges[tree->a_nodes[i]->b[0]->num] == tree->a_nodes[i]->b[0]); idx = tree->a_nodes[i]->b[0]->num; Free_Edge_Length(tree->a_nodes[i]->b[0]); Free_Edge(tree->a_nodes[i]->b[0]); tree->a_edges[idx] = NULL; idx = res_edge->num; assert(tree->a_edges[res_edge->num] == res_edge); Free_Edge_Length(res_edge); Free_Edge(res_edge); tree->a_edges[idx] = NULL; idx = tree->a_nodes[i]->v[0]->num; Free_Node(tree->a_nodes[i]->v[0]); tree->a_nodes[idx] = NULL; Free_Node(tree->a_nodes[i]); tree->a_nodes[i] = NULL; break; } } } tree->a_nodes[2 * tree->n_otu - 2 - 2 * data->n_rm] = tree->a_nodes[2 * tree->n_otu - 2]; tree->a_edges[2 * tree->n_otu - 3 - 2 * data->n_rm] = tree->a_edges[2 * tree->n_otu - 3]; tree->a_edges[2 * tree->n_otu - 2 - 2 * data->n_rm] = tree->a_edges[2 * tree->n_otu - 2]; if (data->n_rm > 0) { tree->n_otu -= data->n_rm; Refactor_Tree(tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Insert_Duplicates(t_tree *tree) { unsigned int i, j; unsigned int idx_new_edge, idx_new_node, idx_root; t_edge *link_daughter, *residual, **new_a_edges, *b1, *b2; t_node *link, *daughter, **new_a_nodes, *n0; link_daughter = NULL; residual = NULL; link = NULL; daughter = NULL; idx_root = (tree->n_root) ? 1 : 3; n0 = tree->a_nodes[2 * tree->n_otu - 2]; b1 = tree->a_edges[2 * tree->n_otu - 2]; b2 = tree->a_edges[2 * tree->n_otu - 3]; new_a_nodes = (t_node **)mCalloc(2 * tree->n_otu - 1 + tree->data->n_rm * 2, sizeof(t_node *)); for (i = 0; i < tree->n_otu; ++i) new_a_nodes[i] = tree->a_nodes[i]; for (i = tree->n_otu; i < 2 * tree->n_otu - 1; ++i) { new_a_nodes[i + tree->data->n_rm] = tree->a_nodes[i]; new_a_nodes[i + tree->data->n_rm]->num = i + tree->data->n_rm; } Free(tree->a_nodes); tree->a_nodes = new_a_nodes; new_a_edges = (t_edge **)mCalloc(2 * tree->n_otu - 1 + tree->data->n_rm * 2, sizeof(t_edge *)); for (i = 0; i < 2 * tree->n_otu - 1; ++i) new_a_edges[i] = tree->a_edges[i]; idx_new_edge = 0; idx_new_node = 0; for (i = 0; i < tree->data->n_rm; ++i) { for (j = 0; j < tree->n_otu; ++j) { if (Are_Sequences_Identical(tree->data->c_seq_rm[i], tree->a_nodes[j]->c_seq) == YES) { link = Make_Node_Light(2 * tree->n_otu - idx_root + tree->data->n_rm + idx_new_node + 1); daughter = Make_Node_Light(tree->n_otu + idx_new_node); new_a_nodes[tree->n_otu + idx_new_node] = daughter; new_a_nodes[2 * tree->n_otu - idx_root + tree->data->n_rm + idx_new_node + 1] = link; idx_new_node += 1; daughter->c_seq = tree->data->c_seq_rm[i]; daughter->name = (char *)mCalloc( (int)strlen(tree->data->c_seq_rm[i]->name) + 1, sizeof(char)); daughter->ori_name = daughter->name; strcpy(daughter->name, tree->data->c_seq_rm[i]->name); link->v[0] = daughter; link->v[1] = NULL; link->v[2] = NULL; daughter->v[0] = link; daughter->v[1] = NULL; daughter->v[2] = NULL; daughter->tax = YES; link->tax = NO; link_daughter = Make_Edge_Light( link, daughter, 2 * tree->n_otu - idx_root + idx_new_edge); residual = Make_Edge_Light( daughter, link, 2 * tree->n_otu - idx_root + idx_new_edge + 1); new_a_edges[2 * tree->n_otu - idx_root + idx_new_edge] = link_daughter; new_a_edges[2 * tree->n_otu - idx_root + idx_new_edge + 1] = residual; new_a_edges[2 * tree->n_otu - idx_root + idx_new_edge]->rght = daughter; new_a_edges[2 * tree->n_otu - idx_root + idx_new_edge]->left = link; new_a_edges[2 * tree->n_otu - idx_root + idx_new_edge + 1]->rght = link; new_a_edges[2 * tree->n_otu - idx_root + idx_new_edge + 1]->left = tree->a_nodes[j]->b[0]->left; daughter->b[0] = link_daughter; link->b[0] = link_daughter; idx_new_edge += 2; Set_Scalar_Dbl(tree->mod->l_min, link_daughter->l); Multiply_Scalar_Dbl(2.0, tree->a_nodes[j]->b[0]->l); Graft_Subtree(tree->a_nodes[j]->b[0], link, daughter, residual, tree->a_nodes[j], tree); Set_Scalar_Dbl(tree->a_nodes[j]->b[0]->l->v, residual->l); Set_Scalar_Dbl(tree->mod->l_min, tree->a_nodes[j]->b[0]->l); residual->support_val = -1.; break; } } } Free(tree->a_edges); tree->a_edges = new_a_edges; tree->n_otu += tree->data->n_rm; Refactor_Tree(tree); tree->a_nodes[2 * tree->n_otu - 2] = n0; tree->a_edges[2 * tree->n_otu - 2] = b1; tree->a_edges[2 * tree->n_otu - 3] = b2; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Test if the given site pattern is invariant. Does not handle ambiguities */ int Is_Invar(int patt_num, int stepsize, int datatype, calign *data) { int i, j; for (i = 0; i < data->n_otu; i++) { for (j = 0; j < data->n_otu; j++) { if (!(Are_Compatible(data->c_seq[i]->state + patt_num, data->c_seq[j]->state + patt_num, stepsize, datatype))) { break; } } if (j != data->n_otu) break; } if (i == data->n_otu) return 1; else return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Is_Ambigu(char *state, int datatype, int stepsize) { int val, i; val = -1; if (datatype == NT) { for (i = 0; i < stepsize; i++) { switch (state[i]) { case 'A': case 'C': case 'G': case 'T': case 'U': { val = NO; break; } default: { val = YES; break; } } if (val == YES) break; } } else if (datatype == AA) { switch (state[0]) { case 'X': case '?': case '-': case '.': { val = YES; break; } default: { val = NO; break; } } } else if (datatype == GENERIC) { int i; for (i = 0; i < stepsize; i++) if (!isdigit(state[i])) break; if (i == stepsize) val = NO; else val = YES; } return val; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Check_Ambiguities(calign *data, int datatype, int stepsize) { int i, j; for (j = 0; j < data->n_pattern; j++) { data->ambigu[j] = NO; for (i = 0; i < data->n_otu; i++) { data->c_seq[i]->is_ambigu[j] = NO; } for (i = 0; i < data->n_otu; i++) { if (Is_Ambigu(data->c_seq[i]->state + j * stepsize, datatype, stepsize)) { data->ambigu[j] = YES; data->c_seq[i]->is_ambigu[j] = YES; } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_D_States(calign *data, int datatype, int stepsize) { int i, j; for (j = 0; j < data->n_pattern; j++) { for (i = 0; i < data->n_otu; i++) { if (data->c_seq[i]->is_ambigu[j] == NO) { data->c_seq[i]->d_state[j] = Assign_State(data->c_seq[i]->state + j, datatype, stepsize); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Get_State_From_Ui(int ui, int datatype) { if (datatype == NT) { switch (ui) { case 1: { return 0; break; } case 2: { return 1; break; } case 4: { return 2; break; } case 8: { return 3; break; } default: { PhyML_Fprintf(stderr, "\n. ui=%d", ui); PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); break; } } } else if (datatype == AA) { switch (ui) { case 1: { return 0; break; } case 2: { return 1; break; } case 4: { return 2; break; } case 8: { return 3; break; } case 16: { return 4; break; } case 32: { return 5; break; } case 64: { return 6; break; } case 128: { return 7; break; } case 256: { return 8; break; } case 512: { return 9; break; } case 1024: { return 10; break; } case 2048: { return 11; break; } case 4096: { return 12; break; } case 8192: { return 13; break; } case 16384: { return 14; break; } case 32768: { return 15; break; } case 65536: { return 16; break; } case 131072: { return 17; break; } case 262144: { return 18; break; } case 524288: { return 19; break; } default: { PhyML_Fprintf(stderr, "\n. ui=%d", ui); PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } } } else Generic_Exit(__FILE__, __LINE__, __FUNCTION__); return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Assign_State(char *c, int datatype, int stepsize) { int state[3]; int i; state[0] = state[1] = state[2] = -1; if (datatype == NT) { for (i = 0; i < stepsize; i++) { switch (c[i]) { case 'A': { state[i] = 0; break; } case 'C': { state[i] = 1; break; } case 'G': { state[i] = 2; break; } case 'T': { state[i] = 3; break; } case 'U': { state[i] = 3; break; } default: { state[i] = -1; break; } } } return (stepsize > 1) ? (state[0] * 16 + state[1] * 4 + state[2]) : (state[0]); } else if (datatype == AA) { switch (c[0]) { case 'A': { state[0] = 0; break; } case 'R': { state[0] = 1; break; } case 'N': { state[0] = 2; break; } case 'D': { state[0] = 3; break; } case 'C': { state[0] = 4; break; } case 'Q': { state[0] = 5; break; } case 'E': { state[0] = 6; break; } case 'G': { state[0] = 7; break; } case 'H': { state[0] = 8; break; } case 'I': { state[0] = 9; break; } case 'L': { state[0] = 10; break; } case 'K': { state[0] = 11; break; } case 'M': { state[0] = 12; break; } case 'F': { state[0] = 13; break; } case 'P': { state[0] = 14; break; } case 'S': { state[0] = 15; break; } case 'T': { state[0] = 16; break; } case 'W': { state[0] = 17; break; } case 'Y': { state[0] = 18; break; } case 'V': { state[0] = 19; break; } case 'B': { state[0] = 2; break; } case 'Z': { state[0] = 5; break; } default: { state[0] = -1; break; } } return state[0]; } else if (datatype == GENERIC) { char format[6]; int ret; sprintf(format, "%%%dd", stepsize); ret = sscanf(c, format, state); if (!ret) state[0] = -1; return state[0]; } else { PhyML_Printf("\n. Not implemented yet.\n"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char Reciproc_Assign_State(int i_state, int datatype) { if (datatype == NT) { i_state = i_state % 4; switch (i_state) { case 0: { return 'A'; break; } case 1: { return 'C'; break; } case 2: { return 'G'; break; } case 3: { return 'T'; break; } default: { PhyML_Printf("\n. i_state = %d", i_state); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); break; } } } else if (datatype == AA) { i_state = i_state % 20; switch (i_state) { case 0: { return 'A'; break; } case 1: { return 'R'; break; } case 2: { return 'N'; break; } case 3: { return 'D'; break; } case 4: { return 'C'; break; } case 5: { return 'Q'; break; } case 6: { return 'E'; break; } case 7: { return 'G'; break; } case 8: { return 'H'; break; } case 9: { return 'I'; break; } case 10: { return 'L'; break; } case 11: { return 'K'; break; } case 12: { return 'M'; break; } case 13: { return 'F'; break; } case 14: { return 'P'; break; } case 15: { return 'S'; break; } case 16: { return 'T'; break; } case 17: { return 'W'; break; } case 18: { return 'Y'; break; } case 19: { return 'V'; break; } default: { PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); break; } } } else if (datatype == GENERIC) { return i_state + '0'; } return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Assign_State_With_Ambiguity(char *c, int datatype, int stepsize) { int state[3]; int i; state[0] = state[1] = state[2] = -1; if (datatype == NT) { for (i = 0; i < stepsize; i++) { switch (c[i]) { case 'A': { state[i] = 0; break; } case 'C': { state[i] = 1; break; } case 'G': { state[i] = 2; break; } case 'T': { state[i] = 3; break; } case 'U': { state[i] = 3; break; } case 'M': { state[i] = 4; break; } case 'R': { state[i] = 5; break; } case 'W': { state[i] = 6; break; } case 'S': { state[i] = 7; break; } case 'Y': { state[i] = 8; break; } case 'K': { state[i] = 9; break; } case 'B': { state[i] = 10; break; } case 'D': { state[i] = 11; break; } case 'H': { state[i] = 12; break; } case 'V': { state[i] = 13; break; } case 'N': case 'X': case '?': case 'O': case '-': { state[i] = T_MAX_ALPHABET - 1; break; } default: { PhyML_Printf("\n. Unknown character state : '%c'\n", c[i]); Warn_And_Exit("\n. Init failed (data type supposed to be DNA)\n"); break; } } } return (stepsize > 1) ? (state[0] * 16 + state[1] * 4 + state[2]) : (state[0]); } else if (datatype == AA) { switch (c[0]) { case 'A': { state[0] = 0; break; } case 'R': { state[0] = 1; break; } case 'N': { state[0] = 2; break; } case 'D': { state[0] = 3; break; } case 'C': { state[0] = 4; break; } case 'Q': { state[0] = 5; break; } case 'E': { state[0] = 6; break; } case 'G': { state[0] = 7; break; } case 'H': { state[0] = 8; break; } case 'I': { state[0] = 9; break; } case 'L': { state[0] = 10; break; } case 'K': { state[0] = 11; break; } case 'M': { state[0] = 12; break; } case 'F': { state[0] = 13; break; } case 'P': { state[0] = 14; break; } case 'S': { state[0] = 15; break; } case 'T': { state[0] = 16; break; } case 'W': { state[0] = 17; break; } case 'Y': { state[0] = 18; break; } case 'V': { state[0] = 19; break; } case 'B': { state[0] = 2; break; } case 'Z': { state[0] = 5; break; } case 'X': case '?': case '-': { state[0] = T_MAX_ALPHABET - 1; break; } default: { PhyML_Printf("\n. Unknown character state : '%c'\n", state[0]); Warn_And_Exit("\n. Init failed (data type supposed to be amino-acids)\n"); break; } } return state[0]; } else if (datatype == GENERIC) { if (Is_Ambigu(c, GENERIC, stepsize)) state[0] = T_MAX_ALPHABET - 1; else { char format[20]; sprintf(format, "%%%dd", stepsize); if (!sscanf(c, format, state)) { PhyML_Printf("\n. Error reading character. Was expecting an integer, " "got '%c' instead.\n", c[0]); PhyML_Printf("\n. Err. in file %s at line %d (function '%s')\n", __FILE__, __LINE__, __FUNCTION__); Warn_And_Exit("\n. PhyML finished prematurely."); } } return state[0]; } return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Clean_Tree_Connections(t_tree *tree) { int i; For(i, 2 * tree->n_otu - 2) { tree->a_nodes[i]->v[0] = NULL; tree->a_nodes[i]->v[1] = NULL; tree->a_nodes[i]->v[2] = NULL; tree->a_nodes[i]->b[0] = NULL; tree->a_nodes[i]->b[1] = NULL; tree->a_nodes[i]->b[2] = NULL; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* if tbe_bootstrap == 0 => Classical FBP (Felsenstein bootstrap proportions) else => TBE (Transfer bootstrap expectation) */ void Bootstrap(t_tree *tree) { int *site_num, n_site; int replicate, j, k; int position, init_len; calign *boot_data; t_tree *boot_tree; t_mod *boot_mod; matrix *boot_mat; char *s; /* phydbl rf; */ if (tree->is_mixt_tree == YES) { PhyML_Printf("\n. Bootstrap option not yet available for partition/mixture " "analysis..."); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } tree->io->print_support_val = YES; boot_tree = NULL; site_num = (int *)mCalloc(tree->data->init_len, sizeof(int)); Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree); n_site = 0; for (j = 0; j < tree->data->n_pattern; j++) for (k = 0; k < tree->data->wght[j]; ++k) { site_num[n_site] = j; n_site++; } boot_data = Copy_Cseq(tree->data, tree->io, NULL); PhyML_Printf("\n\n. Non parametric bootstrap analysis \n\n"); PhyML_Printf(" ["); for (replicate = 0; replicate < tree->io->n_boot_replicates; replicate++) { for (j = 0; j < boot_data->n_pattern; j++) boot_data->wght[j] = 0; init_len = 0; for (j = 0; j < boot_data->init_len; j++) { position = Rand_Int(0, (int)(tree->data->init_len - 1.0)); boot_data->wght[site_num[position]] += 1; init_len++; } if (init_len != tree->data->init_len) Exit("\n. Pb. when copying sequences\n"); init_len = 0; for (j = 0; j < boot_data->n_pattern; j++) init_len += boot_data->wght[j]; if (init_len != tree->data->init_len) Exit("\n. Pb. when copying sequences\n"); if (tree->io->datatype == NT) Get_Base_Freqs(boot_data); else if (tree->io->datatype == AA) Get_AA_Freqs(boot_data); if (tree->io->random_boot_seq_order) Randomize_Sequence_Order(boot_data); Set_D_States(boot_data, tree->io->datatype, tree->io->state_len); boot_mod = Copy_Model(tree->mod); boot_mod->s_opt = tree->mod->s_opt; /* WARNING: re-using the same address here instead of creating a copying requires to leave the value of s_opt unchanged during the boostrap. */ boot_mod->io = tree->io; /* WARNING: re-using the same address here instead of creating a copying requires to leave the value of io unchanged during the boostrap. */ Init_Model(boot_data, boot_mod, tree->io); Set_Model_Parameters(boot_mod); if (tree->io->in_tree == 2) { rewind(tree->io->fp_in_tree); boot_tree = Read_Tree_File_Phylip(tree->io->fp_in_tree); Remove_Duplicates_From_Tree(boot_data, boot_tree); } else { boot_mat = ML_Dist(boot_data, boot_mod); boot_mat->tree = Make_Tree_From_Scratch(boot_data->n_otu, boot_data); Fill_Missing_Dist(boot_mat); Bionj(boot_mat); boot_tree = boot_mat->tree; boot_tree->mat = boot_mat; } boot_tree->mod = boot_mod; boot_tree->io = tree->io; boot_tree->data = boot_data; boot_tree->verbose = VL0; boot_tree->io->print_site_lnl = NO; boot_tree->io->print_trace = NO; boot_tree->io->print_json_trace = NO; boot_tree->n_root = NULL; boot_tree->e_root = NULL; boot_tree->l_ev = tree->l_ev; boot_tree->p_lk_left_pi = tree->p_lk_left_pi; #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || \ defined(__SSE2__) || defined(__SSE3__)) boot_tree->_tPij1 = tree->_tPij1; boot_tree->_tPij2 = tree->_tPij2; boot_tree->_pmat1plk1 = tree->_pmat1plk1; boot_tree->_pmat2plk2 = tree->_pmat2plk2; boot_tree->_plk0 = tree->_plk0; boot_tree->_l_ev = tree->_l_ev; boot_tree->_r_ev = tree->_r_ev; boot_tree->_prod_left = tree->_prod_left; boot_tree->_prod_rght = tree->_prod_rght; #endif Set_Both_Sides(YES, boot_tree); if ((boot_tree->mod->s_opt->random_input_tree) && (boot_tree->mod->s_opt->topo_search == SPR_MOVE)) Random_Tree(boot_tree); Connect_CSeqs_To_Nodes(boot_data, tree->io, boot_tree); /* Make_Tree_For_Pars(boot_tree); */ /* Make_Tree_For_Lk(boot_tree); */ /* Make_Spr(boot_tree); */ Check_Br_Lens(boot_tree); Share_Lk_Struct(tree, boot_tree); Share_Spr_Struct(tree, boot_tree); Share_Pars_Struct(tree, boot_tree); Update_Dirs(boot_tree); Init_Partial_Lk_Tips_Double(boot_tree); Init_Ui_Tips(boot_tree); Init_Partial_Pars_Tips(boot_tree); Br_Len_Not_Involving_Invar(boot_tree); if (boot_tree->io->do_alias_subpatt) { MIXT_Set_Alias_Subpatt(YES, boot_tree); Lk(NULL, boot_tree); MIXT_Set_Alias_Subpatt(NO, boot_tree); } Set_Update_Eigen(YES, boot_tree->mod); Lk(NULL, boot_tree); Set_Update_Eigen(NO, boot_tree->mod); if (boot_tree->mod->s_opt->opt_topo) { Global_Spr_Search(boot_tree); } else { if (boot_tree->mod->s_opt->opt_subst_param || boot_tree->mod->s_opt->opt_bl_one_by_one) Round_Optimize(boot_tree, ROUND_MAX); else Lk(NULL, boot_tree); } Free_Bip(boot_tree); Alloc_Bip(boot_tree); Match_Tip_Numbers(tree, boot_tree); Get_Bip(boot_tree->a_nodes[0], boot_tree->a_nodes[0]->v[0], boot_tree); if (tree->io->do_boot) Compare_Bip(tree, boot_tree, NO, TREE_COMP_RF_PLAIN); else if (tree->io->do_tbe) Compare_Bip_Distance(tree, boot_tree); else assert(FALSE); Check_Br_Lens(boot_tree); Br_Len_Involving_Invar(boot_tree); if (tree->io->print_boot_trees) { s = Write_Tree(boot_tree); PhyML_Fprintf(tree->io->fp_out_boot_tree, "%s\n", s); Free(s); Print_Fp_Out_Lines(tree->io->fp_out_boot_stats, 0, 0, boot_tree, tree->io, replicate + 1); } PhyML_Printf("."); #ifndef QUIET fflush(stdout); #endif if (!((replicate + 1) % tree->io->boot_prog_every)) { PhyML_Printf("] %4d/%4d\n ", replicate + 1, tree->io->n_boot_replicates); if (replicate != tree->io->n_boot_replicates - 1) PhyML_Printf("["); } Free_Tree(boot_tree); Free_Model(boot_mod); } if (((replicate) % tree->io->boot_prog_every)) PhyML_Printf("] %4d/%4d\n ", replicate, tree->io->n_boot_replicates); tree->lock_topo = YES; /* Topology should not be modified afterwards */ if (tree->io->print_boot_trees) { fclose(tree->io->fp_out_boot_tree); fclose(tree->io->fp_out_boot_stats); } Free_Calign(boot_data); Free(site_num); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Br_Len_Involving_Invar(t_tree *tree) { int i; if (tree->is_mixt_tree) { MIXT_Br_Len_Involving_Invar(tree); return; } for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l->v *= (1.0 - tree->mod->ras->pinvar->v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Br_Len_Not_Involving_Invar(t_tree *tree) { int i; if (tree->is_mixt_tree) { MIXT_Br_Len_Not_Involving_Invar(tree); return; } For(i, 2 * tree->n_otu - 1) tree->a_edges[i]->l->v /= (1.0 - tree->mod->ras->pinvar->v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Getstring_Stdin(char *s) { if (!fgets(s, T_MAX_LINE, stdin)) Exit(""); if (strchr(s, '\n') != NULL) *strchr(s, '\n') = '\0'; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Num_Derivatives_One_Param(phydbl (*func)(t_tree *tree), t_tree *tree, phydbl f0, phydbl *param, int which, int n_param, phydbl stepsize, short int logt, short int expt, phydbl *err, int precise, int is_positive) { int i, j; phydbl errt, fac, hh, **a, ans, *sign; int n_iter; sign = (phydbl *)mCalloc(n_param, sizeof(phydbl)); a = (phydbl **)mCalloc(11, sizeof(phydbl *)); for (i = 0; i < 11; i++) a[i] = (phydbl *)mCalloc(11, sizeof(phydbl)); n_iter = 10; /* */ ans = .0; if (stepsize < SMALL) Warn_And_Exit("\n. h must be nonzero in Dfridr."); hh = stepsize; if (!precise) { param[which] = param[which] + hh; if (expt == YES) for (i = 0; i < n_param; i++) param[i] = log(param[i]); if (logt == YES) for (i = 0; i < n_param; i++) param[i] = exp(MIN(1.E+2, param[i])); for (i = 0; i < n_param; i++) sign[i] = param[i] > .0 ? 1. : -1.; if (is_positive == YES) for (i = 0; i < n_param; i++) param[i] = FABS(param[i]); a[0][0] = (*func)(tree); if (is_positive == YES) for (i = 0; i < n_param; i++) param[i] *= sign[i]; if (logt == YES) for (i = 0; i < n_param; i++) param[i] = log(param[i]); if (expt == YES) for (i = 0; i < n_param; i++) param[i] = exp(param[i]); a[0][0] -= f0; a[0][0] /= hh; param[which] = param[which] - hh; ans = a[0][0]; } else { param[which] = param[which] + hh; if (expt == YES) for (i = 0; i < n_param; i++) param[i] = log(param[i]); if (logt == YES) for (i = 0; i < n_param; i++) param[i] = exp(MIN(1.E+2, param[i])); for (i = 0; i < n_param; i++) sign[i] = param[i] > .0 ? 1. : -1.; if (is_positive == YES) for (i = 0; i < n_param; i++) param[i] = FABS(param[i]); a[0][0] = (*func)(tree); if (is_positive == YES) for (i = 0; i < n_param; i++) param[i] *= sign[i]; if (logt == YES) for (i = 0; i < n_param; i++) param[i] = log(param[i]); if (expt == YES) for (i = 0; i < n_param; i++) param[i] = exp(param[i]); param[which] = param[which] - 2 * hh; a[0][0] -= (*func)(tree); a[0][0] /= (2.0 * hh); param[which] = param[which] + hh; /* a[0][0] -= f0; */ /* a[0][0] /= hh; */ /* param[which] = param[which]-hh; */ *err = 1e30; for (i = 1; i < n_iter; i++) { hh /= 1.4; /* param[which] = param[which]+hh; */ /* a[0][i] = (*func)(tree); */ /* param[which] = param[which]-2*hh; */ /* a[0][i] -= (*func)(tree); */ /* a[0][i] /= (2.0*hh); */ /* param[which] = param[which]+hh; */ param[which] = param[which] + hh; if (expt == YES) for (j = 0; j < n_param; j++) param[j] = log(param[j]); if (logt == YES) for (j = 0; j < n_param; j++) param[j] = exp(MIN(1.E+2, param[j])); for (i = 0; i < n_param; i++) sign[i] = param[i] > .0 ? 1. : -1.; if (is_positive == YES) for (i = 0; i < n_param; i++) param[i] = FABS(param[i]); a[0][i] = (*func)(tree); if (is_positive == YES) for (i = 0; i < n_param; i++) param[i] *= sign[i]; if (logt == YES) for (j = 0; j < n_param; j++) param[j] = log(param[j]); if (expt == YES) for (j = 0; j < n_param; j++) param[j] = exp(param[j]); param[which] = param[which] - 2 * hh; a[0][i] -= (*func)(tree); a[0][i] /= (2.0 * hh); param[which] = param[which] + hh; /* a[0][i] -= f0; */ /* a[0][i] /= hh; */ /* param[which] = param[which]-hh; */ /* printf("\n. f0=%f f1=%f hh=%G %f",f0,a[0][0],hh,param[which]); */ fac = 1.4 * 1.4; for (j = 1; j <= i; j++) { a[j][i] = (a[j - 1][i] * fac - a[j - 1][i - 1]) / (fac - 1.0); fac = 1.4 * 1.4 * fac; errt = MAX(FABS(a[j][i] - a[j - 1][i]), FABS(a[j][i] - a[j - 1][i - 1])); if (errt <= *err) { *err = errt; ans = a[j][i]; } } if (FABS(a[i][i] - a[i - 1][i - 1]) >= 2.0 * (*err)) break; } } for (i = 0; i < 11; i++) Free(a[i]); Free(a); Free(sign); return ans; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Num_Derivatives_One_Param_Nonaligned( phydbl (*func)(t_tree *tree), t_tree *tree, phydbl f0, phydbl **param, int which, int n_param, phydbl stepsize, short int logt, short int expt, phydbl *err, int precise, int is_positive) { int i, j; phydbl errt, fac, hh, **a, ans, *sign; int n_iter; sign = (phydbl *)mCalloc(n_param, sizeof(phydbl)); a = (phydbl **)mCalloc(11, sizeof(phydbl *)); for (i = 0; i < 11; i++) a[i] = (phydbl *)mCalloc(11, sizeof(phydbl)); n_iter = 10; /* */ ans = .0; if (stepsize < SMALL) Warn_And_Exit("\n. h must be nonzero in Dfridr."); hh = stepsize; if (!precise) { *(param[which]) = *(param[which]) + hh; if (expt == YES) for (i = 0; i < n_param; i++) *(param[i]) = log(*(param[i])); if (logt == YES) for (i = 0; i < n_param; i++) *(param[i]) = exp(MIN(1.E+2, *(param[i]))); for (i = 0; i < n_param; i++) sign[i] = (*(param[i])) > .0 ? 1. : -1.; if (is_positive == YES) for (i = 0; i < n_param; i++) (*(param[i])) = FABS(*(param[i])); a[0][0] = (*func)(tree); if (is_positive == YES) for (i = 0; i < n_param; i++) (*(param[i])) *= sign[i]; if (logt == YES) for (i = 0; i < n_param; i++) *(param[i]) = log(*(param[i])); if (expt == YES) for (i = 0; i < n_param; i++) *(param[i]) = exp(*(param[i])); /* printf("\n. f0=%f f1=%f hh=%G %f",f0,a[0][0],hh,*(param[which])); */ a[0][0] -= f0; a[0][0] /= hh; *(param[which]) = *(param[which]) - hh; ans = a[0][0]; } else { *(param[which]) = *(param[which]) + hh; if (expt == YES) for (i = 0; i < n_param; i++) *(param[i]) = log(*(param[i])); if (logt == YES) for (i = 0; i < n_param; i++) *(param[i]) = exp(MIN(1.E+2, *(param[i]))); for (i = 0; i < n_param; i++) sign[i] = (*(param[i])) > .0 ? 1. : -1.; if (is_positive == YES) for (i = 0; i < n_param; i++) (*(param[i])) = FABS(*(param[i])); a[0][0] = (*func)(tree); if (is_positive == YES) for (i = 0; i < n_param; i++) (*(param[i])) *= sign[i]; if (logt == YES) for (i = 0; i < n_param; i++) *(param[i]) = log(*(param[i])); if (expt == YES) for (i = 0; i < n_param; i++) *(param[i]) = exp(*(param[i])); /* *(param[which]) = *(param[which])-2*hh; */ /* a[0][0] -= (*func)(tree); */ /* a[0][0] /= (2.0*hh); */ /* *(param[which]) = *(param[which])+hh; */ a[0][0] -= f0; a[0][0] /= hh; *(param[which]) = *(param[which]) - hh; *err = 1e30; for (i = 1; i < n_iter; i++) { hh /= 1.4; /* *(param[which] = *(param[which]+hh; */ /* a[0][i] = (*func)(tree); */ /* *(param[which] = *(param[which]-2*hh; */ /* a[0][i] -= (*func)(tree); */ /* a[0][i] /= (2.0*hh); */ /* *(param[which] = *(param[which]+hh; */ *(param[which]) = *(param[which]) + hh; if (expt == YES) for (j = 0; j < n_param; j++) *(param[j]) = log(*(param[j])); if (logt == YES) for (j = 0; j < n_param; j++) *(param[j]) = exp(MIN(1.E+2, *(param[j]))); for (i = 0; i < n_param; i++) sign[i] = (*(param[i])) > .0 ? 1. : -1.; if (is_positive == YES) for (i = 0; i < n_param; i++) (*(param[i])) = FABS(*(param[i])); a[0][i] = (*func)(tree); if (is_positive == YES) for (i = 0; i < n_param; i++) (*(param[i])) *= sign[i]; if (logt == YES) for (j = 0; j < n_param; j++) *(param[j]) = log(*(param[j])); if (expt == YES) for (j = 0; j < n_param; j++) *(param[j]) = exp(*(param[j])); /* *(param[which] = *(param[which]-2*hh; */ /* a[0][i] -= (*func)(tree); */ /* a[0][i] /= (2.0*hh); */ /* *(param[which] = *(param[which]+hh; */ a[0][i] -= f0; a[0][i] /= hh; *(param[which]) = *(param[which]) - hh; fac = 1.4 * 1.4; for (j = 1; j <= i; j++) { a[j][i] = (a[j - 1][i] * fac - a[j - 1][i - 1]) / (fac - 1.0); fac = 1.4 * 1.4 * fac; errt = MAX(FABS(a[j][i] - a[j - 1][i]), FABS(a[j][i] - a[j - 1][i - 1])); if (errt <= *err) { *err = errt; ans = a[j][i]; } } if (FABS(a[i][i] - a[i - 1][i - 1]) >= 2.0 * (*err)) break; } } for (i = 0; i < 11; i++) Free(a[i]); Free(a); Free(sign); return ans; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Num_Derivative_Several_Param(t_tree *tree, phydbl *param, int n_param, phydbl stepsize, short int logt, short int expt, phydbl (*func)(t_tree *tree), phydbl *derivatives, int is_positive) { int i; phydbl err, f0, *sign; sign = (phydbl *)mCalloc(n_param, sizeof(phydbl)); if (expt == YES) for (i = 0; i < n_param; i++) param[i] = log(param[i]); if (logt == YES) for (i = 0; i < n_param; i++) param[i] = exp(MIN(1.E+2, param[i])); for (i = 0; i < n_param; i++) sign[i] = (param[i]) > .0 ? 1. : -1.; if (is_positive == YES) for (i = 0; i < n_param; i++) param[i] = FABS(param[i]); f0 = (*func)(tree); if (is_positive == YES) for (i = 0; i < n_param; i++) param[i] *= sign[i]; if (logt == YES) for (i = 0; i < n_param; i++) param[i] = log(param[i]); if (expt == YES) for (i = 0; i < n_param; i++) param[i] = exp(param[i]); for (i = 0; i < n_param; i++) { /* for(int j=0;jmod->r_mat->n_diff_rr;j++) PhyML_Printf("\n. 00%d * %f",i,tree->mod->r_mat->rr_val->v[j]); */ derivatives[i] = Num_Derivatives_One_Param(func, tree, f0, param, i, n_param, stepsize, logt, expt, &err, NO, is_positive); } Free(sign); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Num_Derivative_Several_Param_Nonaligned(t_tree *tree, phydbl **param, int n_param, phydbl stepsize, short int logt, short int expt, phydbl (*func)(t_tree *tree), phydbl *derivatives, int is_positive) { int i; phydbl err, f0, *sign; sign = (phydbl *)mCalloc(n_param, sizeof(phydbl)); if (expt == YES) for (i = 0; i < n_param; i++) (*(param[i])) = log(*(param[i])); if (logt == YES) for (i = 0; i < n_param; i++) (*(param[i])) = exp(MIN(1.E+2, *(param[i]))); for (i = 0; i < n_param; i++) sign[i] = (*(param[i])) > .0 ? 1. : -1.; if (is_positive == YES) for (i = 0; i < n_param; i++) *(param[i]) = FABS(*(param[i])); f0 = (*func)(tree); if (is_positive == YES) for (i = 0; i < n_param; i++) *(param[i]) *= sign[i]; if (logt == YES) for (i = 0; i < n_param; i++) (*(param[i])) = log(*(param[i])); if (expt == YES) for (i = 0; i < n_param; i++) (*(param[i])) = exp(*(param[i])); for (i = 0; i < n_param; i++) { derivatives[i] = Num_Derivatives_One_Param_Nonaligned( func, tree, f0, param, i, n_param, stepsize, logt, expt, &err, 0, is_positive); } Free(sign); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Compare_Two_States(char *state1, char *state2, int state_size) { /* 1 the two states are identical */ /* 0 the two states are different */ int i; for (i = 0; i < state_size; i++) if (state1[i] != state2[i]) break; return (i == state_size) ? (1) : (0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Copy_One_State(char *from, char *to, int state_size) { int i; for (i = 0; i < state_size; ++i) to[i] = from[i]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Copy_Dist(phydbl **cpy, phydbl **orig, int n) { int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) cpy[i][j] = orig[i][j]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_mod *Copy_Model(t_mod *ori) { t_mod *cpy; cpy = Make_Model_Basic(); cpy->ns = ori->ns; cpy->ras->n_catg = ori->ras->n_catg; cpy->whichmodel = ori->whichmodel; cpy->io = ori->io; cpy->gamma_mgf_bl = ori->gamma_mgf_bl; Make_Model_Complete(cpy); Record_Model(ori, cpy); #ifdef BEAGLE cpy->b_inst = ori->b_inst; cpy->optimizing_topology = ori->optimizing_topology; #endif return cpy; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Record_Model(t_mod *ori, t_mod *cpy) { int i; cpy->ns = ori->ns; cpy->ras->n_catg = ori->ras->n_catg; cpy->ras->normalise_rr = ori->ras->normalise_rr; cpy->l_var_sigma->v = ori->l_var_sigma->v; cpy->kappa->v = ori->kappa->v; cpy->ras->alpha->v = ori->ras->alpha->v; cpy->lambda->v = ori->lambda->v; cpy->ras->pinvar->v = ori->ras->pinvar->v; cpy->br_len_mult->v = ori->br_len_mult->v; strcpy(cpy->modelname->s, ori->modelname->s); strcpy(cpy->custom_mod_string->s, ori->custom_mod_string->s); strcpy(cpy->aa_rate_mat_file->s, ori->aa_rate_mat_file->s); cpy->mod_num = ori->mod_num; cpy->whichmodel = ori->whichmodel; cpy->update_eigen = ori->update_eigen; cpy->ras->invar = ori->ras->invar; cpy->r_mat->n_diff_rr = ori->r_mat->n_diff_rr; cpy->l_min = ori->l_min; cpy->l_max = ori->l_max; cpy->log_l = ori->log_l; cpy->ras->free_mixt_rates = ori->ras->free_mixt_rates; cpy->ras->gamma_median = ori->ras->gamma_median; if ((ori->whichmodel == CUSTOM) || (ori->whichmodel == GTR)) { for (i = 0; i < ori->ns * (ori->ns - 1) / 2; ++i) { cpy->r_mat->rr_num->v[i] = ori->r_mat->rr_num->v[i]; cpy->r_mat->rr_val->v[i] = ori->r_mat->rr_val->v[i]; cpy->r_mat->rr->v[i] = ori->r_mat->rr->v[i]; cpy->r_mat->n_rr_per_cat->v[i] = ori->r_mat->n_rr_per_cat->v[i]; } } for (i = 0; i < cpy->ns; i++) { cpy->e_frq->pi->v[i] = ori->e_frq->pi->v[i]; cpy->e_frq->pi_unscaled->v[i] = ori->e_frq->pi_unscaled->v[i]; cpy->e_frq->user_b_freq->v[i] = ori->e_frq->user_b_freq->v[i]; } for (i = 0; i < cpy->ns * cpy->ns; ++i) cpy->r_mat->qmat->v[i] = ori->r_mat->qmat->v[i]; for (i = 0; i < cpy->ras->n_catg; i++) { cpy->ras->gamma_r_proba->v[i] = ori->ras->gamma_r_proba->v[i]; cpy->ras->gamma_rr->v[i] = ori->ras->gamma_rr->v[i]; cpy->ras->gamma_r_proba_unscaled->v[i] = ori->ras->gamma_r_proba_unscaled->v[i]; cpy->ras->gamma_rr_unscaled->v[i] = ori->ras->gamma_rr_unscaled->v[i]; } cpy->use_m4mod = ori->use_m4mod; cpy->eigen->size = ori->eigen->size; for (i = 0; i < 2 * ori->ns; ++i) cpy->eigen->space[i] = ori->eigen->space[i]; for (i = 0; i < 2 * ori->ns; ++i) cpy->eigen->space_int[i] = ori->eigen->space_int[i]; for (i = 0; i < ori->ns; i++) cpy->eigen->e_val[i] = ori->eigen->e_val[i]; for (i = 0; i < ori->ns; i++) cpy->eigen->e_val_im[i] = ori->eigen->e_val_im[i]; for (i = 0; i < ori->ns * ori->ns; ++i) cpy->eigen->r_e_vect[i] = ori->eigen->r_e_vect[i]; for (i = 0; i < ori->ns * ori->ns; ++i) cpy->eigen->r_e_vect[i] = ori->eigen->r_e_vect[i]; for (i = 0; i < ori->ns * ori->ns; ++i) cpy->eigen->r_e_vect_im[i] = ori->eigen->r_e_vect_im[i]; for (i = 0; i < ori->ns * ori->ns; ++i) cpy->eigen->l_e_vect[i] = ori->eigen->l_e_vect[i]; for (i = 0; i < ori->ns * ori->ns; ++i) cpy->eigen->q[i] = ori->eigen->q[i]; #ifdef BEAGLE cpy->b_inst = ori->b_inst; cpy->optimizing_topology = ori->optimizing_topology; #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Test_Node_Table_Consistency(t_tree *tree) { int i; For(i, 2 * tree->n_otu - 2) { if (tree->a_nodes[i]->num != i) { PhyML_Printf("\n. Node table is not consistent with node numbers."); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Bip(t_node *a, t_node *d, t_tree *tree) { int i, j; t_node *tmp; int swapped; if (!d || !a || !tree) { PhyML_Printf("\n. d: %p a: %p tree: %p", d, a, tree); PhyML_Printf("\n. Err. in file %s at line %d (function '%s').\n", __FILE__, __LINE__, __FUNCTION__); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } if (d->tax) { if (d->common) { d->bip_node[0] = (t_node **)mCalloc(1, sizeof(t_node *)); d->bip_node[0][0] = d; d->bip_size[0] = 1; d->bip_size[1] = -1; d->bip_size[2] = -1; for (i = 0; i < 3; i++) { if (a->v[i] == d) { a->bip_size[i] = 0; for (j = 0; j < tree->n_otu; j++) { if (strcmp(tree->a_nodes[j]->name, d->name)) { a->bip_node[i] = (t_node **)realloc( a->bip_node[i], (a->bip_size[i] + 1) * sizeof(t_node *)); a->bip_node[i][a->bip_size[i]] = tree->a_nodes[j]; a->bip_size[i]++; } } /* Sort bipartition */ do { swapped = NO; For(j, a->bip_size[i] - 1) { if (a->bip_node[i][j]->num > a->bip_node[i][j + 1]->num) { swapped = YES; tmp = a->bip_node[i][j]; a->bip_node[i][j] = a->bip_node[i][j + 1]; a->bip_node[i][j + 1] = tmp; } } } while (swapped == YES); break; } } } return; } else { int k; int d_a; d_a = -1; for (i = 0; i < 3; i++) { if (d->v[i] != a) Get_Bip(d, d->v[i], tree); else if (d->v[i] == a) d_a = i; } d->bip_size[d_a] = 0; for (i = 0; i < 3; i++) if (d->v[i] != a) { for (j = 0; j < 3; j++) { if (d->v[i]->v[j] == d) { For(k, d->v[i]->bip_size[j]) { d->bip_node[d_a] = (t_node **)realloc( d->bip_node[d_a], (d->bip_size[d_a] + 1) * sizeof(t_node *)); d->bip_node[d_a][d->bip_size[d_a]] = d->v[i]->bip_node[j][k]; d->bip_size[d_a]++; } break; } } } do { swapped = NO; For(j, d->bip_size[d_a] - 1) { if (d->bip_node[d_a][j]->num > d->bip_node[d_a][j + 1]->num) { swapped = YES; tmp = d->bip_node[d_a][j]; d->bip_node[d_a][j] = d->bip_node[d_a][j + 1]; d->bip_node[d_a][j + 1] = tmp; } } } while (swapped == YES); for (i = 0; i < 3; i++) if (a->v[i] == d) { a->bip_size[i] = 0; for (j = 0; j < tree->n_otu; j++) { For(k, d->bip_size[d_a]) { if (d->bip_node[d_a][k] == tree->a_nodes[j]) break; } if ((k == d->bip_size[d_a]) && (tree->a_nodes[j]->common)) { a->bip_node[i] = (t_node **)realloc( a->bip_node[i], (a->bip_size[i] + 1) * sizeof(t_node *)); a->bip_node[i][a->bip_size[i]] = tree->a_nodes[j]; a->bip_size[i]++; } } do { swapped = NO; For(j, a->bip_size[i] - 1) { if (a->bip_node[i][j]->num > a->bip_node[i][j + 1]->num) { swapped = YES; tmp = a->bip_node[i][j]; a->bip_node[i][j] = a->bip_node[i][j + 1]; a->bip_node[i][j + 1] = tmp; } } } while (swapped == YES); if (a->bip_size[i] != tree->n_otu - d->bip_size[d_a]) { PhyML_Printf("%d %d \n", a->bip_size[i], tree->n_otu - d->bip_size[d_a]); Warn_And_Exit("\n. Problem in counting bipartitions \n"); } break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Alloc_Bip(t_tree *tree) { int i; if (tree->has_bip) return; tree->has_bip = YES; For(i, 2 * tree->n_otu - 2) { tree->a_nodes[i]->bip_size = (int *)mCalloc(3, sizeof(int)); tree->a_nodes[i]->bip_node = (t_node ***)mCalloc(3, sizeof(t_node **)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int *Order_Int(const int *u, const int n) { unsigned int i, j; int *v; v = (int *)mCalloc(n, sizeof(int)); for (i = 0; i < n; ++i) { v[i] = 0; for (j = 0; j < n; ++j) { if (j != i) { if (u[i] < u[j]) v[i]++; } } } return (v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int *Order_Dbl(const phydbl *u, const int n) { unsigned int i, j; int *v; v = (int *)mCalloc(n, sizeof(int)); for (i = 0; i < n; ++i) { v[i] = 0; for (j = 0; j < n; ++j) { if (j != i) { if (u[i] < u[j]) v[i]++; } } } return (v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Sort_Phydbl_Increase(const void *a, const void *b) { if ((*(phydbl *)(a)) <= (*(phydbl *)(b))) return -1; else return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Sort_String(const void *a, const void *b) { return (strcmp((*(const char **)(a)), (*(const char **)(b)))); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Compare_Bip(t_tree *tree1, t_tree *tree2, int on_existing_edges_only, int comparison_criterion) { int i, j, k; t_edge *b1, *b2; t_node **bip1, **bip2; int bip_size1, bip_size2, bip_size; phydbl diff,n_obs; /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ /* WARNING: call Match_Tip_Numbers and Get_Bip before using this function. */ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ diff = .0; n_obs = .0; for (i = 0; i < 2 * tree1->n_otu - 3; ++i) { b1 = tree1->a_edges[i]; bip_size1 = MIN(b1->left->bip_size[b1->l_r], b1->rght->bip_size[b1->r_l]); j = 0; if ((on_existing_edges_only == YES && b1->does_exist) || (on_existing_edges_only == NO)) { for (j = 0; j < 2 * tree2->n_otu - 3; ++j) { b2 = tree2->a_edges[j]; bip_size2 = MIN(b2->left->bip_size[b2->l_r], b2->rght->bip_size[b2->r_l]); if ((on_existing_edges_only == YES && b2->does_exist) || (on_existing_edges_only == NO)) { if (bip_size1 == bip_size2) { bip_size = bip_size1; // PhyML_Printf("\n. bip_size1 = %d bip_size2 = %d\n", bip_size1, bip_size2); if (b1->left->bip_size[b1->l_r] == b1->rght->bip_size[b1->r_l]) { /* if(b1->left->bip_name[b1->l_r][0][0] < * b1->rght->bip_name[b1->r_l][0][0]) */ if (b1->left->bip_node[b1->l_r][0]->num < b1->rght->bip_node[b1->r_l][0]->num) { /* bip1 = * b1->left->bip_name[b1->l_r]; */ bip1 = b1->left->bip_node[b1->l_r]; } else { /* bip1 = * b1->rght->bip_name[b1->r_l]; */ bip1 = b1->rght->bip_node[b1->r_l]; } } else if (b1->left->bip_size[b1->l_r] < b1->rght->bip_size[b1->r_l]) { /* bip1 = b1->left->bip_name[b1->l_r]; */ bip1 = b1->left->bip_node[b1->l_r]; } else { /* bip1 = b1->rght->bip_name[b1->r_l]; */ bip1 = b1->rght->bip_node[b1->r_l]; } if (b2->left->bip_size[b2->l_r] == b2->rght->bip_size[b2->r_l]) { /* if(b2->left->bip_name[b2->l_r][0][0] < * b2->rght->bip_name[b2->r_l][0][0]) */ if (b2->left->bip_node[b2->l_r][0]->num < b2->rght->bip_node[b2->r_l][0]->num) { /* bip2 = * b2->left->bip_name[b2->l_r]; */ bip2 = b2->left->bip_node[b2->l_r]; } else { /* bip2 = * b2->rght->bip_name[b2->r_l]; */ bip2 = b2->rght->bip_node[b2->r_l]; } } else if (b2->left->bip_size[b2->l_r] < b2->rght->bip_size[b2->r_l]) { /* bip2 = b2->left->bip_name[b2->l_r]; */ bip2 = b2->left->bip_node[b2->l_r]; } else { /* bip2 = b2->rght->bip_name[b2->r_l]; */ bip2 = b2->rght->bip_node[b2->r_l]; } // if (bip_size == 1) Warn_And_Exit("\n. Problem in Compare_Bip\n"); for (k = 0; k < bip_size; k++) { // PhyML_Printf("\n. TREE1: %s TREE2: %s (%d %d)\n", bip1[k]->name, bip2[k]->name, bip1[k]->num, bip2[k]->num); if(strcmp(bip1[k]->name,bip2[k]->name)) break; } if (k == bip_size) /* Branches b1 and b2 define the same bipartition */ { b1->bip_score++; b2->bip_score++; // identical++; // PhyML_Printf("\n. SAME FOUND"); goto out; } } } } } out:; // PhyML_Printf("\n j: %d %d\n", j,2 * tree2->n_otu - 3); if ((j == 2 * tree2->n_otu - 3) && (bip_size1 > 1) && (comparison_criterion == TREE_COMP_RF_PLUS_LENGTH)) { diff += b1->l->v; } if ((j == 2 * tree2->n_otu - 3) && (bip_size1 > 1) && (comparison_criterion == TREE_COMP_RF_PLAIN)) { diff += 1.0; } if ((j != 2 * tree2->n_otu - 3) && (bip_size1 > 1) && (comparison_criterion == TREE_COMP_LENGTH_SHARED_EDGES)) { diff += pow(b1->l->v - b2->l->v, 2); // diff += b1->l->v - b2->l->v; n_obs += 1.0; // if ((j == 2 * tree2->n_otu - 3) && (bip_size1 > 1) && // (comparison_criterion == TREE_COMP_LENGTH_SHARED_EDGES)) // diff += pow(b1->l->v - 0.0, 2); } if ((j != 2 * tree2->n_otu - 3) && (bip_size1 == 1) && (comparison_criterion == TREE_COMP_LENGTH_EXTERNAL_EDGES)) { diff += pow(b1->l->v - b2->l->v, 2); // diff += b1->l->v - b2->l->v; n_obs += 1.0; } } if(comparison_criterion == TREE_COMP_RF_PLUS_LENGTH || comparison_criterion == TREE_COMP_RF_PLAIN) return diff; else if(comparison_criterion == TREE_COMP_LENGTH_SHARED_EDGES || comparison_criterion == TREE_COMP_LENGTH_EXTERNAL_EDGES) return diff/n_obs; return -1.; // return (phydbl)(n_edges - identical); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Computes min transfer distance between branches of tree1 and tree2 And adds these distances to tdist_score of each branches of tree1 the score is not normalized yet by depth nor by number of bootstrap trees. This will be done at the end. */ void Compare_Bip_Distance(t_tree *tree1, t_tree *tree2) { int i; t_edge *cur_edge; short unsigned **i_matrix; short unsigned **c_matrix; short unsigned **hamming; short unsigned *min_dist; short unsigned *min_dist_edge; int *cluster_sizes; Alloc_TBE_Matrices(tree1->n_otu, &i_matrix, &c_matrix, &hamming, &min_dist, &min_dist_edge, &cluster_sizes); Update_All_IC_Ref_Tree(tree1, tree2, i_matrix, c_matrix, cluster_sizes); Update_All_IC_Boot_Tree(tree1, tree2, i_matrix, c_matrix, hamming, min_dist, min_dist_edge, cluster_sizes); for (i = 0; i < 2 * tree1->n_otu - 3; i++) { cur_edge = tree1->a_edges[i]; cur_edge->tdist_score += min_dist[cur_edge->num]; } Free_TBE_Matrices(tree1->n_otu, &i_matrix, &c_matrix, &hamming, &min_dist, &min_dist_edge, &cluster_sizes); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Modifiy the tip numbering in tree2 so that tips in tree1 and tree2 corresponding to the same taxon name also have the same tip numbering */ void Match_Tip_Numbers(t_tree *tree1, t_tree *tree2) { int i, j; if (tree1->n_otu != tree2->n_otu) { PhyML_Printf("\n. tree1 and tree2 must have the same number of tips."); /* Otherwise, if tree2->n_otu < tree->n_otu, then some tips in tree2 will have a number (->num) that is the same as the number of an internal node in this tree */ Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } for (i = 0; i < tree1->n_otu; i++) { for (j = 0; j < tree2->n_otu; j++) { if (!strcmp(tree1->a_nodes[i]->name, tree2->a_nodes[j]->name)) { tree2->a_nodes[j]->num = tree1->a_nodes[i]->num; break; } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Test_Multiple_Data_Set_Format(option *io) { char *line; line = (char *)mCalloc(T_MAX_LINE, sizeof(char)); io->n_trees = 0; while (fgets(line, T_MAX_LINE, io->fp_in_tree)) if (strstr(line, ";")) io->n_trees++; Free(line); if ((io->do_boot || io->do_tbe) && (io->n_trees > 1)) Warn_And_Exit( "\n. Bootstrap option is not allowed with multiple input trees !\n"); rewind(io->fp_in_tree); return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Are_Compatible(char *statea, char *stateb, int stepsize, int datatype) { int i, j; char a, b; if (datatype == NT) { for (i = 0; i < stepsize; i++) { a = statea[i]; for (j = 0; j < stepsize; j++) { b = stateb[j]; switch (a) { case 'A': { switch (b) { case 'A': case 'M': case 'R': case 'W': case 'D': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'G': { switch (b) { case 'G': case 'R': case 'S': case 'K': case 'B': case 'D': case 'V': case 'X': { break; } default: return 0; } break; } case 'C': { switch (b) { case 'C': case 'M': case 'S': case 'Y': case 'B': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'T': { switch (b) { case 'T': case 'W': case 'Y': case 'K': case 'B': case 'D': case 'H': case 'X': { break; } default: return 0; } break; } case 'M': { switch (b) { case 'M': case 'A': case 'C': case 'R': case 'W': case 'S': case 'Y': case 'B': case 'D': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'R': { switch (b) { case 'R': case 'A': case 'G': case 'M': case 'W': case 'S': case 'K': case 'B': case 'D': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'W': { switch (b) { case 'W': case 'A': case 'T': case 'M': case 'R': case 'Y': case 'K': case 'B': case 'D': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'S': { switch (b) { case 'S': case 'C': case 'G': case 'M': case 'R': case 'Y': case 'K': case 'B': case 'D': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'Y': { switch (b) { case 'Y': case 'C': case 'T': case 'M': case 'W': case 'S': case 'K': case 'B': case 'D': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'K': { switch (b) { case 'K': case 'G': case 'T': case 'R': case 'W': case 'S': case 'Y': case 'B': case 'D': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'B': { switch (b) { case 'B': case 'C': case 'G': case 'T': case 'M': case 'R': case 'W': case 'S': case 'Y': case 'K': case 'D': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'D': { switch (b) { case 'D': case 'A': case 'G': case 'T': case 'M': case 'R': case 'W': case 'S': case 'Y': case 'K': case 'B': case 'H': case 'V': case 'X': { break; } default: return 0; } break; } case 'H': { switch (b) { case 'H': case 'A': case 'C': case 'T': case 'M': case 'R': case 'W': case 'S': case 'Y': case 'K': case 'B': case 'D': case 'V': case 'X': { break; } default: return 0; } break; } case 'V': { switch (b) { case 'V': case 'A': case 'C': case 'G': case 'M': case 'R': case 'W': case 'S': case 'Y': case 'K': case 'B': case 'D': case 'H': case 'X': { break; } default: return 0; } break; } case 'X': { switch (b) { case 'X': case 'A': case 'C': case 'G': case 'T': case 'M': case 'R': case 'W': case 'S': case 'Y': case 'K': case 'B': case 'D': case 'H': case 'V': { break; } default: return 0; } break; } default: { PhyML_Printf("\n. Err. in Are_Compatible."); PhyML_Printf("\n. Please check that characters `%c` and `%c`", a, b); PhyML_Printf("\n. correspond to existing nucleotides.\n"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); return 0; } } } } } else if (datatype == AA) { a = statea[0]; b = stateb[0]; switch (a) { case 'A': { switch (b) { case 'A': case 'X': { break; } default: return 0; } break; } case 'R': { switch (b) { case 'R': case 'X': { break; } default: return 0; } break; } case 'N': { switch (b) { case 'N': case 'B': case 'X': { break; } default: return 0; } break; } case 'B': { switch (b) { case 'N': case 'B': case 'X': { break; } default: return 0; } break; } case 'D': { switch (b) { case 'D': case 'X': { break; } default: return 0; } break; } case 'C': { switch (b) { case 'C': case 'X': { break; } default: return 0; } break; } case 'Q': { switch (b) { case 'Q': case 'Z': case 'X': { break; } default: return 0; } break; } case 'Z': { switch (b) { case 'Q': case 'Z': case 'X': { break; } default: return 0; } break; } case 'E': { switch (b) { case 'E': case 'X': { break; } default: return 0; } break; } case 'G': { switch (b) { case 'G': case 'X': { break; } default: return 0; } break; } case 'H': { switch (b) { case 'H': case 'X': { break; } default: return 0; } break; } case 'I': { switch (b) { case 'I': case 'X': { break; } default: return 0; } break; } case 'L': { switch (b) { case 'L': case 'X': { break; } default: return 0; } break; } case 'K': { switch (b) { case 'K': case 'X': { break; } default: return 0; } break; } case 'M': { switch (b) { case 'M': case 'X': { break; } default: return 0; } break; } case 'F': { switch (b) { case 'F': case 'X': { break; } default: return 0; } break; } case 'P': { switch (b) { case 'P': case 'X': { break; } default: return 0; } break; } case 'S': { switch (b) { case 'S': case 'X': { break; } default: return 0; } break; } case 'T': { switch (b) { case 'T': case 'X': { break; } default: return 0; } break; } case 'W': { switch (b) { case 'W': case 'X': { break; } default: return 0; } break; } case 'Y': { switch (b) { case 'Y': case 'X': { break; } default: return 0; } break; } case 'V': { switch (b) { case 'V': case 'X': { break; } default: return 0; } break; } case 'X': { switch (b) { case 'A': case 'R': case 'N': case 'B': case 'D': case 'C': case 'Q': case 'Z': case 'E': case 'G': case 'H': case 'I': case 'L': case 'K': case 'M': case 'F': case 'P': case 'S': case 'T': case 'W': case 'Y': case 'V': case 'X': { break; } default: return 0; } break; } default: { PhyML_Printf("\n. Err. in Are_Compatible."); PhyML_Printf("\n. Please check that characters `%c` and `%c`", a, b); PhyML_Printf("\n. correspond to existing amino-acids.\n"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); return 0; } } } else if (datatype == GENERIC) { if (Is_Ambigu(statea, GENERIC, stepsize) || Is_Ambigu(stateb, GENERIC, stepsize)) return 1; else { int a, b; char format[20]; sprintf(format, "%%%dd", stepsize); if (!sscanf(statea, format, &a)) { PhyML_Printf("\n. statea = %s", statea); PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } if (!sscanf(stateb, format, &b)) { PhyML_Printf("\n. statea = %s", stateb); PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } /* PhyML_Printf("\n. %s %d a=%d b=%d ",__FILE__,__LINE__,a,b); */ if (a == b) return 1; } return 0; } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Hide_Ambiguities(calign *data) { int i; for (i = 0; i < data->n_pattern; i++) if (data->ambigu[i]) data->wght[i] = 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Copy_Tree(t_tree *ori, t_tree *cpy) { int i, j; if ((ori->is_mixt_tree == YES || cpy->is_mixt_tree == YES) && (ori->ignore_mixt_info == NO || cpy->ignore_mixt_info == NO)) { MIXT_Copy_Tree(ori, cpy); return; } else { for (i = 0; i < 2 * ori->n_otu - 1; ++i) { if (ori->a_nodes[i] != NULL) { cpy->a_nodes[i]->anc = (ori->a_nodes[i]->anc != NULL) ? cpy->a_nodes[ori->a_nodes[i]->anc->num] : NULL; for (j = 0; j < 3; ++j) { if (ori->a_nodes[i]->v[j] != NULL) { cpy->a_nodes[i]->v[j] = cpy->a_nodes[ori->a_nodes[i]->v[j]->num]; cpy->a_nodes[i]->b[j] = cpy->a_edges[ori->a_nodes[i]->b[j]->num]; } else { cpy->a_nodes[i]->v[j] = NULL; cpy->a_nodes[i]->b[j] = NULL; } } } cpy->a_nodes[i]->c_seq = ori->a_nodes[i]->c_seq; } for (i = 0; i < 2 * ori->n_otu - 1; ++i) { if (ori->a_edges[i] != NULL) { cpy->a_edges[i]->l->v = ori->a_edges[i]->l->v; cpy->a_edges[i]->l->optimize = ori->a_edges[i]->l->optimize; cpy->a_edges[i]->l_old->v = ori->a_edges[i]->l_old->v; cpy->a_edges[i]->l_var->v = ori->a_edges[i]->l_var->v; cpy->a_edges[i]->l_var_old->v = ori->a_edges[i]->l_var_old->v; cpy->a_edges[i]->left = ori->a_edges[i]->left ? cpy->a_nodes[ori->a_edges[i]->left->num] : NULL; cpy->a_edges[i]->rght = ori->a_edges[i]->rght ? cpy->a_nodes[ori->a_edges[i]->rght->num] : NULL; cpy->a_edges[i]->l_v1 = ori->a_edges[i]->l_v1; cpy->a_edges[i]->l_v2 = ori->a_edges[i]->l_v2; cpy->a_edges[i]->r_v1 = ori->a_edges[i]->r_v1; cpy->a_edges[i]->r_v2 = ori->a_edges[i]->r_v2; cpy->a_edges[i]->l_r = ori->a_edges[i]->l_r; cpy->a_edges[i]->r_l = ori->a_edges[i]->r_l; cpy->a_edges[i]->does_exist = ori->a_edges[i]->does_exist; cpy->a_edges[i]->support_val = ori->a_edges[i]->support_val; #ifdef BEAGLE cpy->a_edges[i]->p_lk_left_idx = ori->a_edges[i]->p_lk_left_idx; cpy->a_edges[i]->p_lk_rght_idx = ori->a_edges[i]->p_lk_rght_idx; cpy->a_edges[i]->p_lk_tip_idx = ori->a_edges[i]->p_lk_tip_idx; #endif } } for (i = 0; i < ori->n_otu; ++i) { cpy->a_nodes[i]->tax = YES; Free(cpy->a_nodes[i]->name); cpy->a_nodes[i]->name = (char *)mCalloc(strlen(ori->a_nodes[i]->name) + 1, sizeof(char)); cpy->a_nodes[i]->ori_name = cpy->a_nodes[i]->name; strcpy(cpy->a_nodes[i]->name, ori->a_nodes[i]->name); } if (ori->n_root) { cpy->e_root = cpy->a_edges[ori->e_root->num]; cpy->n_root = cpy->a_nodes[ori->n_root->num]; cpy->n_root_pos = ori->n_root_pos; cpy->n_root->b[1] = cpy->a_edges[ori->n_root->b[1]->num]; cpy->n_root->b[2] = cpy->a_edges[ori->n_root->b[2]->num]; } cpy->num_curr_branch_available = 0; cpy->t_beg = ori->t_beg; cpy->verbose = ori->verbose; #ifdef BEAGLE cpy->b_inst = ori->b_inst; #endif } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *Duplicate_Tree(t_tree *ori) { if (ori->is_mixt_tree == YES) return MIXT_Duplicate_Tree(ori); else { t_tree *cpy = Make_Tree_From_Scratch(ori->n_otu, ori->data); Copy_Tree(ori, cpy); return (cpy); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Prune_Subtree(t_node *a, t_node *d, t_edge **target, t_edge **residual, t_tree *tree) { t_node *v1, *v2, *buff_nd; t_edge *b1, *b2; int dir_v1, dir_v2; int i; phydbl *buff_p_lk; int *buff_scale; int *buff_p_pars; int *buff_pars; int *buff_p_lk_loc, *buff_patt_id; int *buff_ui; phydbl *buff_p_lk_tip; assert(a); assert(d); assert(tree); if (tree->n_root && a == tree->n_root) { if (d == tree->e_root->left) a = tree->e_root->rght; else if (d == tree->e_root->rght) a = tree->e_root->left; else { PhyML_Printf("\n. left: %d right: %d", tree->e_root->left->num, tree->e_root->rght->num); assert(false); } } if (a->tax) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); dir_v1 = dir_v2 = -1; for (i = 0; i < 3; ++i) { if (a->v[i] != d) { if (dir_v1 < 0) dir_v1 = i; else dir_v2 = i; } } assert(dir_v1 > -1); assert(dir_v2 > -1); assert(a->v[dir_v1] != NULL); assert(a->v[dir_v2] != NULL); if (a->v[dir_v1] == a->anc) a->v[dir_v2]->anc = a->v[dir_v1]; else a->v[dir_v1]->anc = a->v[dir_v2]; if (a->v[dir_v1]->num < a->v[dir_v2]->num) { v1 = a->v[dir_v1]; v2 = a->v[dir_v2]; b1 = a->b[dir_v1]; b2 = a->b[dir_v2]; } else { v1 = a->v[dir_v2]; v2 = a->v[dir_v1]; b1 = a->b[dir_v2]; b2 = a->b[dir_v1]; } assert(NULL != b1 && NULL != b2); if (target) (*target) = b1; if (residual) (*residual) = b2; a->v[dir_v1] = NULL; a->v[dir_v2] = NULL; a->b[dir_v1] = NULL; a->b[dir_v2] = NULL; #ifdef BEAGLE int temp; #endif if (v1 == b1->left) { b1->rght = v2; if (v2 == b2->left) { if (tree->is_mixt_tree == NO) { buff_p_lk = b1->p_lk_rght; b1->p_lk_rght = b2->p_lk_left; b2->p_lk_left = buff_p_lk; buff_p_lk_tip = b1->p_lk_tip_r; b1->p_lk_tip_r = b2->p_lk_tip_l; b2->p_lk_tip_l = buff_p_lk_tip; #ifdef BEAGLE temp = b1->p_lk_rght_idx; b1->p_lk_rght_idx = b2->p_lk_left_idx; b2->p_lk_left_idx = temp; #endif buff_scale = b1->sum_scale_rght; b1->sum_scale_rght = b2->sum_scale_left; b2->sum_scale_left = buff_scale; buff_scale = b1->sum_scale_rght_cat; b1->sum_scale_rght_cat = b2->sum_scale_left_cat; b2->sum_scale_left_cat = buff_scale; buff_pars = b1->pars_r; b1->pars_r = b2->pars_l; b2->pars_l = buff_pars; buff_ui = b1->ui_r; b1->ui_r = b2->ui_l; b2->ui_l = buff_ui; buff_p_pars = b1->p_pars_r; b1->p_pars_r = b2->p_pars_l; b2->p_pars_l = buff_p_pars; buff_p_lk_loc = b1->p_lk_loc_rght; b1->p_lk_loc_rght = b2->p_lk_loc_left; b2->p_lk_loc_left = buff_p_lk_loc; buff_patt_id = b1->patt_id_rght; b1->patt_id_rght = b2->patt_id_left; b2->patt_id_left = buff_patt_id; } } else { if (tree->is_mixt_tree == NO) { buff_p_lk = b1->p_lk_rght; /* b1->p_lk_rght = NULL if b1->rght->tax */ b1->p_lk_rght = b2->p_lk_rght; /* b2->p_lk_rght = NULL if b2->rght->tax */ b2->p_lk_rght = buff_p_lk; buff_p_lk_tip = b1->p_lk_tip_r; b1->p_lk_tip_r = b2->p_lk_tip_r; b2->p_lk_tip_r = buff_p_lk_tip; #ifdef BEAGLE temp = b1->p_lk_rght_idx; b1->p_lk_rght_idx = b2->p_lk_rght_idx; b2->p_lk_rght_idx = temp; b2->p_lk_tip_idx = b1->p_lk_tip_idx; #endif buff_scale = b1->sum_scale_rght; b1->sum_scale_rght = b2->sum_scale_rght; b2->sum_scale_rght = buff_scale; buff_pars = b1->pars_r; b1->pars_r = b2->pars_r; b2->pars_r = buff_pars; buff_ui = b1->ui_r; b1->ui_r = b2->ui_r; b2->ui_r = buff_ui; buff_p_pars = b1->p_pars_r; b1->p_pars_r = b2->p_pars_r; b2->p_pars_r = buff_p_pars; buff_p_lk_loc = b1->p_lk_loc_rght; b1->p_lk_loc_rght = b2->p_lk_loc_rght; b2->p_lk_loc_rght = buff_p_lk_loc; buff_patt_id = b1->patt_id_rght; b1->patt_id_rght = b2->patt_id_rght; b2->patt_id_rght = buff_patt_id; } } } else { b1->left = v2; if (v2 == b2->left) { if (tree->is_mixt_tree == NO) { buff_p_lk = b1->p_lk_left; b1->p_lk_left = b2->p_lk_left; b2->p_lk_left = buff_p_lk; buff_p_lk_tip = b1->p_lk_tip_l; b1->p_lk_tip_l = b2->p_lk_tip_l; b2->p_lk_tip_l = buff_p_lk_tip; #ifdef BEAGLE temp = b1->p_lk_left_idx; b1->p_lk_left_idx = b2->p_lk_left_idx; b2->p_lk_left_idx = temp; #endif buff_scale = b1->sum_scale_left; b1->sum_scale_left = b2->sum_scale_left; b2->sum_scale_left = buff_scale; buff_scale = b1->sum_scale_left_cat; b1->sum_scale_left_cat = b2->sum_scale_left_cat; b2->sum_scale_left_cat = buff_scale; buff_pars = b1->pars_l; b1->pars_l = b2->pars_l; b2->pars_l = buff_pars; buff_ui = b1->ui_l; b1->ui_l = b2->ui_l; b2->ui_l = buff_ui; buff_p_pars = b1->p_pars_l; b1->p_pars_l = b2->p_pars_l; b2->p_pars_l = buff_p_pars; buff_p_lk_loc = b1->p_lk_loc_left; b1->p_lk_loc_left = b2->p_lk_loc_left; b2->p_lk_loc_left = buff_p_lk_loc; buff_patt_id = b1->patt_id_left; b1->patt_id_left = b2->patt_id_left; b2->patt_id_left = buff_patt_id; } } else { if (tree->is_mixt_tree == NO) { buff_p_lk = b1->p_lk_left; b1->p_lk_left = b2->p_lk_rght; /* b2->p_lk_rght = NULL if b2->rght->tax */ b2->p_lk_rght = buff_p_lk; buff_p_lk_tip = b1->p_lk_tip_l; b1->p_lk_tip_l = b2->p_lk_tip_r; b2->p_lk_tip_r = buff_p_lk_tip; #ifdef BEAGLE temp = b1->p_lk_left_idx; b1->p_lk_left_idx = b2->p_lk_rght_idx; b2->p_lk_rght_idx = temp; b2->p_lk_tip_idx = b1->p_lk_tip_idx; #endif buff_scale = b1->sum_scale_left; b1->sum_scale_left = b2->sum_scale_rght; b2->sum_scale_rght = buff_scale; buff_scale = b1->sum_scale_left_cat; b1->sum_scale_left_cat = b2->sum_scale_rght_cat; b2->sum_scale_rght_cat = buff_scale; buff_pars = b1->pars_l; b1->pars_l = b2->pars_r; b2->pars_r = buff_pars; buff_ui = b1->ui_l; b1->ui_l = b2->ui_r; b2->ui_r = buff_ui; buff_p_pars = b1->p_pars_l; b1->p_pars_l = b2->p_pars_r; b2->p_pars_r = buff_p_pars; buff_p_lk_loc = b1->p_lk_loc_left; b1->p_lk_loc_left = b2->p_lk_loc_rght; b2->p_lk_loc_rght = buff_p_lk_loc; buff_patt_id = b1->patt_id_left; b1->patt_id_left = b2->patt_id_rght; b2->patt_id_rght = buff_patt_id; } } } for (i = 0; i < 3; ++i) if (v2->v[i] == a) { v2->v[i] = v1; v2->b[i] = b1; break; } #ifdef DEBUG if (i == 3) { PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } #endif for (i = 0; i < 3; ++i) if (v1->v[i] == a) { v1->v[i] = v2; break; } #ifdef DEBUG if (i == 3) { PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } #endif if (b1->l->onoff == ON) { b1->l->v = (b1->l->v + b2->l->v); b1->l_var->v = (b1->l_var->v + b2->l_var->v); } assert(v1 != v2); (v1 == b1->left) ? (Set_Edge_Dirs(b1, v1, v2, tree)) : (Set_Edge_Dirs(b1, v2, v1, tree)); if (tree->n_root != NULL) { // Pruning one of the subtree below n_root->v[2], v2 below a if (tree->n_root->v[1] == v1 && tree->n_root->v[2] == a) tree->n_root->v[2] = v2; // Pruning one of the subtree below n_root->v[1], v2 below a else if (tree->n_root->v[2] == v1 && tree->n_root->v[1] == a) tree->n_root->v[1] = v2; // Pruning one of the subtree below n_root->v[1], v1 below a else if ((tree->n_root->v[1] == v2 && tree->n_root->v[2] == a) || (tree->n_root->v[2] == v2 && tree->n_root->v[1] == a)) { tree->e_root = b1; if (tree->n_root->v[1] == v2) tree->n_root->v[2] = v1; if (tree->n_root->v[2] == v2) tree->n_root->v[1] = v1; } // Prune subtree to the left or to the right of the root node else if ((tree->n_root->v[1] == a && tree->n_root->v[2] == d) || (tree->n_root->v[1] == d && tree->n_root->v[2] == a)) { tree->e_root = b1; tree->n_root->v[1] = v2; tree->n_root->v[2] = v1; } if (tree->n_root->v[1] == tree->e_root->rght) { buff_nd = tree->n_root->v[1]; tree->n_root->v[1] = tree->n_root->v[2]; tree->n_root->v[2] = buff_nd; } Update_Ancestors(tree->n_root, tree->n_root->v[1], tree->n_root->b[1], tree); Update_Ancestors(tree->n_root, tree->n_root->v[2], tree->n_root->b[2], tree); tree->n_root->anc = NULL; } #ifdef DEBUG if (b1->left->tax == YES && b1->rght->tax == NO) { PhyML_Printf("\n. root: %d root->v1: %d root->v2: %d eroot: %d b1: %d b2: " "%d v1: %d v2: %d", tree->n_root->num, tree->n_root->v[1]->num, tree->n_root->v[2]->num, tree->e_root->num, b1->num, b2->num, v1->num, v2->num); PhyML_Printf("\n. b1->left->num = %d", b1->left->num); PhyML_Printf("\n. b1->rght->num = %d", b1->rght->num); PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } #endif if (tree->is_mixt_tree == YES) MIXT_Prune_Subtree(a, d, target, residual, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Graft_Subtree(t_edge *target, t_node *link, t_node *link_daughter, t_edge *residual, t_node *target_nd, t_tree *tree) { t_node *v1, *v2; int i, dir_v1, dir_v2; phydbl *buff_p_lk; int *buff_scale; int *buff_p_pars, *buff_pars; int *buff_p_lk_loc, *buff_patt_id; phydbl *buff_p_lk_tip; int *buff_ui; t_edge *b_up; assert(link); assert(tree); assert(target); if (link == tree->n_root) { assert(link_daughter); if (link_daughter == tree->n_root->v[1]) link = tree->n_root->v[2]; else if (link_daughter == tree->n_root->v[2]) link = tree->n_root->v[1]; else { PhyML_Printf("\n. link: %d link_daughter: %d", link->num, link_daughter ? link_daughter->num : -1); assert(false); } } dir_v1 = dir_v2 = -1; b_up = NULL; for (i = 0; i < 3; i++) { if (link->v[i] == NULL) { if (dir_v1 < 0) dir_v1 = i; else dir_v2 = i; } else b_up = link->b[i]; } if (dir_v1 < 0 || dir_v2 < 0) { PhyML_Printf("\n. link: %d was not pruned in a clean manner...\n", link->num); assert(FALSE); } if (target->left == target->rght->anc) { link->anc = target->left; target->rght->anc = link; } else { link->anc = target->rght; target->left->anc = link; } #ifdef BEAGLE int temp; #endif if (target->left->num < target->rght->num) { v1 = target->left; v2 = target->rght; assert(v1 != link); assert(v2 != link); if (tree->is_mixt_tree == NO) { buff_p_lk = residual->p_lk_rght; residual->p_lk_rght = target->p_lk_rght; target->p_lk_rght = buff_p_lk; buff_p_lk_tip = residual->p_lk_tip_r; residual->p_lk_tip_r = target->p_lk_tip_r; target->p_lk_tip_r = buff_p_lk_tip; #ifdef BEAGLE temp = residual->p_lk_rght_idx; residual->p_lk_rght_idx = target->p_lk_rght_idx; target->p_lk_rght_idx = temp; temp = residual->p_lk_tip_idx; residual->p_lk_tip_idx = target->p_lk_tip_idx; target->p_lk_tip_idx = temp; #endif buff_scale = residual->sum_scale_rght; residual->sum_scale_rght = target->sum_scale_rght; target->sum_scale_rght = buff_scale; buff_scale = residual->sum_scale_rght_cat; residual->sum_scale_rght_cat = target->sum_scale_rght_cat; target->sum_scale_rght_cat = buff_scale; buff_pars = residual->pars_r; residual->pars_r = target->pars_r; target->pars_r = buff_pars; buff_ui = residual->ui_r; residual->ui_r = target->ui_r; target->ui_r = buff_ui; buff_p_pars = residual->p_pars_r; residual->p_pars_r = target->p_pars_r; target->p_pars_r = buff_p_pars; buff_p_lk_loc = residual->p_lk_loc_rght; residual->p_lk_loc_rght = target->p_lk_loc_rght; target->p_lk_loc_rght = buff_p_lk_loc; buff_patt_id = residual->patt_id_rght; residual->patt_id_rght = target->patt_id_rght; target->patt_id_rght = buff_patt_id; } } else { v1 = target->rght; v2 = target->left; assert(v1 != link); assert(v2 != link); if (tree->is_mixt_tree == NO) { buff_p_lk = residual->p_lk_rght; residual->p_lk_rght = target->p_lk_left; target->p_lk_left = buff_p_lk; buff_p_lk_tip = residual->p_lk_tip_r; residual->p_lk_tip_r = target->p_lk_tip_l; target->p_lk_tip_l = buff_p_lk_tip; #ifdef BEAGLE temp = residual->p_lk_rght_idx; residual->p_lk_rght_idx = target->p_lk_left_idx; target->p_lk_left_idx = temp; #endif buff_scale = residual->sum_scale_rght; residual->sum_scale_rght = target->sum_scale_left; target->sum_scale_left = buff_scale; buff_scale = residual->sum_scale_rght_cat; residual->sum_scale_rght_cat = target->sum_scale_left_cat; target->sum_scale_left_cat = buff_scale; buff_pars = residual->pars_r; residual->pars_r = target->pars_l; target->pars_l = buff_pars; buff_ui = residual->ui_r; residual->ui_r = target->ui_l; target->ui_l = buff_ui; buff_p_pars = residual->p_pars_r; residual->p_pars_r = target->p_pars_l; target->p_pars_l = buff_p_pars; buff_p_lk_loc = residual->p_lk_loc_rght; residual->p_lk_loc_rght = target->p_lk_loc_left; target->p_lk_loc_left = buff_p_lk_loc; buff_patt_id = residual->patt_id_rght; residual->patt_id_rght = target->patt_id_left; target->patt_id_left = buff_patt_id; } } for (i = 0; i < 3; i++) if (v2->b[i] == target) { v2->v[i] = link; v2->b[i] = residual; break; } assert(i < 3); link->v[dir_v2] = v2; link->b[dir_v2] = residual; residual->left = link; residual->rght = v2; if (v1 == target->left) target->rght = link; else target->left = link; link->v[dir_v1] = v1; link->b[dir_v1] = target; for (i = 0; i < 3; i++) if (v1->v[i] == v2) { v1->v[i] = link; break; } if (target->l->onoff == ON) { target->l->v /= 2.0; target->l_var->v /= 2.0; } if (residual->l->onoff == ON) { residual->l->v = target->l->v; residual->l_var->v = target->l_var->v; } assert(target->left != target->rght); assert(residual->left != residual->rght); assert(b_up->left != b_up->rght); Set_Edge_Dirs(target, target->left, target->rght, tree); Set_Edge_Dirs(residual, residual->left, residual->rght, tree); Set_Edge_Dirs(b_up, b_up->left, b_up->rght, tree); if (tree->n_root != NULL) { if (target == tree->e_root) { assert(target_nd); if (target_nd == v1) tree->e_root = residual; else if (target_nd == v2) tree->e_root = target; else if (target_nd == tree->n_root) tree->e_root = b_up; } tree->n_root->v[1] = tree->e_root->left; tree->n_root->v[2] = tree->e_root->rght; tree->n_root->b[1]->left = tree->n_root; tree->n_root->b[1]->rght = tree->n_root->v[1]; tree->n_root->b[1]->p_lk_rght = tree->e_root->p_lk_left; tree->n_root->b[1]->p_lk_tip_r = tree->e_root->p_lk_tip_l; #ifdef BEAGLE tree->n_root->b[1]->p_lk_rght_idx = tree->e_root->p_lk_left_idx; tree->n_root->b[1]->p_lk_tip_idx = tree->e_root->p_lk_tip_idx; #endif tree->n_root->b[1]->sum_scale_rght = tree->e_root->sum_scale_left; tree->n_root->b[1]->sum_scale_rght_cat = tree->e_root->sum_scale_left_cat; tree->n_root->b[1]->pars_r = tree->e_root->pars_l; tree->n_root->b[1]->ui_r = tree->e_root->ui_l; tree->n_root->b[1]->p_pars_r = tree->e_root->p_pars_l; tree->n_root->b[1]->p_lk_loc_rght = tree->e_root->p_lk_loc_left; tree->n_root->b[1]->patt_id_rght = tree->e_root->patt_id_left; tree->n_root->b[2]->left = tree->n_root; tree->n_root->b[2]->rght = tree->n_root->v[2]; tree->n_root->b[2]->p_lk_rght = tree->e_root->p_lk_rght; tree->n_root->b[2]->p_lk_tip_r = tree->e_root->p_lk_tip_r; #ifdef BEAGLE tree->n_root->b[2]->p_lk_rght_idx = tree->e_root->p_lk_rght_idx; tree->n_root->b[2]->p_lk_tip_idx = tree->e_root->p_lk_tip_idx; #endif tree->n_root->b[2]->sum_scale_rght = tree->e_root->sum_scale_rght; tree->n_root->b[2]->sum_scale_rght_cat = tree->e_root->sum_scale_rght_cat; tree->n_root->b[2]->pars_r = tree->e_root->pars_r; tree->n_root->b[2]->ui_r = tree->e_root->ui_r; tree->n_root->b[2]->p_pars_r = tree->e_root->p_pars_r; tree->n_root->b[2]->p_lk_loc_rght = tree->e_root->p_lk_loc_rght; tree->n_root->b[2]->patt_id_rght = tree->e_root->patt_id_rght; Update_Ancestors(tree->n_root, tree->n_root->v[1], tree->n_root->b[1], tree); Update_Ancestors(tree->n_root, tree->n_root->v[2], tree->n_root->b[2], tree); tree->n_root->anc = NULL; } if (tree->is_mixt_tree == YES) MIXT_Graft_Subtree(target, link, link_daughter, residual, target_nd, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Reassign_Node_Nums(t_node *a, t_node *d, unsigned int *curr_ext_node, unsigned int *curr_int_node, t_tree *tree) { t_node *buff; int i; if (a->tax) { buff = tree->a_nodes[*curr_ext_node]; tree->a_nodes[*curr_ext_node] = a; tree->a_nodes[a->num] = buff; buff->num = a->num; a->num = *curr_ext_node; (*curr_ext_node)++; } if (d->tax) { buff = tree->a_nodes[*curr_ext_node]; tree->a_nodes[*curr_ext_node] = d; tree->a_nodes[d->num] = buff; buff->num = d->num; d->num = *curr_ext_node; (*curr_ext_node)++; return; } else { buff = tree->a_nodes[*curr_int_node]; tree->a_nodes[*curr_int_node] = d; tree->a_nodes[d->num] = buff; buff->num = d->num; d->num = *curr_int_node; (*curr_int_node)++; } for (i = 0; i < 3; i++) { if (d->v[i] != a) Reassign_Node_Nums(d, d->v[i], curr_ext_node, curr_int_node, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Reassign_Edge_Nums(t_node *a, t_node *d, int *curr_br, t_tree *tree) { t_edge *buff; int i, j; for (i = 0; i < 3; i++) if (a->v[i] == d) { buff = tree->a_edges[*curr_br]; For(j, 2 * N_MAX_OTU - 3) if (tree->a_edges[j] == a->b[i]) break; if (j == 2 * N_MAX_OTU - 3) { PhyML_Printf("\n. Err. in file %s at line %d (function '%s').\n", __FILE__, __LINE__, __FUNCTION__); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } tree->a_edges[*curr_br] = a->b[i]; tree->a_edges[j] = buff; a->b[i]->num = *curr_br; (*curr_br)++; break; } if (d->tax) return; else { for (i = 0; i < 3; i++) if (d->v[i] != a) Reassign_Edge_Nums(d, d->v[i], curr_br, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Find_Mutual_Direction(t_node *n1, t_node *n2, short int *dir_n1_to_n2, short int *dir_n2_to_n1) { int scores[3][3]; int i, j, k, l; if (n1 == n2) return; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { scores[i][j] = 0; For(k, n1->bip_size[i]) { For(l, n2->bip_size[j]) { if (n1->bip_node[i][k] == n2->bip_node[j][l]) { scores[i][j]++; break; } } } } } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { if (!scores[i][j]) { *dir_n1_to_n2 = i; *dir_n2_to_n1 = j; return; } } } PhyML_Printf("\n. n1=%d n2=%d", n1->num, n2->num); PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); /* for(i=0;i<3;i++) */ /* { */ /* n_zero_line = 0; */ /* for(j=0;j<3;j++) */ /* { */ /* if(!scores[i][j]) n_zero_line++; */ /* } */ /* if(n_zero_line != 2) {*dir_n1_to_n2 = i; break;} */ /* } */ /* for(i=0;i<3;i++) */ /* { */ /* n_zero_col = 0; */ /* for(j=0;j<3;j++) */ /* { */ /* if(!scores[j][i]) n_zero_col++; */ /* } */ /* if(n_zero_col != 2) {*dir_n2_to_n1 = i; break;} */ /* } */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Dir_To_Tips(t_node *a, t_node *d, t_tree *tree) { int i, j, k; short int *inout; int d_a; int dim; dim = 2 * tree->n_otu - 2; inout = (short int *)mCalloc(tree->n_otu, sizeof(short int)); for (i = 0; i < 3; i++) { if (a->v[i] == d) { for (j = 0; j < tree->n_otu; j++) inout[j] = 1; For(k, a->bip_size[i]) inout[a->bip_node[i][k]->num] = 0; for (j = 0; j < tree->n_otu; j++) if (inout[tree->a_nodes[j]->num]) tree->t_dir[a->num * dim + tree->a_nodes[j]->num] = i; break; } } if (!d->tax) { d_a = -1; for (i = 0; i < 3; i++) { if (d->v[i] != a) Update_Dir_To_Tips(d, d->v[i], tree); else if (d->v[i] == a) d_a = i; } for (j = 0; j < tree->n_otu; j++) inout[j] = 1; For(k, d->bip_size[d_a]) inout[d->bip_node[d_a][k]->num] = 0; for (j = 0; j < tree->n_otu; j++) if (inout[tree->a_nodes[j]->num]) tree->t_dir[d->num * dim + tree->a_nodes[j]->num] = d_a; } Free(inout); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Fill_Dir_Table(t_tree *tree) { int i, j; int dim; dim = 2 * tree->n_otu - 2; For(i, dim * dim) tree->t_dir[i] = 0; Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree); Update_Dir_To_Tips(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree); for (i = tree->n_otu; i < 2 * tree->n_otu - 2; i++) for (j = i; j < 2 * tree->n_otu - 2; j++) { Find_Mutual_Direction(tree->a_nodes[i], tree->a_nodes[j], &(tree->t_dir[i * dim + j]), &(tree->t_dir[j * dim + i])); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Get_Subtree_Size(t_node *a, t_node *d) { int size, i; if (d->tax) return 1; else { size = 0; for (i = 0; i < 3; i++) if (d->v[i] != a) size += Get_Subtree_Size(d, d->v[i]); } return size; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Calculate the joint probability of states (nt or aa) at the two extremities of a given edge given the matrix of transition probabilities, the vector of conditional likelihoods on each side of the branch and the vector of equilibrium frequencies. */ void Joint_Proba_States_Left_Right(phydbl *Pij, phydbl *p_lk_left, phydbl *p_lk_rght, vect_dbl *pi, int scale_left, int scale_rght, phydbl *F, int n, int site, t_tree *tree) { int i, j; phydbl sum = 0.0; for (i = 0; i < n; i++) F[i] = .0; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { F[i * n + j] = pi->v[i] * Pij[i * n + j] * p_lk_left[i] * p_lk_rght[j] * POW(2., -(scale_left + scale_rght)); sum += F[i * n + j]; } } For(i, n * n) { F[i] /= sum; if (isnan(F[i]) || isinf(F[i])) { for (i = 0; i < n; i++) for (j = 0; j < n; j++) PhyML_Printf("\n. %15G %15G %15G %15G %15G", pi->v[i], Pij[i * n + j], p_lk_left[i], p_lk_rght[j], POW(2., -(scale_left + scale_rght))); PhyML_Printf("\n. sum = %G", sum); Print_Site(tree->data, site, tree->n_otu, "\n", 1, stderr); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Triple_Dist(t_node *a, t_tree *tree) { if (a->tax) return UNLIKELY; else { Update_PMat_At_Given_Edge(a->b[1], tree); Update_PMat_At_Given_Edge(a->b[2], tree); Update_Partial_Lk(tree, a->b[0], a); /* Fast_Br_Len(a->b[0],tree,YES); */ Br_Len_Opt(&(a->b[0]->l->v), a->b[0], tree); Update_Partial_Lk(tree, a->b[1], a); /* Fast_Br_Len(a->b[1],tree,YES); */ Br_Len_Opt(&(a->b[1]->l->v), a->b[1], tree); Update_Partial_Lk(tree, a->b[2], a); /* Fast_Br_Len(a->b[2],tree,YES); */ Br_Len_Opt(&(a->b[2]->l->v), a->b[2], tree); Update_Partial_Lk(tree, a->b[1], a); Update_Partial_Lk(tree, a->b[0], a); } return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Triple_Dist_Approx(t_node *a, t_edge *b, t_tree *tree) { // !!!!!!!! NOT MIXT PROOF if (a->tax) return UNLIKELY; else { int i; for (i = 0; i < 3; i++) if (a->b[i] != b) Update_PMat_At_Given_Edge(a->b[i], tree); Update_Partial_Lk(tree, b, a); Fast_Br_Len(b, tree, YES); return tree->c_lnL; /* t_node *v0,*v1,*v2; */ /* phydbl d01,d02,d12; */ /* t_ll *tips0,*tips1,*tips2; */ /* d01 = d02 = d12 = 0.0; */ /* v0 = a->v[0]; */ /* v1 = a->v[1]; */ /* v2 = a->v[2]; */ /* tips0 = Get_List_Of_Reachable_Tips(a,v0,tree); */ /* tips1 = Get_List_Of_Reachable_Tips(a,v1,tree); */ /* tips2 = Get_List_Of_Reachable_Tips(a,v2,tree); */ /* d01 = Length_Of_Path_Between_List_Of_Tips(tips0,tips1,tree->mat); */ /* d02 = Length_Of_Path_Between_List_Of_Tips(tips0,tips2,tree->mat); */ /* d12 = Length_Of_Path_Between_List_Of_Tips(tips1,tips2,tree->mat); */ /* a->b[0]->l->v = (d01 + d02 - d12)/2.; */ /* a->b[1]->l->v = (d01 + d12 - d02)/2.; */ /* a->b[2]->l->v = (d02 + d12 - d01)/2.; */ /* Free_Linked_List(tips0); */ /* Free_Linked_List(tips1); */ /* Free_Linked_List(tips2); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Symmetric(phydbl **F, int size) { int i, j; for (i = 0; i < size; i++) { for (j = i + 1; j < size; j++) { (*F)[size * i + j] = ((*F)[size * i + j] + (*F)[size * j + i]) / 2.; (*F)[size * j + i] = (*F)[size * i + j]; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Divide_Mat_By_Vect(phydbl **F, phydbl *vect, int size) { int i, j; for (i = 0; i < size; i++) for (j = 0; j < size; j++) (*F)[size * i + j] = (*F)[size * i + j] / vect[j]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Found_In_Subtree(t_node *a, t_node *d, t_node *target, int *match, t_tree *tree) { if (d->tax) return; else { int i; if (d == target) *match = 1; for (i = 0; i < 3; i++) { if (d->v[i] != a) Found_In_Subtree(d, d->v[i], target, match, tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_List_Of_Target_Edges(t_node *a, t_node *d, t_edge **list, int *list_size, t_tree *tree) { int i; for (i = 0; i < 3; i++) { if (a->v[i] && a->v[i] == d) { list[*list_size] = a->b[i]; (*list_size)++; } } if (d->tax) return; else { for (i = 0; i < 3; i++) { if (d->v[i] != a) Get_List_Of_Target_Edges(d, d->v[i], list, list_size, tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Fix_All(t_tree *tree) { int i; for (i = tree->n_otu; i < 2 * tree->n_otu - 2; i++) { tree->a_nodes[i]->b[0]->l_old->v = tree->a_nodes[i]->b[0]->l->v; tree->a_nodes[i]->b[1]->l_old->v = tree->a_nodes[i]->b[1]->l->v; tree->a_nodes[i]->b[2]->l_old->v = tree->a_nodes[i]->b[2]->l->v; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Tree_Length(t_tree *tree) { phydbl sum; sum = 0.0; for (int i = 0; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_edges[i] != tree->n_root->b[1] && tree->a_edges[i] != tree->n_root->b[2]) { sum += MIXT_Get_Mean_Edge_Len(tree->a_edges[i], tree); } } return (sum); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Record_Br_Len(t_tree *mixt_tree) { int i; t_tree *tree; if (mixt_tree->br_len_recorded == YES) { PhyML_Printf("\n. Overwriting recorded edge lengths.\n"); assert(FALSE); } tree = mixt_tree; do { for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l_old->v = tree->a_edges[i]->l->v; for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l_var_old->v = tree->a_edges[i]->l_var->v; tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// scalar_dbl **Copy_Br_Len(t_tree *mixt_tree) { int i; scalar_dbl **bl, *new_l; t_edge *e; bl = (scalar_dbl **)mCalloc(2 * mixt_tree->n_otu - 1, sizeof(scalar_dbl *)); For(i, 2 * mixt_tree->n_otu - 1) { e = mixt_tree->a_edges[i]; bl[i] = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); do { bl[i]->v = e->l->v; e = e->next; if (e) { new_l = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); bl[i]->next = new_l; bl[i]->next->prev = bl[i]; bl[i] = bl[i]->next; } } while (e); } return (bl); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// scalar_dbl **Copy_Br_Len_Var(t_tree *mixt_tree) { int i; scalar_dbl **bl_var, *new_l_var; t_edge *e; bl_var = (scalar_dbl **)mCalloc(2 * mixt_tree->n_otu - 1, sizeof(scalar_dbl *)); For(i, 2 * mixt_tree->n_otu - 1) { e = mixt_tree->a_edges[i]; bl_var[i] = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); do { bl_var[i]->v = e->l_var->v; e = e->next; if (e) { new_l_var = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); bl_var[i]->next = new_l_var; bl_var[i]->next->prev = bl_var[i]; bl_var[i] = bl_var[i]->next; } } while (e); } return (bl_var); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Transfer_Br_Len_To_Tree(scalar_dbl **bl, t_tree *tree) { int i; scalar_dbl *la, *lb; For(i, 2 * tree->n_otu - 1) { if (tree->a_edges[i]->l != NULL) { la = bl[i]; lb = tree->a_edges[i]->l; if (lb != NULL && la != NULL) { do { lb->v = la->v; if (la) la = la->next; if (lb) lb = lb->next; } while (la != NULL && lb != NULL); assert(la == NULL && lb == NULL); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Restore_Br_Len(t_tree *mixt_tree) { int i; t_tree *tree; mixt_tree->br_len_recorded = NO; tree = mixt_tree; do { for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l->v = tree->a_edges[i]->l_old->v; for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l_var->v = tree->a_edges[i]->l_var_old->v; tree = tree->next; } while (tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Dist_Btw_Edges(t_node *a, t_node *d, t_tree *tree) { int i; t_edge *b_fcus; b_fcus = NULL; for (i = 0; i < 3; i++) if (a->v[i] == d) { b_fcus = a->b[i]; break; } if (d->tax) return; else { for (i = 0; i < 3; i++) if (d->v[i] != a) { d->b[i]->topo_dist_btw_edges = b_fcus->topo_dist_btw_edges + 1; d->b[i]->dist_btw_edges = b_fcus->dist_btw_edges + d->b[i]->l->v / 2.; Get_Dist_Btw_Edges(d, d->v[i], tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Detect_Polytomies(t_edge *b, phydbl l_thresh, t_tree *tree) { if ((b->l->v < l_thresh) && (!b->left->tax) && (!b->rght->tax)) { b->l->v = 0.0; b->has_zero_br_len = YES; } else b->has_zero_br_len = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_List_Of_Nodes_In_Polytomy(t_node *a, t_node *d, t_node ***list, int *size_list) { if (d->tax) return; else { int i; for (i = 0; i < 3; i++) { if (d->v[i] != a) { if (!d->b[i]->has_zero_br_len) { (*list)[*size_list] = d->v[i]; (*size_list)++; } if (d->b[i]->has_zero_br_len) Get_List_Of_Nodes_In_Polytomy(d, d->v[i], list, size_list); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Path_Length(t_node *dep, t_node *arr, phydbl *len, t_tree *tree) { assert(tree->t_dir); if (dep == arr) return; else { t_edge *next; next = dep->b[tree->t_dir[dep->num * (2 * tree->n_otu - 2) + arr->num]]; if (next == tree->e_root) { (*len) += (tree->n_root->b[1]->l->v + tree->n_root->b[2]->l->v); } else { (*len) += next->l->v; } Path_Length( dep->v[tree->t_dir[dep->num * (2 * tree->n_otu - 2) + arr->num]], arr, len, tree); return; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Check_Path(t_node *a, t_node *d, t_node *target, t_tree *tree) { PhyML_Printf("path---------\n"); if (d == target) return; else Check_Path(d, d->v[tree->t_dir[d->num * (2 * tree->n_otu - 2) + target->num]], target, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Connect_Two_Nodes(t_node *a, t_node *d) { a->v[0] = d; d->v[0] = a; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_List_Of_Adjacent_Targets(t_node *a, t_node *d, t_node ***node_list, t_edge ***edge_list, int *list_size, int curr_depth, int max_depth) { int i; if (a->tax) return; for (i = 0; i < 3; i++) if (a->v[i] == d) { if (node_list != NULL) (*node_list)[*list_size] = a; if (edge_list != NULL) (*edge_list)[*list_size] = a->b[i]; (*list_size)++; } if (curr_depth == max_depth) return; if (d->tax) return; else for (i = 0; i < 3; i++) if (d->v[i] != a) Get_List_Of_Adjacent_Targets(d, d->v[i], node_list, edge_list, list_size, curr_depth + 1, max_depth); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Sort_List_Of_Adjacent_Targets(t_edge ***list, int list_size) { t_edge *buff_edge; int i, j; buff_edge = NULL; for (i = 0; i < list_size - 1; i++) { for (j = i + 1; j < list_size; j++) if ((*list)[j]->topo_dist_btw_edges < (*list)[i]->topo_dist_btw_edges) { buff_edge = (*list)[j]; (*list)[j] = (*list)[i]; (*list)[i] = buff_edge; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_node *Common_Nodes_Btw_Two_Edges(t_edge *a, t_edge *b) { if (a->left == b->left) return b->left; else if (a->left == b->rght) return b->rght; else if (a->rght == b->left) return b->left; else if (a->rght == b->rght) return b->rght; PhyML_Printf("\n. First t_edge = %d (%d %d); Second t_edge = %d (%d %d)\n", a->num, a->left->num, a->rght->num, b->num, b->left->num, b->rght->num); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); return NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Random_Tree(t_tree *tree) { int *is_available, *list_of_nodes; int i, node_num, step, n_available; phydbl min_edge_len; assert(tree); min_edge_len = 1.E-3; is_available = (int *)mCalloc(2 * tree->n_otu - 2, sizeof(int)); list_of_nodes = (int *)mCalloc(tree->n_otu, sizeof(int)); for (i = 0; i < tree->n_otu; i++) is_available[i] = 1; for (i = 0; i < tree->n_otu; i++) list_of_nodes[i] = i; step = 0; do { /* node_num = * (int)RINT(rand()/(phydbl)(RAND_MAX+1.0)*(tree->n_otu-1-step)); */ node_num = Rand_Int(0, tree->n_otu - 1 - step); node_num = list_of_nodes[node_num]; is_available[node_num] = 0; for (i = 0; i < tree->n_otu; i++) list_of_nodes[i] = -1; n_available = 0; For(i, 2 * tree->n_otu - 2) if (is_available[i]) { list_of_nodes[n_available++] = i; } tree->a_nodes[node_num]->v[0] = tree->a_nodes[tree->n_otu + step]; tree->a_nodes[tree->n_otu + step]->v[1] = tree->a_nodes[node_num]; /* node_num = * (int)RINT(rand()/(phydbl)(RAND_MAX+1.0)*(tree->n_otu-2-step)); */ node_num = Rand_Int(0, tree->n_otu - 2 - step); node_num = list_of_nodes[node_num]; is_available[node_num] = 0; for (i = 0; i < tree->n_otu; i++) list_of_nodes[i] = -1; n_available = 0; For(i, 2 * tree->n_otu - 2) if (is_available[i]) { list_of_nodes[n_available++] = i; } tree->a_nodes[node_num]->v[0] = tree->a_nodes[tree->n_otu + step]; tree->a_nodes[tree->n_otu + step]->v[2] = tree->a_nodes[node_num]; is_available[tree->n_otu + step] = 1; for (i = 0; i < tree->n_otu; i++) list_of_nodes[i] = -1; n_available = 0; For(i, 2 * tree->n_otu - 2) if (is_available[i]) list_of_nodes[n_available++] = i; step++; } while (step < tree->n_otu - 2); tree->a_nodes[list_of_nodes[0]]->v[0] = tree->a_nodes[list_of_nodes[1]]; tree->a_nodes[list_of_nodes[1]]->v[0] = tree->a_nodes[list_of_nodes[0]]; Connect_Edges_To_Nodes_Serial(tree); for (i = 0; i < 2 * tree->n_otu - 3; ++i) if (tree->a_edges[i]->l->v < min_edge_len) tree->a_edges[i]->l->v = min_edge_len; Free(is_available); Free(list_of_nodes); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Make sure internal edges have likelihood vectors on both // sides and external edges have one likelihood vector on the // lefthand side only // Note: make sure p_lk_tips vector are re-initialized after // calling this function void Reorganize_Edges_Given_Lk_Struct(t_tree *tree) { int j, i; if (tree->is_mixt_tree == YES) return; for (i = 0; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_edges[i]->p_lk_left && tree->a_edges[i]->left->tax == YES) { for (j = 0; j < 2 * tree->n_otu - 1; ++j) { if (!tree->a_edges[j]->p_lk_left && tree->a_edges[j]->left->tax == NO) { Swap_Partial_Lk(tree->a_edges[i], tree->a_edges[j], LEFT, LEFT, tree); break; } if (!tree->a_edges[j]->p_lk_rght && tree->a_edges[j]->rght->tax == NO) { Swap_Partial_Lk(tree->a_edges[i], tree->a_edges[j], LEFT, RGHT, tree); break; } } } if (tree->a_edges[i]->p_lk_rght && tree->a_edges[i]->rght->tax == YES) { for (j = 0; j < 2 * tree->n_otu - 1; ++j) { if (!tree->a_edges[j]->p_lk_left && tree->a_edges[j]->left->tax == NO) { Swap_Partial_Lk(tree->a_edges[i], tree->a_edges[j], RGHT, LEFT, tree); break; } if (!tree->a_edges[j]->p_lk_rght && tree->a_edges[j]->rght->tax == NO) { Swap_Partial_Lk(tree->a_edges[i], tree->a_edges[j], RGHT, RGHT, tree); break; } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Swap_Partial_Lk(t_edge *a, t_edge *b, int side_a, int side_b, t_tree *tree) { phydbl *buff_p_lk; int *buff_scale; int *buff_p_pars; int *buff_pars; int *buff_p_lk_loc, *buff_patt_id; phydbl *buff_p_lk_tip; int *buff_ui; if (side_a == LEFT && side_b == LEFT) { buff_p_lk = b->p_lk_left; b->p_lk_left = a->p_lk_left; a->p_lk_left = buff_p_lk; buff_p_lk_tip = b->p_lk_tip_l; b->p_lk_tip_l = a->p_lk_tip_l; a->p_lk_tip_l = buff_p_lk_tip; buff_scale = b->sum_scale_left_cat; b->sum_scale_left_cat = a->sum_scale_left_cat; a->sum_scale_left_cat = buff_scale; buff_scale = b->sum_scale_left; b->sum_scale_left = a->sum_scale_left; a->sum_scale_left = buff_scale; buff_patt_id = b->patt_id_left; b->patt_id_left = a->patt_id_left; a->patt_id_left = buff_patt_id; buff_p_lk_loc = b->p_lk_loc_left; b->p_lk_loc_left = a->p_lk_loc_left; a->p_lk_loc_left = buff_p_lk_loc; buff_pars = b->pars_l; b->pars_l = a->pars_l; a->pars_l = buff_pars; buff_p_pars = b->p_pars_l; b->p_pars_l = a->p_pars_l; a->p_pars_l = buff_p_pars; buff_ui = b->ui_l; b->ui_l = a->ui_l; a->ui_l = buff_ui; #ifdef BEAGLE temp = b->p_lk_left_idx; b->p_lk_left_idx = a->p_lk_left_idx; a->p_lk_left_idx = temp; temp = b->p_lk_tip_idx; b->p_lk_tip_idx = a->p_lk_tip_idx; a->p_lk_tip_idx = temp; #endif } if (side_a == LEFT && side_b == RGHT) { buff_p_lk = b->p_lk_rght; b->p_lk_rght = a->p_lk_left; a->p_lk_left = buff_p_lk; buff_p_lk_tip = b->p_lk_tip_r; b->p_lk_tip_r = a->p_lk_tip_l; a->p_lk_tip_l = buff_p_lk_tip; buff_scale = b->sum_scale_rght_cat; b->sum_scale_rght_cat = a->sum_scale_left_cat; a->sum_scale_left_cat = buff_scale; buff_scale = b->sum_scale_rght; b->sum_scale_rght = a->sum_scale_left; a->sum_scale_left = buff_scale; buff_patt_id = b->patt_id_rght; b->patt_id_rght = a->patt_id_left; a->patt_id_left = buff_patt_id; buff_p_lk_loc = b->p_lk_loc_rght; b->p_lk_loc_rght = a->p_lk_loc_left; a->p_lk_loc_left = buff_p_lk_loc; buff_pars = b->pars_r; b->pars_r = a->pars_l; a->pars_l = buff_pars; buff_p_pars = b->p_pars_r; b->p_pars_r = a->p_pars_l; a->p_pars_l = buff_p_pars; buff_ui = b->ui_r; b->ui_r = a->ui_l; a->ui_l = buff_ui; #ifdef BEAGLE temp = b->p_lk_rght_idx; b->p_lk_rght_idx = a->p_lk_left_idx; a->p_lk_left_idx = temp; temp = b->p_lk_tip_idx; b->p_lk_tip_idx = a->p_lk_tip_idx; a->p_lk_tip_idx = temp; #endif } if (side_a == RGHT && side_b == LEFT) { buff_p_lk = b->p_lk_left; b->p_lk_left = a->p_lk_rght; a->p_lk_rght = buff_p_lk; buff_p_lk_tip = b->p_lk_tip_l; b->p_lk_tip_l = a->p_lk_tip_r; a->p_lk_tip_r = buff_p_lk_tip; buff_scale = b->sum_scale_left_cat; b->sum_scale_left_cat = a->sum_scale_rght_cat; a->sum_scale_rght_cat = buff_scale; buff_scale = b->sum_scale_left; b->sum_scale_left = a->sum_scale_rght; a->sum_scale_rght = buff_scale; buff_patt_id = b->patt_id_left; b->patt_id_left = a->patt_id_rght; a->patt_id_rght = buff_patt_id; buff_p_lk_loc = b->p_lk_loc_left; b->p_lk_loc_left = a->p_lk_loc_rght; a->p_lk_loc_rght = buff_p_lk_loc; buff_pars = b->pars_l; b->pars_l = a->pars_r; a->pars_r = buff_pars; buff_p_pars = b->p_pars_l; b->p_pars_l = a->p_pars_r; a->p_pars_r = buff_p_pars; buff_ui = b->ui_l; b->ui_l = a->ui_r; a->ui_r = buff_ui; #ifdef BEAGLE temp = b->p_lk_left_idx; b->p_lk_left_idx = a->p_lk_rght_idx; a->p_lk_rght_idx = temp; temp = b->p_lk_tip_idx; b->p_lk_tip_idx = a->p_lk_tip_idx; a->p_lk_tip_idx = temp; #endif } if (side_a == RGHT && side_b == RGHT) { buff_p_lk = b->p_lk_rght; b->p_lk_rght = a->p_lk_rght; a->p_lk_rght = buff_p_lk; buff_p_lk_tip = b->p_lk_tip_r; b->p_lk_tip_r = a->p_lk_tip_r; a->p_lk_tip_r = buff_p_lk_tip; buff_scale = b->sum_scale_rght_cat; b->sum_scale_rght_cat = a->sum_scale_rght_cat; a->sum_scale_rght_cat = buff_scale; buff_scale = b->sum_scale_rght; b->sum_scale_rght = a->sum_scale_rght; a->sum_scale_rght = buff_scale; buff_patt_id = b->patt_id_rght; b->patt_id_rght = a->patt_id_rght; a->patt_id_rght = buff_patt_id; buff_p_lk_loc = b->p_lk_loc_rght; b->p_lk_loc_rght = a->p_lk_loc_rght; a->p_lk_loc_rght = buff_p_lk_loc; buff_pars = b->pars_r; b->pars_r = a->pars_r; a->pars_r = buff_pars; buff_p_pars = b->p_pars_r; b->p_pars_r = a->p_pars_r; a->p_pars_r = buff_p_pars; buff_ui = b->ui_r; b->ui_r = a->ui_r; a->ui_r = buff_ui; #ifdef BEAGLE temp = b->p_lk_rght_idx; b->p_lk_rght_idx = a->p_lk_rght_idx; a->p_lk_rght_idx = temp; temp = b->p_lk_tip_idx; b->p_lk_tip_idx = a->p_lk_tip_idx; a->p_lk_tip_idx = temp; #endif } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Random_NNI(int n_moves, t_tree *tree) { int i, j; t_edge *b; t_node *n1, *n2, *n_target; n1 = n2 = NULL; b = NULL; for (i = 0; i < n_moves; ++i) { n_target = tree->a_nodes[tree->n_otu + (int)((phydbl)rand() / RAND_MAX * (2 * tree->n_otu - 3 - tree->n_otu))]; for (j = 0; j < 3; ++j) if (!n_target->v[j]->tax) { b = n_target->b[j]; break; } for (j = 0; j < 3; ++j) if (b->left->v[j] != b->rght) { n1 = b->left->v[j]; break; } for (j = 0; j < 3; ++j) if (b->rght->v[j] != b->left) { n2 = b->rght->v[j]; break; } Swap(n1, b->left, b->rght, n2, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Fill_Missing_Dist(matrix *mat) { int i, j; for (i = 0; i < mat->n_otu; i++) { for (j = i + 1; j < mat->n_otu; j++) { if (i != j) { if (mat->dist[i][j] < .0) { Fill_Missing_Dist_XY(i, j, mat); mat->dist[j][i] = mat->dist[i][j]; } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Fill_Missing_Dist_XY(int x, int y, matrix *mat) { int i, j; phydbl *local_mins, **S1S2; int cpt; int pos_best_estimate; phydbl min_crit, curr_crit; local_mins = (phydbl *)mCalloc(mat->n_otu * mat->n_otu, sizeof(phydbl)); S1S2 = (phydbl **)mCalloc(mat->n_otu * mat->n_otu, sizeof(phydbl *)); For(i, mat->n_otu * mat->n_otu) S1S2[i] = (phydbl *)mCalloc(2, sizeof(phydbl)); cpt = 0; for (i = 0; i < mat->n_otu; i++) { if ((mat->dist[i][x] > .0) && (mat->dist[i][y] > .0)) { for (j = 0; j < mat->n_otu; j++) { if ((mat->dist[j][x] > .0) && (mat->dist[j][y] > .0)) { if ((i != j) && (i != x) && (i != y) && (j != x) && (j != y)) { S1S2[cpt][0] = MIN(mat->dist[i][x] + mat->dist[j][y] - mat->dist[i][j], mat->dist[i][y] + mat->dist[j][x] - mat->dist[i][j]); S1S2[cpt][1] = MAX(mat->dist[i][x] + mat->dist[j][y] - mat->dist[i][j], mat->dist[i][y] + mat->dist[j][x] - mat->dist[i][j]); cpt++; } } } } } Qksort_Matrix(S1S2, 0, 0, cpt - 1); local_mins[0] = S1S2[0][1]; for (i = 1; i < cpt; i++) local_mins[i] = (i * local_mins[i - 1] + S1S2[i][1]) / (phydbl)(i + 1); pos_best_estimate = 0; min_crit = curr_crit = BIG; for (i = 0; i < cpt - 1; i++) { if ((local_mins[i] < S1S2[i + 1][0]) && (local_mins[i] > S1S2[i][0])) { curr_crit = Least_Square_Missing_Dist_XY(x, y, local_mins[i], mat); if (curr_crit < min_crit) { min_crit = curr_crit; pos_best_estimate = i; } } } mat->dist[x][y] = local_mins[pos_best_estimate]; mat->dist[y][x] = mat->dist[x][y]; For(i, mat->n_otu * mat->n_otu) Free(S1S2[i]); Free(S1S2); Free(local_mins); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Least_Square_Missing_Dist_XY(int x, int y, phydbl dxy, matrix *mat) { int i, j; phydbl fit; fit = .0; for (i = 0; i < mat->n_otu; i++) { if ((mat->dist[i][x] > .0) && (mat->dist[i][y] > .0)) { for (j = 0; j < mat->n_otu; j++) { if ((mat->dist[j][x] > .0) && (mat->dist[j][y] > .0)) { if ((i != j) && (i != x) && (i != y) && (j != x) && (j != y)) { if (dxy < MIN(mat->dist[i][x] + mat->dist[j][y] - mat->dist[i][j], mat->dist[i][y] + mat->dist[j][x] - mat->dist[i][j])) { fit += POW((mat->dist[i][x] + mat->dist[j][y]) - (mat->dist[i][y] + mat->dist[j][x]), 2); } else if ((mat->dist[i][x] + mat->dist[j][y]) < (mat->dist[i][y] + mat->dist[j][x])) { fit += POW( dxy - (mat->dist[i][y] + mat->dist[j][x] - mat->dist[i][j]), 2); } else { fit += POW( dxy - (mat->dist[i][x] + mat->dist[j][y] - mat->dist[i][j]), 2); } } } } } } return fit; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Check_Memory_Amount(t_tree *tree) { /* Rough estimate of the amount of memory that has to be used */ long int nbytes; int n_otu; t_mod *mod; mod = tree->mod; n_otu = tree->io->n_otu; nbytes = 0; /* Partial Pars */ /* pars_r */ nbytes += (2 * n_otu - 3) * 2 * tree->data->n_pattern * sizeof(int); /* ui_r */ nbytes += (2 * n_otu - 3) * 2 * tree->data->n_pattern * sizeof(int); /* p_pars_r */ nbytes += (2 * n_otu - 3) * 2 * tree->data->n_pattern * mod->ns * sizeof(int); /* n_diff_states_r */ nbytes += (2 * n_otu - 3) * 2 * mod->ns * sizeof(int); /* Pmat */ /* Pij_rr */ nbytes += (2 * n_otu - 3) * mod->ras->n_catg * mod->ns * mod->ns * sizeof(phydbl); /* tPij_rr */ nbytes += (2 * n_otu - 3) * mod->ras->n_catg * mod->ns * mod->ns * sizeof(phydbl); /* Partial Lk */ /* p_lk */ nbytes += ((2 * n_otu - 3) * 2 - tree->n_otu) * tree->data->n_pattern * mod->ras->n_catg * mod->ns * sizeof(phydbl); /* p_lk_tip */ nbytes += (tree->n_otu) * tree->data->n_pattern * mod->ns * sizeof(phydbl); /* Scaling factors */ /* sum_scale */ nbytes += ((2 * n_otu - 3) * 2 - tree->n_otu) * tree->data->n_pattern * mod->ras->n_catg * sizeof(int); if (((phydbl)nbytes / (1.E+06)) > 256.) /* if(((phydbl)nbytes/(1.E+06)) > 0.) */ { PhyML_Printf("\n\n. WARNING: this analysis requires at least %.0f MB of " "memory space.\n", (phydbl)nbytes / (1.E+06)); #ifndef BATCH char answer; if ((!tree->io->quiet) && (tree->io->mem_question == YES)) { PhyML_Printf("\n. Do you really want to proceed? [Y/n] "); if (scanf("%c", &answer)) { if (answer == '\n') answer = 'Y'; else if (answer == 'n' || answer == 'N') Generic_Exit(__FILE__, __LINE__, __FUNCTION__); else getchar(); } else { Warn_And_Exit("\n\n"); } } #endif } else if (((phydbl)nbytes / (1.E+06)) > 100.) { if (!tree->io->quiet) PhyML_Printf("\n\n. WARNING: this analysis will use at least %.0f MB of " "memory space...\n", (phydbl)nbytes / (1.E+06)); } else if (((phydbl)nbytes / (1.E+06)) > 1.) { if (!tree->io->quiet) PhyML_Printf( "\n\n. This analysis requires at least %.0f MB of memory space.\n", (phydbl)nbytes / (1.E+06)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Get_State_From_Partial_Lk(phydbl *p_lk, int pos, t_tree *tree) { int i; for (i = 0; i < tree->mod->ns; i++) if (p_lk[pos + i] > .0) return i; return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Get_State_From_Partial_Pars(short int *p_pars, int pos, t_tree *tree) { int i; for (i = 0; i < tree->mod->ns; i++) if (p_pars[pos + i] > .0) return i; return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Check_Dirs(t_tree *tree) { int i; For(i, 2 * tree->n_otu - 3) { if (!tree->a_edges[i]->left->tax) { if (tree->a_edges[i]->left->v[tree->a_edges[i]->l_v1]->num < tree->a_edges[i]->left->v[tree->a_edges[i]->l_v2]->num) { PhyML_Printf("\n. Edge %d ; v1=%d v2=%d", tree->a_edges[i]->num, tree->a_edges[i]->left->v[tree->a_edges[i]->l_v1]->num, tree->a_edges[i]->left->v[tree->a_edges[i]->l_v2]->num); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } if (!tree->a_edges[i]->rght->tax) { if (tree->a_edges[i]->rght->v[tree->a_edges[i]->r_v1]->num < tree->a_edges[i]->rght->v[tree->a_edges[i]->r_v2]->num) { PhyML_Printf("\n. Edge %d ; v3=%d v4=%d", tree->a_edges[i]->num, tree->a_edges[i]->rght->v[tree->a_edges[i]->r_v1]->num, tree->a_edges[i]->rght->v[tree->a_edges[i]->r_v2]->num); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Warn_And_Exit(const char *s) { PhyML_Fprintf(stderr, "%s", s); fflush(NULL); #ifndef BATCH PhyML_Fprintf(stderr, "\n. Type enter to exit.\n"); Exit(""); #endif Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Apply random prune and regraft moves to an existing tree. As opposed to // Random_Tree, using this function does not break the likelihood structure. void Randomize_Tree(t_tree *tree, int n_prune_regraft) { t_node *rnd_node; t_edge *rnd_edge, *b_target, *b_residual, **target_list; int n_targets, n_rand, i; target_list = (t_edge **)mCalloc(2 * tree->n_otu - 3, sizeof(t_edge *)); n_rand = n_prune_regraft; do { rnd_node = tree->a_nodes[Rand_Int(tree->n_otu, 2 * tree->n_otu - 3)]; assert(rnd_node != tree->n_root && rnd_node->tax == NO); rnd_edge = rnd_node->b[Rand_Int(0, 2)]; Prune_Subtree(rnd_node, rnd_node == rnd_edge->left ? rnd_edge->rght : rnd_edge->left, &b_target, &b_residual, tree); n_targets = 0; for (i = 0; i < 3; i++) if (b_target->left->v[i] != b_target->rght) Get_List_Of_Adjacent_Targets(b_target->left, b_target->left->v[i], NULL, &target_list, &n_targets, 0, tree->n_otu); for (i = 0; i < 3; i++) if (b_target->rght->v[i] != b_target->left) Get_List_Of_Adjacent_Targets(b_target->rght, b_target->rght->v[i], NULL, &target_list, &n_targets, 0, tree->n_otu); if (n_targets > 0) b_target = target_list[Rand_Int(0, n_targets - 1)]; assert(b_target != NULL); Graft_Subtree(b_target, rnd_node, NULL, b_residual, NULL, tree); n_rand--; } while (n_rand > 0); Free(target_list); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Randomize_Sequence_Order(calign *cdata) { int i, exchange_with; phydbl buff_dbl; char *buff_name, *buff_state; short int *buff_ambigu; exchange_with = -1; for (i = 0; i < cdata->n_otu; i++) { buff_dbl = rand(); buff_dbl /= (RAND_MAX + 1.); buff_dbl *= cdata->n_otu; exchange_with = (int)FLOOR(buff_dbl); buff_name = cdata->c_seq[i]->name; cdata->c_seq[i]->name = cdata->c_seq[exchange_with]->name; cdata->c_seq[exchange_with]->name = buff_name; buff_state = cdata->c_seq[i]->state; cdata->c_seq[i]->state = cdata->c_seq[exchange_with]->state; cdata->c_seq[exchange_with]->state = buff_state; buff_ambigu = cdata->c_seq[i]->is_ambigu; cdata->c_seq[i]->is_ambigu = cdata->c_seq[exchange_with]->is_ambigu; cdata->c_seq[exchange_with]->is_ambigu = buff_ambigu; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Root_Pos(t_tree *tree) { if (tree->n_root_pos > -1.0) { tree->n_root->b[2]->l->v = tree->e_root->l->v * tree->n_root_pos; tree->n_root->b[1]->l->v = tree->e_root->l->v * (1. - tree->n_root_pos); } else { /* tree->n_root->l[0]->v = tree->e_root->l->v / 2.; */ /* tree->n_root->l[1]->v = tree->e_root->l->v / 2.; */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Add_Root(t_edge *target, t_tree *tree) { t_edge *b1, *b2; assert(target); assert(tree); #ifndef PHYML /* PhyML_Printf("\n. Adding root on t_edge %d left = %d right = * %d.",target->num,target->left ? target->left->num : -1, target->rght ? * target->rght->num : -1); fflush(NULL) */ ; #endif tree->e_root = target; /* Create the root t_node if it does not exist yet */ if (!tree->a_nodes[2 * tree->n_otu - 2]) tree->n_root = (t_node *)Make_Node_Light(2 * tree->n_otu - 2); else tree->n_root = tree->a_nodes[2 * tree->n_otu - 2]; tree->a_nodes[2 * tree->n_otu - 2] = tree->n_root; tree->n_root->tax = 0; /* Set the position of the root */ tree->n_root->v[0] = NULL; tree->n_root->v[1] = tree->e_root->left; tree->n_root->v[2] = tree->e_root->rght; /* tree->n_root->b[2] = tree->e_root; */ /* tree->n_root->b[1] = tree->e_root; */ b1 = tree->a_edges[2 * tree->n_otu - 3]; b2 = tree->a_edges[2 * tree->n_otu - 2]; tree->n_root->b[0] = NULL; tree->n_root->b[1] = b1; tree->n_root->b[2] = b2; if (tree->n_root_pos > -1.0) { if (tree->n_root_pos < 1.E-6 && tree->n_root_pos > -1.E-6) { printf("\n. WARNING: you put the root at a weird position..."); } tree->n_root->b[2]->l->v = tree->e_root->l->v * tree->n_root_pos; tree->n_root->b[1]->l->v = tree->e_root->l->v * (1. - tree->n_root_pos); PhyML_Printf("\n. ROOTPOS: %f L: %f L2: %f", tree->n_root_pos, tree->e_root->l->v, tree->n_root->b[2]->l->v); } else { tree->n_root->b[2]->l->v = tree->e_root->l->v / 2.; tree->n_root->b[1]->l->v = tree->e_root->l->v / 2.; tree->n_root_pos = 0.5; } b1->num = tree->num_curr_branch_available; b2->num = tree->num_curr_branch_available + 1; b1->left = tree->n_root; b1->rght = tree->n_root->v[1]; b2->left = tree->n_root; b2->rght = tree->n_root->v[2]; b1->l->v = tree->n_root->b[1]->l->v; b2->l->v = tree->n_root->b[2]->l->v; b1->l_old->v = tree->n_root->b[1]->l->v; b2->l_old->v = tree->n_root->b[2]->l->v; b1->l_r = 1; b2->l_r = 2; b1->r_l = 0; b2->r_l = 0; b1->l_v1 = 0; b1->l_v2 = 2; b2->l_v1 = 0; b2->l_v2 = 1; b1->r_v1 = 1; b1->r_v2 = 2; b2->r_v1 = 1; b2->r_v2 = 2; /* WARNING: make sure you have freed the memory for p_lk_rght on b1 and b2 */ if (tree->is_mixt_tree == NO) { b1->p_lk_rght = tree->e_root->p_lk_left; b2->p_lk_rght = tree->e_root->p_lk_rght; b1->p_lk_tip_r = tree->e_root->p_lk_tip_l; b2->p_lk_tip_r = tree->e_root->p_lk_tip_r; b1->sum_scale_rght = tree->e_root->sum_scale_left; b2->sum_scale_rght = tree->e_root->sum_scale_rght; b1->sum_scale_rght_cat = tree->e_root->sum_scale_left_cat; b2->sum_scale_rght_cat = tree->e_root->sum_scale_rght_cat; b1->p_lk_loc_rght = tree->e_root->p_lk_loc_left; b2->p_lk_loc_rght = tree->e_root->p_lk_loc_rght; b1->pars_r = tree->e_root->pars_l; b2->pars_r = tree->e_root->pars_r; b1->ui_r = tree->e_root->ui_l; b2->ui_r = tree->e_root->ui_r; b1->p_pars_r = tree->e_root->p_pars_l; b2->p_pars_r = tree->e_root->p_pars_r; b1->p_lk_loc_rght = tree->e_root->p_lk_loc_left; b2->p_lk_loc_rght = tree->e_root->p_lk_loc_rght; b1->patt_id_rght = tree->e_root->patt_id_left; b2->patt_id_rght = tree->e_root->patt_id_rght; } Update_Ancestors(tree->n_root, tree->n_root->v[2], tree->n_root->b[2], tree); Update_Ancestors(tree->n_root, tree->n_root->v[1], tree->n_root->b[1], tree); tree->n_root->anc = NULL; if (tree->is_mixt_tree == YES) MIXT_Add_Root(target, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Ancestors(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if (d == NULL) { PhyML_Printf("\n. d is NULL; a: %d root: %d", a->num, tree->n_root->num); assert(FALSE); } d->anc = a; d->b_anc = b; if (a == tree->n_root) a->anc = NULL; if (d->tax) return; else { for (int i = 0; i < 3; i++) if ((d->v[i] != a) && (d->b[i] != tree->e_root)) Update_Ancestors(d, d->v[i], d->b[i], tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Generate a random unrooted tree with 'n_otu' OTUs */ t_tree *Generate_Random_Tree_From_Scratch(int n_otu, int rooted) { t_tree *tree; int *connected, *nonconnected, *available_nodes; int i, n_connected, n_nonconnected, n1, n2, new_n, n_internal, n_external, n_available; t_node *root, *curr_n, **internal_nodes, **external_nodes; phydbl *t, *tmp; tree = Make_Tree_From_Scratch(n_otu, NULL); #if (defined PHYREX || PHYTIME) tree->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->rates, NULL, tree->n_otu); tree->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->times, NULL, tree->n_otu); #endif for (i = 0; i < 2 * tree->n_otu - 2; ++i) { tree->a_nodes[i]->v[1] = NULL; tree->a_nodes[i]->v[2] = NULL; } root = (t_node *)Make_Node_Light(2 * tree->n_otu - 2); connected = (int *)mCalloc(2 * tree->n_otu - 2, sizeof(int)); nonconnected = (int *)mCalloc(2 * tree->n_otu - 2, sizeof(int)); available_nodes = (int *)mCalloc(2 * tree->n_otu - 2, sizeof(int)); internal_nodes = (t_node **)mCalloc(tree->n_otu - 2, sizeof(t_node *)); external_nodes = (t_node **)mCalloc(tree->n_otu, sizeof(t_node *)); t = (phydbl *)mCalloc(tree->n_otu - 1, sizeof(phydbl)); tmp = (phydbl *)mCalloc(2 * tree->n_otu - 2, sizeof(phydbl)); n_nonconnected = 2 * n_otu - 2; for (i = 0; i < 2 * tree->n_otu - 2; ++i) nonconnected[i] = i; available_nodes[0] = 2 * n_otu - 2; /* Node times are generated according to a Birth-death process. Formulae are as described by Yang and Rannala (1997) */ phydbl phi; phydbl rho; /* sampling intensity */ phydbl mu; /* birth rate */ phydbl lambda; /* death rate */ phydbl u; /* random U[0,1] */ phydbl expval; /* rho = 1.0 and mu = 0.0 correspond to the Yule process */ lambda = 6.7; mu = 2.5; rho = 9. / 150.; expval = exp(MIN(1.E+2, mu - lambda)); phi = (rho * lambda * (expval - 1.) + (mu - lambda) * expval) / (expval - 1.); /* Equation 16 */ for (i = 0; i < tree->n_otu - 1; i++) { u = rand(); u /= RAND_MAX; if (fabs(lambda - mu) > 1.E-4) t[i] = (log(phi - u * rho * lambda) - log(phi - u * rho * lambda + u * (lambda - mu))) / (mu - lambda); /* Equation 15 */ else t[i] = u / (1. + lambda * rho * (1 - u)); /* Equation 17 */ } Qksort(t, NULL, 0, tree->n_otu - 2); /* Node times ordering in ascending order */ for (i = 0; i < tree->n_otu - 1; i++) tmp[i] = t[tree->n_otu - 2 - i]; for (i = 0; i < tree->n_otu - 1; i++) t[i] = -tmp[i]; /* Rescale t_node times such that the time at the root t_node is -100 */ for (i = 1; i < tree->n_otu - 1; i++) { t[i] /= -t[0]; t[i] *= 1.E+02; } t[0] = -1.E+02; n_available = 1; curr_n = root; n_connected = 0; do { n1 = Rand_Int(0, n_nonconnected - 1); n1 = nonconnected[n1]; connected[n1] = 1; n_nonconnected = 0; For(i, 2 * tree->n_otu - 2) if (!connected[i]) { nonconnected[n_nonconnected++] = i; } n2 = Rand_Int(0, n_nonconnected - 1); n2 = nonconnected[n2]; connected[n2] = 1; n_nonconnected = 0; For(i, 2 * tree->n_otu - 2) if (!connected[i]) { nonconnected[n_nonconnected++] = i; } curr_n->v[1] = tree->a_nodes[n1]; curr_n->v[2] = tree->a_nodes[n2]; tree->a_nodes[n1]->v[0] = curr_n; tree->a_nodes[n2]->v[0] = curr_n; tree->times->nd_t[curr_n->num] = t[n_connected / 2]; available_nodes[n_available] = tree->a_nodes[n1]->num; for (i = 0; i < n_available; i++) if (available_nodes[i] == curr_n->num) { available_nodes[i] = tree->a_nodes[n2]->num; break; } n_available++; new_n = Rand_Int(0, n_available - 1); curr_n = tree->a_nodes[available_nodes[new_n]]; n_connected += 2; } while (n_connected < 2 * tree->n_otu - 2); For(i, 2 * tree->n_otu - 2) tmp[i] = tree->times->nd_t[i]; /* Unroot the tree */ root->v[2]->v[0] = root->v[2]; root->v[1]->v[0] = root->v[1]; n_internal = n_external = 0; For(i, 2 * tree->n_otu - 2) { if (tree->a_nodes[i]->v[1]) internal_nodes[n_internal++] = tree->a_nodes[i]; else external_nodes[n_external++] = tree->a_nodes[i]; } n_internal = n_external = 0; For(i, 2 * tree->n_otu - 2) { if (i < tree->n_otu) { tree->a_nodes[i] = external_nodes[n_external++]; tree->a_nodes[i]->tax = 1; } else { tree->times->nd_t[i] = tmp[internal_nodes[n_internal]->num]; tree->a_nodes[i] = internal_nodes[n_internal++]; tree->a_nodes[i]->tax = 0; } tree->a_nodes[i]->num = i; } for (i = 0; i < tree->n_otu; i++) tree->times->nd_t[i] = 0.0; for (i = 0; i < tree->n_otu; i++) { if (!tree->a_nodes[i]->name) tree->a_nodes[i]->name = (char *)mCalloc(T_MAX_NAME, sizeof(char)); strcpy(tree->a_nodes[i]->name, "x"); sprintf(tree->a_nodes[i]->name + 1, "%d", i); } Connect_Edges_To_Nodes_Serial(tree); /* Add root */ if (rooted) { For(i, 2 * tree->n_otu - 3) { if (((tree->a_edges[i]->left == root->v[1]) || (tree->a_edges[i]->rght == root->v[1])) && ((tree->a_edges[i]->left == root->v[2]) || (tree->a_edges[i]->rght == root->v[2]))) { Add_Root(tree->a_edges[i], tree); break; } } } /* Or not... */ else { Free_Node(root); } #if (defined PHYREX || PHYTIME) RATES_Random_Branch_Lengths(tree); #endif Free(available_nodes); Free(connected); Free(nonconnected); Free(external_nodes); Free(internal_nodes); Free(t); Free(tmp); return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Site_Diversity(t_tree *tree) { int i, j, k, ns; int *div, sum; ns = tree->mod->ns; div = (int *)mCalloc(ns, sizeof(int)); Site_Diversity_Post(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree->a_nodes[0]->b[0], tree); Site_Diversity_Pre(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree->a_nodes[0]->b[0], tree); For(i, 2 * tree->n_otu - 3) { for (j = 0; j < ns; j++) { tree->a_edges[i]->div_post_pred_left[j] = 0; tree->a_edges[i]->div_post_pred_rght[j] = 0; } } for (i = 0; i < tree->data->n_pattern; i++) { For(j, 2 * tree->n_otu - 3) { Binary_Decomposition(tree->a_edges[j]->ui_l[i], div, ns); sum = 0; for (k = 0; k < ns; k++) sum += div[k]; tree->a_edges[j]->div_post_pred_left[sum - 1] += tree->data->wght[i]; Binary_Decomposition(tree->a_edges[j]->ui_r[i], div, ns); sum = 0; for (k = 0; k < ns; k++) sum += div[k]; tree->a_edges[j]->div_post_pred_rght[sum - 1] += tree->data->wght[i]; } } /* For(j,2*tree->n_otu-3) */ /* { */ /* PhyML_Printf("\n. Edge %4d div_left = %4d %4d %4d %4d -- div_rght = * %4d %4d %4d %4d", */ /* j, */ /* tree->a_edges[j]->div_post_pred_left[0], */ /* tree->a_edges[j]->div_post_pred_left[1], */ /* tree->a_edges[j]->div_post_pred_left[2], */ /* tree->a_edges[j]->div_post_pred_left[3], */ /* tree->a_edges[j]->div_post_pred_rght[0], */ /* tree->a_edges[j]->div_post_pred_rght[1], */ /* tree->a_edges[j]->div_post_pred_rght[2], */ /* tree->a_edges[j]->div_post_pred_rght[3]); */ /* } */ Free(div); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Site_Diversity_Post(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if (d->tax) return; else { int i; for (i = 0; i < 3; i++) if (d->v[i] != a) Site_Diversity_Post(d, d->v[i], d->b[i], tree); Subtree_Union(d, b, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Site_Diversity_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if (d->tax) return; else { int i; for (i = 0; i < 3; i++) if (d->v[i] != a) { Subtree_Union(d, d->b[i], tree); Site_Diversity_Pre(d, d->v[i], d->b[i], tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Subtree_Union(t_node *n, t_edge *b_fcus, t_tree *tree) { /* | |<- b_cus | n / \ / \ / \ */ int site; int *ui, *ui_v1, *ui_v2; ui = ui_v1 = ui_v2 = NULL; if (n == b_fcus->left) { ui = b_fcus->ui_l; ui_v1 = (n == n->b[b_fcus->l_v1]->left) ? (n->b[b_fcus->l_v1]->ui_r) : (n->b[b_fcus->l_v1]->ui_l); ui_v2 = (n == n->b[b_fcus->l_v2]->left) ? (n->b[b_fcus->l_v2]->ui_r) : (n->b[b_fcus->l_v2]->ui_l); } else { ui = b_fcus->ui_r; ui_v1 = (n == n->b[b_fcus->r_v1]->left) ? (n->b[b_fcus->r_v1]->ui_r) : (n->b[b_fcus->r_v1]->ui_l); ui_v2 = (n == n->b[b_fcus->r_v2]->left) ? (n->b[b_fcus->r_v2]->ui_r) : (n->b[b_fcus->r_v2]->ui_l); } for (site = 0; site < tree->data->n_pattern; site++) ui[site] = ui_v1[site] | ui_v2[site]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Binary_Decomposition(int value, int *bit_vect, int size) { int i, cumul; for (i = 0; i < size; i++) bit_vect[i] = 0; cumul = 0; for (i = size - 1; i >= 0; i--) { if (value - cumul < (int)POW(2, i)) { bit_vect[i] = 0; } else { bit_vect[i] = 1; cumul += (int)POW(2, i); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Diversity_Header(FILE *fp, t_tree *tree) { /* PhyML_Fprintf(fp,"t_edge side mean\n"); */ PhyML_Fprintf(fp, "t_edge side diversity count\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Best_Of_NNI_And_SPR(t_tree *tree) { PhyML_Fprintf(stderr, "Best of NNI and SPR option is deprecated. PhyML nows " "only relies on SPR moves"); assert(FALSE); if (tree->mod->s_opt->random_input_tree) Global_Spr_Search( tree); /* Don't do simultaneous NNIs if starting tree is random */ else { t_tree *ori_tree, *best_tree; t_mod *ori_mod, *best_mod; scalar_dbl **ori_bl, **best_bl; phydbl best_lnL, ori_lnL, nni_lnL, spr_lnL; int i; #ifdef BEAGLE tree->b_inst = create_beagle_instance(tree, tree->io->quiet, tree->io); #endif ori_mod = Copy_Model(tree->mod); best_mod = Copy_Model(tree->mod); ori_tree = Make_Tree_From_Scratch(tree->n_otu, tree->data); best_tree = Make_Tree_From_Scratch(tree->n_otu, tree->data); Copy_Tree(tree, ori_tree); // Save a backup of the original tree in ori_tree Record_Br_Len(tree); ori_bl = Copy_Br_Len(tree); best_lnL = UNLIKELY; Lk(NULL, tree); ori_lnL = tree->c_lnL; /* Record likelihood of the starting tree */ // ****** Perform NNI ****** Simu_Loop(tree); /* Perform simultaneous NNIs */ best_lnL = tree->c_lnL; /* Record the likelihood */ nni_lnL = tree->c_lnL; // Mark the NNI tree as the "best" tree Copy_Tree(tree, best_tree); /* Record the tree topology and branch lengths */ Record_Br_Len(tree); best_bl = Copy_Br_Len(tree); Transfer_Br_Len_To_Tree(best_bl, best_tree); Record_Model(tree->mod, best_mod); Copy_Tree(ori_tree, tree); /* Back to the original tree topology */ Transfer_Br_Len_To_Tree(ori_bl, tree); /* Back to the original branch lengths */ Record_Model(ori_mod, tree->mod); /* Back to the original model */ /* Make sure the tree is in its original form */ Lk(NULL, tree); if (FABS(tree->c_lnL - ori_lnL) > tree->mod->s_opt->min_diff_lk_local) { PhyML_Printf("\n. ori_lnL = %f, c_lnL = %f", ori_lnL, tree->c_lnL); PhyML_Printf("\n. Err. in file %s at line %d (function '%s') \n", __FILE__, __LINE__, __FUNCTION__); Warn_And_Exit("\n. PhyML finished prematurely."); } // ****** Perform SPR ****** Global_Spr_Search(tree); spr_lnL = tree->c_lnL; // Did SPR perform better than NNI? if (tree->c_lnL > best_lnL) { #ifdef BEAGLE finalize_beagle_instance( best_tree); // Free the old BEAGLE instance associated with the NNI // tree (since SPR is better) #endif best_lnL = spr_lnL; Copy_Tree(tree, best_tree); /* Record tree topology, branch lengths and model parameters */ Record_Br_Len(tree); For(i, 2 * tree->n_otu - 1) Free_Scalar_Dbl(best_bl[i]); Free(best_bl); best_bl = Copy_Br_Len(tree); Transfer_Br_Len_To_Tree(best_bl, best_tree); Record_Model(tree->mod, best_mod); } Copy_Tree(best_tree, tree); Init_Partial_Lk_Tips_Double(tree); Init_Ui_Tips(tree); Init_Partial_Pars_Tips(tree); Transfer_Br_Len_To_Tree(best_bl, tree); Record_Model(best_mod, tree->mod); /* Make sure the current tree has the best topology, branch lengths and * model parameters */ Lk(NULL, tree); if (FABS(tree->c_lnL - best_lnL) > tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr, "\n. best_lnL = %f, c_lnL = %f", best_lnL, tree->c_lnL); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } if (tree->verbose > VL0) { PhyML_Printf("\n\n. Log likelihood obtained after NNI moves : %f", nni_lnL); PhyML_Printf("\n. Log likelihood obtained after SPR moves : %f", spr_lnL); } For(i, 2 * tree->n_otu - 1) Free_Scalar_Dbl(ori_bl[i]); Free(ori_bl); For(i, 2 * tree->n_otu - 1) Free_Scalar_Dbl(best_bl[i]); Free(best_bl); Free_Tree(ori_tree); Free_Tree(best_tree); Free_Model_Complete(ori_mod); Free_Model_Complete(best_mod); Free_Model_Basic(ori_mod); Free_Model_Basic(best_mod); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Polynomial interpolation. Adapted from "Numerical Recipes in C". Press, Flannery, Teukolsky, Vetterling, 1988. */ int Polint(phydbl *xa, phydbl *ya, int n, phydbl x, phydbl *y, phydbl *dy) { int i, m, ns = 1; phydbl den, dif, dift, ho, hp, w; phydbl *c, *d; dif = FABS(x - xa[1]); c = (phydbl *)mCalloc(n, sizeof(phydbl)); d = (phydbl *)mCalloc(n, sizeof(phydbl)); for (i = 1; i <= n; i++) { if ((dift = FABS(x - xa[i])) < dif) { ns = i; dif = dift; } c[i] = ya[i]; d[i] = ya[i]; } *y = ya[ns--]; for (m = 1; m < n; m++) { for (i = 1; i <= n - m; i++) { ho = xa[i] - x; hp = xa[i + m] - x; w = c[i + 1] - d[i]; if ((den = ho - hp) < SMALL && (den = ho - hp) > -SMALL) { /* Rprintf("\n. Error in routine POLINT.\n"); */ Exit("\n. Error in routine POLINT.\n"); return (-1); } den = w / den; d[i] = hp * den; c[i] = ho * den; } *y += (*dy = (2 * ns < (n - m) ? c[ns + 1] : d[ns--])); } Free(d); Free(c); return (0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *Dist_And_BioNJ(calign *cdata, t_mod *mod, option *io) { t_tree *tree; matrix *mat; if (mod->s_opt->random_input_tree == NO) { if (!io->quiet) PhyML_Printf("\n\n. Computing pairwise distances..."); mat = ML_Dist(cdata, mod); Fill_Missing_Dist(mat); if (!io->quiet) PhyML_Printf("\n\n. Building BioNJ tree..."); mat->tree = Make_Tree_From_Scratch(cdata->n_otu, cdata); Bionj(mat); tree = mat->tree; tree->mat = mat; } else { tree = Make_Tree_From_Scratch(cdata->n_otu, cdata); Random_Tree(tree); tree->mat = NULL; } return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Add_BioNJ_Branch_Lengths(t_tree *tree, calign *cdata, t_mod *mod, matrix *mat) { short unsigned int freemat = NO; if (mat == NULL) freemat = YES; Connect_CSeqs_To_Nodes(cdata, mod->io, tree); if (mat == NULL) mat = ML_Dist(cdata, mod); mat->tree = tree; mat->method = 0; Bionj_Br_Length(mat); if (freemat == YES) Free_Mat(mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *Bootstrap_From_String(char *s_tree, calign *cdata, t_mod *mod, option *io) { t_tree *tree; tree = Read_Tree(&s_tree); tree->n_root = NULL; tree->e_root = NULL; if (!tree) { PhyML_Printf("\n. Err. in file %s at line %d (function '%s') \n", __FILE__, __LINE__, __FUNCTION__); Exit(""); } tree->mod = mod; tree->io = io; tree->data = cdata; tree->io->print_support_val = YES; Connect_CSeqs_To_Nodes(cdata, io, tree); if (tree->mod->s_opt->random_input_tree) Random_Tree(tree); Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Unscale_Br_Len_Multiplier_Tree(tree); Br_Len_Not_Involving_Invar(tree); Make_Spr_List_One_Edge(tree); Make_Spr_List_All_Edge(tree); Make_Best_Spr(tree); Set_Both_Sides(YES, tree); Lk(NULL, tree); #ifdef MPI Bootstrap_MPI(tree); #else Bootstrap(tree); #endif Free(s_tree); Rescale_Br_Len_Multiplier_Tree(tree); Br_Len_Involving_Invar(tree); Collect_Edge_Support_Values(tree); s_tree = Write_Tree(tree); Free_Spr_List_One_Edge(tree); Free_One_Spr(tree->best_spr); Free_Spr_List_All_Edge(tree); Free_Tree_Pars(tree); Free_Tree_Lk(tree); Free_Tree(tree); return s_tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *aLRT_From_String(char *s_tree, calign *cdata, t_mod *mod, option *io) { t_tree *tree; tree = Read_Tree(&s_tree); tree->n_root = NULL; tree->e_root = NULL; if (!tree) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d (function '%s') \n", __FILE__, __LINE__, __FUNCTION__); Warn_And_Exit("\n. PhyML finished prematurely."); } tree->mod = mod; tree->io = io; tree->data = cdata; Connect_CSeqs_To_Nodes(cdata, io, tree); if (tree->mod->s_opt->random_input_tree) Random_Tree(tree); Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Unscale_Br_Len_Multiplier_Tree(tree); Br_Len_Not_Involving_Invar(tree); Make_Spr_List_One_Edge(tree); Make_Spr_List_All_Edge(tree); Make_Best_Spr(tree); #ifdef BEAGLE tree->b_inst = create_beagle_instance(tree, io->quiet, io); #endif Set_Both_Sides(YES, tree); Lk(NULL, tree); aLRT(tree); Free(s_tree); Rescale_Br_Len_Multiplier_Tree(tree); Br_Len_Involving_Invar(tree); Collect_Edge_Support_Values(tree); s_tree = Write_Tree(tree); #ifdef BEAGLE finalize_beagle_instance(tree); #endif Free_One_Spr(tree->best_spr); Free_Spr_List_One_Edge(tree); Free_Spr_List_All_Edge(tree); Free_Tree_Pars(tree); Free_Tree_Lk(tree); Free_Tree(tree); return s_tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Find_Common_Tips(t_tree *tree1, t_tree *tree2) { int i, j; for (i = 0; i < tree1->n_otu; i++) tree1->a_nodes[i]->common = NO; for (i = 0; i < tree2->n_otu; i++) tree2->a_nodes[i]->common = NO; for (i = 0; i < tree1->n_otu; i++) { for (j = 0; j < tree2->n_otu; j++) { if (!strcmp(tree1->a_nodes[i]->name, tree2->a_nodes[j]->name)) { tree1->a_nodes[i]->common = YES; tree2->a_nodes[j]->common = YES; break; } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Get_Tree_Size(t_tree *tree) { int i; phydbl tree_size; tree_size = 0.0; For(i, 2 * tree->n_otu - 3) tree_size += tree->a_edges[i]->l->v; if (tree->n_root != NULL) { tree_size += tree->n_root->b[1]->l->v; tree_size += tree->n_root->b[2]->l->v; } /* For(i,2*tree->n_otu-3) */ /* tree_size += */ /* FABS(tree->times->nd_t[tree->a_edges[i]->left->num] - */ /* tree->times->nd_t[tree->a_edges[i]->rght->num]); */ tree->size = tree_size; return tree_size; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Dist_To_Root_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { int i; if (b) d->dist_to_root = a->dist_to_root + b->l->v; if (d->tax) return; else { for (i = 0; i < 3; i++) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Dist_To_Root_Pre(d, d->v[i], d->b[i], tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Dist_To_Root(t_tree *tree) { tree->n_root->dist_to_root = 0.0; tree->n_root->v[2]->dist_to_root = tree->n_root->b[1]->l->v; tree->n_root->v[1]->dist_to_root = tree->n_root->b[2]->l->v; Dist_To_Root_Pre(tree->n_root, tree->n_root->v[2], NULL, tree); Dist_To_Root_Pre(tree->n_root, tree->n_root->v[1], NULL, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Node_Ranks_From_Dist_To_Root(t_tree *tree) { int buff; int i; int swap = NO; int *rk; rk = (int *)mCalloc(2 * tree->n_otu - 1, sizeof(int)); for (i = 0; i < 2 * tree->n_otu - 1; ++i) rk[i] = i; do { swap = NO; for (i = 0; i < 2 * tree->n_otu - 2; ++i) { if (tree->a_nodes[rk[i]]->dist_to_root > tree->a_nodes[rk[i + 1]]->dist_to_root) // Sort in ascending order { swap = YES; buff = rk[i]; rk[i] = rk[i + 1]; rk[i + 1] = buff; } } } while (swap == YES); for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_nodes[i]->rk_next = NULL; for (i = 0; i < 2 * tree->n_otu - 2; ++i) tree->a_nodes[rk[i]]->rk_next = tree->a_nodes[rk[i + 1]]; tree->a_nodes[rk[2 * tree->n_otu - 2]]->rk_next = NULL; Free(rk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Node_Ranks_From_Times(t_tree *tree) { int buff; int i; int swap = NO; int *rk; phydbl eps; eps = 1.0; rk = (int *)mCalloc(2 * tree->n_otu - 1, sizeof(int)); for (i = 0; i < 2 * tree->n_otu - 1; ++i) rk[i] = i; tree->times->nd_t[tree->n_root->num] -= eps; // Used in order to break ties at root node // so that all nodes descend from root->rk_next do { swap = NO; for (i = 0; i < 2 * tree->n_otu - 2; ++i) { if (tree->times->nd_t[rk[i + 1]] < tree->times->nd_t[rk[i]]) // Sort in ascending order { swap = YES; buff = rk[i]; rk[i] = rk[i + 1]; rk[i + 1] = buff; } } } while (swap == YES); tree->times->nd_t[tree->n_root->num] += eps; for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_nodes[i]->rk_next = NULL; for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_nodes[i]->rk_prev = NULL; for (i = 0; i < 2 * tree->n_otu - 2; ++i) tree->a_nodes[rk[i]]->rk_next = tree->a_nodes[rk[i + 1]]; for (i = 0; i < 2 * tree->n_otu - 2; ++i) tree->a_nodes[rk[i + 1]]->rk_prev = tree->a_nodes[rk[i]]; Free(rk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Node_Ranks_From_Tip_Times(t_tree *tree) { int buff; int i; int swap = NO; int *rk; rk = (int *)mCalloc(tree->n_otu, sizeof(int)); for (i = 0; i < tree->n_otu; ++i) rk[i] = i; do { swap = NO; for (i = 0; i < tree->n_otu - 1; ++i) { if (tree->times->nd_t[rk[i + 1]] < tree->times->nd_t[rk[i]]) // Sort in ascending order { swap = YES; buff = rk[i]; rk[i] = rk[i + 1]; rk[i + 1] = buff; } } } while (swap == YES); for (i = 0; i < tree->n_otu; ++i) tree->a_nodes[i]->rk_next = NULL; for (i = 0; i < tree->n_otu; ++i) tree->a_nodes[i]->rk_prev = NULL; for (i = 0; i < tree->n_otu - 1; ++i) tree->a_nodes[rk[i]]->rk_next = tree->a_nodes[rk[i + 1]]; for (i = 0; i < tree->n_otu - 1; ++i) tree->a_nodes[rk[i + 1]]->rk_prev = tree->a_nodes[rk[i]]; Free(rk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* 'Borrowed' fromn libgen */ char *Basename(char *path) { char *p; if (path == NULL || *path == '\0') return "."; p = path + strlen(path) - 1; while (*p == '/') { if (p == path) return path; *p-- = '\0'; } while (p >= path && *p != '/') p--; return p + 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Find the Last Common Ancestor of n1 and n2 */ /* dist is the number of nodes between n1 and n2 */ t_node *Find_Lca_Pair_Of_Nodes(t_node *n1, t_node *n2, int *dist, t_tree *tree) { t_node **list1, **list2, *lca; int size1, size2; if (n1 == n2) return (n1); if (!tree->n_root) { PhyML_Printf("\n. The tree must be rooted in this function."); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } list1 = (t_node **)mCalloc(2 * tree->n_otu - 1, sizeof(t_node *)); list2 = (t_node **)mCalloc(2 * tree->n_otu - 1, sizeof(t_node *)); Get_List_Of_Ancestors(n1, list1, &size1, tree); Get_List_Of_Ancestors(n2, list2, &size2, tree); while (list1[size1] == list2[size2]) { size1--; size2--; if (size1 < 0 || size2 < 0) break; } *dist = (size1 + 1) + (size2 + 1) - 1; lca = list1[size1 + 1]; Free(list1); Free(list2); if (lca == NULL) { PhyML_Printf("\n. %s", Write_Tree(tree)); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } return lca; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Find the Last Common Ancestor of all the nodes in node_list */ t_node *Find_Lca_Clade(t_node **node_list, int node_list_size, t_tree *tree) { t_node ***list, *lca; int *size; int i; assert(tree->n_root); list = (t_node ***)mCalloc(node_list_size, sizeof(t_node **)); for (i = 0; i < node_list_size; i++) list[i] = (t_node **)mCalloc(2 * tree->n_otu - 1, sizeof(t_node *)); size = (int *)mCalloc(node_list_size, sizeof(int)); for (i = 0; i < node_list_size; i++) { if (!Get_List_Of_Ancestors(node_list[i], list[i], size + i, tree)) { for (i = 0; i < node_list_size; i++) PhyML_Printf("\n. %s", node_list[i]->name); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } } /* for(i=0;inum, */ /* node_list[i]->tax ? node_list[i]->name : NULL); */ /* For(j,size[i]) PhyML_Printf("\n. > %d <",list[i][j]->num); */ /* } */ if (node_list_size > 1) { do { for (i = 0; i < node_list_size - 1; i++) { assert(list[i][size[i] - 1]); assert(list[i + 1][size[i + 1] - 1]); /* PhyML_Printf("\n. %d %d %d * %d",list[i][size[i]-1]->num,size[i],list[i+1][size[i+1]-1]->num,size[i+1]); */ if (list[i][size[i] - 1] != list[i + 1][size[i + 1] - 1]) { /* PhyML_Printf("\n. Break at %d * %d",list[i][size[i]]->num,list[i+1][size[i+1]]->num); */ break; } } if (i != node_list_size - 1) break; for (i = 0; i < node_list_size; i++) { size[i]--; assert(size[i] > 0); } if (node_list_size == 1) break; } while (1); lca = list[0][size[0]]; } else { lca = node_list[0]; } for (i = 0; i < node_list_size; i++) Free(list[i]); Free(list); Free(size); /* PhyML_Printf("\n. LCA: %d",lca->num); */ return lca; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Returns the list of the ancestors of ref_t_node from ref_t_node to the root * included */ int Get_List_Of_Ancestors(t_node *ref_node, t_node **list, int *size, t_tree *tree) { t_node *n; n = ref_node; list[0] = n; *size = 1; if (!n) { PhyML_Printf( "\n. There seems to be a problem with the calibration file.\n"); return 0; } while (n != tree->n_root) { n = n->anc; if (!n) { PhyML_Printf("\n. n->anc has not been set properly (call " "Update_Ancestors first...)\n"); return 0; } list[*size] = n; *size = *size + 1; } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Edge_Num_To_Node_Num(int edge_num, t_tree *tree) { int node_num; t_edge *b; b = tree->a_edges[edge_num]; node_num = (b->left == b->rght->anc) ? (b->rght->num) : (b->left->num); return node_num; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Branch_Lengths_To_Rate_Lengths(t_tree *tree) { Branch_Lengths_To_Rate_Lengths_Pre(tree->n_root, tree->n_root->v[2], tree); Branch_Lengths_To_Rate_Lengths_Pre(tree->n_root, tree->n_root->v[1], tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Branch_Lengths_To_Rate_Lengths_Pre(t_node *a, t_node *d, t_tree *tree) { int i; tree->rates->cur_l[d->num] = tree->rates->br_r[d->num] * tree->rates->clock_r * tree->rates->norm_fact; if (d->tax) return; else { for (i = 0; i < 3; i++) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Branch_Lengths_To_Rate_Lengths_Pre(d, d->v[i], tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Find_Clade(char **tax_name_list, int list_size, t_tree *tree) { int *tax_num_list; t_node **tax_node_list; int i, j; int n_matches; t_node *lca; tax_num_list = (int *)mCalloc(list_size, sizeof(int)); tax_node_list = (t_node **)mCalloc(list_size, sizeof(t_node *)); for (i = 0; i < list_size; i++) tax_num_list[i] = -1; n_matches = 0; for (i = 0; i < list_size; i++) { for (j = 0; j < tree->n_otu; j++) { if (!strcmp(tax_name_list[i], tree->a_nodes[j]->name)) { tax_num_list[i] = tree->a_nodes[j]->num; tax_node_list[i] = tree->a_nodes[j]; n_matches++; break; } } if (j == tree->n_otu) { PhyML_Printf("\n. Problem with the calibration file."); PhyML_Printf("\n. Could not find taxon with name '%s' in the sequence or " "tree file.", tax_name_list[i]); /* Generic_Exit(__FILE__,__LINE__,__FUNCTION__); */ } } lca = Find_Lca_Clade(tax_node_list, n_matches, tree); Free(tax_num_list); Free(tax_node_list); if (lca) return lca->num; else return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Find_Clade_Pre(t_node *a, t_node *d, int *tax_num_list, int list_size, int *num, t_tree *tree) { int i, j, k; int score; for (i = 0; i < 3; i++) if ((d->v[i] == a) || (d->b[i] == tree->e_root)) { if (list_size == d->bip_size[i]) { score = 0; For(j, d->bip_size[i]) { for (k = 0; k < list_size; k++) { if (tax_num_list[k] == d->bip_node[i][j]->num) { score++; break; } } } if (score == list_size) *num = d->num; } break; } if (d->tax) return; else for (i = 0; i < 3; i++) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Find_Clade_Pre(d, d->v[i], tax_num_list, list_size, num, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_edge *Find_Root_Edge(FILE *fp_input_tree, t_tree *tree) { char **subs; int degree; int i, j; t_node *left, *rght; int l_r, r_l; int score; char *line; char c; t_edge *root_edge; line = (char *)mCalloc(T_MAX_LINE, sizeof(char)); rewind(fp_input_tree); do c = fgetc(fp_input_tree); while ((c != '(') && (c != EOF)); if (c == EOF) { Free(line); return NULL; } i = 0; for (;;) { if ((c == ' ') || (c == '\n')) { c = fgetc(fp_input_tree); if (c == EOF) break; else continue; } line[i] = c; i++; c = fgetc(fp_input_tree); if (c == EOF || c == ';') break; } Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree); subs = Sub_Trees(line, °ree); Clean_Multifurcation(subs, degree, 3); if (degree != 2) { PhyML_Printf("\n. The tree does not seem to be rooted..."); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } left = rght = NULL; l_r = r_l = -1; For(i, 2 * tree->n_otu - 3) { left = tree->a_edges[i]->left; rght = tree->a_edges[i]->rght; l_r = tree->a_edges[i]->l_r; r_l = tree->a_edges[i]->r_l; score = 0; For(j, left->bip_size[l_r]) if (strstr(subs[1], left->bip_node[l_r][j]->name)) score++; if (score == left->bip_size[l_r]) break; score = 0; For(j, rght->bip_size[r_l]) if (strstr(subs[1], rght->bip_node[r_l][j]->name)) score++; if (score == rght->bip_size[r_l]) break; } root_edge = tree->a_edges[i]; i = 0; while (subs[i] != NULL) Free(subs[i++]); Free(subs); Free(line); if (i == 2 * tree->n_otu - 3) { PhyML_Printf("\n. Could not find the root edge..."); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } return root_edge; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Copy_Tree_Topology_With_Labels(t_tree *ori, t_tree *cpy) { int i, j; For(i, 2 * ori->n_otu - 2) { for (j = 0; j < 3; j++) { if (ori->a_nodes[i]->v[j]) { cpy->a_nodes[i]->v[j] = cpy->a_nodes[ori->a_nodes[i]->v[j]->num]; } else cpy->a_nodes[i]->v[j] = NULL; } cpy->a_nodes[i]->num = ori->a_nodes[i]->num; cpy->a_nodes[i]->tax = 0; } For(i, 2 * ori->n_otu - 3) { cpy->a_edges[i]->l->v = ori->a_edges[i]->l->v; } for (i = 0; i < ori->n_otu; i++) { cpy->a_nodes[i]->tax = 1; strcpy(cpy->a_nodes[i]->name, ori->a_nodes[i]->name); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Model_Name(t_mod *mod) { switch (mod->whichmodel) { case JC69: { strcpy(mod->modelname->s, "JC69"); break; } case K80: { strcpy(mod->modelname->s, "K80"); break; } case F81: { strcpy(mod->modelname->s, "F81"); break; } case HKY85: { strcpy(mod->modelname->s, "HKY85"); break; } case F84: { strcpy(mod->modelname->s, "F84"); break; } case TN93: { strcpy(mod->modelname->s, "TN93"); break; } case GTR: { strcpy(mod->modelname->s, "GTR"); break; } case CUSTOM: { strcpy(mod->modelname->s, "Custom"); break; } case DAYHOFF: { strcpy(mod->modelname->s, "Dayhoff"); break; } case JTT: { strcpy(mod->modelname->s, "JTT"); break; } case MTREV: { strcpy(mod->modelname->s, "MtREV"); break; } case LG: { strcpy(mod->modelname->s, "LG"); break; } case WAG: { strcpy(mod->modelname->s, "WAG"); break; } case DCMUT: { strcpy(mod->modelname->s, "DCMut"); break; } case RTREV: { strcpy(mod->modelname->s, "RtREV"); break; } case CPREV: { strcpy(mod->modelname->s, "CpREV"); break; } case VT: { strcpy(mod->modelname->s, "VT"); break; } case BLOSUM62: { strcpy(mod->modelname->s, "Blosum62"); break; } case MTMAM: { strcpy(mod->modelname->s, "MtMam"); break; } case MTART: { strcpy(mod->modelname->s, "MtArt"); break; } case HIVW: { strcpy(mod->modelname->s, "HIVw"); break; } case HIVB: { strcpy(mod->modelname->s, "HIVb"); break; } case AB: { strcpy(mod->modelname->s, "AB"); break; } case CUSTOMAA: { strcpy(mod->modelname->s, "Custom"); break; } case FLU: { strcpy(mod->modelname->s, "FLU"); break; } case OTHER: { strcpy(mod->modelname->s, "Other"); break; } default: { PhyML_Printf("\n. Unknown model name.\n"); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Adjust_Min_Diff_Lk(t_tree *tree) { if (sizeof(phydbl) == 4) { int exponent; exponent = (int)FLOOR(log10(FABS(tree->c_lnL))); tree->mod->s_opt->min_diff_lk_local = POW(10., exponent - FLT_DIG + 1); tree->mod->s_opt->min_diff_lk_move = tree->mod->s_opt->min_diff_lk_local; } /* PhyML_Printf("\n. Exponent = %d Precision = %E DIG = * %d",exponent,tree->mod->s_opt->min_diff_lk_local,FLT_DIG); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! tree->a_nodes[i]->name is initially a number. It is translated into a string of characters using the names provided in the tax_name array. */ void Translate_Tax_Names(char **tax_names, t_tree *tree) { int i; int tax_num; for (i = 0; i < tree->n_otu; i++) { tax_num = strtol(tree->a_nodes[i]->name, NULL, 10); tree->a_nodes[i]->name = tax_names[tax_num - 1]; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Skip coment in NEXUS file. */ void Skip_Comment(FILE *fp) { int in_comment; char c; in_comment = 1; do { c = fgetc(fp); if (c == EOF) break; if (c == '[') in_comment++; else if (c == ']') in_comment--; } while (in_comment); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Determine the most appropriate position of the root if outgroup taxa are specified. */ void Get_Best_Root_Position(t_tree *tree) { int i, j; phydbl eps; phydbl s, s_max; t_edge *best_edge; int has_outgrp; best_edge = NULL; if (tree->n_root) { PhyML_Printf("\n. Tree already has a root."); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); PhyML_Printf("\n. PhyML finished prematurely."); assert(FALSE); } has_outgrp = NO; if (strstr(tree->a_nodes[0]->name, "*")) { /* PhyML_Printf("\n. Found outgroup taxon: %s",tree->a_nodes[0]->name); */ tree->a_nodes[0]->s_ingrp[0] = 0; tree->a_nodes[0]->s_outgrp[0] = 1; has_outgrp = YES; } else { tree->a_nodes[0]->s_ingrp[0] = 1; tree->a_nodes[0]->s_outgrp[0] = 0; } Get_Best_Root_Position_Post(tree->a_nodes[0], tree->a_nodes[0]->v[0], &has_outgrp, tree); Get_Best_Root_Position_Pre(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree); if (has_outgrp == YES) { Free_Edge_Lk_Rght(tree->a_edges[2 * tree->n_otu - 3]); Free_Edge_Lk_Rght(tree->a_edges[2 * tree->n_otu - 2]); Free_Edge_Pars_Rght(tree->a_edges[2 * tree->n_otu - 3]); Free_Edge_Pars_Rght(tree->a_edges[2 * tree->n_otu - 2]); eps = 1.E-10; s = s_max = 0.0; for (i = 0; i < 2 * tree->n_otu - 2; ++i) { for (j = 0; j < 3; j++) { s = (tree->a_nodes[i]->s_outgrp[j] + eps) / (tree->a_nodes[i]->s_ingrp[j] + eps); /* printf("\n. [%d %d] %d * %d",i,j,tree->a_nodes[i]->s_outgrp[j],tree->a_nodes[i]->s_ingrp[j]); */ if (s > s_max) { s_max = s; best_edge = tree->a_nodes[i]->b[j]; } } } Add_Root(best_edge, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Determine the most appropriate position of the root if outgroup taxa are specified. Post-traversal. */ void Get_Best_Root_Position_Post(t_node *a, t_node *d, int *has_outgrp, t_tree *tree) { if (d->tax) { if (strstr(d->name, "*")) { *has_outgrp = YES; /* PhyML_Printf("\n. Found outgroup taxon: %s",d->name); */ d->s_ingrp[0] = NO; d->s_outgrp[0] = YES; } else { d->s_ingrp[0] = YES; d->s_outgrp[0] = NO; } return; } else { int i; for (i = 0; i < 3; i++) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Get_Best_Root_Position_Post(d, d->v[i], has_outgrp, tree); Get_OutIn_Scores(a, d); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Determine the most appropriate position of the root if outgroup taxa are specified. Pre-traversal. */ void Get_Best_Root_Position_Pre(t_node *a, t_node *d, t_tree *tree) { if (d->tax) { return; } else { int i; for (i = 0; i < 3; i++) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { Get_OutIn_Scores(d->v[i], d); Get_Best_Root_Position_Pre(d, d->v[i], tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Determine the most appropriate position of the root if outgroup taxa are specified. Core. */ void Get_OutIn_Scores(t_node *a, t_node *d) { int i, d_v1, d_v2, v1_d, v2_d, d_a; d_a = v1_d = v2_d = -1; d_v1 = d_v2 = -1; for (i = 0; i < 3; i++) { if (d->v[i] != a) { if (d_v1 < 0) d_v1 = i; else d_v2 = i; } } for (i = 0; i < 3; i++) if (d->v[i] == a) { d_a = i; break; } for (i = 0; i < 3; i++) if (d->v[d_v1]->v[i] == d) { v1_d = i; break; } for (i = 0; i < 3; i++) if (d->v[d_v2]->v[i] == d) { v2_d = i; break; } d->s_ingrp[d_a] = d->v[d_v1]->s_ingrp[v1_d] + d->v[d_v2]->s_ingrp[v2_d]; d->s_outgrp[d_a] = d->v[d_v1]->s_outgrp[v1_d] + d->v[d_v2]->s_outgrp[v2_d]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Check_Sequence_Name(char *s) { int i; /* if(rindex(s,':')) */ For(i, strlen(s)) { if (s[i] == ':') { PhyML_Printf("\n. Character ':' is not permitted in sequence name (%s).", s); PhyML_Printf("\n. Err. in file %s at line %d", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } } /* if(rindex(s,',')) */ For(i, strlen(s)) { if (s[i] == ',') { PhyML_Printf("\n. Character ',' is not permitted in sequence name (%s).", s); PhyML_Printf("\n. Err in file %s at line %d", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } } /* if(rindex(s,' ')) */ For(i, strlen(s)) { if (s[i] == ' ') { PhyML_Printf("\n. Character ' ' is not permitted in sequence name (%s).", s); PhyML_Printf("\n. Err in file %s at line %d", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Scale_Subtree_Height(t_node *a, phydbl K, phydbl floor, int *n_nodes, t_tree *tree) { phydbl new_height; if (a->tax == YES) return 0; *n_nodes = 0; new_height = .0; if (!(tree->times->nd_t[a->num] > floor)) new_height = K * (tree->times->nd_t[a->num] - floor) + floor; if (a == tree->n_root) { tree->times->nd_t[tree->n_root->num] = new_height; *n_nodes = 1; Scale_Node_Heights_Post(tree->n_root, tree->n_root->v[2], K, floor, n_nodes, tree); Scale_Node_Heights_Post(tree->n_root, tree->n_root->v[1], K, floor, n_nodes, tree); } else { int i; if (new_height < tree->times->nd_t[a->anc->num]) return 0; else { tree->times->nd_t[a->num] = new_height; *n_nodes = 1; } for (i = 0; i < 3; i++) if (a->v[i] != a->anc) { Scale_Node_Heights_Post(a, a->v[i], K, floor, n_nodes, tree); } } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Scale_Node_Heights_Post(t_node *a, t_node *d, phydbl K, phydbl floor, int *n_nodes, t_tree *tree) { if (d == tree->n_root) { Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } if (d->tax) return; else { int i; /* It is tempting to set floor = tree->times->t_prior_max[d->num]; but it then becomes possible for nodes with different floor values to have their orders interverted (i.e., ancestor below descendant) */ if ((tree->times->nd_t[d->num] > floor) == NO) // If node is strictly older than floor { tree->times->nd_t[d->num] = K * (tree->times->nd_t[d->num] - floor) + floor; *n_nodes = *n_nodes + 1; } if (tree->times->nd_t[d->num] < tree->times->nd_t[a->num]) { PhyML_Printf("\n. K = %f floor = %f t_prior_max(a) = %f t_prior_max(d) = " "%f a->t = %f d->t %f", K, floor, tree->times->t_prior_max[a->num], tree->times->t_prior_max[d->num], tree->times->nd_t[a->num], tree->times->nd_t[d->num]); PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Warn_And_Exit("\n. PhyML finished prematurely."); } for (i = 0; i < 3; i++) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Scale_Node_Heights_Post(d, d->v[i], K, floor, n_nodes, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Scale_Subtree_Rates(t_node *a, phydbl mult, int *n_nodes, t_tree *tree) { int res; int i; *n_nodes = 0; res = 1; if (a == tree->n_root) { res = Scale_Subtree_Rates_Post(a, a->v[2], mult, n_nodes, tree); if (res) res = Scale_Subtree_Rates_Post(a, a->v[1], mult, n_nodes, tree); return res; } else { for (i = 0; i < 3; i++) if ((a->v[i] != a->anc) && !(a == tree->n_root && a->b[i] == tree->e_root) && (res == 1)) res = Scale_Subtree_Rates_Post(a, a->v[i], mult, n_nodes, tree); return res; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Scale_Subtree_Rates_Post(t_node *a, t_node *d, phydbl mult, int *n_nodes, t_tree *tree) { tree->rates->br_r[d->num] *= mult; tree->rates->nd_r[d->num] *= mult; *n_nodes = *n_nodes + 1; if (tree->rates->br_r[d->num] < tree->rates->min_rate) return 0; if (tree->rates->br_r[d->num] > tree->rates->max_rate) return 0; if (tree->rates->nd_r[d->num] < tree->rates->min_rate) return 0; if (tree->rates->nd_r[d->num] > tree->rates->max_rate) return 0; if (d->tax) return 1; else { int i, res; res = 1; for (i = 0; i < 3; ++i) { if ((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root) && (res == 1)) { res = Scale_Subtree_Rates_Post(d, d->v[i], mult, n_nodes, tree); } } return res; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Scale_Subtree_Veloc(t_node *a, phydbl mult, int *n_nodes, int dim, t_tree *tree) { int res; int i; assert(a->tax == NO); *n_nodes = 0; res = 1; if (a == tree->n_root) { res = Scale_Subtree_Veloc_Post(a, a->v[2], mult, n_nodes, dim, tree); if (res) res = Scale_Subtree_Veloc_Post(a, a->v[1], mult, n_nodes, dim, tree); return res; } else { for (i = 0; i < 3; i++) if ((a->v[i] != a->anc) && !(a == tree->n_root && a->b[i] == tree->e_root) && (res == 1)) res = Scale_Subtree_Veloc_Post(a, a->v[i], mult, n_nodes, dim, tree); return res; } return (-1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Scale_Subtree_Veloc_Post(t_node *a, t_node *d, phydbl mult, int *n_nodes, int dim, t_tree *tree) { assert(d->ldsk); d->ldsk->veloc->deriv[dim] *= mult; *n_nodes = *n_nodes + 1; if (d->tax) return 1; else { int i, res; res = 1; for (i = 0; i < 3; ++i) { if ((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root) && (res == 1)) { res = Scale_Subtree_Veloc_Post(d, d->v[i], mult, n_nodes, dim, tree); } } return res; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Add_Subtree_Veloc(t_node *a, phydbl add, int *n_nodes, int dim, t_tree *tree) { int res; int i; assert(a->tax == NO); *n_nodes = 0; res = 1; if (a == tree->n_root) { res = Add_Subtree_Veloc_Post(a, a->v[2], add, n_nodes, dim, tree); if (res) res = Add_Subtree_Veloc_Post(a, a->v[1], add, n_nodes, dim, tree); return res; } else { for (i = 0; i < 3; i++) if ((a->v[i] != a->anc) && !(a == tree->n_root && a->b[i] == tree->e_root) && (res == 1)) res = Add_Subtree_Veloc_Post(a, a->v[i], add, n_nodes, dim, tree); return res; } return (-1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Add_Subtree_Veloc_Post(t_node *a, t_node *d, phydbl add, int *n_nodes, int dim, t_tree *tree) { assert(d->ldsk); d->ldsk->veloc->deriv[dim] += add; *n_nodes = *n_nodes + 1; if (d->tax) return 1; else { int i, res; res = 1; for (i = 0; i < 3; ++i) { if ((d->v[i] != a) && !(a == tree->n_root && d->b[i] == tree->e_root) && (res == 1)) { res = Add_Subtree_Veloc_Post(d, d->v[i], add, n_nodes, dim, tree); } } return res; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Node_Ranks(t_tree *tree) { tree->n_root->rank = 1; Get_Node_Ranks_Pre(tree->n_root, tree->n_root->v[2], tree); Get_Node_Ranks_Pre(tree->n_root, tree->n_root->v[1], tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Node_Ranks_Pre(t_node *a, t_node *d, t_tree *tree) { d->rank = a->rank + 1; if (d->tax) return; else { int i; for (i = 0; i < 3; i++) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { Get_Node_Ranks_Pre(d, d->v[i], tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Log_Br_Len(t_tree *tree) { int i; for (i = 0; i < 2 * tree->n_otu - 3; ++i) tree->a_edges[i]->l->v = log(tree->a_edges[i]->l->v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Diff_Lk_Norm_At_Given_Edge(t_edge *b, t_tree *tree) { int i, dim, err; phydbl lk_exact, lk_norm, sum; Record_Br_Len(tree); dim = 2 * tree->n_otu - 3; sum = 0.0; for (i = 0; i < tree->n_short_l; i++) { b->l->v = tree->short_l[i]; lk_exact = Lk(b, tree); lk_norm = tree->norm_scale + Log_Dnorm(b->l->v, tree->rates->mean_l[b->num], tree->rates->cov_l[b->num * dim + b->num], &err); if (err) { Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } sum += pow(lk_exact - lk_norm, 2); } Restore_Br_Len(tree); Lk(b, tree); return (sum); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Adjust_Variances(t_tree *tree) { int i; phydbl new_diff, curr_diff; Make_Short_L(tree); for (i = 0; i < tree->n_short_l; i++) { tree->short_l[i] = tree->mod->l_min + i * (0.1 - tree->mod->l_min) / tree->n_short_l; } for (i = 0; i < 2 * tree->n_otu - 3; ++i) { if (tree->a_edges[i]->l->v < 1.1 * tree->mod->l_min) { tree->rates->mean_l[i] = -1.00; tree->rates->cov_l[i * (2 * tree->n_otu - 3) + i] = 0.1; tree->norm_scale = -100; new_diff = curr_diff = 10.0; do { curr_diff = new_diff; Generic_Brent_Lk(&(tree->norm_scale), -1E+6, 0.0, 1.E-10, 10000, NO, Wrap_Diff_Lk_Norm_At_Given_Edge, tree->a_edges[i], tree, NULL, NO, NO); Generic_Brent_Lk(&(tree->rates->cov_l[i * (2 * tree->n_otu - 3) + i]), 0.0, 10.0, 1.E-10, 10000, NO, Wrap_Diff_Lk_Norm_At_Given_Edge, tree->a_edges[i], tree, NULL, NO, NO); new_diff = Diff_Lk_Norm_At_Given_Edge(tree->a_edges[i], tree); } while (FABS(new_diff - curr_diff) > 1.E-3); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Effective_Sample_Size(phydbl first_val, phydbl last_val, phydbl sum, phydbl sumsq, phydbl sumcurnext, int n) { phydbl numerator, denom; phydbl mean; phydbl r; mean = sum / n; denom = sumsq - n * POW(mean, 2); numerator = sumcurnext - (n + 1.) * POW(mean, 2) + (first_val + last_val) * mean; r = numerator / denom; return (phydbl)n * (1. - r) / (1. + r); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Rescale_Br_Len_Multiplier_Tree(t_tree *tree) { int i; if (tree->is_mixt_tree) { MIXT_Rescale_Br_Len_Multiplier_Tree(tree); return (-1.); } for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l->v *= tree->mod->br_len_mult->v; return (-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Unscale_Br_Len_Multiplier_Tree(t_tree *tree) { int i; if (tree->is_mixt_tree) { MIXT_Unscale_Br_Len_Multiplier_Tree(tree); return (-1.); } for (i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l->v /= tree->mod->br_len_mult->v; return (-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Edge_Length_Optimizer(t_tree *tree) { if (tree->mod->s_opt->opt_bl_one_by_one == YES) { for (int i = 0; i < 2 * tree->n_otu - 1; ++i) tree->a_edges[i]->l->optimize = YES; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Reflect(phydbl x, phydbl l, phydbl u) { int rounds; phydbl tmp; int k; if (u < l) { tmp = u; u = l; l = tmp; } if (x < l) x = x + 2. * (l - x); if (((x - u) > (u - l)) && (x > u)) { k = (x - (2. * u - l)) / (2. * (u - l)); x = x - 2. * k * (u - l); } rounds = 0; do { rounds++; /* printf("\n. l=%f u=%f x=%f",l,u,x); */ if (x > u || x < l) { if (x > u) x = x - 2. * (x - u); else x = x + 2. * (l - x); } else break; /* printf(" x'=%f",x); */ } while (rounds < 100); if (rounds == 100 && (x > u || x < l)) { PhyML_Printf("\n. u=%f l=%f x=%f", u, l, x); PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } return x; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Are_Equal(phydbl a, phydbl b, phydbl eps) { if (FABS(a - b) < eps) return TRUE; /* a==b */ else return FALSE; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Returns 1 if small_tree is displayed by big_tree, 0 otherwise Does not account for the root positions, if any. */ int Check_Topo_Constraints(t_tree *big_tree, t_tree *small_tree) { if (!small_tree) return 1; if (small_tree->n_otu < 4) return 1; if (small_tree->n_otu > big_tree->n_otu) { PhyML_Printf("\n"); PhyML_Printf( "\n. The tree that defines the topological constraints can not"); PhyML_Printf("\n. display more taxa than %d", big_tree->n_otu); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } t_tree *big_tree_cpy; int diffs, i; big_tree_cpy = Make_Tree_From_Scratch(big_tree->n_otu, NULL); Copy_Tree(big_tree, big_tree_cpy); Prune_Tree(big_tree_cpy, small_tree); /* For(i,2*small_tree->n_otu-3) printf("\nz %d . %d . %d", */ /* big_tree->a_edges[i]->does_exist, */ /* big_tree_cpy->a_edges[i]->does_exist, */ /* small_tree->a_edges[i]->does_exist); */ Free_Bip(small_tree); Alloc_Bip(small_tree); Get_Bip(small_tree->a_nodes[0], small_tree->a_nodes[0]->v[0], small_tree); Free_Bip(big_tree_cpy); Alloc_Bip(big_tree_cpy); Match_Tip_Numbers(small_tree, big_tree_cpy); Get_Bip(big_tree_cpy->a_nodes[0], big_tree_cpy->a_nodes[0]->v[0], big_tree_cpy); for (i = 0; i < 2 * big_tree_cpy->n_otu - 3; ++i) big_tree_cpy->a_edges[i]->bip_score = 0; for (i = 0; i < 2 * small_tree->n_otu - 3; ++i) small_tree->a_edges[i]->bip_score = 0; diffs = Compare_Bip(small_tree, big_tree_cpy, NO, TREE_COMP_RF_PLAIN); /* printf("\n"); */ /* printf("\n. %s",Write_Tree(big_tree_cpy)); */ /* printf("\n. %s",Write_Tree(small_tree)); */ /* printf("\n. diffs=%d",diffs); */ Free_Tree(big_tree_cpy); t_tree *big_tree_cpy_bis; big_tree_cpy_bis = Make_Tree_From_Scratch(big_tree->n_otu, NULL); Copy_Tree(big_tree, big_tree_cpy_bis); Free_Tree(big_tree_cpy_bis); if (diffs == 0) return 1; /* Constraint is satisfied */ else return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Prune_Tree(t_tree *big_tree, t_tree *small_tree) { int i, j; unsigned int curr_ext_node, curr_int_node; int curr_br, n_pruned_nodes; ; t_node **pruned_nodes; t_edge **residual_edges; pruned_nodes = (t_node **)mCalloc(big_tree->n_otu, sizeof(t_node *)); residual_edges = (t_edge **)mCalloc(big_tree->n_otu, sizeof(t_edge *)); n_pruned_nodes = 0; for (i = 0; i < big_tree->n_otu; i++) { for (j = 0; j < small_tree->n_otu; j++) if (!strcmp(small_tree->a_nodes[j]->name, big_tree->a_nodes[i]->name)) break; if (j == small_tree->n_otu) { Prune_Subtree(big_tree->a_nodes[i]->v[0], big_tree->a_nodes[i], NULL, &(residual_edges[n_pruned_nodes]), big_tree); pruned_nodes[n_pruned_nodes] = big_tree->a_nodes[i]; n_pruned_nodes++; } } if (!n_pruned_nodes) { Free(pruned_nodes); Free(residual_edges); return; } Free(big_tree->t_dir); big_tree->n_otu -= n_pruned_nodes; curr_ext_node = 0; curr_int_node = big_tree->n_otu; curr_br = 0; for (i = 0; i < big_tree->n_otu + n_pruned_nodes; ++i) { for (j = 0; j < n_pruned_nodes; j++) if (!strcmp(pruned_nodes[j]->name, big_tree->a_nodes[i]->name)) break; if (j == n_pruned_nodes) /* That t_node still belongs to the tree */ { Reassign_Node_Nums(big_tree->a_nodes[i], big_tree->a_nodes[i]->v[0], &curr_ext_node, &curr_int_node, big_tree); break; } } Reassign_Edge_Nums(big_tree->a_nodes[0], big_tree->a_nodes[0]->v[0], &curr_br, big_tree); big_tree->t_dir = (short int *)mCalloc( (2 * big_tree->n_otu - 2) * (2 * big_tree->n_otu - 2), sizeof(short int)); for (i = 0; i < n_pruned_nodes; i++) { Free_Edge(residual_edges[i]); Free_Edge(pruned_nodes[i]->b[0]); Free_Node(pruned_nodes[i]->v[0]); Free_Node(pruned_nodes[i]); } Free(pruned_nodes); Free(residual_edges); big_tree->a_edges[2 * big_tree->n_otu - 3] = big_tree->a_edges[2 * (big_tree->n_otu + n_pruned_nodes) - 3]; big_tree->a_edges[2 * big_tree->n_otu - 2] = big_tree->a_edges[2 * (big_tree->n_otu + n_pruned_nodes) - 2]; big_tree->a_nodes[2 * big_tree->n_otu - 2] = big_tree->a_nodes[2 * (big_tree->n_otu + n_pruned_nodes) - 2]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* For every node in small_tree, find which node in big_tree it corresponds to and initialize the variable match_node accordingly (vice versa for big_tree) */ void Match_Nodes_In_Small_Tree(t_tree *small_tree, t_tree *big_tree) { int i, j, k, l, m, n, identical; int *score; if (small_tree->n_otu > big_tree->n_otu) { PhyML_Printf("\n. small_tree->n_otu=%d big_tree->n_otu=%d", small_tree->n_otu, big_tree->n_otu); PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } Free_Bip(big_tree); Alloc_Bip(big_tree); Get_Bip(big_tree->a_nodes[0], big_tree->a_nodes[0]->v[0], big_tree); Free_Bip(small_tree); Alloc_Bip(small_tree); Get_Bip(small_tree->a_nodes[0], small_tree->a_nodes[0]->v[0], small_tree); if (!Check_Topo_Constraints(big_tree, small_tree)) { PhyML_Printf( "\n. small_tree and big_tree cannot have distinct topologies."); PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } For(i, 2 * small_tree->n_otu - 1) small_tree->a_nodes[i]->match_node = NULL; For(i, 2 * big_tree->n_otu - 1) big_tree->a_nodes[i]->match_node = NULL; score = (int *)mCalloc(3, sizeof(int)); for (i = 0; i < small_tree->n_otu; i++) { for (j = 0; j < big_tree->n_otu; j++) { if (!strcmp(small_tree->a_nodes[i]->name, big_tree->a_nodes[j]->name)) { small_tree->a_nodes[i]->match_node = big_tree->a_nodes[j]; big_tree->a_nodes[j]->match_node = small_tree->a_nodes[i]; break; } } } For(i, 2 * small_tree->n_otu - 2) { if (small_tree->a_nodes[i]->tax == NO) { For(j, 2 * big_tree->n_otu - 2) { if (big_tree->a_nodes[j]->tax == NO) { for (k = 0; k < 3; k++) score[k] = 0; for (k = 0; k < 3; k++) { for (l = 0; l < 3; l++) { identical = 0; For(m, small_tree->a_nodes[i]->bip_size[k]) { For(n, big_tree->a_nodes[j]->bip_size[l]) { if (!strcmp(small_tree->a_nodes[i]->bip_node[k][m]->name, big_tree->a_nodes[j]->bip_node[l][n]->name)) { identical++; break; } } } if (identical == small_tree->a_nodes[i]->bip_size[k]) { score[k]++; } } } /* printf("\n. [%d] [%d] %d %d %d -- %d %d %d",i,j, */ /* score[0],score[1],score[2], */ /* small_tree->a_nodes[i]->bip_size[0], */ /* small_tree->a_nodes[i]->bip_size[1], */ /* small_tree->a_nodes[i]->bip_size[2]); */ if (score[0] == 1 && score[1] == 1 && score[2] == 1) { small_tree->a_nodes[i]->match_node = big_tree->a_nodes[j]; big_tree->a_nodes[j]->match_node = small_tree->a_nodes[i]; break; } } } } } Free(score); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Find_Surviving_Edges_In_Small_Tree(t_tree *small_tree, t_tree *big_tree) { int i; Match_Nodes_In_Small_Tree(small_tree, big_tree); For(i, 2 * small_tree->n_otu - 1) small_tree->times->has_survived[i] = NO; Find_Surviving_Edges_In_Small_Tree_Post( big_tree->n_root, big_tree->n_root->v[2], small_tree, big_tree); Find_Surviving_Edges_In_Small_Tree_Post( big_tree->n_root, big_tree->n_root->v[1], small_tree, big_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Find_Surviving_Edges_In_Small_Tree_Post(t_node *a, t_node *d, t_tree *small_tree, t_tree *big_tree) { if (d->match_node && !a->match_node) { small_tree->times->has_survived[d->match_node->num] = YES; } if (d->tax == YES) return; else { int i; for (i = 0; i < 3; i++) { if (d->v[i] != a && !(a == big_tree->n_root && d->b[i] == big_tree->e_root)) { Find_Surviving_Edges_In_Small_Tree_Post(d, d->v[i], small_tree, big_tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Taxa_Id_Ranking(t_tree *tree) { int i, j; for (i = 0; i < tree->n_otu; i++) tree->a_nodes[i]->id_rank = 0; for (i = 0; i < tree->n_otu; i++) { for (j = i + 1; j < tree->n_otu; j++) { if (strcmp(tree->a_nodes[i]->name, tree->a_nodes[j]->name) > 0) tree->a_nodes[i]->id_rank++; else tree->a_nodes[j]->id_rank++; } } /* for(i=0;in_otu;i++) PhyML_Printf("\n. %20s * %4d",tree->a_nodes[i]->name,tree->a_nodes[i]->id_rank); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Edge_Binary_Coding_Number(t_tree *tree) { int i, j; int list_size; t_node **list; t_edge *b; int max_left, max_rght; if (tree->n_otu > 1000) { PhyML_Printf( "\n. Can't work out edge binary code if the number of taxa >1000."); assert(FALSE); } Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree); Set_Taxa_Id_Ranking(tree); b = NULL; for (i = 0; i < 2 * tree->n_otu - 3; ++i) { b = tree->a_edges[i]; max_left = 0; for (j = 0; j < b->left->bip_size[b->l_r]; ++j) if (b->left->bip_node[b->l_r][j]->id_rank > max_left) max_left = b->left->bip_node[b->l_r][j]->id_rank; max_rght = 0; for (j = 0; j < b->rght->bip_size[b->r_l]; ++j) if (b->rght->bip_node[b->r_l][j]->id_rank > max_rght) max_rght = b->rght->bip_node[b->r_l][j]->id_rank; if (max_left < max_rght) { list = b->left->bip_node[b->l_r]; list_size = b->left->bip_size[b->l_r]; } else { list = b->rght->bip_node[b->r_l]; list_size = b->rght->bip_size[b->r_l]; } b->bin_cod_num = 0.; for (j = 0; j < list_size; j++) b->bin_cod_num += POW(2, list[j]->id_rank); /* printf("\n. %f",b->bin_cod_num); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Get_Mutmap_Val(int edge, int site, int mut, t_tree *tree) { int dim1, dim2; dim1 = (tree->data->n_pattern) * (2 * tree->n_otu - 3); dim2 = (tree->data->n_pattern); return tree->mutmap[mut * dim1 + edge * dim2 + site]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_Mutmap_Coord(int idx, int *edge, int *site, int *mut, t_tree *tree) { int dim1, dim2; dim1 = (tree->data->n_pattern) * (2 * tree->n_otu - 3); dim2 = (tree->data->n_pattern); (*mut) = (int)idx / dim1; (*edge) = (int)(idx - (*mut) * dim1) / dim2; (*site) = (int)(idx - (*mut) * dim1 - (*edge) * dim2); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Copy_Edge_Lengths(t_tree *to, t_tree *from) { int i; for (i = 0; i < 2 * from->n_otu - 1; ++i) to->a_edges[i]->l->v = from->a_edges[i]->l->v; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /** * @brief Maps a digit state to the corresponding character in the DNA/AA * alphabet * * @param d_state the digit state * @param tree the tree object * @return the corresponding character */ char D_State_To_Character(int d_state, t_tree *tree) { if (tree->mod->io->datatype == AA) { switch (d_state) { case 0: return ('A'); case 1: return ('R'); case 2: return ('N'); case 3: return ('D'); case 4: return ('C'); case 5: return ('Q'); case 6: return ('E'); case 7: return ('G'); case 8: return ('H'); case 9: return ('I'); case 10: return ('L'); case 11: return ('K'); case 12: return ('M'); case 13: return ('F'); case 14: return ('P'); case 15: return ('S'); case 16: return ('T'); case 17: return ('W'); case 18: return ('Y'); case 19: return ('V'); default: { assert(false); break; } } } else if (tree->mod->io->datatype == NT) { switch (d_state) { case 0: return ('A'); case 1: return ('C'); case 2: return ('G'); case 3: return ('T'); default: { assert(false); break; } } } return ('X'); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *To_Lower_String(char *in) { char *out; int i; int len; len = (int)strlen(in); out = (char *)mCalloc(len + 1, sizeof(char)); for (i = 0; i < len; i++) out[i] = (char)tolower(in[i]); out[len] = '\0'; return (out); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *To_Upper_String(char *in) { char *out; int i; int len; len = (int)strlen(in); out = (char *)mCalloc(len + 1, sizeof(char)); for (i = 0; i < len; i++) { out[i] = (char)toupper(in[i]); } out[len] = '\0'; return (out); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Ignore_Root(int yesno, t_tree *tree) { tree->ignore_root = yesno; if (tree->is_mixt_tree == YES) MIXT_Set_Ignore_Root(yesno, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Bl_From_Rt(int yesno, t_tree *tree) { assert(tree->rates); tree->rates->bl_from_rt = yesno; if (tree->is_mixt_tree == YES) MIXT_Set_Bl_From_Rt(yesno, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_T_Beg(t_tree *tree) { time(&(tree->t_beg)); if (tree->is_mixt_tree == YES) MIXT_Init_T_Beg(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Connect_CSeqs_To_Nodes(calign *cdata, option *io, t_tree *tree) { int i, j, n_otu_tree, n_otu_cdata; n_otu_tree = tree->n_otu; n_otu_cdata = cdata->n_otu; if ((n_otu_tree != n_otu_cdata) && (io->fp_in_constraint_tree == NULL)) { PhyML_Printf("\n. Number of taxa in the tree: %d, number of sequences: %d.", n_otu_tree, n_otu_cdata); Warn_And_Exit("\n. The number of tips in the tree is not the same as the " "number of sequences\n"); } for (i = 0; i < n_otu_tree; i++) { for (j = 0; j < n_otu_cdata; j++) { if (!strcmp(tree->a_nodes[i]->name, cdata->c_seq[j]->name)) break; } if (j == n_otu_cdata) { PhyML_Printf("\n. Taxon '%s' was not found in sequence file '%s'.\n", tree->a_nodes[i]->name, io->in_align_file); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } tree->a_nodes[i]->c_seq = cdata->c_seq[j]; } if (tree->is_mixt_tree == YES) MIXT_Connect_Cseqs_To_Nodes(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Both_Sides(int yesno, t_tree *tree) { tree->both_sides = yesno; if (tree->is_mixt_tree == YES) MIXT_Set_Both_Sides(yesno, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Use_Eigen_Lr(int yesno, t_tree *tree) { tree->use_eigen_lr = yesno; if (tree->is_mixt_tree == YES) MIXT_Set_Use_Eigen_Lr(yesno, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Update_Eigen_Lr(int yesno, t_tree *tree) { tree->update_eigen_lr = yesno; if (tree->is_mixt_tree == YES) MIXT_Set_Update_Eigen_Lr(yesno, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Update_Eigen(int yesno, t_mod *mod) { MIXT_Set_Update_Eigen(yesno, mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Returns the matrix of pairwise distances between tips phydbl *Dist_Btw_Tips(t_tree *tree) { int i, j; phydbl *dist; dist = (phydbl *)mCalloc(tree->n_otu * tree->n_otu, sizeof(phydbl)); for (i = 0; i < tree->n_otu - 1; i++) { for (j = i + 1; j < tree->n_otu; j++) { Path_Length(tree->a_nodes[i], tree->a_nodes[j], dist + i * tree->n_otu + j, tree); dist[j * tree->n_otu + i] = dist[i * tree->n_otu + j]; } } return (dist); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Best_Root_Position_IL_Model(t_tree *tree) { if (tree->n_root) { PhyML_Printf("\n. The tree already has a root node"); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } else { int i; t_edge *best_edge; phydbl best_lnL; Free_Edge_Lk_Rght(tree->a_edges[2 * tree->n_otu - 3]); Free_Edge_Lk_Rght(tree->a_edges[2 * tree->n_otu - 2]); Free_Edge_Pars_Rght(tree->a_edges[2 * tree->n_otu - 3]); Free_Edge_Pars_Rght(tree->a_edges[2 * tree->n_otu - 2]); best_edge = NULL; best_lnL = UNLIKELY; for (i = 0; i < 2 * tree->n_otu - 3; ++i) { PhyML_Printf("\n. Positionning root node on edge %4d", tree->a_edges[i]->num); Add_Root(tree->a_edges[i], tree); tree->ignore_root = NO; Set_Both_Sides(YES, tree); Lk(NULL, tree); /* Optimize_Br_Len_Serie(2,tree); */ Update_Partial_Lk(tree, tree->n_root->b[1], tree->n_root); Br_Len_Opt(&(tree->n_root->b[1]->l->v), tree->n_root->b[1], tree); Update_Partial_Lk(tree, tree->n_root->b[2], tree->n_root); Br_Len_Opt(&(tree->n_root->b[2]->l->v), tree->n_root->b[2], tree); PhyML_Printf(" -- lnL: %20f", tree->c_lnL); if (tree->c_lnL > best_lnL) { best_lnL = tree->c_lnL; best_edge = tree->a_edges[i]; } } Add_Root(best_edge, tree); Set_Both_Sides(YES, tree); Lk(NULL, tree); Update_Partial_Lk(tree, tree->n_root->b[1], tree->n_root); Br_Len_Opt(&(tree->n_root->b[1]->l->v), tree->n_root->b[1], tree); Update_Partial_Lk(tree, tree->n_root->b[2], tree->n_root); Br_Len_Opt(&(tree->n_root->b[2]->l->v), tree->n_root->b[2], tree); tree->ignore_root = YES; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Br_Len_Var(t_edge *b, t_tree *tree) { if (tree->is_mixt_tree) { MIXT_Set_Br_Len_Var(b, tree); return; } if (tree->rates == NO && tree->mod->gamma_mgf_bl == YES) { if (b == NULL) { int i; for (i = 0; i < 2 * tree->n_otu - 1; ++i) { /* tree->a_edges[i]->l_var->v = POW(len,2)*tree->mod->l_var_sigma; */ tree->a_edges[i]->l_var->v = tree->mod->l_var_sigma->v; } } else { /* b->l_var->v = POW(len,2)*tree->mod->l_var_sigma; */ b->l_var->v = tree->mod->l_var_sigma->v; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Check_Br_Lens(t_tree *tree) { int i; scalar_dbl *l; For(i, 2 * tree->n_otu - 1) { l = tree->a_edges[i]->l; do { /* if(l->v < tree->mod->l_min) l->v = tree->mod->l_min; */ /* if(l->v > tree->mod->l_max) l->v = tree->mod->l_max; */ if (l->v < 0.0) l->v = 0.0; l = l->next; } while (l); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Build_Distrib_Number_Of_Diff_States_Under_Model(t_tree *tree) { calign *orig_data; t_mod *orig_mod; int iter, n_iter_tot, i, j; phydbl *n_diff_states_all_l, *n_diff_states_all_r; Calculate_Number_Of_Diff_States(tree); PhyML_Printf("\n TRUE edge side states val"); For(i, 2 * tree->n_otu - 3) { if (tree->a_edges[i]->left->tax == NO && tree->a_edges[i]->rght->tax == NO) { for (j = 0; j < tree->mod->ns; j++) { PhyML_Printf("\n TRUE %3d 0 %3d %d", i, j + 1, tree->a_edges[i]->n_diff_states_l[j]); PhyML_Printf("\n TRUE %3d 1 %3d %d", i, j + 1, tree->a_edges[i]->n_diff_states_r[j]); } } } n_iter_tot = 100; n_diff_states_all_l = (phydbl *)mCalloc((n_iter_tot) * (tree->mod->ns) * (2 * tree->n_otu - 3) * 2, sizeof(phydbl)); n_diff_states_all_r = (phydbl *)mCalloc((n_iter_tot) * (tree->mod->ns) * (2 * tree->n_otu - 3) * 2, sizeof(phydbl)); orig_mod = Copy_Model(tree->mod); orig_data = Copy_Cseq(tree->data, tree->io, NULL); orig_mod->io = tree->io; orig_mod->s_opt = tree->mod->s_opt; iter = 0; do { EVOLVE_Seq(tree->data, tree->mod, NULL, tree); Calculate_Number_Of_Diff_States(tree); for (i = 0; i < 2 * tree->n_otu - 3; ++i) { for (j = 0; j < tree->mod->ns; j++) { n_diff_states_all_l[j * (2 * tree->n_otu - 3) * (n_iter_tot) + i * (n_iter_tot) + iter] = tree->a_edges[i]->n_diff_states_l[j]; n_diff_states_all_r[j * (2 * tree->n_otu - 3) * (n_iter_tot) + i * (n_iter_tot) + iter] = tree->a_edges[i]->n_diff_states_r[j]; } } Free_Calign(tree->data); Free_Model_Complete(tree->mod); Free_Model_Basic(tree->mod); tree->mod = Copy_Model(orig_mod); tree->data = Copy_Cseq(orig_data, tree->io, NULL); tree->mod->io = orig_mod->io; tree->mod->s_opt = orig_mod->s_opt; Connect_CSeqs_To_Nodes(tree->data, tree->io, tree); iter++; } while (iter < n_iter_tot); PhyML_Printf("\n SIM edge side states low up"); For(i, 2 * tree->n_otu - 3) { if (tree->a_edges[i]->left->tax == NO && tree->a_edges[i]->rght->tax == NO) { for (j = 0; j < tree->mod->ns; j++) { PhyML_Printf("\n SIM %3d 0 %3d %.0f %.0f", i, j + 1, Quantile(n_diff_states_all_l + j * (2 * tree->n_otu - 3) * (n_iter_tot) + i * (n_iter_tot), n_iter_tot, 0.10), Quantile(n_diff_states_all_l + j * (2 * tree->n_otu - 3) * (n_iter_tot) + i * (n_iter_tot), n_iter_tot, 0.90)); PhyML_Printf("\n SIM %3d 1 %3d %.0f %.0f", i, j + 1, Quantile(n_diff_states_all_r + j * (2 * tree->n_otu - 3) * (n_iter_tot) + i * (n_iter_tot), n_iter_tot, 0.10), Quantile(n_diff_states_all_r + j * (2 * tree->n_otu - 3) * (n_iter_tot) + i * (n_iter_tot), n_iter_tot, 0.90)); } } } Add_Root(tree->a_edges[0], tree); DR_Draw_Tree("treefile", tree); Free(n_diff_states_all_l); Free(n_diff_states_all_r); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Calculate the number of sites at which 1,...,n states (n: 4 or 20) */ /* are observed, for every subtree */ void Calculate_Number_Of_Diff_States(t_tree *tree) { Init_Ui_Tips(tree); Calculate_Number_Of_Diff_States_Post(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree->a_nodes[0]->b[0], tree); Calculate_Number_Of_Diff_States_Pre(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree->a_nodes[0]->b[0], tree); /* int i; */ /* For(i,2*tree->n_otu-3) */ /* { */ /* if(tree->a_edges[i]->left->tax == NO && tree->a_edges[i]->rght->tax == * NO) */ /* printf("\n. Edge %d left : %d %d %d %d right: %d %d %d %d", */ /* i, */ /* tree->a_edges[i]->n_diff_states_l[0], */ /* tree->a_edges[i]->n_diff_states_l[1], */ /* tree->a_edges[i]->n_diff_states_l[2], */ /* tree->a_edges[i]->n_diff_states_l[3], */ /* tree->a_edges[i]->n_diff_states_r[0], */ /* tree->a_edges[i]->n_diff_states_r[1], */ /* tree->a_edges[i]->n_diff_states_r[2], */ /* tree->a_edges[i]->n_diff_states_r[3]); */ /* } */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Calculate_Number_Of_Diff_States_Post(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if (d->tax) return; else { int i; for (i = 0; i < 3; i++) if (d->v[i] != a) Calculate_Number_Of_Diff_States_Post(d, d->v[i], d->b[i], tree); Calculate_Number_Of_Diff_States_Core(a, d, b, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Calculate_Number_Of_Diff_States_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree) { if (d->tax) return; else { int i; for (i = 0; i < 3; i++) if (d->v[i] != a) { Calculate_Number_Of_Diff_States_Core(d->v[i], d, d->b[i], tree); Calculate_Number_Of_Diff_States_Pre(d, d->v[i], d->b[i], tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Calculate_Number_Of_Diff_States_Core(t_node *a, t_node *d, t_edge *b, t_tree *tree) { int *ui, *ui_v1, *ui_v2; int sum, site, state; int *diff; t_node *v1, *v2; ui = ui_v1 = ui_v2 = NULL; v1 = v2 = NULL; if (d == b->left) { v1 = (d == d->b[b->l_v1]->left) ? (d->b[b->l_v1]->rght) : (d->b[b->l_v1]->left); v2 = (d == d->b[b->l_v2]->left) ? (d->b[b->l_v2]->rght) : (d->b[b->l_v2]->left); ui = b->ui_l; diff = b->n_diff_states_l; ui_v1 = (d == d->b[b->l_v1]->left) ? (d->b[b->l_v1]->ui_r) : (d->b[b->l_v1]->ui_l); ui_v2 = (d == d->b[b->l_v2]->left) ? (d->b[b->l_v2]->ui_r) : (d->b[b->l_v2]->ui_l); } else { v1 = (d == d->b[b->r_v1]->left) ? (d->b[b->r_v1]->rght) : (d->b[b->r_v1]->left); v2 = (d == d->b[b->r_v2]->left) ? (d->b[b->r_v2]->rght) : (d->b[b->r_v2]->left); ui = b->ui_r; diff = b->n_diff_states_r; ui_v1 = (d == d->b[b->r_v1]->left) ? (d->b[b->r_v1]->ui_r) : (d->b[b->r_v1]->ui_l); ui_v2 = (d == d->b[b->r_v2]->left) ? (d->b[b->r_v2]->ui_r) : (d->b[b->r_v2]->ui_l); } for (state = 0; state < tree->mod->ns; state++) diff[state] = 0; for (site = 0; site < tree->data->n_pattern; site++) { if (v1->tax == YES) { int sum; sum = Sum_Bits(ui_v1[site], tree->mod->ns); if (sum > 1) { int val = ui_v1[site]; int pos, iter; phydbl u = Uni(); iter = 0; do { pos = Rand_Int(0, tree->mod->ns - 1); if (((val >> pos) & 1) && (u > 1. / sum)) break; } while (iter++ < 1000); if (iter == 1000) { Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } ui_v1[site] = POW(2, pos); } } if (v2->tax == YES) { int sum; sum = Sum_Bits(ui_v2[site], tree->mod->ns); if (sum > 1) { int val = ui_v2[site]; int pos, iter; phydbl u = Uni(); iter = 0; do { pos = Rand_Int(0, tree->mod->ns - 1); if (((val >> pos) & 1) && (u > 1. / sum)) break; } while (iter++ < 1000); if (iter == 1000) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); ui_v2[site] = POW(2, pos); } } ui[site] = ui_v1[site] | ui_v2[site]; sum = Sum_Bits(ui[site], tree->mod->ns); /* printf("\n. ui_v1: %d ui_v2: %d ui: %d sum: * %d",ui_v1[site],ui_v2[site],ui[site],sum); fflush(NULL); */ if (sum - 1 > tree->mod->ns - 1) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); diff[sum - 1]++; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Returns the number of distinct states observed at a particular site */ int Number_Of_Diff_States_One_Site(int site, t_tree *tree) { int n_states; Update_Dirs(tree); Number_Of_Diff_States_One_Site_Post(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree->a_nodes[0]->b[0], site, tree); n_states = Sum_Bits(tree->a_nodes[0]->b[0]->ui_r[site] | tree->a_nodes[0]->b[0]->ui_l[site], tree->mod->ns); return (n_states); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Number_Of_Diff_States_One_Site_Post(t_node *a, t_node *d, t_edge *b, int site, t_tree *tree) { if (d->tax) return; else { int i; for (i = 0; i < 3; i++) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Number_Of_Diff_States_One_Site_Post(d, d->v[i], d->b[i], site, tree); Number_Of_Diff_States_One_Site_Core(a, d, b, site, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Number_Of_Diff_States_One_Site_Core(t_node *a, t_node *d, t_edge *b, int site, t_tree *tree) { int *ui, *ui_v1, *ui_v2; int sum; t_node *v1, *v2; ui = ui_v1 = ui_v2 = NULL; v1 = v2 = NULL; if (d == b->left) { v1 = (d == d->b[b->l_v1]->left) ? (d->b[b->l_v1]->rght) : (d->b[b->l_v1]->left); v2 = (d == d->b[b->l_v2]->left) ? (d->b[b->l_v2]->rght) : (d->b[b->l_v2]->left); ui = b->ui_l; ui_v1 = (d == d->b[b->l_v1]->left) ? (d->b[b->l_v1]->ui_r) : (d->b[b->l_v1]->ui_l); ui_v2 = (d == d->b[b->l_v2]->left) ? (d->b[b->l_v2]->ui_r) : (d->b[b->l_v2]->ui_l); } else { v1 = (d == d->b[b->r_v1]->left) ? (d->b[b->r_v1]->rght) : (d->b[b->r_v1]->left); v2 = (d == d->b[b->r_v2]->left) ? (d->b[b->r_v2]->rght) : (d->b[b->r_v2]->left); ui = b->ui_r; ui_v1 = (d == d->b[b->r_v1]->left) ? (d->b[b->r_v1]->ui_r) : (d->b[b->r_v1]->ui_l); ui_v2 = (d == d->b[b->r_v2]->left) ? (d->b[b->r_v2]->ui_r) : (d->b[b->r_v2]->ui_l); } if (v1->tax == YES) // Check for ambiguous character state at this tip { sum = Sum_Bits(ui_v1[site], tree->mod->ns); if (sum > 1) { int val = ui_v1[site]; int pos, iter; phydbl u = Uni(); // Select a state uniformly at random iter = 0; do { pos = Rand_Int(0, tree->mod->ns - 1); if (((val >> pos) & 1) && (u > 1. / sum)) break; } while (iter++ < 1000); if (iter == 1000) { Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } ui_v1[site] = POW(2, pos); } } if (v2->tax == YES) { sum = Sum_Bits(ui_v2[site], tree->mod->ns); if (sum > 1) { int val = ui_v2[site]; int pos, iter; phydbl u = Uni(); iter = 0; do { pos = Rand_Int(0, tree->mod->ns - 1); if (((val >> pos) & 1) && (u > 1. / sum)) break; } while (iter++ < 1000); if (iter == 1000) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); ui_v2[site] = POW(2, pos); } } ui[site] = ui_v1[site] | ui_v2[site]; sum = Sum_Bits(ui[site], tree->mod->ns); if (sum - 1 > tree->mod->ns - 1) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); return sum; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // ROC curve and area under ROC curve. probs is the vector of class // probabilities. Each of the n_obs observations has probabilities for nclasses // associated to it. truth is a vector of 1/0 values. Values of truth associated // to the indices of the observations are set to 1. 0 otherwise. Lengths of // probs and truth vectors should be n_obs * n_classes. Each observation has a // given weight (vector weights), corresponding to a number of repeats of that // observation. void ROC(phydbl *probs, short int *truth, int n_classes, int n_obs, phydbl *weights, char *tag, FILE *fp_out) { phydbl *tp, *fp, *threshold, dum, area, sum_weights; int granularity; short int sorted; granularity = 10000; threshold = (phydbl *)mCalloc(granularity, sizeof(phydbl)); tp = (phydbl *)mCalloc(granularity, sizeof(phydbl)); fp = (phydbl *)mCalloc(granularity, sizeof(phydbl)); sum_weights = 0.0; for (int i = 0; i < n_obs; ++i) sum_weights += weights[i]; for (int i = 0; i < granularity; ++i) threshold[i] = (phydbl)i / (phydbl)granularity; for (int i = 0; i < granularity; i++) { for (int j = 0; j < n_obs; ++j) { for (int k = 0; k < n_classes; ++k) { if (probs[j * n_classes + k] > threshold[i]) { if (truth[j * n_classes + k] == 1) { tp[i] += weights[j]; // tp[i] += 1.; } else { fp[i] += weights[j]; // fp[i] += 1.; } // if(i == 0) PhyML_Printf("\n. i: %d j: %d k: %d tp: %f fp: %f prob: %f truth: %d", // i, j, k, tp[i], fp[i], probs[j * n_classes + k], // truth[j * n_classes + k]); } } } } for (int i = 0; i < granularity; i++) { tp[i] = tp[i] / (sum_weights); fp[i] = fp[i] / ((n_classes - 1) * sum_weights); PhyML_Fprintf(fp_out ? fp_out : stdout,"\n@@@%s,%f,%f,%f", tag ? tag : "", threshold[i], tp[i], fp[i]); } // Sort tp and fp in increasing order of values of fp do { sorted = YES; for (int i = 1; i < granularity; ++i) { if (fp[i] < fp[i - 1]) { dum = fp[i]; fp[i] = fp[i - 1]; fp[i - 1] = dum; dum = tp[i]; tp[i] = tp[i - 1]; tp[i - 1] = dum; sorted = NO; } } } while (sorted == NO); // Calculate area under ROC curve area = 0.0; for (int i = 1; i < granularity; ++i) { // Rectangle area assert(!(fp[i] < fp[i - 1])); area += MIN(tp[i], tp[i - 1]) * (fp[i] - fp[i - 1]); // Triangle area area += .5 * (MAX(tp[i], tp[i - 1]) - MIN(tp[i], tp[i - 1])) * (fp[i] - fp[i - 1]); } PhyML_Fprintf(fp_out ? fp_out : stdout,"\n. Area under ROC curve: %f", area); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Get_Lk(t_tree *tree) { t_tree *loc_tree; loc_tree = tree; /*! Rewind back to the first mixt_tree */ while (loc_tree->prev) loc_tree = loc_tree->prev; return loc_tree->c_lnL; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Get_dLk(t_tree *tree) { t_tree *loc_tree; loc_tree = tree; /*! Rewind back to the first mixt_tree */ while (loc_tree->prev) loc_tree = loc_tree->prev; return loc_tree->c_dlnL; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Get_d2Lk(t_tree *tree) { t_tree *loc_tree; loc_tree = tree; /*! Rewind back to the first mixt_tree */ while (loc_tree->prev) loc_tree = loc_tree->prev; return loc_tree->c_d2lnL; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Mean observed frequency of difference between the n(n-1)/2 pairs of sequences */ phydbl Mean_Identity(calign *data) { int i, j, n; phydbl tot_idt; n = data->n_otu; tot_idt = 0.0; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { tot_idt += Pairwise_Identity(i, j, data); } } return (tot_idt / (phydbl)(n * (n - 1.) / 2.)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Observed frequency of difference for the (i,j)-pair of sequences */ phydbl Pairwise_Identity(int i, int j, calign *data) { int k; phydbl div, p, d; div = 0.0; for (k = 0; k < data->n_pattern; k++) if (data->c_seq[i]->state[k] == data->c_seq[j]->state[k]) div += (phydbl)data->wght[k]; /* observed proportion of identity */ p = 1. - div / (phydbl)data->init_len; d = 0.0; if (data->io->datatype == NT) { if (p > 3. / 4.) return 0.25; else { /* Jukes & Cantor distance */ d = -(3. / 4.) * log(1. - 4. / 3. * p); } } else if (data->io->datatype == AA) { if (p > 19. / 20.) return 1. / 20.; else { /* Jukes & Cantor distance */ d = -(19. / 20.) * log(1. - 20. / 19. * p); } } else Generic_Exit(__FILE__, __LINE__, __FUNCTION__); return (exp(-d)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Fst(int i, int j, calign *data) { phydbl FA, Fr; FA = Mean_Identity(data); Fr = Pairwise_Identity(i, j, data); return ((Fr - FA) / (1 - FA)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Nucleotide_Diversity(calign *data) { int i, j, n; phydbl pair_div; n = data->n_otu; pair_div = 0.0; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { pair_div += 1. - Pairwise_Identity(i, j, data); } } return (pair_div / (phydbl)(n * (n - 1.) / 2.)); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Copy_Scalar_Dbl(scalar_dbl *from, scalar_dbl *to) { scalar_dbl *f, *t; f = from; t = to; do { assert(t); assert(f); t->v = f->v; t = t->next; f = f->next; } while (f); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ scalar_dbl *Duplicate_Scalar_Dbl(scalar_dbl *from) { scalar_dbl *to, *t, *f; to = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); t = to; f = from; do { t->v = f->v; f = f->next; if (f) t->next = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); t = t->next; } while (f); return (to); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Multiply_Scalar_Dbl(phydbl mult, scalar_dbl *x) { scalar_dbl *y; y = x; do { y->v = y->v * mult; y = y->next; } while (y); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Set_Scalar_Dbl(phydbl val, scalar_dbl *from) { scalar_dbl *f; f = from; do { f->v = val; ; f = f->next; } while (f); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Set_Scalar_Dbl_Min_Thresh(phydbl thresh, scalar_dbl *from) { scalar_dbl *f; f = from; do { if (f->v < thresh) f->v = thresh; f = f->next; } while (f); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Set_Scalar_Dbl_Max_Thresh(phydbl thresh, scalar_dbl *from) { scalar_dbl *f; f = from; do { if (f->v > thresh) f->v = thresh; f = f->next; } while (f); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Scalar_Elem(int pos, scalar_dbl *scl) { scalar_dbl *loc; loc = scl; while (--pos >= 0) loc = loc->next; assert(loc); return (loc->v); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void *Linked_List_Elem(int pos, t_ll *ll) { t_ll *loc; if (ll == NULL) return NULL; loc = ll->head; while (--pos >= 0) { assert(loc); loc = loc->next; } assert(loc); return (loc->v); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int Scalar_Len(scalar_dbl *scl) { int len; scalar_dbl *loc; if (!scl) return 0; loc = scl; len = 0; do { len++; loc = loc->next; } while (loc != NULL); return (len); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int Vect_Len(vect_dbl *scl) { int len; vect_dbl *loc; if (!scl) return 0; loc = scl; len = 0; do { len++; loc = loc->next; } while (loc != NULL); return (len); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int Linked_List_Len(t_ll *list) { int len; t_ll *loc; if (list == NULL) return 0; loc = list->head; len = 0; do { len++; loc = loc->next; } while (loc != NULL); return (len); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Push_Bottom_Linked_List(void *what, t_ll **list, bool remove_duplicates) { t_ll *new, *ll; new = (t_ll *)mCalloc(1, sizeof(t_ll)); new->v = (void *)what; // First elem of list if (*list == NULL) { *list = new; new->tail = new; new->head = new; new->next = NULL; new->prev = NULL; } else { ll = (*list)->head; if (remove_duplicates == YES) { do { if (ll->v == what) { Free(new); return; // 'what' already in list } ll = ll->next; } while (ll); } new->prev = (*list)->tail; (*list)->tail->next = new; new->next = NULL; new->head = (*list)->head; ll = (*list)->head; do { ll->tail = new; ll = ll->next; } while (ll); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Swap_Partial_Lk_Extra(t_edge *b, t_node *d, int whichone, t_tree *tree) { void *buff; if (whichone == 0) { if (d == b->left) { buff = b->div_post_pred_left; b->div_post_pred_left = tree->div_post_pred_extra_0; tree->div_post_pred_extra_0 = buff; buff = b->sum_scale_left_cat; b->sum_scale_left_cat = tree->sum_scale_cat_extra_0; tree->sum_scale_cat_extra_0 = buff; if (b->left) { if (!b->left->tax) { buff = b->sum_scale_left; b->sum_scale_left = tree->sum_scale_extra_0; tree->sum_scale_extra_0 = buff; } if (!b->left->tax || tree->mod->s_opt->greedy) { buff = b->p_lk_left; b->p_lk_left = tree->p_lk_extra_0; tree->p_lk_extra_0 = buff; } else if (b->left->tax) { buff = b->p_lk_tip_l; b->p_lk_tip_l = tree->p_lk_tip_extra_0; tree->p_lk_tip_extra_0 = buff; } } buff = b->patt_id_left; b->patt_id_left = tree->patt_id_extra_0; tree->patt_id_extra_0 = buff; } else { buff = b->div_post_pred_rght; b->div_post_pred_rght = tree->div_post_pred_extra_0; tree->div_post_pred_extra_0 = buff; buff = b->sum_scale_rght_cat; b->sum_scale_rght_cat = tree->sum_scale_cat_extra_0; tree->sum_scale_cat_extra_0 = buff; if (b->rght) { if (!b->rght->tax) { buff = b->sum_scale_rght; b->sum_scale_rght = tree->sum_scale_extra_0; tree->sum_scale_extra_0 = buff; } if (!b->rght->tax || tree->mod->s_opt->greedy) { buff = b->p_lk_rght; b->p_lk_rght = tree->p_lk_extra_0; tree->p_lk_extra_0 = buff; } else if (b->rght->tax) { buff = b->p_lk_tip_r; b->p_lk_tip_r = tree->p_lk_tip_extra_0; tree->p_lk_tip_extra_0 = buff; } } buff = b->patt_id_rght; b->patt_id_rght = tree->patt_id_extra_0; tree->patt_id_extra_0 = buff; } } else { if (d == b->left) { buff = b->div_post_pred_left; b->div_post_pred_left = tree->div_post_pred_extra_1; tree->div_post_pred_extra_1 = buff; buff = b->sum_scale_left_cat; b->sum_scale_left_cat = tree->sum_scale_cat_extra_1; tree->sum_scale_cat_extra_1 = buff; if (b->left) { if (!b->left->tax) { buff = b->sum_scale_left; b->sum_scale_left = tree->sum_scale_extra_1; tree->sum_scale_extra_1 = buff; } if (!b->left->tax || tree->mod->s_opt->greedy) { buff = b->p_lk_left; b->p_lk_left = tree->p_lk_extra_1; tree->p_lk_extra_1 = buff; } else if (b->left->tax) { buff = b->p_lk_tip_l; b->p_lk_tip_l = tree->p_lk_tip_extra_1; tree->p_lk_tip_extra_1 = buff; } } buff = b->patt_id_left; b->patt_id_left = tree->patt_id_extra_1; tree->patt_id_extra_1 = buff; } else { buff = b->div_post_pred_rght; b->div_post_pred_rght = tree->div_post_pred_extra_1; tree->div_post_pred_extra_1 = buff; buff = b->sum_scale_rght_cat; b->sum_scale_rght_cat = tree->sum_scale_cat_extra_1; tree->sum_scale_cat_extra_1 = buff; if (b->rght) { if (!b->rght->tax) { buff = b->sum_scale_rght; b->sum_scale_rght = tree->sum_scale_extra_1; tree->sum_scale_extra_1 = buff; } if (!b->rght->tax || tree->mod->s_opt->greedy) { buff = b->p_lk_rght; b->p_lk_rght = tree->p_lk_extra_1; tree->p_lk_extra_1 = buff; } else if (b->rght->tax) { buff = b->p_lk_tip_r; b->p_lk_tip_r = tree->p_lk_tip_extra_1; tree->p_lk_tip_extra_1 = buff; } } buff = b->patt_id_rght; b->patt_id_rght = tree->patt_id_extra_1; tree->patt_id_extra_1 = buff; } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Remove_From_Linked_List(t_ll *elem, void *val, t_ll **list) { t_ll *ll; if (*list == NULL) return; ll = (*list)->head; /* t_node *n = elem ? elem->v : val; */ do { if ((elem && ll == elem) || (val && ll->v == val)) { if (ll == (*list)->head && ll != (*list)->tail) { // Re-initialise head of list t_ll *mm, *newhead; mm = (*list); newhead = (*list)->head->next; do { mm->head = newhead; mm = mm->next; } while (mm); (*list) = (*list)->head; (*list)->head->prev = NULL; } else if (ll != (*list)->head && ll == (*list)->tail) { // Re-initialise tail of list t_ll *mm, *newtail; mm = (*list); newtail = (*list)->tail->prev; do { mm->tail = newtail; mm = mm->next; } while (mm); (*list)->tail->next = NULL; } else if (ll == (*list)->head && ll == (*list)->tail) { (*list)->tail = NULL; (*list)->head = NULL; (*list)->next = NULL; (*list)->prev = NULL; (*list) = NULL; /* printf("\n. free %p",ll); */ Free(ll); return; } else { ll->prev->next = ll->next; ll->next->prev = ll->prev; } ll->next = NULL; ll->prev = NULL; ll->head = NULL; ll->tail = NULL; /* printf("\n. free %p",ll); */ Free(ll); return; } ll = ll->next; } while (ll != NULL); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if defined(PHYREX) t_ll *Get_Velocity_Targets(t_node *a, t_node *d, t_tree *tree) { t_ll *list; int i; phydbl var; if (a != NULL) { var = 0.0; for (i = 0; i < tree->mmod->n_dim; ++i) var += VELOC_Velocity_Variance_Along_Edge(d, i, tree); if (var < 1.E-2) return NULL; } list = NULL; Push_Bottom_Linked_List(d, &list, NO); for (i = 0; i < 3; i++) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Get_Velocity_Targets_Post(d, d->v[i], &list, tree); } return list; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Get_Velocity_Targets_Post(t_node *a, t_node *d, t_ll **list, t_tree *tree) { int i; phydbl var; var = 0.0; for (i = 0; i < tree->mmod->n_dim; ++i) var += VELOC_Velocity_Variance_Along_Edge(d, i, tree); if (var < 1.E-2) Push_Bottom_Linked_List(d, list, NO); else return; if (d->tax == YES) return; else { for (i = 0; i < 3; i++) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Get_Velocity_Targets_Post(d, d->v[i], list, tree); } } return; } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_ll *Get_List_Of_Reachable_Tips(t_node *a, t_node *d, t_tree *tree) { t_ll *list; list = NULL; Get_List_Of_Reachable_Tips_Post(a, d, &list, tree); return list; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Get_List_Of_Reachable_Tips_Post(t_node *a, t_node *d, t_ll **list, t_tree *tree) { if (d->tax) { Push_Bottom_Linked_List(d, list, YES); return; } else { int i; for (i = 0; i < 3; i++) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Get_List_Of_Reachable_Tips_Post(d, d->v[i], list, tree); } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // tips0: first list of tips. tips1: second list of tips phydbl Length_Of_Path_Between_List_Of_Tips(t_ll *tips0, t_ll *tips1, matrix *mat) { phydbl d, n; t_ll *x, *y; t_node *nx, *ny; d = 0.0; n = 0; /* Print_Mat(mat); */ // Add all distances between tips in distinct lists x = tips0->head; do { y = tips1->head; do { nx = (t_node *)x->v; ny = (t_node *)y->v; d += mat->dist[nx->c_seq->num][ny->c_seq->num]; /* printf("\n. nx: %d ny: %d [%p %p] d: %G", */ /* nx->c_seq->num, */ /* ny->c_seq->num, */ /* x->head, */ /* y->head, */ /* mat->dist[nx->c_seq->num][ny->c_seq->num]); fflush(NULL); */ n++; // number of pairs of tips, each tip in different lists y = y->next; } while (y); x = x->next; } while (x); // Remove distances between tips in tips0 x = tips0->head; do { y = tips0->head; do { nx = (t_node *)x->v; ny = (t_node *)y->v; d -= mat->dist[nx->c_seq->num][ny->c_seq->num]; y = y->next; } while (y); x = x->next; } while (x); // Remove distances between tips in tips1 x = tips1->head; do { y = tips1->head; do { nx = (t_node *)x->v; ny = (t_node *)y->v; d -= mat->dist[nx->c_seq->num][ny->c_seq->num]; y = y->next; } while (y); x = x->next; } while (x); return d / (phydbl)n; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Replace_Short_With_Long_Tax_Names(t_tree *tree, option *io) { int i, j; for (i = 0; i < tree->n_otu; ++i) { for (j = 0; j < tree->n_otu; ++j) { if (!strcmp(io->short_tax_names[i], tree->a_nodes[j]->name)) { Free(tree->a_nodes[j]->name); tree->a_nodes[j]->name = (char *)mCalloc(strlen(io->long_tax_names[i]) + 1, sizeof(char)); strcpy(tree->a_nodes[j]->name, io->long_tax_names[i]); tree->a_nodes[i]->ori_name = tree->a_nodes[j]->name; break; } } if (j == tree->n_otu) { PhyML_Printf("\n. Taxon '%s' with short name '%s' not found in the tree", io->long_tax_names[i], io->short_tax_names[i]); assert(false); } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Random_Walk_Along_Tree_On_Radius(t_node *a, t_node *d, t_edge *b, phydbl *radius, t_edge **target_edge, t_node **target_nd, phydbl *target_time, t_tree *tree) { assert(tree->rates); phydbl delta, ta, td, u; /* printf("\n. a: %d d: %d radius: %G l->v: %G", */ /* a->num, */ /* d->num, */ /* *radius, */ /* b->l->v); fflush(NULL); */ /* if(tree->times->nd_t[a->num] < tree->times->nd_t[d->num]) */ /* { */ /* printf("\n. a: %d d: %d radius: %f l: %f [%f] -- %f | %f [%d]", */ /* a->num, */ /* d->num, */ /* *radius, */ /* b->l->v, */ /* FABS(tree->times->nd_t[a->num] - tree->times->nd_t[d->num]) * * tree->rates->clock_r * tree->rates->br_r[d->num], */ /* tree->rates->cur_l[d->num], */ /* tree->rates->cur_l[a->num], */ /* b == tree->e_root); fflush(NULL); */ /* } */ /* else */ /* { */ /* printf("\n. a: %d d: %d radius: %f l: %f [%f] -- %f | %f [%d]", */ /* a->num, */ /* d->num, */ /* *radius, */ /* b->l->v, */ /* FABS(tree->times->nd_t[a->num] - tree->times->nd_t[d->num]) * * tree->rates->clock_r * tree->rates->br_r[a->num], */ /* tree->rates->cur_l[d->num], */ /* tree->rates->cur_l[a->num], */ /* b == tree->e_root); fflush(NULL); */ /* } */ delta = *radius; if (!(delta > 0.0)) { PhyML_Fprintf(stderr, "\n. delta=%G", delta); assert(FALSE); } (*radius) -= b->l->v; if (*radius < 0.0) { *target_edge = b; ta = tree->times->nd_t[a->num]; td = tree->times->nd_t[d->num]; if (b != tree->e_root) { if (ta < td) { /* *target_time = ta + delta / (tree->rates->clock_r * * tree->rates->br_r[d->num]); */ *target_time = ta + delta / (tree->rates->cur_l[d->num] / fabs(ta - td)); *target_nd = d; /* printf("\n$ %G %G", */ /* tree->rates->clock_r * tree->rates->br_r[d->num], */ /* tree->rates->cur_l[d->num] / fabs(ta-td)); */ /* PhyML_Fprintf(stderr,"\n< ta: %G td: %G new_time: %G delta: %G c: %G * r: %G rad: %G l->v: %G cur_l: %G root_edge ? %d", */ /* ta, */ /* td, */ /* *target_time, */ /* delta, */ /* tree->rates->clock_r, */ /* tree->rates->br_r[d->num], */ /* *radius, */ /* b->l->v, */ /* tree->rates->cur_l[d->num], */ /* b == tree->e_root); */ assert(*target_time > ta && *target_time < td); } else { /* *target_time = ta - delta / (tree->rates->clock_r * * tree->rates->br_r[a->num]); */ *target_time = ta - delta / (tree->rates->cur_l[a->num] / fabs(ta - td)); *target_nd = a; /* printf("\nz %G %G", */ /* tree->rates->clock_r * tree->rates->br_r[a->num], */ /* tree->rates->cur_l[a->num] / fabs(ta-td)); */ /* PhyML_Fprintf(stderr,"\n> ta: %f td: %f new_time: %f delta: %f c: %f * r: %f l->v: %G cur_l: %G root_edge ? %d", */ /* ta, */ /* td, */ /* *target_time, */ /* delta, */ /* tree->rates->clock_r, */ /* tree->rates->br_r[a->num], */ /* b->l->v, */ /* tree->rates->cur_l[a->num], */ /* b == tree->e_root); */ assert(*target_time < ta && *target_time > td); } } else { phydbl t_root = tree->times->nd_t[tree->n_root->num]; // target falls on edge below root leading to node a if (delta < tree->rates->cur_l[a->num]) { /* *target_time = ta - delta / (tree->rates->clock_r * * tree->rates->br_r[a->num]); */ *target_time = ta - delta / (tree->rates->cur_l[a->num] / fabs(t_root - ta)); *target_nd = a; /* printf("\nX %G %G",tree->rates->cur_l[a->num] / * fabs(t_root-ta),tree->rates->clock_r * tree->rates->br_r[a->num]); */ /* PhyML_Fprintf(stderr,"\n.. delta: %f l(a): %f time: %f ta: * %f",delta,tree->rates->cur_l[a->num],*target_time,ta); */ } else { u = Uni(); if (u < .5) { // target falls on edge below root leading to node d /* *target_time = tree->times->nd_t[tree->n_root->num] + (delta - * tree->rates->cur_l[a->num])/(tree->rates->clock_r * * tree->rates->br_r[d->num]); */ *target_time = tree->times->nd_t[tree->n_root->num] + (delta - tree->rates->cur_l[a->num]) / (tree->rates->cur_l[d->num] / fabs(t_root - td)); *target_nd = d; /* printf("\nq %G %G", */ /* tree->rates->clock_r * tree->rates->br_r[d->num], */ /* tree->rates->cur_l[d->num] / fabs(t_root-td)); */ /* PhyML_Fprintf(stderr,"\n<< ta: %f td: %f new_time: %f delta: %f c: * %f",ta,td,*target_time,delta,tree->rates->clock_r); */ } else { // target falls above root *target_time = tree->times->nd_t[tree->n_root->num] - (delta - tree->rates->cur_l[a->num]) / tree->rates->clock_r; *target_nd = tree->n_root; /* PhyML_Fprintf(stderr,"\n>> ta: %f td: %f new_time: %f delta: %f c: * %f",ta,td,*target_time,delta,tree->rates->clock_r); */ } } } return; } if (d->tax == YES) return; else { int i, dir1, dir2; dir1 = dir2 = -1; for (i = 0; i < 3; ++i) if (d->v[i] != a) { if (dir1 < 0) dir1 = i; else dir2 = i; } u = Uni(); if (u < .5) Random_Walk_Along_Tree_On_Radius(d, d->v[dir1], d->b[dir1], radius, target_edge, target_nd, target_time, tree); else Random_Walk_Along_Tree_On_Radius(d, d->v[dir2], d->b[dir2], radius, target_edge, target_nd, target_time, tree); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Table_Top(unsigned int width) { unsigned int i; PhyML_Printf("\n\t \u256D"); for (i = 0; i < width; ++i) PhyML_Printf("\u2500"); PhyML_Printf("\u256E "); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Table_Row(unsigned int width) { unsigned int i; /* PhyML_Printf("\n\t \u2502"); */ PhyML_Printf("\n\t \u251C"); for (i = 0; i < width; ++i) PhyML_Printf("\u2500"); /* PhyML_Printf("\u2502"); */ PhyML_Printf("\u2524"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Table_Bottom(unsigned int width) { unsigned int i; PhyML_Printf("\n\t \u2570"); for (i = 0; i < width; ++i) PhyML_Printf("\u2500"); PhyML_Printf("\u256F "); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_cal *Duplicate_Calib(t_cal *from) { int i; t_cal *to; to = Make_Calibration(); to->current_clade_idx = from->current_clade_idx; to->lower = from->lower; to->upper = from->upper; to->is_primary = from->is_primary; to->clade_list_size = from->clade_list_size; to->id = (char *)mCalloc(strlen(from->id) + 1, sizeof(char)); strcpy(to->id, from->id); if (from->clade_list_size > 0) { to->alpha_proba_list = (phydbl *)mCalloc(from->clade_list_size, sizeof(phydbl)); to->clade_list = (t_clad **)mCalloc(from->clade_list_size, sizeof(t_clad *)); } else { to->alpha_proba_list = NULL; to->clade_list = NULL; } for (i = 0; i < from->clade_list_size; ++i) { to->alpha_proba_list[i] = from->alpha_proba_list[i]; to->clade_list[i] = Duplicate_Clade(from->clade_list[i]); } return (to); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_clad *Duplicate_Clade(t_clad *from) { int i; t_clad *to; to = Make_Clade(); to->id = (char *)mCalloc(strlen(from->id) + 1, sizeof(char)); strcpy(to->id, from->id); to->n_tax = from->n_tax; to->target_nd = from->target_nd; to->tax_list = (char **)mCalloc(from->n_tax, sizeof(char *)); to->tip_list = (t_node **)mCalloc(from->n_tax, sizeof(t_node *)); for (i = 0; i < from->n_tax; ++i) { to->tax_list[i] = (char *)mCalloc(strlen(from->tax_list[i]) + 1, sizeof(char)); strcpy(to->tax_list[i], from->tax_list[i]); to->tip_list[i] = from->tip_list[i]; } return to; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ char *Mutation_Id(int mut_idx, t_tree *tree) { char *s, c; int ns; ns = tree->mod->ns; s = (char *)mCalloc(20, sizeof(char)); /* strcpy(s,"from "); */ strcpy(s, " "); c = Reciproc_Assign_State((int)(mut_idx / ns), tree->mod->io->datatype); sprintf(s + strlen(s), "%c", c); /* strcat(s," to "); */ strcat(s, " "); c = Reciproc_Assign_State((int)(mut_idx % ns), tree->mod->io->datatype); sprintf(s + strlen(s), "%c", c); return (s); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Random_Tax_Idx(t_node *a, t_node *d, int *idx, t_tree *tree) { if (d->tax == YES) { (*idx) = d->num; return; } else { for (int i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { Random_Tax_Idx(d, d->v[i], idx, tree); } } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void List_Taxa_In_Clade(t_node *a, t_node *d, t_tree *tree) { if (d->tax == YES) { PhyML_Printf("\n- [%50s]", d->name); } else { for (int i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { List_Taxa_In_Clade(d, d->v[i], tree); } } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Alias_Subpatt(t_tree *tree) { if (tree->n_root && tree->ignore_root == NO) { Alias_Subpatt_Post(tree->n_root, tree->n_root->v[2], tree); Alias_Subpatt_Post(tree->n_root, tree->n_root->v[1], tree); } else { Alias_Subpatt_Post(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree); /* if(tree->both_sides) */ Alias_Subpatt_Pre(tree->a_nodes[0], tree->a_nodes[0]->v[0], tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Alias_One_Subpatt(t_node *a, t_node *d, t_tree *tree) { int i, j; int *patt_id_v1, *patt_id_v2, *patt_id_d; int *p_lk_loc_d, *p_lk_loc_v1, *p_lk_loc_v2; t_node *v1, *v2; t_edge *b0, *b1, *b2; int curr_patt_id_v1, curr_patt_id_v2; int curr_p_lk_loc_v1, curr_p_lk_loc_v2; int num_subpatt; b0 = b1 = b2 = NULL; if (d->tax) { patt_id_d = (d == d->b[0]->left) ? (d->b[0]->patt_id_left) : (d->b[0]->patt_id_rght); p_lk_loc_d = (d == d->b[0]->left) ? (d->b[0]->p_lk_loc_left) : (d->b[0]->p_lk_loc_rght); for (i = 0; i < tree->data->n_pattern; i++) { for (j = 0; j < tree->data->n_pattern; j++) { if (patt_id_d[i] == patt_id_d[j]) { p_lk_loc_d[i] = j; break; } if (j > i) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit(""); } } } return; } else { v1 = v2 = NULL; for (i = 0; i < 3; i++) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if (!v1) { v1 = d->v[i]; b1 = d->b[i]; } else { v2 = d->v[i]; b2 = d->b[i]; } } else { b0 = d->b[i]; } } patt_id_v1 = (v1 == b1->left) ? (b1->patt_id_left) : (b1->patt_id_rght); patt_id_v2 = (v2 == b2->left) ? (b2->patt_id_left) : (b2->patt_id_rght); patt_id_d = (d == b0->left) ? (b0->patt_id_left) : (b0->patt_id_rght); p_lk_loc_d = (d == b0->left) ? (b0->p_lk_loc_left) : (b0->p_lk_loc_rght); p_lk_loc_v1 = (v1 == b1->left) ? (b1->p_lk_loc_left) : (b1->p_lk_loc_rght); p_lk_loc_v2 = (v2 == b2->left) ? (b2->p_lk_loc_left) : (b2->p_lk_loc_rght); num_subpatt = 0; for (i = 0; i < tree->data->n_pattern; i++) { curr_patt_id_v1 = patt_id_v1[i]; curr_patt_id_v2 = patt_id_v2[i]; curr_p_lk_loc_v1 = p_lk_loc_v1[i]; curr_p_lk_loc_v2 = p_lk_loc_v2[i]; p_lk_loc_d[i] = i; if ((curr_p_lk_loc_v1 == i) || (curr_p_lk_loc_v2 == i)) { p_lk_loc_d[i] = i; patt_id_d[i] = num_subpatt; num_subpatt++; } else if (curr_p_lk_loc_v1 == curr_p_lk_loc_v2) { p_lk_loc_d[i] = curr_p_lk_loc_v1; patt_id_d[i] = patt_id_d[curr_p_lk_loc_v1]; } else { for (j = MAX(curr_p_lk_loc_v1, curr_p_lk_loc_v2); j < tree->data->n_pattern; j++) { if ((patt_id_v1[j] == curr_patt_id_v1) && (patt_id_v2[j] == curr_patt_id_v2)) { p_lk_loc_d[i] = j; if (j == i) { patt_id_d[i] = num_subpatt; num_subpatt++; } else patt_id_d[i] = patt_id_d[j]; break; } if (j > i) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n\n", __FILE__, __LINE__); Warn_And_Exit(""); } } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Alias_Subpatt_Post(t_node *a, t_node *d, t_tree *tree) { if (d->tax) return; else { int i; for (i = 0; i < 3; i++) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { Alias_Subpatt_Post(d, d->v[i], tree); } } Alias_One_Subpatt(a, d, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Alias_Subpatt_Pre(t_node *a, t_node *d, t_tree *tree) { if (d->tax) return; else { int i; for (i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { Alias_One_Subpatt(d->v[i], d, tree); Alias_Subpatt_Pre(d, d->v[i], tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char Integer_To_IUPAC_Code(int x) { char c; switch (x) { case 0: { assert(FALSE); break; } case 1: { c = 'A'; break; } case 2: { c = 'C'; break; } case 3: { c = 'M'; break; } case 4: { c = 'G'; break; } case 5: { c = 'R'; break; } case 6: { c = 'S'; break; } case 7: { c = 'V'; break; } case 8: { c = 'T'; break; } case 9: { c = 'W'; break; } case 10: { c = 'Y'; break; } case 11: { c = 'H'; break; } case 12: { c = 'K'; break; } case 13: { c = 'D'; break; } case 14: { c = 'B'; break; } case 15: { c = 'N'; break; } default: assert(FALSE); } return (c); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int *Integer_To_Bit(int val, const int ns) { assert(ns > 0); int *res; unsigned int mask = 1U << (ns - 1); int i; res = (int *)mCalloc(ns, sizeof(int)); for (i = 0; i < ns; ++i) { res[i] = (val & mask) ? 1 : 0; val <<= 1; } return res; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ char *Bit_To_Character_String(int *bit, int ns) { assert(ns == 4 || ns == 20); char *s; int idx; s = (char *)mCalloc(2 * ns, sizeof(char)); switch (ns) { case 4: { char alphabet[4] = "ACGT"; idx = 0; for (int i = 0; i < 4; ++i) { if (bit[i] == 1) { if (idx == 0) s[idx++] = alphabet[i]; else { s[idx] = ','; s[idx + 1] = alphabet[i]; idx += 2; } } } s[idx] = '\0'; break; } case 20: { char alphabet[20] = "ARNDCQEGHILKMFPSTWYV"; idx = 0; for (int i = 0; i < 20; ++i) { if (bit[i] == 1) { if (idx == 0) s[idx++] = alphabet[i]; else { s[idx] = ','; s[idx + 1] = alphabet[i]; idx += 2; } } } s[idx] = '\0'; break; } default: Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } return s; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Shuffle_Sites(const phydbl prop, align **data, const int n_otu) { unsigned int i, j, rand_otu; phydbl u; char c; for (j = 0; j < data[0]->len; ++j) { u = Uni(); if (u < prop) { for (i = 0; i < n_otu; ++i) { rand_otu = Rand_Int(0, n_otu - 1); c = data[i]->state[j]; data[i]->state[j] = data[rand_otu]->state[j]; data[rand_otu]->state[j] = c; } } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl Tree_Height(t_tree *tree) { phydbl h; t_node *n, *anc; int i; assert(tree->n_root != NULL); h = 0; n = tree->n_root; anc = NULL; assert(n->tax == NO); do { for (i = 0; i < 3; ++i) { if (n->v[i] && n->v[i] != anc) { h += n->b[i]->l->v; break; } } anc = n; n = n->v[i]; } while (n->tax == NO); return h; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Adjust node ages so that every edge in tree has length > min_l. Assume strict molecular clock */ void Inflate_Times_To_Get_Reasonnable_Edge_Lengths(phydbl min_l, t_tree *tree) { phydbl l1, l2; Post_Inflate_Times_To_Get_Reasonnable_Edge_Lengths( tree->n_root, tree->n_root->v[1], tree->n_root->b[1], min_l, tree); Post_Inflate_Times_To_Get_Reasonnable_Edge_Lengths( tree->n_root, tree->n_root->v[2], tree->n_root->b[2], min_l, tree); l1 = (tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]) * tree->rates->clock_r; l2 = (tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]) * tree->rates->clock_r; if (MIN(l1, l2) < min_l) { tree->times->nd_t[tree->n_root->num] = -(min_l / tree->rates->clock_r - MIN(tree->times->nd_t[tree->n_root->v[1]->num], tree->times->nd_t[tree->n_root->v[2]->num])); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Post_Inflate_Times_To_Get_Reasonnable_Edge_Lengths(t_node *a, t_node *d, t_edge *b, phydbl min_l, t_tree *tree) { if (d->tax == YES) return; else { int i, dir1, dir2; phydbl l1, l2; for (i = 0; i < 3; ++i) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) Post_Inflate_Times_To_Get_Reasonnable_Edge_Lengths(d, d->v[i], d->b[i], min_l, tree); dir1 = dir2 = -1; for (i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if (dir1 < 0) dir1 = i; else dir2 = i; } } l1 = (tree->times->nd_t[d->v[dir1]->num] - tree->times->nd_t[d->num]) * tree->rates->clock_r; l2 = (tree->times->nd_t[d->v[dir2]->num] - tree->times->nd_t[d->num]) * tree->rates->clock_r; if (MIN(l1, l2) < min_l) { tree->times->nd_t[d->num] = -(min_l / tree->rates->clock_r - MIN(tree->times->nd_t[d->v[dir1]->num], tree->times->nd_t[d->v[dir2]->num])); } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Given an up-to-date values of n->v[i] and n->b[i] for i=0,1,2 and node n in the tree, this function returns up-to-date values of a_nodes and a_edges array (whereby a_edges[b->num] = b and a_nodes[n->num] = n, for all b and n in the tree) and updates n->num and b->num accordingly. */ void Refactor_Tree(t_tree *tree) { int i, idx_nd, idx_br; idx_nd = idx_br = 0; for (i = 0; i < tree->n_otu; ++i) if (tree->a_nodes[i] != NULL) { Refactor_External(tree->a_nodes[i], tree->a_nodes[i]->v[0], &idx_nd, tree); break; } assert(i < tree->n_otu); assert(idx_nd == tree->n_otu); idx_br = idx_nd; for (i = 0; i < tree->n_otu; ++i) if (tree->a_nodes[i] != NULL) { Refactor_Internal(tree->a_nodes[i], tree->a_nodes[i]->v[0], tree->a_nodes[i]->b[0], &idx_nd, &idx_br, tree); break; } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Refactor_External(t_node *a, t_node *d, int *idx, t_tree *tree) { if (a->tax == YES) { tree->a_nodes[*idx] = a; tree->a_edges[*idx] = a->b[0]; a->num = *idx; a->b[0]->num = *idx; (*idx) += 1; } if (d->tax == YES) { tree->a_nodes[*idx] = d; tree->a_edges[*idx] = d->b[0]; d->num = *idx; d->b[0]->num = *idx; (*idx) += 1; return; } else { for (int i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { Refactor_External(d, d->v[i], idx, tree); } } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Refactor_Internal(t_node *a, t_node *d, t_edge *b, int *idx_nd, int *idx_br, t_tree *tree) { if (d->tax == YES) return; else { tree->a_nodes[*idx_nd] = d; d->num = *idx_nd; (*idx_nd) += 1; if (a->tax == NO) // b is an external edge { tree->a_edges[*idx_br] = b; b->num = *idx_br; (*idx_br) += 1; } for (int i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { Refactor_Internal(d, d->v[i], d->b[i], idx_nd, idx_br, tree); } } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Reset_Lk(t_tree *tree) { tree->c_lnL = tree->p_lnL; if (tree->mmod) tree->mmod->c_lnL = tree->mmod->p_lnL; if (tree->times) tree->times->c_lnL = tree->times->p_lnL; if (tree->rates) tree->rates->c_lnL = tree->rates->p_lnL; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Reset_Prior(t_tree *tree) { if (tree->mmod) tree->mmod->c_lnP = tree->mmod->p_lnP; if (tree->times) tree->times->c_lnP = tree->times->p_lnP; if (tree->rates) tree->rates->c_lnP = tree->rates->p_lnP; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Set_Lk(t_tree *tree) { tree->p_lnL = tree->c_lnL; if (tree->mmod) tree->mmod->p_lnL = tree->mmod->c_lnL; if (tree->times) tree->times->p_lnL = tree->times->c_lnL; if (tree->rates) tree->rates->p_lnL = tree->rates->c_lnL; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Set_Prior(t_tree *tree) { if (tree->mmod) tree->mmod->p_lnP = tree->mmod->c_lnP; if (tree->times) tree->times->p_lnP = tree->times->c_lnP; if (tree->rates) tree->rates->p_lnP = tree->rates->c_lnP; } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_edge *Get_Edge(t_node *a, t_node *d, t_tree *tree) { for (int i = 0; i < 3; ++i) if (d->v[i] == a) return (d->b[i]); if (tree->n_root && a == tree->n_root) { if (tree->ignore_root == NO) { if (d == a->v[1]) return (a->b[1]); else if (d == a->v[2]) return (a->b[2]); else assert(false); } else { return (tree->e_root); } } else assert(false); return (NULL); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Label_Nodes_With_Velocities(t_tree *tree) { t_dsk *disk; t_node *n; phydbl veloclon, veloclat; t_label *lab; lab = NULL; veloclon = veloclat = -1.; for (int i = 0; i < tree->n_otu; ++i) { lab = Get_Next_Label(tree->a_nodes[i]->label); if (tree->a_nodes[i]->label == NULL) tree->a_nodes[i]->label = lab; /* if(tree->a_nodes[i]->label == NULL) */ /* { */ /* tree->a_nodes[i]->label = Make_Label(); */ /* lab = tree->a_nodes[i]->label; */ /* } */ /* else */ /* { */ /* lab = tree->a_nodes[i]->label; */ /* while(lab->next != NULL) lab = lab->next; */ /* lab->next = Make_Label(); */ /* lab = lab->next; */ /* } */ veloclat = tree->a_nodes[i]->ldsk->veloc->deriv[1]; veloclon = tree->a_nodes[i]->ldsk->veloc->deriv[0]; sprintf(lab->key, "velocity"); sprintf(lab->val, "{%f,%f}", veloclat, veloclon); } disk = tree->young_disk->prev; do { if (disk->ldsk && disk->ldsk->nd != NULL) { n = disk->ldsk->nd; lab = Get_Next_Label(n->label); if (n->label == NULL) n->label = lab; /* if(n->label == NULL) */ /* { */ /* n->label = Make_Label(); */ /* lab = n->label; */ /* } */ /* else */ /* { */ /* lab = n->label; */ /* while(lab->next != NULL) lab = lab->next; */ /* lab->next = Make_Label(); */ /* lab = lab->next; */ /* } */ veloclat = disk->ldsk->veloc->deriv[1]; veloclon = disk->ldsk->veloc->deriv[0]; sprintf(lab->key, "velocity"); sprintf(lab->val, "{%f,%f}", veloclat, veloclon); /* Print same label on all internal nodes with exactly the */ /* same coalescence time. */ for (int i = tree->n_otu; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_nodes[i] != n && Are_Equal(tree->times->nd_t[i], tree->times->nd_t[n->num], 1.E-10) == YES) { n = tree->a_nodes[i]; lab = Get_Next_Label(n->label); if (n->label == NULL) n->label = lab; /* if(n->label == NULL) */ /* { */ /* n->label = Make_Label(); */ /* lab = n->label; */ /* } */ /* else */ /* { */ /* lab = n->label; */ /* while(lab->next != NULL) lab = lab->next; */ /* lab->next = Make_Label(); */ /* lab = lab->next; */ /* } */ veloclat = disk->ldsk->veloc->deriv[1]; veloclon = disk->ldsk->veloc->deriv[0]; sprintf(lab->key, "velocity"); sprintf(lab->val, "{%f,%f}", veloclat, veloclon); } } } disk = disk->prev; } while (disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Label_Nodes_With_Locations(t_tree *tree) { t_dsk *disk; t_node *n; phydbl lon, lat; t_label *lab; lab = NULL; lon = lat = -1.; for (int i = 0; i < tree->n_otu; ++i) { lab = Get_Next_Label(tree->a_nodes[i]->label); if (tree->a_nodes[i]->label == NULL) tree->a_nodes[i]->label = lab; /* if(tree->a_nodes[i]->label == NULL) */ /* { */ /* tree->a_nodes[i]->label = Make_Label(); */ /* lab = tree->a_nodes[i]->label; */ /* } */ /* else */ /* { */ /* lab = tree->a_nodes[i]->label; */ /* while(lab->next != NULL) lab = lab->next; */ /* lab->next = Make_Label(); */ /* lab = lab->next; */ /* } */ lat = tree->a_nodes[i]->ldsk->coord->lonlat[1]; lon = tree->a_nodes[i]->ldsk->coord->lonlat[0]; sprintf(lab->key, "location"); sprintf(lab->val, "{%f,%f}", lat, lon); } disk = tree->young_disk->prev; do { if (disk->ldsk && disk->ldsk->nd != NULL) { n = disk->ldsk->nd; lab = Get_Next_Label(n->label); if (n->label == NULL) n->label = lab; /* if(n->label == NULL) */ /* { */ /* n->label = Make_Label(); */ /* lab = n->label; */ /* } */ /* else */ /* { */ /* lab = n->label; */ /* while(lab->next != NULL) lab = lab->next; */ /* lab->next = Make_Label(); */ /* lab = lab->next; */ /* } */ lat = disk->ldsk->coord->lonlat[1]; lon = disk->ldsk->coord->lonlat[0]; sprintf(lab->key, "location"); sprintf(lab->val, "{%f,%f}", lat, lon); /* Print same label on all internal nodes with exactly the */ /* same coalescence time. */ for (int i = tree->n_otu; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_nodes[i] != n && Are_Equal(tree->times->nd_t[i], tree->times->nd_t[n->num], 1.E-10) == YES) { n = tree->a_nodes[i]; lab = Get_Next_Label(n->label); if (n->label == NULL) n->label = lab; /* if(n->label == NULL) */ /* { */ /* n->label = Make_Label(); */ /* lab = n->label; */ /* } */ /* else */ /* { */ /* lab = n->label; */ /* while(lab->next != NULL) lab = lab->next; */ /* lab->next = Make_Label(); */ /* lab = lab->next; */ /* } */ lat = disk->ldsk->coord->lonlat[1]; lon = disk->ldsk->coord->lonlat[0]; sprintf(lab->key, "location"); sprintf(lab->val, "{%f,%f}", lat, lon); } } } disk = disk->prev; } while (disk); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Label_Edges(t_tree *tree) { for (int i = 0; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_edges[i]->label == NULL) { tree->a_edges[i]->label = Make_Label(); tree->a_edges[i]->label->next = Make_Label(); } sprintf(tree->a_edges[i]->label->key, "rate"); sprintf(tree->a_edges[i]->label->val, "0.0"); sprintf(tree->a_edges[i]->label->next->key, "location.rate"); sprintf(tree->a_edges[i]->label->next->val, "0.0"); } for (int i = 0; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_nodes[i] != tree->n_root) { sprintf(tree->a_nodes[i]->b[0]->label->val, "%f", tree->rates->br_r[tree->a_nodes[i]->num]); sprintf(tree->a_nodes[i]->b[0]->label->next->val, "%f", tree->mmod->sigsq_scale[tree->a_nodes[i]->num]); } } sprintf(tree->n_root->b[1]->label->val, "%f", tree->rates->br_r[tree->n_root->v[1]->num]); sprintf(tree->n_root->b[1]->label->next->val, "%f", tree->mmod->sigsq_scale[tree->n_root->v[1]->num]); sprintf(tree->n_root->b[2]->label->val, "%f", tree->rates->br_r[tree->n_root->v[2]->num]); sprintf(tree->n_root->b[2]->label->next->val, "%f", tree->mmod->sigsq_scale[tree->n_root->v[2]->num]); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ /* Get relative rate from edge label and copy it to the rate structure */ void Edge_Labels_To_Rates(t_tree *tree) { t_label *lab; int i; assert(tree->rates); for (i = 0; i < 2 * tree->n_otu - 1; ++i) { if (tree->a_nodes[i] != tree->n_root) { if (tree->a_nodes[i] == tree->n_root->v[1]) lab = tree->n_root->b[1]->label; else if (tree->a_nodes[i] == tree->n_root->v[2]) lab = tree->n_root->b[2]->label; else lab = tree->a_nodes[i]->b[0]->label; while (lab && strcmp(lab->key, "&rate")) lab = lab->next; assert(lab); tree->rates->br_r[tree->a_nodes[i]->num] = lab ? atof(lab->val) : -1.; } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Node_Labels_To_Velocities(t_tree *tree) { t_label *lab; int i; assert(tree->rates); for (i = 0; i < 2 * tree->n_otu - 1; ++i) { lab = tree->a_nodes[i]->label; while (lab && strcmp(lab->key, "velocity")) lab = lab->next; assert(lab); sscanf(lab->val, "{%lf,%lf}", tree->a_nodes[i]->ldsk->veloc->deriv + 1, tree->a_nodes[i]->ldsk->veloc->deriv); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Node_Labels_To_Locations(t_tree *tree) { t_label *lab; int i; assert(tree->rates); for (i = 0; i < 2 * tree->n_otu - 1; ++i) { lab = tree->a_nodes[i]->label; while (lab && strcmp(lab->key, "&location")) lab = lab->next; assert(lab); sscanf(lab->val, "{%lf,%lf}", tree->a_nodes[i]->ldsk->coord->lonlat + 1, tree->a_nodes[i]->ldsk->coord->lonlat); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Exchange_Nodes(t_node *a, t_node *d, t_node *w, t_node *v, t_tree *tree) { short int i, dw, dv, root_side; t_edge *ba, *bd; void *dum; root_side = -1; /* a is root node */ if (a == tree->n_root) { if (w == a->v[1]) root_side = 1; else if (w == a->v[2]) root_side = 2; else assert(false); } for (i = 0; i < 3; ++i) if (a->v[i] == w) { dw = i; break; } assert(i != 3); for (i = 0; i < 3; ++i) if (d->v[i] == v) { dv = i; break; } assert(i != 3); ba = a->b[dw]; bd = d->b[dv]; /* Connect nodes */ dum = w->v[0]; w->v[0] = v->v[0]; v->v[0] = dum; w->anc = d; v->anc = a; a->v[dw] = v; d->v[dv] = w; /* Connect edges */ if (ba->left == w) ba->left = v; else ba->rght = v; if (bd->left == v) bd->left = w; else bd->rght = w; w->b[0] = bd; v->b[0] = ba; if (w->tax == YES) { bd->rght = w; bd->left = d; } if (v->tax == YES) { ba->rght = v; ba->left = a; } Set_Edge_Dirs(ba, ba->left, ba->rght, tree); Set_Edge_Dirs(bd, bd->left, bd->rght, tree); /* a is root node */ if (a == tree->n_root) { a->v[root_side] = v; v->b[0] = tree->e_root; v->v[0] = a->v[root_side == 1 ? 2 : 1]; if (tree->e_root->left == w) { tree->e_root->left = v; assert(tree->e_root->rght->v[tree->e_root->r_l] == w); tree->e_root->rght->v[tree->e_root->r_l] = v; } else if (tree->e_root->rght == w) { tree->e_root->rght = v; assert(tree->e_root->left->v[tree->e_root->l_r] == w); tree->e_root->left->v[tree->e_root->l_r] = v; } else assert(false); if (tree->e_root->left->tax == YES) { dum = tree->e_root->left; tree->e_root->left = tree->e_root->rght; tree->e_root->rght = dum; } Set_Edge_Dirs(tree->e_root, tree->e_root->left, tree->e_root->rght, tree); } if (tree->is_mixt_tree == NO) { if (a != tree->n_root) Swap_Partial_Lk(ba, bd, ba->left == v ? LEFT : RGHT, bd->left == w ? LEFT : RGHT, tree); else if (v == tree->e_root->left) Swap_Partial_Lk(tree->e_root, bd, LEFT, bd->left == w ? LEFT : RGHT, tree); else if (v == tree->e_root->rght) Swap_Partial_Lk(tree->e_root, bd, RGHT, bd->left == w ? LEFT : RGHT, tree); } if (tree->is_mixt_tree == YES) MIXT_Exchange_Nodes(a, d, w, v, tree); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Convert_Lengths_From_Calendar_To_Substitutions(t_tree *tree) { Convert_Lengths_From_Calendar_To_Substitutions_Post(tree->n_root, tree->n_root->v[1], tree); Convert_Lengths_From_Calendar_To_Substitutions_Post(tree->n_root, tree->n_root->v[2], tree); MIXT_Multiply_Scalar_Dbl(tree->n_root->b[1]->l, tree->rates->clock_r * tree->rates->br_r[tree->n_root->v[1]->num]); MIXT_Multiply_Scalar_Dbl(tree->n_root->b[2]->l, tree->rates->clock_r * tree->rates->br_r[tree->n_root->v[2]->num]); MIXT_Set_Scalar_Dbl(tree->e_root->l, tree->n_root->b[1]->l->v + tree->n_root->b[2]->l->v); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Convert_Lengths_From_Calendar_To_Substitutions_Post(t_node *a, t_node *d, t_tree *tree) { int i; assert(tree->rates != NULL); for (i = 0; i < 3; ++i) { if (d->v[i] == a && a != tree->n_root) { MIXT_Multiply_Scalar_Dbl(d->b[i]->l, tree->rates->clock_r * tree->rates->br_r[d->num]); break; } } assert(!(i == 3 && a != tree->n_root)); if (d->tax == YES) return; else { for (i = 0; i < 3; ++i) { if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { Convert_Lengths_From_Calendar_To_Substitutions_Post(d, d->v[i], tree); } } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ t_label *Get_Next_Label(t_label *curr_lab) { t_label *next_lab; next_lab = Make_Label(); if (curr_lab == NULL) { next_lab->prev = NULL; next_lab->next = NULL; } else { while (curr_lab->next != NULL) curr_lab = curr_lab->next; next_lab->prev = curr_lab; curr_lab->next = next_lab; } return (next_lab); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int Contmod_Start(short int datatype, short int dim_idx, t_tree *tree) { int n_nodes; n_nodes = 2 * tree->n_otu - 1; switch (datatype) { case LOCATION: { return (dim_idx * n_nodes); break; } case VELOCITY: { return (tree->mmod->n_dim * n_nodes + dim_idx * n_nodes); break; } default: { assert(false); break; } } return (-1); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int Number_Of_Free_Params(t_tree *mixt_tree) { t_tree *tree; scalar_dbl *scal_dum; vect_dbl *vect_dum; int n_params; n_params = 0; tree = mixt_tree; do // Below should be correct as long as each partition element has a single vector of edge lengths { if (tree->mod->s_opt->opt_bl_one_by_one == YES) { if (tree->n_root != NULL) { if (tree->ignore_root == NO) for (int i = 0; i < 2 * tree->n_otu - 1; ++i) if (tree->a_edges[i] != tree->e_root && tree->a_edges[i]->l->optimize == YES) n_params += 1; if (tree->ignore_root == YES) for (int i = 0; i < 2 * tree->n_otu - 1; ++i) if (tree->n_root->b[1] != tree->a_edges[i] && tree->n_root->b[2] != tree->a_edges[i] && tree->a_edges[i]->l->optimize == YES) n_params += 1; } else for (int i = 0; i < 2 * tree->n_otu - 3; ++i) if (tree->a_edges[i]->l->optimize == YES) n_params += 1; } tree = tree->next_mixt; } while (tree); scal_dum = mixt_tree->is_mixt_tree == YES ? mixt_tree->next->mod->kappa : mixt_tree->mod->kappa; do { if (scal_dum->optimize == YES) n_params += 1; scal_dum = scal_dum->next; } while (scal_dum); scal_dum = mixt_tree->is_mixt_tree == YES ? mixt_tree->next->mod->lambda : mixt_tree->mod->lambda; do { if (scal_dum->optimize == YES) n_params += 1; scal_dum = scal_dum->next; } while (scal_dum); scal_dum = mixt_tree->mod->ras->alpha; do { if (scal_dum->optimize == YES) n_params += 1; scal_dum = scal_dum->next; } while (scal_dum); vect_dum = mixt_tree->is_mixt_tree == YES ? mixt_tree->next->mod->e_frq->pi : mixt_tree->mod->e_frq->pi; do { if (vect_dum->optimize == YES) n_params += vect_dum->len - 1; vect_dum = vect_dum->next; } while (vect_dum); t_rmat *r_mat = mixt_tree->is_mixt_tree == YES ? mixt_tree->next->mod->r_mat : mixt_tree->mod->r_mat; do { if (r_mat->optimize == YES) n_params += r_mat->n_diff_rr; r_mat = r_mat->next; } while (r_mat); t_mod *mod = mixt_tree->mod; do { if (mod->s_opt->opt_br_len_mult == YES) n_params += 1; mod = mod->next; } while (mod); mod = mixt_tree->mod; do { if ((mod->s_opt->opt_free_mixt_rates) && (mod->ras->free_mixt_rates == YES)) n_params += 2 * mod->ras->n_catg - 2; mod = mod->next; } while (mod); return (n_params); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl AIC(t_tree * tree) { tree->mod->aic->v = 2. * Number_Of_Free_Params(tree) - 2. * Get_Lk(tree); return (tree->mod->aic->v); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phydbl BIC(t_tree * tree) { tree->mod->bic->v = Number_Of_Free_Params(tree) * log(tree->data->init_len) - 2. * Get_Lk(tree); return (tree->mod->bic->v); }stephaneguindon-phyml-76a39c8/src/utilities.h000066400000000000000000003060121501136442400213570ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef UTILITIES_H #define UTILITIES_H // #define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #include */ /* #include */ #if (defined(__AVX__) || defined(__AVX2__)) #include #include #include #elif defined(__ARM_NEON) #include "sse2neon.h" #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) #include #include #endif extern int n_sec1; extern int n_sec2; #define TREE_COMP_RF_PLUS_LENGTH 0 #define TREE_COMP_RF_PLAIN 1 #define TREE_COMP_LENGTH_SHARED_EDGES 2 #define TREE_COMP_LENGTH_EXTERNAL_EDGES 3 #define HAVERSINE 0 #define MANHATTAN 1 #define EUCLIDEAN 2 #define __FUNCTION__ NULL #define EMPIRICAL 0 #define ML 1 #define USER 2 #define MODEL 3 #define For(i, n) for (i = 0; i < n; i++) #define Fors(i, n, s) for (i = 0; i < n; i += s) #define PointGamma(prob, alpha, beta) \ PointChi2(prob, 2.0 * (alpha)) / (2.0 * (beta)) #define SHFT2(a, b, c) \ (a) = (b); \ (b) = (c); #define SHFT3(a, b, c, d) \ (a) = (b); \ (b) = (c); \ (c) = (d); #define SIGN(a, b) ((b) > 0.0 ? fabs(a) : -fabs(a)) #define SHFT(a, b, c, d) \ (a) = (b); \ (b) = (c); \ (c) = (d); #ifndef MAX #define MAX(a, b) ((a) > (b) ? (a) : (b)) #endif #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif #define READ 0 #define WRITE 1 #define APPEND 2 #define READWRITE 3 #ifndef isnan #define isnan(x) \ (sizeof(x) == sizeof(long double) ? isnan_ld(x) \ : sizeof(x) == sizeof(double) ? isnan_d(x) \ : isnan_f(x)) static inline int isnan_f(float x) { return x != x; } static inline int isnan_d(double x) { return x != x; } static inline int isnan_ld(long double x) { return x != x; } #endif #ifndef isinf #define isinf(x) \ (sizeof(x) == sizeof(long double) ? isinf_ld(x) \ : sizeof(x) == sizeof(double) ? isinf_d(x) \ : isinf_f(x)) static inline int isinf_f(float x) { return isnan(x - x); } static inline int isinf_d(double x) { return isnan(x - x); } static inline int isinf_ld(long double x) { return isnan(x - x); } #endif #define LOG12 2.4849066497880003546 #define LOG4 1.3862943611198905725 #define LOG3 1.0986122886681097821 #define BIRTHDEATH 0 #define COALESCENT 1 #define STRICTCOALESCENT 0 #define EXPCOALESCENT 1 #define POWLAW 2 #define SLFV_GAUSSIAN 2 /* Spatial Lambda-Fleming-Viot model (Gaussian) */ #define SLFV_UNIFORM 3 /* Spatial Lambda-Fleming-Viot model (Uniform) */ #define RW 4 /* standard Brownian diffusion model in phylogeography */ #define RRW_GAMMA \ 5 /* Lemey's relaxed random walk (Gamma distributed relative diffusion \ rates) */ #define RRW_LOGNORMAL \ 6 /* Lemey's relaxed random walk (Lognormal distributed relative diffusion \ rates) */ #define IBM 7 /* Integrated Brownian Motion */ #define RIBM 8 /* Relaxed Integrated Brownian Motion */ #define IWNc 9 /* Integrated white noise */ #define RIWNc 10 /* Relaxed integrated white noise */ #define IWNu 11 /* Integrated white noise uncorrelated */ #define RIWNu 12 /* Relaxed integrated white noise uncorrelated */ #define IOU 13 /* Integrated Ornstein-Uhlenbeck */ #define AC 0 #define AG 1 #define AT 2 #define CG 3 #define CT 4 #define GT 5 #if (defined __AVX__ || defined __AVX2__) #define BYTE_ALIGN 32 #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__) || \ defined(__ARM_NEON)) #define BYTE_ALIGN 16 #else #define BYTE_ALIGN 1 #endif #ifndef M_1_SQRT_2PI #define M_1_SQRT_2PI 0.398942280401432677939946059934 /* 1/sqrt(2*pi) */ #endif #ifndef LOG_SQRT_2PI #define LOG_SQRT_2PI 0.91893853320467266954 /* log(sqrt(2*pi)) */ #endif // verbose levels #define VL0 0 #define VL1 1 #define VL2 2 #define VL3 3 #define VL4 4 #define T_MAX_MCMC_MOVE_NAME 500 #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 800 #define ALPHA_MIN 0.01 #define ALPHA_MAX 1000. #define E_FRQ_WEIGHT_MIN 0.01 #define E_FRQ_WEIGHT_MAX 100. #define R_MAT_WEIGHT_MIN 0.01 #define R_MAT_WEIGHT_MAX 100. #define E_FRQ_MIN 0.001 #define E_FRQ_MAX 0.999 #define UNSCALED_E_FRQ_MIN -100. #define UNSCALED_E_FRQ_MAX +100. #define TSTV_MIN 0.05 #define TSTV_MAX 100.0 #define PINV_MIN 0.00001 #define PINV_MAX 0.99999 #define RR_MIN 0.0001 #define RR_MAX 10000.0 #define UNSCALED_RR_MIN log(RR_MIN) #define UNSCALED_RR_MAX log(RR_MAX) #define LOCATION 0 #define VELOCITY 1 #ifdef PHYML #define GAMMA_RR_UNSCALED_MIN -1000. #define GAMMA_RR_UNSCALED_MAX 1000. /* #define GAMMA_RR_UNSCALED_MIN 0.01 */ /* #define GAMMA_RR_UNSCALED_MAX 100. */ #else #define GAMMA_RR_UNSCALED_MIN 0.01 #define GAMMA_RR_UNSCALED_MAX 200. #endif #ifdef PHYML #define GAMMA_R_PROBA_UNSCALED_MIN -5. #define GAMMA_R_PROBA_UNSCALED_MAX 5. #else #define GAMMA_R_PROBA_UNSCALED_MIN 0.01 #define GAMMA_R_PROBA_UNSCALED_MAX 200. #endif #define PHYREX_UNIFORM 0 #define PHYREX_NORMAL 1 #define MCMC_MOVE_RANDWALK_UNIFORM 0 #define MCMC_MOVE_LOG_RANDWALK_UNIFORM 1 #define MCMC_MOVE_RANDWALK_NORMAL 2 #define MCMC_MOVE_LOG_RANDWALK_NORMAL 3 #define MCMC_MOVE_SCALE_THORNE 4 #define MCMC_MOVE_SCALE_GAMMA 5 #define N_MAX_MOVES 50 #define N_MAX_NEX_COM 20 #define T_MAX_NEX_COM 100 #define N_MAX_NEX_PARM 50 #define T_MAX_TOKEN 200 #define T_MAX_ID_COORD 10 #define T_MAX_ID_DISK 10 #define T_MAX_KEY 200 #define T_MAX_VAL 1000 #define N_MAX_MIXT_CLASSES 1000 #define NEXUS_COM 0 #define NEXUS_PARM 1 #define NEXUS_EQUAL 2 #define NEXUS_VALUE 3 #define NEXUS_SPACE 4 #define NNI_MOVE 0 #define SPR_MOVE 1 #define BEST_OF_NNI_AND_SPR 2 #define M_1_SQRT_2_PI 0.398942280401432677939946059934 #define M_SQRT_32 5.656854249492380195206754896838 #define PI 3.14159265358979311600 #define SQRT2PI 2.50662827463100024161 #define LOG2PI 1.83787706640934533908 #define LOG2 0.69314718055994528623 #define LOG_SQRT_2_PI 0.918938533204672741780329736406 #define NORMAL 1 #define EXACT 2 #define PHYLIP 0 #define NEXUS 1 #define IBDSIM 2 #ifndef YES #define YES 1 #endif #ifndef NO #define NO 0 #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #define SPATIAL_SAMPLING_DETECTION 0 #define SPATIAL_SAMPLING_SURVEY 1 #define ON 1 #define OFF 0 #define SMALL_DBL 1.E-20 #define NT 0 /*! nucleotides */ #define AA 1 /*! amino acids */ #define GENERIC 2 /*! custom alphabet */ #define UNDEFINED -1 #define ACGT 0 /*! A,G,G,T encoding */ #define RY 1 /*! R,Y encoding */ #define INTERFACE_DATA_TYPE 0 #define INTERFACE_MULTIGENE 1 #define INTERFACE_MODEL 2 #define INTERFACE_TOPO_SEARCH 3 #define INTERFACE_BRANCH_SUPPORT 4 #define LEFT 0 #define RGHT 1 #ifndef INFINITY #define INFINITY HUGE #endif #define MAX_N_CAL 100 #define N_MAX_OPTIONS 100 #define NEXT_BLOCK_SIZE 50 #define T_MAX_FILE 200 #define T_MAX_LINE 2000000 #define T_MAX_NAME 1000 #define T_MAX_ID 20 #define T_MAX_SEQ 2000000 #define T_MAX_OPTION 100 #define T_MAX_STATE 5 #define S_TREE_CHUNK 10000 #define NODE_DEG_MAX 2000 #define BRENT_IT_MAX 1000 #define BRENT_CGOLD 0.3819660 #define BRENT_ZEPS 1.e-10 #define MNBRAK_GOLD 1.618034 #define MNBRAK_GLIMIT 100.0 #define MNBRAK_TINY 1.e-20 #define BL_START 1.e-04 #define GOLDEN_R 0.61803399 #define GOLDEN_C (1.0 - GOLDEN_R) #define N_MAX_INSERT 20 #define N_MAX_OTU 4000 #define UNLIKELY -1.e20 #define NJ_SEUIL 0.1 #define ROUND_MAX 100 #define DIST_MAX 2.00 #define DIST_MIN 1.e-10 #define AROUND_LK 50.0 #define PROP_STEP 1.0 #define T_MAX_ALPHABET 22 #define MDBL_MIN FLT_MIN #define MDBL_MAX FLT_MAX #define POWELL_ITMAX 200 #define LINMIN_TOL 2.0E-04 #define SCALE_POW \ 10 /*! Scaling factor will be 2^SCALE_POW or 2^(-SCALE_POW) [[ WARNING: \ SCALE_POW < 31 ]]*/ #define DEFAULT_SIZE_SPR_LIST 20 #define NEWICK 0 #define OUTPUT_TREE_FORMAT NEWICK #define MAX_PARS 1000000000 #define LIM_SCALE_VAL 1.E-50 /*! Scaling limit (deprecated) */ #define MIN_CLOCK_RATE 1.E-10 #define MIN_VAR_BL 1.E-8 #define MAX_VAR_BL 1.E+3 #define KFOLD_POS 0 #define KFOLD_COL 1 #define MAXFOLD 2 #define MASK_TYPE_POSITION \ 0 // Individual positions (i.e., site x taxon) are masked #define MASK_TYPE_COLUMN 1 // Columns (i.e., site x .) are masked #define JC69 1 #define K80 2 #define F81 3 #define HKY85 4 #define F84 5 #define TN93 6 #define GTR 7 #define CUSTOM 8 #define WAG 11 #define DAYHOFF 12 #define JTT 13 #define BLOSUM62 14 #define MTREV 15 #define RTREV 16 #define CPREV 17 #define DCMUT 18 #define VT 19 #define MTMAM 20 #define MTART 21 #define HIVW 22 #define HIVB 23 #define FLU 24 #define CUSTOMAA 25 #define LG 26 #define AB 27 // Amino acid ordering: // Ala Arg Asn Asp Cys Gln Glu Gly His Ile Leu Lys Met Phe Pro Ser Thr Trp Tyr // Val #define OTHER 30 #define EXPONENTIAL_PRIOR 0 #define NORMAL_PRIOR 1 #define FLAT_PRIOR 2 #define COMPOUND_COR 0 #define COMPOUND_NOCOR 1 #define EXPONENTIAL 2 #define LOGNORMAL 3 #define THORNE 4 #define GUINDON 5 #define STRICTCLOCK 6 #define GAMMA 7 #define NONE -1 #define ALRTSTAT 1 #define ALRTCHI2 2 #define MINALRTCHI2SH 3 #define SH 4 #define ABAYES 5 #define CALENDAR 0 #define SUBSTITUTIONS 1 /* /\* Uncomment the lines below to switch to single precision *\/ */ /* typedef float phydbl; */ /* #define LOG logf */ /* #define POW powf */ /* #define EXP expf */ /* #define FABS fabsf */ /* #define SQRT sqrtf */ /* #define CEIL ceilf */ /* #define FLOOR floorf */ /* #define RINT rintf */ /* #define ROUND roundf */ /* #define TRUNC truncf */ /* #define COS cosf */ /* #define SIN sinf */ /* #define TAN tanf */ /* #define SMALL FLT_MIN */ /* #define BIG FLT_MAX */ /* #define SMALL_PIJ 1.E-10 */ /* #define BL_MIN 1.E-5 */ /* #define P_LK_LIM_INF 2.168404e-19 /\* 2^-62 *\/ */ /* #define P_LK_LIM_SUP 4.611686e+18 /\* 2^62 *\/ */ /* Uncomment the line below to switch to double precision */ typedef double phydbl; #define LOG log #define POW pow #define EXP exp #define FABS fabs #define SQRT sqrt #define CEIL ceil #define FLOOR floor #define RINT rint #define ROUND round #define TRUNC trunc #define COS cos #define SIN sin #define TAN tan #define SMALL DBL_MIN #define BIG DBL_MAX #define SMALL_PIJ 1.E-100 #define LOGBIG 690. #define LOGSMALL -690. #if !(defined PHYTIME) #define BL_MIN 1.E-8 #define BL_MAX 100. #else #define BL_MIN 1.E-6 #define BL_MAX 1. #endif // Do *not* change the values below and leave the lines with // curr_scaler_pow = (int)(-XXX.-LOG(smallest_p_lk))/LOG2; // as XXX depends on what the value of P_LK_LIM_INF is #define P_LK_LIM_INF 3.054936e-151 /* 2^-500 */ #define P_LK_LIM_SUP 3.273391e+150 /* 2^500 */ /* #define P_LK_LIM_INF 1.499697e-241 /\* 2^-800 *\/ */ /* #define P_LK_LIM_SUP 6.668014e+240 /\* 2^800 *\/ */ /* #define LARGE 100 */ /* #define TWO_TO_THE_LARGE 1267650600228229401496703205376.0 /\* 2^100 In R : * sprintf("%.100f", 2^100)*\/ */ /* #define LARGE 200 */ /* #define TWO_TO_THE_LARGE * 1606938044258990275541962092341162602522202993782792835301376.0 /\* 2^200 In * R : sprintf("%.100f", 2^256)*\/ */ #define LARGE 256 #define TWO_TO_THE_LARGE \ 115792089237316195423570985008687907853269984665640564039457584007913129639936.0 /* 2^256 In R : sprintf("%.100f", 2^256)*/ /* #define LARGE 128 */ /* #define TWO_TO_THE_LARGE 340282366920938463463374607431768211456.0 /\* 2^128 * In R : sprintf("%.100f", 2^128)*\/ */ /* #define LARGE 320 */ /* #define TWO_TO_THE_LARGE * 2135987035920910082395021706169552114602704522356652769947041607822219725780640550022962086936576.0 */ #define INV_TWO_TO_THE_LARGE (1. / TWO_TO_THE_LARGE) #define SCALE_RATE_SPECIFIC 1 #define SCALE_FAST 2 #define SCALENO 0 #define SCALEYES 1 #define T_MAX_XML_TAG 64 #define NARGS_SEQ(_1, _2, _3, _4, _5, _6, _7, _8, N, ...) N #define NARGS(...) NARGS_SEQ(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1) #define PRIMITIVE_CAT(x, y) x##y #define CAT(x, y) PRIMITIVE_CAT(x, y) #define FOR_EACH(macro, ...) \ CAT(FOR_EACH_, NARGS(__VA_ARGS__))(macro, __VA_ARGS__) #define FOR_EACH_1(m, x1) m(x1) #define FOR_EACH_2(m, x1, x2) m(x1) m(x2) #define FOR_EACH_3(m, x1, x2, x3) m(x1) m(x2) m(x3) #define FOR_EACH_4(m, x1, x2, x3, x4) m(x1) m(x2) m(x3) m(x4) #define FOR_EACH_5(m, x1, x2, x3, x4, x5) m(x1) m(x2) m(x3) m(x4) m(x5) #define FOR_EACH_6(m, x1, x2, x3, x4, x5, x6) \ m(x1) m(x2) m(x3) m(x4) m(x5) m(x6) #define FOR_EACH_7(m, x1, x2, x3, x4, x5, x6, x7) \ m(x1) m(x2) m(x3) m(x4) m(x5) m(x6) m(x7) #define FOR_EACH_8(m, x1, x2, x3, x4, x5, x6, x7, x8) \ m(x1) m(x2) m(x3) m(x4) m(x5) m(x6) m(x7) m(x8) #define DUMP_EACH_INT(v) \ fprintf(stderr, "\n\t\tDEBUG:%s:\t\t%s--->%i", __PRETTY_FUNCTION__, #v, \ (v)); \ fflush(stderr); #define DUMP_EACH_STRING(v) \ fprintf(stderr, "\n\t\tDEBUG:%s:\t\t%s--->%s", __PRETTY_FUNCTION__, #v, \ (v)); \ fflush(stderr); #define DUMP_EACH_DECIMAL(v) \ fprintf(stderr, "\n\t\tDEBUG:%s:\t\t%s--->%f", __PRETTY_FUNCTION__, #v, \ (v)); \ fflush(stderr); #define DUMP_EACH_SCI(v) \ fprintf(stderr, "\n\t\tDEBUG:%s:\t\t%s--->%e", __PRETTY_FUNCTION__, #v, \ (v)); \ fflush(stderr); #define DUMP_I(...) FOR_EACH(DUMP_EACH_INT, __VA_ARGS__) #define DUMP_S(...) FOR_EACH(DUMP_EACH_STRING, __VA_ARGS__) #define DUMP_D(...) FOR_EACH(DUMP_EACH_DECIMAL, __VA_ARGS__) #define DUMP_E(...) FOR_EACH(DUMP_EACH_SCI, __VA_ARGS__) /*!********************************************************/ // Generic linked list typedef struct __Generic_LL { void *v; struct __Generic_LL *next; struct __Generic_LL *prev; struct __Generic_LL *tail; struct __Generic_LL *head; } t_ll; /*!********************************************************/ typedef struct __Scalar_Int { int v; bool optimize; struct __Scalar_Int *next; struct __Scalar_Int *prev; } scalar_int; /*!********************************************************/ typedef struct __Scalar_Dbl { phydbl v; bool onoff; bool optimize; bool print; struct __Scalar_Dbl *next; struct __Scalar_Dbl *prev; } scalar_dbl; /*!********************************************************/ typedef struct __Vect_Int { int *v; int len; bool optimize; struct __Vect_Int *next; struct __Vect_Int *prev; } vect_int; /*!********************************************************/ typedef struct __Vect_Dbl { phydbl *v; int len; bool optimize; struct __Vect_Dbl *next; struct __Vect_Dbl *prev; } vect_dbl; /*!********************************************************/ typedef struct __String { char *s; int len; struct __String *next; struct __String *prev; } t_string; /*!********************************************************/ typedef struct __Node { struct __Node **v; /*! table of pointers to neighbor nodes. Dimension = 3 */ struct __Node ***bip_node; /*! three lists of pointer to tip nodes. One list for each direction */ struct __Edge **b; /*! table of pointers to neighbor branches */ struct __Node *anc; /*! direct ancestor t_node (for rooted tree only) */ struct __Edge *b_anc; /*! edge between this node and its direct ancestor (for rooted tree only) */ struct __Node *ext_node; struct __Node *match_node; struct __Align *c_seq; /*! corresponding compressed sequence */ struct __Align *c_seq_anc; /*! corresponding compressed ancestral sequence */ struct __Node *next; /*! tree->a_nodes[i]->next <=> tree->next->a_nodes[i] */ struct __Node *prev; /*! See above */ struct __Node *next_mixt; /*! Next mixture tree*/ struct __Node *prev_mixt; /*! Parent mixture tree */ struct __Calibration * *cal; /*! List of calibration constraints attached to this node */ struct __Lindisk_Node *ldsk; /*! Used in PhyREX. Lineage/Disk this node corresponds to */ struct __Node *rk_next; /*! Next node in the list of ranked nodes (from oldest to youngest) */ struct __Node *rk_prev; /*! Previous node in the list of ranked nodes (from oldest to youngest) */ struct __Label *label; int *bip_size; /*! Size of each of the three lists from bip_node */ int num; /*! t_node number */ int tax; /*! tax = 1 -> external node, else -> internal t_node */ char *name; /*! taxon name (if exists) */ char *ori_name; /*! taxon name (if exists) */ int n_cal; /*! Number of calibration constraints */ phydbl *score; /*! score used in BioNJ to determine the best pair of nodes to agglomerate */ phydbl dist_to_root; /*! distance to the root t_node */ short int common; phydbl y_rank; phydbl y_rank_ori; phydbl y_rank_min; phydbl y_rank_max; int *s_ingrp; /*! does the subtree beneath belong to the ingroup */ int *s_outgrp; /*! does the subtree beneath belong to the outgroup */ int id_rank; /*! order taxa alphabetically and use id_rank to store the ranks */ int rank; int rank_max; struct __Geo_Coord *coord; struct __Geo_Veloc *veloc; } t_node; /*!********************************************************/ typedef struct __Edge { /*! syntax : (node) [edge] (left_1) . .(right_1) \ (left) (right) / \._____________./ / [b_fcus] \ / \ (left_2) . .(right_2) */ struct __Node *left, *rght; /*! t_node on the left/right side of the t_edge */ short int l_r, r_l, l_v1, l_v2, r_v1, r_v2; /*! these are directions (i.e., 0, 1 or 2): */ /*! l_r (left to right) -> left[b_fcus->l_r] = right */ /*! r_l (right to left) -> right[b_fcus->r_l] = left */ /*! l_v1 (left t_node to first t_node != from right) -> left[b_fcus->l_v1] = * left_1 */ /*! l_v2 (left t_node to secnd t_node != from right) -> left[b_fcus->l_v2] = * left_2 */ /*! r_v1 (right t_node to first t_node != from left) -> right[b_fcus->r_v1] = * right_1 */ /*! r_v2 (right t_node to secnd t_node != from left) -> right[b_fcus->r_v2] = * right_2 */ struct __NNI *nni; struct __Edge *next; struct __Edge *prev; struct __Edge *next_mixt; struct __Edge *prev_mixt; struct __Label *label; int num; /*! branch number */ scalar_dbl *l; /*! branch length */ scalar_dbl *best_l; /*! best branch length found so far */ scalar_dbl *l_old; /*! old branch length */ scalar_dbl *l_var; /*! variance of edge length */ scalar_dbl *l_var_old; /*! variance of edge length (previous value) */ int bip_score; /*! score of the bipartition generated by the corresponding edge bip_score = 1 iif the branch is found in both trees to be compared, bip_score = 0 otherwise. */ phydbl tdist_score; /*! average transfer distance over bootstrap trees */ int num_st_left; /*! number of the subtree on the left side */ int num_st_rght; /*! number of the subtree on the right side */ phydbl *Pij_rr; /*! matrix of change probabilities and its first and secnd derivates (rate*state*state) */ phydbl *tPij_rr; /*! transpose matrix of change probabilities and its first and secnd derivates (rate*state*state) */ #ifdef BEAGLE int Pij_rr_idx; #endif short int *div_post_pred_left; /*! posterior prediction of nucleotide/aa diversity (left-hand subtree) */ short int *div_post_pred_rght; /*! posterior prediction of nucleotide/aa diversity (rght-hand subtree) */ short int does_exist; phydbl *p_lk_left, *p_lk_rght; /*! likelihoods of the subtree on the left and right side (for each site and each relative rate category) */ phydbl *p_lk_tip_r, *p_lk_tip_l; #ifdef BEAGLE int p_lk_left_idx, p_lk_rght_idx; int p_lk_tip_idx; #endif int *patt_id_left; int *patt_id_rght; int *p_lk_loc_left; int *p_lk_loc_rght; int *pars_l, *pars_r; /*! parsimony of the subtree on the left and right sides (for each site) */ int *ui_l, *ui_r; /*! union - intersection vectors used in Fitch's parsimony algorithm */ int *p_pars_l, *p_pars_r; /*! conditional parsimony vectors */ /*! Below are the likelihood scaling factors (used in functions `Get_All_Partial_Lk_Scale' in lk.c. */ /* For every site, every subtree and every rate class, PhyML maintains a`sum_scale_pow' value where sum_scale_pow = sum_scale_pow_v1 + sum_scale_pow_v2 + curr_scale_pow' sum_scale_pow_v1 and sum_scale_pow_v2 are sum_scale_pow of the left and right subtrees. curr_scale_pow is an integer greater than one. The smaller the partials, the larger curr_scale_pow. Now the partials for this subtree are scaled by *multiplying* each of them by 2^curr_scale_pow. The reason for doing the scaling this way is that multiplications by 2^x (x an integer) can be done in an 'exact' manner (i.e., there is no loss of numerical precision) At the root edge, the log-likelihood is then logL = logL' - (sum_scale_pow_left + sum_scale_pow_right)log(2), where L' is the scaled likelihood. */ int *sum_scale_left_cat; int *sum_scale_rght_cat; int *sum_scale_left; int *sum_scale_rght; phydbl bootval; /*! bootstrap value (if exists) */ short int is_alive; /*! is_alive = 1 if this t_edge is used in a tree */ phydbl dist_btw_edges; int topo_dist_btw_edges; int has_zero_br_len; phydbl ratio_test; /*! approximate likelihood ratio test */ phydbl alrt_statistic; /*! aLRT statistic */ phydbl support_val; int n_jumps; /*! number of jumps of substitution rates */ int *n_diff_states_l; /*! Number of different states found in the subtree on the left of this edge */ int *n_diff_states_r; /*! Number of different states found in the subtree on the right of this edge */ phydbl bin_cod_num; short int update_partial_lk_left; short int update_partial_lk_rght; } t_edge; /*!********************************************************/ typedef struct __Tree { struct __Node *n_root; /*! root t_node */ struct __Edge *e_root; /*! t_edge on which lies the root */ struct __Node **a_nodes; /*! array of nodes that defines the tree topology */ struct __Edge **a_edges; /*! array of edges */ struct __Model *mod; /*! substitution model */ struct __Calign *data; /*! sequences */ struct __Tree *next; /*! set to NULL by default. Used for mixture models */ struct __Tree *prev; /*! set to NULL by default. Used for mixture models */ struct __Tree *next_mixt; /*! set to NULL by default. Used for mixture models */ struct __Tree *prev_mixt; /*! set to NULL by default. Used for mixture models */ struct __Tree *mixt_tree; /*! set to NULL by default. Used for mixture models */ struct __Tree **aux_tree; /*! set to NULL by default. Used as a latent variable in molecular dating */ struct __Option *io; /*! input/output */ struct __Matrix *mat; /*! pairwise distance matrix */ struct __Node **curr_path; /*! list of nodes that form a path in the tree */ struct __SPR **spr_list_one_edge; struct __SPR **spr_list_all_edge; struct __SPR *best_spr; struct __Tdraw *ps_tree; /*! structure for drawing trees in postscript format */ struct __T_Rate *rates; /*! structure for handling rates of evolution */ struct __T_Time *times; /*! structure for handling node ages */ struct __Tmcmc *mcmc; struct __Phylogeo *geo; struct __Migrep_Model *mmod; struct __Disk_Event *young_disk; /*! Youngest disk (i.e., disk which age is the closest to present). Used in PhyREX */ struct __Disk_Event *old_samp_disk; /*! Oldest sampled disk. Used in PhyREX */ struct __XML_node *xml_root; struct __Generic_LL *edge_list; struct __Generic_LL *node_list; struct __Independent_Contrasts *ctrst; /*! Pointer to data structure used for independent contrasts */ struct __Continuous_Model *contmod; #if (defined(__AVX__) || defined(__AVX2__)) __m256d *_tPij1, *_tPij2, *_pmat1plk1, *_pmat2plk2, *_plk0, *_l_ev, *_r_ev, *_prod_left, *_prod_rght; #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__) || \ defined(__ARM_NEON)) __m128d *_tPij1, *_tPij2, *_pmat1plk1, *_pmat2plk2, *_plk0, *_l_ev, *_r_ev, *_prod_left, *_prod_rght; #endif phydbl *p_lk_left_pi, *l_ev; phydbl *big_lk_array; int big_lk_array_pos; short int eval_alnL; /*! Evaluate likelihood for genetic data */ short int eval_rlnL; /*! Evaluate likelihood for rates along the tree */ short int eval_glnL; /*! Evaluate likelihood under phylogeo model */ short int eval_tlnL; /*! Evaluate likelihood under tree-generating process */ short int scaling_method; short int fully_nni_opt; short int numerical_warning; short int use_eigen_lr; int is_mixt_tree; int tree_num; /*! tree number. Used for mixture models */ int ps_page_number; /*! when multiple trees are printed, this variable give the current page number */ int depth_curr_path; /*! depth of the t_node path defined by curr_path */ int has_bip; /*!if has_bip=1, then the structure to compare tree topologies is allocated, has_bip=0 otherwise */ int n_otu; /*! number of taxa */ int curr_site; /*! current site of the alignment to be processed */ int curr_catg; /*! current class of the discrete gamma rate distribution */ int n_swap; /*! number of NNIs performed */ int has_branch_lengths; /*! =1 iff input tree displays branch lengths */ short int both_sides; /*! both_sides=1 -> a pre-order and a post-order tree traversals are required to compute the likelihood of every subtree in the phylogeny*/ int num_curr_branch_available; /*!gives the number of the next cell in a_edges that is free to receive a pointer to a branch */ short int *t_dir; int n_moves; int verbose; int dp; /*! Data partition */ int s_mod_num; /*! Substitution model number */ int lock_topo; /*! = 1 any subsequent topological modification will be banished */ int print_labels; int write_br_lens; int *mutmap; /*! Mutational map */ int json_num; short int update_eigen_lr; int tip_root; /*! Index of tip node used as the root */ phydbl *dot_prod; phydbl *expl; phydbl init_lnL; phydbl best_lnL; /*! highest value of the loglikelihood found so far */ int best_pars; /*! highest value of the parsimony found so far */ phydbl c_lnL; /*! loglikelihood */ phydbl p_lnL; /*! loglikelihood (previous value) */ phydbl old_lnL; /*! old loglikelihood */ phydbl sum_min_sum_scale; /*! common factor of scaling factors */ phydbl *c_lnL_sorted; /*! used to compute c_lnL by adding sorted terms to minimize CPU errors */ phydbl *cur_site_lk; /*! vector of loglikelihoods at individual sites */ phydbl *old_site_lk; /*! vector of likelihoods at individual sites */ phydbl annealing_temp; /*! annealing temperature in simulated annealing optimization algo */ phydbl c_dlnL; /*! First derivative of the log-likelihood with respect to the length of a branch */ phydbl c_d2lnL; /*! Second derivative of the log-likelihood with respect to the length of a branch */ phydbl *unscaled_site_lk_cat; /*! partially scaled site likelihood at individual sites */ phydbl *site_lk_cat; /*! loglikelihood at a single site and for each class of rate*/ phydbl unconstraint_lk; /*! unconstrained (or multinomial) log-likelihood */ phydbl composite_lk; /*! composite log-likelihood */ int *fact_sum_scale; phydbl **log_lks_aLRT; /*! used to compute several branch supports */ phydbl n_root_pos; /*! position of the root on its t_edge */ phydbl size; /*! tree size */ int *site_pars; int c_pars; int *step_mat; int size_spr_list_one_edge; int size_spr_list_all_edge; int perform_spr_right_away; time_t t_beg; time_t t_current; int bl_from_node_stamps; /*! == 1 -> Branch lengths are determined by t_node times */ phydbl sum_y_dist_sq; phydbl sum_y_dist; phydbl tip_order_score; int write_tax_names; int update_alias_subpatt; phydbl geo_mig_sd; /*! standard deviation of the migration step random variable */ phydbl geo_lnL; /*! log likelihood of the phylo-geography model */ int bl_ndigits; phydbl *short_l; /*! Vector of short branch length values */ int n_short_l; /*! Length of short_l */ phydbl norm_scale; short int br_len_recorded; short int apply_lk_scaling; /*! Applying scaling of likelihoods. YES/NO */ phydbl *K; /*! a vector of the norm.constants for the node times prior. */ short int ignore_root; short int ignore_mixt_info; #ifdef BEAGLE int b_inst; /*! The BEAGLE instance id associated with this tree. */ #endif // Extra partial lk structure for bookkeeping short int *div_post_pred_extra_0; int *sum_scale_cat_extra_0; int *sum_scale_extra_0; phydbl *p_lk_extra_0; phydbl *p_lk_tip_extra_0; int *patt_id_extra_0; short int *div_post_pred_extra_1; int *sum_scale_cat_extra_1; int *sum_scale_extra_1; phydbl *p_lk_extra_1; phydbl *p_lk_tip_extra_1; int *patt_id_extra_1; int n_edges_traversed; int n_tot_bl_opt; bool opt_topo; } t_tree; /*!********************************************************/ typedef struct __Super_Tree { struct __Tree *tree; struct __List_Tree * treelist; /*! list of trees. One tree for each data set to be processed */ struct __Calign *curr_cdata; struct __Option **optionlist; /*! list of pointers to input structures (used in supertrees) */ struct __Node ***match_st_node_in_gt; /*! match_st_in_gt_node[subdataset number][supertree t_node number] * gives the t_node in tree estimated from 'subdataset number' that * corresponds to 'supertree t_node number' in the supertree */ struct __Node *****map_st_node_in_gt; /*! mat_st_gt_node[gt_num][st_node_num][direction] gives the * t_node in gt gt_num that maps t_node st_node_num in st. */ struct __Edge ***map_st_edge_in_gt; /*! map_st_gt_br[gt_num][st_branch_num] gives the * branch in gt gt_num that maps branch st_branch_num * in st. */ struct __Edge ****map_gt_edge_in_st; /*! mat_gt_st_br[gt_num][gt_branch_num][] is the list of * branches in st that map branch gt_branch_num * in gt gt_num. */ int **size_map_gt_edge_in_st; /*! size_map_gt_st_br[gt_num][gt_branch_num] gives the * size of the list map_gt_st_br[gt_num][gt_branch_num][] */ struct __Edge ***match_st_edge_in_gt; /*! match_st_edge_in_gt[gt_num][st_branch_num] gives the * branch in gt gt_num that matches branch st_branch_num */ struct __Edge ***match_gt_edge_in_st; /*! match_gt_edge_in_st[gt_num][gt_branch_num] gives the * branch in st that matches branch gt_branch_num */ struct __Node ****closest_match; /*! closest_match[gt_num][st_node_num][dir] gives the * closest t_node in st that matches a t_node in gt gt_num */ int ***closest_dist; /*! closest_dist[gt_num][st_node_num][dir] gives the * number of edges to traverse to get to node * closest_match[gt_num][st_node_num][dir] */ int n_part; /*! number of trees */ phydbl **bl; /*! bl[gt_num][gt_branch_num] gives the length of * branch gt_branch_num */ phydbl **bl_cpy; /*! copy of bl */ phydbl **bl0; /*! bl estimated during NNI (original topo) * See Mg_NNI. */ phydbl **bl1; /*! bl estimated during NNI (topo conf 1) * See Mg_NNI. */ phydbl **bl2; /*! bl estimated during NNI (topo conf 2) * See Mg_NNI. */ int *bl_partition; /*! partition[gt_num] gives the t_edge partition number * gt_num belongs to. */ int n_bl_part; struct __Model **s_mod; /*! substitution model */ int n_s_mod; int lock_br_len; } supert_tree; /*!********************************************************/ typedef struct __List_Tree { /*! a list of trees */ struct __Tree **tree; int list_size; /*! number of trees in the list */ } t_treelist; /*!********************************************************/ typedef struct __Align { char *name; /*! sequence name */ int len; /*! sequence length */ char *state; /*! sequence itself */ short int *d_state; /*! sequence itself (digits) */ short int *is_ambigu; /*! is_ambigu[site] = 1 if state[site] is an ambiguous character. 0 otherwise */ short int is_duplicate; int num; } align; /*!********************************************************/ typedef struct __Calign { struct __Align **c_seq; /*! compressed sequences */ struct __Align **c_seq_rm; /*! removed sequences */ struct __Option *io; /*! input/output */ phydbl *obs_state_frq; /*! observed state frequencies */ short int *invar; /*! < 0 -> polymorphism observed */ phydbl *wght; /*! # of each site in c_align */ short int *ambigu; /*! ambigu[i]=1 is one or more of the sequences at site i display an ambiguous character */ phydbl obs_pinvar; int n_otu; /*! number of taxa */ int n_rm; /*! number of taxa removed */ int clean_len; /*! uncrunched sequences lenghts without gaps */ int n_pattern; /*! crunched sequences lengths */ int init_len; /*! length of the uncompressed sequences */ int *sitepatt; /*! this array maps the position of the patterns in the compressed alignment to the positions in the uncompressed one */ int format; /*! 0 (default): PHYLIP. 1: NEXUS. */ scalar_dbl *io_wght; /*! weight of each *site* (not pattern) given as input */ int n_masked; /* Number of masked positions (or columns, depending on mask_type) */ short int mask_type; /* MASK_TYPE_POSITION or MASK_TYPE_COLUMN */ int *masked_pos; /* Vector of masked positions/columns */ } calign; /*!********************************************************/ typedef struct __Matrix { /*! mostly used in BIONJ */ phydbl **P, **Q, **dist; /*! observed proportions of transition, transverion and distances between pairs of sequences */ t_tree *tree; /*! tree... */ int *on_off; /*! on_off[i]=1 if column/line i corresponds to a t_node that has not been agglomerated yet */ int n_otu; /*! number of taxa */ char **name; /*! sequence names */ int r; /*! number of nodes that have not been agglomerated yet */ struct __Node **tip_node; /*! array of pointer to the leaves of the tree */ int curr_int; /*! used in the NJ/BIONJ algorithms */ int method; /*! if method=1->NJ method is used, BIONJ otherwise */ } matrix; /*!********************************************************/ typedef struct __RateMatrix { int n_diff_rr; /*! number of different relative substitution rates in the custom model */ vect_dbl *rr; /*! relative rate parameters of the GTR or custom model (rescaled) */ vect_dbl *rr_val; /*! log of relative rate parameters of the GTR or custom model (unscaled) */ vect_int *rr_num; vect_int *n_rr_per_cat; /*! number of rate parameters in each category */ vect_dbl *qmat; vect_dbl *qmat_buff; bool optimize; struct __RateMatrix *next; struct __RateMatrix *prev; } t_rmat; /*!********************************************************/ typedef struct __RAS { /*! Rate across sites */ int n_catg; /*! number of categories in the discrete gamma distribution */ int invar; /*! =1 iff the substitution model takes into account invariable sites */ int gamma_median; /*! 1: use the median of each bin in the discrete gamma distribution. 0: the mean is used */ vect_dbl *gamma_r_proba; /*! probabilities of the substitution rates defined by the discrete gamma distribution */ vect_dbl *gamma_r_proba_unscaled; vect_dbl *gamma_rr; /*! substitution rates defined by the RAS distribution */ vect_dbl *gamma_rr_unscaled; /*! substitution rates defined by the RAS distribution (unscaled) */ scalar_dbl *alpha; /*! gamma shapa parameter */ int free_mixt_rates; scalar_dbl *free_rate_mr; /*! mean relative rate as given by the FreeRate model */ int parent_class_number; scalar_dbl *pinvar; /*! proportion of invariable sites */ short int init_rr; short int init_r_proba; short int normalise_rr; short int *skip_rate_cat; /*! indicates whether of not the the likelihood for a given rate class shall be calculated. The default model in PhyML has four rate classes and the likelihood at a given site is then \sum_{i=1}^{4} \Pr(D|R=i) \Pr(R=i). Now, when optimising the rate for say the first rate class (i=1) one does not need to re-compute \Pr(D|R=2), \Pr(D|R=3) and \Pr(D|R=4) (which is the time consuming part of the likelihood calculation). This is where 'skip_rate_category' comes in handy. */ short int sort_rate_classes; /*! When doing MCMC moves on rate classes, one needs to have the rate classes sorted */ bool optimize; struct __RAS *next; struct __RAS *prev; } t_ras; /*!********************************************************/ typedef struct __EquFreq { /*! Equilibrium frequencies */ vect_dbl *pi; /*! states frequencies */ vect_dbl *pi_unscaled; /*! states frequencies (unscaled) */ phydbl *b_frq; /*! vector of empirical state frequencies */ vect_dbl *user_b_freq; /*! user-defined nucleotide frequencies */ short int type; struct __EquFreq *next; struct __EquFreq *prev; } t_efrq; /*!********************************************************/ typedef struct __Model { struct __Optimiz *s_opt; /*! pointer to parameters to optimize */ struct __Eigen *eigen; struct __M4 *m4mod; struct __Option *io; struct __Model *next; struct __Model *prev; struct __Model *next_mixt; struct __Model *prev_mixt; struct __RateMatrix *r_mat; struct __EquFreq *e_frq; struct __RAS *ras; t_string *aa_rate_mat_file; FILE *fp_aa_rate_mat; t_string *modelname; t_string *custom_mod_string; /*! string of characters used to define custom models of substitution */ int mod_num; /*! model number */ int update_eigen; /*! update_eigen=1-> eigen values/vectors need to be updated */ int cv_type; /* Type of cross-validation method */ int whichmodel; int is_mixt_mod; int augmented; int ns; /*! number of states (4 for ADN, 20 for AA) */ int use_m4mod; /*! Use a Markov modulated Markov model ? */ scalar_dbl *kappa; /*! transition/transversion rate */ scalar_dbl *lambda; /*! parameter used to define the ts/tv ratios in the F84 and TN93 models */ scalar_dbl *br_len_mult; /*! when users want to fix the relative length of edges and simply estimate the total length of the tree. This multiplier does the trick */ scalar_dbl *br_len_mult_unscaled; vect_dbl *Pij_rr; /*! matrix of change probabilities */ scalar_dbl *mr; /*! mean rate = branch length/time interval mr = -sum(i)(vct_pi[i].mat_Q[ii]) */ scalar_dbl *aic; scalar_dbl *bic; short int log_l; /*! Edge lengths are actually log(Edge lengths) if log_l == YES !*/ phydbl l_min; /*! Minimum branch length !*/ phydbl l_max; /*! Maximum branch length !*/ scalar_dbl *l_var_sigma; /*! For any edge b we have b->l_var->v = l_var_sigma * (b->l->v)^2 */ phydbl l_var_min; /*! Min of variance of branch lengths (used in conjunction with gamma_mgf_bl == YES) */ phydbl l_var_max; /*! Max of variance of branch lengths (used in conjunction with gamma_mgf_bl == YES) */ int gamma_mgf_bl; /*! P = \int_0^inf exp(QL) p(L) where L=\int_0^t R(s) ds and p(L) is the gamma density. Set to NO by default !*/ int n_mixt_classes; /* Number of classes in the mixture model. */ scalar_dbl *r_mat_weight; scalar_dbl *e_frq_weight; #ifdef BEAGLE int b_inst; bool optimizing_topology; /*! This is a flag that prevents the resetting of category weights. Why? Read */ /* Recall that while optimizing the topology, PhyML temporarily only uses 2 * rate categories. Recall also that a BEAGLE instance is created with all * the required categories, but we temporarily assign 0 weight to the other * categories thus effectively using only 2 categories. However, subsequent * calls to update the rates (i.e. update_beagle_ras()) will reset the * weights. This flag prevents this resetting from happening */ #endif } t_mod; /*!********************************************************/ typedef struct __Eigen { int size; /*! matrix is size * size */ phydbl *q; /*! matrix for which eigen values and vectors are computed */ phydbl *space; int *space_int; phydbl *e_val; /*! eigen values (vector), real part. */ phydbl *e_val_im; /*! eigen values (vector), imaginary part */ phydbl *r_e_vect_im; /*! right eigen vector (matrix), imaginary part */ phydbl *l_e_vect; /*! left eigen vector (matrix), real part */ phydbl *r_e_vect; /*! right eigen vector (matrix), real part */ phydbl *dum; /*! dummy ns*ns space */ struct __Eigen *prev; struct __Eigen *next; } eigen; /*!********************************************************/ typedef struct __Option { /*! mostly used in 'help.c' */ struct __Model *mod; /*! pointer to a substitution model */ struct __Tree *tree; /*! pointer to the current tree */ struct __Align **data; /*! pointer to the uncompressed sequences */ struct __Tree *cstr_tree; /*! pointer to a constraint tree (can be a multifurcating one) */ struct __Calign *cdata; /*! pointer to the compressed sequences */ struct __Super_Tree *st; /*! pointer to supertree */ struct __Tnexcom **nex_com_list; struct __List_Tree *treelist; /*! list of trees. */ struct __Option *next; struct __Option *prev; struct __Tmcmc *mcmc; struct __T_Rate *rates; struct __T_Time *times; int interleaved; /*! interleaved or sequential sequence file format ? */ int in_tree; /*! =1 iff a user input tree is used as input */ char *in_align_file; /*! alignment file name */ FILE *fp_in_align; /*! pointer to the alignment file */ char *in_tree_file; /*! input tree file name */ FILE *fp_in_tree; /*! pointer to the input tree file */ char *in_constraint_tree_file; /*! input constraint tree file name */ FILE *fp_in_constraint_tree; /*! pointer to the input constraint tree file */ char *out_tree_file; /*! name of the tree file */ FILE *fp_out_tree; char *weight_file; /*! name of the file containing site weights */ FILE *fp_weight_file; char *out_trees_file; /*! name of the tree file */ FILE *fp_out_trees; /*! pointer to the tree file containing all the trees estimated using random starting trees */ char *out_boot_tree_file; /*! name of the tree file */ FILE *fp_out_boot_tree; /*! pointer to the bootstrap tree file */ char *out_boot_stats_file; /*! name of the tree file */ FILE *fp_out_boot_stats; /*! pointer to the statistics file */ char *out_stats_file; /*! name of the statistics file */ FILE *fp_out_stats; char *out_trace_file; /*! name of the file in which the trace is written */ FILE *fp_out_trace; char *out_json_trace_file; /*! name of the file in which json trace is written */ FILE *fp_out_json_trace; char *out_lk_file; /*! name of the file in which the likelihood of the model is written */ FILE *fp_out_lk; char *out_summary_file; /*! name of the file in which summary statistics are written */ FILE *fp_out_summary; char *out_ps_file; /*! name of the file in which tree(s) is(are) written */ FILE *fp_out_ps; char *out_ancestral_seq_file; /*! name of the file containing the ancestral sequences */ char *out_ancestral_tree_file; /*! name of the file containing the tree with internal node labelled according to refs in ancestral_seq_file */ FILE *fp_out_ancestral_seq; /*! pointer to the file containing the ancestral sequences */ FILE *fp_out_ancestral_tree; /*! pointer to the file containing the tree with labels on internal nodes */ char *in_xml_file; FILE *fp_in_xml; /*! pointer to the file containing XML formatted data */ char *in_coord_file; /*! name of input file containing coordinates */ FILE *fp_in_coord; /*! pointer to the file containing coordinates */ char *out_file; /*! name of the output file */ char *clade_list_file; int datatype; /*! 0->DNA, 1->AA */ int print_boot_trees; /*! =1 if the bootstrapped trees are printed in output */ int out_stats_file_open_mode; /*! opening file mode for statistics file */ int out_tree_file_open_mode; /*! opening file mode for tree file */ int n_data_sets; /*! number of data sets to be analysed */ int n_trees; /*! number of trees */ int init_len; /*! sequence length */ int n_otu; /*! number of taxa */ int n_data_set_asked; /*! number of bootstrap replicates */ char *nt_or_cd; /*! nucleotide or codon data ? (not used) */ int multigene; /*! if=1 -> analyse several partitions. */ int config_multigene; int n_part; /*! number of data partitions */ int curr_gt; int ratio_test; /*! from 1 to 4 for specific branch supports, 0 of not */ int ready_to_go; int data_file_format; /*! Data format: Phylip or Nexus */ int tree_file_format; /*! Tree format: Phylip or Nexus */ int state_len; int curr_interface; int r_seed; /*! random seed */ int collapse_boot; /*! 0 -> branch length on bootstrap trees are not collapsed if too small */ int random_boot_seq_order; /*! !0 -> sequence order in bootstrapped data set is random */ int print_trace; int print_json_trace; int print_site_lnl; int m4_model; int rm_ambigu; /*! 0 is the default. 1: columns with ambiguous characters are discarded prior further analysis */ int colalias; int append_run_ID; char *run_id_string; int quiet; /*! 0 is the default. 1: no interactive question (for batch mode) */ int lk_approx; /* EXACT or NORMAL */ char **alphabet; int codpos; int mutmap; int use_xml; char **long_tax_names; char **short_tax_names; int size_tax_names; phydbl *z_scores; phydbl *lat; phydbl *lon; int boot_prog_every; int mem_question; int do_alias_subpatt; #ifdef BEAGLE int beagle_resource; #endif int ancestral; int has_io_weights; int tbe_bootstrap; /* Replace standard bootstrap with tbe bootstrap (only when b>0) */ int leave_duplicates; /* Leave duplicated sequences */ int precision; /* Decimal output precision for values in stats file */ int n_boot_replicates; short int print_mat_and_exit; short int print_node_num; /*! print node numbers if print_node_num=1 */ short int print_support_val; short int do_tbe; short int do_boot; short int do_alrt; short int edge_len_unit; short int mcmc_output_times; short int mcmc_output_trees; } option; /*!********************************************************/ typedef struct __Optimiz { short int opt_subst_param; /*! if opt_topo=0 and opt_subst_param=1 -> the numerical parameters of the model are optimised. if opt_topo=0 and opt_free_param=0 -> no parameter is optimised */ short int opt_clock_r; short int opt_bl_one_by_one; /*! =1 -> the branch lengths are optimised */ short int opt_topo; /*! =1 -> the tree topology is optimised */ short int topo_search; short int opt_node_ages; short int opt_neff; phydbl init_lk; /*! initial loglikelihood value */ int n_it_max; /*! maximum bnumber of iteration during an optimisation step */ int last_opt; /*! =1 -> the numerical parameters are optimised further while the tree topology remains fixed */ int random_input_tree; /*! boolean */ int n_rand_starts; /*! number of random starting points */ int brent_it_max; int steph_spr; int opt_five_branch; int pars_thresh; int hybrid_thresh; int opt_br_len_mult; int min_n_triple_moves; int max_rank_triple_move; int n_improvements; int max_spr_depth; int max_no_better_tree_found; phydbl tree_size_mult; /*! tree size multiplier */ phydbl min_diff_lk_local; phydbl min_diff_lk_global; phydbl min_diff_lk_move; phydbl p_moves_to_examine; int fast_nni; int greedy; int general_pars; int quickdirty; int spr_pars; int spr_lnL; int max_depth_path; int min_depth_path; int deepest_path; int eval_list_regraft; phydbl max_delta_lnL_spr; phydbl max_delta_lnL_spr_current; phydbl worst_lnL_spr; int br_len_in_spr; int opt_free_mixt_rates; int constrained_br_len; int opt_gamma_br_len; int first_opt_free_mixt_rates; int wim_n_rgrft; int wim_n_globl; int wim_max_dist; int wim_n_optim; int wim_n_best; int wim_inside_opt; int opt_rmat_weight; int opt_efrq_weight; int skip_tree_traversal; int serial_free_rates; int curr_opt_free_rates; int nni_br_len_opt; int apply_spr_right_away; int apply_spr; phydbl l_min_spr; } t_opt; /*!********************************************************/ typedef struct __NNI { struct __Node *left; struct __Node *rght; struct __Edge *b; phydbl score; scalar_dbl *init_l; scalar_dbl *init_v; phydbl init_lk; scalar_dbl *best_l; scalar_dbl *best_v; phydbl lk0, lk1, lk2; scalar_dbl *l0, *l1, *l2; scalar_dbl *v0, *v1, *v2; struct __Node *swap_node_v1; struct __Node *swap_node_v2; struct __Node *swap_node_v3; struct __Node *swap_node_v4; int best_conf; /*! best topological configuration : ((left_1,left_2),right_1,right_2) or ((left_1,right_2),right_1,left_2) or ((left_1,right_1),right_1,left_2) */ } t_nni; /*!********************************************************/ typedef struct __SPR { struct __Node *n_link; struct __Node *n_opp_to_link; struct __Edge *b_opp_to_link; struct __Edge *b_target; struct __Edge *b_init_target; struct __Node **path; scalar_dbl *init_target_l; scalar_dbl *init_target_v; scalar_dbl *l0, *l1, *l2; scalar_dbl *v0, *v1, *v2; phydbl lnL; int depth_path; int pars; int dist; struct __SPR *next; struct __SPR *prev; struct __SPR *next_mixt; struct __SPR *prev_mixt; struct __SPR *path_prev; struct __SPR *path_next; } t_spr; /*!********************************************************/ typedef struct __Pnode { struct __Pnode **next; int weight; int num; } pnode; /*!********************************************************/ typedef struct __M4 { int n_h; /*! number of hidden states */ int n_o; /*! number of observable states */ int use_cov_alpha; int use_cov_free; phydbl **o_mats; /*! set of matrices of substitution rates across observable states */ vect_dbl *o_rr; /*! relative rates (symmetric) of substitution between observable states */ phydbl *h_rr; /*! relative rates (symmetric) of substitution between hidden states */ phydbl *h_mat; /*! matrix that describes the substitutions between hidden states (aka switches) */ phydbl *o_fq; /*! equilibrium frequencies for the observable states */ vect_dbl *h_fq; /*! equilibrium frequencies for the hidden states */ vect_dbl *h_fq_unscaled; /*! unscaled equilibrium frequencies for the hidden states */ vect_dbl *multipl_unscaled; /*! unscaled vector of values that multiply each o_mats matrix */ vect_dbl *multipl; /*! vector of values that multiply each o_mats matrix */ scalar_dbl *delta; /*! switching rate */ scalar_dbl *alpha; /*! gamma shape parameter */ } m4; /*!********************************************************/ typedef struct __Tdraw { phydbl *xcoord; /*! t_node coordinates on the x axis */ phydbl *ycoord; /*! t_node coordinates on the y axis */ phydbl *xcoord_s; /*! t_node coordinates on the x axis (scaled) */ phydbl *ycoord_s; /*! t_node coordinates on the y axis (scaled) */ int page_width; int page_height; int tree_box_width; int *cdf_mat; phydbl *cdf_mat_x; phydbl *cdf_mat_y; phydbl max_dist_to_root; } tdraw; /*!********************************************************/ typedef struct __T_Rate { phydbl lexp; /*! Parameter of the exponential distribution that governs the rate at which substitution between rate classes ocur */ phydbl alpha; phydbl less_likely; phydbl c_lnL1; phydbl c_lnL2; phydbl c_lnL; /*! Current value of ProbDens(Br len | time stamps, model of rate evolution) */ phydbl p_lnL; /*! Previous value of c_lnL */ phydbl c_lnP; /*! Current value of ProbDens(time stamps, model of rate evolution) */ phydbl p_lnP; /*! Previous value of c_lnP */ phydbl clock_r; /*! Mean substitution rate, i.e., 'molecular clock' rate */ phydbl clock_r_prior_mean; phydbl clock_r_prior_var; short int clock_r_has_prior; short int init_clock_r; /* Set to YES if user gives initial value of clock rate */ phydbl min_clock; phydbl max_clock; phydbl lbda_nu; phydbl min_dt; phydbl step_rate; phydbl true_tree_size; phydbl p_max; phydbl norm_fact; phydbl nu; /*! Parameter of the Exponential distribution for the corresponding model */ phydbl min_nu; phydbl max_nu; phydbl autocor_rate_prior; phydbl covdet; phydbl sum_invalid_areas; phydbl min_rate; phydbl max_rate; phydbl *nd_r; /*! Current rates at nodes */ phydbl *br_r; /*! Current rates along edges */ phydbl *triplet; phydbl *true_r; /*! true t_edge rates (on rooted tree) */ phydbl *buff_t; phydbl *buff_br_r; phydbl *buff_nd_r; phydbl * dens; /*! Probability densities of mean substitution rates at the nodes */ phydbl *ml_l; /*! ML t_edge lengths (rooted) */ phydbl *cur_l; /*! Current t_edge lengths (rooted) */ phydbl *u_ml_l; /*! ML t_edge lengths (unrooted) */ phydbl *u_cur_l; /*! Current t_edge lengths (unrooted) */ phydbl *invcov; phydbl *cov_r; phydbl *mean_r; /*! average values of br_r taken across the sampled values during the MCMC */ phydbl *_2n_vect1; phydbl *_2n_vect2; phydbl *_2n_vect3; phydbl *_2n_vect4; short int *_2n_vect5; phydbl *_2n2n_vect1; phydbl *_2n2n_vect2; phydbl *trip_cond_cov; phydbl *trip_reg_coeff; phydbl *cond_var; phydbl *reg_coeff; phydbl *mean_l; phydbl *cov_l; phydbl *grad_l; /* gradient */ phydbl inflate_var; int adjust_rates; /*! if = 1, branch rates are adjusted such that a modification of a given t_node time does not modify any branch lengths */ int use_rates; /*! if = 0, branch lengths are expressed as differences between t_node times */ int bl_from_rt; /*! if =1, branch lengths are obtained as the product of cur_r and t */ int approx; int model_id; /*! Model number */ char *model_name; int is_allocated; int met_within_gibbs; int update_mean_l; int update_cov_l; int *n_tips_below; struct __Node * *lca; /*! 2-way table of common ancestral nodes for each pair of nodes */ short int *br_do_updt; phydbl *cur_gamma_prior_mean; phydbl *cur_gamma_prior_var; short int br_r_recorded; phydbl log_K_cur; int cur_comb_numb; struct __T_Rate *next; struct __T_Rate *prev; } t_rate; /*!********************************************************/ typedef struct __T_Time { phydbl *nd_t; /*! Current t_node times */ phydbl *buff_t; /*! Current t_node times */ phydbl *true_t; /*! Current t_node times */ phydbl c_lnL; /*! ProbDens(time stamps|param) */ phydbl c_lnP; /*! ProbDens(param) */ phydbl p_lnL; /*! Previous value of Prob(time stamps|param) */ phydbl p_lnP; /*! Previous value of Prob(param) */ phydbl c_lnL_jps; /*! Prob(# Jumps | time stamps, rates, model of rate evolution) */ phydbl scaled_pop_size; // Product of effective population size with length of // a generation in calendar time unit phydbl scaled_pop_size_min; phydbl scaled_pop_size_max; phydbl neff_growth; phydbl neff_growth_min; phydbl neff_growth_max; phydbl birth_rate; phydbl birth_rate_min; phydbl birth_rate_max; phydbl birth_rate_pivot; phydbl death_rate; phydbl death_rate_min; phydbl death_rate_max; phydbl death_rate_pivot; phydbl *t_prior; phydbl *t_prior_min; phydbl *t_prior_max; phydbl *t_floor; phydbl *t_mean; int *t_rank; /* rank of nodes, e.g., tree->nd_a[tree->rates->t_rank[0]] is the oldest node */ short int nd_t_recorded; short int is_asynchronous; phydbl *time_slice_lims; phydbl *calib_prob; struct __Calibration **a_cal; /* array of calibration data */ int n_cal; /* number of elements in a_cal */ phydbl *t_prior_min_ori; phydbl *t_prior_max_ori; phydbl *times_partial_proba; int *has_survived; int *n_jps; int *t_jps; int *numb_calib_chosen; int n_time_slices; int *n_time_slice_spans; int *curr_slice; short int *t_has_prior; phydbl *mean_t; /*! average values of nd_t taken across the sampled values during the MCMC */ short int model_id; short int coalescent_model_id; int update_time_norm_const; short int augmented_coalescent; phydbl neff_prior_mean; phydbl neff_prior_var; short int neff_prior_distrib; } t_time; /*!********************************************************/ typedef struct __Tmcmc { struct __Option *io; phydbl *tune_move; phydbl *move_weight; phydbl *move_prob; phydbl *acc_rate; int *acc_move; int *run_move; int *prev_acc_move; int *prev_run_move; int *num_move; int *move_type; char **move_name; time_t time_beg; time_t time_end; int num_move_nd_r; int num_move_br_r; int num_move_times; int num_move_times_and_rates; int num_move_times_and_rates_root; int num_move_root_time; int num_move_nu; int num_move_clock_r; int num_move_tree_height; int num_move_time_slice; int num_move_subtree_height; int num_move_kappa; int num_move_rr; int num_move_spr; int num_move_spr_weighted; int num_move_spr_local; int num_move_spr_root; int num_move_tree_rates; int num_move_subtree_rates; int num_move_updown_nu_cr; int num_move_updown_t_cr; int num_move_updown_t_br; int num_move_ras; int num_move_rates_shrink; int num_move_cov_rates; int num_move_cov_switch; int num_move_birth_rate; int num_move_death_rate; int num_move_birth_death_updown; int num_move_jump_calibration; int num_move_geo_lambda; int num_move_geo_sigma; int num_move_geo_tau; int num_move_geo_dum; int num_move_geo_updown_tau_lbda; int num_move_geo_updown_lbda_sigma; int num_move_phyrex_lbda; int num_move_phyrex_mu; int num_move_phyrex_rad; int num_move_phyrex_indel_disk; int num_move_phyrex_move_disk_ct; int num_move_phyrex_move_disk_ud; int num_move_phyrex_swap_disk; int num_move_phyrex_indel_hit; int num_move_phyrex_spr; int num_move_phyrex_spr_slide; int num_move_phyrex_narrow_exchange; int num_move_phyrex_wide_exchange; int num_move_phyrex_scale_times; int num_move_phyrex_ldscape_lim; int num_move_phyrex_sigsq; int num_move_time_neff; int num_move_time_neff_growth; int num_move_phyrex_sim; int num_move_phyrex_traj; int num_move_phyrex_indel_disk_serial; int num_move_phyrex_sim_plus; int num_move_phyrex_indel_hit_serial; int num_move_phyrex_ldsk_and_disk; int num_move_phyrex_ldsk_multi; int num_move_phyrex_disk_multi; int num_move_phyrex_ldsk_given_disk; int num_move_phyrex_disk_given_ldsk; int num_move_phyrex_add_remove_jump; int num_move_clade_change; int num_move_phyrex_ldsk_tip_to_root; int num_move_phyrex_sigsq_scale; int num_move_phyrex_ldsk_tips; int num_move_phyrex_node_times; int num_move_phyrex_node_veloc; int num_move_phyrex_correlated_node_veloc; int num_move_phyrex_all_veloc; int num_move_phyrex_shuffle_node_times; int num_move_phyrex_iwn_omega; int num_move_phyrex_iou_theta; int num_move_phyrex_iou_theta_sigsq; int num_move_phyrex_iou_mu; int num_move_obs_var; int num_move_phyrex_tip_loc; int nd_t_digits; int *monitor; char *out_filename; time_t t_beg; time_t t_cur; time_t t_last_print; FILE *out_fp_stats; FILE *out_fp_trees; FILE *out_fp_means; FILE *out_fp_last; FILE *out_fp_constree; FILE *in_fp_par; int *adjust_tuning; int n_moves; int move_idx; int randomize; int norm_freq; int run; int chain_len; int sample_interval; int chain_len_burnin; int print_every; int is_burnin; int max_lag; phydbl max_tune; phydbl min_tune; phydbl *sampled_val; int sample_size; int sample_num; phydbl *ess; int *ess_run; int *start_ess; phydbl *mode; int always_yes; /* Always accept proposed move (as long as log-likelihood > UNLIKELY) */ int is; /* Importance sampling? Yes or NO */ short int out_verbose; } t_mcmc; /*!********************************************************/ typedef struct __Tpart { int *ns; /*! number of states for each partition (e.g., 2, 4, 3) */ int *cum_ns; /*! cumulative number of states (e.g., 0, 2, 6) */ int ns_max; /*! maximum number of states */ int ns_min; /*! minimum number of states */ int n_partitions; /*! number of partitions */ struct __Eigen *eigen; } part; /*!********************************************************/ typedef struct __Tnexcom { /*! Nexus command */ char *name; int nparm; int nxt_token_t; int cur_token_t; FILE *fp; struct __Tnexparm **parm; } nexcom; /*!********************************************************/ typedef struct __Tnexparm { /*! Nexus parameter value */ char *name; char *value; int nxt_token_t; int cur_token_t; FILE *fp; int (*func)(char *, struct __Tnexparm *, struct __Option *); struct __Tnexcom *com; } nexparm; /*!********************************************************/ typedef struct __ParamInt { int val; } t_param_int; /*!********************************************************/ typedef struct __ParamDbl { phydbl val; } t_param_dbl; /*!********************************************************/ typedef struct __XML_node { struct __XML_attr *attr; // Pointer to the first element of a list of attributes int n_attr; // Number of attributes struct __XML_node *next; // Next sibling struct __XML_node *prev; // Previous sibling struct __XML_node *parent; // Parent of this node struct __XML_node *child; // Child of this node char *id; char *name; char *value; struct __Generic_Data_Structure *ds; // Pointer to a data strucuture. Can be a scalar, a vector, anything. } xml_node; /*!********************************************************/ typedef struct __Generic_Data_Structure { void *obj; struct __Generic_Data_Structure *next; } t_ds; /*!********************************************************/ typedef struct __XML_attr { char *name; char *value; struct __XML_attr *next; // Next attribute struct __XML_attr *prev; // Previous attribute } xml_attr; /*!********************************************************/ typedef struct __Calibration { struct __Calibration *next; // Next calibration struct __Calibration *prev; // Previous calibration struct __Clade **clade_list; phydbl * alpha_proba_list; // list of alpha proba, one for each clade in clade_list int current_clade_idx; // index of the clade the calibration time interval // currently applies to int clade_list_size; phydbl lower; // lower bound phydbl upper; // upper bound short int is_primary; // Is it a primary or secondary calibration interval? char *id; // calibration ID } t_cal; /*!********************************************************/ typedef struct __Clade { char *id; struct __Node **tip_list; // list of tips defining the clade char **tax_list; // list of names of tips defining the clade int n_tax; // number of taxa in the clade struct __Node *target_nd; // The node this calibration applies to } t_clad; /*!********************************************************/ typedef struct __Phylogeo { phydbl *cov; // Covariance of migrations (n_dim x n_dim) phydbl *r_mat; // R matrix. Gives the rates of migrations between locations. // See article. phydbl *f_mat; // F matrix. See article. int *occup; // Vector giving the number of lineages that occupy each location int *idx_loc; // Index of location for each lineage int *idx_loc_beneath; // Gives the index of location occupied beneath each // node in the tree int ldscape_sz; // Landscape size: number of locations int n_dim; // Dimension of the data (e.g., longitude + lattitude -> n_dim = 2) int update_fmat; struct __Geo_Coord **coord_loc; // Coordinates of the observed locations phydbl sigma; // Dispersal parameter phydbl min_sigma; phydbl max_sigma; phydbl sigma_thresh; // beyond sigma_thresh, there is no dispersal bias. phydbl lbda; // Competition parameter phydbl min_lbda; phydbl max_lbda; phydbl c_lnL; // ProbDens(location|param) phydbl p_lnL; // Previous value of c_lnL phydbl c_lnP; // ProbDens(param) phydbl p_lnP; // Previous value of p_lnP struct __Node **sorted_nd; // Table of nodes sorted wrt their heights. phydbl tau; // overall migration rate parameter phydbl min_tau; phydbl max_tau; phydbl dum; // dummy parameter use to assess non-identifiability issues phydbl min_dum; phydbl max_dum; } t_geo; /*!********************************************************/ // Data structure for the migration/reproduction model typedef struct __Migrep_Model { struct __Geo_Coord *lim_up; // max longitude and lattitude struct __Geo_Coord *lim_do; // min longitude and lattitude phydbl *sigsq_scale; // Scaling factors for the variance parameter in RRW model phydbl sigsq_scale_min; phydbl sigsq_scale_max; phydbl sigsq_scale_norm_fact; short int model_id; short int dist_type; int n_dim; int safe_phyrex; int max_num_of_intervals; int update_rad; short int integrateAncestralLocations; phydbl lbda; // rate at which events occur phydbl min_lbda; // min of rate at which events occur phydbl max_lbda; // max of rate at which events occur phydbl prior_param_lbda; // parameter of the parameter for the prior on lbda phydbl mu; // per-capita and per event death probability phydbl min_mu; // min of per-capita and per event death probability phydbl max_mu; // max of per-capita and per event death probability phydbl prior_param_mu; // parameter of the parameter for the prior on mu phydbl rad; // radius of the migrep disk phydbl min_rad; // min of radius of the migrep disk phydbl max_rad; // max of radius of the migrep disk phydbl prior_param_rad; // parameter of the parameter for the prior on radius phydbl *sigsq; // parent to offspring distance variance (i.e., gene flow) // parameter. First elem is for latitude, second is for longitude phydbl min_sigsq; // min phydbl max_sigsq; // max phydbl prior_param_sigsq; // parameter of the parameter for the prior phydbl rho; // intensity parameter of the Poisson point processs phydbl gen_cal_time; // duration of one generation in calendar time unit phydbl nu; // parameter of hyperprior on sigsq_scale (see Eq. (1) in Lemey et // al., 2010). phydbl omega; // step size in white noise jump model phydbl min_omega; phydbl max_omega; phydbl ou_theta; // "stickiness" parameter in OU model phydbl min_ou_theta; phydbl max_ou_theta; phydbl *ou_mu; // drift parameter in OU model phydbl min_ou_mu; phydbl max_ou_mu; phydbl min_veloc; phydbl max_veloc; phydbl c_lnL; // current value of log-likelihood phydbl p_lnL; // previous value of log-likelihood phydbl c_lnP; // current value of log-prior phydbl p_lnP; // previous value of log-prior phydbl c_ln_prior_rad; // current value of log prior for the prior on radius phydbl c_ln_prior_lbda; // current value of log prior for the prior on lbda phydbl c_ln_prior_mu; // current value of log prior for the prior on mu phydbl c_ln_prior_sigsq; // current value of log prior for the prior on // sigsq=4.pi.lbda.mu.rad^4 phydbl soft_bound_area; short int sampling_scheme; short int use_locations; // Prior mean, sd and distribution for sigsq parameter, controlling either the // variation of coordinates or velocities (and coordinates) phydbl rw_prior_mean; phydbl rw_prior_sd; short int rw_prior_distrib; phydbl *rw_root_mean; phydbl *rw_root_var; phydbl rrw_prior_sd; // value of parameter governing the variance of diffusion // coefficient across edges short int print_lk; short int do_location_sampling; } t_phyrex_mod; /*!********************************************************/ typedef struct __Disk_Event { struct __Geo_Coord *centr; struct __Disk_Event *next; struct __Disk_Event *prev; struct __Disk_Event *img; struct __Lindisk_Node * *ldsk_a; // array of lindisk nodes corresponding to this disk event. struct __Lindisk_Node *ldsk; struct __Migrep_Model *mmod; phydbl cum_glnL; // cumulative log-likelihood (locations) phydbl cum_tlnL; // cumulative log-likelihood (times); phydbl time; phydbl time_bkp; short int age_fixed; // time is fixed for disks corresponding to samples. int n_ldsk_a; // size of ldsk_a. char *id; } t_dsk; /*!********************************************************/ // Data structure for implementing Felsenstein's independent contrasts // likelihood calculation Use the same notation as that in the 1973 article (Am // J Hum Genet 25:471-492) typedef struct __Independent_Contrasts { phydbl *x; phydbl *tprime; } t_ctrst; /*!********************************************************/ typedef struct __Continuous_Model { phydbl *mu_down; phydbl *var_down; phydbl *logrem_down; phydbl *mu_up; phydbl *var_up; phydbl *logrem_up; phydbl *lnL_up; phydbl *lnL_down; phydbl *lnL; phydbl combined_lnL; phydbl *obs_var; // Variance of observational model (one param for each // spatial dimension) phydbl obs_var_min; phydbl obs_var_max; short int obs_model; // Observational model 0/1 short int obs_model_est; // Estimate variance of observational model 0/1 phydbl obs_var_prior_mean; short int *both_sides; } t_contmod; /*!********************************************************/ typedef struct __Geo_Coord { phydbl *lonlat; /* longitude-latitude vector */ int dim; char *id; struct __Geo_Coord *cpy; /* keep a copy of this coordinate */ } t_geo_coord; /*!********************************************************/ typedef struct __Geo_Velocity { phydbl *deriv; /* derivative of longitude-latitude vector */ int dim; char *id; struct __Geo_Velocity *cpy; /* keep a copy of this velocity */ } t_geo_veloc; /*!********************************************************/ typedef struct __Lindisk_Node { struct __Disk_Event *disk; struct __Disk_Event *baseline; struct __Lindisk_Node **next; struct __Lindisk_Node *prev; struct __Lindisk_Node *img; struct __Geo_Coord *coord; struct __Geo_Coord *cpy_coord; struct __Geo_Velocity *veloc; struct __Node *nd; short int is_hit; int n_next; phydbl rr; phydbl sigsq; phydbl base_line; } t_ldsk; /*!********************************************************/ typedef struct __Polygon { struct __Geo_Coord **poly_vert; /* array of polygon vertex coordinates */ int n_poly_vert; /* number of vertices */ } t_poly; /*!********************************************************/ typedef struct __SampArea { int n_poly; /* Number of polygons making the sampling area */ t_poly **a_poly; /* Polygons making the sampling area */ } t_sarea; /*!********************************************************/ typedef struct __JSON_KeyVal { char *key; char *value; struct __JSON_Object *object; struct __JSON_Array *array; struct __JSON_KeyVal *next; } json_kv; /*!********************************************************/ typedef struct __JSON_Object { struct __JSON_KeyVal *kv; struct __JSON_Object *next; } json_o; /*!********************************************************/ typedef struct __JSON_Array { struct __JSON_Object *object; } json_a; /*!********************************************************/ typedef struct __Label { char *key; char *val; char sep; struct __Label *next; struct __Label *prev; } t_label; /*!********************************************************/ /*!********************************************************/ /*!********************************************************/ void Unroot_Tree(char **subtrees); void Set_Edge_Dirs(t_edge *b, t_node *a, t_node *d, t_tree *tree); void Restrict_To_Coding_Position(align **data, option *io); void Uppercase(char *ch); void Lowercase(char *ch); calign *Compact_Data(align **data, option *io); calign *Compact_Cdata(calign *data, option *io); void Traverse_Prefix_Tree(int site, int seqnum, int *patt_num, int *n_patt, align **data, option *io, pnode *n); pnode *Create_Pnode(int size); void Get_Base_Freqs(calign *data); void Get_AA_Freqs(calign *data); void Swap_Nodes_On_Edges(t_edge *e1, t_edge *e2, int swap, t_tree *tree); void Connect_Edges_To_Nodes_Recur(t_node *a, t_node *d, t_tree *tree); void Connect_One_Edge_To_Two_Nodes(t_node *a, t_node *d, t_edge *b, t_tree *tree); void Update_Dirs(t_tree *tree); void Exit(char *message); void *mCalloc(int nb, size_t size); void *mRealloc(void *p, int nb, size_t size); int Sort_Phydbl_Decrease(const void *a, const void *b); void Qksort_Int(int *A, int *B, int ilo, int ihi); void Qksort(phydbl *A, phydbl *B, int ilo, int ihi); void Qksort_Matrix(phydbl **A, int col, int ilo, int ihi); void Order_Tree_Seq(t_tree *tree, align **data); char *Add_Taxa_To_Constraint_Tree(FILE *fp, calign *cdata); void Check_Constraint_Tree_Taxa_Names(t_tree *tree, calign *cdata); void Order_Tree_CSeq(t_tree *tree, calign *cdata); void Init_Mat(matrix *mat, calign *data); void Copy_Tax_Names_To_Tip_Labels(t_tree *tree, calign *data); void Share_Lk_Struct(t_tree *t_full, t_tree *t_empt); void Share_Spr_Struct(t_tree *t_full, t_tree *t_empt); void Share_Pars_Struct(t_tree *t_full, t_tree *t_empt); int Sort_Edges_NNI_Score(t_tree *tree, t_edge **sorted_edges, int n_elem); int Sort_Edges_Depth(t_tree *tree, t_edge **sorted_edges, int n_elem); void NNI(t_tree *tree, t_edge *b_fcus, int do_swap); void NNI_Pars(t_tree *tree, t_edge *b_fcus, int do_swap); void Swap(t_node *a, t_node *b, t_node *c, t_node *d, t_tree *tree); void Update_SubTree_Partial_Lk(t_edge *b_fcus, t_node *a, t_node *d, t_tree *tree); void Copy_Seq_Names_To_Tip_Labels(t_tree *tree, calign *data); calign *Copy_Cseq(calign *ori, option *io, t_tree *tree); int Filexists(char *filename); int Is_Invar(int patt_num, int stepsize, int datatype, calign *data); int Is_Ambigu(char *state, int datatype, int stepsize); void Check_Ambiguities(calign *data, int datatype, int stepsize); int Get_State_From_Ui(int ui, int datatype); int Assign_State(char *c, int datatype, int stepsize); char Reciproc_Assign_State(int i_state, int datatype); int Assign_State_With_Ambiguity(char *c, int datatype, int stepsize); void Clean_Tree_Connections(t_tree *tree); void Bootstrap(t_tree *tree); void Br_Len_Involving_Invar(t_tree *tree); void Br_Len_Not_Involving_Invar(t_tree *tree); void Getstring_Stdin(char *s); phydbl Num_Derivatives_One_Param(phydbl (*func)(t_tree *tree), t_tree *tree, phydbl f0, phydbl *param, int which, int n_param, phydbl stepsize, short int logt, short int expt, phydbl *err, int precise, int is_positive); phydbl Num_Derivatives_One_Param_Nonaligned( phydbl (*func)(t_tree *tree), t_tree *tree, phydbl f0, phydbl **param, int which, int n_param, phydbl stepsize, short int logt, short int expt, phydbl *err, int precise, int is_positive); int Num_Derivative_Several_Param(t_tree *tree, phydbl *param, int n_param, phydbl stepsize, short int logt, short int expt, phydbl (*func)(t_tree *tree), phydbl *derivatives, int is_positive); int Num_Derivative_Several_Param_Nonaligned(t_tree *tree, phydbl **param, int n_param, phydbl stepsize, short int logt, short int expt, phydbl (*func)(t_tree *tree), phydbl *derivatives, int is_positive); int Compare_Two_States(char *state1, char *state2, int state_size); void Copy_One_State(char *from, char *to, int state_size); void Copy_Dist(phydbl **cpy, phydbl **orig, int n); t_mod *Copy_Model(t_mod *ori); void Record_Model(t_mod *ori, t_mod *cpy); void Set_Defaults_Input(option *io); void Set_Defaults_Model(t_mod *mod); void Set_Defaults_Optimiz(t_opt *s_opt); void Test_Node_Table_Consistency(t_tree *tree); void Get_Bip(t_node *a, t_node *d, t_tree *tree); void Alloc_Bip(t_tree *tree); int Sort_Phydbl_Increase(const void *a, const void *b); int Sort_String(const void *a, const void *b); phydbl Compare_Bip(t_tree *tree1, t_tree *tree2, int on_existing_edges_only, int comparison_criterion); void Compare_Bip_Distance(t_tree *tree1, t_tree *tree2); void Match_Tip_Numbers(t_tree *tree1, t_tree *tree2); void Test_Multiple_Data_Set_Format(option *io); int Are_Compatible(char *statea, char *stateb, int stepsize, int datatype); void Hide_Ambiguities(calign *data); void Copy_Tree(t_tree *ori, t_tree *cpy); void Prune_Subtree(t_node *a, t_node *d, t_edge **target, t_edge **residual, t_tree *tree); void Graft_Subtree(t_edge *target, t_node *link, t_node *link_daughter, t_edge *residual, t_node *target_nd, t_tree *tree); void Reassign_Node_Nums(t_node *a, t_node *d, unsigned int *curr_ext_node, unsigned int *curr_int_node, t_tree *tree); void Reassign_Edge_Nums(t_node *a, t_node *d, int *curr_br, t_tree *tree); void Find_Mutual_Direction(t_node *n1, t_node *n2, short int *dir_n1_to_n2, short int *dir_n2_to_n1); void Update_Dir_To_Tips(t_node *a, t_node *d, t_tree *tree); void Fill_Dir_Table(t_tree *tree); int Get_Subtree_Size(t_node *a, t_node *d); void Init_Eigen_Struct(eigen *this); phydbl Triple_Dist(t_node *a, t_tree *tree); phydbl Triple_Dist_Approx(t_node *a, t_edge *b, t_tree *tree); void Make_Symmetric(phydbl **F, int size); void Divide_Mat_By_Vect(phydbl **F, phydbl *vect, int size); void Found_In_Subtree(t_node *a, t_node *d, t_node *target, int *match, t_tree *tree); void Get_List_Of_Target_Edges(t_node *a, t_node *d, t_edge **list, int *list_size, t_tree *tree); void Fix_All(t_tree *tree); void Record_Br_Len(t_tree *tree); void Restore_Br_Len(t_tree *tree); void Get_Dist_Btw_Edges(t_node *a, t_node *d, t_tree *tree); void Detect_Polytomies(t_edge *b, phydbl l_thresh, t_tree *tree); void Get_List_Of_Nodes_In_Polytomy(t_node *a, t_node *d, t_node ***list, int *size_list); void Check_Path(t_node *a, t_node *d, t_node *target, t_tree *tree); void Connect_Two_Nodes(t_node *a, t_node *d); void Get_List_Of_Adjacent_Targets(t_node *a, t_node *d, t_node ***node_list, t_edge ***edge_list, int *list_size, int curr_depth, int max_depth); void Sort_List_Of_Adjacent_Targets(t_edge ***list, int list_size); t_node *Common_Nodes_Btw_Two_Edges(t_edge *a, t_edge *b); void Random_Tree(t_tree *tree); void Reorganize_Edges_Given_Lk_Struct(t_tree *tree); void Random_NNI(int n_moves, t_tree *tree); void Fill_Missing_Dist(matrix *mat); void Fill_Missing_Dist_XY(int x, int y, matrix *mat); phydbl Least_Square_Missing_Dist_XY(int x, int y, phydbl dxy, matrix *mat); void Check_Memory_Amount(t_tree *tree); int Get_State_From_P_Lk(phydbl *p_lk, int pos, t_tree *tree); int Get_State_From_P_Pars(short int *p_pars, int pos, t_tree *tree); void Check_Dirs(t_tree *tree); void Warn_And_Exit(const char *s); void Randomize_Sequence_Order(calign *cdata); void Update_Root_Pos(t_tree *tree); void Add_Root(t_edge *target, t_tree *tree); void Update_Ancestors(t_node *a, t_node *d, t_edge *b, t_tree *tree); #if (defined PHYTIME || defined SERGEII) t_tree *Generate_Random_Tree_From_Scratch(int n_otu, int rooted); #endif void Random_Lineage_Rates(t_node *a, t_node *d, t_edge *b, phydbl stick_prob, phydbl *rates, int curr_rate, int n_rates, t_tree *tree); t_edge *Find_Edge_With_Label(char *label, t_tree *tree); void Site_Diversity(t_tree *tree); void Site_Diversity_Post(t_node *a, t_node *d, t_edge *b, t_tree *tree); void Site_Diversity_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void Subtree_Union(t_node *n, t_edge *b_fcus, t_tree *tree); void Binary_Decomposition(int value, int *bit_vect, int size); void Print_Diversity_Header(FILE *fp, t_tree *tree); void Best_Of_NNI_And_SPR(t_tree *tree); int Polint(phydbl *xa, phydbl *ya, int n, phydbl x, phydbl *y, phydbl *dy); t_tree *Dist_And_BioNJ(calign *cdata, t_mod *mod, option *io); void Add_BioNJ_Branch_Lengths(t_tree *tree, calign *cdata, t_mod *mod, matrix *mat); char *Bootstrap_From_String(char *s_tree, calign *cdata, t_mod *mod, option *io); char *aLRT_From_String(char *s_tree, calign *cdata, t_mod *mod, option *io); void Find_Common_Tips(t_tree *tree1, t_tree *tree2); phydbl Get_Tree_Size(t_tree *tree); void Dist_To_Root_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void Dist_To_Root(t_tree *tree); char *Basename(char *path); t_node *Find_Lca_Pair_Of_Nodes(t_node *n1, t_node *n2, int *dist, t_tree *tree); t_node *Find_Lca_Clade(t_node **node_list, int node_list_size, t_tree *tree); int Get_List_Of_Ancestors(t_node *ref_node, t_node **list, int *size, t_tree *tree); int Edge_Num_To_Node_Num(int edge_num, t_tree *tree); void Branch_Lengths_To_Rate_Lengths(t_tree *tree); void Branch_Lengths_To_Rate_Lengths_Pre(t_node *a, t_node *d, t_tree *tree); int Find_Clade(char **tax_name_list, int list_size, t_tree *tree); void Find_Clade_Pre(t_node *a, t_node *d, int *tax_num_list, int list_size, int *num, t_tree *tree); t_edge *Find_Root_Edge(FILE *fp_input_tree, t_tree *tree); void Copy_Tree_Topology_With_Labels(t_tree *ori, t_tree *cpy); void Set_Model_Name(t_mod *mod); void Adjust_Min_Diff_Lk(t_tree *tree); void Translate_Tax_Names(char **tax_names, t_tree *tree); void Skip_Comment(FILE *fp); void Get_Best_Root_Position(t_tree *tree); void Get_Best_Root_Position_Post(t_node *a, t_node *d, int *has_outgrp, t_tree *tree); void Get_Best_Root_Position_Pre(t_node *a, t_node *d, t_tree *tree); void Get_OutIn_Scores(t_node *a, t_node *d); int Check_Sequence_Name(char *s); int Scale_Subtree_Height(t_node *a, phydbl K, phydbl floor, int *n_nodes, t_tree *tree); void Scale_Node_Heights_Post(t_node *a, t_node *d, phydbl K, phydbl floor, int *n_nodes, t_tree *tree); int Scale_Subtree_Rates(t_node *a, phydbl mult, int *n_nodes, t_tree *tree); void Check_Br_Len_Bounds(t_tree *tree); int Scale_Subtree_Rates_Post(t_node *a, t_node *d, phydbl mult, int *n_nodes, t_tree *tree); void Get_Node_Ranks(t_tree *tree); void Get_Node_Ranks_Pre(t_node *a, t_node *d, t_tree *tree); void Log_Br_Len(t_tree *tree); phydbl Diff_Lk_Norm_At_Given_Edge(t_edge *b, t_tree *tree); void Adjust_Variances(t_tree *tree); phydbl Effective_Sample_Size(phydbl first_val, phydbl last_val, phydbl sum, phydbl sumsq, phydbl sumcurnext, int n); void Rescale_Free_Rate_Tree(t_tree *tree); phydbl Rescale_Br_Len_Multiplier_Tree(t_tree *tree); phydbl Unscale_Br_Len_Multiplier_Tree(t_tree *tree); phydbl Reflect(phydbl x, phydbl l, phydbl u); int Are_Equal(phydbl a, phydbl b, phydbl eps); int Check_Topo_Constraints(t_tree *big_tree, t_tree *small_tree); void Prune_Tree(t_tree *big_tree, t_tree *small_tree); void Match_Nodes_In_Small_Tree(t_tree *small_tree, t_tree *big_tree); void Find_Surviving_Edges_In_Small_Tree(t_tree *small_tree, t_tree *big_tree); void Find_Surviving_Edges_In_Small_Tree_Post(t_node *a, t_node *d, t_tree *small_tree, t_tree *big_tree); void Set_Taxa_Id_Ranking(t_tree *tree); void Get_Edge_Binary_Coding_Number(t_tree *tree); void Make_Ancestral_Seq(t_tree *tree); void Make_MutMap(t_tree *tree); int Get_Mutmap_Val(int edge, int site, int mut, t_tree *tree); void Get_Mutmap_Coord(int idx, int *edge, int *site, int *mut, t_tree *tree); void Copy_Edge_Lengths(t_tree *to, t_tree *from); void Init_Scalar_Dbl(scalar_dbl *p); void Init_Scalar_Int(scalar_int *p); void Init_Vect_Dbl(int len, vect_dbl *p); void Init_Vect_Int(int len, vect_int *p); char *To_Lower_String(char *in); phydbl String_To_Dbl(char *string); int String_To_Int(char *string); char *To_Upper_String(char *in); void Connect_CSeqs_To_Nodes(calign *cdata, option *io, t_tree *tree); void Joint_Proba_States_Left_Right(phydbl *Pij, phydbl *p_lk_left, phydbl *p_lk_rght, vect_dbl *pi, int scale_left, int scale_rght, phydbl *F, int n, int site, t_tree *tree); void Set_Both_Sides(int yesno, t_tree *tree); void Set_D_States(calign *data, int datatype, int stepsize); void Path_Length(t_node *dep, t_node *arr, phydbl *len, t_tree *tree); phydbl *Dist_Btw_Tips(t_tree *tree); void Best_Root_Position_IL_Model(t_tree *tree); void Set_Br_Len_Var(t_edge *b, t_tree *tree); void Check_Br_Lens(t_tree *tree); void Calculate_Number_Of_Diff_States_Post(t_node *a, t_node *d, t_edge *b, t_tree *tree); void Calculate_Number_Of_Diff_States_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void Calculate_Number_Of_Diff_States_Core(t_node *a, t_node *d, t_edge *b, t_tree *tree); void Calculate_Number_Of_Diff_States(t_tree *tree); void Build_Distrib_Number_Of_Diff_States_Under_Model(t_tree *tree); int Number_Of_Diff_States_One_Site(int site, t_tree *tree); void Number_Of_Diff_States_One_Site_Post(t_node *a, t_node *d, t_edge *b, int site, t_tree *tree); int Number_Of_Diff_States_One_Site_Core(t_node *a, t_node *d, t_edge *b, int site, t_tree *tree); phydbl Get_Lk(t_tree *tree); phydbl Get_d2Lk(t_tree *tree); phydbl Get_dLk(t_tree *tree); void Connect_Edges_To_Nodes_Serial(t_tree *tree); phydbl Mean_Identity(calign *data); phydbl Pairwise_Identity(int i, int j, calign *data); phydbl Fst(int i, int j, calign *data); phydbl Nucleotide_Diversity(calign *data); void Swap_Partial_Lk(t_edge *a, t_edge *b, int side_a, int side_b, t_tree *tree); scalar_dbl **Copy_Br_Len_Var(t_tree *mixt_tree); scalar_dbl **Copy_Br_Len(t_tree *mixt_tree); void Transfer_Br_Len_To_Tree(scalar_dbl **bl, t_tree *tree); void Copy_Scalar_Dbl(scalar_dbl *from, scalar_dbl *to); scalar_dbl *Duplicate_Scalar_Dbl(scalar_dbl *from); scalar_dbl *Read_Weights(option *io); phydbl Scalar_Elem(int pos, scalar_dbl *scl); int Scalar_Len(scalar_dbl *scl); int Vect_Len(vect_dbl *scl); void Set_Scalar_Dbl(phydbl val, scalar_dbl *from); void Set_Scalar_Dbl_Min_Thresh(phydbl thresh, scalar_dbl *from); void Set_Scalar_Dbl_Max_Thresh(phydbl thresh, scalar_dbl *from); void List_Of_Regraft_Nodes(t_node *a, t_node *d, phydbl time_thresh, t_ll *list, t_tree *tree); void Push_Bottom_Linked_List(void *what, t_ll **list, bool remove_duplicates); void Remove_From_Linked_List(t_ll *elem, void *val, t_ll **list); int Linked_List_Len(t_ll *list); void *Linked_List_Elem(int pos, t_ll *ll); void Randomize_Tree(t_tree *tree, int n_prune_regraft); t_ll *Get_List_Of_Reachable_Tips(t_node *a, t_node *d, t_tree *tree); void Get_List_Of_Reachable_Tips_Post(t_node *a, t_node *d, t_ll **list, t_tree *tree); phydbl Length_Of_Path_Between_List_Of_Tips(t_ll *tips0, t_ll *tips1, matrix *mat); void Set_Update_Eigen_Lr(int yn, t_tree *tree); void Set_Use_Eigen_Lr(int yn, t_tree *tree); void Random_Walk_Along_Tree_On_Radius(t_node *a, t_node *d, t_edge *b, phydbl *radius, t_edge **target_edge, t_node **target_nd, phydbl *target_time, t_tree *tree); void Table_Top(unsigned int width); void Table_Row(unsigned int width); void Table_Bottom(unsigned int width); t_cal *Duplicate_Calib(t_cal *from); t_clad *Duplicate_Clade(t_clad *from); void Swap_Partial_Lk_Extra(t_edge *b, t_node *d, int whichone, t_tree *tree); void Remove_Duplicates(calign *data, option *io, t_tree *tree); short int Are_Sequences_Identical(align *seq1, align *seq2); char *Mutation_Id(int mut_idx, t_tree *tree); void Random_Tax_Idx(t_node *a, t_node *d, int *idx, t_tree *tree); void List_Taxa_In_Clade(t_node *a, t_node *d, t_tree *tree); void Alias_Subpatt_Pre(t_node *a, t_node *d, t_tree *tree); void Alias_Subpatt_Post(t_node *a, t_node *d, t_tree *tree); void Alias_One_Subpatt(t_node *a, t_node *d, t_tree *tree); void Alias_Subpatt(t_tree *tree); void Map_Mutations(t_node *a, t_node *d, int sa, int sd, t_edge *b, int site, int rcat, int *muttype, phydbl *muttime, int *muttax, int *n_mut, t_tree *tree); void Set_Update_Eigen(int yesno, t_mod *mod); int *Order_Int(const int *u, const int n); int *Order_Dbl(const phydbl *u, const int n); char Integer_To_IUPAC_Code(int x); void Shuffle_Sites(const phydbl prop, align **data, const int n_otu); void Multiply_Scalar_Dbl(phydbl mult, scalar_dbl *x); void Insert_Duplicates(t_tree *tree); void Get_Node_Ranks_From_Dist_To_Root(t_tree *tree); void Get_Node_Ranks_From_Times(t_tree *tree); void Get_Node_Ranks_From_Tip_Times(t_tree *tree); phydbl Tree_Height(t_tree *tree); void Post_Inflate_Times_To_Get_Reasonnable_Edge_Lengths(t_node *a, t_node *d, t_edge *b, phydbl min_l, t_tree *tree); void Inflate_Times_To_Get_Reasonnable_Edge_Lengths(phydbl min_l, t_tree *tree); void Refactor_Tree(t_tree *tree); void Refactor_External(t_node *a, t_node *d, int *idx, t_tree *tree); void Refactor_Internal(t_node *a, t_node *d, t_edge *b, int *idx_nd, int *idx_br, t_tree *tree); int *Integer_To_Bit(int val, const int ns); char *Bit_To_Character_String(int *bit, int ns); t_tree *Duplicate_Tree(t_tree *ori); matrix *K80_dist(calign *data, phydbl g_shape); matrix *JC69_Dist(calign *data, t_mod *mod); matrix *Hamming_Dist(calign *data, t_mod *mod); phydbl Tree_Length(t_tree *tree); void Remove_Duplicates_From_Tree(calign *data, t_tree *tree); void Reset_Lk(t_tree *tree); void Set_Lk(t_tree *tree); void Reset_Prior(t_tree *tree); void Set_Prior(t_tree *tree); t_edge *Get_Edge(t_node *a, t_node *d, t_tree *tree); void Exchange_Nodes(t_node *a, t_node *d, t_node *w, t_node *v, t_tree *tree); void Init_T_Beg(t_tree *tree); void Set_Ignore_Root(int yesno, t_tree *tree); void Set_Bl_From_Rt(int yesno, t_tree *tree); void Replace_Short_With_Long_Tax_Names(t_tree *tree, option *io); void Convert_Lengths_From_Calendar_To_Substitutions(t_tree *tree); void Convert_Lengths_From_Calendar_To_Substitutions_Post(t_node *a, t_node *d, t_tree *tree); t_label *Get_Next_Label(t_label *curr_lab); int Scale_Subtree_Veloc(t_node *a, phydbl mult, int *n_nodes, int dim, t_tree *tree); int Scale_Subtree_Veloc_Post(t_node *a, t_node *d, phydbl mult, int *n_nodes, int dim, t_tree *tree); void Label_Edges(t_tree *tree); void Label_Nodes_With_Velocities(t_tree *tree); void Label_Nodes_With_Locations(t_tree *tree); void Edge_Labels_To_Rates(t_tree *tree); void Node_Labels_To_Velocities(t_tree *tree); void Node_Labels_To_Locations(t_tree *tree); int Add_Subtree_Veloc(t_node *a, phydbl add, int *n_nodes, int dim, t_tree *tree); int Add_Subtree_Veloc_Post(t_node *a, t_node *d, phydbl add, int *n_nodes, int dim, t_tree *tree); int Contmod_Start(short int datatype, short int dim_idx, t_tree *tree); t_ll *Get_Velocity_Targets(t_node *a, t_node *d, t_tree *tree); void Get_Velocity_Targets_Post(t_node *a, t_node *d, t_ll **list, t_tree *tree); char D_State_To_Character(int d_state, t_tree *tree); void ROC(phydbl *probs, short int *truth, int nclasses, int n_obs, phydbl *weights, char *tag, FILE *fp); phydbl AIC(t_tree *tree); phydbl BIC(t_tree *tree); void Set_Edge_Length_Optimizer(t_tree *tree); int Number_Of_Free_Params(t_tree *mixt_tree); #include "alrt.h" #include "ancestral.h" #include "bionj.h" #include "cv.h" #include "eigen.h" #include "evolve.h" #include "free.h" #include "help.h" #include "init.h" #include "io.h" #include "lk.h" #include "make.h" #include "mcmc.h" #include "models.h" #include "nexus.h" #include "optimiz.h" #include "pars.h" #include "simu.h" #include "spr.h" #include "stats.h" #include "xml.h" #include "m4.h" #ifdef GEO #include "geo.h" #endif #if (defined PHYREX || PHYREXSIM || TEST) #include "ibm.h" #include "iou.h" #include "iwn.h" #include "location.h" #include "phyrex.h" #include "rrw.h" #include "rw.h" #include "slfv.h" #include "velocity.h" #endif #ifdef MPI #include "mpi_boot.h" #endif #ifdef MG #include "mg.h" #endif #ifdef TIME #include "rates.h" #include "times.h" #endif #ifdef _NOT_NEEDED_A_PRIORI #include "m4.h" #endif #if (defined(__AVX__) || defined(__AVX2__)) #include "avx.h" #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__) || \ defined(__ARM_NEON)) #include "sse.h" #endif #endif stephaneguindon-phyml-76a39c8/src/velocity.c000066400000000000000000001071561501136442400212050ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "velocity.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { return(VELOC_Lk(NULL,tree)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// short int VELOC_Is_Integrated_Velocity(t_phyrex_mod *mod) { return(IWN_Is_Iwn(mod) || IBM_Is_Ibm(mod) || IOU_Is_Iou(mod)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Lk(t_node *z, t_tree *tree) { phydbl lnL_loc, lnL_veloc; RRW_Update_Normalization_Factor(tree); lnL_loc = UNLIKELY; lnL_veloc = UNLIKELY; lnL_loc = (tree->mmod->integrateAncestralLocations == NO) ? (VELOC_Augmented_Lk_Locations(z,tree)) : (VELOC_Integrated_Lk_Location(z,tree)); lnL_veloc = VELOC_Augmented_Lk_Velocity(z,tree); if(tree->mmod->print_lk == YES) { PhyML_Printf("\n. Sigsq: %f %f",tree->mmod->sigsq[0],tree->mmod->sigsq[1]); PhyML_Printf("\n. IBM locations: %f",lnL_loc); PhyML_Printf("\n. IBM velocities: %f",lnL_veloc); PhyML_Printf("\n. Sum: %f",lnL_loc + lnL_veloc); } return(lnL_loc + lnL_veloc); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Returns log[Pr(locations at all nodes | velocities at all nodes, tree)] */ phydbl VELOC_Augmented_Lk_Locations(t_node *z, t_tree *tree) { phydbl lnP,disk_lnP; t_dsk *disk; disk_lnP = 0.0; lnP = 0.0; disk = tree->young_disk; do { disk_lnP = VELOC_Augmented_Lk_Locations_Core(disk,tree); lnP += disk_lnP; disk = disk->prev; } while(disk); return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Augmented_Lk_Locations_Core(t_dsk *disk, t_tree *tree) { phydbl lnP; int i,err; phydbl root_mean,root_var; root_mean = 0.0; root_var = tree->mmod->rw_root_var[LOCATION]; assert(disk); if(disk == tree->young_disk) return 0.0; if(disk->age_fixed == YES) return 0.0; lnP = 0.0; if(disk->ldsk != NULL) { for(i=0;ildsk->n_next;++i) { lnP += VELOC_Locations_Forward_Lk_Path(disk->ldsk,disk->ldsk->next[i],tree); } if(disk->ldsk->prev == NULL) /* root node */ { for(i=0;immod->n_dim;++i) { root_mean = LOCATION_Mean_Lonlat(i,tree); lnP += Log_Dnorm(disk->ldsk->coord->lonlat[i],root_mean,sqrt(root_var),&err); /* Marginal density of location at root */ } } } return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Locations_Forward_Lk_Path(t_ldsk *a, t_ldsk *d, t_tree *tree) { t_ldsk *ldsk; phydbl lnP,ld,disk_lnP,var,dt,mean; int i,err; t_node *nd_d; assert(a != NULL); assert(d != NULL); lnP = 0.0; ldsk = d; while(ldsk->n_next == 1) ldsk = ldsk->next[0]; nd_d = ldsk->nd; ldsk = d; assert(a!=d); mean = var = -1.; dt = -1.; do { assert(ldsk->prev); disk_lnP = 0.0; for(i=0;immod->n_dim;++i) { /* dt = fabs(ldsk->disk->time-ldsk->prev->disk->time); */ /* mean = ldsk->prev->coord->lonlat[i] + dt*ldsk->prev->veloc->deriv[i]; */ /* sd = */ /* log(tree->mmod->sigsq[i]) + */ /* log(tree->mmod->sigsq_scale[nd_d->num]) + */ /* log(tree->mmod->sigsq_scale_norm_fact) + */ /* 3.*log(dt)- */ /* LOG3; */ mean = VELOC_Location_Mean_Along_Edge(nd_d,i,tree); var = VELOC_Location_Variance_Along_Edge(nd_d,i,tree); ld = ldsk->coord->lonlat[i]; disk_lnP += Log_Dnorm(ld,mean,sqrt(var),&err); if(tree->mmod->print_lk == YES) PhyML_Printf("\n. LOC %2d Time: %10f nd_d: %d sigsq: (%f,%f,%f) a->coord: %10f a->veloc: %10f mean: %10f var: %10f dt: %10f [%10f %10f] x: %10f lk: %10f", i, ldsk->disk->time, nd_d->num, tree->mmod->sigsq[i], tree->mmod->sigsq_scale[nd_d->num], tree->mmod->sigsq_scale_norm_fact, ldsk->prev->coord->lonlat[i], ldsk->prev->veloc->deriv[i], mean, var, dt, ldsk->disk->time,ldsk->prev->disk->time, ld, disk_lnP); if(isinf(lnP) || isnan(lnP)) return(UNLIKELY); if(isnan(lnP)) { PhyML_Printf("\n. ld=%f var=%f dt=[%f,%f] sigsq=%f",ld,var,ldsk->disk->time,ldsk->prev->disk->time,tree->mmod->sigsq); assert(FALSE); } } lnP += disk_lnP; ldsk = ldsk->prev; assert(ldsk); } while(ldsk != a); return(lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Returns log[Pr(velocities at all nodes | tree)] */ phydbl VELOC_Augmented_Lk_Velocity(t_node *z, t_tree *tree) { phydbl lnL; phydbl root_mean,root_var; int i,err,start; lnL = UNLIKELY; root_var = tree->mmod->rw_root_var[VELOCITY]; root_mean = tree->mmod->rw_root_mean[VELOCITY]; // PhyML_Printf("\n root mean: %f root_var: %f",root_mean,root_var); if(z == NULL) { Init_Contmod_Velocities(tree); RRW_Update_Normalization_Factor(tree); lnL = 0.0; VELOC_Augmented_Lk_Velocity_Post(NULL,tree->n_root,tree); if(tree->contmod->both_sides[VELOCITY] == YES) { VELOC_Augmented_Lk_Velocity_Pre(tree->n_root,tree->n_root->v[1],tree); VELOC_Augmented_Lk_Velocity_Pre(tree->n_root,tree->n_root->v[2],tree); } for(i=0;immod->n_dim;++i) { start = Contmod_Start(VELOCITY,i,tree); tree->contmod->lnL[VELOCITY*tree->mmod->n_dim+i] = tree->contmod->lnL_down[start + tree->n_root->num]; tree->contmod->lnL[VELOCITY*tree->mmod->n_dim+i] += Log_Dnorm(tree->n_root->ldsk->veloc->deriv[i], root_mean, sqrt(root_var), &err); lnL += tree->contmod->lnL[VELOCITY*tree->mmod->n_dim+i]; } } else { lnL = 0.0; for(i=0;immod->n_dim;++i) { start = Contmod_Start(VELOCITY,i,tree); tree->contmod->lnL[VELOCITY * tree->mmod->n_dim + i] = tree->contmod->lnL_down[start + z->num]; tree->contmod->lnL[VELOCITY * tree->mmod->n_dim + i] += tree->contmod->lnL_up[start + z->num]; if (z == tree->n_root) tree->contmod->lnL[VELOCITY * tree->mmod->n_dim + i] += Log_Dnorm(z->ldsk->veloc->deriv[i], root_mean, sqrt(root_var), &err); else tree->contmod->lnL[VELOCITY * tree->mmod->n_dim + i] += Log_Dnorm(z->ldsk->veloc->deriv[i], VELOC_Velocity_Mean_Along_Edge(z, i, tree), sqrt(VELOC_Velocity_Variance_Along_Edge(z, i, tree)), &err); // if(z != tree->n_root) tree->contmod->lnL[VELOCITY*tree->mmod->n_dim+i] += tree->contmod->lnL_up[start + z->num]; // tree->contmod->lnL[VELOCITY*tree->mmod->n_dim+i] += Log_Dnorm(z->ldsk->veloc->deriv[i], // root_mean, // sqrt(root_var), // &err); lnL += tree->contmod->lnL[VELOCITY*tree->mmod->n_dim+i]; } } return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Augmented_Lk_Velocity_Post(t_node *a, t_node *d, t_tree *tree) { int i; if(d->tax == TRUE) return; else { for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { VELOC_Augmented_Lk_Velocity_Post(d,d->v[i],tree); } } VELOC_Update_Lk_Velocity_Down(a,d,tree); } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Augmented_Lk_Velocity_Pre(t_node *a, t_node *d, t_tree *tree) { int i; if(d == tree->n_root) { VELOC_Augmented_Lk_Velocity_Pre(tree->n_root,tree->n_root->v[1],tree); VELOC_Augmented_Lk_Velocity_Pre(tree->n_root,tree->n_root->v[2],tree); return; } VELOC_Update_Lk_Velocity_Up(a,d,tree); if(d->tax == TRUE) return; else { for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { VELOC_Augmented_Lk_Velocity_Pre(d,d->v[i],tree); } } } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Update_Lk_Velocity_Up(t_node *a, t_node *d, t_tree *tree) { int i,start,err; t_node *dad, *son, *bro; dad = a; son = d; bro = NULL; for(i=0;i<3;++i) if(a->v[i] != d && a->v[i] != a->anc && a->b[i] != tree->e_root) { bro = a->v[i]; break; } assert(bro->anc == dad); assert(son->anc == dad); assert(bro != son); for(i=0;immod->n_dim;++i) { start = Contmod_Start(VELOCITY,i,tree); tree->contmod->lnL_up[start+son->num] = tree->contmod->lnL_up[start+dad->num] + tree->contmod->lnL_down[start+bro->num] ; tree->contmod->lnL_up[start+son->num] += Log_Dnorm(bro->ldsk->veloc->deriv[i],VELOC_Velocity_Mean_Along_Edge(bro,i,tree),sqrt(VELOC_Velocity_Variance_Along_Edge(bro,i,tree)),&err); if (dad != tree->n_root) tree->contmod->lnL_up[start + son->num] += Log_Dnorm(dad->ldsk->veloc->deriv[i], VELOC_Velocity_Mean_Along_Edge(dad, i, tree), sqrt(VELOC_Velocity_Variance_Along_Edge(dad, i, tree)), &err); else tree->contmod->lnL_up[start + son->num] += Log_Dnorm(dad->ldsk->veloc->deriv[i], tree->mmod->rw_root_mean[VELOCITY], sqrt(tree->mmod->rw_root_var[VELOCITY]), &err); // tree->contmod->lnL_up[start+son->num] += // -Log_Dnorm(son->ldsk->veloc->deriv[i],tree->mmod->rw_root_mean[VELOCITY],sqrt(tree->mmod->rw_root_var[VELOCITY]),&err) + // Log_Dnorm(dad->ldsk->veloc->deriv[i],tree->mmod->rw_root_mean[VELOCITY],sqrt(tree->mmod->rw_root_var[VELOCITY]),&err); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Update_Lk_Velocity_Down(t_node *a, t_node *d, t_tree *tree) { int i,start,err; t_node *son, *bro, *dad; if(d->tax == YES) return; dad = d; son = bro = NULL; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(son == NULL) son = d->v[i]; else bro = d->v[i]; } } for(i=0;immod->n_dim;++i) { start = Contmod_Start(VELOCITY,i,tree); tree->contmod->lnL_down[start+dad->num] = tree->contmod->lnL_down[start+son->num] + tree->contmod->lnL_down[start+bro->num] ; tree->contmod->lnL_down[start+dad->num] += Log_Dnorm(son->ldsk->veloc->deriv[i],VELOC_Velocity_Mean_Along_Edge(son,i,tree),sqrt(VELOC_Velocity_Variance_Along_Edge(son,i,tree)),&err) + Log_Dnorm(bro->ldsk->veloc->deriv[i],VELOC_Velocity_Mean_Along_Edge(bro,i,tree),sqrt(VELOC_Velocity_Variance_Along_Edge(bro,i,tree)),&err); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Integrated_Lk_Location(t_node *z, t_tree *tree) { phydbl lnL; lnL = UNLIKELY; if(z == NULL) { phydbl root_mean,root_var; int i,err,start; RRW_Update_Normalization_Factor(tree); Init_Contmod_Locations(tree); lnL = 0.0; VELOC_Integrated_Lk_Location_Post(NULL,tree->n_root,tree); if(tree->contmod->both_sides[LOCATION] == YES) { VELOC_Integrated_Lk_Location_Pre(tree->n_root,tree->n_root->v[1],tree); VELOC_Integrated_Lk_Location_Pre(tree->n_root,tree->n_root->v[2],tree); } for(i=0;immod->n_dim;++i) { root_var = tree->mmod->rw_root_var[LOCATION]; root_mean = LOCATION_Mean_Lonlat(i,tree); start = Contmod_Start(LOCATION,i,tree); tree->contmod->lnL[LOCATION*tree->mmod->n_dim+i] = 0.0; tree->contmod->lnL[LOCATION*tree->mmod->n_dim+i] += tree->contmod->logrem_down[start + tree->n_root->num]; tree->contmod->lnL[LOCATION*tree->mmod->n_dim+i] += Log_Dnorm(tree->contmod->mu_down[start + tree->n_root->num], root_mean, sqrt(root_var+tree->contmod->var_down[start + tree->n_root->num]), &err); lnL += tree->contmod->lnL[LOCATION * tree->mmod->n_dim + i]; } } else { lnL = VELOC_Integrated_Lk_Location_Node(z,tree); } return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Integrated_Lk_Location_Node(t_node *z, t_tree *tree) { phydbl lnL; int i,start,err; phydbl z_mean_down, z_mean_up; phydbl z_var_down, z_var_up; phydbl z_logrem_down, z_logrem_up; lnL = 0.0; for(i=0;immod->n_dim;++i) { start = Contmod_Start(LOCATION,i,tree); z_mean_down = tree->contmod->mu_down[start+z->num]; z_var_down = tree->contmod->var_down[start+z->num]; z_logrem_down = tree->contmod->logrem_down[start+z->num]; if(z == tree->n_root) { z_mean_up = LOCATION_Mean_Lonlat(i,tree); z_var_up = tree->mmod->rw_root_var[LOCATION]; z_logrem_up = 0.0; } else { z_mean_up = tree->contmod->mu_up[start+z->num]; z_var_up = tree->contmod->var_up[start+z->num]; z_logrem_up = tree->contmod->logrem_up[start+z->num]; } tree->contmod->lnL[LOCATION*tree->mmod->n_dim+i] = 0.0; tree->contmod->lnL[LOCATION*tree->mmod->n_dim+i] += z_logrem_down + z_logrem_up; tree->contmod->lnL[LOCATION*tree->mmod->n_dim+i] += Log_Dnorm(z_mean_down,z_mean_up,sqrt(z_var_up+z_var_down),&err); lnL += tree->contmod->lnL[LOCATION*tree->mmod->n_dim+i]; } return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // See Pybus et al. 10.1073/pnas.1206598109 + see my technical notes void VELOC_Integrated_Lk_Location_Post(t_node *a, t_node *d, t_tree *tree) { if(d->tax == TRUE) return; else { int i; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { VELOC_Integrated_Lk_Location_Post(d,d->v[i],tree); } } VELOC_Update_Lk_Location_Down(a,d,tree); } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Integrated_Lk_Location_Pre(t_node *a, t_node *d, t_tree *tree) { int i; if(d == tree->n_root) { VELOC_Integrated_Lk_Location_Pre(tree->n_root,tree->n_root->v[1],tree); VELOC_Integrated_Lk_Location_Pre(tree->n_root,tree->n_root->v[2],tree); return; } VELOC_Update_Lk_Location_Up(a,d,tree); if(d->tax == TRUE) return; else { for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { VELOC_Integrated_Lk_Location_Pre(d,d->v[i],tree); } } } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Update_Lk_Location_Up(t_node *a, t_node *d, t_tree *tree) { int i,start; t_node *dad, *son, *bro; phydbl dad_mu_up, dad_var_up, dad_logrem_up; phydbl son_a, son_b, son_var; phydbl bro_a, bro_b, bro_mu_down, bro_var_down, bro_var, bro_logrem_down; dad = a; son = d; bro = NULL; for(i=0;i<3;++i) if(a->v[i] != d && a->v[i] != a->anc && a->b[i] != tree->e_root) { bro = a->v[i]; break; } assert(bro->anc == dad); assert(bro != son); for(i=0;immod->n_dim;++i) { start = Contmod_Start(LOCATION,i,tree); bro_mu_down = tree->contmod->mu_down[start+bro->num]; bro_var_down = tree->contmod->var_down[start+bro->num]; bro_logrem_down = tree->contmod->logrem_down[start+bro->num]; bro_var = VELOC_Location_Variance_Along_Edge(bro,i,tree); son_var = VELOC_Location_Variance_Along_Edge(son,i,tree); son_a = 1.0; bro_a = 1.0; // dad->ldsk->coord->lonlat[i] is not involved here as it appears in VELOC_Location_Mean_Along_Edge and is subtracted below // Only true if son_a (son_b) = 1.0 bro_b = VELOC_Location_Mean_Along_Edge(bro, i, tree) - bro_a * dad->ldsk->coord->lonlat[i]; son_b = VELOC_Location_Mean_Along_Edge(son, i, tree) - son_a * dad->ldsk->coord->lonlat[i]; if(dad != tree->n_root) { dad_mu_up = tree->contmod->mu_up[start+dad->num]; dad_var_up = tree->contmod->var_up[start+dad->num]; dad_logrem_up = tree->contmod->logrem_up[start+dad->num]; } else { dad_mu_up = LOCATION_Mean_Lonlat(i,tree); dad_var_up = tree->mmod->rw_root_var[LOCATION]; dad_logrem_up = 0.0; } if(IBM_Is_Ibm(tree->mmod) == YES) { IBM_Integrated_Location_Up(dad_mu_up,dad_var_up,dad_logrem_up, son_a,son_b,son_var, bro_a,bro_b,bro_mu_down,bro_var_down,bro_var,bro_logrem_down, tree->contmod->mu_up+start+son->num, tree->contmod->var_up+start+son->num, tree->contmod->logrem_up+start+son->num); } else if(IWN_Is_Iwn(tree->mmod) == YES) { PhyML_Printf("\n. Not implemented yet"); assert(false); } else if(IOU_Is_Iou(tree->mmod) == YES) { IOU_Integrated_Location_Up(dad_mu_up,dad_var_up,dad_logrem_up, son_a,son_b,son_var, bro_a,bro_b,bro_mu_down,bro_var_down,bro_var,bro_logrem_down, tree->contmod->mu_up+start+son->num, tree->contmod->var_up+start+son->num, tree->contmod->logrem_up+start+son->num); } assert(isnan(tree->contmod->logrem_up[start+d->num]) == NO); assert(isnan(tree->contmod->mu_up[start+d->num]) == NO); assert(isnan(tree->contmod->var_up[start+d->num]) == NO && !(tree->contmod->var_up[start+d->num] < 0.0)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Update_Lk_Location_Down(t_node *a, t_node *d, t_tree *tree) { int i,start; t_node *son, *bro, *dad; phydbl son_mu_down,bro_mu_down; phydbl son_var_down,bro_var_down; phydbl son_var,bro_var; phydbl son_logrem_down,bro_logrem_down; phydbl son_a, bro_a; phydbl son_b, bro_b; if(d->tax) return; dad = d; son = bro = NULL; for(i=0;i<3;++i) { if(d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) { if(son == NULL) son = d->v[i]; else bro = d->v[i]; } } for(i=0;immod->n_dim;++i) { start = Contmod_Start(LOCATION,i,tree); son_mu_down = tree->contmod->mu_down[start + son->num]; bro_mu_down = tree->contmod->mu_down[start + bro->num]; son_var_down = tree->contmod->var_down[start + son->num]; bro_var_down = tree->contmod->var_down[start + bro->num]; son_logrem_down = tree->contmod->logrem_down[start + son->num]; bro_logrem_down = tree->contmod->logrem_down[start + bro->num]; son_var = VELOC_Location_Variance_Along_Edge(son,i,tree); bro_var = VELOC_Location_Variance_Along_Edge(bro,i,tree); son_a = 1.0; bro_a = 1.0; // dad->ldsk->coord->lonlat[i] is not involved here as it appears in VELOC_Location_Mean_Along_Edge and is subtracted below // Only true if son_a (son_b) = 1.0 son_b = VELOC_Location_Mean_Along_Edge(son, i, tree) - son_a * dad->ldsk->coord->lonlat[i]; bro_b = VELOC_Location_Mean_Along_Edge(bro, i, tree) - bro_a * dad->ldsk->coord->lonlat[i]; if(IBM_Is_Ibm(tree->mmod) == YES) { IBM_Integrated_Location_Down(son_a,son_b,son_mu_down,son_var_down,son_var, bro_a,bro_b,bro_mu_down,bro_var_down,bro_var, son_logrem_down,bro_logrem_down, tree->contmod->mu_down+start+dad->num, tree->contmod->var_down+start+dad->num, tree->contmod->logrem_down+start+dad->num); } else if(IWN_Is_Iwn(tree->mmod) == YES) { PhyML_Printf("\n. Not implemented yet"); assert(false); } else if(IOU_Is_Iou(tree->mmod) == YES) { IOU_Integrated_Location_Down(son_a,son_b,son_mu_down,son_var_down,son_var, bro_a,bro_b,bro_mu_down,bro_var_down,bro_var, son_logrem_down,bro_logrem_down, tree->contmod->mu_down+start+dad->num, tree->contmod->var_down+start+dad->num, tree->contmod->logrem_down+start+dad->num); } // PhyML_Printf("\n. node %d mu_down: %g var_down: %g logrem_down: %g", dad->num, tree->contmod->mu_down[start+dad->num], tree->contmod->var_down[start+dad->num], tree->contmod->logrem_down[start+dad->num]); assert(isnan(tree->contmod->logrem_down[start+dad->num]) == NO); assert(isnan(tree->contmod->mu_down[start+dad->num]) == NO); assert(isnan(tree->contmod->var_down[start+dad->num]) == NO && !(tree->contmod->var_down[start+dad->num] < 0.0)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Velocity_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree) { if(IBM_Is_Ibm(tree->mmod) == YES) { return(IBM_Velocity_Variance_Along_Edge(d,dim,tree)); } else if(IWN_Is_Iwn(tree->mmod) == YES) { return(IWN_Velocity_Variance_Along_Edge(d,dim,tree)); } else if(IOU_Is_Iou(tree->mmod) == YES) { return(IOU_Velocity_Variance_Along_Edge(d,dim,tree)); } else assert(false); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree) { if(IBM_Is_Ibm(tree->mmod) == YES) { return(IBM_Location_Variance_Along_Edge(d,dim,tree)); } else if(IWN_Is_Iwn(tree->mmod) == YES) { return(IWN_Location_Variance_Along_Edge(d,dim,tree)); } else if(IOU_Is_Iou(tree->mmod) == YES) { return(IOU_Location_Variance_Along_Edge(d,dim,tree)); } else assert(false); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Velocity_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree) { if(IBM_Is_Ibm(tree->mmod) == YES) { return(IBM_Velocity_Mean_Along_Edge(d,dim,tree)); } else if(IWN_Is_Iwn(tree->mmod) == YES) { return(IWN_Velocity_Mean_Along_Edge(d,dim,tree)); } else if(IOU_Is_Iou(tree->mmod) == YES) { return(IOU_Velocity_Mean_Along_Edge(d,dim,tree)); } else assert(false); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Location_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree) { if(IBM_Is_Ibm(tree->mmod) == YES) { return(IBM_Location_Mean_Along_Edge(d,dim,tree)); } else if(IWN_Is_Iwn(tree->mmod) == YES) { return(IWN_Location_Mean_Along_Edge(d,dim,tree)); } else if(IOU_Is_Iou(tree->mmod) == YES) { return(IOU_Location_Mean_Along_Edge(d,dim,tree)); } else assert(false); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Sample_Node_Locations_Marginal(t_tree *tree) { int i; if (tree->mmod->do_location_sampling == NO) return; RRW_Update_Normalization_Factor(tree); VELOC_Integrated_Lk_Location_Post(NULL, tree->n_root, tree); VELOC_Integrated_Lk_Location_Pre(tree->n_root, tree->n_root->v[1], tree); VELOC_Integrated_Lk_Location_Pre(tree->n_root, tree->n_root->v[2], tree); for (i = tree->n_otu; i < 2 * tree->n_otu - 1; ++i) VELOC_Sample_One_Node_Location(tree->a_nodes[i], tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Sample_One_Node_Location(t_node *z, t_tree *tree) { int i,start; phydbl var_down,var_up; phydbl mu_down,mu_up; phydbl var,mean; for(i=0;immod->n_dim;++i) { start = Contmod_Start(LOCATION,i,tree); var = mean = -1.; mu_down = tree->contmod->mu_down[start+z->num]; var_down = tree->contmod->var_down[start+z->num]; if(z != tree->n_root) { mu_up = tree->contmod->mu_up[start+z->num]; var_up = tree->contmod->var_up[start+z->num]; } else { mu_up = LOCATION_Mean_Lonlat(i,tree); var_up = tree->mmod->rw_root_var[LOCATION]; } if(var_up > SMALL && var_down > SMALL) { var = 1./var_up + 1./var_down; var = 1./var; mean = var * (mu_down / var_down + mu_up / var_up); } else if(var_up > SMALL) { var = 0.0; mean = mu_down; } else if(var_down > SMALL) { var = 0.0; mean = mu_up; } else { var = 0.0; mean = mu_down; } assert(isnan(mean) == NO); assert(isnan(var) == NO); z->ldsk->coord->lonlat[i] = Rnorm(mean,sqrt(var)); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Sample_Node_Locations_Joint(t_tree *tree) { int i,start; phydbl root_var, root_mean, var, mean; if (tree->mmod->do_location_sampling == NO) return; root_var = tree->mmod->rw_root_var[LOCATION]; root_mean = -BIG; RRW_Update_Normalization_Factor(tree); Init_Contmod_Locations(tree); VELOC_Integrated_Lk_Location_Post(NULL, tree->n_root, tree); for(i=0;immod->n_dim;++i) { start = Contmod_Start(LOCATION, i, tree); root_mean = LOCATION_Mean_Lonlat(i, tree); if (tree->contmod->var_down[start + tree->n_root->num] > SMALL) { var = 1. / tree->contmod->var_down[start + tree->n_root->num] + 1. / root_var; var = 1. / var; mean = (tree->contmod->mu_down[start + tree->n_root->num] / tree->contmod->var_down[start + tree->n_root->num] + root_mean / root_var) * var; } else { var = 0.0; mean = tree->contmod->mu_down[start + tree->n_root->num]; } tree->n_root->ldsk->coord->lonlat[i] = Rnorm(mean,sqrt(var)); assert(isnan(mean) == NO); assert(isnan(var) == NO); assert(isinf(mean) == NO); assert(isinf(var) == NO); assert(isnan(tree->contmod->var_down[start + tree->n_root->num]) == NO); } VELOC_Sample_Node_Locations_Joint_Post(tree->n_root, tree->n_root->v[1], tree); VELOC_Sample_Node_Locations_Joint_Post(tree->n_root, tree->n_root->v[2], tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Sample_Node_Locations_Joint_Post(t_node *a, t_node *d, t_tree *tree) { if(d->tax == TRUE) return; else { int start, i; phydbl son_a, son_b, son_var, son_var_down, son_mu, son_mu_down, var, mean; t_node *son, *dad; for (int i = 0; i < 3; ++i) if (d->v[i] != a && !(a == tree->n_root && d->b[i] == tree->e_root)) VELOC_Sample_Node_Locations_Joint_Post(d, d->v[i], tree); son = d; dad = a; for (i = 0; i < tree->mmod->n_dim; ++i) { start = Contmod_Start(LOCATION, i, tree); son_a = 1.0; son_b = VELOC_Location_Mean_Along_Edge(son, i, tree) - son_a * dad->ldsk->coord->lonlat[i]; son_var = VELOC_Location_Variance_Along_Edge(d, i, tree); son_var_down = tree->contmod->var_down[start + d->num]; son_mu = son_a * a->ldsk->coord->lonlat[i] + son_b; son_mu_down = tree->contmod->mu_down[start + d->num]; if (son_var > SMALL && son_var_down > SMALL) { var = 1. / son_var + 1. / son_var_down; var = 1. / var; mean = (son_mu_down / son_var_down + son_mu / son_var) * var; } else if (son_var_down > SMALL) { var = 0.0; mean = son_mu; } else if (son_var > SMALL) { var = 0.0; mean = son_mu_down; } else { var = 0.0; mean = son_mu; } assert(!(var < 0.0)); assert(isnan(mean) == NO); assert(isnan(var) == NO); assert(isinf(mean) == NO); assert(isinf(var) == NO); d->ldsk->coord->lonlat[i] = Rnorm(mean, sqrt(var)); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Mean_Velocity(short int dim, t_tree *tree) { if(VELOC_Is_Integrated_Velocity(tree->mmod) == NO) return(-1); else { int i; phydbl mean; mean = 0.0; for(i=0;i<2*tree->n_otu-1;++i) mean += tree->a_nodes[i]->ldsk->veloc->deriv[dim]; return(mean / (phydbl)(2*tree->n_otu-1)); } return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Take the average of speed taken at each node of the treez */ phydbl VELOC_Mean_Speed(t_tree *tree) { if(VELOC_Is_Integrated_Velocity(tree->mmod) == NO) return(-1); else { int i; phydbl mean_speed; mean_speed = 0.0; for(i=0;i<2*tree->n_otu-1;++i) mean_speed += VELOC_Veloc_To_Speed(tree->a_nodes[i]->ldsk->veloc,tree); return(mean_speed / (phydbl)(2*tree->n_otu-1)); // for(i=0;in_otu;++i) mean_speed += VELOC_Veloc_To_Speed(tree->a_nodes[i]->ldsk->veloc,tree); // return(mean_speed / (phydbl)(tree->n_otu)); } return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl VELOC_Veloc_To_Speed(t_geo_veloc *v, t_tree *tree) { t_geo_coord *p1,*p2; int i; phydbl speed; p1 = GEO_Make_Geo_Coord(tree->mmod->n_dim); GEO_Init_Coord(p1,tree->mmod->n_dim); for(i=0;immod->n_dim;++i) p1->lonlat[i] = 0.0; p2 = GEO_Make_Geo_Coord(tree->mmod->n_dim); GEO_Init_Coord(p2,tree->mmod->n_dim); for(i=0;immod->n_dim;++i) p2->lonlat[i] = v->deriv[i]; speed = -1.0; switch(tree->mmod->dist_type) { case HAVERSINE : { speed = Haversine_Distance(p1,p2); break; } case EUCLIDEAN : { speed = Euclidean_Distance(p1,p2); break; } case MANHATTAN : { speed = Manhattan_Distance(p1,p2); break; } default : assert(false); } Free_Geo_Coord(p1); Free_Geo_Coord(p2); return(speed); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl PHYREX_Degrees_To_Km(phydbl deg, t_tree *tree) { t_geo_coord *p1,*p2; phydbl km; p1 = GEO_Make_Geo_Coord(1); GEO_Init_Coord(p1,1); p1->lonlat[0] = 0.0; p2 = GEO_Make_Geo_Coord(1); GEO_Init_Coord(p2,1); p2->lonlat[0] = fabs(deg); km = -1.0; switch(tree->mmod->dist_type) { case HAVERSINE : { km = Haversine_Distance(p1,p2); break; } case EUCLIDEAN : { km = Euclidean_Distance(p1,p2); break; } case MANHATTAN : { km = Manhattan_Distance(p1,p2); break; } default : assert(false); } Free_Geo_Coord(p1); Free_Geo_Coord(p2); return(km); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* WARNING : Code below only works for IBM model */ void VELOC_Simulate_Velocities(t_tree *tree) { phydbl root_mean,root_var; root_mean = 0.0; root_var = 100; for(int i=0;immod->n_dim;++i) tree->n_root->ldsk->veloc->deriv[i] = Rnorm(root_mean,sqrt(root_var)); VELOC_Simulate_Velocities_Pre(tree->n_root->ldsk,tree->n_root->ldsk->next[0],tree); VELOC_Simulate_Velocities_Pre(tree->n_root->ldsk,tree->n_root->ldsk->next[1],tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void VELOC_Simulate_Velocities_Pre(t_ldsk *a, t_ldsk *d, t_tree *tree) { phydbl mean,var; int i; for(i=0;immod->n_dim;++i) { mean = a->veloc->deriv[i]; var = fabs(a->disk->time - d->disk->time) * tree->mmod->sigsq[i]; d->veloc->deriv[i] = Rnorm(mean,sqrt(var)); } if(d->nd->tax) return; else { for(i=0;in_next;++i) VELOC_Simulate_Velocities_Pre(d,d->next[i],tree); } } stephaneguindon-phyml-76a39c8/src/velocity.h000066400000000000000000000055171501136442400212100ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef VELOC_H #define VELOC_H #include "utilities.h" phydbl VELOC_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree); short int VELOC_Is_Integrated_Velocity(t_phyrex_mod *mod); phydbl VELOC_Lk(t_node *z, t_tree *tree); phydbl VELOC_Augmented_Lk_Locations(t_node *z, t_tree *tree); phydbl VELOC_Augmented_Lk_Locations_Core(t_dsk *disk, t_tree *tree); phydbl VELOC_Locations_Forward_Lk_Path(t_ldsk *a, t_ldsk *d, t_tree *tree); phydbl VELOC_Augmented_Lk_Velocity(t_node *z, t_tree *tree); phydbl VELOC_Augmented_Lk_Velocities_Core(t_dsk *disk, t_tree *tree); phydbl VELOC_Velocities_Forward_Lk_Path(t_ldsk *a, t_ldsk *d, t_tree *tree); void VELOC_Augmented_Lk_Velocity_Pre(t_node *a, t_node *d, t_tree *tree); void VELOC_Augmented_Lk_Velocity_Post(t_node *a, t_node *d, t_tree *tree); phydbl VELOC_Integrated_Lk_Location(t_node *z, t_tree *tree); void VELOC_Integrated_Lk_Location_Post(t_node *a, t_node *d, t_tree *tree); void VELOC_Integrated_Lk_Location_Pre(t_node *a, t_node *d, t_tree *tree); phydbl VELOC_Integrated_Lk_Location_Node(t_node *z, t_tree *tree); phydbl VELOC_Velocity_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl VELOC_Location_Variance_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl VELOC_Velocity_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree); phydbl VELOC_Location_Mean_Along_Edge(t_node *d, short int dim, t_tree *tree); void VELOC_Sample_Node_Locations_Marginal(t_tree *tree); void VELOC_Sample_One_Node_Location(t_node *z, t_tree *tree); void VELOC_Sample_Node_Locations_Joint(t_tree *tree); void VELOC_Sample_Node_Locations_Joint_Post(t_node *a, t_node *d, t_tree *tree); void VELOC_Integrated_Lk_Velocity_Post(t_node *a, t_node *d, short int dim, t_tree *tree, short int print); void VELOC_Integrated_Lk_Velocity_Pre(t_node *a, t_node *d, short int dim, t_tree *tree); void VELOC_Veloc_Gibbs_Mean_Var(t_node *n, phydbl *mean, phydbl *var, short int dim, t_tree *tree); phydbl VELOC_Mean_Speed(t_tree *tree); phydbl VELOC_Veloc_To_Speed(t_geo_veloc *v, t_tree *tree); phydbl VELOC_Mean_Velocity(short int dim, t_tree *tree); phydbl PHYREX_Degrees_To_Km(phydbl deg, t_tree *tree); void VELOC_Simulate_Velocities(t_tree *tree); void VELOC_Simulate_Velocities_Pre(t_ldsk *a, t_ldsk *d, t_tree *tree); void VELOC_Update_Lk_Location_Up(t_node *a, t_node *d, t_tree *tree); void VELOC_Update_Lk_Location_Down(t_node *a, t_node *d, t_tree *tree); void VELOC_Update_Lk_Velocity_Up(t_node *a, t_node *d, t_tree *tree); void VELOC_Update_Lk_Velocity_Down(t_node *a, t_node *d, t_tree *tree); #endif stephaneguindon-phyml-76a39c8/src/xml.c000066400000000000000000002321601501136442400201410ustar00rootroot00000000000000#include "xml.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *XML_Process_Base(char *xml_filename) { FILE *fp; xml_node *root, *p_elem, *m_elem, *parent, *instance; option *io; void *buff; t_mod *mod, *iomod; t_tree *tree, *mixt_tree, *root_tree; int select; char *component; int i, j, n_components; int first_m_elem; int class_number; scalar_dbl **lens, **lens_var, **ori_lens, **lens_old, **lens_var_old, **ori_lens_old, **ori_lens_var, **ori_lens_var_old; t_ds *ds; char *outputfile; char *alignment; char *s; int lens_size; int first; int *class_num; int n_partitionelem; fp = fopen(xml_filename, "r"); if (!fp) { PhyML_Fprintf(stderr, "\n. Could not find the XML file '%s'.\n", xml_filename); Exit("\n"); } root = XML_Load_File(fp); if (!root) { PhyML_Fprintf(stderr, "\n. Encountered an issue while loading the XML file.\n"); Exit("\n"); } class_num = (int *)mCalloc(N_MAX_MIXT_CLASSES, sizeof(int)); for (i = 0; i < N_MAX_MIXT_CLASSES; i++) class_num[i] = i; component = (char *)mCalloc(T_MAX_NAME, sizeof(char)); m_elem = NULL; p_elem = root; io = NULL; mixt_tree = NULL; root_tree = NULL; mod = NULL; tree = NULL; lens = NULL; lens_var = NULL; lens_old = NULL; lens_var_old = NULL; select = -1; class_number = -1; ds = NULL; lens_size = 0; ori_lens = NULL; ori_lens_old = NULL; ori_lens_var = NULL; ori_lens_var_old = NULL; first = YES; // Make sure there are no duplicates in node's IDs XML_Check_Duplicate_ID(root); int count = 0; XML_Count_Number_Of_Node_With_Name("topology", &count, root); if (count > 1) { PhyML_Fprintf(stderr, "\n. There should not more than one 'topology' node."); PhyML_Fprintf(stderr, "\n. Found %d. Please fix your XML file", count); Exit("\n"); } else if (count < 1) { PhyML_Fprintf(stderr, "\n. There should be at least one 'topology' node."); PhyML_Fprintf(stderr, "\n. Found none. Please fix your XML file"); Exit("\n"); } #if defined PHYML p_elem = XML_Search_Node_Name("phyml", NO, p_elem); #elif defined PHYTIME p_elem = XML_Search_Node_Name("phytime", NO, p_elem); #endif if (!p_elem) { #if defined PHYML PhyML_Fprintf(stderr, "\n. The 'phyml' tag is mandatory."); #elif defined PHYTIME PhyML_Fprintf(stderr, "\n. The 'phytime' tag is mandatory."); #endif PhyML_Fprintf(stderr, "\n. Please amend your XML file accordingly."); assert(false); } /*! Input file */ outputfile = XML_Get_Attribute_Value(p_elem, "output.file"); if (!outputfile || !(strlen(outputfile) > 0)) { #if defined PHYML PhyML_Fprintf( stderr, "\n. The 'outputfile' attribute in 'phyml' tag is mandatory."); #elif defined PHYTIME PhyML_Fprintf( stderr, "\n. The 'outputfile' attribute in 'phytime' tag is mandatory."); #endif PhyML_Fprintf(stderr, "\n. Please amend your XML file accordingly."); assert(false); } io = (option *)Make_Input(); Set_Defaults_Input(io); s = XML_Get_Attribute_Value(p_elem, "run.id"); if (s && strlen(s) > 0) { io->append_run_ID = YES; strcpy(io->run_id_string, s); } s = XML_Get_Attribute_Value(p_elem, "r.seed"); if (s && strlen(s) > 0) io->r_seed = (int)atoi(s); strcpy(io->out_file, outputfile); strcpy(io->out_tree_file, outputfile); strcpy(io->out_stats_file, outputfile); #if defined(PHYTIME) strcat(io->out_tree_file, "_phytime_tree"); #elif defined(PHYREX) strcat(io->out_tree_file, "_phyrex_tree"); #elif defined(PHYML) strcat(io->out_tree_file, "_phyml_tree"); #endif #if defined(PHYTIME) strcat(io->out_stats_file, "_phytime_stats"); #elif defined(PHYREX) strcat(io->out_stats_file, "_phyrex_stats"); #elif defined(PHYML) strcat(io->out_stats_file, "_phyml_stats"); #endif if (io->append_run_ID) { strcat(io->out_tree_file, "_"); strcat(io->out_tree_file, io->run_id_string); } if (io->append_run_ID) { strcat(io->out_stats_file, "_"); strcat(io->out_stats_file, io->run_id_string); } strcat(io->out_stats_file, ".txt"); strcat(io->out_tree_file, ".txt"); if (XML_Search_Node_Attribute_Value("add", "true", NO, root) != NULL) { io->fp_out_tree = Openfile(io->out_tree_file, APPEND); io->fp_out_stats = Openfile(io->out_stats_file, APPEND); } else { io->fp_out_tree = Openfile(io->out_tree_file, WRITE); io->fp_out_stats = Openfile(io->out_stats_file, WRITE); } s = XML_Get_Attribute_Value(p_elem, "print.trace"); if (s) { select = XML_Validate_Attr_Int(s, 6, "true", "yes", "y", "false", "no", "n"); if (select < 3) { io->print_trace = YES; strcpy(io->out_trace_file, outputfile); strcat(io->out_trace_file, "_phyml_trace"); if (io->append_run_ID) { strcat(io->out_trace_file, "_"); strcat(io->out_trace_file, io->run_id_string); } strcat(io->out_trace_file, ".txt"); io->fp_out_trace = Openfile(io->out_trace_file, 1); } } s = XML_Get_Attribute_Value(p_elem, "print.json.trace"); if (s) { select = XML_Validate_Attr_Int(s, 6, "true", "yes", "y", "false", "no", "n"); if (select < 3) { io->print_json_trace = YES; strcpy(io->out_json_trace_file, outputfile); strcat(io->out_json_trace_file, "_phyml_trace"); if (io->append_run_ID) { strcat(io->out_json_trace_file, "_"); strcat(io->out_json_trace_file, io->run_id_string); } strcat(io->out_json_trace_file, ".json"); io->fp_out_json_trace = Openfile(io->out_json_trace_file, READWRITE); } } s = XML_Get_Attribute_Value(p_elem, "print.site.lk"); if (s) { select = XML_Validate_Attr_Int(s, 6, "true", "yes", "y", "false", "no", "n"); if (select < 3) io->print_site_lnl = YES; strcpy(io->out_lk_file, outputfile); strcat(io->out_lk_file, "_phyml_lk"); if (io->append_run_ID) { strcat(io->out_lk_file, "_"); strcat(io->out_lk_file, io->run_id_string); } strcat(io->out_lk_file, ".txt"); io->fp_out_lk = Openfile(io->out_lk_file, WRITE); } s = XML_Get_Attribute_Value(p_elem, "branch.test"); if (s) { if (!strcmp(s, "aLRT")) { io->ratio_test = ALRTSTAT; } else if (!strcmp(s, "aBayes")) { io->ratio_test = ABAYES; } else if (!strcmp(s, "SH")) { io->ratio_test = SH; } else if (!strcmp(s, "no") || !strcmp(s, "none")) { io->ratio_test = 0; } else { PhyML_Fprintf(stderr, "\n. '%s' is not a valid option for 'branch.test'.", s); PhyML_Fprintf(stderr, "\n. Please use 'aLRT' or 'aBayes' or 'SH'."); Exit("\n"); } } s = XML_Get_Attribute_Value(p_elem, "quiet"); if (s) { select = XML_Validate_Attr_Int(s, 6, "true", "yes", "y", "false", "no", "n"); if (select < 3) io->quiet = YES; } s = XML_Get_Attribute_Value(p_elem, "memory.check"); if (s) { select = XML_Validate_Attr_Int(s, 6, "true", "yes", "y", "false", "no", "n"); if (select >= 3) io->mem_question = NO; } n_partitionelem = 0; /*! Read all partitionelem nodes and mixturelem nodes in each of them */ do { p_elem = XML_Search_Node_Name("partitionelem", YES, p_elem); if (p_elem == NULL) break; else n_partitionelem++; buff = (option *)Make_Input(); Set_Defaults_Input(buff); io->next = buff; io->next->prev = io; io = io->next; if (first == YES) { io = io->prev; io->next = NULL; Free_Input(buff); first = NO; } /*! Set the datatype (required when compressing data) */ char *dt = NULL; dt = XML_Get_Attribute_Value(p_elem, "data.type"); if (!dt) { PhyML_Fprintf(stderr, "\n. Please specify the type of data ('aa' or 'nt') for " "partition element '%s'", XML_Get_Attribute_Value(p_elem, "id")); PhyML_Fprintf(stderr, "\n. Syntax: 'data.type=\"aa\"' or 'data.type=\"nt\"'"); Exit("\n"); } select = XML_Validate_Attr_Int(dt, 2, "aa", "nt"); switch (select) { case 0: { io->datatype = AA; break; } case 1: { io->datatype = NT; break; } default: { PhyML_Fprintf(stderr, "\n. Unknown data type. Must be either 'aa' or 'nt'."); Exit("\n"); } } char *format = NULL; format = XML_Get_Attribute_Value(p_elem, "format"); if (format) { if (!strcmp(format, "interleave") || !strcmp(format, "interleaved")) { io->interleaved = YES; } else if (!strcmp(format, "sequential")) { io->interleaved = NO; } } /*! Attach a model to this io struct */ io->mod = (t_mod *)Make_Model_Basic(); Set_Defaults_Model(io->mod); io->mod->ras->n_catg = 1; io->mod->io = io; iomod = io->mod; if (io->datatype == AA) io->mod->ns = 20; else if (io->datatype == NT) io->mod->ns = 4; else assert(FALSE); /*! Attach an optimization structure to this model */ iomod->s_opt = (t_opt *)Make_Optimiz(); Set_Defaults_Optimiz(iomod->s_opt); /*! Input file */ alignment = XML_Get_Attribute_Value(p_elem, "file.name"); if (!alignment) { PhyML_Fprintf(stderr, "\n. 'file.name' tag is mandatory. Please amend your"); PhyML_Fprintf(stderr, "\n. XML file accordingly."); Exit("\n"); } strcpy(io->in_align_file, alignment); /*! Open pointer to alignment */ io->fp_in_align = Openfile(io->in_align_file, READ); /*! Load sequence file */ io->data = Get_Seq(io); /*! Close pointer to alignment */ fclose(io->fp_in_align); /*! Compress alignment */ io->cdata = Compact_Data(io->data, io); /*! Free uncompressed alignment */ Free_Seq(io->data, io->n_otu); /*! Create new mixture tree */ buff = (t_tree *)Make_Tree_From_Scratch(io->cdata->n_otu, io->cdata); if (mixt_tree) { mixt_tree->next_mixt = buff; mixt_tree->next_mixt->prev_mixt = mixt_tree; mixt_tree = mixt_tree->next_mixt; mixt_tree->dp = mixt_tree->prev_mixt->dp + 1; } else mixt_tree = buff; /*! Connect mixt_tree to xml struct */ mixt_tree->xml_root = root; /*! Connect mixt_tree to io struct */ mixt_tree->io = io; /*! Connect mixt_tree to model struct */ mixt_tree->mod = iomod; /*! mixt_tree is a mixture tree */ mixt_tree->is_mixt_tree = YES; mixt_tree->ignore_mixt_info = NO; /*! mixt_tree is a mixture tree */ mixt_tree->mod->is_mixt_mod = YES; /*! Connect mixt_tree to compressed data */ mixt_tree->data = io->cdata; /*! Remove branch lengths from mixt_tree */ for (i = 0; i < 2 * mixt_tree->n_otu - 1; ++i) { Free_Scalar_Dbl(mixt_tree->a_edges[i]->l); Free_Scalar_Dbl(mixt_tree->a_edges[i]->l_old); Free_Scalar_Dbl(mixt_tree->a_edges[i]->l_var); Free_Scalar_Dbl(mixt_tree->a_edges[i]->l_var_old); } /*! Connect last tree of the mixture for the previous partition element to the next mixture tree */ if (tree) { tree->next = mixt_tree; mixt_tree->prev = tree; } if (!root_tree) root_tree = mixt_tree; /*! Tree size scaling factor */ char *scale_tree = NULL; scale_tree = XML_Get_Attribute_Value(p_elem, "optimise.tree.scale"); if (scale_tree) { int select; select = XML_Validate_Attr_Int(scale_tree, 6, "true", "yes", "y", "false", "no", "n"); if (select < 3) mixt_tree->mod->s_opt->opt_br_len_mult = YES; } scale_tree = NULL; scale_tree = XML_Get_Attribute_Value(p_elem, "tree.scale"); if (scale_tree) { mixt_tree->mod->br_len_mult->v = String_To_Dbl(scale_tree); mixt_tree->mod->br_len_mult_unscaled->v = String_To_Dbl(scale_tree); Free(scale_tree); } char *cv = NULL; cv = XML_Get_Attribute_Value(root, "cv.type"); if (cv) { if (!strcmp(cv, "kfold.pos")) mixt_tree->mod->cv_type = KFOLD_POS; else if (!strcmp(cv, "kfold.col")) mixt_tree->mod->cv_type = KFOLD_COL; else if (!strcmp(cv, "maxfold")) mixt_tree->mod->cv_type = MAXFOLD; else mixt_tree->mod->cv_type = -1; } else mixt_tree->mod->cv_type = -1; /*! Process all the mixtureelem tags in this partition element */ n_components = 0; m_elem = p_elem; first_m_elem = 0; mod = NULL; tree = NULL; class_number = 0; do { m_elem = XML_Search_Node_Name("mixtureelem", YES, m_elem); if (m_elem == NULL) break; if (!strcmp(m_elem->name, "mixtureelem")) { first_m_elem++; /*! Rewind tree and model when processing a new mixtureelem node */ if (first_m_elem > 1) { while (tree->prev && tree->prev->is_mixt_tree == NO) { tree = tree->prev; } while (mod->prev && mod->prev->is_mixt_mod == NO) { mod = mod->prev; } } /*! Read and process model components */ char *list; list = XML_Get_Attribute_Value(m_elem, "list"); j = 0; for (i = 0; i < (int)strlen(list); ++i) if (list[i] == ',') j++; if (j != n_components && first_m_elem > 1) { PhyML_Fprintf(stderr, "\n. Discrepancy in the number of elements in nodes " "'mixtureelem' partitionelem id '%s'", p_elem->id); PhyML_Fprintf(stderr, "\n. Check 'mixturelem' node with list '%s'", list); Exit("\n"); } n_components = j; i = j = 0; component[0] = '\0'; while (1) { if (list[j] == ',' || j == (int)strlen(list)) { /*! Reading a new component */ if (first_m_elem == YES) /* Only true when processing the first mixtureelem node */ { t_tree *this_tree; t_mod *this_mod; /*! Create new tree */ this_tree = (t_tree *)Make_Tree_From_Scratch(io->cdata->n_otu, io->cdata); /*! Update the number of mixtures */ iomod->n_mixt_classes++; if (tree) { tree->next = this_tree; tree->next->prev = tree; } else { mixt_tree->next = this_tree; mixt_tree->next->prev = mixt_tree; } tree = this_tree; tree->mixt_tree = mixt_tree; /*! Create a new model */ this_mod = (t_mod *)Make_Model_Basic(); Set_Defaults_Model(this_mod); this_mod->ras->n_catg = 1; this_mod->ns = iomod->ns; this_mod->r_mat = (t_rmat *)Make_Rmat(this_mod->ns); Init_Rmat(this_mod->r_mat); /*! All br_len_multiplier point to the corresponding */ /*! parameter in the relevant mixt_tree */ Free_Scalar_Dbl(this_mod->br_len_mult); this_mod->br_len_mult = iomod->br_len_mult; Free_Scalar_Dbl(this_mod->br_len_mult_unscaled); this_mod->br_len_mult_unscaled = iomod->br_len_mult_unscaled; if (mod) { mod->next = this_mod; mod->next->prev = mod; } else { this_mod->prev = iomod; } mod = this_mod; if (!iomod->next) iomod->next = mod; mod->io = io; mod->s_opt = (t_opt *)Make_Optimiz(); Set_Defaults_Optimiz(mod->s_opt); mod->ras->alpha->optimize = NO; mod->ras->pinvar->optimize = NO; tree->data = io->cdata; tree->io = io; tree->mod = mod; if (tree->data->n_pattern != tree->prev->data->n_pattern) Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } /*! Read a component */ component[i] = '\0'; if (j != (int)strlen(list) - 1) i = 0; /*! Find which node this ID corresponds to */ instance = XML_Search_Node_ID(component, YES, root); if (!instance) { PhyML_Fprintf(stderr, "\n. Could not find a node with id: '%s'.", component); PhyML_Fprintf(stderr, "\n. Problem with 'mixtureelem' node, list '%s'.", list); Exit("\n"); } if (!instance->parent) { PhyML_Fprintf(stderr, "\n. Node '%s' with id:'%s' has no parent.", instance->name, component); Exit("\n"); } parent = instance->parent; //////////////////////////////////////// // SUBSTITUTION MODEL // //////////////////////////////////////// if (!strcmp(parent->name, "ratematrices")) { /* ! First time we process this 'instance' node which has this * 'ratematrices' parent */ if (instance->ds->obj == NULL) { Make_Ratematrix_From_XML_Node(instance, io, mod); ds = instance->ds; /*! Connect the data structure n->ds to mod->r_mat */ ds->obj = (t_rmat *)(mod->r_mat); /*! Create and connect the data structure n->ds->next to * mod->kappa */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (scalar_dbl *)(mod->kappa); /*! Create and connect the data structure n->ds->next to * mod->whichmodel */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (int *)(&mod->whichmodel); /*! Create and connect the data structure n->ds->next to * mod->modelname */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (t_string *)(mod->modelname); /*! Create and connect the data structure n->ds->next to mod->ns */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (int *)(&mod->ns); /*! Create and connect the data structure n->ds->next to * mod->modelname */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (t_string *)(mod->custom_mod_string); /*! Create and connect the data structure n->ds->next to * mod->fp_aa_rate_mat */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (FILE *)(mod->fp_aa_rate_mat); /*! Create and connect the data structure n->ds->next to * mod->aa_rate_mat_file */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (t_string *)mod->aa_rate_mat_file; /*! Create and connect the data structure n->ds->next to * mod->s_opt->opt_rmat_weight */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (int *)(&mod->s_opt->opt_rmat_weight); /*! Create and connect the data structure n->ds->next to * mod->gamma_mgf_bl */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (int *)(&mod->gamma_mgf_bl); /*! Create and connect the data structure n->ds->next to * mod->l_var_sigma */ ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (scalar_dbl *)(mod->l_var_sigma); } else { /*! Connect to already existing r_mat & kappa * structs. */ t_ds *ds; Free(mod->r_mat); ds = instance->ds; mod->r_mat = (t_rmat *)ds->obj; Free_Scalar_Dbl(mod->kappa); ds = ds->next; mod->kappa = (scalar_dbl *)ds->obj; ds = ds->next; mod->whichmodel = *((int *)ds->obj); Free_String(mod->modelname); ds = ds->next; mod->modelname = (t_string *)ds->obj; ds = ds->next; mod->ns = *((int *)ds->obj); Free_String(mod->custom_mod_string); ds = ds->next; mod->custom_mod_string = (t_string *)ds->obj; ds = ds->next; mod->fp_aa_rate_mat = (FILE *)ds->obj; Free_String(mod->aa_rate_mat_file); ds = ds->next; mod->aa_rate_mat_file = (t_string *)ds->obj; ds = ds->next; mod->s_opt->opt_rmat_weight = *((int *)ds->obj); ds = ds->next; mod->gamma_mgf_bl = *((int *)ds->obj); Free_Scalar_Dbl(mod->l_var_sigma); ds = ds->next; mod->l_var_sigma = (scalar_dbl *)ds->obj; } } //////////////////////////////////////// // STATE FREQS // //////////////////////////////////////// else if (!strcmp(parent->name, "equfreqs")) { /* If n->ds == NULL, the corrresponding node data structure, * n->ds, has not */ /* been initialized. If not, do nothing. */ if (instance->ds->obj == NULL) { Make_Efrq_From_XML_Node(instance, io, mod); t_ds *ds; ds = instance->ds; ds->obj = (t_efrq *)mod->e_frq; ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (int *)(&mod->e_frq->type); ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (vect_dbl *)(mod->e_frq->user_b_freq); } else { /* Connect the data structure n->ds to mod->e_frq */ ds = instance->ds; mod->e_frq = (t_efrq *)ds->obj; ds = ds->next; mod->e_frq->type = *((int *)ds->obj); ds = ds->next; mod->e_frq->user_b_freq = (vect_dbl *)ds->obj; } } ////////////////////////////////////////// // TOPOLOGY // ////////////////////////////////////////// else if (!strcmp(parent->name, "topology")) { if (parent->ds->obj == NULL) Make_Topology_From_XML_Node(instance, io, iomod); ds = parent->ds; int buff; ds->obj = (int *)(&buff); } ////////////////////////////////////////// // RAS // ////////////////////////////////////////// else if (!strcmp(parent->name, "siterates")) { char *rate_value = NULL; /* scalar_dbl *r; */ phydbl val; /*! First time we process this 'siterates' node, check that its format is valid. and process it afterwards. */ if (parent->ds->obj == NULL) { class_number = 0; Make_RAS_From_XML_Node(parent, iomod); ds = parent->ds; ds->obj = (t_ras *)iomod->ras; ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (int *)(&iomod->s_opt->opt_free_mixt_rates); } else /*! Connect ras struct to an already defined one. Same for opt_alpha & opt_free_mixt_rates */ { ds = parent->ds; if (iomod->ras != (t_ras *)ds->obj) Free_RAS(iomod->ras); iomod->ras = (t_ras *)ds->obj; ds = ds->next; iomod->s_opt->opt_free_mixt_rates = *((int *)ds->obj); } rate_value = XML_Get_Attribute_Value(instance, "init.value"); val = 1.; if (rate_value) val = String_To_Dbl(rate_value); if (instance->ds->obj == NULL) { instance->ds->obj = (phydbl *)(&val); instance->ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); instance->ds->next->obj = (int *)(class_num + class_number); iomod->ras->gamma_rr->v[class_number] = val; iomod->ras->init_rr = NO; if (Are_Equal(val, 0.0, 1E-20) == NO) class_number++; } /*! Note: ras is already connected to the relevant t_ds stucture. No need to connect ras->gamma_rr or ras->p_invar */ /*! Invariant */ if (Are_Equal(val, 0.0, 1E-20)) { mod->ras->invar = YES; } else { mod->ras->parent_class_number = *((int *)instance->ds->next->obj); } xml_node *orig_w = NULL; orig_w = XML_Search_Node_Attribute_Value( "appliesto", instance->id, YES, instance->parent); if (orig_w) { char *weight; weight = XML_Get_Attribute_Value(orig_w, "value"); if (mod->ras->invar == YES) { iomod->ras->pinvar->v = String_To_Dbl(weight); } else { int class; class = *((int *)instance->ds->next->obj); iomod->ras->gamma_r_proba->v[class] = String_To_Dbl(weight); iomod->ras->init_r_proba = NO; } } } ////////////////////////////////////////////// // BRANCH LENGTHS // ////////////////////////////////////////////// else if (!strcmp(parent->name, "branchlengths")) { int i; int n_otu; n_otu = tree->n_otu; if (instance->ds->obj == NULL) { if (!lens) { ori_lens = (scalar_dbl **)mCalloc(2 * tree->n_otu - 1, sizeof(scalar_dbl *)); ori_lens_old = (scalar_dbl **)mCalloc(2 * tree->n_otu - 1, sizeof(scalar_dbl *)); ori_lens_var = (scalar_dbl **)mCalloc(2 * tree->n_otu - 1, sizeof(scalar_dbl *)); ori_lens_var_old = (scalar_dbl **)mCalloc( 2 * tree->n_otu - 1, sizeof(scalar_dbl *)); lens = ori_lens; lens_old = ori_lens_old; lens_var = ori_lens_var; lens_var_old = ori_lens_var_old; lens_size = 2 * tree->n_otu - 1; } else { ori_lens = (scalar_dbl **)mRealloc( ori_lens, 2 * tree->n_otu - 1 + lens_size, sizeof(scalar_dbl *)); ori_lens_old = (scalar_dbl **)mRealloc( ori_lens_old, 2 * tree->n_otu - 1 + lens_size, sizeof(scalar_dbl *)); ori_lens_var = (scalar_dbl **)mRealloc( ori_lens_var, 2 * tree->n_otu - 1 + lens_size, sizeof(scalar_dbl *)); ori_lens_var_old = (scalar_dbl **)mRealloc( ori_lens_var_old, 2 * tree->n_otu - 1 + lens_size, sizeof(scalar_dbl *)); lens = ori_lens + lens_size; ; lens_old = ori_lens_old + lens_size; ; lens_var = ori_lens_var + lens_size; ; lens_var_old = ori_lens_var_old + lens_size; ; lens_size += 2 * tree->n_otu - 1; } for (i = 0; i < 2 * tree->n_otu - 1; ++i) { lens[i] = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(lens[i]); lens_old[i] = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(lens_old[i]); lens_var[i] = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(lens_var[i]); lens_var_old[i] = (scalar_dbl *)mCalloc(1, sizeof(scalar_dbl)); Init_Scalar_Dbl(lens_var_old[i]); Free_Scalar_Dbl(tree->a_edges[i]->l); Free_Scalar_Dbl(tree->a_edges[i]->l_old); Free_Scalar_Dbl(tree->a_edges[i]->l_var); Free_Scalar_Dbl(tree->a_edges[i]->l_var_old); if (tree->prev && tree->prev->a_edges[i]->l == mixt_tree->a_edges[i]->l && tree->prev->is_mixt_tree == NO) { PhyML_Fprintf(stderr, "\n. %p %p", tree->a_edges[i]->l, mixt_tree->a_edges[i]->l); PhyML_Fprintf( stderr, "\n. Only one set of edge lengths is allowed "); PhyML_Fprintf( stderr, "\n. in a 'partitionelem'. Please fix your XML file."); Exit("\n"); } } char *l_min = NULL; l_min = XML_Get_Attribute_Value(instance, "l.min"); if (l_min) { iomod->l_min = String_To_Dbl(l_min); } char *opt_bl = NULL; opt_bl = XML_Get_Attribute_Value(instance, "optimise.lens"); if (opt_bl) { if (!strcmp(opt_bl, "yes") || !strcmp(opt_bl, "true")) { iomod->s_opt->opt_bl_one_by_one = YES; } else { iomod->s_opt->opt_bl_one_by_one = NO; } } ds = instance->ds; ds->obj = (scalar_dbl **)lens; ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (scalar_dbl **)lens_old; ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (scalar_dbl **)lens_var; ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (scalar_dbl **)lens_var_old; ds->next = (t_ds *)mCalloc(1, sizeof(t_ds)); ds = ds->next; ds->obj = (int *)(&iomod->s_opt->opt_bl_one_by_one); } else { /* Free existing edge lengths, which will be replaced with those * read from !*/ for (i = 0; i < 2 * tree->n_otu - 1; ++i) { Free_Scalar_Dbl(tree->a_edges[i]->l); Free_Scalar_Dbl(tree->a_edges[i]->l_old); Free_Scalar_Dbl(tree->a_edges[i]->l_var); Free_Scalar_Dbl(tree->a_edges[i]->l_var_old); } ds = instance->ds; lens = (scalar_dbl **)ds->obj; ds = ds->next; lens_old = (scalar_dbl **)ds->obj; ds = ds->next; lens_var = (scalar_dbl **)ds->obj; ds = ds->next; lens_var_old = (scalar_dbl **)ds->obj; ds = ds->next; iomod->s_opt->opt_bl_one_by_one = *((int *)ds->obj); } if (n_otu != tree->n_otu) { PhyML_Fprintf(stderr, "\n. All the data sets should display " "the same number of sequences."); PhyML_Fprintf(stderr, "\n. Found at least one data set with %d " "sequences and one with %d sequences.", n_otu, tree->n_otu); Exit("\n"); } for (i = 0; i < 2 * tree->n_otu - 1; ++i) { tree->a_edges[i]->l = lens[i]; mixt_tree->a_edges[i]->l = lens[i]; tree->a_edges[i]->l_old = lens_old[i]; mixt_tree->a_edges[i]->l_old = lens_old[i]; tree->a_edges[i]->l_var = lens_var[i]; mixt_tree->a_edges[i]->l_var = lens_var[i]; tree->a_edges[i]->l_var_old = lens_var_old[i]; mixt_tree->a_edges[i]->l_var_old = lens_var_old[i]; } } /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// if (first_m_elem > 1) // Done with this component, move to the next tree and model { if (tree->next) tree = tree->next; if (mod->next) mod = mod->next; } } else if (list[j] != ' ') { component[i] = list[j]; i++; } j++; if (j == (int)strlen(list) + 1) break; } // end of mixtureelem processing } // end of partitionelem processing } while (1); } while (1); if (n_partitionelem == 0) { PhyML_Fprintf(stderr, "\n. No found. Please amend your XML " "file accordingly."); Exit("\n"); } if (ori_lens) Free(ori_lens); if (ori_lens_old) Free(ori_lens_old); if (ori_lens_var) Free(ori_lens_var); if (ori_lens_var_old) Free(ori_lens_var_old); while (io->prev != NULL) io = io->prev; while (mixt_tree->prev != NULL) mixt_tree = mixt_tree->prev; /*! Finish making the models */ tree = mixt_tree; do { Make_Model_Complete(tree->mod); tree = tree->next; } while (tree); Check_Taxa_Sets(mixt_tree); #if defined PHYML Check_Mandatory_XML_Node(root, "phyml"); #elif defined PHYTIME Check_Mandatory_XML_Node(root, "phytime"); #endif Check_Mandatory_XML_Node(root, "topology"); Check_Mandatory_XML_Node(root, "branchlengths"); Check_Mandatory_XML_Node(root, "ratematrices"); Check_Mandatory_XML_Node(root, "equfreqs"); Check_Mandatory_XML_Node(root, "siterates"); Check_Mandatory_XML_Node(root, "partitionelem"); Check_Mandatory_XML_Node(root, "mixtureelem"); if (!io->mod->s_opt->random_input_tree) io->mod->s_opt->n_rand_starts = 1; int r_seed = (io->r_seed < 0) ? (time(NULL)) : (io->r_seed); srand(r_seed); io->r_seed = r_seed; Free(component); Free(class_num); fclose(fp); return mixt_tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_node *XML_Load_File(FILE *fp) { int c; char *buffer, *bufptr; int bufsize; xml_node *parent, *node; buffer = (char *)mCalloc(T_MAX_XML_TAG, sizeof(char)); bufsize = T_MAX_XML_TAG; bufptr = buffer; parent = NULL; node = NULL; while ((c = fgetc(fp)) != EOF) { if (c == '<' && bufptr > buffer) { *bufptr = '\0'; /* PhyML_Printf("\n. Read value '%s' for node '%s'",buffer,node->name); */ /* fflush(NULL); */ XML_Set_Node_Value(node, buffer); bufptr = buffer; } if (c == '<') { bufptr = buffer; while ((c = fgetc(fp)) != EOF) { if (isspace(c) != NO || c == '>' || (c == '/' && bufptr > buffer)) break; // End of open or close tag else if (c == '<') { Exit("\n. Bare < in element!"); } else if (XML_Add_Character(c, &bufptr, &buffer, &bufsize)) { PhyML_Printf("\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } } *bufptr = '\0'; if (!strcmp(buffer, "!--")) // Get the rest of the comment { while ((c = fgetc(fp)) != EOF) { if (c == '>' && bufptr > (buffer + 4) && bufptr[-3] != '-' && bufptr[-2] == '-' && bufptr[-1] == '-') break; else if (XML_Add_Character(c, &bufptr, &buffer, &bufsize)) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } } *bufptr = '\0'; if (c != '>') { PhyML_Fprintf(stderr, "\n. Early EOF in comment node."); Exit("\n"); } } else if (buffer[0] == '/') // Close tag { if (strcmp(buffer + 1, parent->name)) { PhyML_Fprintf( stderr, "\n. Opened tag with name '%s' and closed it with '%s'...", node->name, buffer + 1); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } /* printf("\n. Closing node with name '%s'",node->name); */ if (node->parent) { parent = parent->parent; node = parent; } } else if (buffer[0] == '?') { while ((c = fgetc(fp)) != EOF) { if (c == '>' && bufptr > buffer && bufptr[-1] == '?') break; else if (XML_Add_Character(c, &bufptr, &buffer, &bufsize)) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } } if (c != '>') { PhyML_Fprintf( stderr, "\n. An error occurred when reading the processing instruction."); PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } *bufptr = '\0'; } else // Open tag { node = XML_Make_Node(buffer); XML_Init_Node(parent, node, buffer); if (!parent) parent = node; if (isspace(c) != NO) c = XML_Parse_Element(fp, node); else if (c == '/') { if ((c = fgetc(fp)) != '>') { PhyML_Fprintf(stderr, "\n. Expected '>' but read '%c' instead", c); Exit("\n"); } c = '/'; } if (c != '/') parent = node; buffer[0] = '\0'; } bufptr = buffer; } else if (isspace(c) == NO) { if (XML_Add_Character(c, &bufptr, &buffer, &bufsize)) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } } } Free(buffer); return node; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Add_Character(int c, char **bufptr, char **buffer, int *bufsize) { char *newbuffer; if (*bufptr >= (*buffer + *bufsize - 4)) { // Increase the size of the buffer... int delta; delta = (*bufptr - *buffer); if (*bufsize < 1024) (*bufsize) *= 2; else (*bufsize) += 1024; if ((newbuffer = realloc(*buffer, *bufsize)) == NULL) { Free(*buffer); PhyML_Fprintf(stderr, "\n. Unable to expand string buffer to %d bytes!", *bufsize); Exit("\n"); } *bufptr = newbuffer + delta; *buffer = newbuffer; } /* *(*bufptr)++ = tolower(c); */ *(*bufptr)++ = c; return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Parse_Element(FILE *fp, xml_node *n) { int c; int quote; char *name, *value, *ptr; int namesize, valsize; name = (char *)mCalloc(64, sizeof(char)); value = (char *)mCalloc(64, sizeof(char)); namesize = 64; valsize = 64; while ((c = fgetc(fp)) != EOF) { if (isspace(c) != NO) continue; if (c == '/') // End of tag { /* printf("\n. Closing node '%s'.",n->name); */ quote = fgetc(fp); if (quote != '>') { PhyML_Fprintf(stderr, "\n. Expected '>' after '%c' but read '%c' instead", c, quote); Exit("\n"); } break; } else if (c == '<') { Exit("\n. Bare < in element!"); } else if (c == '>') // End of tag { break; } name[0] = c; ptr = name + 1; if (c == '\"' || c == '\'') // Name is in quotes { quote = c; while ((c = fgetc(fp)) != EOF) { if (XML_Add_Character(c, &ptr, &name, &namesize)) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } if (c == quote) break; } } else // Name not in quotes { while ((c = fgetc(fp)) != EOF) { if (isspace(c) != NO || c == '=' || c == '/' || c == '>' || c == '?') break; else { if (XML_Add_Character(c, &ptr, &name, &namesize)) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } } } } *ptr = '\0'; while (c != EOF && isspace(c) != NO) c = fgetc(fp); if (c == '=') // Read the attribute value { while ((c = fgetc(fp)) != EOF && isspace(c) != NO); if (c == EOF) { PhyML_Fprintf(stderr, "\n. Missing value in attribute."); PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } if (c == '\'' || c == '\"') { quote = c; ptr = value; while ((c = fgetc(fp)) != EOF) { if (c == quote) break; else { if (XML_Add_Character(c, &ptr, &value, &valsize)) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } } } *ptr = '\0'; } else { value[0] = c; ptr = value + 1; while ((c = fgetc(fp)) != EOF) { if (isspace(c) != NO || c == '=' || c == '/' || c == '>') break; else { if (XML_Add_Character(c, &ptr, &value, &valsize)) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } } } } } /* printf("\n. Setting attribute '%s=%s' to node '%s'",name,value,n->name); */ XML_Make_And_Set_Attribute(n, name, value); if (c == '>') break; } Free(name); Free(value); /* printf("\n. Return '%c'\n",c); */ return (c); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_attr *XML_Search_Attribute(xml_node *n, char *target_attr_name) { xml_attr *attr; attr = n->attr; do { if (!strcmp(attr->name, target_attr_name)) return attr; attr = attr->next; } while (attr); return (NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Make_And_Set_Attribute(xml_node *n, char *attr_name, char *attr_value) { xml_attr *prev; char *s; prev = NULL; while (n->attr != NULL) { prev = n->attr; n->attr = n->attr->next; } n->attr = XML_Make_Attribute(prev, attr_name, attr_value); XML_Init_Attribute(n->attr); n->n_attr++; // rewind while (n->attr->prev != NULL) n->attr = n->attr->prev; s = To_Lower_String(attr_name); if (!strcmp(s, "id")) { XML_Set_Node_Id(n, attr_value); /* printf("\n. Node '%s' id is '%s'",n->name,n->id); */ } Free(s); return (0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Set_Attribute_Value(xml_node *n, char *attr_name, char *attr_value) { xml_attr *attr; char *s; attr = XML_Search_Attribute(n, attr_name); if (attr == NULL) return (-1); s = To_Lower_String(attr_value); strcpy(attr->value, s); Free(s); return (0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Add_Attribute(xml_node *n, char *attr_name, char *attr_value) { xml_attr *attr; attr = n->attr; while (attr->next != NULL) attr = attr->next; assert(attr); attr->next = XML_Make_Attribute(attr, attr_name, attr_value); XML_Init_Attribute(attr); n->n_attr++; return (0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_node *XML_Add_Node(xml_node *parent, char *nd_name) { xml_node *n; n = XML_Make_Node(nd_name); XML_Init_Node(parent, n, nd_name); return (n); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Set_Node_Id(xml_node *n, char *id) { XML_Make_Node_Id(n, id); strcpy(n->id, id); return (0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Set_Node_Value(xml_node *n, char *val) { XML_Make_Node_Value(n, val); strcpy(n->value, val); return (0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_node *XML_Search_Node_Generic(char *nd_name, char *attr_name, char *attr_val, int skip, xml_node *node) { xml_node *match; /* if(nd_name) printf("\n. [1] nd_name:%s attr_name:%s attr_val:%s \n", * nd_name, attr_name, attr_val); */ /* else printf("\n. attr_name:%s attr_val:%s \n", attr_name, attr_val); */ /* printf("\n. name:%s child:%s next:%s ", */ /* node?node->name:"xx", */ /* node->child?node->child->name:"xx", */ /* node->next?node->next->name:"xx"); fflush(NULL); */ match = NULL; if (skip == NO && nd_name && attr_name && attr_val) { if (!strcmp(nd_name, node->name)) { xml_attr *attr = XML_Search_Attribute(node, attr_name); if (attr && !strcmp(attr->value, attr_val)) match = node; } } else if (skip == NO && !nd_name && attr_name && attr_val) { xml_attr *attr = XML_Search_Attribute(node, attr_name); if (attr && !strcmp(attr->value, attr_val)) match = node; } else if (skip == NO && nd_name && !attr_name && attr_val) { if (!strcmp(nd_name, node->name)) { do { if (!strcmp(node->attr->value, attr_val)) { match = node; break; } node->attr = node->attr->next; if (!node->attr) break; } while (1); } } else if (skip == NO && nd_name && attr_name && !attr_val) { if (!strcmp(nd_name, node->name)) { do { if (!strcmp(node->attr->name, attr_name)) { match = node; break; } node->attr = node->attr->next; if (!node->attr) break; } while (1); } } else if (skip == NO && nd_name && !attr_name && !attr_val) { if (!strcmp(nd_name, node->name)) match = node; } else if (skip == NO && !nd_name && attr_name && !attr_val) { xml_attr *attr = XML_Search_Attribute(node, attr_name); if (attr) match = node; } else if (skip == NO && !nd_name && !attr_name && attr_val) { do { if (!strcmp(node->attr->value, attr_val)) { match = node; break; } node->attr = node->attr->next; if (!node->attr) break; } while (1); } // If node has a child, node = child, else if node has next, node = next, else // if node has parent, node = parent->next else node = NULL if (match) return (match); if (node->child) { match = XML_Search_Node_Generic(nd_name, attr_name, attr_val, NO, node->child); } if (!match && node->next) { match = XML_Search_Node_Generic(nd_name, attr_name, attr_val, NO, node->next); } if (match == NULL && node->parent) { if (node->parent == NULL) // Reached the root { PhyML_Fprintf(stderr, "\n. Could not find a node with name '%s'.", attr_name); Exit("\n"); } return NULL; } return match; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_node *XML_Search_Node_Name(char *name, int skip, xml_node *node) { xml_node *match; /* printf("\n. name:%s child:%s next:%s ", */ /* node?node->name:"xx", */ /* node->child?node->child->name:"xx", */ /* node->next?node->next->name:"xx"); fflush(NULL); */ match = NULL; if (skip == NO && !strcmp(node->name, name)) match = node; else { // If node has a child, node = child, else if node has next, node = next, // else if node has parent, node = parent->next else node = NULL if (node->child) { match = XML_Search_Node_Name(name, NO, node->child); } if (match == NULL && node->next) { match = XML_Search_Node_Name(name, NO, node->next); } if (match == NULL && node->parent) { if (node->parent == NULL) // Reached the root { PhyML_Fprintf(stderr, "\n. Could not find a node with name '%s'.", name); Exit("\n"); } return NULL; } } return match; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_node *XML_Search_Node_ID(char *id, int skip, xml_node *node) { xml_node *match; if (!node) { PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } match = NULL; if (skip == NO && node->id && !strcmp(node->id, id)) match = node; else { // If node has a child, node = child, else if node has next, node = next, // else if node has parent, node = parent->next else node = NULL if (node->child) { match = XML_Search_Node_ID(id, NO, node->child); } if (match == NULL && node->next) { match = XML_Search_Node_ID(id, NO, node->next); } if (match == NULL && node->parent) { if (node->parent == NULL) // Reached the root { PhyML_Fprintf(stderr, "\n. Could not find a node with id '%s'.", id); Exit("\n"); } return NULL; } } return match; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_node *XML_Search_Node_Attribute_Value(char *attr_name, char *value, int skip, xml_node *node) { xml_node *match; if (!node) { PhyML_Fprintf(stderr, "\n. node: %p attr: %p", node, node ? node->attr : NULL); PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } match = NULL; if (skip) { match = XML_Search_Node_Attribute_Value(attr_name, value, NO, node->child); return match; } if (skip == NO && node->attr) { xml_attr *attr; char *sname, *sval; char *qname, *qval; qname = To_Lower_String(attr_name); qval = To_Lower_String(value); attr = node->attr; do { sname = To_Lower_String(attr->name); sval = To_Lower_String(attr->value); if (!strcmp(sname, qname) && !strcmp(sval, qval)) { match = node; Free(sname); Free(sval); break; } Free(sname); Free(sval); attr = attr->next; if (!attr) break; } while (1); Free(qval); Free(qname); } if (match) return (match); else { if (node->child) { match = XML_Search_Node_Attribute_Value(attr_name, value, NO, node->child); } if (node->next && !match) { match = XML_Search_Node_Attribute_Value(attr_name, value, NO, node->next); } } return match; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *XML_Get_Attribute_Value(xml_node *node, char *attr_name) { xml_attr *attr; attr = node->attr; while (attr && strcmp(attr->name, attr_name)) attr = attr->next; return (attr ? attr->value : NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Validate_Attr_Int(char *target, int num, ...) { va_list args; int i; char *s, *sc_s; char *sc_target; sc_target = To_Lower_String(target); va_start(args, num); for (i = 0; i < num; i++) { s = va_arg(args, char *); sc_s = To_Lower_String(s); if (!strcmp(sc_s, sc_target)) { Free(sc_s); break; } Free(sc_s); } va_end(args); if (i == num) { i = -1; PhyML_Fprintf(stderr, "\n. Attribute value '%s' is not valid", target); Exit("\n"); } Free(sc_target); return (i); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Check_Siterates_Node(xml_node *parent) { xml_node *n; int n_weights_nodes; char *rate_value = NULL; phydbl buff; int n_zeros; char *endptr; if (!parent) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } if (strcmp(parent->name, "siterates")) { PhyML_Fprintf(stderr, "\n. Node name '%s' should be 'siterates'", parent->name); Exit("\n"); } // Check that only one 'weights' node is present n_weights_nodes = 0; n = parent->child; do { if (!strcmp(n->name, "weights")) n_weights_nodes++; if (n_weights_nodes > 1) { PhyML_Fprintf( stderr, "\n. Only one distribution is authorized for 'siterates' nodes."); Exit("\n"); } n = n->next; if (!n) break; } while (1); // Check that one rate value is set to zero if gamma+inv model is used n = XML_Search_Node_Attribute_Value("family", "gamma+inv", YES, parent); if (!n) return; else { n_zeros = 0; n = parent->child; do { if (!strcmp(n->name, "instance")) { rate_value = NULL; rate_value = XML_Get_Attribute_Value(n, "init.value"); if (rate_value) { errno = 0; buff = strtod(rate_value, &endptr); if (rate_value == endptr || errno == ERANGE) { PhyML_Fprintf(stderr, "\n. value: %s", rate_value); PhyML_Fprintf(stderr, "\n. Error in reading attribute 'init.value' " "in node 'instance'."); Exit("\n"); } if (buff < 1.E-20) n_zeros++; } } n = n->next; if (!n) break; } while (1); if (n_zeros != 1) { PhyML_Fprintf(stderr, "\n. # of zero-rates: %d", n_zeros); PhyML_Fprintf(stderr, "\n. Exactly one rate value has to be set to zero " "when using the 'gamma+inv' model."); PhyML_Fprintf(stderr, "\n. Component id: %s", parent->id); Exit("\n"); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Get_Number_Of_Classes_Siterates(xml_node *parent) { xml_node *n; int n_classes; if (!parent) { PhyML_Printf("\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } n_classes = 0; n = parent->child; do { if (!strcmp(n->name, "instance")) n_classes++; n = n->next; if (!n) break; } while (1); n = NULL; n = XML_Search_Node_Attribute_Value("family", "gamma+inv", YES, parent); if (!n) return n_classes; else return n_classes - 1; } ////////////////////////////////////////////////////////////// int XML_Siterates_Has_Invariants(xml_node *parent) { xml_node *n; if (!parent) { PhyML_Fprintf(stderr, "\n. Err in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } n = NULL; n = XML_Search_Node_Attribute_Value("family", "gamma+inv", YES, parent); if (!n) return NO; else return YES; } ////////////////////////////////////////////////////////////// void XML_Count_Number_Of_Node_With_ID(char *id, int *count, xml_node *n) { if (!id) return; if (n->id && !strcmp(n->id, id)) (*count)++; if (n->child) XML_Count_Number_Of_Node_With_ID(id, count, n->child); if (n->next) XML_Count_Number_Of_Node_With_ID(id, count, n->next); } ////////////////////////////////////////////////////////////// void XML_Count_Number_Of_Node_With_Name(char *name, int *count, xml_node *n) { if (!name) return; if (n->name && !strcmp(n->name, name)) (*count)++; if (n->child) XML_Count_Number_Of_Node_With_Name(name, count, n->child); if (n->next) XML_Count_Number_Of_Node_With_Name(name, count, n->next); } ////////////////////////////////////////////////////////////// void XML_Check_Duplicate_ID(xml_node *n) { int count; count = 0; XML_Count_Number_Of_Node_With_ID(n->id, &count, n); if (count > 1) { PhyML_Fprintf(stderr, "\n. Node ID '%s' was found more than once.", n->id); PhyML_Fprintf(stderr, "\n. Each ID must be unique. Please amend your XML"); PhyML_Fprintf(stderr, "\n. file accordingly."); Exit("\n"); } if (n->child) XML_Check_Duplicate_ID(n->child); if (n->next) XML_Check_Duplicate_ID(n->next); } ////////////////////////////////////////////////////////////// xml_node *XML_Copy_XML_Graph(xml_node *root) { xml_node *cpy_root; cpy_root = XML_Make_Node(root->name); XML_Copy_XML_Node(cpy_root, root); return (cpy_root); } ////////////////////////////////////////////////////////////// void XML_Copy_XML_Node(xml_node *cpy_root, xml_node *root) { xml_attr *attr, *cpy_attr; strcpy(cpy_root->name, root->name); XML_Make_Node_Id(cpy_root, root->id); if (root->id) strcpy(cpy_root->id, root->id); XML_Make_Node_Value(cpy_root, root->value); if (root->value) strcpy(cpy_root->value, root->value); cpy_root->n_attr = root->n_attr; if (root->attr) { cpy_root->attr = XML_Make_Attribute(NULL, root->attr->name, root->attr->value); XML_Init_Attribute(cpy_root->attr); attr = root->attr; cpy_attr = cpy_root->attr; while (attr->next) { fflush(NULL); cpy_attr->next = XML_Make_Attribute(cpy_attr, attr->next->name, attr->next->value); XML_Init_Attribute(cpy_attr->next); attr = attr->next; cpy_attr = cpy_attr->next; } } if (root->child) { cpy_root->child = XML_Make_Node(root->child->name); cpy_root->child->parent = cpy_root; XML_Copy_XML_Node(cpy_root->child, root->child); } if (root->next) { cpy_root->next = XML_Make_Node(root->next->name); cpy_root->next->prev = cpy_root; XML_Copy_XML_Node(cpy_root->next, root->next); } } ////////////////////////////////////////////////////////////// void XML_Write_XML_Graph(FILE *fp, xml_node *root) { int indent; indent = 0; XML_Write_XML_Node(fp, &indent, YES, YES, root); } ////////////////////////////////////////////////////////////// void XML_Write_XML_Node(FILE *fp, int *indent, short int recurr_next, short int recurr_child, xml_node *root) { xml_node *n; xml_attr *attr; char *s; int i; assert(root); s = (char *)mCalloc((*indent) + 1, sizeof(char)); for (i = 0; i < (*indent); ++i) s[i] = '\t'; s[i] = '\0'; PhyML_Fprintf(fp, "\n%s", s); n = root; PhyML_Fprintf(fp, "<%s", n->name); attr = n->attr; while (attr) { PhyML_Fprintf(fp, " %s=\"%s\"", attr->name, attr->value); attr = attr->next; } PhyML_Fprintf(fp, ">"); if (n->value != NULL) XML_Write_Node_Value(fp, s, n); if (n->child && recurr_child == YES) { (*indent)++; XML_Write_XML_Node(fp, indent, recurr_next, recurr_child, n->child); (*indent)--; } PhyML_Fprintf(fp, "\n%s", s, n->name); if (n->next && recurr_next == YES) XML_Write_XML_Node(fp, indent, recurr_next, recurr_child, n->next); Free(s); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Write_Node_Value(FILE *fp, char *indent, xml_node *n) { PhyML_Fprintf(fp, "\n"); char *tk = strtok(n->value, "\n"); do { PhyML_Fprintf(fp, "%s%s", indent, tk); tk = strtok(NULL, "\n"); if (tk != NULL) PhyML_Fprintf(fp, "\n"); } while (tk != NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Check_Mandatory_XML_Node(xml_node *root, char *name) { if (!XML_Search_Node_Name(name, NO, root)) { PhyML_Fprintf( stderr, "\n. Could not find mandatory XML node with name '%s'.", name); PhyML_Fprintf(stderr, "\n. Please amend your XML file."); Exit("\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int XML_Number_Of_Taxa_In_Clade(xml_node *n_clade) { int clade_size = 0; if (n_clade) { do { clade_size++; if (n_clade->next) n_clade = n_clade->next; else break; } while (n_clade); } else { PhyML_Fprintf(stderr, "\n. Clade is empty."); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } return (clade_size); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char **XML_Read_Clade(xml_node *xnd_clade, t_tree *tree) { int i; char **clade; clade = (char **)mCalloc(tree->n_otu, sizeof(char *)); if (xnd_clade) { i = 0; do { clade[i] = xnd_clade->attr->value; i++; if (xnd_clade->next) xnd_clade = xnd_clade->next; else break; } while (xnd_clade); } else { PhyML_Fprintf(stderr, "== Clade is empty. \n"); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } return (clade); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Read_Calibration(xml_node *xroot, t_tree *tree) { xml_node *xnd_clade, *xnd_cal, *xnd, *xnd_dum; phydbl low, up, alpha_proba_dbl, t, t_ref; t_cal *cal; t_clad *clade; char *calib_id, *clade_id, *clade_name, *alpha_proba_string; int i, j; clade = NULL; cal = NULL; xnd = xroot->child; assert(xnd); do { if (!strcmp(xnd->name, "calibration")) // Found a XML node . { // TO DO: make sure calibs are shared across partition elements -> need to // write chain function to call once the calib struct on the first // mixt_tree is initialized. /* mixt_tree->rates->tot_num_cal++; */ /* if (mixt_tree->rates->calib == NULL) mixt_tree->rates->calib = * Make_Calib(mixt_tree->n_otu); */ xnd_cal = xnd; low = 0.0; up = BIG; cal = Make_Calibration(); Init_Calibration(cal); xnd_dum = XML_Search_Node_Name("lower", YES, xnd_cal); if (xnd_dum != NULL) low = String_To_Dbl(xnd_dum->value); xnd_dum = XML_Search_Node_Name("upper", YES, xnd_cal); if (xnd_dum != NULL) up = String_To_Dbl(xnd_dum->value); calib_id = XML_Get_Attribute_Value(xnd_cal, "id"); cal->id = (char *)mCalloc(strlen(calib_id) + 1, sizeof(char)); strcpy(cal->id, calib_id); cal->clade_list_size = 0; cal->current_clade_idx = 0; cal->lower = low; cal->upper = up; cal->is_primary = YES; tree->times->a_cal[tree->times->n_cal] = cal; tree->times->n_cal++; if (tree->times->n_cal > 10 * tree->n_otu) { PhyML_Fprintf(stderr, "\n. There are too many clades defined that are " "not found in the tree..."); PhyML_Fprintf(stderr, "\n. Please remove some of them."); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } xnd_dum = xnd_cal->child; do { clade_name = NULL; if (!strcmp("appliesto", xnd_dum->name)) { clade_name = XML_Get_Attribute_Value(xnd_dum, "clade.id"); if (!clade_name) { PhyML_Fprintf(stderr, "\n. Attribute 'value=CLADE_NAME' is mandatory"); PhyML_Fprintf(stderr, "\n. Please amend your XML file accordingly."); Exit("\n"); } alpha_proba_string = XML_Get_Attribute_Value(xnd_dum, "probability"); alpha_proba_dbl = -1; if (!alpha_proba_string) alpha_proba_dbl = 1.0; else alpha_proba_dbl = String_To_Dbl(alpha_proba_string); assert(!(alpha_proba_dbl < 0. || alpha_proba_dbl > 1.)); if (strcmp("root", clade_name)) { xnd_clade = XML_Search_Node_Generic("clade", "id", clade_name, YES, xroot); if (xnd_clade != NULL) // found clade with a given name { char **xclade; int clade_size, nd_num; int i; xclade = XML_Read_Clade(xnd_clade->child, tree); clade_size = XML_Number_Of_Taxa_In_Clade(xnd_clade->child); clade = Make_Clade(); clade->n_tax = clade_size; clade->tax_list = (char **)mCalloc(clade_size, sizeof(char *)); for (i = 0; i < clade_size; ++i) clade->tax_list[i] = (char *)mCalloc(strlen(xclade[i]) + 1, sizeof(char)); for (i = 0; i < clade_size; ++i) strcpy(clade->tax_list[i], xclade[i]); clade_id = XML_Get_Attribute_Value(xnd_dum, "clade.id"); if (clade_id == NULL) { PhyML_Fprintf(stderr, "\n. Attribute \"clade.id\" is missing " "in \"appliesto\" tag."); Generic_Exit(__FILE__, __LINE__, __FUNCTION__); } clade->id = (char *)mCalloc(strlen(clade_id) + 1, sizeof(char)); strcpy(clade->id, clade_id); nd_num = Find_Clade(clade->tax_list, clade_size, tree); if (nd_num > -1) { clade->target_nd = tree->a_nodes[nd_num]; clade->tip_list = Make_Target_Tip(clade->n_tax); Init_Target_Tip(clade, tree); if (cal->clade_list_size == 0) cal->clade_list = (t_clad **)mCalloc(1, sizeof(t_clad *)); else cal->clade_list = (t_clad **)mRealloc( cal->clade_list, cal->clade_list_size + 1, sizeof(t_clad *)); if (cal->clade_list_size == 0) cal->alpha_proba_list = (phydbl *)mCalloc(1, sizeof(phydbl)); else cal->alpha_proba_list = (phydbl *)mRealloc( cal->alpha_proba_list, cal->clade_list_size + 1, sizeof(phydbl)); cal->clade_list[cal->clade_list_size] = clade; cal->alpha_proba_list[cal->clade_list_size] = alpha_proba_dbl; cal->clade_list_size++; } else { Free_Clade(clade); } Free(xclade); } else { PhyML_Fprintf( stderr, "\n. Calibration information for clade [%s] was not found.", clade_name); PhyML_Fprintf(stderr, "\n. Err. in file %s at line %d\n", __FILE__, __LINE__); Exit("\n"); } } } xnd_dum = xnd_dum->next; } while (xnd_dum != NULL); if (clade_name == NULL) { PhyML_Fprintf( stderr, "\n. Could not find calibration information for calibration `%s'", cal->id); PhyML_Fprintf(stderr, "\n. Please amend your XML file."); Exit("\n"); } } xnd = xnd->next; } while (xnd != NULL); PhyML_Printf("\n\n..........................................................." "............"); for (i = 0; i < tree->times->n_cal; ++i) { cal = tree->times->a_cal[i]; phydbl sum = 0.0; for (j = 0; j < cal->clade_list_size; j++) sum += cal->alpha_proba_list[j]; for (j = 0; j < cal->clade_list_size; j++) cal->alpha_proba_list[j] /= sum; for (j = 0; j < cal->clade_list_size; j++) { clade = cal->clade_list[j]; PhyML_Printf("\n Calibration id: %s.", cal->id); PhyML_Printf("\n Lower bound set to: %15f time units.", cal->lower); PhyML_Printf("\n Upper bound set to: %15f time units.", cal->upper); PhyML_Printf( "\n This calibration applies to node %d with probability %G.", clade->target_nd->num, cal->alpha_proba_list[j]); PhyML_Printf("\n........................................................." ".............."); } } t_ref = t = -1.; for (i = 0; i < tree->times->n_cal; ++i) { cal = tree->times->a_cal[i]; for (j = 0; j < cal->clade_list_size; j++) { clade = cal->clade_list[j]; if (clade->target_nd->tax == YES) { if (t_ref < -.5) { t_ref = Uni() * (cal->upper - cal->lower) + cal->lower; t_ref = fabs(t_ref); } else { t = Uni() * (cal->upper - cal->lower) + cal->lower; t = fabs(t); if (Are_Equal(t, t_ref, 1.E-10) == NO) { tree->times->is_asynchronous = YES; break; } } } } } PhyML_Printf("\n\n"); PhyML_Printf("\n. Number of calibrations: %d", tree->times->n_cal); PhyML_Printf("\n. Is asynchronous: %s", tree->times->is_asynchronous ? "yes" : "no"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Update_XML_Struct_Given_Model_Params(t_tree *tree) { xml_node *parent, *child, *x; char *s, *val; t_ds *ds; phydbl v; val = (char *)mCalloc(T_MAX_LINE, sizeof(char)); parent = XML_Search_Node_Name("ratematrices", YES, tree->xml_root); if (parent != NULL) { child = parent->child; assert(child != NULL); do { ds = child->ds; assert(ds); x = XML_Search_Node_Name("rr", YES, child); if (x != NULL) { s = XML_Get_Attribute_Value(x, "AC"); if (s != NULL) { sprintf(val, "%f", ((t_rmat *)(ds->obj))->rr->v[0]); XML_Set_Attribute_Value(x, "AC", val); } s = XML_Get_Attribute_Value(x, "AG"); if (s != NULL) { sprintf(val, "%f", ((t_rmat *)(ds->obj))->rr->v[1]); XML_Set_Attribute_Value(x, "AC", val); } s = XML_Get_Attribute_Value(x, "AT"); if (s != NULL) { sprintf(val, "%f", ((t_rmat *)(ds->obj))->rr->v[2]); XML_Set_Attribute_Value(x, "AT", val); } s = XML_Get_Attribute_Value(x, "CG"); if (s != NULL) { sprintf(val, "%f", ((t_rmat *)(ds->obj))->rr->v[3]); XML_Set_Attribute_Value(x, "CG", val); } s = XML_Get_Attribute_Value(x, "CT"); if (s != NULL) { sprintf(val, "%f", ((t_rmat *)(ds->obj))->rr->v[4]); XML_Set_Attribute_Value(x, "CT", val); } } ds = ds->next; assert(ds); s = XML_Get_Attribute_Value(child, "tstv"); if (s != NULL) { sprintf(val, "%f", ((scalar_dbl *)(ds->obj))->v); XML_Set_Attribute_Value(child, "tstv", val); } child = child->next; } while (child); } parent = XML_Search_Node_Name("siterates", YES, tree->xml_root); if (parent != NULL) { child = parent->child; assert(child != NULL); int class = 0; do { s = XML_Get_Attribute_Value(child, "init.value"); if (s != NULL) { v = atof(s); if (Are_Equal(v, 0.0, 1E-20) == NO) { sprintf(val, "%f", ((t_ras *)(parent->ds->obj))->gamma_rr->v[class]); XML_Set_Attribute_Value(child, "init.value", val); class ++; } } child = child->next; } while (child); child = XML_Search_Node_Name("weights", YES, parent); assert(child != NULL); s = XML_Get_Attribute_Value(child, "family"); assert(s != NULL); if (!strcmp(s, "gamma")) { s = XML_Get_Attribute_Value(child, "alpha"); if (s != NULL) { sprintf(val, "%f", ((t_ras *)(parent->ds->obj))->alpha->v); XML_Set_Attribute_Value(child, "alpha", val); } } else if (!strcmp(s, "gamma+inv")) { s = XML_Get_Attribute_Value(child, "alpha"); if (s != NULL) { sprintf(val, "%f", ((t_ras *)(parent->ds->obj))->alpha->v); XML_Set_Attribute_Value(child, "alpha", val); sprintf(val, "%f", ((t_ras *)(parent->ds->obj))->pinvar->v); XML_Set_Attribute_Value(child, "pinv", val); } } child = XML_Search_Node_Name("weights", YES, parent); child = child->child; assert(child); class = 0; do { // Find the rate class that this weight instance points to s = XML_Get_Attribute_Value(child, "appliesto"); assert(s); x = XML_Search_Node_Attribute_Value("id", s, YES, parent); assert(x); s = XML_Get_Attribute_Value(x, "init.value"); if (s != NULL) { v = atof(s); if (Are_Equal(v, 0.0, 1E-20) == NO) { sprintf(val, "%f", ((t_ras *)(parent->ds->obj))->gamma_r_proba->v[class]); XML_Set_Attribute_Value(child, "value", val); class ++; } else { sprintf(val, "%f", 0.0); XML_Set_Attribute_Value(child, "value", val); } } child = child->next; } while (child); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// stephaneguindon-phyml-76a39c8/src/xml.h000066400000000000000000000053611501136442400201470ustar00rootroot00000000000000#include #ifndef XML_H #define XML_H #include "utilities.h" xml_node *XML_Load_File(FILE *fp); int XML_Add_Character(int c, char **bufptr, char **buffer, int *bufsize); int XML_Parse_Element(FILE *fp, xml_node *n); int XML_Make_And_Set_Attribute(xml_node *n, char *attr_name, char *attr_value); xml_attr *XML_Make_Attribute(xml_attr *prev, char *attr_name, char *attr_value); void XML_Make_Node_Id(xml_node *n, char *id); int XML_Set_Node_Id(xml_node *n, char *id); int XML_Set_Node_Value(xml_node *n, char *val); void XML_Make_Node_Value(xml_node *n, char *val); xml_node *XML_Search_Node_Name(char *name, int skip, xml_node *node); char *XML_Get_Attribute_Value(xml_node *node, char *id); int XML_Validate_Attr_Int(char *target, int num, ...); void XML_Free_XML_Attr(xml_attr *attr); void XML_Free_XML_Node(xml_node *node); void XML_Free_XML_Tree(xml_node *node); xml_node *XML_Search_Node_ID(char *id, int skip, xml_node *node); xml_node *XML_Make_Node(char *name); xml_node *XML_Search_Node_Attribute_Value(char *attr_name, char *value, int skip, xml_node *node); void XML_Check_Siterates_Node(xml_node *prev); int XML_Get_Number_Of_Classes_Siterates(xml_node *prev); int XML_Siterates_Number_Of_Classes(xml_node *sr_node); void XML_Check_Duplicate_ID(xml_node *n); void XML_Count_Number_Of_Node_With_ID(char *id, int *count, xml_node *n); void XML_Count_Number_Of_Node_With_Name(char *name, int *count, xml_node *n); void XML_Write_XML_Graph(FILE *fp, xml_node *root); void XML_Write_XML_Node(FILE *fp, int *indent, short int recurr_next, short int recurr_child, xml_node *root); xml_attr *XML_Search_Attribute(xml_node *n, char *target_attr_name); xml_node *XML_Copy_XML_Graph(xml_node *root); void XML_Copy_XML_Node(xml_node *cpy_root, xml_node *root); void Check_Mandatory_XML_Node(xml_node *root, char *name); xml_node *XML_Search_Node_Generic(char *nd_name, char *attr_name, char *attr_val, int skip, xml_node *node); t_tree *XML_Process_Base(char *xml_filename); int XML_Number_Of_Taxa_In_Clade(xml_node *n_clade); char **XML_Read_Clade(xml_node *n_clade, t_tree *tree); void DATE_XML(char *xml_filename); void XML_Read_Calibration(xml_node *root, t_tree *tree); int XML_Add_Attribute(xml_node *n, char *attr_name, char *attr_value); xml_node *XML_Add_Node(xml_node *parent, char *nd_name); void XML_Write_Node_Value(FILE *fp, char *indent, xml_node *n); void XML_Update_XML_Struct_Given_Model_Params(t_tree *tree); int XML_Set_Attribute_Value(xml_node *n, char *attr_name, char *attr_value); void XML_Prune_XML_Tree(xml_node *node); #endif stephaneguindon-phyml-76a39c8/stamp-h1000066400000000000000000000000271501136442400177560ustar00rootroot00000000000000timestamp for config.h