packages feed

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 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+