HasGP (empty) → 0.1
raw patch · 30 files changed
+10273/−0 lines, 30 filesdep +basedep +haskell98dep +hmatrixsetup-changed
Dependencies added: base, haskell98, hmatrix, hmatrix-special, mtl, parsec, random
Files
- HasGP.cabal +102/−0
- LICENSE +675/−0
- README +10/−0
- Setup.hs +2/−0
- src/HasGP/Classification/EP/ClassificationEP.hs +406/−0
- src/HasGP/Classification/Laplace/ClassificationLaplace.hs +280/−0
- src/HasGP/Covariance/Basic.hs +80/−0
- src/HasGP/Covariance/SquaredExp.hs +61/−0
- src/HasGP/Covariance/SquaredExpARD.hs +73/−0
- src/HasGP/Data/BishopData.hs +44/−0
- src/HasGP/Data/Files/gpml-classifier-test.txt +6561/−0
- src/HasGP/Data/Files/gpml-classifier-x.txt +120/−0
- src/HasGP/Data/Files/gpml-classifier-y.txt +120/−0
- src/HasGP/Data/Normalise.hs +203/−0
- src/HasGP/Data/RWData1.hs +47/−0
- src/HasGP/Demos/ClassificationDemo1.hs +120/−0
- src/HasGP/Demos/ClassificationDemo2.hs +85/−0
- src/HasGP/Demos/RegressionDemo1.hs +70/−0
- src/HasGP/Likelihood/Basic.hs +40/−0
- src/HasGP/Likelihood/LogLogistic.hs +46/−0
- src/HasGP/Likelihood/LogPhi.hs +51/−0
- src/HasGP/Parsers/SvmLight.hs +404/−0
- src/HasGP/Regression/Regression.hs +142/−0
- src/HasGP/Support/Functions.hs +74/−0
- src/HasGP/Support/Iterate.hs +74/−0
- src/HasGP/Support/Linear.hs +95/−0
- src/HasGP/Support/MatrixFunction.hs +64/−0
- src/HasGP/Support/Random.hs +87/−0
- src/HasGP/Support/Solve.hs +100/−0
- src/HasGP/Types/MainTypes.hs +37/−0
+ HasGP.cabal view
@@ -0,0 +1,102 @@+-- HasGP.cabal auto-generated by cabal init. For additional options,+-- see+-- http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#pkg-descr.+-- The name of the package.+Name: HasGP++-- The package version. See the Haskell package versioning policy+-- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for+-- standards guiding when and how versions should be incremented.+Version: 0.1++-- A short (one-line) description of the package.+Synopsis: A Haskell library for inference using Gaussian processes++-- A longer description of the package.+Description: A Haskell library implementing algorithms for supervised learning, roughly corresponding to chapters 1 to 5 of "Gaussian Processes for Machine Learning" by Carl Rasmussen and Christopher Williams, The MIT Press 2006. In particular, algorithms are provides for regression and for two-class classification using either the Laplace or EP approximation. ++-- URL for the project homepage or repository.+Homepage: http://www.cl.cam.ac.uk/~sbh11/HasGP++-- The license under which the package is released.+License: GPL-3++-- The file containing the license text.+License-file: LICENSE++-- The package author(s).+Author: Sean B. Holden++-- An email address to which users can send suggestions, bug reports,+-- and patches.+Maintainer: sbh11@cl.cam.ac.uk++-- A copyright notice.+Copyright: Copyright (C) 2011 Sean Holden++Category: AI, Classification, Datamining, Statistics++Build-type: Simple++-- Extra files to be distributed with the package, such as examples or+-- a README.+Extra-source-files: README++-- Constraint on the version of Cabal needed to build this package.+Cabal-version: >=1.6++Stability: Experimental++Bug-reports: sbh11@cl.cam.ac.uk++Package-url: http://www.cl.cam.ac.uk/~sbh11/HasGP/HasGP-0.1.tar.gz++Tested-with: GHC ==7.0.3++Data-files: *.txt++Data-dir: src/HasGP/Data/Files++Library+ -- Modules exported by the library.+ Exposed-modules: HasGP.Classification.EP.ClassificationEP, + HasGP.Classification.Laplace.ClassificationLaplace, + HasGP.Covariance.Basic, + HasGP.Covariance.SquaredExp, + HasGP.Covariance.SquaredExpARD, + HasGP.Data.BishopData, + HasGP.Data.Normalise, + HasGP.Data.RWData1, + HasGP.Demos.ClassificationDemo1, + HasGP.Demos.ClassificationDemo2, + HasGP.Demos.RegressionDemo1, + HasGP.Likelihood.Basic, + HasGP.Likelihood.LogLogistic, + HasGP.Likelihood.LogPhi, + HasGP.Parsers.SvmLight, + HasGP.Regression.Regression, + HasGP.Support.Functions, + HasGP.Support.Iterate, + HasGP.Support.Linear, + HasGP.Support.MatrixFunction, + HasGP.Support.Random, + HasGP.Support.Solve, + HasGP.Types.MainTypes+ + -- Packages needed in order to build this package.+ Build-depends: base == 4.*,+ haskell98 == 1.*,+ parsec == 3.*,+ random == 1.*,+ mtl == 2.*,+ hmatrix == 0.12.*,+ hmatrix-special == 0.1.*+ + hs-source-dirs: src++ -- Modules not exported by this package.+ -- Other-modules: + + -- Extra tools (e.g. alex, hsc2hs, ...) needed to build the source.+ -- Build-tools: +
+ LICENSE view
@@ -0,0 +1,675 @@+ GNU GENERAL PUBLIC LICENSE+ Version 3, 29 June 2007++ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>+ 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.++ <one line to give the program's name and a brief idea of what it does.>+ Copyright (C) <year> <name of author>++ 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 <http://www.gnu.org/licenses/>.++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:++ <program> Copyright (C) <year> <name of author>+ 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+<http://www.gnu.org/licenses/>.++ 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+<http://www.gnu.org/philosophy/why-not-lgpl.html>.+
+ README view
@@ -0,0 +1,10 @@+The HasGP package for Gaussian process inference in Haskell+-----------------------------------------------------------++Copyright (C) 2011 Sean Holden sbh11@cl.cam.ac.uk++For a detailed description of how to install, use and modify this code +please download the User Manual from the project site at:++http://www.cl.cam.ac.uk/~sbh11/HasGP/+
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ src/HasGP/Classification/EP/ClassificationEP.hs view
@@ -0,0 +1,406 @@+{- | ClassificationEP is a module in the HasGP Gaussian Process+ library. It implements basic Gaussian Process Classification for two + classes using the EP approximation. Targets should be +1/-1. + + Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Classification.EP.ClassificationEP + ( + EPValue(eValue,siteState,count),+ EPConvergenceTest,+ EPSiteState,+ EPState,+ SiteOrder,+ generateRandomSiteOrder,+ generateFixedSiteOrder,+ gpClassifierEPEvidence,+ gpClassifierEPLearn,+ gpClassifierEPPredict,+ gpClassifierEPLogEvidence,+ gpClassifierEPLogEvidenceList,+ gpClassifierEPLogEvidenceVec+ ) where ++import Numeric.LinearAlgebra++import Control.Monad.State +import System.Random++import HasGP.Types.MainTypes+import HasGP.Support.MatrixFunction+import HasGP.Support.Linear+import HasGP.Support.Functions+import HasGP.Support.Solve+import HasGP.Support.Iterate+import HasGP.Support.Random+import HasGP.Covariance.Basic+import HasGP.Likelihood.Basic++-- | A convergence test for EP usually depends on the evidence and +-- the number of iterations so far. This allows us to specify +-- completely arbitrary convergence tests.+data EPValue = EPValue {+ eValue::Double,+ siteState::EPSiteState,+ count::Int+ }++-- | By passing a function with this type we can specify arbitrary +-- convergence tests. +type EPConvergenceTest = (EPValue -> EPValue -> Bool)++-- | When updating a single site at a time you keep track of var, +-- tauTilde, mu, nuTilde, TauMinus, and MuMinus.+data EPSiteState = EPSiteState {+ var::DMatrix, + tauTilde::DVector, + mu::DVector, + nuTilde::DVector,+ tauMinus::DVector,+ muMinus::DVector+ } ++-- | We hide the state used in performing EP using the state monad. +-- We need to include a random number generator and the number of +-- iterations.+type EPState = (EPSiteState, StdGen, Int)++-- | If we're updating sites in a random order then we need access to +-- the random number generator. +type SiteOrder = State EPState [Int]++-- | Generates a basic start state for the sites, with var = covariance +-- matrix and all vectors = 0.+generateInitialSiteState :: CovarianceMatrix + -> Int -- ^ Number of sites+ -> EPSiteState+generateInitialSiteState k n = EPSiteState k z1 z2 z3 z4 z5+ where+ z1 = constant 0.0 n+ z2 = constant 0.0 n+ z3 = constant 0.0 n+ z4 = constant 0.0 n+ z5 = constant 0.0 n++-- | Updates for the EP version of Gaussian Process Classifiers.+-- cavityParameters, marginalMoments and siteParameters +-- are successive parts of the update for a single site.+cavityParameters :: Double -- ^ varI+ -> Double -- ^ tauTildeI+ -> Double -- ^ muI+ -> Double -- ^ nuTildeI+ -> (Double,Double)+cavityParameters varI tauTildeI muI nuTildeI = (tauMinusI, nuMinusI)+ where+ varIInv = 1 / varI+ tauMinusI = varIInv - tauTildeI + nuMinusI = (varIInv * muI) - nuTildeI++marginalMoments :: Double -- ^ muMinusI+ -> Double -- ^ tI+ -> Double -- ^ varMinusI+ -> (Double,Double)+marginalMoments muMinusI tI varMinusI = (muHatI, varHatI)+ where + zI = (tI * muMinusI) / (sqrt (1 + varMinusI))+ nopz = nOverPhi zI+ muHatI = muMinusI + (((tI * varMinusI) / (sqrt (1 + varMinusI))) * nopz)+ varHatI = varMinusI - + ((((square varMinusI) / (1 + varMinusI)) * nopz) * (zI + nopz))++siteParameters :: Double -- ^ tauTildeI+ -> Double -- ^ varHatI+ -> Double -- ^ tauMinusI+ -> Double -- ^ muHatI+ -> Double -- ^ nuMinusI+ -> (Double,Double,Double)+siteParameters tauTildeI varHatI tauMinusI muHatI nuMinusI = + (deltaTauTilde, tauTildeINew, nuTildeINew)+ where+ deltaTauTilde = (1 / varHatI) - tauMinusI - tauTildeI+ tauTildeINew = tauTildeI + deltaTauTilde+ nuTildeINew = ((1 / varHatI) * muHatI) - nuMinusI++-- | Do a complete update for site i.+updateOneSite :: Targets -- ^ Labels+ -> Int -- ^ Number of sites+ -> Int -- ^ Site to update+ -> EPSiteState+ -> EPSiteState+updateOneSite t n i (EPSiteState var tauTilde mu nuTilde oldTauMinus + oldMuMinus) = + -- oldTauMinusI, oldMuMinus not used but need to be updated.+ EPSiteState newVar newTauTilde newMu newNuTilde newTauMinus newMuMinus + where + -- hmatrix counts from 0 whereas I'm using 1.+ i2 = i-1 + tauTildeI = (tauTilde @> i2)+ varII = var @@> (i2,i2)+ (tauMinusI, nuMinusI) = + cavityParameters varII tauTildeI (mu @> i2) (nuTilde @> i2)+ varMinusI = (1 / tauMinusI)+ muMinusI = (nuMinusI / tauMinusI)+ (muHatI, varHatI) = marginalMoments muMinusI (t @> i2) varMinusI+ (deltaTauTilde, tauTildeINew, nuTildeINew) = + siteParameters tauTildeI varHatI tauMinusI muHatI nuMinusI+ newTauTilde = replaceInVector tauTilde (i2+1) tauTildeINew + newNuTilde = replaceInVector nuTilde (i2+1) nuTildeINew+ newTauMinus = replaceInVector oldTauMinus (i2+1) tauMinusI + newMuMinus = replaceInVector oldMuMinus (i2+1) muMinusI+ sI = subMatrix (0,i2) (n,1) var+ newVar = var - (scale (deltaTauTilde / (1 + (deltaTauTilde * varII)))+ (sI <> (trans sI)))+ newMu = flatten $ (newVar <> (asColumn newNuTilde))++-- | Generate a random permutation. This is wrapped up in the state +-- transformer generateRandomSiteOrder.+randomPermutation :: StdGen -- ^ Random number generator+ -> Int -- ^ Size of list required+ -> (StdGen, [Int]) -- ^ New generator and result.+randomPermutation g n = rP g (n-1) [1..n] []+ where+ rP g' n' [] result = (g', result)+ rP g' n' [x] result = (g', x:result)+ rP g' n' xs result = rP newG (n' - 1) newXs (m:result)+ where+ (r, newG) = randomR (0, n') g'+ m = xs !! r+ newXs = filter (\x -> x /= m) xs ++-- | We're often going to want to update sites in a random order. +-- So we need a state transformer that takes the current state (which +-- includes a random number generator) and produces a random permutation.+generateRandomSiteOrder :: SiteOrder+generateRandomSiteOrder = do + (state, g, n) <- get+ let (newG, p) = randomPermutation g (dim $ tauTilde state)+ put (state, newG, n)+ return p++-- | For completeness: just in case you want to update sites in a +-- non-random manner, this state transformer does exactly that.+generateFixedSiteOrder :: SiteOrder+generateFixedSiteOrder = do+ (state, g, n) <- get+ return [1..(dim $ tauTilde state)]++-- | Update all the sites in the order specified by a list of Ints+updateAllSites :: Targets + -> Int -- ^ Number of sites+ -> [Int] -- ^ Sites to update+ -> EPSiteState+ -> EPSiteState+updateAllSites t n [] state = state+updateAllSites t n (s:ss) state = updateAllSites t n ss newState+ where+ newState = updateOneSite t n s state++-- | Re-compute the approximation after updating all the sites.+-- Outputs \Sigma and \mu.+recomputeApproximation :: CovarianceMatrix+ -> Int -- ^ Number of sites+ -> DVector -- ^ tauTilde+ -> DVector -- ^ nuTilde+ -> (DMatrix, DMatrix, DVector)+recomputeApproximation k n tauTilde nuTilde = + (l, finalVar, finalMu)+ where+ rootSTilde = mapVector sqrt tauTilde+ l = trans $ chol ((ident n) + (abaDiagDiag rootSTilde k))+ v = generalSolve lowerSolve l (preMultiply rootSTilde k) + finalVar = k - ((trans v) <> v) + finalMu = flatten $ finalVar <> (asColumn nuTilde) ++-- | Compute the approximation to the log marginal likelihood.+gpClassifierEPEvidence :: CovarianceMatrix + -> Targets + -> DMatrix -- ^ L matrix+ -> EPSiteState+ -> Double -- ^ log marginal likelihood.+gpClassifierEPEvidence k t l state = + (terms1and4 + term3 + terms2and5)+ where+ tT = tauTilde state+ nT = nuTilde state+ tM = tauMinus state+ mM = muMinus state+ oneOverTauMinus = mapVector (1/) $ tM+ sumLog = sum $ toList $ mapVector log $ takeDiag l+ terms1and4 = + (0.5 * (sum $ toList $ mapVector (log . (1+)) + (zipVectorWith (*) tT oneOverTauMinus))) - sumLog+ term3 = + sum $ toList $ + mapVector logPhi (zipVectorWith (/) + (zipVectorWith (*) t mM) + (mapVector (sqrt . (1+)) oneOverTauMinus))+ rootSTilde = diag $ mapVector sqrt tT+ vM = generalSolve lowerSolve l + (preMultiply (mapVector sqrt tT) k)+ -- vM = generalSolve upperSolve (trans l) (rootSTilde <> k) + invTPlusSTilde = + diag $ mapVector (1/) $ tT + tM+ part1 = + 0.5 * ((asRow nT) <> + (k - ((trans vM) <> vM) - invTPlusSTilde) <> + (asColumn nT))+ part2 = + 0.5 * ((asRow mM) <> (diag tM) <> invTPlusSTilde <> + ((asColumn (zipVectorWith (*) tT mM)) - + (asColumn $ (scale 2 nT))))+ terms2and5 = (part1 + part2) @@> (0,0) ++-- | As we're hiding the state using the State monad, we make a state +-- transformer that uses updateAllSites and recomputeApproximation to +-- do a complete single update. This will make use of an arbitrary +-- state transformer to produce a list specifying the order to update +-- the sites in. The output is the l matrix produced when recomputing the +-- approximation.+doOneUpdate :: CovarianceMatrix + -> Targets + -> SiteOrder -- ^ Supplier of update order. + -> State EPState EPValue+doOneUpdate k t siteOrder = do+ order <- siteOrder+ (state,g,i) <- get+ let sites = dim $ tauTilde state+ let state' = updateAllSites t sites order state+ let finalTT = tauTilde state' + let finalNT = nuTilde state'+ let finalTM = tauMinus state'+ let finalMM = muMinus state'+ let (l, finalVar, finalMu) = recomputeApproximation k sites finalTT finalNT+ let state'' = EPSiteState finalVar finalTT finalMu finalNT finalTM finalMM+ put (state'', g, i+1) + let logML = gpClassifierEPEvidence k t l state''+ return $ EPValue logML state'' (i+1)+ +-- | The learning algorithm. Takes an arbitrary function for convergence +-- testing.+gpClassifierEPLearn :: CovarianceMatrix + -> Targets + -> SiteOrder+ -> EPConvergenceTest+ -> (EPValue, EPState)+gpClassifierEPLearn k t siteOrder converged = + runState (iterateToConvergence'' doOnce converged) start+ where+ doOnce = doOneUpdate k t siteOrder + start = ((generateInitialSiteState k (dim t)), mkStdGen 0, 0) + +-- | Prediction with GP classifiers based on EP learning.+-- Takes a matrix in which each row is an example to be +-- classified.+gpClassifierEPPredict :: (CovarianceFunction c) => EPSiteState+ -> Inputs + -> Targets -- ^ Inputs in training set+ -> CovarianceMatrix+ -> c -- ^ Covariance Function+ -> Inputs -- ^ New inputs+ -> DVector+gpClassifierEPPredict state i t k c xStars + = fromList $ map phiIntegral (zipWith (/) fStar (map (sqrt . (1+)) vfStar))+ where+ nT = nuTilde state + tT = tauTilde state + d = dim t+ rootSTildeV = mapVector sqrt tT+ rootSTilde = diag rootSTildeV+ l = trans $ chol ((ident d) + (abaDiagDiag rootSTildeV k))+ z = rootSTilde + <> (asColumn + (upperSolve (trans l) + (lowerSolve l (flatten $ + (rootSTilde <> k <> (asColumn nT))))))+ xStarsRows = toRows xStars+ covarianceWithTestInputs = + fromRows [covarianceWithPoint c i xStar | xStar <- xStarsRows]+ fStar = + toList $ flatten $ + (covarianceWithTestInputs <> ((asColumn nT) - z))+ v = [lowerSolve l (rootSTilde <> kxStar) | + kxStar <- (toColumns $ trans $ covarianceWithTestInputs)]+ vTv = zipWith (<.>) v v+ kxStarxStar = zipWith (covariance c) xStarsRows xStarsRows+ vfStar = zipWith (-) kxStarxStar vTv++-- | Compute the log evidence and its first derivative for the EP approximation +-- for GP classification. Targets should be +1/-1. Outputs the -log +-- marginal likelihood and a vector of its derivatives.+gpClassifierEPLogEvidence :: (CovarianceFunction c) => c -- ^ Covariance+ -> Inputs + -> Targets + -> SiteOrder+ -> EPConvergenceTest+ -> (Double, DVector)+gpClassifierEPLogEvidence c i t siteOrder converged + = (-logEvidence, -(zipVectorWith (*) (trueHyper c) (fromList dLogEvidence))) + where+ d = dim t+ k = covarianceMatrix c i+ (value, s) = gpClassifierEPLearn k t siteOrder converged+ nT = nuTilde $ siteState value+ tT = tauTilde $ siteState value+ logEvidence = eValue value+ rootSTildeV = mapVector sqrt tT+ rootSTilde = diag rootSTildeV+ l = trans $ chol ((ident d) + (abaDiagDiag rootSTildeV k))+ b = (asColumn nT) - + (rootSTilde <> + (asColumn $ upperSolve (trans l) + (lowerSolve l (flatten $ + rootSTilde <> k <> (asColumn nT)))))+ r = (b <> (trans b)) - + (rootSTilde <> + (generalSolve upperSolve (trans l) + (generalSolve lowerSolve l rootSTilde)))+ dLogEvidence = map ((0.5 *) . sum . toList . (abDiagOnly r)) + (makeMatricesFromPairs (dCovarianceDParameters c) i)++-- | Essentially the same as gpClassifierEPLogEvidence, but makes a +-- covariance function using the hyperparameters supplied in a list +-- and passes it on. +gpClassifierEPLogEvidenceList :: (CovarianceFunction c) => Inputs + -> Targets+ -> c -- ^ Covariance + -> SiteOrder+ -> EPConvergenceTest+ -> [Double]+ -> (Double, DVector)+gpClassifierEPLogEvidenceList i t cov siteOrder converged hyper = + gpClassifierEPLogEvidence cov2 i t siteOrder converged+ where + cov2 = makeCovarianceFromList cov hyper++-- | Essentially the same as gpClassifierEPLogEvidence, but makes a +-- covariance function using the hyperparameters supplied in a vector +-- and passes it on. +gpClassifierEPLogEvidenceVec :: (CovarianceFunction c) => Inputs + -> Targets + -> c -- ^ Covariance+ -> SiteOrder+ -> EPConvergenceTest+ -> DVector+ -> (Double, DVector)+gpClassifierEPLogEvidenceVec i t cov siteOrder converged hyper = + gpClassifierEPLogEvidence cov2 i t siteOrder converged+ where + cov2 = makeCovarianceFromList cov (toList hyper)+++
+ src/HasGP/Classification/Laplace/ClassificationLaplace.hs view
@@ -0,0 +1,280 @@+{- | ClassificationLaplace is a module in the HasGP Gaussian Process+ library. It implements basic Gaussian Process Classification for two + classes using the Laplace approximation. For details see + www.gaussianprocesses.org.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Classification.Laplace.ClassificationLaplace + (+ LaplaceValue(..),+ LaplaceConvergenceTest,+ gpCLaplaceLearn,+ convertToP_CG,+ gpCLaplacePredict,+ gpCLaplacePredict',+ gpCLaplaceLogEvidence,+ gpCLaplaceLogEvidenceList,+ gpCLaplaceLogEvidenceVec+ ) where ++import Numeric.LinearAlgebra++import Control.Monad.State++import HasGP.Types.MainTypes+import HasGP.Support.MatrixFunction+import HasGP.Support.Linear+import HasGP.Support.Functions+import HasGP.Support.Solve+import HasGP.Support.Iterate+import HasGP.Covariance.Basic+import HasGP.Likelihood.Basic++-- | Computing the Laplace approximation requires us to deal with +-- quite a lot of information. To keep things straightforward we +-- wrap this up in a type.+--+-- The value associated with a state includes f, evidence, objective, +-- derivative of the objective, the vector a needed to compute the +-- derivative of the evidence, and the number of iterations.+data LaplaceValue = LaplaceValue {+ fValue::DVector,+ eValue::Double,+ psiValue::Double,+ dPsiValue::DVector,+ aValue::DVector,+ count::Int+ }++-- | The state is the vector f and the number of iterations.+type LaplaceState = (DVector,Int)++-- | A convergence test is a function that takes two consecutive values +-- during iteration and works out whether you've converged or not.+type LaplaceConvergenceTest = (LaplaceValue -> LaplaceValue -> Bool)++-- | Compute the Laplace update for the latent variables f.+--+-- Produces new f, log marginal likelihood, objective, derivative +-- of objective, and the vector a which is needed to compute the derivative +-- of the log marginal likelihood.+gpCLaplaceUpdate :: LogLikelihood l => CovarianceMatrix + -> Targets + -> l -- ^ log likelihood+ -> LaplaceState -- ^ Current f and n.+ -> LaplaceValue+gpCLaplaceUpdate c t like (f,n) = + LaplaceValue newF e psi dPsi aV (n+1)+ where+ d = dim t+ diagW = -(zipVectorWith (ddLikelihood like) t f)+ w = diag diagW+ diagRootW = mapVector sqrt diagW+ rootW = diag diagRootW+ -- MUST use abaDiagDiag, or errors accumulate and symmetry is lost.+ ll = trans $ chol ((ident d) + (abaDiagDiag diagRootW c))+ dL = zipVectorWith (dLikelihood like) t f + b = (w <> (asColumn f)) + (asColumn dL) + a = b - + (rootW <> + asColumn (upperSolve (trans ll) + (lowerSolve ll (head $ toColumns (rootW <> c <> b)))))+ aV = head $ toColumns a+ newF = head $ toColumns (c <> a)+ psi = (-(1/2) * (aV <.> newF)) + + (sum $ toList $ zipVectorWith (likelihood like) t newF)+ -- Not in the book but easily proved using the fact that f = Ka and + -- dPsi = d log likelihood - (inverse of K) f+ dPsi = dL - aV + -- log marginal likelihood.+ e = (psi - (sum $ map log $ toList $ takeDiag ll)) + +-- | Iteration to convergence is much nicer if the state is hidden using +-- the State monad.+--+-- This uses the pure gpCLaplaceUpdate function, and wraps it up in a +-- state transformer that's usable by the general functions in +-- HasGP.Support.Iterate.+singleIteration::LogLikelihood l => CovarianceMatrix + -> Targets + -> l -- ^ log likelihood+ -> State LaplaceState LaplaceValue+singleIteration c t like = state sI + where+ sI (f, n) = (newValue, ((fValue newValue), (n+1)))+ where+ newValue = gpCLaplaceUpdate c t like (f,n)++-- | Iteration to convergence is much nicer if the state is hidden using +-- the State monad.+--+-- This uses a general function from HasGP.Support.Iterate to implement +-- the learning algorithm. Convergence testing is done using a user +-- supplied function.+gpCLaplaceLearn::LogLikelihood l => CovarianceMatrix + -> Targets + -> l -- ^ log likelihood+ -> LaplaceConvergenceTest+ -> LaplaceValue+gpCLaplaceLearn c t like converged = + evalState (iterateToConvergence'' doOnce converged) (constant 0.0 (dim t),1)+ where+ doOnce = singleIteration c t like++-- | Converts pairs of fStar and V produced by the prediction functions +-- to actual probabilities, assuming the cumulative Gaussian likelihood +-- was used.+convertToP_CG :: (Double,Double) -> Double+convertToP_CG (fStar,v) = phiIntegral (fStar / (sqrt (1 + v)))++-- | Predict using a GP classifier based on the Laplace approximation.+--+-- Produces fStar and V rather than the actual probability as +-- further approximations are then required to compute this.+gpCLaplacePredict :: (CovarianceFunction cF, LogLikelihood l) => DVector -- ^ f+ -> Inputs + -> Targets + -> CovarianceMatrix -- ^ Covariance matrix+ -> cF -- ^ Covariance function+ -> l -- ^ log likelihood+ -> Input -- ^ Input to classify+ -> (Double,Double)+gpCLaplacePredict f inputs t c cov like x = + (fStar, (((covariance cov) x x) - (v <.> v)))+ where+ d = dim t+ diagW = -(zipVectorWith (ddLikelihood like) t f)+ w = diag diagW+ diagRootW = mapVector sqrt diagW+ rootW = diag diagRootW+ ll = trans $ chol ((ident d) + (abaDiagDiag diagRootW c)) + kxxStar = covarianceWithPoint cov inputs x + fStar = kxxStar <.> (zipVectorWith (dLikelihood like) t f) + v = lowerSolve ll (zipVectorWith (*) diagRootW kxxStar)++-- | Predict using a GP classifier based on the Laplace approximation.+--+-- The same as gpLaplacePredict but applies to a collection of new +-- inputs supplied as the rows of a matrix.+--+-- Produces a list of pairs of fStar and V rather than the actual +-- probabilities as further approximations are then required to compute +-- these.+gpCLaplacePredict' :: (CovarianceFunction cF, LogLikelihood l) => DVector -- ^ f+ -> Inputs + -> Targets + -> CovarianceMatrix + -> cF -- ^ Covariance function+ -> l -- ^ log likelihood+ -> Inputs -- ^ Inputs to classify+ -> [(Double,Double)]+gpCLaplacePredict' f inputs t c cov like x = + map predict $ toRows x+ where+ predict = gpCLaplacePredict f inputs t c cov like++-- | Compute the log marginal likelihood and its first derivative for the +-- Laplace approximation for GP classification.+--+-- The convergence test input tests for convergence when +-- using gpClassificationLaplaceLearn. Note that a covariance function +-- contains its own parameters and can compute its own derivative so +-- theta does not need to be passed seperately.+--+-- Outputs the NEGATIVE log marginal likelihood and a vector of its +-- derivatives. The derivatives are with respect to the actual, NOT log +-- parameters.+gpCLaplaceLogEvidence :: (CovarianceFunction cF, LogLikelihood l) => Inputs + -> Targets + -> cF -- ^ Covariance function+ -> l -- ^ log likelihood+ -> LaplaceConvergenceTest + -> (Double, DVector)+gpCLaplaceLogEvidence i t cov like converged = + (-z, -dZ)+ where+ d = dim t+ cM = covarianceMatrix cov i+ LaplaceValue f z psi dPsi aV n = + gpCLaplaceLearn cM t like converged+ diagW = -(zipVectorWith (ddLikelihood like) t f)+ w = diag diagW+ diagRootW = mapVector sqrt diagW+ rootW = diag diagRootW+ ll = trans $ chol ((ident d) + (abaDiagDiag diagRootW cM))+ r = rootW <> (generalSolve upperSolve (trans ll) + (generalSolve lowerSolve ll rootW))+ c = generalSolve lowerSolve ll (rootW <> cM)+ s2 = flatten $ + (-0.5) * (diag ((takeDiag cM) - + (abDiagOnly (trans c) c))) <> + (asColumn (zipVectorWith (dddLikelihood like) t f))+ cList = makeMatricesFromPairs (dCovarianceDParameters cov) i+ s1a = fromList $ map (abaVV aV) cList+ s1b = fromList $ map (sum . toList . (abDiagOnly r)) cList+ s1 = 0.5 * (s1a - s1b)+ b = map (<> (asColumn $ zipVectorWith (dLikelihood like) t f)) cList+ s3 = map (\x -> x - (cM <> r <> x)) b + dZ = s1 + (fromList $ map (s2 <.>) (map flatten s3)) ++-- | A version of gpClassificationLaplaceEvidence that's usable by the+-- conjugate gradient function included in the hmatrix library. Computes +-- the log evidence and its first derivative for the Laplace approximation +-- for GP classification. The issue is that while it makes sense for a +-- covariance function to be implemented as a class so that any can easily +-- be used, we need to supply evidence and its derivatives directly as +-- functions of the hyperparameters, and these have to be supplied as +-- vectors of Doubles. The solution is to include a function in the +-- CovarianceFunction class that takes a list and returns a new covariance +-- function of the required type having the specified hyperparameters.+--+-- Parameters: The same parameters as gpClassifierLaplaceEvidence, plus +-- the list of hyperparameters. Outputs: negative log marginal likelihood +-- and a vector of its first derivatives. +-- +-- In addition to the above, this assumes that we want derivatives with +-- respect to log parameters and so converts using df/d log p = +-- p df/dp.+gpCLaplaceLogEvidenceList :: (CovarianceFunction cF, LogLikelihood l) => Inputs + -> Targets + -> cF + -> l + -> LaplaceConvergenceTest+ -> [Double] -- ^ log hyperparameters+ -> (Double, DVector)+gpCLaplaceLogEvidenceList i t cov like converged hyper = + (negZ, zipVectorWith (*) (fromList $ map exp hyper) negDZ)+ where + cov2 = makeCovarianceFromList cov hyper+ (negZ, negDZ) = gpCLaplaceLogEvidence i t cov2 like converged++-- | This is the same as gpCLaplaceLogEvidenceList but takes a vector +-- instead of a list.+gpCLaplaceLogEvidenceVec :: (CovarianceFunction cF, LogLikelihood l) => Inputs + -> Targets + -> cF + -> l + -> LaplaceConvergenceTest+ -> DVector + -> (Double, DVector)+gpCLaplaceLogEvidenceVec i t cov like converged + = (gpCLaplaceLogEvidenceList i t cov like converged) . toList+++
+ src/HasGP/Covariance/Basic.hs view
@@ -0,0 +1,80 @@+{- | Gaussian Process Library. This module contains assorted functions that + support the computation of covariance, constructing covariance matrices + etc.++ Covariance functions store log parameters. Functions are needed to return + the covariance and its derivative. Derivatives are with respect to the + actual parameters, NOT their logs.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Covariance.Basic + (+ CovarianceFunction,+ trueHyper,+ covariance,+ dCovarianceDParameters,+ makeCovarianceFromList,+ makeListFromCovariance,+ covarianceMatrix,+ covarianceWithPoint,+ covarianceWithPoints+ ) where++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes++class CovarianceFunction a where+ -- ^ The actual hyperparameter values.+ trueHyper :: a -> DVector + -- ^ The covariance+ covariance :: a -> DVector -> DVector -> Double + -- ^ Derivative of covariance with respect to parameters + dCovarianceDParameters :: a -> DVector -> DVector -> DVector + -- ^ Construct using log parameters.+ makeCovarianceFromList :: a -> [Double] -> a + -- ^ Get log parameters.+ makeListFromCovariance :: a -> [Double] ++-- | Construct a matrix of covariances from a covariance and a design matrix. +covarianceMatrix :: (CovarianceFunction c) => c -> Inputs + -> CovarianceMatrix+covarianceMatrix c d = (r><r) [(covariance c x y) | x <- dList, y <- dList]+ where+ r = rows d+ dList = toRows d++-- | Constructs the column vector required when a new input is included. +-- Constructed as a matrix to avoid further work elsewhere. +covarianceWithPoint :: (CovarianceFunction c) => c + -> Inputs+ -> Input+ -> DVector+covarianceWithPoint c d xStar = fromList [((covariance c) x xStar) | x <- dList]+ where+ r = rows d+ dList = toRows d++-- | covarianceWithPoint applied to a list of points to produce +-- a list of vectors.+covarianceWithPoints :: (CovarianceFunction c) => c + -> Inputs + -> [Input]+ -> [DVector]+covarianceWithPoints c d xStars = map (covarianceWithPoint c d) xStars++
+ src/HasGP/Covariance/SquaredExp.hs view
@@ -0,0 +1,61 @@+{- | Gaussian Process Library. This module contains the definition + of the standard squared exponential covariance function.++ Copyright (C) 2008-11 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Covariance.SquaredExp + (+ SquaredExponential(..)+ ) where++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Covariance.Basic++data SquaredExponential = SquaredExponential+ {+ f :: Double, -- ^ log \sigma_f^2+ l :: Double -- ^ log l+ } ++instance CovarianceFunction SquaredExponential where++ trueHyper se = mapVector exp $ fromList [(f se), (l se)]++ covariance se in1 in2 = + f2 * exp (-(1/(2 * (l2^2))) * (diff <.> diff))+ where + diff = in1 - in2+ f2 = exp (f se)+ l2 = exp (l se)++ dCovarianceDParameters se in1 in2 = + fromList [dLogByDF, dLogByDL]+ where + diff = in1 - in2+ d = diff <.> diff+ f2 = exp (f se)+ l2 = exp (l se)+ dLogByDF = exp (-(1/(2 * (l2^2))) * d) + dLogByDL = f2 * dLogByDF * (d * (l2^^(-3)))++ makeCovarianceFromList se [f, l] = SquaredExponential f l + makeCovarianceFromList se _ = + error "SquaredExp requires exactly 2 hyperparameters"++ makeListFromCovariance se = [f se, l se]+
+ src/HasGP/Covariance/SquaredExpARD.hs view
@@ -0,0 +1,73 @@+{- | Gaussian Process Library. This module contains the definition + of the standard squared exponential covariance function, extended + for use with Automatic Relevance Determination.++ s_f^2 exp (-1\/2 (x_1 - x_2)^T M (x_1 - x_2)) ++ Parameters: s_f^2 and vector containing the diagonal of M. + M is diag (1\/l_1^2,...,1\/l_?^2)++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Covariance.SquaredExpARD + ( + SquaredExponentialARD(..)+ ) where++import Numeric.LinearAlgebra+import HasGP.Types.MainTypes+import HasGP.Support.Linear+import HasGP.Support.Functions+import HasGP.Covariance.Basic++data SquaredExponentialARD = SquaredExponentialARD + {+ fARD :: Double,+ m :: DVector+ }++instance CovarianceFunction SquaredExponentialARD where++ trueHyper se = mapVector exp $ join [fromList [fARD se], m se]+ + covariance se x1 x2 = f2 * (exp ((-(1/2)) * (xAxDiag diff newM2)))+ where+ diff = x1 - x2+ f2 = exp (fARD se)+ newM2 = mapVector ((^^(-2)) . exp) (m se) ++ dCovarianceDParameters se x1 x2 = + join [(fromList [dKDLogF]), dKDLogM] -- You need to compute dK/dtheta, + -- NOT dK/dlogtheta+ where+ diff = x1 - x2+ d = mapVector square diff+ f2 = exp (fARD se)+ m2 = mapVector exp (m se)+ newM2 = mapVector (^^(-2)) m2+ dKDLogF = exp ((-(1/2)) * (xAxDiag diff newM2))+ dKDLogM = scale (f2 * dKDLogF) + (zipVectorWith (*) d (mapVector (^^(-3)) m2)) ++ makeCovarianceFromList se (f:rest) = + if (length rest) == (dim $ (m se))+ then SquaredExponentialARD f (fromList rest) + else error "SquaredExpARD needs the correct number of hyperparameters"+ makeCovarianceFromList se _ = + error "SquaredExpARD needs the correct number of hyperparameters"++ makeListFromCovariance se = (fARD se):(toList $ m se) +
+ src/HasGP/Data/BishopData.hs view
@@ -0,0 +1,44 @@+{- | BishopData is a module in the HasGP Gaussian Process library. + It contains functions to generate toy data as used in "Neural + Networks for Pattern Recognition," by Chris Bishop.++ There is one difference between this data and that in the book. + Namely: this data is adjusted to have zero mean, making it easier + to use in the demonstrations.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Data.BishopData where++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Support.Random++h :: Double -> Double+h x = (0.4 * (sin (2 * pi * x))) -- to get the original data add 0.5 to this++bishopData :: (Inputs, Targets)+bishopData = (asColumn inputs, (mapVector h inputs) + n)+ where+ xVar = 0.05+ random = normalVectorSimple 1 1 60+ n = scale (0.05) $ subVector 0 30 random+ i1 = (constant 0.25 15) + (scale (xVar) $ subVector 30 15 random)+ i2 = (constant 0.75 15) + (scale (xVar) $ subVector 45 15 random)+ inputs = join [i1, i2]
+ src/HasGP/Data/Files/gpml-classifier-test.txt view
@@ -0,0 +1,6561 @@+-4.000000 -4.000000+-4.000000 -3.900000+-4.000000 -3.800000+-4.000000 -3.700000+-4.000000 -3.600000+-4.000000 -3.500000+-4.000000 -3.400000+-4.000000 -3.300000+-4.000000 -3.200000+-4.000000 -3.100000+-4.000000 -3.000000+-4.000000 -2.900000+-4.000000 -2.800000+-4.000000 -2.700000+-4.000000 -2.600000+-4.000000 -2.500000+-4.000000 -2.400000+-4.000000 -2.300000+-4.000000 -2.200000+-4.000000 -2.100000+-4.000000 -2.000000+-4.000000 -1.900000+-4.000000 -1.800000+-4.000000 -1.700000+-4.000000 -1.600000+-4.000000 -1.500000+-4.000000 -1.400000+-4.000000 -1.300000+-4.000000 -1.200000+-4.000000 -1.100000+-4.000000 -1.000000+-4.000000 -0.900000+-4.000000 -0.800000+-4.000000 -0.700000+-4.000000 -0.600000+-4.000000 -0.500000+-4.000000 -0.400000+-4.000000 -0.300000+-4.000000 -0.200000+-4.000000 -0.100000+-4.000000 0.000000+-4.000000 0.100000+-4.000000 0.200000+-4.000000 0.300000+-4.000000 0.400000+-4.000000 0.500000+-4.000000 0.600000+-4.000000 0.700000+-4.000000 0.800000+-4.000000 0.900000+-4.000000 1.000000+-4.000000 1.100000+-4.000000 1.200000+-4.000000 1.300000+-4.000000 1.400000+-4.000000 1.500000+-4.000000 1.600000+-4.000000 1.700000+-4.000000 1.800000+-4.000000 1.900000+-4.000000 2.000000+-4.000000 2.100000+-4.000000 2.200000+-4.000000 2.300000+-4.000000 2.400000+-4.000000 2.500000+-4.000000 2.600000+-4.000000 2.700000+-4.000000 2.800000+-4.000000 2.900000+-4.000000 3.000000+-4.000000 3.100000+-4.000000 3.200000+-4.000000 3.300000+-4.000000 3.400000+-4.000000 3.500000+-4.000000 3.600000+-4.000000 3.700000+-4.000000 3.800000+-4.000000 3.900000+-4.000000 4.000000+-3.900000 -4.000000+-3.900000 -3.900000+-3.900000 -3.800000+-3.900000 -3.700000+-3.900000 -3.600000+-3.900000 -3.500000+-3.900000 -3.400000+-3.900000 -3.300000+-3.900000 -3.200000+-3.900000 -3.100000+-3.900000 -3.000000+-3.900000 -2.900000+-3.900000 -2.800000+-3.900000 -2.700000+-3.900000 -2.600000+-3.900000 -2.500000+-3.900000 -2.400000+-3.900000 -2.300000+-3.900000 -2.200000+-3.900000 -2.100000+-3.900000 -2.000000+-3.900000 -1.900000+-3.900000 -1.800000+-3.900000 -1.700000+-3.900000 -1.600000+-3.900000 -1.500000+-3.900000 -1.400000+-3.900000 -1.300000+-3.900000 -1.200000+-3.900000 -1.100000+-3.900000 -1.000000+-3.900000 -0.900000+-3.900000 -0.800000+-3.900000 -0.700000+-3.900000 -0.600000+-3.900000 -0.500000+-3.900000 -0.400000+-3.900000 -0.300000+-3.900000 -0.200000+-3.900000 -0.100000+-3.900000 0.000000+-3.900000 0.100000+-3.900000 0.200000+-3.900000 0.300000+-3.900000 0.400000+-3.900000 0.500000+-3.900000 0.600000+-3.900000 0.700000+-3.900000 0.800000+-3.900000 0.900000+-3.900000 1.000000+-3.900000 1.100000+-3.900000 1.200000+-3.900000 1.300000+-3.900000 1.400000+-3.900000 1.500000+-3.900000 1.600000+-3.900000 1.700000+-3.900000 1.800000+-3.900000 1.900000+-3.900000 2.000000+-3.900000 2.100000+-3.900000 2.200000+-3.900000 2.300000+-3.900000 2.400000+-3.900000 2.500000+-3.900000 2.600000+-3.900000 2.700000+-3.900000 2.800000+-3.900000 2.900000+-3.900000 3.000000+-3.900000 3.100000+-3.900000 3.200000+-3.900000 3.300000+-3.900000 3.400000+-3.900000 3.500000+-3.900000 3.600000+-3.900000 3.700000+-3.900000 3.800000+-3.900000 3.900000+-3.900000 4.000000+-3.800000 -4.000000+-3.800000 -3.900000+-3.800000 -3.800000+-3.800000 -3.700000+-3.800000 -3.600000+-3.800000 -3.500000+-3.800000 -3.400000+-3.800000 -3.300000+-3.800000 -3.200000+-3.800000 -3.100000+-3.800000 -3.000000+-3.800000 -2.900000+-3.800000 -2.800000+-3.800000 -2.700000+-3.800000 -2.600000+-3.800000 -2.500000+-3.800000 -2.400000+-3.800000 -2.300000+-3.800000 -2.200000+-3.800000 -2.100000+-3.800000 -2.000000+-3.800000 -1.900000+-3.800000 -1.800000+-3.800000 -1.700000+-3.800000 -1.600000+-3.800000 -1.500000+-3.800000 -1.400000+-3.800000 -1.300000+-3.800000 -1.200000+-3.800000 -1.100000+-3.800000 -1.000000+-3.800000 -0.900000+-3.800000 -0.800000+-3.800000 -0.700000+-3.800000 -0.600000+-3.800000 -0.500000+-3.800000 -0.400000+-3.800000 -0.300000+-3.800000 -0.200000+-3.800000 -0.100000+-3.800000 0.000000+-3.800000 0.100000+-3.800000 0.200000+-3.800000 0.300000+-3.800000 0.400000+-3.800000 0.500000+-3.800000 0.600000+-3.800000 0.700000+-3.800000 0.800000+-3.800000 0.900000+-3.800000 1.000000+-3.800000 1.100000+-3.800000 1.200000+-3.800000 1.300000+-3.800000 1.400000+-3.800000 1.500000+-3.800000 1.600000+-3.800000 1.700000+-3.800000 1.800000+-3.800000 1.900000+-3.800000 2.000000+-3.800000 2.100000+-3.800000 2.200000+-3.800000 2.300000+-3.800000 2.400000+-3.800000 2.500000+-3.800000 2.600000+-3.800000 2.700000+-3.800000 2.800000+-3.800000 2.900000+-3.800000 3.000000+-3.800000 3.100000+-3.800000 3.200000+-3.800000 3.300000+-3.800000 3.400000+-3.800000 3.500000+-3.800000 3.600000+-3.800000 3.700000+-3.800000 3.800000+-3.800000 3.900000+-3.800000 4.000000+-3.700000 -4.000000+-3.700000 -3.900000+-3.700000 -3.800000+-3.700000 -3.700000+-3.700000 -3.600000+-3.700000 -3.500000+-3.700000 -3.400000+-3.700000 -3.300000+-3.700000 -3.200000+-3.700000 -3.100000+-3.700000 -3.000000+-3.700000 -2.900000+-3.700000 -2.800000+-3.700000 -2.700000+-3.700000 -2.600000+-3.700000 -2.500000+-3.700000 -2.400000+-3.700000 -2.300000+-3.700000 -2.200000+-3.700000 -2.100000+-3.700000 -2.000000+-3.700000 -1.900000+-3.700000 -1.800000+-3.700000 -1.700000+-3.700000 -1.600000+-3.700000 -1.500000+-3.700000 -1.400000+-3.700000 -1.300000+-3.700000 -1.200000+-3.700000 -1.100000+-3.700000 -1.000000+-3.700000 -0.900000+-3.700000 -0.800000+-3.700000 -0.700000+-3.700000 -0.600000+-3.700000 -0.500000+-3.700000 -0.400000+-3.700000 -0.300000+-3.700000 -0.200000+-3.700000 -0.100000+-3.700000 0.000000+-3.700000 0.100000+-3.700000 0.200000+-3.700000 0.300000+-3.700000 0.400000+-3.700000 0.500000+-3.700000 0.600000+-3.700000 0.700000+-3.700000 0.800000+-3.700000 0.900000+-3.700000 1.000000+-3.700000 1.100000+-3.700000 1.200000+-3.700000 1.300000+-3.700000 1.400000+-3.700000 1.500000+-3.700000 1.600000+-3.700000 1.700000+-3.700000 1.800000+-3.700000 1.900000+-3.700000 2.000000+-3.700000 2.100000+-3.700000 2.200000+-3.700000 2.300000+-3.700000 2.400000+-3.700000 2.500000+-3.700000 2.600000+-3.700000 2.700000+-3.700000 2.800000+-3.700000 2.900000+-3.700000 3.000000+-3.700000 3.100000+-3.700000 3.200000+-3.700000 3.300000+-3.700000 3.400000+-3.700000 3.500000+-3.700000 3.600000+-3.700000 3.700000+-3.700000 3.800000+-3.700000 3.900000+-3.700000 4.000000+-3.600000 -4.000000+-3.600000 -3.900000+-3.600000 -3.800000+-3.600000 -3.700000+-3.600000 -3.600000+-3.600000 -3.500000+-3.600000 -3.400000+-3.600000 -3.300000+-3.600000 -3.200000+-3.600000 -3.100000+-3.600000 -3.000000+-3.600000 -2.900000+-3.600000 -2.800000+-3.600000 -2.700000+-3.600000 -2.600000+-3.600000 -2.500000+-3.600000 -2.400000+-3.600000 -2.300000+-3.600000 -2.200000+-3.600000 -2.100000+-3.600000 -2.000000+-3.600000 -1.900000+-3.600000 -1.800000+-3.600000 -1.700000+-3.600000 -1.600000+-3.600000 -1.500000+-3.600000 -1.400000+-3.600000 -1.300000+-3.600000 -1.200000+-3.600000 -1.100000+-3.600000 -1.000000+-3.600000 -0.900000+-3.600000 -0.800000+-3.600000 -0.700000+-3.600000 -0.600000+-3.600000 -0.500000+-3.600000 -0.400000+-3.600000 -0.300000+-3.600000 -0.200000+-3.600000 -0.100000+-3.600000 0.000000+-3.600000 0.100000+-3.600000 0.200000+-3.600000 0.300000+-3.600000 0.400000+-3.600000 0.500000+-3.600000 0.600000+-3.600000 0.700000+-3.600000 0.800000+-3.600000 0.900000+-3.600000 1.000000+-3.600000 1.100000+-3.600000 1.200000+-3.600000 1.300000+-3.600000 1.400000+-3.600000 1.500000+-3.600000 1.600000+-3.600000 1.700000+-3.600000 1.800000+-3.600000 1.900000+-3.600000 2.000000+-3.600000 2.100000+-3.600000 2.200000+-3.600000 2.300000+-3.600000 2.400000+-3.600000 2.500000+-3.600000 2.600000+-3.600000 2.700000+-3.600000 2.800000+-3.600000 2.900000+-3.600000 3.000000+-3.600000 3.100000+-3.600000 3.200000+-3.600000 3.300000+-3.600000 3.400000+-3.600000 3.500000+-3.600000 3.600000+-3.600000 3.700000+-3.600000 3.800000+-3.600000 3.900000+-3.600000 4.000000+-3.500000 -4.000000+-3.500000 -3.900000+-3.500000 -3.800000+-3.500000 -3.700000+-3.500000 -3.600000+-3.500000 -3.500000+-3.500000 -3.400000+-3.500000 -3.300000+-3.500000 -3.200000+-3.500000 -3.100000+-3.500000 -3.000000+-3.500000 -2.900000+-3.500000 -2.800000+-3.500000 -2.700000+-3.500000 -2.600000+-3.500000 -2.500000+-3.500000 -2.400000+-3.500000 -2.300000+-3.500000 -2.200000+-3.500000 -2.100000+-3.500000 -2.000000+-3.500000 -1.900000+-3.500000 -1.800000+-3.500000 -1.700000+-3.500000 -1.600000+-3.500000 -1.500000+-3.500000 -1.400000+-3.500000 -1.300000+-3.500000 -1.200000+-3.500000 -1.100000+-3.500000 -1.000000+-3.500000 -0.900000+-3.500000 -0.800000+-3.500000 -0.700000+-3.500000 -0.600000+-3.500000 -0.500000+-3.500000 -0.400000+-3.500000 -0.300000+-3.500000 -0.200000+-3.500000 -0.100000+-3.500000 0.000000+-3.500000 0.100000+-3.500000 0.200000+-3.500000 0.300000+-3.500000 0.400000+-3.500000 0.500000+-3.500000 0.600000+-3.500000 0.700000+-3.500000 0.800000+-3.500000 0.900000+-3.500000 1.000000+-3.500000 1.100000+-3.500000 1.200000+-3.500000 1.300000+-3.500000 1.400000+-3.500000 1.500000+-3.500000 1.600000+-3.500000 1.700000+-3.500000 1.800000+-3.500000 1.900000+-3.500000 2.000000+-3.500000 2.100000+-3.500000 2.200000+-3.500000 2.300000+-3.500000 2.400000+-3.500000 2.500000+-3.500000 2.600000+-3.500000 2.700000+-3.500000 2.800000+-3.500000 2.900000+-3.500000 3.000000+-3.500000 3.100000+-3.500000 3.200000+-3.500000 3.300000+-3.500000 3.400000+-3.500000 3.500000+-3.500000 3.600000+-3.500000 3.700000+-3.500000 3.800000+-3.500000 3.900000+-3.500000 4.000000+-3.400000 -4.000000+-3.400000 -3.900000+-3.400000 -3.800000+-3.400000 -3.700000+-3.400000 -3.600000+-3.400000 -3.500000+-3.400000 -3.400000+-3.400000 -3.300000+-3.400000 -3.200000+-3.400000 -3.100000+-3.400000 -3.000000+-3.400000 -2.900000+-3.400000 -2.800000+-3.400000 -2.700000+-3.400000 -2.600000+-3.400000 -2.500000+-3.400000 -2.400000+-3.400000 -2.300000+-3.400000 -2.200000+-3.400000 -2.100000+-3.400000 -2.000000+-3.400000 -1.900000+-3.400000 -1.800000+-3.400000 -1.700000+-3.400000 -1.600000+-3.400000 -1.500000+-3.400000 -1.400000+-3.400000 -1.300000+-3.400000 -1.200000+-3.400000 -1.100000+-3.400000 -1.000000+-3.400000 -0.900000+-3.400000 -0.800000+-3.400000 -0.700000+-3.400000 -0.600000+-3.400000 -0.500000+-3.400000 -0.400000+-3.400000 -0.300000+-3.400000 -0.200000+-3.400000 -0.100000+-3.400000 0.000000+-3.400000 0.100000+-3.400000 0.200000+-3.400000 0.300000+-3.400000 0.400000+-3.400000 0.500000+-3.400000 0.600000+-3.400000 0.700000+-3.400000 0.800000+-3.400000 0.900000+-3.400000 1.000000+-3.400000 1.100000+-3.400000 1.200000+-3.400000 1.300000+-3.400000 1.400000+-3.400000 1.500000+-3.400000 1.600000+-3.400000 1.700000+-3.400000 1.800000+-3.400000 1.900000+-3.400000 2.000000+-3.400000 2.100000+-3.400000 2.200000+-3.400000 2.300000+-3.400000 2.400000+-3.400000 2.500000+-3.400000 2.600000+-3.400000 2.700000+-3.400000 2.800000+-3.400000 2.900000+-3.400000 3.000000+-3.400000 3.100000+-3.400000 3.200000+-3.400000 3.300000+-3.400000 3.400000+-3.400000 3.500000+-3.400000 3.600000+-3.400000 3.700000+-3.400000 3.800000+-3.400000 3.900000+-3.400000 4.000000+-3.300000 -4.000000+-3.300000 -3.900000+-3.300000 -3.800000+-3.300000 -3.700000+-3.300000 -3.600000+-3.300000 -3.500000+-3.300000 -3.400000+-3.300000 -3.300000+-3.300000 -3.200000+-3.300000 -3.100000+-3.300000 -3.000000+-3.300000 -2.900000+-3.300000 -2.800000+-3.300000 -2.700000+-3.300000 -2.600000+-3.300000 -2.500000+-3.300000 -2.400000+-3.300000 -2.300000+-3.300000 -2.200000+-3.300000 -2.100000+-3.300000 -2.000000+-3.300000 -1.900000+-3.300000 -1.800000+-3.300000 -1.700000+-3.300000 -1.600000+-3.300000 -1.500000+-3.300000 -1.400000+-3.300000 -1.300000+-3.300000 -1.200000+-3.300000 -1.100000+-3.300000 -1.000000+-3.300000 -0.900000+-3.300000 -0.800000+-3.300000 -0.700000+-3.300000 -0.600000+-3.300000 -0.500000+-3.300000 -0.400000+-3.300000 -0.300000+-3.300000 -0.200000+-3.300000 -0.100000+-3.300000 0.000000+-3.300000 0.100000+-3.300000 0.200000+-3.300000 0.300000+-3.300000 0.400000+-3.300000 0.500000+-3.300000 0.600000+-3.300000 0.700000+-3.300000 0.800000+-3.300000 0.900000+-3.300000 1.000000+-3.300000 1.100000+-3.300000 1.200000+-3.300000 1.300000+-3.300000 1.400000+-3.300000 1.500000+-3.300000 1.600000+-3.300000 1.700000+-3.300000 1.800000+-3.300000 1.900000+-3.300000 2.000000+-3.300000 2.100000+-3.300000 2.200000+-3.300000 2.300000+-3.300000 2.400000+-3.300000 2.500000+-3.300000 2.600000+-3.300000 2.700000+-3.300000 2.800000+-3.300000 2.900000+-3.300000 3.000000+-3.300000 3.100000+-3.300000 3.200000+-3.300000 3.300000+-3.300000 3.400000+-3.300000 3.500000+-3.300000 3.600000+-3.300000 3.700000+-3.300000 3.800000+-3.300000 3.900000+-3.300000 4.000000+-3.200000 -4.000000+-3.200000 -3.900000+-3.200000 -3.800000+-3.200000 -3.700000+-3.200000 -3.600000+-3.200000 -3.500000+-3.200000 -3.400000+-3.200000 -3.300000+-3.200000 -3.200000+-3.200000 -3.100000+-3.200000 -3.000000+-3.200000 -2.900000+-3.200000 -2.800000+-3.200000 -2.700000+-3.200000 -2.600000+-3.200000 -2.500000+-3.200000 -2.400000+-3.200000 -2.300000+-3.200000 -2.200000+-3.200000 -2.100000+-3.200000 -2.000000+-3.200000 -1.900000+-3.200000 -1.800000+-3.200000 -1.700000+-3.200000 -1.600000+-3.200000 -1.500000+-3.200000 -1.400000+-3.200000 -1.300000+-3.200000 -1.200000+-3.200000 -1.100000+-3.200000 -1.000000+-3.200000 -0.900000+-3.200000 -0.800000+-3.200000 -0.700000+-3.200000 -0.600000+-3.200000 -0.500000+-3.200000 -0.400000+-3.200000 -0.300000+-3.200000 -0.200000+-3.200000 -0.100000+-3.200000 0.000000+-3.200000 0.100000+-3.200000 0.200000+-3.200000 0.300000+-3.200000 0.400000+-3.200000 0.500000+-3.200000 0.600000+-3.200000 0.700000+-3.200000 0.800000+-3.200000 0.900000+-3.200000 1.000000+-3.200000 1.100000+-3.200000 1.200000+-3.200000 1.300000+-3.200000 1.400000+-3.200000 1.500000+-3.200000 1.600000+-3.200000 1.700000+-3.200000 1.800000+-3.200000 1.900000+-3.200000 2.000000+-3.200000 2.100000+-3.200000 2.200000+-3.200000 2.300000+-3.200000 2.400000+-3.200000 2.500000+-3.200000 2.600000+-3.200000 2.700000+-3.200000 2.800000+-3.200000 2.900000+-3.200000 3.000000+-3.200000 3.100000+-3.200000 3.200000+-3.200000 3.300000+-3.200000 3.400000+-3.200000 3.500000+-3.200000 3.600000+-3.200000 3.700000+-3.200000 3.800000+-3.200000 3.900000+-3.200000 4.000000+-3.100000 -4.000000+-3.100000 -3.900000+-3.100000 -3.800000+-3.100000 -3.700000+-3.100000 -3.600000+-3.100000 -3.500000+-3.100000 -3.400000+-3.100000 -3.300000+-3.100000 -3.200000+-3.100000 -3.100000+-3.100000 -3.000000+-3.100000 -2.900000+-3.100000 -2.800000+-3.100000 -2.700000+-3.100000 -2.600000+-3.100000 -2.500000+-3.100000 -2.400000+-3.100000 -2.300000+-3.100000 -2.200000+-3.100000 -2.100000+-3.100000 -2.000000+-3.100000 -1.900000+-3.100000 -1.800000+-3.100000 -1.700000+-3.100000 -1.600000+-3.100000 -1.500000+-3.100000 -1.400000+-3.100000 -1.300000+-3.100000 -1.200000+-3.100000 -1.100000+-3.100000 -1.000000+-3.100000 -0.900000+-3.100000 -0.800000+-3.100000 -0.700000+-3.100000 -0.600000+-3.100000 -0.500000+-3.100000 -0.400000+-3.100000 -0.300000+-3.100000 -0.200000+-3.100000 -0.100000+-3.100000 0.000000+-3.100000 0.100000+-3.100000 0.200000+-3.100000 0.300000+-3.100000 0.400000+-3.100000 0.500000+-3.100000 0.600000+-3.100000 0.700000+-3.100000 0.800000+-3.100000 0.900000+-3.100000 1.000000+-3.100000 1.100000+-3.100000 1.200000+-3.100000 1.300000+-3.100000 1.400000+-3.100000 1.500000+-3.100000 1.600000+-3.100000 1.700000+-3.100000 1.800000+-3.100000 1.900000+-3.100000 2.000000+-3.100000 2.100000+-3.100000 2.200000+-3.100000 2.300000+-3.100000 2.400000+-3.100000 2.500000+-3.100000 2.600000+-3.100000 2.700000+-3.100000 2.800000+-3.100000 2.900000+-3.100000 3.000000+-3.100000 3.100000+-3.100000 3.200000+-3.100000 3.300000+-3.100000 3.400000+-3.100000 3.500000+-3.100000 3.600000+-3.100000 3.700000+-3.100000 3.800000+-3.100000 3.900000+-3.100000 4.000000+-3.000000 -4.000000+-3.000000 -3.900000+-3.000000 -3.800000+-3.000000 -3.700000+-3.000000 -3.600000+-3.000000 -3.500000+-3.000000 -3.400000+-3.000000 -3.300000+-3.000000 -3.200000+-3.000000 -3.100000+-3.000000 -3.000000+-3.000000 -2.900000+-3.000000 -2.800000+-3.000000 -2.700000+-3.000000 -2.600000+-3.000000 -2.500000+-3.000000 -2.400000+-3.000000 -2.300000+-3.000000 -2.200000+-3.000000 -2.100000+-3.000000 -2.000000+-3.000000 -1.900000+-3.000000 -1.800000+-3.000000 -1.700000+-3.000000 -1.600000+-3.000000 -1.500000+-3.000000 -1.400000+-3.000000 -1.300000+-3.000000 -1.200000+-3.000000 -1.100000+-3.000000 -1.000000+-3.000000 -0.900000+-3.000000 -0.800000+-3.000000 -0.700000+-3.000000 -0.600000+-3.000000 -0.500000+-3.000000 -0.400000+-3.000000 -0.300000+-3.000000 -0.200000+-3.000000 -0.100000+-3.000000 0.000000+-3.000000 0.100000+-3.000000 0.200000+-3.000000 0.300000+-3.000000 0.400000+-3.000000 0.500000+-3.000000 0.600000+-3.000000 0.700000+-3.000000 0.800000+-3.000000 0.900000+-3.000000 1.000000+-3.000000 1.100000+-3.000000 1.200000+-3.000000 1.300000+-3.000000 1.400000+-3.000000 1.500000+-3.000000 1.600000+-3.000000 1.700000+-3.000000 1.800000+-3.000000 1.900000+-3.000000 2.000000+-3.000000 2.100000+-3.000000 2.200000+-3.000000 2.300000+-3.000000 2.400000+-3.000000 2.500000+-3.000000 2.600000+-3.000000 2.700000+-3.000000 2.800000+-3.000000 2.900000+-3.000000 3.000000+-3.000000 3.100000+-3.000000 3.200000+-3.000000 3.300000+-3.000000 3.400000+-3.000000 3.500000+-3.000000 3.600000+-3.000000 3.700000+-3.000000 3.800000+-3.000000 3.900000+-3.000000 4.000000+-2.900000 -4.000000+-2.900000 -3.900000+-2.900000 -3.800000+-2.900000 -3.700000+-2.900000 -3.600000+-2.900000 -3.500000+-2.900000 -3.400000+-2.900000 -3.300000+-2.900000 -3.200000+-2.900000 -3.100000+-2.900000 -3.000000+-2.900000 -2.900000+-2.900000 -2.800000+-2.900000 -2.700000+-2.900000 -2.600000+-2.900000 -2.500000+-2.900000 -2.400000+-2.900000 -2.300000+-2.900000 -2.200000+-2.900000 -2.100000+-2.900000 -2.000000+-2.900000 -1.900000+-2.900000 -1.800000+-2.900000 -1.700000+-2.900000 -1.600000+-2.900000 -1.500000+-2.900000 -1.400000+-2.900000 -1.300000+-2.900000 -1.200000+-2.900000 -1.100000+-2.900000 -1.000000+-2.900000 -0.900000+-2.900000 -0.800000+-2.900000 -0.700000+-2.900000 -0.600000+-2.900000 -0.500000+-2.900000 -0.400000+-2.900000 -0.300000+-2.900000 -0.200000+-2.900000 -0.100000+-2.900000 0.000000+-2.900000 0.100000+-2.900000 0.200000+-2.900000 0.300000+-2.900000 0.400000+-2.900000 0.500000+-2.900000 0.600000+-2.900000 0.700000+-2.900000 0.800000+-2.900000 0.900000+-2.900000 1.000000+-2.900000 1.100000+-2.900000 1.200000+-2.900000 1.300000+-2.900000 1.400000+-2.900000 1.500000+-2.900000 1.600000+-2.900000 1.700000+-2.900000 1.800000+-2.900000 1.900000+-2.900000 2.000000+-2.900000 2.100000+-2.900000 2.200000+-2.900000 2.300000+-2.900000 2.400000+-2.900000 2.500000+-2.900000 2.600000+-2.900000 2.700000+-2.900000 2.800000+-2.900000 2.900000+-2.900000 3.000000+-2.900000 3.100000+-2.900000 3.200000+-2.900000 3.300000+-2.900000 3.400000+-2.900000 3.500000+-2.900000 3.600000+-2.900000 3.700000+-2.900000 3.800000+-2.900000 3.900000+-2.900000 4.000000+-2.800000 -4.000000+-2.800000 -3.900000+-2.800000 -3.800000+-2.800000 -3.700000+-2.800000 -3.600000+-2.800000 -3.500000+-2.800000 -3.400000+-2.800000 -3.300000+-2.800000 -3.200000+-2.800000 -3.100000+-2.800000 -3.000000+-2.800000 -2.900000+-2.800000 -2.800000+-2.800000 -2.700000+-2.800000 -2.600000+-2.800000 -2.500000+-2.800000 -2.400000+-2.800000 -2.300000+-2.800000 -2.200000+-2.800000 -2.100000+-2.800000 -2.000000+-2.800000 -1.900000+-2.800000 -1.800000+-2.800000 -1.700000+-2.800000 -1.600000+-2.800000 -1.500000+-2.800000 -1.400000+-2.800000 -1.300000+-2.800000 -1.200000+-2.800000 -1.100000+-2.800000 -1.000000+-2.800000 -0.900000+-2.800000 -0.800000+-2.800000 -0.700000+-2.800000 -0.600000+-2.800000 -0.500000+-2.800000 -0.400000+-2.800000 -0.300000+-2.800000 -0.200000+-2.800000 -0.100000+-2.800000 0.000000+-2.800000 0.100000+-2.800000 0.200000+-2.800000 0.300000+-2.800000 0.400000+-2.800000 0.500000+-2.800000 0.600000+-2.800000 0.700000+-2.800000 0.800000+-2.800000 0.900000+-2.800000 1.000000+-2.800000 1.100000+-2.800000 1.200000+-2.800000 1.300000+-2.800000 1.400000+-2.800000 1.500000+-2.800000 1.600000+-2.800000 1.700000+-2.800000 1.800000+-2.800000 1.900000+-2.800000 2.000000+-2.800000 2.100000+-2.800000 2.200000+-2.800000 2.300000+-2.800000 2.400000+-2.800000 2.500000+-2.800000 2.600000+-2.800000 2.700000+-2.800000 2.800000+-2.800000 2.900000+-2.800000 3.000000+-2.800000 3.100000+-2.800000 3.200000+-2.800000 3.300000+-2.800000 3.400000+-2.800000 3.500000+-2.800000 3.600000+-2.800000 3.700000+-2.800000 3.800000+-2.800000 3.900000+-2.800000 4.000000+-2.700000 -4.000000+-2.700000 -3.900000+-2.700000 -3.800000+-2.700000 -3.700000+-2.700000 -3.600000+-2.700000 -3.500000+-2.700000 -3.400000+-2.700000 -3.300000+-2.700000 -3.200000+-2.700000 -3.100000+-2.700000 -3.000000+-2.700000 -2.900000+-2.700000 -2.800000+-2.700000 -2.700000+-2.700000 -2.600000+-2.700000 -2.500000+-2.700000 -2.400000+-2.700000 -2.300000+-2.700000 -2.200000+-2.700000 -2.100000+-2.700000 -2.000000+-2.700000 -1.900000+-2.700000 -1.800000+-2.700000 -1.700000+-2.700000 -1.600000+-2.700000 -1.500000+-2.700000 -1.400000+-2.700000 -1.300000+-2.700000 -1.200000+-2.700000 -1.100000+-2.700000 -1.000000+-2.700000 -0.900000+-2.700000 -0.800000+-2.700000 -0.700000+-2.700000 -0.600000+-2.700000 -0.500000+-2.700000 -0.400000+-2.700000 -0.300000+-2.700000 -0.200000+-2.700000 -0.100000+-2.700000 0.000000+-2.700000 0.100000+-2.700000 0.200000+-2.700000 0.300000+-2.700000 0.400000+-2.700000 0.500000+-2.700000 0.600000+-2.700000 0.700000+-2.700000 0.800000+-2.700000 0.900000+-2.700000 1.000000+-2.700000 1.100000+-2.700000 1.200000+-2.700000 1.300000+-2.700000 1.400000+-2.700000 1.500000+-2.700000 1.600000+-2.700000 1.700000+-2.700000 1.800000+-2.700000 1.900000+-2.700000 2.000000+-2.700000 2.100000+-2.700000 2.200000+-2.700000 2.300000+-2.700000 2.400000+-2.700000 2.500000+-2.700000 2.600000+-2.700000 2.700000+-2.700000 2.800000+-2.700000 2.900000+-2.700000 3.000000+-2.700000 3.100000+-2.700000 3.200000+-2.700000 3.300000+-2.700000 3.400000+-2.700000 3.500000+-2.700000 3.600000+-2.700000 3.700000+-2.700000 3.800000+-2.700000 3.900000+-2.700000 4.000000+-2.600000 -4.000000+-2.600000 -3.900000+-2.600000 -3.800000+-2.600000 -3.700000+-2.600000 -3.600000+-2.600000 -3.500000+-2.600000 -3.400000+-2.600000 -3.300000+-2.600000 -3.200000+-2.600000 -3.100000+-2.600000 -3.000000+-2.600000 -2.900000+-2.600000 -2.800000+-2.600000 -2.700000+-2.600000 -2.600000+-2.600000 -2.500000+-2.600000 -2.400000+-2.600000 -2.300000+-2.600000 -2.200000+-2.600000 -2.100000+-2.600000 -2.000000+-2.600000 -1.900000+-2.600000 -1.800000+-2.600000 -1.700000+-2.600000 -1.600000+-2.600000 -1.500000+-2.600000 -1.400000+-2.600000 -1.300000+-2.600000 -1.200000+-2.600000 -1.100000+-2.600000 -1.000000+-2.600000 -0.900000+-2.600000 -0.800000+-2.600000 -0.700000+-2.600000 -0.600000+-2.600000 -0.500000+-2.600000 -0.400000+-2.600000 -0.300000+-2.600000 -0.200000+-2.600000 -0.100000+-2.600000 0.000000+-2.600000 0.100000+-2.600000 0.200000+-2.600000 0.300000+-2.600000 0.400000+-2.600000 0.500000+-2.600000 0.600000+-2.600000 0.700000+-2.600000 0.800000+-2.600000 0.900000+-2.600000 1.000000+-2.600000 1.100000+-2.600000 1.200000+-2.600000 1.300000+-2.600000 1.400000+-2.600000 1.500000+-2.600000 1.600000+-2.600000 1.700000+-2.600000 1.800000+-2.600000 1.900000+-2.600000 2.000000+-2.600000 2.100000+-2.600000 2.200000+-2.600000 2.300000+-2.600000 2.400000+-2.600000 2.500000+-2.600000 2.600000+-2.600000 2.700000+-2.600000 2.800000+-2.600000 2.900000+-2.600000 3.000000+-2.600000 3.100000+-2.600000 3.200000+-2.600000 3.300000+-2.600000 3.400000+-2.600000 3.500000+-2.600000 3.600000+-2.600000 3.700000+-2.600000 3.800000+-2.600000 3.900000+-2.600000 4.000000+-2.500000 -4.000000+-2.500000 -3.900000+-2.500000 -3.800000+-2.500000 -3.700000+-2.500000 -3.600000+-2.500000 -3.500000+-2.500000 -3.400000+-2.500000 -3.300000+-2.500000 -3.200000+-2.500000 -3.100000+-2.500000 -3.000000+-2.500000 -2.900000+-2.500000 -2.800000+-2.500000 -2.700000+-2.500000 -2.600000+-2.500000 -2.500000+-2.500000 -2.400000+-2.500000 -2.300000+-2.500000 -2.200000+-2.500000 -2.100000+-2.500000 -2.000000+-2.500000 -1.900000+-2.500000 -1.800000+-2.500000 -1.700000+-2.500000 -1.600000+-2.500000 -1.500000+-2.500000 -1.400000+-2.500000 -1.300000+-2.500000 -1.200000+-2.500000 -1.100000+-2.500000 -1.000000+-2.500000 -0.900000+-2.500000 -0.800000+-2.500000 -0.700000+-2.500000 -0.600000+-2.500000 -0.500000+-2.500000 -0.400000+-2.500000 -0.300000+-2.500000 -0.200000+-2.500000 -0.100000+-2.500000 0.000000+-2.500000 0.100000+-2.500000 0.200000+-2.500000 0.300000+-2.500000 0.400000+-2.500000 0.500000+-2.500000 0.600000+-2.500000 0.700000+-2.500000 0.800000+-2.500000 0.900000+-2.500000 1.000000+-2.500000 1.100000+-2.500000 1.200000+-2.500000 1.300000+-2.500000 1.400000+-2.500000 1.500000+-2.500000 1.600000+-2.500000 1.700000+-2.500000 1.800000+-2.500000 1.900000+-2.500000 2.000000+-2.500000 2.100000+-2.500000 2.200000+-2.500000 2.300000+-2.500000 2.400000+-2.500000 2.500000+-2.500000 2.600000+-2.500000 2.700000+-2.500000 2.800000+-2.500000 2.900000+-2.500000 3.000000+-2.500000 3.100000+-2.500000 3.200000+-2.500000 3.300000+-2.500000 3.400000+-2.500000 3.500000+-2.500000 3.600000+-2.500000 3.700000+-2.500000 3.800000+-2.500000 3.900000+-2.500000 4.000000+-2.400000 -4.000000+-2.400000 -3.900000+-2.400000 -3.800000+-2.400000 -3.700000+-2.400000 -3.600000+-2.400000 -3.500000+-2.400000 -3.400000+-2.400000 -3.300000+-2.400000 -3.200000+-2.400000 -3.100000+-2.400000 -3.000000+-2.400000 -2.900000+-2.400000 -2.800000+-2.400000 -2.700000+-2.400000 -2.600000+-2.400000 -2.500000+-2.400000 -2.400000+-2.400000 -2.300000+-2.400000 -2.200000+-2.400000 -2.100000+-2.400000 -2.000000+-2.400000 -1.900000+-2.400000 -1.800000+-2.400000 -1.700000+-2.400000 -1.600000+-2.400000 -1.500000+-2.400000 -1.400000+-2.400000 -1.300000+-2.400000 -1.200000+-2.400000 -1.100000+-2.400000 -1.000000+-2.400000 -0.900000+-2.400000 -0.800000+-2.400000 -0.700000+-2.400000 -0.600000+-2.400000 -0.500000+-2.400000 -0.400000+-2.400000 -0.300000+-2.400000 -0.200000+-2.400000 -0.100000+-2.400000 0.000000+-2.400000 0.100000+-2.400000 0.200000+-2.400000 0.300000+-2.400000 0.400000+-2.400000 0.500000+-2.400000 0.600000+-2.400000 0.700000+-2.400000 0.800000+-2.400000 0.900000+-2.400000 1.000000+-2.400000 1.100000+-2.400000 1.200000+-2.400000 1.300000+-2.400000 1.400000+-2.400000 1.500000+-2.400000 1.600000+-2.400000 1.700000+-2.400000 1.800000+-2.400000 1.900000+-2.400000 2.000000+-2.400000 2.100000+-2.400000 2.200000+-2.400000 2.300000+-2.400000 2.400000+-2.400000 2.500000+-2.400000 2.600000+-2.400000 2.700000+-2.400000 2.800000+-2.400000 2.900000+-2.400000 3.000000+-2.400000 3.100000+-2.400000 3.200000+-2.400000 3.300000+-2.400000 3.400000+-2.400000 3.500000+-2.400000 3.600000+-2.400000 3.700000+-2.400000 3.800000+-2.400000 3.900000+-2.400000 4.000000+-2.300000 -4.000000+-2.300000 -3.900000+-2.300000 -3.800000+-2.300000 -3.700000+-2.300000 -3.600000+-2.300000 -3.500000+-2.300000 -3.400000+-2.300000 -3.300000+-2.300000 -3.200000+-2.300000 -3.100000+-2.300000 -3.000000+-2.300000 -2.900000+-2.300000 -2.800000+-2.300000 -2.700000+-2.300000 -2.600000+-2.300000 -2.500000+-2.300000 -2.400000+-2.300000 -2.300000+-2.300000 -2.200000+-2.300000 -2.100000+-2.300000 -2.000000+-2.300000 -1.900000+-2.300000 -1.800000+-2.300000 -1.700000+-2.300000 -1.600000+-2.300000 -1.500000+-2.300000 -1.400000+-2.300000 -1.300000+-2.300000 -1.200000+-2.300000 -1.100000+-2.300000 -1.000000+-2.300000 -0.900000+-2.300000 -0.800000+-2.300000 -0.700000+-2.300000 -0.600000+-2.300000 -0.500000+-2.300000 -0.400000+-2.300000 -0.300000+-2.300000 -0.200000+-2.300000 -0.100000+-2.300000 0.000000+-2.300000 0.100000+-2.300000 0.200000+-2.300000 0.300000+-2.300000 0.400000+-2.300000 0.500000+-2.300000 0.600000+-2.300000 0.700000+-2.300000 0.800000+-2.300000 0.900000+-2.300000 1.000000+-2.300000 1.100000+-2.300000 1.200000+-2.300000 1.300000+-2.300000 1.400000+-2.300000 1.500000+-2.300000 1.600000+-2.300000 1.700000+-2.300000 1.800000+-2.300000 1.900000+-2.300000 2.000000+-2.300000 2.100000+-2.300000 2.200000+-2.300000 2.300000+-2.300000 2.400000+-2.300000 2.500000+-2.300000 2.600000+-2.300000 2.700000+-2.300000 2.800000+-2.300000 2.900000+-2.300000 3.000000+-2.300000 3.100000+-2.300000 3.200000+-2.300000 3.300000+-2.300000 3.400000+-2.300000 3.500000+-2.300000 3.600000+-2.300000 3.700000+-2.300000 3.800000+-2.300000 3.900000+-2.300000 4.000000+-2.200000 -4.000000+-2.200000 -3.900000+-2.200000 -3.800000+-2.200000 -3.700000+-2.200000 -3.600000+-2.200000 -3.500000+-2.200000 -3.400000+-2.200000 -3.300000+-2.200000 -3.200000+-2.200000 -3.100000+-2.200000 -3.000000+-2.200000 -2.900000+-2.200000 -2.800000+-2.200000 -2.700000+-2.200000 -2.600000+-2.200000 -2.500000+-2.200000 -2.400000+-2.200000 -2.300000+-2.200000 -2.200000+-2.200000 -2.100000+-2.200000 -2.000000+-2.200000 -1.900000+-2.200000 -1.800000+-2.200000 -1.700000+-2.200000 -1.600000+-2.200000 -1.500000+-2.200000 -1.400000+-2.200000 -1.300000+-2.200000 -1.200000+-2.200000 -1.100000+-2.200000 -1.000000+-2.200000 -0.900000+-2.200000 -0.800000+-2.200000 -0.700000+-2.200000 -0.600000+-2.200000 -0.500000+-2.200000 -0.400000+-2.200000 -0.300000+-2.200000 -0.200000+-2.200000 -0.100000+-2.200000 0.000000+-2.200000 0.100000+-2.200000 0.200000+-2.200000 0.300000+-2.200000 0.400000+-2.200000 0.500000+-2.200000 0.600000+-2.200000 0.700000+-2.200000 0.800000+-2.200000 0.900000+-2.200000 1.000000+-2.200000 1.100000+-2.200000 1.200000+-2.200000 1.300000+-2.200000 1.400000+-2.200000 1.500000+-2.200000 1.600000+-2.200000 1.700000+-2.200000 1.800000+-2.200000 1.900000+-2.200000 2.000000+-2.200000 2.100000+-2.200000 2.200000+-2.200000 2.300000+-2.200000 2.400000+-2.200000 2.500000+-2.200000 2.600000+-2.200000 2.700000+-2.200000 2.800000+-2.200000 2.900000+-2.200000 3.000000+-2.200000 3.100000+-2.200000 3.200000+-2.200000 3.300000+-2.200000 3.400000+-2.200000 3.500000+-2.200000 3.600000+-2.200000 3.700000+-2.200000 3.800000+-2.200000 3.900000+-2.200000 4.000000+-2.100000 -4.000000+-2.100000 -3.900000+-2.100000 -3.800000+-2.100000 -3.700000+-2.100000 -3.600000+-2.100000 -3.500000+-2.100000 -3.400000+-2.100000 -3.300000+-2.100000 -3.200000+-2.100000 -3.100000+-2.100000 -3.000000+-2.100000 -2.900000+-2.100000 -2.800000+-2.100000 -2.700000+-2.100000 -2.600000+-2.100000 -2.500000+-2.100000 -2.400000+-2.100000 -2.300000+-2.100000 -2.200000+-2.100000 -2.100000+-2.100000 -2.000000+-2.100000 -1.900000+-2.100000 -1.800000+-2.100000 -1.700000+-2.100000 -1.600000+-2.100000 -1.500000+-2.100000 -1.400000+-2.100000 -1.300000+-2.100000 -1.200000+-2.100000 -1.100000+-2.100000 -1.000000+-2.100000 -0.900000+-2.100000 -0.800000+-2.100000 -0.700000+-2.100000 -0.600000+-2.100000 -0.500000+-2.100000 -0.400000+-2.100000 -0.300000+-2.100000 -0.200000+-2.100000 -0.100000+-2.100000 0.000000+-2.100000 0.100000+-2.100000 0.200000+-2.100000 0.300000+-2.100000 0.400000+-2.100000 0.500000+-2.100000 0.600000+-2.100000 0.700000+-2.100000 0.800000+-2.100000 0.900000+-2.100000 1.000000+-2.100000 1.100000+-2.100000 1.200000+-2.100000 1.300000+-2.100000 1.400000+-2.100000 1.500000+-2.100000 1.600000+-2.100000 1.700000+-2.100000 1.800000+-2.100000 1.900000+-2.100000 2.000000+-2.100000 2.100000+-2.100000 2.200000+-2.100000 2.300000+-2.100000 2.400000+-2.100000 2.500000+-2.100000 2.600000+-2.100000 2.700000+-2.100000 2.800000+-2.100000 2.900000+-2.100000 3.000000+-2.100000 3.100000+-2.100000 3.200000+-2.100000 3.300000+-2.100000 3.400000+-2.100000 3.500000+-2.100000 3.600000+-2.100000 3.700000+-2.100000 3.800000+-2.100000 3.900000+-2.100000 4.000000+-2.000000 -4.000000+-2.000000 -3.900000+-2.000000 -3.800000+-2.000000 -3.700000+-2.000000 -3.600000+-2.000000 -3.500000+-2.000000 -3.400000+-2.000000 -3.300000+-2.000000 -3.200000+-2.000000 -3.100000+-2.000000 -3.000000+-2.000000 -2.900000+-2.000000 -2.800000+-2.000000 -2.700000+-2.000000 -2.600000+-2.000000 -2.500000+-2.000000 -2.400000+-2.000000 -2.300000+-2.000000 -2.200000+-2.000000 -2.100000+-2.000000 -2.000000+-2.000000 -1.900000+-2.000000 -1.800000+-2.000000 -1.700000+-2.000000 -1.600000+-2.000000 -1.500000+-2.000000 -1.400000+-2.000000 -1.300000+-2.000000 -1.200000+-2.000000 -1.100000+-2.000000 -1.000000+-2.000000 -0.900000+-2.000000 -0.800000+-2.000000 -0.700000+-2.000000 -0.600000+-2.000000 -0.500000+-2.000000 -0.400000+-2.000000 -0.300000+-2.000000 -0.200000+-2.000000 -0.100000+-2.000000 0.000000+-2.000000 0.100000+-2.000000 0.200000+-2.000000 0.300000+-2.000000 0.400000+-2.000000 0.500000+-2.000000 0.600000+-2.000000 0.700000+-2.000000 0.800000+-2.000000 0.900000+-2.000000 1.000000+-2.000000 1.100000+-2.000000 1.200000+-2.000000 1.300000+-2.000000 1.400000+-2.000000 1.500000+-2.000000 1.600000+-2.000000 1.700000+-2.000000 1.800000+-2.000000 1.900000+-2.000000 2.000000+-2.000000 2.100000+-2.000000 2.200000+-2.000000 2.300000+-2.000000 2.400000+-2.000000 2.500000+-2.000000 2.600000+-2.000000 2.700000+-2.000000 2.800000+-2.000000 2.900000+-2.000000 3.000000+-2.000000 3.100000+-2.000000 3.200000+-2.000000 3.300000+-2.000000 3.400000+-2.000000 3.500000+-2.000000 3.600000+-2.000000 3.700000+-2.000000 3.800000+-2.000000 3.900000+-2.000000 4.000000+-1.900000 -4.000000+-1.900000 -3.900000+-1.900000 -3.800000+-1.900000 -3.700000+-1.900000 -3.600000+-1.900000 -3.500000+-1.900000 -3.400000+-1.900000 -3.300000+-1.900000 -3.200000+-1.900000 -3.100000+-1.900000 -3.000000+-1.900000 -2.900000+-1.900000 -2.800000+-1.900000 -2.700000+-1.900000 -2.600000+-1.900000 -2.500000+-1.900000 -2.400000+-1.900000 -2.300000+-1.900000 -2.200000+-1.900000 -2.100000+-1.900000 -2.000000+-1.900000 -1.900000+-1.900000 -1.800000+-1.900000 -1.700000+-1.900000 -1.600000+-1.900000 -1.500000+-1.900000 -1.400000+-1.900000 -1.300000+-1.900000 -1.200000+-1.900000 -1.100000+-1.900000 -1.000000+-1.900000 -0.900000+-1.900000 -0.800000+-1.900000 -0.700000+-1.900000 -0.600000+-1.900000 -0.500000+-1.900000 -0.400000+-1.900000 -0.300000+-1.900000 -0.200000+-1.900000 -0.100000+-1.900000 0.000000+-1.900000 0.100000+-1.900000 0.200000+-1.900000 0.300000+-1.900000 0.400000+-1.900000 0.500000+-1.900000 0.600000+-1.900000 0.700000+-1.900000 0.800000+-1.900000 0.900000+-1.900000 1.000000+-1.900000 1.100000+-1.900000 1.200000+-1.900000 1.300000+-1.900000 1.400000+-1.900000 1.500000+-1.900000 1.600000+-1.900000 1.700000+-1.900000 1.800000+-1.900000 1.900000+-1.900000 2.000000+-1.900000 2.100000+-1.900000 2.200000+-1.900000 2.300000+-1.900000 2.400000+-1.900000 2.500000+-1.900000 2.600000+-1.900000 2.700000+-1.900000 2.800000+-1.900000 2.900000+-1.900000 3.000000+-1.900000 3.100000+-1.900000 3.200000+-1.900000 3.300000+-1.900000 3.400000+-1.900000 3.500000+-1.900000 3.600000+-1.900000 3.700000+-1.900000 3.800000+-1.900000 3.900000+-1.900000 4.000000+-1.800000 -4.000000+-1.800000 -3.900000+-1.800000 -3.800000+-1.800000 -3.700000+-1.800000 -3.600000+-1.800000 -3.500000+-1.800000 -3.400000+-1.800000 -3.300000+-1.800000 -3.200000+-1.800000 -3.100000+-1.800000 -3.000000+-1.800000 -2.900000+-1.800000 -2.800000+-1.800000 -2.700000+-1.800000 -2.600000+-1.800000 -2.500000+-1.800000 -2.400000+-1.800000 -2.300000+-1.800000 -2.200000+-1.800000 -2.100000+-1.800000 -2.000000+-1.800000 -1.900000+-1.800000 -1.800000+-1.800000 -1.700000+-1.800000 -1.600000+-1.800000 -1.500000+-1.800000 -1.400000+-1.800000 -1.300000+-1.800000 -1.200000+-1.800000 -1.100000+-1.800000 -1.000000+-1.800000 -0.900000+-1.800000 -0.800000+-1.800000 -0.700000+-1.800000 -0.600000+-1.800000 -0.500000+-1.800000 -0.400000+-1.800000 -0.300000+-1.800000 -0.200000+-1.800000 -0.100000+-1.800000 0.000000+-1.800000 0.100000+-1.800000 0.200000+-1.800000 0.300000+-1.800000 0.400000+-1.800000 0.500000+-1.800000 0.600000+-1.800000 0.700000+-1.800000 0.800000+-1.800000 0.900000+-1.800000 1.000000+-1.800000 1.100000+-1.800000 1.200000+-1.800000 1.300000+-1.800000 1.400000+-1.800000 1.500000+-1.800000 1.600000+-1.800000 1.700000+-1.800000 1.800000+-1.800000 1.900000+-1.800000 2.000000+-1.800000 2.100000+-1.800000 2.200000+-1.800000 2.300000+-1.800000 2.400000+-1.800000 2.500000+-1.800000 2.600000+-1.800000 2.700000+-1.800000 2.800000+-1.800000 2.900000+-1.800000 3.000000+-1.800000 3.100000+-1.800000 3.200000+-1.800000 3.300000+-1.800000 3.400000+-1.800000 3.500000+-1.800000 3.600000+-1.800000 3.700000+-1.800000 3.800000+-1.800000 3.900000+-1.800000 4.000000+-1.700000 -4.000000+-1.700000 -3.900000+-1.700000 -3.800000+-1.700000 -3.700000+-1.700000 -3.600000+-1.700000 -3.500000+-1.700000 -3.400000+-1.700000 -3.300000+-1.700000 -3.200000+-1.700000 -3.100000+-1.700000 -3.000000+-1.700000 -2.900000+-1.700000 -2.800000+-1.700000 -2.700000+-1.700000 -2.600000+-1.700000 -2.500000+-1.700000 -2.400000+-1.700000 -2.300000+-1.700000 -2.200000+-1.700000 -2.100000+-1.700000 -2.000000+-1.700000 -1.900000+-1.700000 -1.800000+-1.700000 -1.700000+-1.700000 -1.600000+-1.700000 -1.500000+-1.700000 -1.400000+-1.700000 -1.300000+-1.700000 -1.200000+-1.700000 -1.100000+-1.700000 -1.000000+-1.700000 -0.900000+-1.700000 -0.800000+-1.700000 -0.700000+-1.700000 -0.600000+-1.700000 -0.500000+-1.700000 -0.400000+-1.700000 -0.300000+-1.700000 -0.200000+-1.700000 -0.100000+-1.700000 0.000000+-1.700000 0.100000+-1.700000 0.200000+-1.700000 0.300000+-1.700000 0.400000+-1.700000 0.500000+-1.700000 0.600000+-1.700000 0.700000+-1.700000 0.800000+-1.700000 0.900000+-1.700000 1.000000+-1.700000 1.100000+-1.700000 1.200000+-1.700000 1.300000+-1.700000 1.400000+-1.700000 1.500000+-1.700000 1.600000+-1.700000 1.700000+-1.700000 1.800000+-1.700000 1.900000+-1.700000 2.000000+-1.700000 2.100000+-1.700000 2.200000+-1.700000 2.300000+-1.700000 2.400000+-1.700000 2.500000+-1.700000 2.600000+-1.700000 2.700000+-1.700000 2.800000+-1.700000 2.900000+-1.700000 3.000000+-1.700000 3.100000+-1.700000 3.200000+-1.700000 3.300000+-1.700000 3.400000+-1.700000 3.500000+-1.700000 3.600000+-1.700000 3.700000+-1.700000 3.800000+-1.700000 3.900000+-1.700000 4.000000+-1.600000 -4.000000+-1.600000 -3.900000+-1.600000 -3.800000+-1.600000 -3.700000+-1.600000 -3.600000+-1.600000 -3.500000+-1.600000 -3.400000+-1.600000 -3.300000+-1.600000 -3.200000+-1.600000 -3.100000+-1.600000 -3.000000+-1.600000 -2.900000+-1.600000 -2.800000+-1.600000 -2.700000+-1.600000 -2.600000+-1.600000 -2.500000+-1.600000 -2.400000+-1.600000 -2.300000+-1.600000 -2.200000+-1.600000 -2.100000+-1.600000 -2.000000+-1.600000 -1.900000+-1.600000 -1.800000+-1.600000 -1.700000+-1.600000 -1.600000+-1.600000 -1.500000+-1.600000 -1.400000+-1.600000 -1.300000+-1.600000 -1.200000+-1.600000 -1.100000+-1.600000 -1.000000+-1.600000 -0.900000+-1.600000 -0.800000+-1.600000 -0.700000+-1.600000 -0.600000+-1.600000 -0.500000+-1.600000 -0.400000+-1.600000 -0.300000+-1.600000 -0.200000+-1.600000 -0.100000+-1.600000 0.000000+-1.600000 0.100000+-1.600000 0.200000+-1.600000 0.300000+-1.600000 0.400000+-1.600000 0.500000+-1.600000 0.600000+-1.600000 0.700000+-1.600000 0.800000+-1.600000 0.900000+-1.600000 1.000000+-1.600000 1.100000+-1.600000 1.200000+-1.600000 1.300000+-1.600000 1.400000+-1.600000 1.500000+-1.600000 1.600000+-1.600000 1.700000+-1.600000 1.800000+-1.600000 1.900000+-1.600000 2.000000+-1.600000 2.100000+-1.600000 2.200000+-1.600000 2.300000+-1.600000 2.400000+-1.600000 2.500000+-1.600000 2.600000+-1.600000 2.700000+-1.600000 2.800000+-1.600000 2.900000+-1.600000 3.000000+-1.600000 3.100000+-1.600000 3.200000+-1.600000 3.300000+-1.600000 3.400000+-1.600000 3.500000+-1.600000 3.600000+-1.600000 3.700000+-1.600000 3.800000+-1.600000 3.900000+-1.600000 4.000000+-1.500000 -4.000000+-1.500000 -3.900000+-1.500000 -3.800000+-1.500000 -3.700000+-1.500000 -3.600000+-1.500000 -3.500000+-1.500000 -3.400000+-1.500000 -3.300000+-1.500000 -3.200000+-1.500000 -3.100000+-1.500000 -3.000000+-1.500000 -2.900000+-1.500000 -2.800000+-1.500000 -2.700000+-1.500000 -2.600000+-1.500000 -2.500000+-1.500000 -2.400000+-1.500000 -2.300000+-1.500000 -2.200000+-1.500000 -2.100000+-1.500000 -2.000000+-1.500000 -1.900000+-1.500000 -1.800000+-1.500000 -1.700000+-1.500000 -1.600000+-1.500000 -1.500000+-1.500000 -1.400000+-1.500000 -1.300000+-1.500000 -1.200000+-1.500000 -1.100000+-1.500000 -1.000000+-1.500000 -0.900000+-1.500000 -0.800000+-1.500000 -0.700000+-1.500000 -0.600000+-1.500000 -0.500000+-1.500000 -0.400000+-1.500000 -0.300000+-1.500000 -0.200000+-1.500000 -0.100000+-1.500000 0.000000+-1.500000 0.100000+-1.500000 0.200000+-1.500000 0.300000+-1.500000 0.400000+-1.500000 0.500000+-1.500000 0.600000+-1.500000 0.700000+-1.500000 0.800000+-1.500000 0.900000+-1.500000 1.000000+-1.500000 1.100000+-1.500000 1.200000+-1.500000 1.300000+-1.500000 1.400000+-1.500000 1.500000+-1.500000 1.600000+-1.500000 1.700000+-1.500000 1.800000+-1.500000 1.900000+-1.500000 2.000000+-1.500000 2.100000+-1.500000 2.200000+-1.500000 2.300000+-1.500000 2.400000+-1.500000 2.500000+-1.500000 2.600000+-1.500000 2.700000+-1.500000 2.800000+-1.500000 2.900000+-1.500000 3.000000+-1.500000 3.100000+-1.500000 3.200000+-1.500000 3.300000+-1.500000 3.400000+-1.500000 3.500000+-1.500000 3.600000+-1.500000 3.700000+-1.500000 3.800000+-1.500000 3.900000+-1.500000 4.000000+-1.400000 -4.000000+-1.400000 -3.900000+-1.400000 -3.800000+-1.400000 -3.700000+-1.400000 -3.600000+-1.400000 -3.500000+-1.400000 -3.400000+-1.400000 -3.300000+-1.400000 -3.200000+-1.400000 -3.100000+-1.400000 -3.000000+-1.400000 -2.900000+-1.400000 -2.800000+-1.400000 -2.700000+-1.400000 -2.600000+-1.400000 -2.500000+-1.400000 -2.400000+-1.400000 -2.300000+-1.400000 -2.200000+-1.400000 -2.100000+-1.400000 -2.000000+-1.400000 -1.900000+-1.400000 -1.800000+-1.400000 -1.700000+-1.400000 -1.600000+-1.400000 -1.500000+-1.400000 -1.400000+-1.400000 -1.300000+-1.400000 -1.200000+-1.400000 -1.100000+-1.400000 -1.000000+-1.400000 -0.900000+-1.400000 -0.800000+-1.400000 -0.700000+-1.400000 -0.600000+-1.400000 -0.500000+-1.400000 -0.400000+-1.400000 -0.300000+-1.400000 -0.200000+-1.400000 -0.100000+-1.400000 0.000000+-1.400000 0.100000+-1.400000 0.200000+-1.400000 0.300000+-1.400000 0.400000+-1.400000 0.500000+-1.400000 0.600000+-1.400000 0.700000+-1.400000 0.800000+-1.400000 0.900000+-1.400000 1.000000+-1.400000 1.100000+-1.400000 1.200000+-1.400000 1.300000+-1.400000 1.400000+-1.400000 1.500000+-1.400000 1.600000+-1.400000 1.700000+-1.400000 1.800000+-1.400000 1.900000+-1.400000 2.000000+-1.400000 2.100000+-1.400000 2.200000+-1.400000 2.300000+-1.400000 2.400000+-1.400000 2.500000+-1.400000 2.600000+-1.400000 2.700000+-1.400000 2.800000+-1.400000 2.900000+-1.400000 3.000000+-1.400000 3.100000+-1.400000 3.200000+-1.400000 3.300000+-1.400000 3.400000+-1.400000 3.500000+-1.400000 3.600000+-1.400000 3.700000+-1.400000 3.800000+-1.400000 3.900000+-1.400000 4.000000+-1.300000 -4.000000+-1.300000 -3.900000+-1.300000 -3.800000+-1.300000 -3.700000+-1.300000 -3.600000+-1.300000 -3.500000+-1.300000 -3.400000+-1.300000 -3.300000+-1.300000 -3.200000+-1.300000 -3.100000+-1.300000 -3.000000+-1.300000 -2.900000+-1.300000 -2.800000+-1.300000 -2.700000+-1.300000 -2.600000+-1.300000 -2.500000+-1.300000 -2.400000+-1.300000 -2.300000+-1.300000 -2.200000+-1.300000 -2.100000+-1.300000 -2.000000+-1.300000 -1.900000+-1.300000 -1.800000+-1.300000 -1.700000+-1.300000 -1.600000+-1.300000 -1.500000+-1.300000 -1.400000+-1.300000 -1.300000+-1.300000 -1.200000+-1.300000 -1.100000+-1.300000 -1.000000+-1.300000 -0.900000+-1.300000 -0.800000+-1.300000 -0.700000+-1.300000 -0.600000+-1.300000 -0.500000+-1.300000 -0.400000+-1.300000 -0.300000+-1.300000 -0.200000+-1.300000 -0.100000+-1.300000 0.000000+-1.300000 0.100000+-1.300000 0.200000+-1.300000 0.300000+-1.300000 0.400000+-1.300000 0.500000+-1.300000 0.600000+-1.300000 0.700000+-1.300000 0.800000+-1.300000 0.900000+-1.300000 1.000000+-1.300000 1.100000+-1.300000 1.200000+-1.300000 1.300000+-1.300000 1.400000+-1.300000 1.500000+-1.300000 1.600000+-1.300000 1.700000+-1.300000 1.800000+-1.300000 1.900000+-1.300000 2.000000+-1.300000 2.100000+-1.300000 2.200000+-1.300000 2.300000+-1.300000 2.400000+-1.300000 2.500000+-1.300000 2.600000+-1.300000 2.700000+-1.300000 2.800000+-1.300000 2.900000+-1.300000 3.000000+-1.300000 3.100000+-1.300000 3.200000+-1.300000 3.300000+-1.300000 3.400000+-1.300000 3.500000+-1.300000 3.600000+-1.300000 3.700000+-1.300000 3.800000+-1.300000 3.900000+-1.300000 4.000000+-1.200000 -4.000000+-1.200000 -3.900000+-1.200000 -3.800000+-1.200000 -3.700000+-1.200000 -3.600000+-1.200000 -3.500000+-1.200000 -3.400000+-1.200000 -3.300000+-1.200000 -3.200000+-1.200000 -3.100000+-1.200000 -3.000000+-1.200000 -2.900000+-1.200000 -2.800000+-1.200000 -2.700000+-1.200000 -2.600000+-1.200000 -2.500000+-1.200000 -2.400000+-1.200000 -2.300000+-1.200000 -2.200000+-1.200000 -2.100000+-1.200000 -2.000000+-1.200000 -1.900000+-1.200000 -1.800000+-1.200000 -1.700000+-1.200000 -1.600000+-1.200000 -1.500000+-1.200000 -1.400000+-1.200000 -1.300000+-1.200000 -1.200000+-1.200000 -1.100000+-1.200000 -1.000000+-1.200000 -0.900000+-1.200000 -0.800000+-1.200000 -0.700000+-1.200000 -0.600000+-1.200000 -0.500000+-1.200000 -0.400000+-1.200000 -0.300000+-1.200000 -0.200000+-1.200000 -0.100000+-1.200000 0.000000+-1.200000 0.100000+-1.200000 0.200000+-1.200000 0.300000+-1.200000 0.400000+-1.200000 0.500000+-1.200000 0.600000+-1.200000 0.700000+-1.200000 0.800000+-1.200000 0.900000+-1.200000 1.000000+-1.200000 1.100000+-1.200000 1.200000+-1.200000 1.300000+-1.200000 1.400000+-1.200000 1.500000+-1.200000 1.600000+-1.200000 1.700000+-1.200000 1.800000+-1.200000 1.900000+-1.200000 2.000000+-1.200000 2.100000+-1.200000 2.200000+-1.200000 2.300000+-1.200000 2.400000+-1.200000 2.500000+-1.200000 2.600000+-1.200000 2.700000+-1.200000 2.800000+-1.200000 2.900000+-1.200000 3.000000+-1.200000 3.100000+-1.200000 3.200000+-1.200000 3.300000+-1.200000 3.400000+-1.200000 3.500000+-1.200000 3.600000+-1.200000 3.700000+-1.200000 3.800000+-1.200000 3.900000+-1.200000 4.000000+-1.100000 -4.000000+-1.100000 -3.900000+-1.100000 -3.800000+-1.100000 -3.700000+-1.100000 -3.600000+-1.100000 -3.500000+-1.100000 -3.400000+-1.100000 -3.300000+-1.100000 -3.200000+-1.100000 -3.100000+-1.100000 -3.000000+-1.100000 -2.900000+-1.100000 -2.800000+-1.100000 -2.700000+-1.100000 -2.600000+-1.100000 -2.500000+-1.100000 -2.400000+-1.100000 -2.300000+-1.100000 -2.200000+-1.100000 -2.100000+-1.100000 -2.000000+-1.100000 -1.900000+-1.100000 -1.800000+-1.100000 -1.700000+-1.100000 -1.600000+-1.100000 -1.500000+-1.100000 -1.400000+-1.100000 -1.300000+-1.100000 -1.200000+-1.100000 -1.100000+-1.100000 -1.000000+-1.100000 -0.900000+-1.100000 -0.800000+-1.100000 -0.700000+-1.100000 -0.600000+-1.100000 -0.500000+-1.100000 -0.400000+-1.100000 -0.300000+-1.100000 -0.200000+-1.100000 -0.100000+-1.100000 0.000000+-1.100000 0.100000+-1.100000 0.200000+-1.100000 0.300000+-1.100000 0.400000+-1.100000 0.500000+-1.100000 0.600000+-1.100000 0.700000+-1.100000 0.800000+-1.100000 0.900000+-1.100000 1.000000+-1.100000 1.100000+-1.100000 1.200000+-1.100000 1.300000+-1.100000 1.400000+-1.100000 1.500000+-1.100000 1.600000+-1.100000 1.700000+-1.100000 1.800000+-1.100000 1.900000+-1.100000 2.000000+-1.100000 2.100000+-1.100000 2.200000+-1.100000 2.300000+-1.100000 2.400000+-1.100000 2.500000+-1.100000 2.600000+-1.100000 2.700000+-1.100000 2.800000+-1.100000 2.900000+-1.100000 3.000000+-1.100000 3.100000+-1.100000 3.200000+-1.100000 3.300000+-1.100000 3.400000+-1.100000 3.500000+-1.100000 3.600000+-1.100000 3.700000+-1.100000 3.800000+-1.100000 3.900000+-1.100000 4.000000+-1.000000 -4.000000+-1.000000 -3.900000+-1.000000 -3.800000+-1.000000 -3.700000+-1.000000 -3.600000+-1.000000 -3.500000+-1.000000 -3.400000+-1.000000 -3.300000+-1.000000 -3.200000+-1.000000 -3.100000+-1.000000 -3.000000+-1.000000 -2.900000+-1.000000 -2.800000+-1.000000 -2.700000+-1.000000 -2.600000+-1.000000 -2.500000+-1.000000 -2.400000+-1.000000 -2.300000+-1.000000 -2.200000+-1.000000 -2.100000+-1.000000 -2.000000+-1.000000 -1.900000+-1.000000 -1.800000+-1.000000 -1.700000+-1.000000 -1.600000+-1.000000 -1.500000+-1.000000 -1.400000+-1.000000 -1.300000+-1.000000 -1.200000+-1.000000 -1.100000+-1.000000 -1.000000+-1.000000 -0.900000+-1.000000 -0.800000+-1.000000 -0.700000+-1.000000 -0.600000+-1.000000 -0.500000+-1.000000 -0.400000+-1.000000 -0.300000+-1.000000 -0.200000+-1.000000 -0.100000+-1.000000 0.000000+-1.000000 0.100000+-1.000000 0.200000+-1.000000 0.300000+-1.000000 0.400000+-1.000000 0.500000+-1.000000 0.600000+-1.000000 0.700000+-1.000000 0.800000+-1.000000 0.900000+-1.000000 1.000000+-1.000000 1.100000+-1.000000 1.200000+-1.000000 1.300000+-1.000000 1.400000+-1.000000 1.500000+-1.000000 1.600000+-1.000000 1.700000+-1.000000 1.800000+-1.000000 1.900000+-1.000000 2.000000+-1.000000 2.100000+-1.000000 2.200000+-1.000000 2.300000+-1.000000 2.400000+-1.000000 2.500000+-1.000000 2.600000+-1.000000 2.700000+-1.000000 2.800000+-1.000000 2.900000+-1.000000 3.000000+-1.000000 3.100000+-1.000000 3.200000+-1.000000 3.300000+-1.000000 3.400000+-1.000000 3.500000+-1.000000 3.600000+-1.000000 3.700000+-1.000000 3.800000+-1.000000 3.900000+-1.000000 4.000000+-0.900000 -4.000000+-0.900000 -3.900000+-0.900000 -3.800000+-0.900000 -3.700000+-0.900000 -3.600000+-0.900000 -3.500000+-0.900000 -3.400000+-0.900000 -3.300000+-0.900000 -3.200000+-0.900000 -3.100000+-0.900000 -3.000000+-0.900000 -2.900000+-0.900000 -2.800000+-0.900000 -2.700000+-0.900000 -2.600000+-0.900000 -2.500000+-0.900000 -2.400000+-0.900000 -2.300000+-0.900000 -2.200000+-0.900000 -2.100000+-0.900000 -2.000000+-0.900000 -1.900000+-0.900000 -1.800000+-0.900000 -1.700000+-0.900000 -1.600000+-0.900000 -1.500000+-0.900000 -1.400000+-0.900000 -1.300000+-0.900000 -1.200000+-0.900000 -1.100000+-0.900000 -1.000000+-0.900000 -0.900000+-0.900000 -0.800000+-0.900000 -0.700000+-0.900000 -0.600000+-0.900000 -0.500000+-0.900000 -0.400000+-0.900000 -0.300000+-0.900000 -0.200000+-0.900000 -0.100000+-0.900000 0.000000+-0.900000 0.100000+-0.900000 0.200000+-0.900000 0.300000+-0.900000 0.400000+-0.900000 0.500000+-0.900000 0.600000+-0.900000 0.700000+-0.900000 0.800000+-0.900000 0.900000+-0.900000 1.000000+-0.900000 1.100000+-0.900000 1.200000+-0.900000 1.300000+-0.900000 1.400000+-0.900000 1.500000+-0.900000 1.600000+-0.900000 1.700000+-0.900000 1.800000+-0.900000 1.900000+-0.900000 2.000000+-0.900000 2.100000+-0.900000 2.200000+-0.900000 2.300000+-0.900000 2.400000+-0.900000 2.500000+-0.900000 2.600000+-0.900000 2.700000+-0.900000 2.800000+-0.900000 2.900000+-0.900000 3.000000+-0.900000 3.100000+-0.900000 3.200000+-0.900000 3.300000+-0.900000 3.400000+-0.900000 3.500000+-0.900000 3.600000+-0.900000 3.700000+-0.900000 3.800000+-0.900000 3.900000+-0.900000 4.000000+-0.800000 -4.000000+-0.800000 -3.900000+-0.800000 -3.800000+-0.800000 -3.700000+-0.800000 -3.600000+-0.800000 -3.500000+-0.800000 -3.400000+-0.800000 -3.300000+-0.800000 -3.200000+-0.800000 -3.100000+-0.800000 -3.000000+-0.800000 -2.900000+-0.800000 -2.800000+-0.800000 -2.700000+-0.800000 -2.600000+-0.800000 -2.500000+-0.800000 -2.400000+-0.800000 -2.300000+-0.800000 -2.200000+-0.800000 -2.100000+-0.800000 -2.000000+-0.800000 -1.900000+-0.800000 -1.800000+-0.800000 -1.700000+-0.800000 -1.600000+-0.800000 -1.500000+-0.800000 -1.400000+-0.800000 -1.300000+-0.800000 -1.200000+-0.800000 -1.100000+-0.800000 -1.000000+-0.800000 -0.900000+-0.800000 -0.800000+-0.800000 -0.700000+-0.800000 -0.600000+-0.800000 -0.500000+-0.800000 -0.400000+-0.800000 -0.300000+-0.800000 -0.200000+-0.800000 -0.100000+-0.800000 0.000000+-0.800000 0.100000+-0.800000 0.200000+-0.800000 0.300000+-0.800000 0.400000+-0.800000 0.500000+-0.800000 0.600000+-0.800000 0.700000+-0.800000 0.800000+-0.800000 0.900000+-0.800000 1.000000+-0.800000 1.100000+-0.800000 1.200000+-0.800000 1.300000+-0.800000 1.400000+-0.800000 1.500000+-0.800000 1.600000+-0.800000 1.700000+-0.800000 1.800000+-0.800000 1.900000+-0.800000 2.000000+-0.800000 2.100000+-0.800000 2.200000+-0.800000 2.300000+-0.800000 2.400000+-0.800000 2.500000+-0.800000 2.600000+-0.800000 2.700000+-0.800000 2.800000+-0.800000 2.900000+-0.800000 3.000000+-0.800000 3.100000+-0.800000 3.200000+-0.800000 3.300000+-0.800000 3.400000+-0.800000 3.500000+-0.800000 3.600000+-0.800000 3.700000+-0.800000 3.800000+-0.800000 3.900000+-0.800000 4.000000+-0.700000 -4.000000+-0.700000 -3.900000+-0.700000 -3.800000+-0.700000 -3.700000+-0.700000 -3.600000+-0.700000 -3.500000+-0.700000 -3.400000+-0.700000 -3.300000+-0.700000 -3.200000+-0.700000 -3.100000+-0.700000 -3.000000+-0.700000 -2.900000+-0.700000 -2.800000+-0.700000 -2.700000+-0.700000 -2.600000+-0.700000 -2.500000+-0.700000 -2.400000+-0.700000 -2.300000+-0.700000 -2.200000+-0.700000 -2.100000+-0.700000 -2.000000+-0.700000 -1.900000+-0.700000 -1.800000+-0.700000 -1.700000+-0.700000 -1.600000+-0.700000 -1.500000+-0.700000 -1.400000+-0.700000 -1.300000+-0.700000 -1.200000+-0.700000 -1.100000+-0.700000 -1.000000+-0.700000 -0.900000+-0.700000 -0.800000+-0.700000 -0.700000+-0.700000 -0.600000+-0.700000 -0.500000+-0.700000 -0.400000+-0.700000 -0.300000+-0.700000 -0.200000+-0.700000 -0.100000+-0.700000 0.000000+-0.700000 0.100000+-0.700000 0.200000+-0.700000 0.300000+-0.700000 0.400000+-0.700000 0.500000+-0.700000 0.600000+-0.700000 0.700000+-0.700000 0.800000+-0.700000 0.900000+-0.700000 1.000000+-0.700000 1.100000+-0.700000 1.200000+-0.700000 1.300000+-0.700000 1.400000+-0.700000 1.500000+-0.700000 1.600000+-0.700000 1.700000+-0.700000 1.800000+-0.700000 1.900000+-0.700000 2.000000+-0.700000 2.100000+-0.700000 2.200000+-0.700000 2.300000+-0.700000 2.400000+-0.700000 2.500000+-0.700000 2.600000+-0.700000 2.700000+-0.700000 2.800000+-0.700000 2.900000+-0.700000 3.000000+-0.700000 3.100000+-0.700000 3.200000+-0.700000 3.300000+-0.700000 3.400000+-0.700000 3.500000+-0.700000 3.600000+-0.700000 3.700000+-0.700000 3.800000+-0.700000 3.900000+-0.700000 4.000000+-0.600000 -4.000000+-0.600000 -3.900000+-0.600000 -3.800000+-0.600000 -3.700000+-0.600000 -3.600000+-0.600000 -3.500000+-0.600000 -3.400000+-0.600000 -3.300000+-0.600000 -3.200000+-0.600000 -3.100000+-0.600000 -3.000000+-0.600000 -2.900000+-0.600000 -2.800000+-0.600000 -2.700000+-0.600000 -2.600000+-0.600000 -2.500000+-0.600000 -2.400000+-0.600000 -2.300000+-0.600000 -2.200000+-0.600000 -2.100000+-0.600000 -2.000000+-0.600000 -1.900000+-0.600000 -1.800000+-0.600000 -1.700000+-0.600000 -1.600000+-0.600000 -1.500000+-0.600000 -1.400000+-0.600000 -1.300000+-0.600000 -1.200000+-0.600000 -1.100000+-0.600000 -1.000000+-0.600000 -0.900000+-0.600000 -0.800000+-0.600000 -0.700000+-0.600000 -0.600000+-0.600000 -0.500000+-0.600000 -0.400000+-0.600000 -0.300000+-0.600000 -0.200000+-0.600000 -0.100000+-0.600000 0.000000+-0.600000 0.100000+-0.600000 0.200000+-0.600000 0.300000+-0.600000 0.400000+-0.600000 0.500000+-0.600000 0.600000+-0.600000 0.700000+-0.600000 0.800000+-0.600000 0.900000+-0.600000 1.000000+-0.600000 1.100000+-0.600000 1.200000+-0.600000 1.300000+-0.600000 1.400000+-0.600000 1.500000+-0.600000 1.600000+-0.600000 1.700000+-0.600000 1.800000+-0.600000 1.900000+-0.600000 2.000000+-0.600000 2.100000+-0.600000 2.200000+-0.600000 2.300000+-0.600000 2.400000+-0.600000 2.500000+-0.600000 2.600000+-0.600000 2.700000+-0.600000 2.800000+-0.600000 2.900000+-0.600000 3.000000+-0.600000 3.100000+-0.600000 3.200000+-0.600000 3.300000+-0.600000 3.400000+-0.600000 3.500000+-0.600000 3.600000+-0.600000 3.700000+-0.600000 3.800000+-0.600000 3.900000+-0.600000 4.000000+-0.500000 -4.000000+-0.500000 -3.900000+-0.500000 -3.800000+-0.500000 -3.700000+-0.500000 -3.600000+-0.500000 -3.500000+-0.500000 -3.400000+-0.500000 -3.300000+-0.500000 -3.200000+-0.500000 -3.100000+-0.500000 -3.000000+-0.500000 -2.900000+-0.500000 -2.800000+-0.500000 -2.700000+-0.500000 -2.600000+-0.500000 -2.500000+-0.500000 -2.400000+-0.500000 -2.300000+-0.500000 -2.200000+-0.500000 -2.100000+-0.500000 -2.000000+-0.500000 -1.900000+-0.500000 -1.800000+-0.500000 -1.700000+-0.500000 -1.600000+-0.500000 -1.500000+-0.500000 -1.400000+-0.500000 -1.300000+-0.500000 -1.200000+-0.500000 -1.100000+-0.500000 -1.000000+-0.500000 -0.900000+-0.500000 -0.800000+-0.500000 -0.700000+-0.500000 -0.600000+-0.500000 -0.500000+-0.500000 -0.400000+-0.500000 -0.300000+-0.500000 -0.200000+-0.500000 -0.100000+-0.500000 0.000000+-0.500000 0.100000+-0.500000 0.200000+-0.500000 0.300000+-0.500000 0.400000+-0.500000 0.500000+-0.500000 0.600000+-0.500000 0.700000+-0.500000 0.800000+-0.500000 0.900000+-0.500000 1.000000+-0.500000 1.100000+-0.500000 1.200000+-0.500000 1.300000+-0.500000 1.400000+-0.500000 1.500000+-0.500000 1.600000+-0.500000 1.700000+-0.500000 1.800000+-0.500000 1.900000+-0.500000 2.000000+-0.500000 2.100000+-0.500000 2.200000+-0.500000 2.300000+-0.500000 2.400000+-0.500000 2.500000+-0.500000 2.600000+-0.500000 2.700000+-0.500000 2.800000+-0.500000 2.900000+-0.500000 3.000000+-0.500000 3.100000+-0.500000 3.200000+-0.500000 3.300000+-0.500000 3.400000+-0.500000 3.500000+-0.500000 3.600000+-0.500000 3.700000+-0.500000 3.800000+-0.500000 3.900000+-0.500000 4.000000+-0.400000 -4.000000+-0.400000 -3.900000+-0.400000 -3.800000+-0.400000 -3.700000+-0.400000 -3.600000+-0.400000 -3.500000+-0.400000 -3.400000+-0.400000 -3.300000+-0.400000 -3.200000+-0.400000 -3.100000+-0.400000 -3.000000+-0.400000 -2.900000+-0.400000 -2.800000+-0.400000 -2.700000+-0.400000 -2.600000+-0.400000 -2.500000+-0.400000 -2.400000+-0.400000 -2.300000+-0.400000 -2.200000+-0.400000 -2.100000+-0.400000 -2.000000+-0.400000 -1.900000+-0.400000 -1.800000+-0.400000 -1.700000+-0.400000 -1.600000+-0.400000 -1.500000+-0.400000 -1.400000+-0.400000 -1.300000+-0.400000 -1.200000+-0.400000 -1.100000+-0.400000 -1.000000+-0.400000 -0.900000+-0.400000 -0.800000+-0.400000 -0.700000+-0.400000 -0.600000+-0.400000 -0.500000+-0.400000 -0.400000+-0.400000 -0.300000+-0.400000 -0.200000+-0.400000 -0.100000+-0.400000 0.000000+-0.400000 0.100000+-0.400000 0.200000+-0.400000 0.300000+-0.400000 0.400000+-0.400000 0.500000+-0.400000 0.600000+-0.400000 0.700000+-0.400000 0.800000+-0.400000 0.900000+-0.400000 1.000000+-0.400000 1.100000+-0.400000 1.200000+-0.400000 1.300000+-0.400000 1.400000+-0.400000 1.500000+-0.400000 1.600000+-0.400000 1.700000+-0.400000 1.800000+-0.400000 1.900000+-0.400000 2.000000+-0.400000 2.100000+-0.400000 2.200000+-0.400000 2.300000+-0.400000 2.400000+-0.400000 2.500000+-0.400000 2.600000+-0.400000 2.700000+-0.400000 2.800000+-0.400000 2.900000+-0.400000 3.000000+-0.400000 3.100000+-0.400000 3.200000+-0.400000 3.300000+-0.400000 3.400000+-0.400000 3.500000+-0.400000 3.600000+-0.400000 3.700000+-0.400000 3.800000+-0.400000 3.900000+-0.400000 4.000000+-0.300000 -4.000000+-0.300000 -3.900000+-0.300000 -3.800000+-0.300000 -3.700000+-0.300000 -3.600000+-0.300000 -3.500000+-0.300000 -3.400000+-0.300000 -3.300000+-0.300000 -3.200000+-0.300000 -3.100000+-0.300000 -3.000000+-0.300000 -2.900000+-0.300000 -2.800000+-0.300000 -2.700000+-0.300000 -2.600000+-0.300000 -2.500000+-0.300000 -2.400000+-0.300000 -2.300000+-0.300000 -2.200000+-0.300000 -2.100000+-0.300000 -2.000000+-0.300000 -1.900000+-0.300000 -1.800000+-0.300000 -1.700000+-0.300000 -1.600000+-0.300000 -1.500000+-0.300000 -1.400000+-0.300000 -1.300000+-0.300000 -1.200000+-0.300000 -1.100000+-0.300000 -1.000000+-0.300000 -0.900000+-0.300000 -0.800000+-0.300000 -0.700000+-0.300000 -0.600000+-0.300000 -0.500000+-0.300000 -0.400000+-0.300000 -0.300000+-0.300000 -0.200000+-0.300000 -0.100000+-0.300000 0.000000+-0.300000 0.100000+-0.300000 0.200000+-0.300000 0.300000+-0.300000 0.400000+-0.300000 0.500000+-0.300000 0.600000+-0.300000 0.700000+-0.300000 0.800000+-0.300000 0.900000+-0.300000 1.000000+-0.300000 1.100000+-0.300000 1.200000+-0.300000 1.300000+-0.300000 1.400000+-0.300000 1.500000+-0.300000 1.600000+-0.300000 1.700000+-0.300000 1.800000+-0.300000 1.900000+-0.300000 2.000000+-0.300000 2.100000+-0.300000 2.200000+-0.300000 2.300000+-0.300000 2.400000+-0.300000 2.500000+-0.300000 2.600000+-0.300000 2.700000+-0.300000 2.800000+-0.300000 2.900000+-0.300000 3.000000+-0.300000 3.100000+-0.300000 3.200000+-0.300000 3.300000+-0.300000 3.400000+-0.300000 3.500000+-0.300000 3.600000+-0.300000 3.700000+-0.300000 3.800000+-0.300000 3.900000+-0.300000 4.000000+-0.200000 -4.000000+-0.200000 -3.900000+-0.200000 -3.800000+-0.200000 -3.700000+-0.200000 -3.600000+-0.200000 -3.500000+-0.200000 -3.400000+-0.200000 -3.300000+-0.200000 -3.200000+-0.200000 -3.100000+-0.200000 -3.000000+-0.200000 -2.900000+-0.200000 -2.800000+-0.200000 -2.700000+-0.200000 -2.600000+-0.200000 -2.500000+-0.200000 -2.400000+-0.200000 -2.300000+-0.200000 -2.200000+-0.200000 -2.100000+-0.200000 -2.000000+-0.200000 -1.900000+-0.200000 -1.800000+-0.200000 -1.700000+-0.200000 -1.600000+-0.200000 -1.500000+-0.200000 -1.400000+-0.200000 -1.300000+-0.200000 -1.200000+-0.200000 -1.100000+-0.200000 -1.000000+-0.200000 -0.900000+-0.200000 -0.800000+-0.200000 -0.700000+-0.200000 -0.600000+-0.200000 -0.500000+-0.200000 -0.400000+-0.200000 -0.300000+-0.200000 -0.200000+-0.200000 -0.100000+-0.200000 0.000000+-0.200000 0.100000+-0.200000 0.200000+-0.200000 0.300000+-0.200000 0.400000+-0.200000 0.500000+-0.200000 0.600000+-0.200000 0.700000+-0.200000 0.800000+-0.200000 0.900000+-0.200000 1.000000+-0.200000 1.100000+-0.200000 1.200000+-0.200000 1.300000+-0.200000 1.400000+-0.200000 1.500000+-0.200000 1.600000+-0.200000 1.700000+-0.200000 1.800000+-0.200000 1.900000+-0.200000 2.000000+-0.200000 2.100000+-0.200000 2.200000+-0.200000 2.300000+-0.200000 2.400000+-0.200000 2.500000+-0.200000 2.600000+-0.200000 2.700000+-0.200000 2.800000+-0.200000 2.900000+-0.200000 3.000000+-0.200000 3.100000+-0.200000 3.200000+-0.200000 3.300000+-0.200000 3.400000+-0.200000 3.500000+-0.200000 3.600000+-0.200000 3.700000+-0.200000 3.800000+-0.200000 3.900000+-0.200000 4.000000+-0.100000 -4.000000+-0.100000 -3.900000+-0.100000 -3.800000+-0.100000 -3.700000+-0.100000 -3.600000+-0.100000 -3.500000+-0.100000 -3.400000+-0.100000 -3.300000+-0.100000 -3.200000+-0.100000 -3.100000+-0.100000 -3.000000+-0.100000 -2.900000+-0.100000 -2.800000+-0.100000 -2.700000+-0.100000 -2.600000+-0.100000 -2.500000+-0.100000 -2.400000+-0.100000 -2.300000+-0.100000 -2.200000+-0.100000 -2.100000+-0.100000 -2.000000+-0.100000 -1.900000+-0.100000 -1.800000+-0.100000 -1.700000+-0.100000 -1.600000+-0.100000 -1.500000+-0.100000 -1.400000+-0.100000 -1.300000+-0.100000 -1.200000+-0.100000 -1.100000+-0.100000 -1.000000+-0.100000 -0.900000+-0.100000 -0.800000+-0.100000 -0.700000+-0.100000 -0.600000+-0.100000 -0.500000+-0.100000 -0.400000+-0.100000 -0.300000+-0.100000 -0.200000+-0.100000 -0.100000+-0.100000 0.000000+-0.100000 0.100000+-0.100000 0.200000+-0.100000 0.300000+-0.100000 0.400000+-0.100000 0.500000+-0.100000 0.600000+-0.100000 0.700000+-0.100000 0.800000+-0.100000 0.900000+-0.100000 1.000000+-0.100000 1.100000+-0.100000 1.200000+-0.100000 1.300000+-0.100000 1.400000+-0.100000 1.500000+-0.100000 1.600000+-0.100000 1.700000+-0.100000 1.800000+-0.100000 1.900000+-0.100000 2.000000+-0.100000 2.100000+-0.100000 2.200000+-0.100000 2.300000+-0.100000 2.400000+-0.100000 2.500000+-0.100000 2.600000+-0.100000 2.700000+-0.100000 2.800000+-0.100000 2.900000+-0.100000 3.000000+-0.100000 3.100000+-0.100000 3.200000+-0.100000 3.300000+-0.100000 3.400000+-0.100000 3.500000+-0.100000 3.600000+-0.100000 3.700000+-0.100000 3.800000+-0.100000 3.900000+-0.100000 4.000000+0.000000 -4.000000+0.000000 -3.900000+0.000000 -3.800000+0.000000 -3.700000+0.000000 -3.600000+0.000000 -3.500000+0.000000 -3.400000+0.000000 -3.300000+0.000000 -3.200000+0.000000 -3.100000+0.000000 -3.000000+0.000000 -2.900000+0.000000 -2.800000+0.000000 -2.700000+0.000000 -2.600000+0.000000 -2.500000+0.000000 -2.400000+0.000000 -2.300000+0.000000 -2.200000+0.000000 -2.100000+0.000000 -2.000000+0.000000 -1.900000+0.000000 -1.800000+0.000000 -1.700000+0.000000 -1.600000+0.000000 -1.500000+0.000000 -1.400000+0.000000 -1.300000+0.000000 -1.200000+0.000000 -1.100000+0.000000 -1.000000+0.000000 -0.900000+0.000000 -0.800000+0.000000 -0.700000+0.000000 -0.600000+0.000000 -0.500000+0.000000 -0.400000+0.000000 -0.300000+0.000000 -0.200000+0.000000 -0.100000+0.000000 0.000000+0.000000 0.100000+0.000000 0.200000+0.000000 0.300000+0.000000 0.400000+0.000000 0.500000+0.000000 0.600000+0.000000 0.700000+0.000000 0.800000+0.000000 0.900000+0.000000 1.000000+0.000000 1.100000+0.000000 1.200000+0.000000 1.300000+0.000000 1.400000+0.000000 1.500000+0.000000 1.600000+0.000000 1.700000+0.000000 1.800000+0.000000 1.900000+0.000000 2.000000+0.000000 2.100000+0.000000 2.200000+0.000000 2.300000+0.000000 2.400000+0.000000 2.500000+0.000000 2.600000+0.000000 2.700000+0.000000 2.800000+0.000000 2.900000+0.000000 3.000000+0.000000 3.100000+0.000000 3.200000+0.000000 3.300000+0.000000 3.400000+0.000000 3.500000+0.000000 3.600000+0.000000 3.700000+0.000000 3.800000+0.000000 3.900000+0.000000 4.000000+0.100000 -4.000000+0.100000 -3.900000+0.100000 -3.800000+0.100000 -3.700000+0.100000 -3.600000+0.100000 -3.500000+0.100000 -3.400000+0.100000 -3.300000+0.100000 -3.200000+0.100000 -3.100000+0.100000 -3.000000+0.100000 -2.900000+0.100000 -2.800000+0.100000 -2.700000+0.100000 -2.600000+0.100000 -2.500000+0.100000 -2.400000+0.100000 -2.300000+0.100000 -2.200000+0.100000 -2.100000+0.100000 -2.000000+0.100000 -1.900000+0.100000 -1.800000+0.100000 -1.700000+0.100000 -1.600000+0.100000 -1.500000+0.100000 -1.400000+0.100000 -1.300000+0.100000 -1.200000+0.100000 -1.100000+0.100000 -1.000000+0.100000 -0.900000+0.100000 -0.800000+0.100000 -0.700000+0.100000 -0.600000+0.100000 -0.500000+0.100000 -0.400000+0.100000 -0.300000+0.100000 -0.200000+0.100000 -0.100000+0.100000 0.000000+0.100000 0.100000+0.100000 0.200000+0.100000 0.300000+0.100000 0.400000+0.100000 0.500000+0.100000 0.600000+0.100000 0.700000+0.100000 0.800000+0.100000 0.900000+0.100000 1.000000+0.100000 1.100000+0.100000 1.200000+0.100000 1.300000+0.100000 1.400000+0.100000 1.500000+0.100000 1.600000+0.100000 1.700000+0.100000 1.800000+0.100000 1.900000+0.100000 2.000000+0.100000 2.100000+0.100000 2.200000+0.100000 2.300000+0.100000 2.400000+0.100000 2.500000+0.100000 2.600000+0.100000 2.700000+0.100000 2.800000+0.100000 2.900000+0.100000 3.000000+0.100000 3.100000+0.100000 3.200000+0.100000 3.300000+0.100000 3.400000+0.100000 3.500000+0.100000 3.600000+0.100000 3.700000+0.100000 3.800000+0.100000 3.900000+0.100000 4.000000+0.200000 -4.000000+0.200000 -3.900000+0.200000 -3.800000+0.200000 -3.700000+0.200000 -3.600000+0.200000 -3.500000+0.200000 -3.400000+0.200000 -3.300000+0.200000 -3.200000+0.200000 -3.100000+0.200000 -3.000000+0.200000 -2.900000+0.200000 -2.800000+0.200000 -2.700000+0.200000 -2.600000+0.200000 -2.500000+0.200000 -2.400000+0.200000 -2.300000+0.200000 -2.200000+0.200000 -2.100000+0.200000 -2.000000+0.200000 -1.900000+0.200000 -1.800000+0.200000 -1.700000+0.200000 -1.600000+0.200000 -1.500000+0.200000 -1.400000+0.200000 -1.300000+0.200000 -1.200000+0.200000 -1.100000+0.200000 -1.000000+0.200000 -0.900000+0.200000 -0.800000+0.200000 -0.700000+0.200000 -0.600000+0.200000 -0.500000+0.200000 -0.400000+0.200000 -0.300000+0.200000 -0.200000+0.200000 -0.100000+0.200000 0.000000+0.200000 0.100000+0.200000 0.200000+0.200000 0.300000+0.200000 0.400000+0.200000 0.500000+0.200000 0.600000+0.200000 0.700000+0.200000 0.800000+0.200000 0.900000+0.200000 1.000000+0.200000 1.100000+0.200000 1.200000+0.200000 1.300000+0.200000 1.400000+0.200000 1.500000+0.200000 1.600000+0.200000 1.700000+0.200000 1.800000+0.200000 1.900000+0.200000 2.000000+0.200000 2.100000+0.200000 2.200000+0.200000 2.300000+0.200000 2.400000+0.200000 2.500000+0.200000 2.600000+0.200000 2.700000+0.200000 2.800000+0.200000 2.900000+0.200000 3.000000+0.200000 3.100000+0.200000 3.200000+0.200000 3.300000+0.200000 3.400000+0.200000 3.500000+0.200000 3.600000+0.200000 3.700000+0.200000 3.800000+0.200000 3.900000+0.200000 4.000000+0.300000 -4.000000+0.300000 -3.900000+0.300000 -3.800000+0.300000 -3.700000+0.300000 -3.600000+0.300000 -3.500000+0.300000 -3.400000+0.300000 -3.300000+0.300000 -3.200000+0.300000 -3.100000+0.300000 -3.000000+0.300000 -2.900000+0.300000 -2.800000+0.300000 -2.700000+0.300000 -2.600000+0.300000 -2.500000+0.300000 -2.400000+0.300000 -2.300000+0.300000 -2.200000+0.300000 -2.100000+0.300000 -2.000000+0.300000 -1.900000+0.300000 -1.800000+0.300000 -1.700000+0.300000 -1.600000+0.300000 -1.500000+0.300000 -1.400000+0.300000 -1.300000+0.300000 -1.200000+0.300000 -1.100000+0.300000 -1.000000+0.300000 -0.900000+0.300000 -0.800000+0.300000 -0.700000+0.300000 -0.600000+0.300000 -0.500000+0.300000 -0.400000+0.300000 -0.300000+0.300000 -0.200000+0.300000 -0.100000+0.300000 0.000000+0.300000 0.100000+0.300000 0.200000+0.300000 0.300000+0.300000 0.400000+0.300000 0.500000+0.300000 0.600000+0.300000 0.700000+0.300000 0.800000+0.300000 0.900000+0.300000 1.000000+0.300000 1.100000+0.300000 1.200000+0.300000 1.300000+0.300000 1.400000+0.300000 1.500000+0.300000 1.600000+0.300000 1.700000+0.300000 1.800000+0.300000 1.900000+0.300000 2.000000+0.300000 2.100000+0.300000 2.200000+0.300000 2.300000+0.300000 2.400000+0.300000 2.500000+0.300000 2.600000+0.300000 2.700000+0.300000 2.800000+0.300000 2.900000+0.300000 3.000000+0.300000 3.100000+0.300000 3.200000+0.300000 3.300000+0.300000 3.400000+0.300000 3.500000+0.300000 3.600000+0.300000 3.700000+0.300000 3.800000+0.300000 3.900000+0.300000 4.000000+0.400000 -4.000000+0.400000 -3.900000+0.400000 -3.800000+0.400000 -3.700000+0.400000 -3.600000+0.400000 -3.500000+0.400000 -3.400000+0.400000 -3.300000+0.400000 -3.200000+0.400000 -3.100000+0.400000 -3.000000+0.400000 -2.900000+0.400000 -2.800000+0.400000 -2.700000+0.400000 -2.600000+0.400000 -2.500000+0.400000 -2.400000+0.400000 -2.300000+0.400000 -2.200000+0.400000 -2.100000+0.400000 -2.000000+0.400000 -1.900000+0.400000 -1.800000+0.400000 -1.700000+0.400000 -1.600000+0.400000 -1.500000+0.400000 -1.400000+0.400000 -1.300000+0.400000 -1.200000+0.400000 -1.100000+0.400000 -1.000000+0.400000 -0.900000+0.400000 -0.800000+0.400000 -0.700000+0.400000 -0.600000+0.400000 -0.500000+0.400000 -0.400000+0.400000 -0.300000+0.400000 -0.200000+0.400000 -0.100000+0.400000 0.000000+0.400000 0.100000+0.400000 0.200000+0.400000 0.300000+0.400000 0.400000+0.400000 0.500000+0.400000 0.600000+0.400000 0.700000+0.400000 0.800000+0.400000 0.900000+0.400000 1.000000+0.400000 1.100000+0.400000 1.200000+0.400000 1.300000+0.400000 1.400000+0.400000 1.500000+0.400000 1.600000+0.400000 1.700000+0.400000 1.800000+0.400000 1.900000+0.400000 2.000000+0.400000 2.100000+0.400000 2.200000+0.400000 2.300000+0.400000 2.400000+0.400000 2.500000+0.400000 2.600000+0.400000 2.700000+0.400000 2.800000+0.400000 2.900000+0.400000 3.000000+0.400000 3.100000+0.400000 3.200000+0.400000 3.300000+0.400000 3.400000+0.400000 3.500000+0.400000 3.600000+0.400000 3.700000+0.400000 3.800000+0.400000 3.900000+0.400000 4.000000+0.500000 -4.000000+0.500000 -3.900000+0.500000 -3.800000+0.500000 -3.700000+0.500000 -3.600000+0.500000 -3.500000+0.500000 -3.400000+0.500000 -3.300000+0.500000 -3.200000+0.500000 -3.100000+0.500000 -3.000000+0.500000 -2.900000+0.500000 -2.800000+0.500000 -2.700000+0.500000 -2.600000+0.500000 -2.500000+0.500000 -2.400000+0.500000 -2.300000+0.500000 -2.200000+0.500000 -2.100000+0.500000 -2.000000+0.500000 -1.900000+0.500000 -1.800000+0.500000 -1.700000+0.500000 -1.600000+0.500000 -1.500000+0.500000 -1.400000+0.500000 -1.300000+0.500000 -1.200000+0.500000 -1.100000+0.500000 -1.000000+0.500000 -0.900000+0.500000 -0.800000+0.500000 -0.700000+0.500000 -0.600000+0.500000 -0.500000+0.500000 -0.400000+0.500000 -0.300000+0.500000 -0.200000+0.500000 -0.100000+0.500000 0.000000+0.500000 0.100000+0.500000 0.200000+0.500000 0.300000+0.500000 0.400000+0.500000 0.500000+0.500000 0.600000+0.500000 0.700000+0.500000 0.800000+0.500000 0.900000+0.500000 1.000000+0.500000 1.100000+0.500000 1.200000+0.500000 1.300000+0.500000 1.400000+0.500000 1.500000+0.500000 1.600000+0.500000 1.700000+0.500000 1.800000+0.500000 1.900000+0.500000 2.000000+0.500000 2.100000+0.500000 2.200000+0.500000 2.300000+0.500000 2.400000+0.500000 2.500000+0.500000 2.600000+0.500000 2.700000+0.500000 2.800000+0.500000 2.900000+0.500000 3.000000+0.500000 3.100000+0.500000 3.200000+0.500000 3.300000+0.500000 3.400000+0.500000 3.500000+0.500000 3.600000+0.500000 3.700000+0.500000 3.800000+0.500000 3.900000+0.500000 4.000000+0.600000 -4.000000+0.600000 -3.900000+0.600000 -3.800000+0.600000 -3.700000+0.600000 -3.600000+0.600000 -3.500000+0.600000 -3.400000+0.600000 -3.300000+0.600000 -3.200000+0.600000 -3.100000+0.600000 -3.000000+0.600000 -2.900000+0.600000 -2.800000+0.600000 -2.700000+0.600000 -2.600000+0.600000 -2.500000+0.600000 -2.400000+0.600000 -2.300000+0.600000 -2.200000+0.600000 -2.100000+0.600000 -2.000000+0.600000 -1.900000+0.600000 -1.800000+0.600000 -1.700000+0.600000 -1.600000+0.600000 -1.500000+0.600000 -1.400000+0.600000 -1.300000+0.600000 -1.200000+0.600000 -1.100000+0.600000 -1.000000+0.600000 -0.900000+0.600000 -0.800000+0.600000 -0.700000+0.600000 -0.600000+0.600000 -0.500000+0.600000 -0.400000+0.600000 -0.300000+0.600000 -0.200000+0.600000 -0.100000+0.600000 0.000000+0.600000 0.100000+0.600000 0.200000+0.600000 0.300000+0.600000 0.400000+0.600000 0.500000+0.600000 0.600000+0.600000 0.700000+0.600000 0.800000+0.600000 0.900000+0.600000 1.000000+0.600000 1.100000+0.600000 1.200000+0.600000 1.300000+0.600000 1.400000+0.600000 1.500000+0.600000 1.600000+0.600000 1.700000+0.600000 1.800000+0.600000 1.900000+0.600000 2.000000+0.600000 2.100000+0.600000 2.200000+0.600000 2.300000+0.600000 2.400000+0.600000 2.500000+0.600000 2.600000+0.600000 2.700000+0.600000 2.800000+0.600000 2.900000+0.600000 3.000000+0.600000 3.100000+0.600000 3.200000+0.600000 3.300000+0.600000 3.400000+0.600000 3.500000+0.600000 3.600000+0.600000 3.700000+0.600000 3.800000+0.600000 3.900000+0.600000 4.000000+0.700000 -4.000000+0.700000 -3.900000+0.700000 -3.800000+0.700000 -3.700000+0.700000 -3.600000+0.700000 -3.500000+0.700000 -3.400000+0.700000 -3.300000+0.700000 -3.200000+0.700000 -3.100000+0.700000 -3.000000+0.700000 -2.900000+0.700000 -2.800000+0.700000 -2.700000+0.700000 -2.600000+0.700000 -2.500000+0.700000 -2.400000+0.700000 -2.300000+0.700000 -2.200000+0.700000 -2.100000+0.700000 -2.000000+0.700000 -1.900000+0.700000 -1.800000+0.700000 -1.700000+0.700000 -1.600000+0.700000 -1.500000+0.700000 -1.400000+0.700000 -1.300000+0.700000 -1.200000+0.700000 -1.100000+0.700000 -1.000000+0.700000 -0.900000+0.700000 -0.800000+0.700000 -0.700000+0.700000 -0.600000+0.700000 -0.500000+0.700000 -0.400000+0.700000 -0.300000+0.700000 -0.200000+0.700000 -0.100000+0.700000 0.000000+0.700000 0.100000+0.700000 0.200000+0.700000 0.300000+0.700000 0.400000+0.700000 0.500000+0.700000 0.600000+0.700000 0.700000+0.700000 0.800000+0.700000 0.900000+0.700000 1.000000+0.700000 1.100000+0.700000 1.200000+0.700000 1.300000+0.700000 1.400000+0.700000 1.500000+0.700000 1.600000+0.700000 1.700000+0.700000 1.800000+0.700000 1.900000+0.700000 2.000000+0.700000 2.100000+0.700000 2.200000+0.700000 2.300000+0.700000 2.400000+0.700000 2.500000+0.700000 2.600000+0.700000 2.700000+0.700000 2.800000+0.700000 2.900000+0.700000 3.000000+0.700000 3.100000+0.700000 3.200000+0.700000 3.300000+0.700000 3.400000+0.700000 3.500000+0.700000 3.600000+0.700000 3.700000+0.700000 3.800000+0.700000 3.900000+0.700000 4.000000+0.800000 -4.000000+0.800000 -3.900000+0.800000 -3.800000+0.800000 -3.700000+0.800000 -3.600000+0.800000 -3.500000+0.800000 -3.400000+0.800000 -3.300000+0.800000 -3.200000+0.800000 -3.100000+0.800000 -3.000000+0.800000 -2.900000+0.800000 -2.800000+0.800000 -2.700000+0.800000 -2.600000+0.800000 -2.500000+0.800000 -2.400000+0.800000 -2.300000+0.800000 -2.200000+0.800000 -2.100000+0.800000 -2.000000+0.800000 -1.900000+0.800000 -1.800000+0.800000 -1.700000+0.800000 -1.600000+0.800000 -1.500000+0.800000 -1.400000+0.800000 -1.300000+0.800000 -1.200000+0.800000 -1.100000+0.800000 -1.000000+0.800000 -0.900000+0.800000 -0.800000+0.800000 -0.700000+0.800000 -0.600000+0.800000 -0.500000+0.800000 -0.400000+0.800000 -0.300000+0.800000 -0.200000+0.800000 -0.100000+0.800000 0.000000+0.800000 0.100000+0.800000 0.200000+0.800000 0.300000+0.800000 0.400000+0.800000 0.500000+0.800000 0.600000+0.800000 0.700000+0.800000 0.800000+0.800000 0.900000+0.800000 1.000000+0.800000 1.100000+0.800000 1.200000+0.800000 1.300000+0.800000 1.400000+0.800000 1.500000+0.800000 1.600000+0.800000 1.700000+0.800000 1.800000+0.800000 1.900000+0.800000 2.000000+0.800000 2.100000+0.800000 2.200000+0.800000 2.300000+0.800000 2.400000+0.800000 2.500000+0.800000 2.600000+0.800000 2.700000+0.800000 2.800000+0.800000 2.900000+0.800000 3.000000+0.800000 3.100000+0.800000 3.200000+0.800000 3.300000+0.800000 3.400000+0.800000 3.500000+0.800000 3.600000+0.800000 3.700000+0.800000 3.800000+0.800000 3.900000+0.800000 4.000000+0.900000 -4.000000+0.900000 -3.900000+0.900000 -3.800000+0.900000 -3.700000+0.900000 -3.600000+0.900000 -3.500000+0.900000 -3.400000+0.900000 -3.300000+0.900000 -3.200000+0.900000 -3.100000+0.900000 -3.000000+0.900000 -2.900000+0.900000 -2.800000+0.900000 -2.700000+0.900000 -2.600000+0.900000 -2.500000+0.900000 -2.400000+0.900000 -2.300000+0.900000 -2.200000+0.900000 -2.100000+0.900000 -2.000000+0.900000 -1.900000+0.900000 -1.800000+0.900000 -1.700000+0.900000 -1.600000+0.900000 -1.500000+0.900000 -1.400000+0.900000 -1.300000+0.900000 -1.200000+0.900000 -1.100000+0.900000 -1.000000+0.900000 -0.900000+0.900000 -0.800000+0.900000 -0.700000+0.900000 -0.600000+0.900000 -0.500000+0.900000 -0.400000+0.900000 -0.300000+0.900000 -0.200000+0.900000 -0.100000+0.900000 0.000000+0.900000 0.100000+0.900000 0.200000+0.900000 0.300000+0.900000 0.400000+0.900000 0.500000+0.900000 0.600000+0.900000 0.700000+0.900000 0.800000+0.900000 0.900000+0.900000 1.000000+0.900000 1.100000+0.900000 1.200000+0.900000 1.300000+0.900000 1.400000+0.900000 1.500000+0.900000 1.600000+0.900000 1.700000+0.900000 1.800000+0.900000 1.900000+0.900000 2.000000+0.900000 2.100000+0.900000 2.200000+0.900000 2.300000+0.900000 2.400000+0.900000 2.500000+0.900000 2.600000+0.900000 2.700000+0.900000 2.800000+0.900000 2.900000+0.900000 3.000000+0.900000 3.100000+0.900000 3.200000+0.900000 3.300000+0.900000 3.400000+0.900000 3.500000+0.900000 3.600000+0.900000 3.700000+0.900000 3.800000+0.900000 3.900000+0.900000 4.000000+1.000000 -4.000000+1.000000 -3.900000+1.000000 -3.800000+1.000000 -3.700000+1.000000 -3.600000+1.000000 -3.500000+1.000000 -3.400000+1.000000 -3.300000+1.000000 -3.200000+1.000000 -3.100000+1.000000 -3.000000+1.000000 -2.900000+1.000000 -2.800000+1.000000 -2.700000+1.000000 -2.600000+1.000000 -2.500000+1.000000 -2.400000+1.000000 -2.300000+1.000000 -2.200000+1.000000 -2.100000+1.000000 -2.000000+1.000000 -1.900000+1.000000 -1.800000+1.000000 -1.700000+1.000000 -1.600000+1.000000 -1.500000+1.000000 -1.400000+1.000000 -1.300000+1.000000 -1.200000+1.000000 -1.100000+1.000000 -1.000000+1.000000 -0.900000+1.000000 -0.800000+1.000000 -0.700000+1.000000 -0.600000+1.000000 -0.500000+1.000000 -0.400000+1.000000 -0.300000+1.000000 -0.200000+1.000000 -0.100000+1.000000 0.000000+1.000000 0.100000+1.000000 0.200000+1.000000 0.300000+1.000000 0.400000+1.000000 0.500000+1.000000 0.600000+1.000000 0.700000+1.000000 0.800000+1.000000 0.900000+1.000000 1.000000+1.000000 1.100000+1.000000 1.200000+1.000000 1.300000+1.000000 1.400000+1.000000 1.500000+1.000000 1.600000+1.000000 1.700000+1.000000 1.800000+1.000000 1.900000+1.000000 2.000000+1.000000 2.100000+1.000000 2.200000+1.000000 2.300000+1.000000 2.400000+1.000000 2.500000+1.000000 2.600000+1.000000 2.700000+1.000000 2.800000+1.000000 2.900000+1.000000 3.000000+1.000000 3.100000+1.000000 3.200000+1.000000 3.300000+1.000000 3.400000+1.000000 3.500000+1.000000 3.600000+1.000000 3.700000+1.000000 3.800000+1.000000 3.900000+1.000000 4.000000+1.100000 -4.000000+1.100000 -3.900000+1.100000 -3.800000+1.100000 -3.700000+1.100000 -3.600000+1.100000 -3.500000+1.100000 -3.400000+1.100000 -3.300000+1.100000 -3.200000+1.100000 -3.100000+1.100000 -3.000000+1.100000 -2.900000+1.100000 -2.800000+1.100000 -2.700000+1.100000 -2.600000+1.100000 -2.500000+1.100000 -2.400000+1.100000 -2.300000+1.100000 -2.200000+1.100000 -2.100000+1.100000 -2.000000+1.100000 -1.900000+1.100000 -1.800000+1.100000 -1.700000+1.100000 -1.600000+1.100000 -1.500000+1.100000 -1.400000+1.100000 -1.300000+1.100000 -1.200000+1.100000 -1.100000+1.100000 -1.000000+1.100000 -0.900000+1.100000 -0.800000+1.100000 -0.700000+1.100000 -0.600000+1.100000 -0.500000+1.100000 -0.400000+1.100000 -0.300000+1.100000 -0.200000+1.100000 -0.100000+1.100000 0.000000+1.100000 0.100000+1.100000 0.200000+1.100000 0.300000+1.100000 0.400000+1.100000 0.500000+1.100000 0.600000+1.100000 0.700000+1.100000 0.800000+1.100000 0.900000+1.100000 1.000000+1.100000 1.100000+1.100000 1.200000+1.100000 1.300000+1.100000 1.400000+1.100000 1.500000+1.100000 1.600000+1.100000 1.700000+1.100000 1.800000+1.100000 1.900000+1.100000 2.000000+1.100000 2.100000+1.100000 2.200000+1.100000 2.300000+1.100000 2.400000+1.100000 2.500000+1.100000 2.600000+1.100000 2.700000+1.100000 2.800000+1.100000 2.900000+1.100000 3.000000+1.100000 3.100000+1.100000 3.200000+1.100000 3.300000+1.100000 3.400000+1.100000 3.500000+1.100000 3.600000+1.100000 3.700000+1.100000 3.800000+1.100000 3.900000+1.100000 4.000000+1.200000 -4.000000+1.200000 -3.900000+1.200000 -3.800000+1.200000 -3.700000+1.200000 -3.600000+1.200000 -3.500000+1.200000 -3.400000+1.200000 -3.300000+1.200000 -3.200000+1.200000 -3.100000+1.200000 -3.000000+1.200000 -2.900000+1.200000 -2.800000+1.200000 -2.700000+1.200000 -2.600000+1.200000 -2.500000+1.200000 -2.400000+1.200000 -2.300000+1.200000 -2.200000+1.200000 -2.100000+1.200000 -2.000000+1.200000 -1.900000+1.200000 -1.800000+1.200000 -1.700000+1.200000 -1.600000+1.200000 -1.500000+1.200000 -1.400000+1.200000 -1.300000+1.200000 -1.200000+1.200000 -1.100000+1.200000 -1.000000+1.200000 -0.900000+1.200000 -0.800000+1.200000 -0.700000+1.200000 -0.600000+1.200000 -0.500000+1.200000 -0.400000+1.200000 -0.300000+1.200000 -0.200000+1.200000 -0.100000+1.200000 0.000000+1.200000 0.100000+1.200000 0.200000+1.200000 0.300000+1.200000 0.400000+1.200000 0.500000+1.200000 0.600000+1.200000 0.700000+1.200000 0.800000+1.200000 0.900000+1.200000 1.000000+1.200000 1.100000+1.200000 1.200000+1.200000 1.300000+1.200000 1.400000+1.200000 1.500000+1.200000 1.600000+1.200000 1.700000+1.200000 1.800000+1.200000 1.900000+1.200000 2.000000+1.200000 2.100000+1.200000 2.200000+1.200000 2.300000+1.200000 2.400000+1.200000 2.500000+1.200000 2.600000+1.200000 2.700000+1.200000 2.800000+1.200000 2.900000+1.200000 3.000000+1.200000 3.100000+1.200000 3.200000+1.200000 3.300000+1.200000 3.400000+1.200000 3.500000+1.200000 3.600000+1.200000 3.700000+1.200000 3.800000+1.200000 3.900000+1.200000 4.000000+1.300000 -4.000000+1.300000 -3.900000+1.300000 -3.800000+1.300000 -3.700000+1.300000 -3.600000+1.300000 -3.500000+1.300000 -3.400000+1.300000 -3.300000+1.300000 -3.200000+1.300000 -3.100000+1.300000 -3.000000+1.300000 -2.900000+1.300000 -2.800000+1.300000 -2.700000+1.300000 -2.600000+1.300000 -2.500000+1.300000 -2.400000+1.300000 -2.300000+1.300000 -2.200000+1.300000 -2.100000+1.300000 -2.000000+1.300000 -1.900000+1.300000 -1.800000+1.300000 -1.700000+1.300000 -1.600000+1.300000 -1.500000+1.300000 -1.400000+1.300000 -1.300000+1.300000 -1.200000+1.300000 -1.100000+1.300000 -1.000000+1.300000 -0.900000+1.300000 -0.800000+1.300000 -0.700000+1.300000 -0.600000+1.300000 -0.500000+1.300000 -0.400000+1.300000 -0.300000+1.300000 -0.200000+1.300000 -0.100000+1.300000 0.000000+1.300000 0.100000+1.300000 0.200000+1.300000 0.300000+1.300000 0.400000+1.300000 0.500000+1.300000 0.600000+1.300000 0.700000+1.300000 0.800000+1.300000 0.900000+1.300000 1.000000+1.300000 1.100000+1.300000 1.200000+1.300000 1.300000+1.300000 1.400000+1.300000 1.500000+1.300000 1.600000+1.300000 1.700000+1.300000 1.800000+1.300000 1.900000+1.300000 2.000000+1.300000 2.100000+1.300000 2.200000+1.300000 2.300000+1.300000 2.400000+1.300000 2.500000+1.300000 2.600000+1.300000 2.700000+1.300000 2.800000+1.300000 2.900000+1.300000 3.000000+1.300000 3.100000+1.300000 3.200000+1.300000 3.300000+1.300000 3.400000+1.300000 3.500000+1.300000 3.600000+1.300000 3.700000+1.300000 3.800000+1.300000 3.900000+1.300000 4.000000+1.400000 -4.000000+1.400000 -3.900000+1.400000 -3.800000+1.400000 -3.700000+1.400000 -3.600000+1.400000 -3.500000+1.400000 -3.400000+1.400000 -3.300000+1.400000 -3.200000+1.400000 -3.100000+1.400000 -3.000000+1.400000 -2.900000+1.400000 -2.800000+1.400000 -2.700000+1.400000 -2.600000+1.400000 -2.500000+1.400000 -2.400000+1.400000 -2.300000+1.400000 -2.200000+1.400000 -2.100000+1.400000 -2.000000+1.400000 -1.900000+1.400000 -1.800000+1.400000 -1.700000+1.400000 -1.600000+1.400000 -1.500000+1.400000 -1.400000+1.400000 -1.300000+1.400000 -1.200000+1.400000 -1.100000+1.400000 -1.000000+1.400000 -0.900000+1.400000 -0.800000+1.400000 -0.700000+1.400000 -0.600000+1.400000 -0.500000+1.400000 -0.400000+1.400000 -0.300000+1.400000 -0.200000+1.400000 -0.100000+1.400000 0.000000+1.400000 0.100000+1.400000 0.200000+1.400000 0.300000+1.400000 0.400000+1.400000 0.500000+1.400000 0.600000+1.400000 0.700000+1.400000 0.800000+1.400000 0.900000+1.400000 1.000000+1.400000 1.100000+1.400000 1.200000+1.400000 1.300000+1.400000 1.400000+1.400000 1.500000+1.400000 1.600000+1.400000 1.700000+1.400000 1.800000+1.400000 1.900000+1.400000 2.000000+1.400000 2.100000+1.400000 2.200000+1.400000 2.300000+1.400000 2.400000+1.400000 2.500000+1.400000 2.600000+1.400000 2.700000+1.400000 2.800000+1.400000 2.900000+1.400000 3.000000+1.400000 3.100000+1.400000 3.200000+1.400000 3.300000+1.400000 3.400000+1.400000 3.500000+1.400000 3.600000+1.400000 3.700000+1.400000 3.800000+1.400000 3.900000+1.400000 4.000000+1.500000 -4.000000+1.500000 -3.900000+1.500000 -3.800000+1.500000 -3.700000+1.500000 -3.600000+1.500000 -3.500000+1.500000 -3.400000+1.500000 -3.300000+1.500000 -3.200000+1.500000 -3.100000+1.500000 -3.000000+1.500000 -2.900000+1.500000 -2.800000+1.500000 -2.700000+1.500000 -2.600000+1.500000 -2.500000+1.500000 -2.400000+1.500000 -2.300000+1.500000 -2.200000+1.500000 -2.100000+1.500000 -2.000000+1.500000 -1.900000+1.500000 -1.800000+1.500000 -1.700000+1.500000 -1.600000+1.500000 -1.500000+1.500000 -1.400000+1.500000 -1.300000+1.500000 -1.200000+1.500000 -1.100000+1.500000 -1.000000+1.500000 -0.900000+1.500000 -0.800000+1.500000 -0.700000+1.500000 -0.600000+1.500000 -0.500000+1.500000 -0.400000+1.500000 -0.300000+1.500000 -0.200000+1.500000 -0.100000+1.500000 0.000000+1.500000 0.100000+1.500000 0.200000+1.500000 0.300000+1.500000 0.400000+1.500000 0.500000+1.500000 0.600000+1.500000 0.700000+1.500000 0.800000+1.500000 0.900000+1.500000 1.000000+1.500000 1.100000+1.500000 1.200000+1.500000 1.300000+1.500000 1.400000+1.500000 1.500000+1.500000 1.600000+1.500000 1.700000+1.500000 1.800000+1.500000 1.900000+1.500000 2.000000+1.500000 2.100000+1.500000 2.200000+1.500000 2.300000+1.500000 2.400000+1.500000 2.500000+1.500000 2.600000+1.500000 2.700000+1.500000 2.800000+1.500000 2.900000+1.500000 3.000000+1.500000 3.100000+1.500000 3.200000+1.500000 3.300000+1.500000 3.400000+1.500000 3.500000+1.500000 3.600000+1.500000 3.700000+1.500000 3.800000+1.500000 3.900000+1.500000 4.000000+1.600000 -4.000000+1.600000 -3.900000+1.600000 -3.800000+1.600000 -3.700000+1.600000 -3.600000+1.600000 -3.500000+1.600000 -3.400000+1.600000 -3.300000+1.600000 -3.200000+1.600000 -3.100000+1.600000 -3.000000+1.600000 -2.900000+1.600000 -2.800000+1.600000 -2.700000+1.600000 -2.600000+1.600000 -2.500000+1.600000 -2.400000+1.600000 -2.300000+1.600000 -2.200000+1.600000 -2.100000+1.600000 -2.000000+1.600000 -1.900000+1.600000 -1.800000+1.600000 -1.700000+1.600000 -1.600000+1.600000 -1.500000+1.600000 -1.400000+1.600000 -1.300000+1.600000 -1.200000+1.600000 -1.100000+1.600000 -1.000000+1.600000 -0.900000+1.600000 -0.800000+1.600000 -0.700000+1.600000 -0.600000+1.600000 -0.500000+1.600000 -0.400000+1.600000 -0.300000+1.600000 -0.200000+1.600000 -0.100000+1.600000 0.000000+1.600000 0.100000+1.600000 0.200000+1.600000 0.300000+1.600000 0.400000+1.600000 0.500000+1.600000 0.600000+1.600000 0.700000+1.600000 0.800000+1.600000 0.900000+1.600000 1.000000+1.600000 1.100000+1.600000 1.200000+1.600000 1.300000+1.600000 1.400000+1.600000 1.500000+1.600000 1.600000+1.600000 1.700000+1.600000 1.800000+1.600000 1.900000+1.600000 2.000000+1.600000 2.100000+1.600000 2.200000+1.600000 2.300000+1.600000 2.400000+1.600000 2.500000+1.600000 2.600000+1.600000 2.700000+1.600000 2.800000+1.600000 2.900000+1.600000 3.000000+1.600000 3.100000+1.600000 3.200000+1.600000 3.300000+1.600000 3.400000+1.600000 3.500000+1.600000 3.600000+1.600000 3.700000+1.600000 3.800000+1.600000 3.900000+1.600000 4.000000+1.700000 -4.000000+1.700000 -3.900000+1.700000 -3.800000+1.700000 -3.700000+1.700000 -3.600000+1.700000 -3.500000+1.700000 -3.400000+1.700000 -3.300000+1.700000 -3.200000+1.700000 -3.100000+1.700000 -3.000000+1.700000 -2.900000+1.700000 -2.800000+1.700000 -2.700000+1.700000 -2.600000+1.700000 -2.500000+1.700000 -2.400000+1.700000 -2.300000+1.700000 -2.200000+1.700000 -2.100000+1.700000 -2.000000+1.700000 -1.900000+1.700000 -1.800000+1.700000 -1.700000+1.700000 -1.600000+1.700000 -1.500000+1.700000 -1.400000+1.700000 -1.300000+1.700000 -1.200000+1.700000 -1.100000+1.700000 -1.000000+1.700000 -0.900000+1.700000 -0.800000+1.700000 -0.700000+1.700000 -0.600000+1.700000 -0.500000+1.700000 -0.400000+1.700000 -0.300000+1.700000 -0.200000+1.700000 -0.100000+1.700000 0.000000+1.700000 0.100000+1.700000 0.200000+1.700000 0.300000+1.700000 0.400000+1.700000 0.500000+1.700000 0.600000+1.700000 0.700000+1.700000 0.800000+1.700000 0.900000+1.700000 1.000000+1.700000 1.100000+1.700000 1.200000+1.700000 1.300000+1.700000 1.400000+1.700000 1.500000+1.700000 1.600000+1.700000 1.700000+1.700000 1.800000+1.700000 1.900000+1.700000 2.000000+1.700000 2.100000+1.700000 2.200000+1.700000 2.300000+1.700000 2.400000+1.700000 2.500000+1.700000 2.600000+1.700000 2.700000+1.700000 2.800000+1.700000 2.900000+1.700000 3.000000+1.700000 3.100000+1.700000 3.200000+1.700000 3.300000+1.700000 3.400000+1.700000 3.500000+1.700000 3.600000+1.700000 3.700000+1.700000 3.800000+1.700000 3.900000+1.700000 4.000000+1.800000 -4.000000+1.800000 -3.900000+1.800000 -3.800000+1.800000 -3.700000+1.800000 -3.600000+1.800000 -3.500000+1.800000 -3.400000+1.800000 -3.300000+1.800000 -3.200000+1.800000 -3.100000+1.800000 -3.000000+1.800000 -2.900000+1.800000 -2.800000+1.800000 -2.700000+1.800000 -2.600000+1.800000 -2.500000+1.800000 -2.400000+1.800000 -2.300000+1.800000 -2.200000+1.800000 -2.100000+1.800000 -2.000000+1.800000 -1.900000+1.800000 -1.800000+1.800000 -1.700000+1.800000 -1.600000+1.800000 -1.500000+1.800000 -1.400000+1.800000 -1.300000+1.800000 -1.200000+1.800000 -1.100000+1.800000 -1.000000+1.800000 -0.900000+1.800000 -0.800000+1.800000 -0.700000+1.800000 -0.600000+1.800000 -0.500000+1.800000 -0.400000+1.800000 -0.300000+1.800000 -0.200000+1.800000 -0.100000+1.800000 0.000000+1.800000 0.100000+1.800000 0.200000+1.800000 0.300000+1.800000 0.400000+1.800000 0.500000+1.800000 0.600000+1.800000 0.700000+1.800000 0.800000+1.800000 0.900000+1.800000 1.000000+1.800000 1.100000+1.800000 1.200000+1.800000 1.300000+1.800000 1.400000+1.800000 1.500000+1.800000 1.600000+1.800000 1.700000+1.800000 1.800000+1.800000 1.900000+1.800000 2.000000+1.800000 2.100000+1.800000 2.200000+1.800000 2.300000+1.800000 2.400000+1.800000 2.500000+1.800000 2.600000+1.800000 2.700000+1.800000 2.800000+1.800000 2.900000+1.800000 3.000000+1.800000 3.100000+1.800000 3.200000+1.800000 3.300000+1.800000 3.400000+1.800000 3.500000+1.800000 3.600000+1.800000 3.700000+1.800000 3.800000+1.800000 3.900000+1.800000 4.000000+1.900000 -4.000000+1.900000 -3.900000+1.900000 -3.800000+1.900000 -3.700000+1.900000 -3.600000+1.900000 -3.500000+1.900000 -3.400000+1.900000 -3.300000+1.900000 -3.200000+1.900000 -3.100000+1.900000 -3.000000+1.900000 -2.900000+1.900000 -2.800000+1.900000 -2.700000+1.900000 -2.600000+1.900000 -2.500000+1.900000 -2.400000+1.900000 -2.300000+1.900000 -2.200000+1.900000 -2.100000+1.900000 -2.000000+1.900000 -1.900000+1.900000 -1.800000+1.900000 -1.700000+1.900000 -1.600000+1.900000 -1.500000+1.900000 -1.400000+1.900000 -1.300000+1.900000 -1.200000+1.900000 -1.100000+1.900000 -1.000000+1.900000 -0.900000+1.900000 -0.800000+1.900000 -0.700000+1.900000 -0.600000+1.900000 -0.500000+1.900000 -0.400000+1.900000 -0.300000+1.900000 -0.200000+1.900000 -0.100000+1.900000 0.000000+1.900000 0.100000+1.900000 0.200000+1.900000 0.300000+1.900000 0.400000+1.900000 0.500000+1.900000 0.600000+1.900000 0.700000+1.900000 0.800000+1.900000 0.900000+1.900000 1.000000+1.900000 1.100000+1.900000 1.200000+1.900000 1.300000+1.900000 1.400000+1.900000 1.500000+1.900000 1.600000+1.900000 1.700000+1.900000 1.800000+1.900000 1.900000+1.900000 2.000000+1.900000 2.100000+1.900000 2.200000+1.900000 2.300000+1.900000 2.400000+1.900000 2.500000+1.900000 2.600000+1.900000 2.700000+1.900000 2.800000+1.900000 2.900000+1.900000 3.000000+1.900000 3.100000+1.900000 3.200000+1.900000 3.300000+1.900000 3.400000+1.900000 3.500000+1.900000 3.600000+1.900000 3.700000+1.900000 3.800000+1.900000 3.900000+1.900000 4.000000+2.000000 -4.000000+2.000000 -3.900000+2.000000 -3.800000+2.000000 -3.700000+2.000000 -3.600000+2.000000 -3.500000+2.000000 -3.400000+2.000000 -3.300000+2.000000 -3.200000+2.000000 -3.100000+2.000000 -3.000000+2.000000 -2.900000+2.000000 -2.800000+2.000000 -2.700000+2.000000 -2.600000+2.000000 -2.500000+2.000000 -2.400000+2.000000 -2.300000+2.000000 -2.200000+2.000000 -2.100000+2.000000 -2.000000+2.000000 -1.900000+2.000000 -1.800000+2.000000 -1.700000+2.000000 -1.600000+2.000000 -1.500000+2.000000 -1.400000+2.000000 -1.300000+2.000000 -1.200000+2.000000 -1.100000+2.000000 -1.000000+2.000000 -0.900000+2.000000 -0.800000+2.000000 -0.700000+2.000000 -0.600000+2.000000 -0.500000+2.000000 -0.400000+2.000000 -0.300000+2.000000 -0.200000+2.000000 -0.100000+2.000000 0.000000+2.000000 0.100000+2.000000 0.200000+2.000000 0.300000+2.000000 0.400000+2.000000 0.500000+2.000000 0.600000+2.000000 0.700000+2.000000 0.800000+2.000000 0.900000+2.000000 1.000000+2.000000 1.100000+2.000000 1.200000+2.000000 1.300000+2.000000 1.400000+2.000000 1.500000+2.000000 1.600000+2.000000 1.700000+2.000000 1.800000+2.000000 1.900000+2.000000 2.000000+2.000000 2.100000+2.000000 2.200000+2.000000 2.300000+2.000000 2.400000+2.000000 2.500000+2.000000 2.600000+2.000000 2.700000+2.000000 2.800000+2.000000 2.900000+2.000000 3.000000+2.000000 3.100000+2.000000 3.200000+2.000000 3.300000+2.000000 3.400000+2.000000 3.500000+2.000000 3.600000+2.000000 3.700000+2.000000 3.800000+2.000000 3.900000+2.000000 4.000000+2.100000 -4.000000+2.100000 -3.900000+2.100000 -3.800000+2.100000 -3.700000+2.100000 -3.600000+2.100000 -3.500000+2.100000 -3.400000+2.100000 -3.300000+2.100000 -3.200000+2.100000 -3.100000+2.100000 -3.000000+2.100000 -2.900000+2.100000 -2.800000+2.100000 -2.700000+2.100000 -2.600000+2.100000 -2.500000+2.100000 -2.400000+2.100000 -2.300000+2.100000 -2.200000+2.100000 -2.100000+2.100000 -2.000000+2.100000 -1.900000+2.100000 -1.800000+2.100000 -1.700000+2.100000 -1.600000+2.100000 -1.500000+2.100000 -1.400000+2.100000 -1.300000+2.100000 -1.200000+2.100000 -1.100000+2.100000 -1.000000+2.100000 -0.900000+2.100000 -0.800000+2.100000 -0.700000+2.100000 -0.600000+2.100000 -0.500000+2.100000 -0.400000+2.100000 -0.300000+2.100000 -0.200000+2.100000 -0.100000+2.100000 0.000000+2.100000 0.100000+2.100000 0.200000+2.100000 0.300000+2.100000 0.400000+2.100000 0.500000+2.100000 0.600000+2.100000 0.700000+2.100000 0.800000+2.100000 0.900000+2.100000 1.000000+2.100000 1.100000+2.100000 1.200000+2.100000 1.300000+2.100000 1.400000+2.100000 1.500000+2.100000 1.600000+2.100000 1.700000+2.100000 1.800000+2.100000 1.900000+2.100000 2.000000+2.100000 2.100000+2.100000 2.200000+2.100000 2.300000+2.100000 2.400000+2.100000 2.500000+2.100000 2.600000+2.100000 2.700000+2.100000 2.800000+2.100000 2.900000+2.100000 3.000000+2.100000 3.100000+2.100000 3.200000+2.100000 3.300000+2.100000 3.400000+2.100000 3.500000+2.100000 3.600000+2.100000 3.700000+2.100000 3.800000+2.100000 3.900000+2.100000 4.000000+2.200000 -4.000000+2.200000 -3.900000+2.200000 -3.800000+2.200000 -3.700000+2.200000 -3.600000+2.200000 -3.500000+2.200000 -3.400000+2.200000 -3.300000+2.200000 -3.200000+2.200000 -3.100000+2.200000 -3.000000+2.200000 -2.900000+2.200000 -2.800000+2.200000 -2.700000+2.200000 -2.600000+2.200000 -2.500000+2.200000 -2.400000+2.200000 -2.300000+2.200000 -2.200000+2.200000 -2.100000+2.200000 -2.000000+2.200000 -1.900000+2.200000 -1.800000+2.200000 -1.700000+2.200000 -1.600000+2.200000 -1.500000+2.200000 -1.400000+2.200000 -1.300000+2.200000 -1.200000+2.200000 -1.100000+2.200000 -1.000000+2.200000 -0.900000+2.200000 -0.800000+2.200000 -0.700000+2.200000 -0.600000+2.200000 -0.500000+2.200000 -0.400000+2.200000 -0.300000+2.200000 -0.200000+2.200000 -0.100000+2.200000 0.000000+2.200000 0.100000+2.200000 0.200000+2.200000 0.300000+2.200000 0.400000+2.200000 0.500000+2.200000 0.600000+2.200000 0.700000+2.200000 0.800000+2.200000 0.900000+2.200000 1.000000+2.200000 1.100000+2.200000 1.200000+2.200000 1.300000+2.200000 1.400000+2.200000 1.500000+2.200000 1.600000+2.200000 1.700000+2.200000 1.800000+2.200000 1.900000+2.200000 2.000000+2.200000 2.100000+2.200000 2.200000+2.200000 2.300000+2.200000 2.400000+2.200000 2.500000+2.200000 2.600000+2.200000 2.700000+2.200000 2.800000+2.200000 2.900000+2.200000 3.000000+2.200000 3.100000+2.200000 3.200000+2.200000 3.300000+2.200000 3.400000+2.200000 3.500000+2.200000 3.600000+2.200000 3.700000+2.200000 3.800000+2.200000 3.900000+2.200000 4.000000+2.300000 -4.000000+2.300000 -3.900000+2.300000 -3.800000+2.300000 -3.700000+2.300000 -3.600000+2.300000 -3.500000+2.300000 -3.400000+2.300000 -3.300000+2.300000 -3.200000+2.300000 -3.100000+2.300000 -3.000000+2.300000 -2.900000+2.300000 -2.800000+2.300000 -2.700000+2.300000 -2.600000+2.300000 -2.500000+2.300000 -2.400000+2.300000 -2.300000+2.300000 -2.200000+2.300000 -2.100000+2.300000 -2.000000+2.300000 -1.900000+2.300000 -1.800000+2.300000 -1.700000+2.300000 -1.600000+2.300000 -1.500000+2.300000 -1.400000+2.300000 -1.300000+2.300000 -1.200000+2.300000 -1.100000+2.300000 -1.000000+2.300000 -0.900000+2.300000 -0.800000+2.300000 -0.700000+2.300000 -0.600000+2.300000 -0.500000+2.300000 -0.400000+2.300000 -0.300000+2.300000 -0.200000+2.300000 -0.100000+2.300000 0.000000+2.300000 0.100000+2.300000 0.200000+2.300000 0.300000+2.300000 0.400000+2.300000 0.500000+2.300000 0.600000+2.300000 0.700000+2.300000 0.800000+2.300000 0.900000+2.300000 1.000000+2.300000 1.100000+2.300000 1.200000+2.300000 1.300000+2.300000 1.400000+2.300000 1.500000+2.300000 1.600000+2.300000 1.700000+2.300000 1.800000+2.300000 1.900000+2.300000 2.000000+2.300000 2.100000+2.300000 2.200000+2.300000 2.300000+2.300000 2.400000+2.300000 2.500000+2.300000 2.600000+2.300000 2.700000+2.300000 2.800000+2.300000 2.900000+2.300000 3.000000+2.300000 3.100000+2.300000 3.200000+2.300000 3.300000+2.300000 3.400000+2.300000 3.500000+2.300000 3.600000+2.300000 3.700000+2.300000 3.800000+2.300000 3.900000+2.300000 4.000000+2.400000 -4.000000+2.400000 -3.900000+2.400000 -3.800000+2.400000 -3.700000+2.400000 -3.600000+2.400000 -3.500000+2.400000 -3.400000+2.400000 -3.300000+2.400000 -3.200000+2.400000 -3.100000+2.400000 -3.000000+2.400000 -2.900000+2.400000 -2.800000+2.400000 -2.700000+2.400000 -2.600000+2.400000 -2.500000+2.400000 -2.400000+2.400000 -2.300000+2.400000 -2.200000+2.400000 -2.100000+2.400000 -2.000000+2.400000 -1.900000+2.400000 -1.800000+2.400000 -1.700000+2.400000 -1.600000+2.400000 -1.500000+2.400000 -1.400000+2.400000 -1.300000+2.400000 -1.200000+2.400000 -1.100000+2.400000 -1.000000+2.400000 -0.900000+2.400000 -0.800000+2.400000 -0.700000+2.400000 -0.600000+2.400000 -0.500000+2.400000 -0.400000+2.400000 -0.300000+2.400000 -0.200000+2.400000 -0.100000+2.400000 0.000000+2.400000 0.100000+2.400000 0.200000+2.400000 0.300000+2.400000 0.400000+2.400000 0.500000+2.400000 0.600000+2.400000 0.700000+2.400000 0.800000+2.400000 0.900000+2.400000 1.000000+2.400000 1.100000+2.400000 1.200000+2.400000 1.300000+2.400000 1.400000+2.400000 1.500000+2.400000 1.600000+2.400000 1.700000+2.400000 1.800000+2.400000 1.900000+2.400000 2.000000+2.400000 2.100000+2.400000 2.200000+2.400000 2.300000+2.400000 2.400000+2.400000 2.500000+2.400000 2.600000+2.400000 2.700000+2.400000 2.800000+2.400000 2.900000+2.400000 3.000000+2.400000 3.100000+2.400000 3.200000+2.400000 3.300000+2.400000 3.400000+2.400000 3.500000+2.400000 3.600000+2.400000 3.700000+2.400000 3.800000+2.400000 3.900000+2.400000 4.000000+2.500000 -4.000000+2.500000 -3.900000+2.500000 -3.800000+2.500000 -3.700000+2.500000 -3.600000+2.500000 -3.500000+2.500000 -3.400000+2.500000 -3.300000+2.500000 -3.200000+2.500000 -3.100000+2.500000 -3.000000+2.500000 -2.900000+2.500000 -2.800000+2.500000 -2.700000+2.500000 -2.600000+2.500000 -2.500000+2.500000 -2.400000+2.500000 -2.300000+2.500000 -2.200000+2.500000 -2.100000+2.500000 -2.000000+2.500000 -1.900000+2.500000 -1.800000+2.500000 -1.700000+2.500000 -1.600000+2.500000 -1.500000+2.500000 -1.400000+2.500000 -1.300000+2.500000 -1.200000+2.500000 -1.100000+2.500000 -1.000000+2.500000 -0.900000+2.500000 -0.800000+2.500000 -0.700000+2.500000 -0.600000+2.500000 -0.500000+2.500000 -0.400000+2.500000 -0.300000+2.500000 -0.200000+2.500000 -0.100000+2.500000 0.000000+2.500000 0.100000+2.500000 0.200000+2.500000 0.300000+2.500000 0.400000+2.500000 0.500000+2.500000 0.600000+2.500000 0.700000+2.500000 0.800000+2.500000 0.900000+2.500000 1.000000+2.500000 1.100000+2.500000 1.200000+2.500000 1.300000+2.500000 1.400000+2.500000 1.500000+2.500000 1.600000+2.500000 1.700000+2.500000 1.800000+2.500000 1.900000+2.500000 2.000000+2.500000 2.100000+2.500000 2.200000+2.500000 2.300000+2.500000 2.400000+2.500000 2.500000+2.500000 2.600000+2.500000 2.700000+2.500000 2.800000+2.500000 2.900000+2.500000 3.000000+2.500000 3.100000+2.500000 3.200000+2.500000 3.300000+2.500000 3.400000+2.500000 3.500000+2.500000 3.600000+2.500000 3.700000+2.500000 3.800000+2.500000 3.900000+2.500000 4.000000+2.600000 -4.000000+2.600000 -3.900000+2.600000 -3.800000+2.600000 -3.700000+2.600000 -3.600000+2.600000 -3.500000+2.600000 -3.400000+2.600000 -3.300000+2.600000 -3.200000+2.600000 -3.100000+2.600000 -3.000000+2.600000 -2.900000+2.600000 -2.800000+2.600000 -2.700000+2.600000 -2.600000+2.600000 -2.500000+2.600000 -2.400000+2.600000 -2.300000+2.600000 -2.200000+2.600000 -2.100000+2.600000 -2.000000+2.600000 -1.900000+2.600000 -1.800000+2.600000 -1.700000+2.600000 -1.600000+2.600000 -1.500000+2.600000 -1.400000+2.600000 -1.300000+2.600000 -1.200000+2.600000 -1.100000+2.600000 -1.000000+2.600000 -0.900000+2.600000 -0.800000+2.600000 -0.700000+2.600000 -0.600000+2.600000 -0.500000+2.600000 -0.400000+2.600000 -0.300000+2.600000 -0.200000+2.600000 -0.100000+2.600000 0.000000+2.600000 0.100000+2.600000 0.200000+2.600000 0.300000+2.600000 0.400000+2.600000 0.500000+2.600000 0.600000+2.600000 0.700000+2.600000 0.800000+2.600000 0.900000+2.600000 1.000000+2.600000 1.100000+2.600000 1.200000+2.600000 1.300000+2.600000 1.400000+2.600000 1.500000+2.600000 1.600000+2.600000 1.700000+2.600000 1.800000+2.600000 1.900000+2.600000 2.000000+2.600000 2.100000+2.600000 2.200000+2.600000 2.300000+2.600000 2.400000+2.600000 2.500000+2.600000 2.600000+2.600000 2.700000+2.600000 2.800000+2.600000 2.900000+2.600000 3.000000+2.600000 3.100000+2.600000 3.200000+2.600000 3.300000+2.600000 3.400000+2.600000 3.500000+2.600000 3.600000+2.600000 3.700000+2.600000 3.800000+2.600000 3.900000+2.600000 4.000000+2.700000 -4.000000+2.700000 -3.900000+2.700000 -3.800000+2.700000 -3.700000+2.700000 -3.600000+2.700000 -3.500000+2.700000 -3.400000+2.700000 -3.300000+2.700000 -3.200000+2.700000 -3.100000+2.700000 -3.000000+2.700000 -2.900000+2.700000 -2.800000+2.700000 -2.700000+2.700000 -2.600000+2.700000 -2.500000+2.700000 -2.400000+2.700000 -2.300000+2.700000 -2.200000+2.700000 -2.100000+2.700000 -2.000000+2.700000 -1.900000+2.700000 -1.800000+2.700000 -1.700000+2.700000 -1.600000+2.700000 -1.500000+2.700000 -1.400000+2.700000 -1.300000+2.700000 -1.200000+2.700000 -1.100000+2.700000 -1.000000+2.700000 -0.900000+2.700000 -0.800000+2.700000 -0.700000+2.700000 -0.600000+2.700000 -0.500000+2.700000 -0.400000+2.700000 -0.300000+2.700000 -0.200000+2.700000 -0.100000+2.700000 0.000000+2.700000 0.100000+2.700000 0.200000+2.700000 0.300000+2.700000 0.400000+2.700000 0.500000+2.700000 0.600000+2.700000 0.700000+2.700000 0.800000+2.700000 0.900000+2.700000 1.000000+2.700000 1.100000+2.700000 1.200000+2.700000 1.300000+2.700000 1.400000+2.700000 1.500000+2.700000 1.600000+2.700000 1.700000+2.700000 1.800000+2.700000 1.900000+2.700000 2.000000+2.700000 2.100000+2.700000 2.200000+2.700000 2.300000+2.700000 2.400000+2.700000 2.500000+2.700000 2.600000+2.700000 2.700000+2.700000 2.800000+2.700000 2.900000+2.700000 3.000000+2.700000 3.100000+2.700000 3.200000+2.700000 3.300000+2.700000 3.400000+2.700000 3.500000+2.700000 3.600000+2.700000 3.700000+2.700000 3.800000+2.700000 3.900000+2.700000 4.000000+2.800000 -4.000000+2.800000 -3.900000+2.800000 -3.800000+2.800000 -3.700000+2.800000 -3.600000+2.800000 -3.500000+2.800000 -3.400000+2.800000 -3.300000+2.800000 -3.200000+2.800000 -3.100000+2.800000 -3.000000+2.800000 -2.900000+2.800000 -2.800000+2.800000 -2.700000+2.800000 -2.600000+2.800000 -2.500000+2.800000 -2.400000+2.800000 -2.300000+2.800000 -2.200000+2.800000 -2.100000+2.800000 -2.000000+2.800000 -1.900000+2.800000 -1.800000+2.800000 -1.700000+2.800000 -1.600000+2.800000 -1.500000+2.800000 -1.400000+2.800000 -1.300000+2.800000 -1.200000+2.800000 -1.100000+2.800000 -1.000000+2.800000 -0.900000+2.800000 -0.800000+2.800000 -0.700000+2.800000 -0.600000+2.800000 -0.500000+2.800000 -0.400000+2.800000 -0.300000+2.800000 -0.200000+2.800000 -0.100000+2.800000 0.000000+2.800000 0.100000+2.800000 0.200000+2.800000 0.300000+2.800000 0.400000+2.800000 0.500000+2.800000 0.600000+2.800000 0.700000+2.800000 0.800000+2.800000 0.900000+2.800000 1.000000+2.800000 1.100000+2.800000 1.200000+2.800000 1.300000+2.800000 1.400000+2.800000 1.500000+2.800000 1.600000+2.800000 1.700000+2.800000 1.800000+2.800000 1.900000+2.800000 2.000000+2.800000 2.100000+2.800000 2.200000+2.800000 2.300000+2.800000 2.400000+2.800000 2.500000+2.800000 2.600000+2.800000 2.700000+2.800000 2.800000+2.800000 2.900000+2.800000 3.000000+2.800000 3.100000+2.800000 3.200000+2.800000 3.300000+2.800000 3.400000+2.800000 3.500000+2.800000 3.600000+2.800000 3.700000+2.800000 3.800000+2.800000 3.900000+2.800000 4.000000+2.900000 -4.000000+2.900000 -3.900000+2.900000 -3.800000+2.900000 -3.700000+2.900000 -3.600000+2.900000 -3.500000+2.900000 -3.400000+2.900000 -3.300000+2.900000 -3.200000+2.900000 -3.100000+2.900000 -3.000000+2.900000 -2.900000+2.900000 -2.800000+2.900000 -2.700000+2.900000 -2.600000+2.900000 -2.500000+2.900000 -2.400000+2.900000 -2.300000+2.900000 -2.200000+2.900000 -2.100000+2.900000 -2.000000+2.900000 -1.900000+2.900000 -1.800000+2.900000 -1.700000+2.900000 -1.600000+2.900000 -1.500000+2.900000 -1.400000+2.900000 -1.300000+2.900000 -1.200000+2.900000 -1.100000+2.900000 -1.000000+2.900000 -0.900000+2.900000 -0.800000+2.900000 -0.700000+2.900000 -0.600000+2.900000 -0.500000+2.900000 -0.400000+2.900000 -0.300000+2.900000 -0.200000+2.900000 -0.100000+2.900000 0.000000+2.900000 0.100000+2.900000 0.200000+2.900000 0.300000+2.900000 0.400000+2.900000 0.500000+2.900000 0.600000+2.900000 0.700000+2.900000 0.800000+2.900000 0.900000+2.900000 1.000000+2.900000 1.100000+2.900000 1.200000+2.900000 1.300000+2.900000 1.400000+2.900000 1.500000+2.900000 1.600000+2.900000 1.700000+2.900000 1.800000+2.900000 1.900000+2.900000 2.000000+2.900000 2.100000+2.900000 2.200000+2.900000 2.300000+2.900000 2.400000+2.900000 2.500000+2.900000 2.600000+2.900000 2.700000+2.900000 2.800000+2.900000 2.900000+2.900000 3.000000+2.900000 3.100000+2.900000 3.200000+2.900000 3.300000+2.900000 3.400000+2.900000 3.500000+2.900000 3.600000+2.900000 3.700000+2.900000 3.800000+2.900000 3.900000+2.900000 4.000000+3.000000 -4.000000+3.000000 -3.900000+3.000000 -3.800000+3.000000 -3.700000+3.000000 -3.600000+3.000000 -3.500000+3.000000 -3.400000+3.000000 -3.300000+3.000000 -3.200000+3.000000 -3.100000+3.000000 -3.000000+3.000000 -2.900000+3.000000 -2.800000+3.000000 -2.700000+3.000000 -2.600000+3.000000 -2.500000+3.000000 -2.400000+3.000000 -2.300000+3.000000 -2.200000+3.000000 -2.100000+3.000000 -2.000000+3.000000 -1.900000+3.000000 -1.800000+3.000000 -1.700000+3.000000 -1.600000+3.000000 -1.500000+3.000000 -1.400000+3.000000 -1.300000+3.000000 -1.200000+3.000000 -1.100000+3.000000 -1.000000+3.000000 -0.900000+3.000000 -0.800000+3.000000 -0.700000+3.000000 -0.600000+3.000000 -0.500000+3.000000 -0.400000+3.000000 -0.300000+3.000000 -0.200000+3.000000 -0.100000+3.000000 0.000000+3.000000 0.100000+3.000000 0.200000+3.000000 0.300000+3.000000 0.400000+3.000000 0.500000+3.000000 0.600000+3.000000 0.700000+3.000000 0.800000+3.000000 0.900000+3.000000 1.000000+3.000000 1.100000+3.000000 1.200000+3.000000 1.300000+3.000000 1.400000+3.000000 1.500000+3.000000 1.600000+3.000000 1.700000+3.000000 1.800000+3.000000 1.900000+3.000000 2.000000+3.000000 2.100000+3.000000 2.200000+3.000000 2.300000+3.000000 2.400000+3.000000 2.500000+3.000000 2.600000+3.000000 2.700000+3.000000 2.800000+3.000000 2.900000+3.000000 3.000000+3.000000 3.100000+3.000000 3.200000+3.000000 3.300000+3.000000 3.400000+3.000000 3.500000+3.000000 3.600000+3.000000 3.700000+3.000000 3.800000+3.000000 3.900000+3.000000 4.000000+3.100000 -4.000000+3.100000 -3.900000+3.100000 -3.800000+3.100000 -3.700000+3.100000 -3.600000+3.100000 -3.500000+3.100000 -3.400000+3.100000 -3.300000+3.100000 -3.200000+3.100000 -3.100000+3.100000 -3.000000+3.100000 -2.900000+3.100000 -2.800000+3.100000 -2.700000+3.100000 -2.600000+3.100000 -2.500000+3.100000 -2.400000+3.100000 -2.300000+3.100000 -2.200000+3.100000 -2.100000+3.100000 -2.000000+3.100000 -1.900000+3.100000 -1.800000+3.100000 -1.700000+3.100000 -1.600000+3.100000 -1.500000+3.100000 -1.400000+3.100000 -1.300000+3.100000 -1.200000+3.100000 -1.100000+3.100000 -1.000000+3.100000 -0.900000+3.100000 -0.800000+3.100000 -0.700000+3.100000 -0.600000+3.100000 -0.500000+3.100000 -0.400000+3.100000 -0.300000+3.100000 -0.200000+3.100000 -0.100000+3.100000 0.000000+3.100000 0.100000+3.100000 0.200000+3.100000 0.300000+3.100000 0.400000+3.100000 0.500000+3.100000 0.600000+3.100000 0.700000+3.100000 0.800000+3.100000 0.900000+3.100000 1.000000+3.100000 1.100000+3.100000 1.200000+3.100000 1.300000+3.100000 1.400000+3.100000 1.500000+3.100000 1.600000+3.100000 1.700000+3.100000 1.800000+3.100000 1.900000+3.100000 2.000000+3.100000 2.100000+3.100000 2.200000+3.100000 2.300000+3.100000 2.400000+3.100000 2.500000+3.100000 2.600000+3.100000 2.700000+3.100000 2.800000+3.100000 2.900000+3.100000 3.000000+3.100000 3.100000+3.100000 3.200000+3.100000 3.300000+3.100000 3.400000+3.100000 3.500000+3.100000 3.600000+3.100000 3.700000+3.100000 3.800000+3.100000 3.900000+3.100000 4.000000+3.200000 -4.000000+3.200000 -3.900000+3.200000 -3.800000+3.200000 -3.700000+3.200000 -3.600000+3.200000 -3.500000+3.200000 -3.400000+3.200000 -3.300000+3.200000 -3.200000+3.200000 -3.100000+3.200000 -3.000000+3.200000 -2.900000+3.200000 -2.800000+3.200000 -2.700000+3.200000 -2.600000+3.200000 -2.500000+3.200000 -2.400000+3.200000 -2.300000+3.200000 -2.200000+3.200000 -2.100000+3.200000 -2.000000+3.200000 -1.900000+3.200000 -1.800000+3.200000 -1.700000+3.200000 -1.600000+3.200000 -1.500000+3.200000 -1.400000+3.200000 -1.300000+3.200000 -1.200000+3.200000 -1.100000+3.200000 -1.000000+3.200000 -0.900000+3.200000 -0.800000+3.200000 -0.700000+3.200000 -0.600000+3.200000 -0.500000+3.200000 -0.400000+3.200000 -0.300000+3.200000 -0.200000+3.200000 -0.100000+3.200000 0.000000+3.200000 0.100000+3.200000 0.200000+3.200000 0.300000+3.200000 0.400000+3.200000 0.500000+3.200000 0.600000+3.200000 0.700000+3.200000 0.800000+3.200000 0.900000+3.200000 1.000000+3.200000 1.100000+3.200000 1.200000+3.200000 1.300000+3.200000 1.400000+3.200000 1.500000+3.200000 1.600000+3.200000 1.700000+3.200000 1.800000+3.200000 1.900000+3.200000 2.000000+3.200000 2.100000+3.200000 2.200000+3.200000 2.300000+3.200000 2.400000+3.200000 2.500000+3.200000 2.600000+3.200000 2.700000+3.200000 2.800000+3.200000 2.900000+3.200000 3.000000+3.200000 3.100000+3.200000 3.200000+3.200000 3.300000+3.200000 3.400000+3.200000 3.500000+3.200000 3.600000+3.200000 3.700000+3.200000 3.800000+3.200000 3.900000+3.200000 4.000000+3.300000 -4.000000+3.300000 -3.900000+3.300000 -3.800000+3.300000 -3.700000+3.300000 -3.600000+3.300000 -3.500000+3.300000 -3.400000+3.300000 -3.300000+3.300000 -3.200000+3.300000 -3.100000+3.300000 -3.000000+3.300000 -2.900000+3.300000 -2.800000+3.300000 -2.700000+3.300000 -2.600000+3.300000 -2.500000+3.300000 -2.400000+3.300000 -2.300000+3.300000 -2.200000+3.300000 -2.100000+3.300000 -2.000000+3.300000 -1.900000+3.300000 -1.800000+3.300000 -1.700000+3.300000 -1.600000+3.300000 -1.500000+3.300000 -1.400000+3.300000 -1.300000+3.300000 -1.200000+3.300000 -1.100000+3.300000 -1.000000+3.300000 -0.900000+3.300000 -0.800000+3.300000 -0.700000+3.300000 -0.600000+3.300000 -0.500000+3.300000 -0.400000+3.300000 -0.300000+3.300000 -0.200000+3.300000 -0.100000+3.300000 0.000000+3.300000 0.100000+3.300000 0.200000+3.300000 0.300000+3.300000 0.400000+3.300000 0.500000+3.300000 0.600000+3.300000 0.700000+3.300000 0.800000+3.300000 0.900000+3.300000 1.000000+3.300000 1.100000+3.300000 1.200000+3.300000 1.300000+3.300000 1.400000+3.300000 1.500000+3.300000 1.600000+3.300000 1.700000+3.300000 1.800000+3.300000 1.900000+3.300000 2.000000+3.300000 2.100000+3.300000 2.200000+3.300000 2.300000+3.300000 2.400000+3.300000 2.500000+3.300000 2.600000+3.300000 2.700000+3.300000 2.800000+3.300000 2.900000+3.300000 3.000000+3.300000 3.100000+3.300000 3.200000+3.300000 3.300000+3.300000 3.400000+3.300000 3.500000+3.300000 3.600000+3.300000 3.700000+3.300000 3.800000+3.300000 3.900000+3.300000 4.000000+3.400000 -4.000000+3.400000 -3.900000+3.400000 -3.800000+3.400000 -3.700000+3.400000 -3.600000+3.400000 -3.500000+3.400000 -3.400000+3.400000 -3.300000+3.400000 -3.200000+3.400000 -3.100000+3.400000 -3.000000+3.400000 -2.900000+3.400000 -2.800000+3.400000 -2.700000+3.400000 -2.600000+3.400000 -2.500000+3.400000 -2.400000+3.400000 -2.300000+3.400000 -2.200000+3.400000 -2.100000+3.400000 -2.000000+3.400000 -1.900000+3.400000 -1.800000+3.400000 -1.700000+3.400000 -1.600000+3.400000 -1.500000+3.400000 -1.400000+3.400000 -1.300000+3.400000 -1.200000+3.400000 -1.100000+3.400000 -1.000000+3.400000 -0.900000+3.400000 -0.800000+3.400000 -0.700000+3.400000 -0.600000+3.400000 -0.500000+3.400000 -0.400000+3.400000 -0.300000+3.400000 -0.200000+3.400000 -0.100000+3.400000 0.000000+3.400000 0.100000+3.400000 0.200000+3.400000 0.300000+3.400000 0.400000+3.400000 0.500000+3.400000 0.600000+3.400000 0.700000+3.400000 0.800000+3.400000 0.900000+3.400000 1.000000+3.400000 1.100000+3.400000 1.200000+3.400000 1.300000+3.400000 1.400000+3.400000 1.500000+3.400000 1.600000+3.400000 1.700000+3.400000 1.800000+3.400000 1.900000+3.400000 2.000000+3.400000 2.100000+3.400000 2.200000+3.400000 2.300000+3.400000 2.400000+3.400000 2.500000+3.400000 2.600000+3.400000 2.700000+3.400000 2.800000+3.400000 2.900000+3.400000 3.000000+3.400000 3.100000+3.400000 3.200000+3.400000 3.300000+3.400000 3.400000+3.400000 3.500000+3.400000 3.600000+3.400000 3.700000+3.400000 3.800000+3.400000 3.900000+3.400000 4.000000+3.500000 -4.000000+3.500000 -3.900000+3.500000 -3.800000+3.500000 -3.700000+3.500000 -3.600000+3.500000 -3.500000+3.500000 -3.400000+3.500000 -3.300000+3.500000 -3.200000+3.500000 -3.100000+3.500000 -3.000000+3.500000 -2.900000+3.500000 -2.800000+3.500000 -2.700000+3.500000 -2.600000+3.500000 -2.500000+3.500000 -2.400000+3.500000 -2.300000+3.500000 -2.200000+3.500000 -2.100000+3.500000 -2.000000+3.500000 -1.900000+3.500000 -1.800000+3.500000 -1.700000+3.500000 -1.600000+3.500000 -1.500000+3.500000 -1.400000+3.500000 -1.300000+3.500000 -1.200000+3.500000 -1.100000+3.500000 -1.000000+3.500000 -0.900000+3.500000 -0.800000+3.500000 -0.700000+3.500000 -0.600000+3.500000 -0.500000+3.500000 -0.400000+3.500000 -0.300000+3.500000 -0.200000+3.500000 -0.100000+3.500000 0.000000+3.500000 0.100000+3.500000 0.200000+3.500000 0.300000+3.500000 0.400000+3.500000 0.500000+3.500000 0.600000+3.500000 0.700000+3.500000 0.800000+3.500000 0.900000+3.500000 1.000000+3.500000 1.100000+3.500000 1.200000+3.500000 1.300000+3.500000 1.400000+3.500000 1.500000+3.500000 1.600000+3.500000 1.700000+3.500000 1.800000+3.500000 1.900000+3.500000 2.000000+3.500000 2.100000+3.500000 2.200000+3.500000 2.300000+3.500000 2.400000+3.500000 2.500000+3.500000 2.600000+3.500000 2.700000+3.500000 2.800000+3.500000 2.900000+3.500000 3.000000+3.500000 3.100000+3.500000 3.200000+3.500000 3.300000+3.500000 3.400000+3.500000 3.500000+3.500000 3.600000+3.500000 3.700000+3.500000 3.800000+3.500000 3.900000+3.500000 4.000000+3.600000 -4.000000+3.600000 -3.900000+3.600000 -3.800000+3.600000 -3.700000+3.600000 -3.600000+3.600000 -3.500000+3.600000 -3.400000+3.600000 -3.300000+3.600000 -3.200000+3.600000 -3.100000+3.600000 -3.000000+3.600000 -2.900000+3.600000 -2.800000+3.600000 -2.700000+3.600000 -2.600000+3.600000 -2.500000+3.600000 -2.400000+3.600000 -2.300000+3.600000 -2.200000+3.600000 -2.100000+3.600000 -2.000000+3.600000 -1.900000+3.600000 -1.800000+3.600000 -1.700000+3.600000 -1.600000+3.600000 -1.500000+3.600000 -1.400000+3.600000 -1.300000+3.600000 -1.200000+3.600000 -1.100000+3.600000 -1.000000+3.600000 -0.900000+3.600000 -0.800000+3.600000 -0.700000+3.600000 -0.600000+3.600000 -0.500000+3.600000 -0.400000+3.600000 -0.300000+3.600000 -0.200000+3.600000 -0.100000+3.600000 0.000000+3.600000 0.100000+3.600000 0.200000+3.600000 0.300000+3.600000 0.400000+3.600000 0.500000+3.600000 0.600000+3.600000 0.700000+3.600000 0.800000+3.600000 0.900000+3.600000 1.000000+3.600000 1.100000+3.600000 1.200000+3.600000 1.300000+3.600000 1.400000+3.600000 1.500000+3.600000 1.600000+3.600000 1.700000+3.600000 1.800000+3.600000 1.900000+3.600000 2.000000+3.600000 2.100000+3.600000 2.200000+3.600000 2.300000+3.600000 2.400000+3.600000 2.500000+3.600000 2.600000+3.600000 2.700000+3.600000 2.800000+3.600000 2.900000+3.600000 3.000000+3.600000 3.100000+3.600000 3.200000+3.600000 3.300000+3.600000 3.400000+3.600000 3.500000+3.600000 3.600000+3.600000 3.700000+3.600000 3.800000+3.600000 3.900000+3.600000 4.000000+3.700000 -4.000000+3.700000 -3.900000+3.700000 -3.800000+3.700000 -3.700000+3.700000 -3.600000+3.700000 -3.500000+3.700000 -3.400000+3.700000 -3.300000+3.700000 -3.200000+3.700000 -3.100000+3.700000 -3.000000+3.700000 -2.900000+3.700000 -2.800000+3.700000 -2.700000+3.700000 -2.600000+3.700000 -2.500000+3.700000 -2.400000+3.700000 -2.300000+3.700000 -2.200000+3.700000 -2.100000+3.700000 -2.000000+3.700000 -1.900000+3.700000 -1.800000+3.700000 -1.700000+3.700000 -1.600000+3.700000 -1.500000+3.700000 -1.400000+3.700000 -1.300000+3.700000 -1.200000+3.700000 -1.100000+3.700000 -1.000000+3.700000 -0.900000+3.700000 -0.800000+3.700000 -0.700000+3.700000 -0.600000+3.700000 -0.500000+3.700000 -0.400000+3.700000 -0.300000+3.700000 -0.200000+3.700000 -0.100000+3.700000 0.000000+3.700000 0.100000+3.700000 0.200000+3.700000 0.300000+3.700000 0.400000+3.700000 0.500000+3.700000 0.600000+3.700000 0.700000+3.700000 0.800000+3.700000 0.900000+3.700000 1.000000+3.700000 1.100000+3.700000 1.200000+3.700000 1.300000+3.700000 1.400000+3.700000 1.500000+3.700000 1.600000+3.700000 1.700000+3.700000 1.800000+3.700000 1.900000+3.700000 2.000000+3.700000 2.100000+3.700000 2.200000+3.700000 2.300000+3.700000 2.400000+3.700000 2.500000+3.700000 2.600000+3.700000 2.700000+3.700000 2.800000+3.700000 2.900000+3.700000 3.000000+3.700000 3.100000+3.700000 3.200000+3.700000 3.300000+3.700000 3.400000+3.700000 3.500000+3.700000 3.600000+3.700000 3.700000+3.700000 3.800000+3.700000 3.900000+3.700000 4.000000+3.800000 -4.000000+3.800000 -3.900000+3.800000 -3.800000+3.800000 -3.700000+3.800000 -3.600000+3.800000 -3.500000+3.800000 -3.400000+3.800000 -3.300000+3.800000 -3.200000+3.800000 -3.100000+3.800000 -3.000000+3.800000 -2.900000+3.800000 -2.800000+3.800000 -2.700000+3.800000 -2.600000+3.800000 -2.500000+3.800000 -2.400000+3.800000 -2.300000+3.800000 -2.200000+3.800000 -2.100000+3.800000 -2.000000+3.800000 -1.900000+3.800000 -1.800000+3.800000 -1.700000+3.800000 -1.600000+3.800000 -1.500000+3.800000 -1.400000+3.800000 -1.300000+3.800000 -1.200000+3.800000 -1.100000+3.800000 -1.000000+3.800000 -0.900000+3.800000 -0.800000+3.800000 -0.700000+3.800000 -0.600000+3.800000 -0.500000+3.800000 -0.400000+3.800000 -0.300000+3.800000 -0.200000+3.800000 -0.100000+3.800000 0.000000+3.800000 0.100000+3.800000 0.200000+3.800000 0.300000+3.800000 0.400000+3.800000 0.500000+3.800000 0.600000+3.800000 0.700000+3.800000 0.800000+3.800000 0.900000+3.800000 1.000000+3.800000 1.100000+3.800000 1.200000+3.800000 1.300000+3.800000 1.400000+3.800000 1.500000+3.800000 1.600000+3.800000 1.700000+3.800000 1.800000+3.800000 1.900000+3.800000 2.000000+3.800000 2.100000+3.800000 2.200000+3.800000 2.300000+3.800000 2.400000+3.800000 2.500000+3.800000 2.600000+3.800000 2.700000+3.800000 2.800000+3.800000 2.900000+3.800000 3.000000+3.800000 3.100000+3.800000 3.200000+3.800000 3.300000+3.800000 3.400000+3.800000 3.500000+3.800000 3.600000+3.800000 3.700000+3.800000 3.800000+3.800000 3.900000+3.800000 4.000000+3.900000 -4.000000+3.900000 -3.900000+3.900000 -3.800000+3.900000 -3.700000+3.900000 -3.600000+3.900000 -3.500000+3.900000 -3.400000+3.900000 -3.300000+3.900000 -3.200000+3.900000 -3.100000+3.900000 -3.000000+3.900000 -2.900000+3.900000 -2.800000+3.900000 -2.700000+3.900000 -2.600000+3.900000 -2.500000+3.900000 -2.400000+3.900000 -2.300000+3.900000 -2.200000+3.900000 -2.100000+3.900000 -2.000000+3.900000 -1.900000+3.900000 -1.800000+3.900000 -1.700000+3.900000 -1.600000+3.900000 -1.500000+3.900000 -1.400000+3.900000 -1.300000+3.900000 -1.200000+3.900000 -1.100000+3.900000 -1.000000+3.900000 -0.900000+3.900000 -0.800000+3.900000 -0.700000+3.900000 -0.600000+3.900000 -0.500000+3.900000 -0.400000+3.900000 -0.300000+3.900000 -0.200000+3.900000 -0.100000+3.900000 0.000000+3.900000 0.100000+3.900000 0.200000+3.900000 0.300000+3.900000 0.400000+3.900000 0.500000+3.900000 0.600000+3.900000 0.700000+3.900000 0.800000+3.900000 0.900000+3.900000 1.000000+3.900000 1.100000+3.900000 1.200000+3.900000 1.300000+3.900000 1.400000+3.900000 1.500000+3.900000 1.600000+3.900000 1.700000+3.900000 1.800000+3.900000 1.900000+3.900000 2.000000+3.900000 2.100000+3.900000 2.200000+3.900000 2.300000+3.900000 2.400000+3.900000 2.500000+3.900000 2.600000+3.900000 2.700000+3.900000 2.800000+3.900000 2.900000+3.900000 3.000000+3.900000 3.100000+3.900000 3.200000+3.900000 3.300000+3.900000 3.400000+3.900000 3.500000+3.900000 3.600000+3.900000 3.700000+3.900000 3.800000+3.900000 3.900000+3.900000 4.000000+4.000000 -4.000000+4.000000 -3.900000+4.000000 -3.800000+4.000000 -3.700000+4.000000 -3.600000+4.000000 -3.500000+4.000000 -3.400000+4.000000 -3.300000+4.000000 -3.200000+4.000000 -3.100000+4.000000 -3.000000+4.000000 -2.900000+4.000000 -2.800000+4.000000 -2.700000+4.000000 -2.600000+4.000000 -2.500000+4.000000 -2.400000+4.000000 -2.300000+4.000000 -2.200000+4.000000 -2.100000+4.000000 -2.000000+4.000000 -1.900000+4.000000 -1.800000+4.000000 -1.700000+4.000000 -1.600000+4.000000 -1.500000+4.000000 -1.400000+4.000000 -1.300000+4.000000 -1.200000+4.000000 -1.100000+4.000000 -1.000000+4.000000 -0.900000+4.000000 -0.800000+4.000000 -0.700000+4.000000 -0.600000+4.000000 -0.500000+4.000000 -0.400000+4.000000 -0.300000+4.000000 -0.200000+4.000000 -0.100000+4.000000 0.000000+4.000000 0.100000+4.000000 0.200000+4.000000 0.300000+4.000000 0.400000+4.000000 0.500000+4.000000 0.600000+4.000000 0.700000+4.000000 0.800000+4.000000 0.900000+4.000000 1.000000+4.000000 1.100000+4.000000 1.200000+4.000000 1.300000+4.000000 1.400000+4.000000 1.500000+4.000000 1.600000+4.000000 1.700000+4.000000 1.800000+4.000000 1.900000+4.000000 2.000000+4.000000 2.100000+4.000000 2.200000+4.000000 2.300000+4.000000 2.400000+4.000000 2.500000+4.000000 2.600000+4.000000 2.700000+4.000000 2.800000+4.000000 2.900000+4.000000 3.000000+4.000000 3.100000+4.000000 3.200000+4.000000 3.300000+4.000000 3.400000+4.000000 3.500000+4.000000 3.600000+4.000000 3.700000+4.000000 3.800000+4.000000 3.900000+4.000000 4.000000
+ src/HasGP/Data/Files/gpml-classifier-x.txt view
@@ -0,0 +1,120 @@+0.089450 -0.000701+1.171606 1.177765+1.404723 -0.017418+0.556096 -1.489370+1.213163 0.044545+0.173405 -0.675668+2.225009 0.469803+1.470329 0.887642+2.715199 0.621045+0.173641 -0.936054+2.038153 0.262587+1.670218 -2.633187+0.270099 -0.948780+1.396339 -1.114992+-1.482071 -0.654591+-1.493788 0.382018+1.025084 -0.860345+0.750316 -0.101864+0.184311 -0.258524+0.221869 -1.393954+2.258881 -0.786806+1.211363 -0.423431+1.525307 -0.097975+0.978930 0.476154+1.347884 -0.248408+1.205780 -0.090878+0.124389 0.599613+0.784044 0.356597+1.060217 -0.318475+1.678114 0.678735+0.973851 0.024881+0.016238 -0.480900+0.979407 0.697709+2.217308 -0.956932+2.150476 1.059032+1.050502 0.532142+1.210593 -0.318124+0.426309 -0.571728+0.742552 -0.122113+0.757211 0.862002+-0.431639 -0.763118+-0.748398 -0.603668+0.975087 -1.525298+0.074504 -0.092155+-0.668890 1.305401+0.725633 0.096286+-1.042271 1.297010+1.943145 -1.051177+1.191449 0.261350+0.778004 -1.046301+0.628874 1.103927+1.295114 -0.479519+1.522065 0.993476+1.100256 0.961069+-0.593244 -0.479419+2.023197 -0.275055+-0.788103 -1.090708+-0.085168 1.226858+1.691707 -1.153145+1.989279 1.974704+0.398800 3.051292+-0.707217 0.185505+0.697550 0.222287+2.186126 -0.327829+1.368068 1.708138+0.883049 -1.334269+1.737643 0.618453+2.002229 0.103382+-0.202639 0.495025+0.543309 -0.802121+-1.796162 -0.054795+1.460694 0.750052+0.133278 -1.154891+0.203670 -0.480337+-0.278985 0.030579+2.070490 2.420783+0.599024 -1.673209+0.140507 0.804938+-0.980799 -1.847988+-0.102350 -0.822094+1.160257 1.544112+-0.458435 0.205668+-1.053562 -0.614938+-1.687901 -0.780028+-0.467036 0.561692+-0.703391 0.281301+-1.568558 -0.629129+-2.176479 -1.176211+0.768109 1.376893+-0.514773 0.474264+-1.301924 -0.525179+-1.312025 -0.049469+-0.623418 0.226457+0.020291 0.374056+-1.002902 0.076597+-2.553713 -1.731788+-1.788156 -0.742460+-1.119582 -0.256154+-0.423084 0.395108+-1.645945 -1.216319+0.227806 0.925948+-1.298719 -0.965511+-0.618293 0.140046+0.794935 1.917831+-0.213709 0.617752+-0.474251 -0.054854+0.056078 1.046283+0.887137 1.536490+1.377162 1.764873+-0.901196 -0.340856+-0.783104 -0.330927+-1.507140 0.137504+-0.348999 0.235931+-0.367309 0.655996+-0.050622 0.410969+1.734919 2.611080+-0.567413 -0.458250+-0.622231 0.258402+-1.642147 -1.138579+-0.285298 0.085451
+ src/HasGP/Data/Files/gpml-classifier-y.txt view
@@ -0,0 +1,120 @@+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+-1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000+1.000000
+ src/HasGP/Data/Normalise.hs view
@@ -0,0 +1,203 @@+{- | Normalise is a module in the HasGP Gaussian process library. + It contains functions for performing basic normalisation + tasks on training examples, and for computing assorted + standard statistics.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Data.Normalise where++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Support.Linear as L+import HasGP.Support.Functions as F++-- | Compute the mean for each attribute in a set of examples. +exampleMean :: Inputs -- ^ Matrix - one row per example+ -> DVector -- ^ Vector of means for each attribute.+exampleMean examples = + fromList $ map (L.sumVectorDiv r) (toColumns examples)+ where+ r = rows examples++-- | Compute the variance for each attribute in a set of examples.+exampleVariance :: Inputs -- ^ Matrix - one row per example+ -> DVector -- ^ Vector of variances for each attribute.+exampleVariance examples = + fromList $ map (L.sumVectorDiv r) + (toColumns $ fromRows $ map ((mapVector (^2)) . (\x -> x-m)) + (toRows examples))+ where+ r = rows examples+ m = exampleMean examples++-- | Compute the mean and variance for each attribute in a set of examples.+exampleMeanVariance :: Inputs -- ^ Matrix - one row per example+ -> (DVector, DVector) -- ^ Means and variances+exampleMeanVariance examples = (exampleMean examples, exampleVariance examples) + +-- | Normalise a set of examples to have specified mean and variance.+normaliseMeanVariance :: DVector -- ^ Vector of new means required+ -> DVector -- ^ Vector of new variances required+ -> Inputs -- ^ Matrix - one row per example+ -> Inputs -- ^ Normalised matrix+normaliseMeanVariance newMean newVariance examples = + fromRows $ map (\x -> x+newMean) varianceAdjusted+ where+ (m, v) = exampleMeanVariance examples+ zeroMean = map (\x -> x-m) (toRows examples)+ varianceAdjustment = zipVectorWith (\x y -> (sqrt x)/(sqrt y)) + newVariance v+ varianceAdjusted = map (zipVectorWith (*) varianceAdjustment) zeroMean++-- | The same as normaliseMeanVariance but every column (attribute) is +-- normalised in the same way.+normaliseMeanVarianceSimple :: Double -- ^ New mean required + -> Double -- ^ New variance required+ -> Inputs -- ^ Matrix - one row per example+ -> Inputs -- ^ Normalised matrix+normaliseMeanVarianceSimple newMean newVariance examples = + normaliseMeanVariance (constant newMean c) (constant newVariance c) examples+ where+ c = cols examples++-- | Normalise a set of examples to have specified maximum and minimum.+normaliseBetweenLimits :: Double -- ^ New min required + -> Double -- ^ New max required + -> Inputs -- ^ Matrix - one row per example+ -> Inputs -- ^ Normalised matrix+normaliseBetweenLimits min max examples = + fromColumns $ zipWith (\x y -> mapVector (x+) y) + cV (zipWith scale mV columns)+ where+ columns = toColumns examples+ minV = map minElement columns+ maxV = map maxElement columns+ mV = zipWith (\x y -> ((max - min) / (y - x))) minV maxV+ cV = zipWith (\x y -> (min - (y * x))) minV mV++-- | Find the columns of a matrix in which all values are equal. +findRedundantAttributes :: Inputs -- ^ Matrix - one row per example+ -> [Bool] -- ^ List - True elements mark redundancy+findRedundantAttributes examples = map allSame columns+ where+ columns = map toList (toColumns examples)+ allSame [] = True+ allSame [h] = True+ allSame [h1,h2] = (h1 == h2)+ allSame (h1:h2:t) = (h1 == h2) && (allSame (h2:t)) ++-- | List column numbers for redundant attributes.+listRedundantAttributes :: Inputs -- ^ Matrix - one row per example+ -> [Int] -- ^ List - positions of redundant attributes+listRedundantAttributes examples = findColumns boolean 1 []+ where+ boolean = findRedundantAttributes examples+ findColumns [] n result = reverse result+ findColumns (h:t) n result+ | h = findColumns t (n+1) (n:result)+ | otherwise = findColumns t (n+1) result++-- | Remove any redundant columns from a matrix.+removeRedundantAttributes :: Inputs -- ^ Matrix - one row per example+ -> Inputs -- ^ Modified matrix - one row per example+removeRedundantAttributes examples = + fromColumns $ removeTrueColumns [] r (toColumns examples)+ where+ r = findRedundantAttributes examples+ removeTrueColumns result [] []+ = reverse result+ removeTrueColumns result (True:t1) (c:t2) + = removeTrueColumns result t1 t2+ removeTrueColumns result (False:t1) (c:t2) + = removeTrueColumns (c:result) t1 t2++-- | Specify a list of columns (matrix numbered from 1).+-- Produce a matrix with ONLY those columns in the +-- order specified in the list.+retainAttributes :: [Int] -- ^ List of columns to keep.+ -> Inputs -- ^ Matrix - one row per example+ -> Inputs -- ^ Modified matrix - one row per example+retainAttributes l m = trans $ extractRows l2 $ trans m+ where+ l2 = map (\x -> x-1) l++-- | Compute the numbers for the confusion matrix.+-- It is assumed that classes are +1 (positive) and -1 (negative).+-- Result is (a,b,c,d):+-- a - correct negatives+-- b - predict positive when correct is negative+-- c - predict negative when correct is positive+-- d - correct positives+confusionMatrix :: Targets + -> Outputs + -> (Double,Double,Double,Double)+confusionMatrix correct predicted = + cm (toList correct) (toList predicted) (0,0,0,0)+ where+ cm [] [] result = result+ cm (h1:t1) (h2:t2) (a,b,c,d) = case (h1, h2) of+ (1.0, 1.0) -> cm t1 t2 (a,b,c,d+1)+ (1.0,-1.0) -> cm t1 t2 (a,b,c+1,d)+ (-1.0, 1.0) -> cm t1 t2 (a,b+1,c,d)+ (-1.0,-1.0) -> cm t1 t2 (a+1,b,c,d)+ cm _ _ result + = error "Correct and predicted vectors must have the same length"++-- | Print the confusion matrix and some other statistics+printConfusionMatrix :: Targets -- ^ Vector of targets + -> Outputs -- ^ Vector of actual outputs+ -> IO ()+printConfusionMatrix correct predicted = do+ let (a,b,c,d) = confusionMatrix correct predicted+ let n = a+b+c+d+ let trueP = d/(d+c)+ let precision = d/(d+b)+ putStrLn ("------------------------------------------------")+ putStrLn ("Correct -1, Predicted -1: a = " ++ (show a))+ putStrLn ("Correct -1, Predicted +1: b = " ++ (show b))+ putStrLn ("Correct +1, Predicted -1: c = " ++ (show c))+ putStrLn ("Correct +1, Predicted +1: d = " ++ (show d))+ putStrLn ("------------------------------------------------")+ putStrLn ("Number of examples: n = a+b+c+d = " ++ (show n))+ putStrLn ("Accuracy: a+d/n = " ++ (show ((a+d)/n)))+ putStrLn ("Recall/True Positive: d/d+c = " ++ (show trueP))+ putStrLn ("False Positive: b/b+a = " ++ (show (b/(b+a))))+ putStrLn ("True Negative: a/b+a = " ++ (show (a/(b+a))))+ putStrLn ("False Negative: c/d+c = " ++ (show (c/(d+c))))+ putStrLn ("Precision: d/d+b = " ++ (show precision))+ putStrLn ("F Measure (beta = 1) = " ++ + (show ((2 * trueP * precision)/(trueP + precision))))+ putStrLn ("------------------------------------------------")+ return ()++-- | Assuming the labels are +1 or -1, count how many there are of each.+countLabels :: Targets -> IO ()+countLabels v = do+ let d = dim v+ let plus = length $ filter (==(1.0)) $ toList v+ putStrLn ("Total number of labels: " ++ (show d))+ putStrLn ("Number of +1 labels: " ++ (show plus))+ putStrLn ("Number of -1 labels: " ++ (show (d - plus)))+ return ()+++++
+ src/HasGP/Data/RWData1.hs view
@@ -0,0 +1,47 @@+{- | Gaussian Process Library - functions for producing data sets+ From Rasmussen and Williams, "Gaussian Processes for Machine Learning."++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Data.RWData1 where++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Support.Random++-- | Generate training data for a simple classification problem as in +-- Rasmussen/Williams, page 62.+simpleClassificationData :: Int -- ^ Seed for random number generator. + -> (DMatrix, DVector)+simpleClassificationData seed = + ((asColumn $ join [(-6)+x1, x2, 2+x3]), + join [constant 1 20, constant 0 30, constant 1 10])+ where+ v = (0.8)^2+ x1 = normalVectorSimple seed v 20 + x2 = normalVectorSimple (seed+1) v 30+ x3 = normalVectorSimple (seed+2) v 10+ +++ + +++
+ src/HasGP/Demos/ClassificationDemo1.hs view
@@ -0,0 +1,120 @@+{- | Demonstration of Gaussian process classification using the + 1-dimensional problem from Rasmussen and Williams' book.++ This demo compares the Laplace and EP approximation approaches.++ For details of the algorithms involved see www.gaussianprocesses.org.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Demos.ClassificationDemo1 where ++import Numeric.LinearAlgebra+import Numeric.GSL.Minimization++import HasGP.Data.RWData1+import HasGP.Types.MainTypes+import HasGP.Support.Linear+import HasGP.Classification.Laplace.ClassificationLaplace as L+import HasGP.Classification.EP.ClassificationEP as EP+import HasGP.Covariance.SquaredExp+import HasGP.Covariance.Basic+import HasGP.Likelihood.LogPhi+import HasGP.Likelihood.Basic ++-- | This function defines when iteration stops for the Laplace version.+stopLaplace::LaplaceConvergenceTest+stopLaplace s1 s2 = ((L.count s2) == 100) || + (lengthV ((fValue s1) - (fValue s2)) < 0.001)++-- | This function defines when iteration stops for the EP version.+stopEP::EPConvergenceTest+stopEP s1 s2 = ((EP.count s2) == 100) || + ((EP.eValue s1) > (EP.eValue s2)) ||+ (abs ((EP.eValue s1) - (EP.eValue s2)) < 0.001)++demo = do + putStrLn "Generating the training and testing data..."++ let (inputs, t) = simpleClassificationData 0+ let targets = mapVector (\x -> if (x==1) then 1 else -1) t+ saveMatrix "training-inputs.txt" "%g" inputs+ fprintfVector "training-targets.txt" "%g" targets++ let points = asColumn $ linspace 50 (-9.0,5.0) + saveMatrix "test-inputs.txt" "%g" points++ putStrLn "Learning and predicting: Laplace + hyperparameter optimization..."++ let cov1 = SquaredExponential (log 1.0) (log 1.0)+ let c1 = covarianceMatrix cov1 inputs+ + let f1 = (\v -> gpCLaplaceLogEvidenceVec inputs targets cov1 LogPhi + stopLaplace v)+ let ev1 = fst . f1+ let gev1 = snd . f1+ let (solution1, path1) = + minimizeVD ConjugatePR 0.0001 50 0.01 0.1 ev1 gev1 + (constant (log 1) 2)+ + putStrLn $ "Solution: " ++ (show $ mapVector exp solution1)+ putStrLn $ "Path: "+ putStrLn $ show path1++ let cov1' = SquaredExponential (solution1 @> 0) (solution1 @> 1)+ let c1' = covarianceMatrix cov1' inputs+ let result1 = gpCLaplaceLearn c1' targets LogPhi stopLaplace+ let classify1 = + gpCLaplacePredict' (fValue result1) inputs targets c1' cov1' LogPhi + let newOuts1 = fromList $ map convertToP_CG $ classify1 $ points+ + fprintfVector "test-outputs-laplace.txt" "%g" newOuts1++ putStrLn $ "Done"++ putStrLn "Learning and predicting: EP + hyperparameter optimization..."++ let cov2 = SquaredExponential (log 1.0) (log 1.0)+ let c2 = covarianceMatrix cov2 inputs+ + let f2 = (\v -> gpClassifierEPLogEvidenceVec inputs targets cov2 + generateRandomSiteOrder stopEP v)+ let ev2 = fst . f2+ let gev2 = snd . f2+ let (solution2, path2) = + minimizeVD ConjugatePR 0.0001 50 0.01 0.1 ev2 gev2 + (constant (log 1) 2)+ + putStrLn $ "Solution: " ++ (show $ mapVector exp solution2)+ putStrLn $ "Path: "+ putStrLn $ show path2++ let cov2' = SquaredExponential (solution2 @> 0) (solution2 @> 1)+ let c2' = covarianceMatrix cov2' inputs+ let (epValue, epState) = + gpClassifierEPLearn c2' targets generateRandomSiteOrder stopEP+ let classify2 = + gpClassifierEPPredict (siteState epValue) inputs targets c2' cov2' + let newOuts2 = classify2 points+ + fprintfVector "test-outputs-ep.txt" "%g" newOuts2++ putStrLn $ "Done"++ return ()+
+ src/HasGP/Demos/ClassificationDemo2.hs view
@@ -0,0 +1,85 @@+{- | Demonstration of Gaussian process classification using the + demonstration problem from++ www.gaussianprocess.org/gpml/code/matlab/doc/++ This demo uses the EP approximation approach.++ For details of the algorithms involved see www.gaussianprocesses.org. + For a detailed explanation of the following code see the HasGP user + manual.++ Copyright (C) 2011 Sean Holden. sbh11@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Demos.ClassificationDemo2 where++import Numeric.LinearAlgebra+import Numeric.GSL.Minimization++import HasGP.Types.MainTypes+import HasGP.Support.Linear+import HasGP.Classification.EP.ClassificationEP+import HasGP.Covariance.SquaredExpARD+import HasGP.Covariance.Basic++-- | This function defines when iteration stops.+stopEP::EPConvergenceTest+stopEP s1 s2 = ((count s2) == 100) || + ((eValue s1) > (eValue s2)) ||+ (abs ((eValue s1) - (eValue s2)) < 0.001)++demo = do + putStrLn "Loading the training data..."+ + inputs <- loadMatrix "gpml-classifier-x.txt"+ targets <- fscanfVector "gpml-classifier-y.txt" 120+ points <- loadMatrix "gpml-classifier-test.txt"++ putStrLn "Learning and predicting: EP + hyperparameter optimization..."++ let cov = SquaredExponentialARD (log 1.0) (constant (log 1.0) 2)+ let c = covarianceMatrix cov inputs+ + let f = (\v -> gpClassifierEPLogEvidenceVec inputs targets cov + generateRandomSiteOrder stopEP v)+ let ev = fst . f+ let gev = snd . f+ let (solution, path) = + minimizeVD ConjugatePR 0.0001 50 1 0.0001 ev gev + (constant (log 1) 3)+ + putStrLn $ "Solution: " ++ (show $ mapVector exp solution)+ putStrLn $ "Path: "+ putStrLn $ show path++ let cov' = SquaredExponentialARD (solution @> 0) + (fromList [(solution @> 1), (solution @> 2)])+ let c' = covarianceMatrix cov' inputs+ let (epValue, epState) = + gpClassifierEPLearn c' targets generateRandomSiteOrder stopEP+ let classify = + gpClassifierEPPredict (siteState epValue) inputs targets c' cov' + let newOuts = classify points+ + fprintfVector "gpml-hasgp-outputs.txt" "%g" newOuts++ putStrLn $ "Done"+ ++ return ()+
+ src/HasGP/Demos/RegressionDemo1.hs view
@@ -0,0 +1,70 @@+{- | Demonstration of Gaussian process regression using the simple+ data from "Neural Networks for Pattern Recognition," by Chris+ Bishop. This version estimates the hyperparameters using the+ optimization algorithm from HMatrix.++ For details of the algorithms involved see www.gaussianprocesses.org.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Demos.RegressionDemo1 where ++import Numeric.LinearAlgebra+import Numeric.GSL.Minimization++import HasGP.Data.BishopData+import HasGP.Types.MainTypes+import HasGP.Support.Linear+import HasGP.Support.Random+import HasGP.Regression.Regression+import HasGP.Covariance.SquaredExp++demo = do + putStrLn "Generating the training data..."++ let (inputs, targets) = bishopData+ saveMatrix "inputs.txt" "%g" inputs+ fprintfVector "targets.txt" "%g" targets++ putStrLn "Searching for best hyperparameters..."+ let f = gpRLogHyperToEvidence (SquaredExponential 0 0) inputs targets + let ev = fst . f+ let gev = snd . f+ let (solution, path) = + minimizeVD ConjugatePR 0.0001 50 0.01 0.1 ev gev + (constant (log 0.1) 3)+ + putStrLn $ "Found: " ++ (show solution)+ putStrLn $ "Path: "+ putStrLn $ show path++ putStrLn "Learning and predicting..."+ + let newPoints = fromColumns $ [linspace 100 (0.0,1.0)] ++ let (newOuts, var) = + gpRPredict' (SquaredExponential (solution @> 1) (solution @> 2)) + (solution @> 0) inputs targets newPoints++ fprintfVector "outputs.txt" "%g" newOuts+ fprintfVector "variances.txt" "%g" var ++ putStrLn "Done"+ return ()+ +
+ src/HasGP/Likelihood/Basic.hs view
@@ -0,0 +1,40 @@+{- | HasGP Gaussian Process Library. This module contains the class definition + for log likelihoods.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Likelihood.Basic + (+ LogLikelihood(..)+ ) where++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Support.Functions++{- | The following allows arbitrary likelihoods with or without parameters + to be wrapped up with their derivatives (with respect to f) and passed + to a function.+-}+class LogLikelihood b where+ likelihood :: b -> Double -> Double -> Double + dLikelihood :: b -> Double -> Double -> Double+ ddLikelihood :: b -> Double -> Double -> Double+ dddLikelihood :: b -> Double -> Double -> Double+
+ src/HasGP/Likelihood/LogLogistic.hs view
@@ -0,0 +1,46 @@+{- | HasGP Gaussian Process Library. This module contains the definition + for the standard log logistic likelihood function.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Likelihood.LogLogistic + (+ LogLogistic(..)+ ) where++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Support.Functions+import HasGP.Likelihood.Basic++{- | Value and first three derivatives of log sigmoid with respect to its + parameter f. log p(y|f) = log sigmoid (yf) where y is +1 or -1.+-}+data LogLogistic = LogLogistic++instance LogLikelihood LogLogistic where+ likelihood LogLogistic y f = log (1 / (1 + (exp (-(f * y)))))+ dLikelihood LogLogistic y f = ((y + 1) / 2) - (sigmoid f)+ ddLikelihood LogLogistic y f = (-x) * (1 - x)+ where x = sigmoid f+ dddLikelihood LogLogistic y f = (exp (-f)) * (x^2) * ((2 * x) - 1)+ where x = sigmoid f+++
+ src/HasGP/Likelihood/LogPhi.hs view
@@ -0,0 +1,51 @@+{- | HasGP Gaussian Process Library. This module contains the definition + for the standard log Phi likelihood.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Likelihood.LogPhi+ (+ LogPhi(..)+ ) where++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Support.Functions+import HasGP.Likelihood.Basic++{- | Value and first three derivatives of log Phi with respect to its+ parameter f. log p(y|f) = log \Phi (yf) where y is +1 or -1. +-}+data LogPhi = LogPhi++instance LogLikelihood LogPhi where + likelihood LogPhi y f = logPhi (y * f)+ dLikelihood LogPhi y f = y * nOverP+ where+ nOverP = (n f) / (phiIntegral (y * f))+ ddLikelihood LogPhi y f = -(((nOverP)^2) + ((y * f) * nOverP))+ where+ nOverP = (n f) / (phiIntegral (y * f))+ dddLikelihood LogPhi y f = + (2 * y * (nOverP^3)) + (((2 * f) + (y^2)) * + (nOverP ^2)) - (y * (1 - (f^2)) * nOverP)+ where+ nOverP = (n f) / (phiIntegral (y * f))++
+ src/HasGP/Parsers/SvmLight.hs view
@@ -0,0 +1,404 @@+{- | Parser implemented using the Parsec library for reading from files in the + format used by SVMLight.++ Currently assumes your file is a text file in Unix format. The extra + characters in Windows text files confuse it.+ + Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Parsers.SvmLight + (+ analyse,+ getMatrixExamplesFromFileC+ ) where++import Text.ParserCombinators.Parsec+import qualified IO+import Data.List++import qualified Numeric.LinearAlgebra as M++type FullTarget = (Int,Double,Bool)+type FullFeature = ((Int,String),Double)+type FullExample = (FullTarget,[FullFeature],String)++-- | Classes are denoted by plus or minus 1 or 0+oneZero :: Parser Int+oneZero = do+ n <- oneOf "10"+ return (read [n])++-- | Targets either correspond to classes or to doubles for regression +-- problems. +classTarget :: Parser Int+classTarget = + do + n <- oneZero+ return n + <|> do + char '+'+ n <- oneZero+ return n+ <|> do + char '-' + n <- oneZero+ return (-n)++-- | Feature values are doubles. +positiveDouble :: Parser Double+positiveDouble = + do + char '.'+ s <- many1 digit+ return (read("0." ++ s))+ <|> try ( do + s1 <- many1 digit+ char '.'+ s2 <- many digit+ return (read(s1 ++ "." ++ if (s2=="") then "0" else s2))+ )+ <|> do + s1 <- many1 digit+ return (read s1)+ +-- | We may or may not want to automatically convert an integer,+-- depending on the circumstances. In particular targets for +-- regression problems can be doubles, so we dont want to read a +-- class as a double.+positiveDoubleNotInt :: Parser Double+positiveDoubleNotInt = + do + char '.'+ s <- many1 digit+ return (read("0." ++ s)) + <|> do + s1 <- many1 digit+ char '.'+ s2 <- many digit+ return (read(s1 ++ "." ++ if (s2=="") then "0" else s2))++signedDouble :: Parser Double+signedDouble = + do + n <- positiveDouble+ return n + <|> do + char '+'+ n <- positiveDouble+ return n+ <|> do + char '-' + n <- positiveDouble+ return (-n)++signedDoubleNotInt :: Parser Double+signedDoubleNotInt = + do + n <- positiveDoubleNotInt+ return n + <|> do + char '+'+ n <- positiveDoubleNotInt+ return n+ <|> do + char '-' + n <- positiveDoubleNotInt+ return (-n)++-- | A target is -1, +1, 0 or a floating point number. The+-- Boolean is True for one of the first three and false+-- for the fourth. A look at Joachims' examples suggests+-- the + is optional.+target :: Parser FullTarget +target = try ( + do + n <- signedDoubleNotInt+ return (0, n, False) + )+ <|> do + n <- classTarget+ return (n, 0.0, True)++-- | We need integers to number the features.+integer :: Parser Int+integer = + do + n <- many1 digit+ return (read n)+ <|> do + char '+'+ n <- many1 digit+ return (read n)+ <|> do + char '-'+ n <-many1 digit+ return (read ('-':n))++-- | A feature in this format can in fact be either numbered or +-- labelled as "qid".+feature :: Parser (Int, String)+feature = + do + s <- string "qid"+ return (0,"qid")+ <|> do + i <- integer+ return (i,"")++-- | Most of a line is taken up with : separated features and their values.+featureValuePair :: Parser FullFeature+featureValuePair = + do + f <- feature+ char ':'+ v <- signedDouble+ return (f,v)++-- | This is needed so that we can read pretty much anything we like from +-- comments.+generalLetter :: Parser Char+generalLetter = alphaNum + <|> oneOf ('"':'\\':"[]{};:'@#~/?.>,<|`¬!£$%^&*()-_=+")++-- | The format describes comments in two ways. At the start of the file they +-- are ignored, but after a line they need to be read.+stringToLineEnd :: Parser [String]+stringToLineEnd = + do + words <- sepEndBy (many1 generalLetter) (many (char ' '))+ newline+ return words++-- | At the end of a line, a # followed by text needs to be read. +-- I assume you only take the string up to the end of the line. +info :: Parser String+info = + do + char '#'+ spaces+ s <- stringToLineEnd+ return (drop 1 (foldl (++) [] (map (' ':) s)))+ <|> do + newline+ return ""++-- | This reads a single line denoting a single example.+line :: Parser FullExample+line = + do + many (char ' ')+ t <- target+ many1 (char ' ')+ fvp <- sepEndBy (featureValuePair) (many (char ' '))+ s <- info+ return (t, fvp, s)++-- | This reads a file, ignoring comments at the beginning.+file:: Parser [FullExample]+file = + do + many info+ l <- many1 line+ spaces+ eof+ return l++-- | A bunch of basic functions for extracting interesting things from+-- the output of the parser in a format+-- that's likely to be a bit easier to use.+split1 :: (a,b,c) -> a+split1 (a,_,_) = a++split2 :: (a,b,c) -> b+split2 (_,b,_) = b++split3 :: (a,b,c) -> c+split3 (_,_,c) = c++fullExamplesSeparate :: [FullExample] + -> ([FullTarget],[[FullFeature]],[String])+fullExamplesSeparate l = unzip3 l++classificationProblem :: [FullTarget] -> Bool+classificationProblem l = + all (\x -> (split3 x) && (((split1 x)==1) || ((split1 x)==(-1)))) l++getClassificationTargets :: [FullTarget] -> [Int]+getClassificationTargets [] = []+getClassificationTargets ((c,_,_):rest) + = c:(getClassificationTargets rest)++regressionProblem :: [FullTarget] -> Bool+regressionProblem l = all (\x -> (not $ split3 x)) l++getRegressionTargets :: [FullTarget] -> [Double]+getRegressionTargets [] = []+getRegressionTargets ((_,r,_):rest) + = r:(getRegressionTargets rest)++noQid :: [[FullFeature]] -> Bool+noQid l = all no l+ where no l2 = all (\x -> ((snd $ fst x)/="quid")) l2++getExampleRange:: [FullExample] -> (Int,Int)+getExampleRange [] = (0,0)+getExampleRange x + = ((minimum result), (maximum result))+ where y = split2 $ fullExamplesSeparate x -- just the attribute vectors+ z = map (map (fst . fst)) y -- attribute numbers from vectors+ result = foldl (++) [] z++-- | Now sort numbers and attributes at the same time +-- so that the numbers are ascending.+comp :: (Int,Double) -> (Int,Double) -> Ordering+comp (a,b) (c,d) + | (a > c) = LT+ | (a < c) = GT+ | otherwise = error "Numbers should not be equal."++sortExamples :: [Int] -> [Double] -> [(Int, Double)] +sortExamples numbers values = sortBy comp (zip numbers values) + +insertZeros :: (Int, Int) -> ([Int], [Double]) -> [Double]+insertZeros (min_num, max_num) (i, d) + = iz (unzip (sortExamples i d)) [] min_num max_num+ where + iz ([], []) r m n = if (n == (m-1))+ then r+ else iz ([], []) (0:r) m (n-1)+ iz ([], _) _ _ _ + = error "insertZeros: arguments need to have equal lengths"+ iz (_, []) _ _ _ + = error "insertZeros: arguments need to have equal lengths"+ iz ((h1:t1), (h2:t2)) r m n = if (h1 == n) + then iz (t1, t2) (h2:r) m (n-1)+ else iz (h1:t1, h2:t2) (0:r) m (n-1)++-- | Get the attribute vectors as a list of lists.+-- Care required here as we need to insert 0 where there is no attribute.+getExamples :: [FullExample] -> [[Double]]+getExamples [] = []+getExamples x = map (insertZeros (getExampleRange x)) (zip numbers values) + where + y = split2 $ + fullExamplesSeparate x -- attribute vectors+ numbers = map (map (fst . fst)) y -- attribute numbers from vectors+ values = map (map snd) y -- attribute values from the vectors++-- | Does a matrix of Doubles make sense: that is, are all the rows the +-- same length?+dimensionsCorrect :: [[Double]] -> Bool+dimensionsCorrect [] = True+dimensionsCorrect [r] = True+dimensionsCorrect (h:t) = all (==(length h)) (map length t)++-- | Find the dimensions of a matrix represented as a list of lists of Doubles.+dimensions :: [[a]] -> (Int, Int)+dimensions [] = (0,0)+dimensions m@(h:t) = (length m, length h)+ +-- | Parse a file in SvmLight format and print some information about it. +analyse :: String -> IO ()+analyse file_name = + do+ x <- parseFromFile file file_name+ case x of+ Left error -> IO.putStrLn $ show error+ Right result -> do+ IO.putStrLn ("-------------------------------------------")+ IO.putStrLn ("Analysing SVMLight input file: " ++ file_name)+ IO.putStrLn ("-------------------------------------------")+ IO.putStrLn ("Classification problem: " + ++ (if (classificationProblem r1) + then "Yes" + else "No"))+ IO.putStrLn ("Regression Problem: " + ++ (if (regressionProblem r1) + then "Yes" + else "No"))+ IO.putStrLn ("First five classification target values: " + ++ (show $ + take 5 (getClassificationTargets $ r1)))+ IO.putStrLn ("First five regression target values: " + ++ (show $ take 5 (getRegressionTargets $ r1)))+ IO.putStrLn ("-------------------------------------------")+ IO.putStrLn ("Maximum attribute number: " ++ (show $ snd $ r2))+ IO.putStrLn ("Minimum attribute number: " ++ (show $ fst $ r2))+ IO.putStrLn ("-------------------------------------------")+ IO.putStrLn ("Maximum attribute value: " + ++ (show $ maximum $ map maximum r3))+ IO.putStrLn ("Minimum attribute value: " + ++ (show $ minimum $ map minimum r3))+ IO.putStrLn ("qid present: " + ++ (if (noQid $ r4) + then "No" + else "Yes"))+ IO.putStrLn ("Matrix correctly sized: " + ++ (if (dimensionsCorrect r3) + then "Yes" + else "No"))+ IO.putStrLn ("Number of examples: " + ++ (show $ fst $ dimensions r3))+ IO.putStrLn ("Number of attributes: " + ++ (show $ snd $ dimensions r3))+ IO.putStrLn ("Beginning of first five examples: ") + IO.putStrLn (show $ map (take 5) (take 5 r3))+ IO.putStrLn ("------------------------------------------")+ where + r = fullExamplesSeparate result+ r1 = split1 r+ r2 = getExampleRange result+ r3 = getExamples result+ r4 = split2 r++getExamplesFromFile :: String -> IO (Either ParseError [FullExample])+getExamplesFromFile string = + do + x <- parseFromFile file string+ return x++fullExampleToMatrixC::[FullExample] -> (M.Matrix Double, M.Vector Double)+fullExampleToMatrixC fullExamples + | classificationProblem targets = + if (dimensionsCorrect attributes)+ then (M.fromRows attributes', + M.fromList $ map convert intTargets)+ else error "Dimension not correct for making a matrix"+ | otherwise = error "This is not a classification problem."+ where + targets = split1 $ fullExamplesSeparate fullExamples+ attributes = getExamples fullExamples+ attributes' = map M.fromList attributes+ intTargets = getClassificationTargets targets+ convert x + | x==1 = 1.0+ | x==(-1) = (-1.0)+ | otherwise = error "Unexpected class label."++-- | Read examples from a file in SvmLight format and produce a corresponding +-- matrix and vector, for a classification problem. Includes checks +-- that all examples have the same number of attributes, and that the file +-- does in fact correspond to a classification problem.+getMatrixExamplesFromFileC::String -> IO (M.Matrix Double, M.Vector Double)+getMatrixExamplesFromFileC fileName = + do+ contents <- getExamplesFromFile fileName+ case contents of+ Left error' -> error $ show error'+ Right result -> return $ fullExampleToMatrixC result+
+ src/HasGP/Regression/Regression.hs view
@@ -0,0 +1,142 @@+{- | Regression is a module in the HasGP Gaussian process+ library. It implements basic Gaussian process regression.+ For the technical details see www.gaussianprocesses.org.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Regression.Regression + (+ gpRMain,+ gpRPredict,+ gpRPredict',+ gpRLogEvidence,+ gpRGradLogEvidence,+ gpRLogHyperToEvidence+ ) where ++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Covariance.Basic+import HasGP.Support.MatrixFunction+import HasGP.Support.Solve+import HasGP.Support.Linear++-- | Compute the main quantities required to do regression, specifically:+-- the Cholesky decomposition L of the covariance matrix, and the parameters +-- \alpha such that L L^t y = alpha.+gpRMain :: CovarianceFunction cF => cF + -> Double -- ^ The log noise variance+ -> Inputs + -> Targets + -> (DMatrix,DVector) -- ^ L and alpha.+gpRMain cov lognvar d t = (l,alpha)+ where+ n = rows d+ k = covarianceMatrix cov d+ m = (k + (scale (exp lognvar) (ident n)))+ l = trans $ chol m+ alpha = upperSolve (trans l) (lowerSolve l t)++-- | Compute the expected value and variance for a collection of +-- new points supplied as the rows of a matrix. Differs from +-- gpRPredict' as l and alpha need to be computed in advance.+gpRPredict :: CovarianceFunction cF => cF+ -> DMatrix -- ^ l+ -> DVector -- ^ alpha+ -> Inputs + -> Targets + -> Inputs -- ^ The new inputs+ -> (DVector, DVector) -- ^ Mean, variance+gpRPredict cov l alpha d t xStars = + ((fromRows kxxStar) <> alpha, + fromList $ zipWith (-) kxStarxStar (zipWith dot vs vs))+ where+ new = toRows xStars+ kxxStar = covarianceWithPoints cov d new+ kxStarxStar = zipWith (covariance cov) new new+ vs = map (lowerSolve l) kxxStar++-- | Compute the expected value and variance for a collection of +-- new points supplied as the rows of a matrix. +gpRPredict' :: CovarianceFunction cF => cF + -> Double -- ^ The log noise variance+ -> Inputs + -> Targets + -> Inputs -- ^ The new inputs+ -> (DVector, DVector) -- ^ Mean, variance+gpRPredict' cov lognvar d t xStars = + ((fromRows kxxStar) <> alpha, + fromList $ zipWith (-) kxStarxStar (zipWith dot vs vs))+ where+ (l, alpha) = gpRMain cov lognvar d t + new = toRows xStars+ kxxStar = covarianceWithPoints cov d new+ kxStarxStar = zipWith (covariance cov) new new+ vs = map (lowerSolve l) kxxStar++-- | Compute the log of the marginal likelihood.+gpRLogEvidence :: DMatrix -- ^ l+ -> DVector -- ^ alpha+ -> Targets + -> Double -- ^ log marginal likelihood+gpRLogEvidence l alpha t = + (-0.5) * ((t <.> alpha) + + (2.0 * (sum $ map log (toList $ takeDiag l))) + + ((fromIntegral n) * (log (2 * pi))))+ where+ n = rows l++-- | Compute the gradient of the log marginal likelihood.+-- Output contains derivative with respect to noise variance +-- followed by the derivatives with respect to the hyperparameters +-- in the covariance function.+gpRGradLogEvidence :: CovarianceFunction cF => cF+ -> Double -- ^ the log noise variance+ -> DMatrix -- ^ l+ -> DVector -- ^ alpha + -> Inputs + -> DVector -- ^ Derivatives+gpRGradLogEvidence cov lognvar l alpha i = + join [fromList [dZdtheta $ scale (exp lognvar) $ ident (rows l)], + fromList $ map dZdtheta dKdthetaList]+ where+ invK = HasGP.Support.Solve.cholSolve l+ dKdthetaList = makeMatricesFromPairs (dCovarianceDParameters cov) i+ dZdtheta dKdtheta = + (0.5) * (sum $ toList $ abDiagOnly + ((asColumn alpha <> asRow alpha) - invK) dKdtheta)++-- | Given the log parameters and other necessary inputs, compute +-- the NEGATIVE of the log marginal likelihood and its derivatives with +-- respect to the LOG hyperparameters.+gpRLogHyperToEvidence :: CovarianceFunction cF => cF + -> Inputs + -> Targets + -> DVector -- ^ log hyperparameters, noise variance first+ -> (Double, DVector)+gpRLogHyperToEvidence cov inputs targets parameters = + (-(gpRLogEvidence l alpha targets), + zipVectorWith (*) negGradLE (mapVector exp parameters))+ where+ lognvar = parameters @> 0+ loghyper = subVector 1 ((dim parameters) - 1) parameters + newCov = (makeCovarianceFromList cov) $ toList loghyper+ (l, alpha) = gpRMain newCov lognvar inputs targets+ negGradLE = -(gpRGradLogEvidence newCov lognvar l alpha inputs)+
+ src/HasGP/Support/Functions.hs view
@@ -0,0 +1,74 @@+{- | HasGP Gaussian Process Library. This module contains assorted functions + that support GP calculations but are more general-purpose than + GP-specific.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Support.Functions where++import HasGP.Types.MainTypes+import Numeric.LinearAlgebra+import Numeric.GSL.Special.Erf++square :: Double -> Double+square x = (x * x)++trace :: DMatrix -> Double+trace = sum . toList . takeDiag++-- | Standard delta function - 0/1 valued.+delta :: (Eq a) => a -> a -> Double+delta a b + | (a==b) = 1.0+ | otherwise = 0.0++-- | Standard delta function - boolean valued.+deltaBool :: (Eq a) => a -> a -> Bool+deltaBool a b = (a==b)++-- | General sigmoid function with variable slope.+generalSigmoid :: Double -> Double -> Double+generalSigmoid theta x = 1 / (1 + (exp (-(theta * x))))++-- | Standard sigmoid function.+sigmoid :: Double -> Double+sigmoid = generalSigmoid 1++-- | Integral of Gaussian density of mean 0 and variance 1 +-- from -infinity to x+phiIntegral :: Double -> Double+phiIntegral x = 1 - (erf_Q x)++-- | Value of Gaussian density function for mean 0 and +-- variance 1.+n :: Double -> Double+n x = erf_Z x++-- | DANGER! You can't compute the ratio (n x) / (phiIntegral x) directly, +-- as although it has sensible values for negative x the denominator gets +-- small so fast that you quickly get Infinity turning up. GSL has the +-- inverse Mill's function/hazard function for the Gaussian distribution, +-- and the ratio is equal to hazard(-x).+nOverPhi :: Double -> Double+nOverPhi x = hazard(-x)++-- | DANGER! See nOverPhi - you have to compute this carefully as +-- well.+logPhi :: Double -> Double+logPhi x = log $ (n x) / (hazard (-x))+
+ src/HasGP/Support/Iterate.hs view
@@ -0,0 +1,74 @@+{- | We often need to iterate some update equation until convergence is + detected. This module uses the State monad to provide a very general way of + expressing computations of this kind.++ Copyright (C) Sean Holden 2011. sbh11\@cl.cam.ac.uk+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Support.Iterate where++import Control.Monad.State++{- | iterateOnce takes a function to update a state and another + to compute a value associated with a given state.++ It returns a state transformer performing the corresponding + update - that is, one iteration.+-}+iterateOnce::(s -> s) -> (s -> a) -> State s a+iterateOnce updateState stateValue = + do currentState <- get+ let newState = updateState currentState+ put newState+ return $ stateValue newState++{- | iterateToConvergence takes a state transformer typically generated + using iterateOnce, a convergence test that compares two values + associated with the current and next states returning True if + we've converged, and an initial value.++ It returns a state transformer that performs iteration until + convergence. When run from an initial state it returns the state + at convergence and the corresponding value.+-}+iterateToConvergence::State s a -> (a -> a -> Bool) -> a -> State s a+iterateToConvergence doOnce converged currentValue = + do newValue <- doOnce+ if (converged currentValue newValue) + then return newValue+ else iterateToConvergence doOnce converged newValue++{- | The same as iterateToConvergence, but takes the state update and + state value functions directly, so the resulting state transformer + only requires a start state to be run.+-}+iterateToConvergence'::(s -> s) -> (s -> a) -> (a -> a -> Bool) -> State s a+iterateToConvergence' updateState stateValue converged = + do startState <- get+ let initialValue = stateValue startState+ let itOnce = iterateOnce updateState stateValue+ iterateToConvergence itOnce converged initialValue++{- | The same as iterateToConvergence, but does one update to obtain an + initial value and continues from there. Consequently, no initial + value is required, but you do one extra update.+-}+iterateToConvergence''::State s a -> (a -> a -> Bool) -> State s a+iterateToConvergence'' doOnce converged = + do newValue <- doOnce+ iterateToConvergence doOnce converged newValue+
+ src/HasGP/Support/Linear.hs view
@@ -0,0 +1,95 @@+{- | HasGP Gaussian Process Library. This module contains assorted+ functions that support GP calculations and are specifically+ related to linear algebra.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Support.Linear where++import Data.Packed.ST+import Control.Monad (mapM_,zipWithM_)+import Control.Monad.ST++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Support.Functions as F++-- | Sum the elements in a vector.+sumVector :: DVector -> Double+sumVector = foldVector (+) 0.0++-- | Sum of elements in a vector, divided by an Int.+sumVectorDiv :: Int -> DVector -> Double+sumVectorDiv d v = (sumVector v)/(fromIntegral d)++-- | Length of a vector.+lengthV :: (Normed a b) => a b -> RealOf b+lengthV = pnorm PNorm2++-- | Generate a vector equal to the first column of a matrix.+toVector :: Matrix Double -> Vector Double+toVector x = head $ toColumns x++-- | Replace the element at a specified position in a vector.+-- NOTE: hmatrix numbers from 0, which is odd. This numbers from 1.+-- The result is returned by overwriting v. This is implemented +-- via runSTVector because the increase in efficiency is HUGE.+replaceInVector :: DVector -> Int -> Double -> DVector+replaceInVector v i n + | (1 <= i) && (i <= (dim v)) = runSTVector $ do+ v2 <- thawVector v+ writeVector v2 (i-1) n+ return v2+ | otherwise = error "Index out of range in replaceInVector"+ +-- | Efficiently pre multiply by a diagonal matrix (passed as a vector)+preMultiply :: DVector -> DMatrix -> DMatrix+preMultiply v m = fromRows $ zipWith scale (toList v) (toRows m) ++-- | Efficiently post multiply by a diagonal matrix (passed as a vector)+postMultiply :: DMatrix -> DVector -> DMatrix+postMultiply m v = fromColumns $ zipWith scale (toList v) (toColumns m) ++-- | Compute x^T A x when A is diagonal. The second argument is the +-- diagonal of A.+xAxDiag :: DVector -> DVector -> Double+xAxDiag x a + | (d == dim a) = a <.> (x * x) + | otherwise = error "Incorrect dimensions in xAxDiag"+ where+ d = dim x++-- | Compute the diagonal only of the product of two square matrices+abDiagOnly :: DMatrix -> DMatrix -> DVector+abDiagOnly a b = fromList $ zipWith (<.>) (toRows a) (toColumns b)++-- | Compute ABA where A is diagonal. The first argument is the diagonal of A.+abaDiagDiag :: DVector -> DMatrix -> DMatrix+abaDiagDiag a b = (d><d) (zipWith (*) bL aA)+ where+ d = dim a+ aL = toList a+ aA = [(a1 * a2) | a1 <- aL, a2 <- aL]+ bL = toList $ join $ toRows b++-- | Compute aBa where a is a vector and B is a matrix+abaVV :: DVector -> DMatrix -> Double+abaVV a b = (flatten ((asRow a) <> b)) <.> a++
+ src/HasGP/Support/MatrixFunction.hs view
@@ -0,0 +1,64 @@+{- | HasGP Gaussian Process Library. This module contains assorted+ functions that support the construction of matrices from+ functions.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Support.MatrixFunction where++import Numeric.LinearAlgebra++import HasGP.Types.MainTypes+import HasGP.Support.Functions as F++-- | Take two vectors and a function. The vectors contain inputs 1 and 2. +-- The function maps a pair of inputs to a value. Produce a matrix +-- containing the values of the function at the relevant points.+makeMatrixFromFunction2 :: (DVector -> Double) + -> DVector + -> DVector + -> DMatrix+makeMatrixFromFunction2 f x1 x2 = + flipud $ ((length x1L)><(length x2L)) (map f l)+ where + x1L = toList x1+ x2L = toList x2+ l = map fromList [[a,b] | a <- x1L, b <-x2L ]+ +-- | Take a function and a matrix of instance vectors. Apply the function to +-- each possible pair of instance vectors and return the result as a matrix.+makeMatrixFromPairs2 :: (DVector -> DVector -> Double) -> DMatrix -> DMatrix+makeMatrixFromPairs2 f i = (d><d) [f x1 x2 | x1 <- x, x2 <- x]+ where + d = rows i+ x = toRows i++-- | Same as makeMatrixFromPairs but the function returns a vector. In this +-- case the output is a list of matrices, one for each element of the +-- function value.+makeMatricesFromPairs :: (DVector -> DVector -> DVector) -> DMatrix -> [DMatrix]+makeMatricesFromPairs f i = map (d><d) (reArrange lists [])+ where+ d = rows i+ x = toRows i+ lists = map toList [f x1 x2 | x1 <- x, x2 <- x]+ reArrange [] r = reverse r+ reArrange l@(h:t) r + | (h == []) = reverse r+ | otherwise = reArrange (map tail l) ((map head l):r)+
+ src/HasGP/Support/Random.hs view
@@ -0,0 +1,87 @@+{- | Gaussian Process Library. This module contains assorted functions+ that support random number generation and the construction of basic+ standard training sets.++ Note: these are mostly calls to functions now (but not originally)+ supplied by HMatrix. Originally different random sources were used, + hence the current format.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.++-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Support.Random where++import Numeric.LinearAlgebra+import Numeric.Container++import HasGP.Types.MainTypes++-- | Make a random matrix. Elements are uniformly distributed between +-- specified bounds. Returns the matrix and a new generator.+uniformMatrix :: Int -- ^ Seed+ -> (Double,Double) -- ^ Range for the elements+ -> Int -- ^ Number of rows+ -> Int -- ^ Number of columns+ -> DMatrix+uniformMatrix seed (low,high) rows columns = + uniformSample seed rows [(low,high) | x <- [1..columns]] ++-- | Produce vectors with normally distributed, independent elements of+-- zero mean and specified variance.+normalVectorSimple :: Int -- ^ Seed + -> Double -- ^ Variance+ -> Int -- ^ Number of elements in the vector.+ -> DVector+normalVectorSimple seed v n = + flatten $ gaussianSample seed 1 (constant 0.0 n) + (scale (1/v) (ident n)::DMatrix)++-- | Produce lists with normally distributed independent elements of+-- zero mean and specified variance.+normalList :: Int -- ^ Seed + -> Double -- ^ Variance+ -> Int -- ^ Number of elements in the list+ -> [Double]+normalList seed v n = toList $ normalVectorSimple seed v n+ +-- | Produce normally distributed vectors with mean and covariance+-- specified.+normalVector :: Int -- ^ Seed + -> DVector -- ^ Mean vector+ -> DMatrix -- ^ Covariance matrix+ -> DVector +normalVector seed m c = flatten $ gaussianSample seed 1 m c+ +-- | Make a matrix with normally distributed, independent elements of +-- zero mean and specified variance.+normalMatrix :: Int -- ^ Seed + -> Double -- ^ Variance+ -> Int -- ^ Rows + -> Int -- ^ Columns+ -> DMatrix+normalMatrix seed variance rows columns = + gaussianSample seed rows (constant 0.0 columns) + (scale variance ((ident columns)::DMatrix))+ +++++++
+ src/HasGP/Support/Solve.hs view
@@ -0,0 +1,100 @@+{- | HasGP Gaussian Process Library. This module contains assorted functions + that support the efficient solution of sets of linear equations++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Support.Solve where++import Numeric.LinearAlgebra+import Data.Packed.ST++import HasGP.Types.MainTypes+import HasGP.Support.Functions as F++import Control.Monad.ST++{- | It's not clear whether the use of linearSolve from HMatrix will induce+ a performance hit when the matrix is upper or lower triangular. Pro: + it's a call to something presumably from LaPack. Con: we've got some + structure that should allow us to make it O(n^2) instead of O(n^3).++ To do: try some timed runs to see if these are needed.+-}++-- | Solve an upper triangular system. +upperSolve :: DMatrix -> DVector -> DVector+upperSolve m y = uS mR yL n x+ where + n = rows m+ x = constant 0.0 n+ mR = reverse $ toRows m+ yL = reverse $ toList y++-- | Solve a lower triangular system.+lowerSolve :: DMatrix -> DVector -> DVector+lowerSolve m y = lS mR yL 1 x+ where + x = constant 0.0 $ rows m+ mR = toRows m+ yL = toList y++-- | Used by lowerSolve.+lS [] [] n x = x+lS (row:rows) (y:ys) n x = lS rows ys (n+1) $ computeNthElement row y n x+lS _ _ _ x = x ++-- | Used by upperSolve.+uS [] [] n x = x+uS (row:rows) (y:ys) n x = uS rows ys (n-1) $ computeNthElement row y n x+uS _ _ _ x = x + +-- | Compute the value of x_n when solving a lower triangular +-- set of equations Mx=y. It is assumed that all values x_i where +-- i < n are already in the vector x and that the rest of the +-- elements of x are 0.+computeNthElement::DVector -- ^ nth row of M+ -> Double -- ^ y_n + -> Int -- ^ n+ -> DVector -- ^ current x vector+ -> DVector -- ^ x vector with x_n computed.+computeNthElement row y n x = + runSTVector $ do+ let inner = row <.> x+ row' <- thawVector row + mN <- readVector row' (n-1)+ x' <- thawVector x+ writeVector x' (n-1) ((y - inner)/mN)+ return x'++-- | General solver for linear equations of the relevant kind. +--+-- First parameter is either upperSolve or lowerSolve. Next two parameters +-- are the upper/lower triangular matrix from the Cholesky decomposition, +-- then another matrix. Returns the solution as a matrix.+generalSolve :: (DMatrix -> DVector -> DVector) + -> DMatrix + -> DMatrix + -> DMatrix+generalSolve solver l m = fromColumns $ map (solver l) (toColumns m) ++-- | Find the inverse of a matrix from its Cholesky decomposition+cholSolve :: DMatrix -> DMatrix+cholSolve l = fromColumns $ map (upperSolve l) (toColumns $ ident $ rows l)+++
+ src/HasGP/Types/MainTypes.hs view
@@ -0,0 +1,37 @@+{- | MainTypes is a module in the HasGP Gaussian process library. It implements + basic types for the entire library. ++ Note: some more specific classes and types are defined elsewhere, + in particular in HasGP.Likelihood and HasGP.Covariance.++ Copyright (C) 2011 Sean Holden. sbh11\@cl.cam.ac.uk.+-}+{- This file is part of HasGP.++ HasGP 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.++ HasGP 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 HasGP. If not, see <http://www.gnu.org/licenses/>.+-}+module HasGP.Types.MainTypes where++import Numeric.LinearAlgebra++-- | These are defined to make functions more readable.+type DVector = Vector Double+type DMatrix = Matrix Double ++type Input = Vector Double+type Inputs = Matrix Double+type CovarianceMatrix = Matrix Double+type Targets = Vector Double+type Outputs = Vector Double+